Back to where this all started; RaceChrono. Without the ability to send data to RaceChrono, my project wouldn't be worth much to me.
I became a member on the RaceChrono forums, and asked some questions about data formats. The author, username "aol", was kind enough to answer with a wealth of information about the $RC1, $RC2, and future $RC3 formats, which are all pretty simple NMEA like messages. Those formats specify a couple of fixed fields (time, message count) along with a bunch of general purpose data fields, some of which have predefined purposes like acceleration and gyroscope rates in the X, Y, and Z axis. The other fields are nominally for analog and digital sensors, both of which my device will have. Those fields are mapped by the user to almost anything in the RaceChrono app.
For the time being, my device supports only the $RC3 format, but I'll be adding support for the older $RC1 and $RC2 formats eventually (they use the same format, but with fewer fields). Other than the fixed fields for time and message count, the newest $RC3 format allows for 29 values to be sent to RaceChrono. My device allows you to map any input to any of those output values for complete flexibility. In addition, every output value can be transformed in various ways. I may add other output transformations if I decide they'd be useful. Here you can see the configuration dialog for one output:
All output transformations are done in floating point and you can specify the number of decimal places to send to RaceChrono. I don't know if RaceChrono will even accept floating point numbers; that's something I have to check. But the capability is there if it's needed.
The MCU I'm using doesn't have a floating point unit, so floating point operations are emulated, but the processor is pretty fast. I haven't yet tried to load up all 29 outputs with all the transformations turned on to see if the device will sustain the 100 Hz update rate I'm targeting, but I'll test that eventually. If necessary, I could switch to an MCU with a floating point unit.
You'll notice that you can also name each output. For each output, the software displays the name given by RaceChrono alongside the user assigned name to make it a little easier to keep things straight.
While on the RaceChrono forums, I came across multiple discussions about the desire to allow users to rename some of those fields in RaceChrono to reflect the actual use of the field, much like the user can name those outputs on my device. The RaceChrono author hasn't committed to adding that feature to my knowledge, but I've added a feature to my device that might be a useful means to that end. My device will accept a simple command over the serial port (via Bluetooth or USB) that will respond with a list of all the names given to each RaceChrono field by the user of my device. If the RaceChrono author ever wants to take advantage of this, he's welcome to contact me about the details.
Besides the GPS monitor, CAN monitor, and RaceChrono outputs, the software also has windows and dialogs for configuring the analog and digital inputs, general device configuration, import/export functionality, and other do-dads. As time goes on and I get further into this project I'm sure I'll be adding other functionality. If anyone wants to read any posts on any of that, let me know.