December 18, 2008, 1:56 pm

Candy Cam, Part II: Audio & Video

If you haven't seen it already, check out Part I about Seven's Candy Cam

Since the original idea was just a bell and a camera to watch Seven, I decided to get one of those indoor/outdoor "security" cameras with the IR emitters. That way at night with the lights off Seven would still be visible.

The security cameras output an NTSC composite video feed which doesn't hook directly to a computer. Fortunately I had a KWorld USB thingamabob around which, besides having an ATSC tuner, has S-Video and Composite input. I wasn't sure if the device would be supported on Linux, and since my Linux laptop is old and slow anyway, I chose to use Windoze for the camera.

In the past when I've setup a video feed I always had everyone connecting to my computer at home. Of course that quickly saturated my bandwidth. In this day & age I expected there must be an easier way than me setting up some relay off another of my servers on a fast connection. A quick google search turned up several possibilities. The top of the list was Ustream so I gave them a try. They are free and I liked how they had somehow managed to get Flash to handle everything so I didn't have to install any software. The downside was that they had no way to let me choose which input I wanted to use on the USB capture card. It took quite a bit of battling with the crappy software that came with the USB device before I was finally able to get off the tuner and choose the composite input. Once I did that Ustream was up and running and streaming my camera.

The night vision on the camera didn't work very well though, it tended to make a bright spotlight right in the center. Plus being a cheap camera the colors were very washed out even during the day. The next morning I got out my old Sony Video 8 Pro camera to see if it would look better. It looked a lot better. But unfortunately it had a narrower field of view and I had to set it up right in front of a doorway in order to use it. I had to rearrange the entire dining room in order to turn everything so I could get a good angle with the camera. I also now have to leave the dining room lights on constantly to provide enough light for the camera. Fortunately they are compact fluorescents.

Audio

After adding Elmo to the display, I realized I was going to have include audio in the stream. The security camera I had picked up also has a built-in microphone. I patched the audio into the USB capture card too, but because of some bug in Windoze, Flash, or the Ustream software, I couldn't choose the USB device as the audio source. After repatching it into the laptop's built-in sound card I had the audio up and running too.

Elmo however is quite loud. Obnoxiously loud. Plus having the microphone picking up any noise around it bothered me a bit too. In order to deal with both problems I picked up a cheap 4 channel mixer from Radio Shack. I disconnected Elmo's speaker and tied it directly into one channel. I also did the same with Santa. The output was patched straight into the Windoze laptop's sound card. This also had the advantage of making Elmo slightly more understandable in the video stream. Elmo's circuitry tended to cause a lot of pops and clicks on the audio feed though when he wasn't talking. The quickest way I could think of to deal with it was to play music in the background. I patched the output from the Ubuntu laptop and started up a CLI based mp3 player called mp3blaster. Once the music was playing the pops and clicks were much less noticable.

One of the things I lost by removing the microphone was the jingling of the bells. The sound you hear now is simulated. When the program triggers the LEGO to jingle the bells, it also plays a sound file so that the video stream hears bells too. I still need to digitize my pachinko machine hitting a jackpot and play that when the candy machine is triggered.

See Also

December 16, 2008, 5:19 pm

Seven's Candy Cam: How it works

I'll be posting this in multiple parts because there's so much going on. If you haven't seen it, check out Seven's Candy Cam

This all started out because I was ordering some electronic stuff and decided to order a couple of Arduino boards to see how they worked and what they could do. After I got them I was amazed with how simple they were to setup and started doing some searches of things other people had done with them. I stumbled onto a site where a guy had used a servo to ring a bell whenever someone visited his site. I thought that was cool and I might do something similar with Wishzilla.

A couple of days later I was thinking about it more and I had the idea that maybe it would be fun if I setup a web cam and I rigged up something so whenever the bell rang a treat or something would drop for Seven. And why not throw a webcam on it?

Over the last week this has evolved from bells and a webcam to watch the dog eat into a crazy mess of interactive toys, all controllable by visitors to the site.



Currently the system is using 1 Windoze laptop, 1 Ubuntu laptop, an additional 15" monitor, a LEGO RCX, an Arduino, an Elmo Live! toy, a D.J. Mixin' Santa decoration, a LEGO 9volt train, X10 for the Christmas lights, a little USB TV capture device, an automatic dog feeder, a 4 channel mixer from Radio Shack, and my ancient Sony Video 8 Pro camera. Why do I feel like I left something out?

