Sunday, October 4, 2020

Digital Projection Lightning 35HD: Recovering from a white screen

I volunteer at the old Loews Jersey theater in Jersey City. Our main digital projector is a Digital Projection Lightning 35HD. It’s about 15 years old now, and had been working until it failed the other month.

If your 35HD has not yet failed, please read my other post about important maintenance procedures you need to do while it’s still working. Once you’ve done these procedures, then come back and learn more about the inner workings of the 35HD.

If your 35HD boots to a white touchscreen, what is likely the issue is that the CMOS battery has failed. Without valid CMOS contents, the computer inside the 35HD is paused after booting, waiting for you to use a keyboard to reset the CMOS state. Here’s how to handle it.

What you will need:

  1. A new CMOS battery. I don’t know if all 35HDs are using the same motherboard, but it’s probably a 2032.
  2. A keyboard with a PS/2 connection.
  3. A way to connect the VGA video. The best way to handle this is to custom-wire an adapter. Any way that allows you to connect up individual pins on an IDC connector will do.
To start, remove the computer module from the projector, move it to a desk, and remove the top cover. While you have the module removed, image the CF card. Directions are on the other post.

You need to gain access to the motherboard, and to do that you will need to get the screen out of the way. Completely disconnecting it is too much of a pain, but you should be able to disconnect enough wires to make it mobile.

Step 1: Remove the Orinoco Wifi card. Carefully unplug the antenna from the card, and then (optionally) use a thin device to press the eject button to get the card out. If you gently pull the card straight out without using the eject lever, that’s fine.

Step 2: Remove the two RJ-45 plugs and the serial connection. The RJ-45s easily unplug from the rear of the sockets. The serial connection plugs into an IDC socket on the motherboard, but the plug isn’t keyed. It would probably be a good idea to mark the socket and plug so you reinsert it correctly. (We used a grease pencil that was lying around.)

Step 3: Unplug the power to the LCD backlight:

Step 4: Undo four screws holding the LCD on. Warning! There are four tiny standoffs made of white plastic that are above the metal plate that holds the LCD. If you tilt the plate with the LCD on it, you will shake those standoffs loose. That’s probably not the best idea. Remove the screws and slowly and gently twist the LCD out of the way.

Step 5: Plug in the keyboard. You’ll find a PS/2-style keyboard connector near the RJ-45 jacks on the motherboard. This will be in the lower-left of the motherboard, as it was oriented originally while installed on the projector. The keyboard port will likely be blocked by one of the large standoffs. You can carefully unscrew the standoff, and that will allow you to reinstall it later.

Step 6: Install a VGA adapter. I wish I had pictures of this pin header on the motherboard, but I failed to capture it. 

In the very corner of the motherboard is a pin header labeled “TV1”. Right next to it is an IDC-10 socket labeled “VGA1”. If you have the time to create a custom cable, that’s preferred. If not, then use whatever random collection of jumper wires you have available to make the connection. (We used female to female jumper wires from the IDC socket, we wire-wrapped directly onto the pins of a VGA cable, and just bodged the wires together in the middle. That’s not really preferred, but you do you.)

IDC-10 “VGA1” pinout:

  • Pin 1: Red. Connect to VGA pin 1.
  • Pin 3: Green. Connect to VGA pin 2.
  • Pin 5: Blue. Connect to VGA pin 3.
  • Pin 6: Ground. Connect to VGA pins 5, 6, 7, 8, 10. Or connect to just one of them, as your monitor will likely just have all those pins connected together anyway.
  • Pin 7: HSync. Connect to VGA pin 13.
  • Pin 9: VSync. Connect to VGA pin 14.
For reference, the VGA pinout. Also for reference, an IDC-10 pinout:

Step 7: Put in the new CMOS battery.

Step 8: Reassemble the computer as best you can. Note: You are missing a large standoff from near the PS/2 keyboard port, which means that you cannot reinstall that screw, but that also means that you will need to carefully remove and save the small corresponding standoff from the LCD tray.

Step 9: Return the computer module to the projector. You don’t need to screw it on, but you need to gently rest it vertically, and attach at least the two top connectors. Attach your monitor. Power on the projector. Cross your fingers. The projector will power up, and the computer will boot. The computer will drive the monitor, and show you a screen. Press F1 to go into setup:

Step 10: Enter “PCI / Plug and Play Setup”. In “Boot Screen Select” select “CRT+LCD”. In “LCD Panel Type” select “640 x 480 TFT”. Save and continue to boot.

Step 11: Your projector should boot up and use the touchscreen. If you didn’t plug in all the cables, you’ll get some various warnings. That’s fine. Just verify that the touch screen shows an image and that its touch capability works.

Step 12. Power down the projector. Remove the computer module. Return to your desk, and disassemble the computer module enough so that you can remove the VGA adapter. Keep that adapter safe. Unplug the keyboard, and reinstall the standoff that you unscrewed. Carefully reassemble the computer module, replugging all the parts and reinstalling all the pieces and cards you removed. Screw the case together, reinstall the module onto the projector, and plug in all the cables.

