Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Achieve transmission of GLOBAL_POSITION_INT & ATTITUDE MAVLink messages from the drone to the ground control station (Mission Planner) via RFD 900 radio. Any missing sensor data will be filled with sample data at this time.

🛠️ 3. Class Definitions

📡

...

GroundStationCommunication

Owner: Hunter Adams Roni Kant

Description

Handles communication between the ground station and drone using RFD 900 or equivalent modules, utilizing circular buffers for MAVLink message management.

...

  • DMAReceiveBuffer: CircularBuffer - Stores incoming data.

  • lowPriorityTransmitBuffer: CircularBuffer - For low-priority data dispatch.

  • highPriorityTransmitBuffer: CircularBuffer - For high-priority routine data dispatch.

Methods

  • sendToGroundStationtransmit(CircularBuffer &transmissionBuffer): Sends data to the ground station.

  • receiveFromGroundStationISR(): ISR for incoming data, discards if DMAReceiveBuffer is full.

...

Flexible design compatible with various communication protocols and setups.

⏲️

...

TelemetryTask

Owner: Rahul Ramkumar

Description

Facilitates STD32 timer interrupts for periodic callbacks, essential for consistent data dispatch to the ground station. This is just a way to abstract the process of creating a timer interrupt on the STM32 board. This method will be used to generate timer interrupts to schedule regular data transmissions to the ground station.

Method Signature

void registerTimerInterrupt(int timeIntervalMs, void (*function)())

Parameters

  • timeIntervalMs: The timer interval in milliseconds.

  • function: The callback function.

Implementation Details

Example of function execution; real application requires STM32 timer setup.This is essentially a wrapper for a FreeRTOS task that allows us to use a lambda function with access to the TM instance as a FreeRTOS task.

Constructor Signature

TelemetryTask(const char* taskName, int stackSize, UBaseType_t uxPriority, TelemetryManager& tm, Callback cbLambda)

Parameters

  • taskName: The RTOS task name

  • stackSize: Task stack size.

  • uxPriority: Task priority.

  • tm: Reference to telemetry manager instance.

  • cbLambda: The callback function.

Note

Callback is a type alias for std::function<void(TelemetryManager&)>

Implementation Details

🔄 MavlinkTranslator

Owner: Yarema Dzulynsky

...

🚀 Main Class Definition: System Initialization and Task Management

Owner:

Flow Chart

...

Expand
titleMarkdown Mermaid Flowchart Code
Code Block

Telemetry Manager Setup
```mermaid
flowchart TB
TMConstructor("Create TelemetryManager Instance")
MTConstructor("Create MavlinkTranslator Instance")
GSCConstructor("Create GroundStationCommunication Instance")

defineCallbacks["Define routineDataTransmission Task Callback"]

GSCDefine("create 
DMAReceiveBuffer, 
lowPriorityTransmitBuffer, 
highPriorityTransmitBuffer")
End("End")





TMConstructor --> MTConstructor
TMConstructor --> GSCConstructor

MTConstructor --> defineCallbacks
GSCConstructor --> defineCallbacks

GSCConstructor --> GSCDefine
defineCallbacks --> End


```

Telemetry Manager Operation
```mermaid
flowchart TB

%% TELEMETRY MANAGER


%% Routine Data Transmission Functionality

routineDataTransmission("RTOS Task: routineDataTransmission")

ingestStateData["Ingest drone state data
and convert to Mavlink bytes"]

packHPBuffer["Pack drone state data 
(Mavlink bytes) into 
GSC.highPriorityTransmitBuffer"]

transmitStateData["Transmit GSC.highPriorityTransmitBuffer 
contents via GSC.transmit()"]

RTOSDelay["RTOS delay: 500ms"]

routineDataTransmission --> ingestStateData
ingestStateData --> packHPBuffer
packHPBuffer --> transmitStateData
transmitStateData --> RTOSDelay
RTOSDelay --> ingestStateData


%% DMA Receive Functionality


DMAInterrupt("RFD900 Interrupt: receiveInterruptServiceRoutine")
receiveData["Receive data"]
checkBufferSpace{"GSC.DMAReceiveBuffer 
enough space?"}
addDataToBuffer["Add new data to GSC.DMAReceiveBuffer"]
discardData["Discard new data"]
DMAInterruptEnd("DMA Interrupt Handler End")

DMAInterrupt --> receiveData
receiveData --> checkBufferSpace
checkBufferSpace --> |Yes| addDataToBuffer
checkBufferSpace --> |No| discardData
addDataToBuffer --> DMAInterruptEnd
discardData --> DMAInterruptEnd

%% Loop Update Functionality

loopUpdate("SM Managed: update")

translateMavlink["Translate Mavlink bytes 
(to callback actions) from 
GSC.DMAReceiveBuffer and 
trigger associated callbakcs"]

fillLowPriorityBuffer["Fill GSC.lowPriorityTransmitBuffer"]

transmitLowPriorityBuffer["Transmit GSC.lowPriorityTransmitBuffer"]

loopUpdate --> translateMavlink
translateMavlink --> fillLowPriorityBuffer
fillLowPriorityBuffer --> transmitLowPriorityBuffer
transmitLowPriorityBuffer --> |SM Managed Delay| translateMavlink
```

Instances

  • GroundStationComms GSC: Oversees ground station comms.

  • MavlinkTranslator MT: MAVLink message and byte stream translator.TimerInterrupt TI: Timer-based task manager.

🌐 Function: init

Description

...

  • Timer Interrupts: Configured for 500ms and 1000ms operation intervals.

  • FreeRTOS Tasks:

    • translateToMavlinkThread: Processes GSC.DMAReceiveBuffer bytes into MAVLink messages.

    • mavlinkToBytesThread: Loads MAVLink bytes into GSC.lowPriorityTransmitBuffer.

  • Scheduler: Engages the FreeRTOS scheduler for task oversight.

🗝 Function: getInstance

Description

...

  • .

🔄 Tasks and ISRs

  • translateToMavlinkThread & mavlinkToBytesThread: Converts between MAVLink messages and byte streams for drone-ground station communication.

  • TimerISR500ms & TimerISR1000ms: Ensures regular data dispatch from both GSC.lowPriorityTransmitBuffer and GSC.highPriorityTransmitBuffer.

...