The web server

An important consideration was making sure that the site would be unaffected by any glitches with my rig at home. This meant I didn't want the processes trying to connect to some IP at home or dependent on a daemon running locally all the time. I wanted to make it as simple as possible so I didn't have to keep coming back and checking which piece of software had crashed.

What I decided to do was make a FIFO on the web server which the Wishzilla software would attempt to open in non-blocking mode and then write a line to. Doing it this way meant it didn't have to open any sockets or have an IP address hardcoded into it that might change. The software running at home does an ssh into the Wishzilla server and does the reading from the FIFO. Very simple.

To be continued...

In the coming parts I'll show how the components are wired up and what software is running on them.

January 29, 2008, 5:35 pm

Atomic Clock Radio

I have a really old clock radio that my grandparents gave me when I was kid that I still use to keep time in my bedroom. It's so old that it's from before manufacturers figured out to stick batteries in to maintain the clock when there's no power. Every time the power goes out the clock resets itself to 12:00am.

The clock only has two ways to set the time: fast and slow. Fast moves ahead about 1 hour every second, and slow is 1 minute every second. If you happen to overshoot on fast then you have to go 24 hours around to try again. It's a pain but the power doesn't go out too often. Usually.

Lately the power has been going out a lot and I've gotten tired of resetting it. I kept thinking it would be nice if the computer could fix it for me. What I decided to do was plug the clock into an X10 appliance module and stuck a Firecracker module on a Linux server I have nearby. Using Heyu and At, I told the computer to turn off the clock at midnight and turn it right back on. It worked great! Now I just have to try not to accidentally push the button on an X10 remote that turns it off...

August 2, 2006, 9:39 am

I want to build an archive without filling my disk

I finally got the living room box rebuilt with a new MythTV which is compatible with my backend. Now I can see that the HDTV tuner card is really working. I also set it up to netboot, man what a difference! It's so quiet now without an HD inside it whining away.

I discovered that KTXL is broadcasting their digital stream at 1280x720 and 60fps. No wonder my 866mhz P3 can't keep up and stutters trying to play it! The obvious thing to do is to transcode it down to a resolution that it can work with and will look just fine on my TV which is just a 27" Sony Vega hooked up via S-Video.

Unfortunately I'm having a heck of a time finding any real documentation on how to transcode and what settings I want to use. I've found I can reduce the width to 640 and convert to DivX to save space, but that's about it. Since the shows I'm recording are only 4:3 and not 16:9, I need to find a way to crop the black edges off. I'd also like to reduce the frame rate down to 23.976 which is what a lot of my other stuff is and it looks just fine. I can't find any settings to do that.

I found something on the MythTV wiki where Steve Adeff mentions he has a script to transcode into what "the scene" terms an HR HDTV encode. Unfortunately the script or details on settings is not there, and I couldn't find a way to contact him and ask.

I've also found some sites mentioning using "User Jobs" but no details on how they work. From what I've seen on some sites, a User Job will just make a copy of the recording, which isn't what I'm after. I want to replace the recording with a reduced size encoding, just like using the Transcode profiles does. It's possible that the User Job can do this inside the script itself, but I have yet to find any details about how to go about doing that.

I also played around with the commercial removal. The automatic detection hasn't worked yet, but doing it manually wasn't too bad. One of the few interface things that isn't hard to grasp. Of course this raises an interface issue: Why are there two different viewers for video? Why is there one for "recorded" video and one for "other" video? I would much prefer to have all my video in one place, where I have the same controls and same ability to work with it. Right now it's very annoying because the MythTV viewer uses different keys than mplayer, so I can't skip around the same way. I found I could make the MythTV viewer "remember position" so I can resume playing from where I was (although it should just remember position when I exit, not force me to set the position manually). This is something I have been missing from mplayer, and another reason that all video should be viewed with the same program.

I'd also like to see a real fast-forward, instead of just skipping around. My guess is the skipping happens because it's hard to simply offset into the file and find a frame. All it would take is some job that runs and indexes the video file and locates all the keyframes and saves the list somewhere. Then when fast-forwarding the player would have a table so it could quickly locate offsets.

Scheduling a show is also pretty crazy. When you do finally struggle far enough through the interface that you get into a menu to set up recording, you basically get two modes to record things: "VCR mode" and "wishlist mode". Why anyone would want VCR mode I have no idea. In VCR mode you pick weekly/daily and it locks in the time&channel, so if the show moves or is aired an extra time (like 2 new episodes in a row) you're screwed. The sites that talk about setting up recording even warn you about this. Kind of defeats the purpose of having a computer downloading a guide to track shows.