You’re done; enjoy the use of your projector again! Make sure that every three years or so, you replace the 2032 CMOS battery. No reason to have to do that again.

Digital Projection Lightning 35HD: Critical maintenance procedures

I volunteer at the old Loews Jersey theater in Jersey City. Our main digital projector is a Digital Projection Lightning 35HD. It’s about 15 years old now, and had been working until it failed the other month.

I’ll talk in another post about recovering from the white screen failure mode, but if you’re not experiencing that failure mode, and your 35HD is working, there are two big things you need to do to make your life easier in the future.

First, you need to image the 35HD’s Compact Flash card.

The 35HD uses a 128MB CF card as a boot drive. Replacements for CF cards are easy to come by, but if it fails, the problem is that the information on the card would be lost. The tech staff at the Loews Jersey has an image of our 35HD’s card; contact us if you are suffering from this issue and we’ll try to help you as best we can.

How to image the card? The card is pretty easily accessible. Turn off and unplug the 35HD, and remove the computer module by removing the large screws on the module with the touchscreen. On the back right of the computer module is a small access hole covered by a plate. Remove the two screws covering the plate, and you’ll have access to the CF card. Remove the card and image it with the usual tools.

Second, you need to put in a new CMOS battery before the old one fails.

The CMOS battery used in the 35HD is a 2032. I don’t know how much the drain is and how long to expect it to last, but if it’s been more than 3–4 years since you last replaced it (or if you’ve never replaced it), you really need to replace it now. If the battery goes dead, the projector will fail and boot to a white screen. That is a recoverable state, but recovering from it is an incredible pain, so aggressively keeping a good battery in the 35HD is preferable.

To replace the battery: Unscrew the computer module and remove the shield to its left. Unplug all the cables. Move the computer module to a table, and place it screen up. Remove all the screws holding on the metal cover.

Inside the computer module is the motherboard. You don’t need to unplug or unscrew anything; the CMOS battery is at the edge of the motherboard. Carefully replace the battery and reassemble the projector the way you took it apart.

Saturday, September 2, 2017

McDonald's doesn't care about bicyclists

On Thursday, August 31, 2017, I was bicycling up 8th Avenue in Manhattan. 8th Avenue has a protected bicycle lane, separated from traffic by a row of parked cars. Having been hit by a car door before and having woken up in the hospital, I appreciate having this protected lane.

But after I passed 26th Street, I was forced to stop my bicycle, and walk it onto the sidewalk. The entirety of the protected bicycle lane was taken up by a semi truck. A McDonald's semi truck.

I took some pictures.

And it was blocking a fire hydrant, while we're at it.

Having a semi truck in a protected bicycle lane is a hazard to bicyclists, and of course, illegal, a violation of RCNY Title 34, § 4-08(e)(9).

As I was about to leave, the driver entered the semi truck and proceeded to drive away, in the protected bicycle lane.

This again is illegal, a violation of RCNY Title 34, § 4-12(p)(2), and I'm sure you can see how hazardous it is.

So I tweeted about it, and tagged McDonald's. They asked me to call an 800 number. I did.

I waited and pressed various numbers, and eventually got to talk to Luciano. He asked me what happened, and I described it. He said he'd bring it up with the "owners", and was about to hang up on me when I asked if he even cared enough to take down the license number and other identifying details. I gave him the details.

And that's all. I witnessed a McDonald's semi truck wildly violating the law and putting the lives of bicyclists in danger, and I have an apology from a call center employee who is super sorry and assures me that he understands how upset I am.

Saturday, February 1, 2014

Lobotomizing Quicken 2007

I am an old-school Quicken user, back to the Apple II days. Intuit used to be OK, but as the Mac declined in the 90s, Intuit started ignoring it. Every year they would throw a few more features into Quicken that no one cared about, and everyone would upgrade.

Bank connectivity was simple; you downloaded files from your bank in the QIF format, and you reconciled things. But QIF wasn't a great file format. There was an open file standard called OFX that Microsoft Money used, but Intuit didn't see the appeal in that. Intuit took OFX, added a custom field to it called "INTU.BID", called the file format QFX, and started charging banks to get a number to put into that field. And because Quicken now worked online, Intuit could enforce the payment from banks. If banks didn't pay, Quicken wouldn't know about their "INTU.BID", and Quicken wouldn't download their customers' data.

I don't know if that's legally extortion, but I'm going to call it that. And so do lots of other unhappy people.

Meanwhile, Intuit continued to screw over Mac users. The last version of Quicken that Intuit released for the Mac was Quicken 2007. It was a PowerPC app. In 2009 they announced a new app, "Quicken Essentials for the Mac", which was released in February of 2010. It was an under-powered joke that didn't do things like track investments, so Intuit suggested that people who needed to do more than balance their checkbook keep using Quicken 2007.

