Graphical Debug Utility
Role
I was the Principal Engineer over a Development Function
Project goal
When I was hired for an autonomous vehicle software company, the previous engineers had developed an application for sending text logs to a remote console in real-time for the purpose of building new functionality and debugging existing functionality. While this was useful, the amount of text generated by this application was extreme; an entire journey's worth of data was multiple gigabytes. The rate of text flowing to the remote console was so fast that it was impossible to read, let alone understand, and any benefit from it being displayed in real-time was lost. What was needed was a method for condensing the text into some other kind of display. The display needed to have graphics that could be intuitively understood. This required a change in the form of the data coming from the legacy application as well as a change in the receiver.
Solution
The change to the overall solution was two-part. First, I changed the form of the data generated in the legacy application from simple text to Google protocol buffers. Using protocol buffers had the benefit of extensibility and code generation so that less maintenance was involved. Second, the receiver application, previously written in C, was ported to LabVIEW so that it was trivial to create graphical displays of many kinds. The LabVIEW graphical elements allowed the data sent over (previously in text) to be intuitively rendered and understood at a glance. Moreover, as the data evolved moment-to-moment, the user could easily understand trends and what was happening in the underlying data model. The key new piece of work was a code generator that would take the .proto file (used to generate the new C code in the legacy application) and generate VIs that parsed data from the data stream. First, I wrote a library that would parse the basic data types in the protobuf standard. When this library was verified for accuracy and optimized for speed, I wrote another LabVIEW program that would first parse the contents of the .proto file and then use VI scripting functionality to generate VIs that would parse each of the complex data types specified in the .proto file into a LabVIEW cluster. The generated VIs used the library functions to parse the basic data types. Overall, the revised application was radically simpler to use and accelerated the rate of development and debugging by many times.