Yes, I know, if I don't like it, I have the source and I should fix it instead of rant. I've actually been thinking a lot about fixing it (or starting over from scratch), but I'm just not there yet.

July 16, 2006, 8:49 am

TiVo definitely has no competition here

Well I finally broke down and did it. I bought a tuner card to use with MythTV. Not just any tuner card, an HDTV tuner card. Why? Because I found out the local PBS station has two more channels that are being broadcast in digital! Yes, that's right, I wanted to receive more PBS!

After a bit of research to make sure that the extra channels were really being broadcast and not just available over cable/satellite, I went searching for a tuner card. Not an easy task, all the online stores don't really note whether a card is HDTV/ATSC/Digital or not. A trip to Fry's found only one card on the shelves that could do it, and it was some way overpriced no-name brand that likely wouldn't work. When I got home I tried searching online again and found an Air2PC-ATSC-PCI for sale on eBay for $40. Even better, it was "local" and being sold by a company over in Oakland. I did the Buy-it-Now and it was here the next day.

When it arrived I was quite anxious to try the card out. I ran around to all the antenna jacks in the house to see if any of them worked. Unfortunately when I had hooked the living room up, I hadn't bothered to connect anything else. That means I would need to climb up into the attic and fix things. The weather has been hot lately and the attic was well over 120 degrees. It would have been suicide to try to crawl around up there so I had to wait until morning to fix the cabling. When I got up in the attic the next morning I decided to take the antenna off the 4-way splitter and used one of the 2-way splitters that was also there. Made a difference in signal strength, as a bonus I now get KQED too!

Next thing to do was to stuff the card in a Windoze box and make sure it was what I was expecting and that the card worked. My first reaction after getting the software installed was "Oh no! I got the wrong thing, this is some kind of satellite receiver!" Eventually though I figured out the options and the card found the OTA signals and I was able to tune them in. I wasn't real impressed with the software though, on some stations the video and audio skipped and stuttered a lot. I was using a relatively fast computer, an Athlon 2200+. Oh well, whatever, it worked, so the next battle was getting Linux & MythTV to use it.

