I learned long ago that no matter how good the hardware is, it's junk if users can't make effective use of it, so it's worth spending serious time on the software. For this project there's two main pieces of software: the "firmware" that runs directly on the hardware and makes everything happen, and the tool that users interact with directly to manage it. Since I'm waiting for parts to arrive, I figured I'd get started writing the desktop application configuration tool.
I'll skip over the gory details of software development and the various design changes I made along the way and just talk about the results so far. If anyone cares about those details, let me know and I can write more them some other time.
I wanted the desktop app to run under Windows (my primary desktop OS), Mac, and Linux. I settled on using Python as the language and PyQt for the UI framework, which I've never used before. It was a not-unpleasant experience learning PyQt but it did add a bit of time for the learning curve.
I currently have no way to test the application on a Mac, nor do I have ready access to a Linux desktop, but the later can be remedied fairly easily with something like VirtualBox. In any case, the code should theoretically run on those 3 OS's without much fuss. Once I can get access to the non-Windows platforms, I can build native installers and make it really easy to use.
After some muddling about, I settled on an MDI interface. It allows the user to open/close/arrange whatever parts of the application they'd like, any way they want. The application even remembers window states and positions between sessions.
The first "module" I wrote was the GPS monitor since it was going to be pretty straightforward. Here's what it looks like showing some sample data:
The GPS monitor shows what you'd expect from a GPS receiver, including the satellites it's locked onto and the message rate it's getting from the hardware.
I should also mention at this point in order to effectively debug the desktop application, I needed to point it at the hardware I don't yet have, running the firmware I haven't yet written. So I had to take a detour and write a hardware emulator. The emulator runs as a separate python application and listens on a TCP port. It also has a UI that contains knobs and dials I can poke and prod to simulate various hardware level events. It also reads from a file of NMEA GPS data and uses that to pretend to be a GPS receiver. During development, the desktop application can connect to the emulator and the emulator responds as if it's the real hardware. This also allows me to test ideas for the firmware I'll eventually be writing.