2024-25 Software Planning

Overall Goals

  • Increase software quality assurance through a variety of techniques, including but not limited to

    • Simulations

    • Unit Testing w/ code coverage scans

    • Static Analysis

    • Address Sanitizers

  • Develop infrastructure that can simplify interfacing between GSW and FSW

  • Develop frameworks to improve maintenance of future software

  • Heavily document software design and architectural decisions for future members to understand and learn from

Ground Software

  • Rewrite in Golang

    • Well-suited for networked and concurrent applications

    • Less likely to f*ck up memory (garbage collection)

    • Good tooling

    • Can work on almost any platform (can depend on our design though)

  • Prototype already in the works with a telemetry configuration manager and some semblance of communication between threads (not processes) using channels

  • Come up with how new GSW should operate. Ideally, in an extremely user friendly way that simplifies starting up the system, so anyone can do it

  • Idea: Write backend service(s) and have users run applications that take advantage of service(s). Most likely SOA though, so a single service. Might be simpler too and keep things standardized over microservices.

  • Service(s) should handle

    • Setting up a telemetry configuration on startup

    • Arbitrating between other specified nodes in a network to distribute compute. This can be somewhat complex, so we should start with just supporting a single machine, but make it extensible for this feature. Still looking into what our future ground station hardware will look like since we want to move away from LattePandas

    • Running other necessary services (i.e InfluxDB and Grafana)

    • Receiving all telemetry over UDP and processing it before serving it to application code (most likely going to be a broker architecture pattern)

    • Logging received telemetry over InfluxDB and csv

    • Logging internal messages (for debugging)

  • Applications

    • log_view - View logs. If we operate as a service, it would be ideal to have the logging service log to journalctl, but users may not be tech-pilled enough to do this, so read from that.

    • telem_view - Telemetry viewer. Can toggle viewing memory in base-2, 10 and 16.

Flight Software

  • Make code less hack(athon-)y

  • Re-write in C++ (TBD. Requires more prototyping, determining what the software team will look like and overall avionics team goals for 2024-2025. If we go this route, these are possible libraries (which must be properly designed, discussed and documented before implementation):

    • Transport - Interface for inter-board communication over various protocols (UDP, LoRa, SLIP)

    • Event Manager - Monitor and send events over a transport interface

    • Actors (Pub-Sub) - Have actors/tenants that can subscribe to message ports and send messages over message ports. See about using a zbus implementation with some prototyping. See about standardizing between all ground and flight hardware, which most likely necessitates an auto-gen tool. More on this later. Maybe have actors/tenants be able to share threads, if they access a shared resource?

    • Sensor - Generic sensor class with subclasses that handle retrieving data automagically

    • State Machine - Zephyr has a very barebones implemenation. Maybe make an autogen class that other classes inherit from. Concept of events and flags. User defines what are the possible state transitions and what events/flags will trigger these state changes.

  • Basic CONOPs of how the above should work

    • Initialize

      • Configure transports

      • Set up event manager

      • Create actors and subscribe to ports

      • Create tasks and assign actors to a task

      • “Start the RTOS” - Just starts all the tasks

    • Start tasks. When each tasks starts running it will go through

      • Startup() - Initialize stuff

        • This can include sensors!

      • Post-Startup() - Initialize stuff that has to be done after startup

    • Run

      • Until the end of time (or if we fail out or return early)

      • Different boolean flags can be set, or events can occur triggering state changes causing run method to change

      • Sensor classes will automatically grab data if possible and signal when tasks can take that data

      • etc.

  • Hardware Simulations

    • ModSim - Simulate operating a single module

    • Simplane - Simulate the above, but they all can communicate with each other

    • Need to determine software stack/tools for this

      • QEMU

      • Docker

  • CI Checks

    • Unit Tests. Unit Tests. Unit Tests. Easier to do earlier on in the process. Mandate unit tests, especially when we start library development

      • GTest

    • Static analysis tools.

      • Coverity is a good one

      • Maybe also IKOS?

    • Address sanitizer

    • Valgrind

      • TBD: Significantly slower than address sanitizers. There are trade-offs.

    • Add a linter and formatter

Internal Software Tooling

  • Commander (FSW) - Interface with the FSW event manager library by sending commands over a specified transport. Commands are expected to be an 8 bits.

  • OrkSim (FSW) - Take generated OpenRocket output, parse a configuration and send specific data from OpenRocket as telemetry over Ethernet to see how the backplane (besides sensor-module will respond)

  • Generator (GSW/FSW) - Needs further design, since this has high impcat on future GSW and GSW. Take a series of yaml files and generate header and source files that link to the rest of the GSW and FSW codebases. Maybe make this a submodule for both repositories to inherit and determine what to do.

    • Instead of re-inventing the wheel, take advantage of protobuffers for defining telemetry messages, a proven industry standard. This will come at the cost of some CPU and memory performance, but there is significantly more tooling support in place to support development, compared to developing our own in-house solutions.

    • Other things like state machine generators will have to be YAML or some other markup language still