I moved the card to the computer I am going to use as the MythTV backend and then went online to see how many kernel patches I was going to have to download and rewrite to get to work. (After all, Linux doesn't have drivers, just source code that you modify your kernel with.) I was surprised to find the driver was not only already part of the kernel, but it had already been compiled! Looking through dmesg it had even detected my card and loaded the module. Sweet!

I fired up the MythTV setup program and fought with it and getting it to recognize my keystrokes. The backend computer is essentially headless so I had to run X over VNC. Another frustrating thing was no matter how huge I made my X desktop, the stupid setup program would increase its window size to push the Cancel/Back/Next buttons just off-screen. ARGH.

I ended up spending most of the day going around and around with the setup program. I finally noticed some messages on the console and discovered I had to download a firmware file from the internet and stuff it in /lib/firmware. At that point I was now able to get the setup program to do a scan and find channels. Some success finally.

The next problem was figuring out how to get a frontend to connect to Watch TV. The box I have in the living room is too old and has a protocol mismatch so it didn't work. I downloaded a new KnoppMyth CD and booted it on another computer and gave that a try. When I hit the Watch TV menu, I got a black screen for about 30 seconds, then it went back to the menu. No errors, no info, no nothing. I found something online that said when setting up the backend, if you don't set both of the IP addresses in the configuration to the ethernet card's IP address then you get strange errors about not getting a version from the protocol. I also saw stuff about making sure that I tell MythTV what directory to use as a buffer for live TV.

I changed the settings so both IP addresses were the same (I had previously had the top one at 127.0.0.1 since when I tried to connect via telnet from another box it seemed to connect fine). I then went searching through the config trying to find where I can tell it what folder to use as the buffer. Couldn't find anything so I changed the other folder I had setup to rwxrwxrwx. I have no idea which setting made the difference, but when I tried again to Watch TV it worked!

Ok, all that was a real pain in the ass, and you're probably thinking that's why I'm ranting and telling you that TiVo is so much better. No, I'm used to spending way too much time trying to get stuff to work "as advertised." It's the Linux way after all, you pretty much expect setup to be difficult. In this case though, things are much worse.

When I got the live TV to finally show up, the next thing I wanted to do was change channels. So I instinctively pushed the arrow keys expecting it to change channel. Nope, some kind of info bar popped up on the screen. But it wasn't presenting me with the info for the channel I was on, it was for a different channel. I found if I pushed the arrow keys some more it would scroll through other channels. If I pushed the keys for the other axis it scrolled through different times. WTF?? I just wanna change the channel! What the hell is this?!? I did find if I pushed space while viewing the info it would change the channel to the one listed on the info bar.

Since the arrow keys weren't how to change channel, I wanted to find the real keys that would change the channel. So I did what any normal person would do: I started pushing each key one at a time trying to see where the channel change button is. I didn't find it so I hit ESC and got back to the menu to try something else. I figured it didn't really matter if I could change channels right now, I really wanted to be able to record shows to watch later.

I went looking around to see how to do that and I was presented with menu after menu of stuff about recordings. All very confusing and some of them seemed like they were redundant, but they did unexpected and different things. What I was really looking for was something with an on-screen "keyboard" where I could type in a word or two and search. I found something that seemed like it might have done that, but it wanted me to setup some kind of list that it would remember. And there was no on-screen keyboard either. Gah! I don't want to program in a list, I want to type in a word and search. Now! This one time!

In frustration I decided to go back and try the live TV again. Maybe there might be something interesting in digital vs all the regular analog stuff that I already knew was junk. This time when I hit Watch TV I got back an error message telling me that I can't watch TV right now because I'm recording something. WHAT?!?!? I CAN'T WATCH LIVE TV?!?! This is beyond idiotic! The error message tells me that if I want to watch live TV I have to go digging through menus and lists, and somewhere I can choose the show that's currently recording, and then somewhere (I never did figure this out) I could tell it to let me watch that show right now. No way! How can anyone be so stupid as to set it up this way? I just want to watch whatever is on right now! I can do this on my TiVo anytime! I can even do this on a regular VCR! Just show me the live feed already!

For a while there before I got the card I was thinking about how maybe I would phase out my TiVo and build some uber box with tons of tuners in it and record every show from every channel. I could have huge archives of everything to watch whenever I wanted.

Less than a year ago, after suffering without a guide on my TiVo for 3 months, I went ahead and plunked down for the $300 lifetime service. My TiVo is a first generation which I wasn't sure how much longer I would be using before replacing it with a newer one. I knew that to break-even on the lifetime I would have to use my TiVo for at least 2 more years. I decided it was worth it though since a TiVo without a guide is just not TiVo, even if I could record things manually. Even if I didn't use it for 2 more years, at least I wouldn't have to deal with monthly fees and my TiVo would find shows for me again.

Now after this MythTV experience I definitely feel I made the right choice in sticking by my TiVo. The MythTV interface is absolutely horrid. I thought it was bad when I originally set it up just to watch video files, but I had no idea. It's certainly typical of open source software though. 99% of OSS is being developed by people that have never even used the thing they think they're cloning and "making better." They have no idea how the real thing works and just how nice it really is. This is why I keep telling people Linux makes great servers, but it makes lousy desktops.

MythTV has a long way to go before it'll be as usable and friendly as TiVo. I know you MythTV people think you're saving money by building it yourself and running free software. But before you go out and spend thousands to get the hardware you need for MythTV, spend a couple hundred and get a TiVo. You just might like it so much you'll wonder what the heck you were doing with MythTV.

April 28, 2006, 8:10 pm

Put a scrolling LED display in your computer for less than $20

This is sort of an expansion & howto on my previous post of scroll a message on my cable box. I finally got around to building a new 8 digit display and mounting the whole thing in place of my floppy drive.

The total cost for this project was less than $20. The most expensive parts were the 7 segment displays and the ICM7218 chip. I used 0.56" tall digits. It took 4 of the LED packages to get 8 characters. The width of all of them together was exactly the same as a floppy!

First off, here's the schematic. Don't let it scare you, it's really not as complicated as it appears. Essentially you tie all the A segments together, the B segments together, etc. The only gotcha is one segment is upside down (in order to make a colon for a clock) and it is wired slightly different than the other 3.



The LED segments I used are LTD5321AR red 2-digit packages. I would have preferred to get green, but the local electronics store didn't have any other color. To hook them all together I used a donut-style perfboard and wired "traces" across it.



What a pain in the ass that was! Each color represents a single segment, and all the wires are on the front except for the gray ones which I had to jumper on the back too. Why, why, why, in this day and age can't there be an easy&cheap way to make a PCB? I have no desire to mess around with chemical etching. I don't have a CNC available to me to do milling. And I don't want to spend $40 to make a one-off proto board that I might have laid out wrong. It sure seems like there should be some way to print out a PCB from a printer.

If your 7-digit displays are Common Anode, then you want to get the ICM7218A chip. For Common Cathode, get the ICM7218B. Mine were Common Anode so I used the ICM7218A and that's the way the schematic is drawn.



For power I hooked into the 3.5" floppy power. If you happen to have a computer that has the parallel connector hooked to the motherboard from a ribbon cable, then you can wire it in to that. My computer didn't have that, so I had to put on a DB25 connector and fish a cable out the back of the computer.

After you get everything soldered up, you should test it and make sure it's working. You don't want to have to tear everything apart to go back and fix a solder joint.



Now that it's working, the next thing to do is make a base for it. Since I have lots of wood scraps and woodworking tools on-hand, I chose to make it out of wood.



Easiest way to set the width is to grab a floppy drive and stick it between the blade and the fence (WITH THE SAW TURNED OFF) and then lock the fence down. I ripped a piece of 3/8" plywood for my base.

After I cut the plywood to size I needed to make a rabbet as a sort of shelf for the LEDs to sit on. I used a router table since it's easier to setup and adjust the height on.



Don't make the shelf too thin or else it'll snap right off when you go to cut the groove. The groove is so the PCB behind the segments has something to sit in and let the segments rest flat on the board. I simply put the segments against the fence and shifted it over until it looked lined up.



To adjust the height of the blade I put the rabbet over the blade and adjusted it up until it touched the board, then made it just a little higher.



I used a hot glue gun (got it at the dollar store!) to stick the display and the brown plexi in place. The plexi came from one of those stackable file inbox thingies.



The next thing to do is pull out your floppy drive and insert your new display. Be careful while inserting it into the bracket, it's easy to snag the wires or put too much pressure on the display and snap it off the board.



After I inserted it into the bracket, I put the bracket back and slid the display up so it was flush with the front. I then forced in screws with just a screwdriver, no need to pre-drill. My case was a little tight inside so I had to use a stubby screwdriver, but the screws went in really easy into the side of the plywood.



Here is the program for Linux that drives the display. To compile it do

gcc -o icm7218 icm7218.c

I created my own custom "font" so that I can display both numbers and letters. Some of the letters may be a little strange, but every character is unique so that it's possible to get used to the font and learn to read it fluently. Uppercase and lowercase are the same, and not all symbols have been defined.

Usage is quite simple. If you call it with no arguments it will display the time. You can add it to cron and have it called every minute and it will make a nice clock.

If you want to display a message then the first argument is the message. If the message is longer than 8 characters, then you need to provide a second argument which is the number of times to scroll the message. If you need to put spaces in your message, be sure to put quotes around it.

icm7218 'The quick red fox jumps over the lazy brown dog' 2

Now all I need to do is paint my case black!

Update 2006/05/01: Painted the case black yesterday. Those Vectra cases look very sharp in black.

April 9, 2006, 8:25 am

One button menus are cool

Last night I spent a couple of hours getting a one button menu working using the cable box display and a remote control. I added a third device that I'm going to use frequently to my entertainment center and I didn't want to get another remote out to change the input on the receiver.

What's a one button menu? It's a menu that I can control using only a single button. There's no additional buttons for anything, not scrolling through the list or selecting items. The way I made it work is a double click brings up the menu, single clicks cycle through the list of choices, and finally a double click chooses the selected item. It was a little tricky because I had to add delays and scheduled events so that it could detect the difference between a single click and a double click, but it works quite well.

Why a one button menu? Because I only had one spare button on my TiVo remote, the TV Power button. All of the other buttons either do something with the TiVo or control the volume on my receiver.

The TV Power button actually wasn't a spare. I had already been using it to turn on/off the receiver and make the receiver switch inputs to the TiVo. But I was doing that with software I wrote so changing it to do something else wasn't hard. The other buttons send IR codes directly to the devices so it would be difficult to really make use of them. Because I made a double click enter the menu, I was able to keep the original functionality: a single push of the TV Power button will still switch the receiver to the TiVo (and power on if necessary), or if the TiVo is already selected it will power things off.

Now I am wondering what kind of menu things I can do using the front panel buttons on my receiver...

November 15, 2005, 8:23 am

Tic-tac-toe, what else?

Ok, this is sort of old but I just started this blog and thought this was still interesting.

A while ago I built an automated phone answering system that runs on Linux and uses a standard modem. The software supports caller ID and can email messages that are recorded. But what's really cool is it is Tcl based. That means I can make it do just about anything I want.

One of the things I set up is Auto-blacklisting. In the old days whenever a telemarketer called and I got sick of them I had to manually add their number to a database and then shut down and restart the software. Now I have it setup so that if someone calls and doesn't press a button to do something from the main menu, their number is automatically blacklisted. The next time they call the answering software will immediately pickup on the first ring and play the little tones that sometimes trick the telemarketing system into thinking the number is disconnected. Then they get a chance at the menu again. If this time around they pick something, they are automatically un-blacklisted. There's also a whitelist of people that can never be blacklisted.

Another feature I added is the system will pick up on the first ring before 8am and after 8pm, unless the caller is on the whitelist. Great for those annoying wrong numbers in the middle of the night.

I hooked speakers into the Linux computer which play a ring sound. The ring sound is only played after the caller ID is received and if it isn't picking up on the first ring because of blacklisting or after-hours. I haven't yet figured out what to do about the rest of the phones in the house though. On all but one I turned off the ringer. I think I need to setup an intercom or something and have it hooked into the speakers on my Linux box so it can relay the ring signal.

Before I moved I also had an X10 menu in there. It would prompt me to enter a unit number and I could turn things on and off. I haven't yet gotten around to fighting with X10 at the new place yet though, so for now it's disabled.

Since the system is Tcl based, I decided to get crazy and I added a Tic-tac-toe module. Callers can choose to play from the main menu, and can choose to go first or second. The numbers 1-9 represent the board. It's not a super-smart implementation, it is possible for the caller to win. It just chooses random squares and looks for 2 in a row to either block or make a win.

Now that it plays Tic-tac-toe I'm wondering what other games might be playable over the phone? Of course I could do a lot more than just have it play games. I could set up some kind of automated phone service, do billing, use text-to-speech to read email or stock reports or weather or something, the list goes on-and-on. But for the moment, adding more silly games seems like fun.

Well if you made it this far, you probably want to try it for yourself. Go ahead: 916 967 5482

November 14, 2005, 11:03 am

Woohoo! It works!

I got Tcl macros added this morning. Now I push one button and it knows the state of the receiver and magically does the right thing! All those extra remotes all over the table can be put somewhere else.

November 13, 2005, 7:49 pm

Soooo close

I got the input control working on the receiver and managed to come up with a coding system that matches the X10 MouseRemote enough that when I push the buttons while it's in PC mode I get different codes. Reprogrammed my TiVo remote so it sends a power code for a brand I don't own. Now I have 2 macros in my daemon so when I push Power on the TiVo remote, the receiver and the TV turn on and the input changes to the TiVo. When I push power on the X10 remote, it does the same thing except switches the input to the MythTV box. This works because both the receiver and the TV can be told to be "on" without having to send a toggle.

But I can't turn anything off.

I still need to add Tcl macros to the daemon. Then I can make the macro check the state of the receiver. If the receiver is off, turn it on. If the input is wrong switch it. If the receiver is already on and the input is already correct, turn everything off. Then I will just need the TiVo remote and the X10 remote and everything will work just like I was using a tuner built into the TV. But to add the Tcl stuff I have to figure out how the Tcl can get status back from the receiver when the receiver works asynchronously.

I also need to add more error detection to the receiver module. The RX-V1000 seems to have semi buggy firmware and will ignore the serial commands occasionally. Gotta do something so if I send it a command and it doesn't do it, the module retries until it does what it's been told. Again, it's a little tricky because the receiver is asynchronous. I can't just block and wait for the receiver to respond since all the receiver input is handled in a different thread.

Oh yah, and earlier today I added a "swirly" command to the ICM7218 module. Now I can tell it to run a swirly a certain number of times. What's a swirly? It's a little animation where the outer segments of the LED are lit in sequence, so it looks like a little snake is running around in a circle. Maybe if I ever get a free C-Band satellite, I can have the swirly run while the computer is repositioning the satellite? Dunno, guess it depends on if the satellite IRD can send any feedback to the computer. Not sure what use it is right now, but it looks cool!