Avionics
Core avionics package for CURE flight computers
Loading...
Searching...
No Matches
Telemetry.cpp
Go to the documentation of this file.
2#include "ArduinoHAL.h"
3#include <algorithm>
4
5Telemetry::Telemetry(SendableSensorData* ssdArray[], int ssdArrayLength, Stream &rfdSerialConnection)
6 : rfdSerialConnection(rfdSerialConnection)
7{
8 this->ssdArray = ssdArray;
9 this->ssdArrayLength = ssdArrayLength;
10 //TODO: it would be nice if we could throw an error at compile time
11 //if a user's desired max packet size as specified from what they put in
12 //ssdArray is larger than this value.
13}
14
15void Telemetry::preparePacket(uint32_t timestamp) {
16 this->packet[0] = 0;
17 this->packet[1] = 0;
18 this->packet[2] = 0;
19 this->packet[3] = START_BYTE;
20 this->packet[4] = (timestamp >> 24) & 0xFF;
21 this->packet[5] = (timestamp >> 16) & 0xFF;
22 this->packet[6] = (timestamp >> 8) & 0xFF;
23 this->packet[7] = timestamp & 0xFF;
24 nextEmptyPacketIndex = 8;
25}
26
27void Telemetry::addSingleSDHToPacket(SensorDataHandler* sdh) {
28 float floatData = sdh->getLastDataPointSaved().data;
29 uint32_t data;
30 memcpy(&data, &floatData, sizeof(data));
31 for (int i = 3; i > -1; i--) {
32 this->packet[nextEmptyPacketIndex+(3-i)] = (data >> (i*8)) & 0xFF;
33 }
34 nextEmptyPacketIndex += 4;
35}
36
37void Telemetry::addSSDToPacket(SendableSensorData* ssd) {
38 if (ssd->singleSDH != nullptr) {
39 this->packet[nextEmptyPacketIndex] = ssd->singleSDH->getName();
40 nextEmptyPacketIndex += 1;
41 this->addSingleSDHToPacket(ssd->singleSDH);
42 }
43 if (ssd->multiSDH != nullptr) {
44 this->packet[nextEmptyPacketIndex] = ssd->multiSDHDataLabel;
45 nextEmptyPacketIndex += 1;
46 for (int i = 0; i < ssd->multiSDHLength; i++) {
47 this->addSingleSDHToPacket(ssd->multiSDH[i]);
48 }
49 }
50}
51
52void Telemetry::setPacketToZero() {
53 for (int i = 0; i < 120; i++) { //Completely clear packet
54 this->packet[i] = 0;
55 }
56}
57
58void Telemetry::addEndMarker() {
59 this->packet[nextEmptyPacketIndex] = 0;
60 this->packet[nextEmptyPacketIndex+1] = 0;
61 this->packet[nextEmptyPacketIndex+2] = 0;
62 this->packet[nextEmptyPacketIndex+3] = END_BYTE;
63 nextEmptyPacketIndex += 4;
64}
65
66bool Telemetry::tick(uint32_t currentTime) {
67 bool sendingPacketThisTick = false;
68 int currentPacketIndex = 0;
69 for (int i = 0; i < this->ssdArrayLength; i++) {
70 if (ssdArray[i]->shouldBeSent(currentTime)) {
71 if (!sendingPacketThisTick) {
72 setPacketToZero();
73 preparePacket(currentTime);
74 addSSDToPacket(ssdArray[i]);
75 sendingPacketThisTick = true;
76 } else {
77 addSSDToPacket(ssdArray[i]);
78 }
79 ssdArray[i]->markWasSent(currentTime);
80 }
81 }
82 if (sendingPacketThisTick) {
83 addEndMarker();
84 for (int i = 0; i < nextEmptyPacketIndex; i++) {
85 this->rfdSerialConnection.write(this->packet[i]);
86 }
87 }
88 return sendingPacketThisTick;
89}
#define START_BYTE
Definition Telemetry.h:11
#define END_BYTE
Definition Telemetry.h:12
float data
Definition DataPoint.h:14
Buffers sensor samples and forwards them to an IDataSaver at a controlled rate.
DataPoint getLastDataPointSaved() const
uint8_t getName() const
Telemetry(SendableSensorData *ssdArray[], int ssdArrayLength, Stream &rfdSerialConnection)
Initialize this object.
Definition Telemetry.cpp:5
bool tick(uint32_t currentTime)
No argument tick function that handles sending data at specified send frequencies.
Definition Telemetry.cpp:66
Bundles one or more SensorDataHandler pointers for telemetry packing.
Definition Telemetry.h:25
SensorDataHandler ** multiSDH
Definition Telemetry.h:27
SensorDataHandler * singleSDH
Definition Telemetry.h:26