When Mac OS X Lion came out, and Quicken 2007 wouldn't run any more because it was a PowerPC app, Intuit acted swiftly. Lion came out in July of 2011, and seven months later in March of 2012 Intuit released a crappy recompilation into x86.

And that's it.

Why do I bring this up? Because I hate Intuit. I despise them because they have made it abundantly clear that they despise me and all of their customers.

A few months ago, I signed up for the computer-driven investment manager Wealthfront, started by people who wanted to use high tech to bring quality investing to non-finance minded people (e.g. me). (I think they're cool enough to recommend; I'd like it if you were to sign up with my referral link so that both you and I save money, though it's your call and I won't mind it if you don't.)

But Wealthfront uses Apex Clearing to hold their accounts, and while Apex paid their Intuit tax and offers QFX downloads, guess what? They paid for Windows but not Mac. And so Mac Quicken won't import their files.

Now, ever since Intuit pulled the INTU.BID stunt with QFX, people have been trying to work around it. If you google around, you'll find the usual suggestion is to switch out the INTU.BID number for one that works. I tried that, but couldn't get it to work.

And then I asked myself, why don't I fix Quicken itself?

When you open an unauthorized QFX file, you get the "unable to verify the Financial Institution information" dialog. So I took a stack trace, and that dialog is fired from:

QApplication::OpenQuickenDoc(short, long, char*, unsigned long, long) + 225  [0x278b45]
QApplication::OpenWebConnectFile(short, long, char*) + 186  [0x278a34]
QMSession::ProcessWebConnectFile(char const*) + 306  [0x20e23e]
QMSession::SendSessions(short&, StretchyString&) + 2392  [0x20ec4c]
SessionMgr::StartLocalMsgSetSessions(unsigned short, EBVoidPtrArray*, SendQ*, short, unsigned long) + 180  [0x4813ca]
MsgSetConnectionMgr::CreateLocalSessions(unsigned short, EBVoidPtrArray*, SessionList*) + 1227  [0x3fe969]
QMSession::BeginMessageSet(unsigned short, OEMessageSetRs*, unsigned long, OEString const&) + 79  [0x20f19b]
QImportOFXRs::PrepareForSession(OEString const&) + 722  [0x212f6e]
DoErrorMsg(char*, char*, OpaqueWindowPtr*, AlertFunctor*) + 39  [0x38d7fc]

Note that they ship their binary with symbols. Really. This made my job a million times easier.

So I went to look at QImportOFXRs::PrepareForSession. When I tossed Quicken into Hopper and went to that function, I saw:

Look at the call to EBCache::GetWebConnectInfoForFeature. Quicken tests to make sure it has web connect info, and if it doesn't have that info it throws up the error dialog and dies.

But what's interesting is that, at 212f73, it immediately overwrites eax. In other words, Quicken tests to make sure it has web connect info for the bank, and then immediately throws out that information. So what happens if I NOP-out that entire error block, so that Quicken always proceeds?

It works. Quicken puts "FI needs update" as the bank name, but it allows you to proceed with the import.

There is a problem, though. I experimented a bit, and found that if you do a partial import, and then try to go back to the "Download Transactions..." window, Quicken will say that you need to update your bank list. And if you allow it to do so, it realizes the tricks you've pulled, and disables your account from ever importing again.

That particular dialog, the "you had an online account for a bank we don't know about any more, so we're going to disable it" one, comes from the stack trace:

OldQuickenMenuGlue::DoCommandProcess(PPx::SysCarbonEvent&, HICommand, unsigned long, unsigned long) + 156  [0x1b2610]
MenuManager::DoCommand(long) + 107  [0x1b1173]
OnlineMenuHandler::DoCommand(short) + 75  [0x1b5503]
needsToUpdateBankList() + 579  [0x1b5e07]
DoAlert(short, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, short, short, short, OpaqueWindowPtr*, AlertFunctor*) + 898  [0xd6d51]
DoAlert(short, __CFString const*, __CFString const*, __CFString const*, __CFString const*, __CFString const*, __CFString const*, __CFString const*, AlertButton, AlertButton, OpaqueWindowPtr*, AlertFunctor*) + 215  [0xd69c3]

Looking, it seems like needsToUpdateBankList is a bad function to ever be in. No. We should never want to update the bank list.

Fortunately, that's easy.

I overwrote the first few bytes of the function with 33C0C3 which is xor eax, eax; ret.

I don't know if I'm done. Who knows what other subtle pitfalls I might need to disarm that I don't yet know about? But I have a working import:

and right now that's all that matters.

(Note: All offsets are as of Quicken 2007 version 16.1.4 (build 23.880.400). Your mileage may vary. This will probably void your warranty and possibly your EULA. Please take the usual precautions, including backing up your original application binary.)