Skip to content

Module Index

The node is a ThreadX application: no superloop. Each responsibility is its own thread, and threads talk to each other through one shared struct (telemetry_data), semaphores, and ring buffers. This page is the map of every module and where it's documented.

Threads

Application threads are created in App_ThreadX_Init() (app_threadx.c); the networking threads in MX_NetXDuo_Init() (app_netxduo.c). Lower priority number = higher priority in ThreadX.

ThreadPrioRate / triggerJobDocs
CAN RX15on RX IRQDrain RX ring buffer → ingest framesCAN
CAN TX15on TX requestPush queued frames to FDCAN hardwareCAN
CAN Periodic TX1620 HzSnapshot → pack derived values → re-broadcastCAN
UDP(NetXDuo)20 Hz / 5 Hz, starts after DHCP leaseSnapshot → CSV → UDP to the pitNetworking
NTRIP(NetXDuo)streaming, starts after DHCP leasePull RTK corrections over TCPNetworking
GPS14on UART RXDrain UART ring buffer → lwGPS → telemetryGPS
GPS Sender14on RTCM readyPush RTCM corrections to the receiverGPS
Lap(tunable)on GPS updateDetect finish-line crossings, count lapsLap Tracking
SD Buffer1250 HzSnapshot → CSV line → ping-pong bufferSD Logging
SD Writer12on chunk fullFlush a full buffer to the card via FileXSD Logging
Blink312 HzHeartbeat LED, proof the scheduler is aliven/a

All numbers come from sys_conf.h.

Interrupts vs. threads

Peripherals (FDCAN, UART DMA) do the minimum in their ISRs: copy bytes/frames into a ring buffer and post a semaphore. The heavy work (parsing, decoding, ingesting) happens in the corresponding thread once it wakes. This keeps ISRs short and moves the real work into the scheduler where it can be prioritized.

Modules by group

At the track? Skip the theory and go straight to Track Operations: quick checks, LED signatures, failure modes, and the pre-event checklist.

Released under the MIT License.