Infected Omen Light Box

I pulled an all-nighter and designed/fabricated a LED edge lighting box plus etched plate in advance of the Gears 3 launch. The original plan was to slide an unused junk android tablet in and show some numbers from the stats dashboard in that central window, but I wasn’t able to get the tablet on the secure network at work, so now it’s just a pretty light box sitting on my desk. I almost slid my iPad in, but the slot I machined for the tablet is about 0.5 in too short for an iPad, though it had 0.75 in of slack for the target tablet.

The light gently pulsates / undulates around the border (driven by an Arduino), aiming to look a bit like the corrupted omen on the title screen.

The LED strip I used are LPD8806 driven strips from Adafruit, and they are a dream to use compared to the older Christmas light strand style strips I’ve used in the past. Each LED is individually addressable via a SPI-like interface to set a 21 bpp RGB color, and they have their own internal PWM clock, so you can fire and forget, no need to keep clocking them.

Also, Gears of War 3 is out, you should play it!

Nya nya nya nyan

A friend of mine recently got a house in Raleigh and dubbed it “The Happy House”. As a housewarming gift and as a test of my new CNC, I wanted to carve a plaque for the place.

I tried to think of something that brings irrational happiness to people and settled on Nyan Cat. It took a little bit of design work, resulting in a nice and fast CNC run, but painting it took longer than I expected. Even so, it turned out quite nice and everyone at the happy house loved it.

Nyan Cat Plaque

Glitchovision 3000

This is an audiovisual instrument that I created for the 555 timer contest.

The Glitchovision 3000 is a 4 step sequencer controlling an ‘Atari Punk‘ synth with a greyscale NTSC video visualization of the output audio, built using two 558 quad-timers and two 556 dual-timers.

Here is a video of it in action:

Continue reading “Glitchovision 3000”

Persistence of vision display using only 555 timers

I created this display for the 555 timer contest, a compact art piece that cries out in appreciation of the venerable 555 timer. It’s a persistence of vision display formed by 7 blue leds and 3 NE555 timers, which spells out 5 5 5 as it revolves.

Continue reading “Persistence of vision display using only 555 timers”

Aether converter cell

I was thinking of doing something Steampunk themed for Halloween, and thought I might spend a few hours prototyping a ‘raygun’ prop.  This aether cell as far as I got, it would serve as the ‘ammo cartridge’ for the raygun, sticking out of the back at a slight angle.

It’s got a red LED, a cyan ultrabright, and a UV LED, and the fluid is a mixture of diet tonic water, vodka, and highlighter fluid, so you get a very nice eerie glow with the UV LED on.

Aether converter cell in action

Continue reading “Aether converter cell”

Robotender Mk. 1

Robotender is a robotic bartender. It can mix any quantity of 9 different liquids together to make a wide range of drinks. The touch screen allows a recipe and drink size to be selected and it will then be poured. If a recipe contains any ingredients that aren’t currently loaded into a reservoir, the screen will instruct you to pour that one in manually. One of the most enjoyable drinks to pour is a Long Island Ice Tea, which causes 5 reservoirs to activate in quick succession, and only needs to be topped off with a touch of Cola for color.

Continue reading “Robotender Mk. 1”

How to supress Warning LNK4099 – PDB ‘XXX’ was not found

When a library is compiled in MSVC with PDB support, but later distributed without the correct PDBs, anyone attempting to link with the library will get many warnings of the form:

warning LNK4099: PDB 'XXX' was not found with 'YYY' or at 'ZZZ'; 
linking object as if no debug info

You might think that it’s not a big deal: recompile the library to not use PDB files, or disable the warning. The former option isn’t available if it’s a 3rd party SDK without source code, and the latter option isn’t possible (more on that in a second).

At least in Visual Studio 2003 (7.1) and Visual Studio 2005 (8.0), 4099 is on a ‘non-ignorable’ warning list. This means that you can’t use /ignore in the linker command line options to get rid of it, brilliant! This is by design [1] and they don’t care enough to provide any other mechanism right now [2]. To be fair, both the /ignore switch and which warnings are non-ignorable seem to be undocumented, but someone else has made a handy list of them [3].

Now, you could probably live with it if there was just one warning per-library and you don’t really care about compiling with 0 warnings, but it’s typically hundreds of warnings, and we all know how slow VC80 gets when you spam the output window. So, since there is no sanctioned workaround, let’s do this the hard way.

How to disable the warning by patching your linker

The following are instructions that I wrote up for some friends in this situation, only tested on VC8, but it should apply to VC7.1 or VC9 as well.  Yes, I really am proposing that you patch your linker to ensure a clean build. If it helps you sleep at night, think of it as correcting a profound oversight by Microsoft. There just isn’t any other solution if you want to compile in debug mode against libraries you don’t have source for that were incorrectly configured.

You could go after the code that generates a 4099 and prevent it from ever getting generated, or the code that prevents it from being ignored. The second path is quite easy, there is a whole list of non-ignorable warnings which makes it trivial to correctly identify the list within the linker executable.

Fire up your favorite hex editor on link.exe (likely the one in “C:\Program Files\Microsoft Visual Studio 8\VC\bin”) and look for 4099 at 32 bits wide. The very first hit also has 4088 before it, and 4105 after it, bingo! I set it to 65535; pick your poison, but you probably want to avoid the 4xxx range. Hooray for no more annoying PDB warnings, at least until the next VS SP or VC9.

The usual caveats apply when modifying executables (Make a backup copy, validate what you’re attempting to change, no warranty express or implied, etc…). If you have a newer or older link.exe, the list of unignorable warnings may be different, or stored differently, so verify that the value you’re replacing is sane:

... F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 ... (4088, 4099, 4105)

Once done, you can add /ignore:4099 to your linker options and it will actually work.