File main.cpp
File List > firmware > src > main.cpp
Go to the documentation of this file
/*
onboard - main.cpp of the board computer for the ASCENT III telemetry system.
Spaceflight Rocketry Giessen e.V.
Published under the CERN OHL-S v2 license at https://github.com/Spaceflight-Rocketry-Giessen-e-V/Telemetry.
*/
#include "header.h"
#include "utility.h"
// LED Pins Initialization
ledStruct pinLed;
// Pin Declarations
uint8_t pinSLP = PIN_PG0;
uint8_t pinARM1 = PIN_PG1;
uint8_t pinD26 = PIN_PF4;
uint8_t pinD27 = PIN_PF5;
uint8_t pinD28 = PIN_PF6;
uint8_t pinD4 = PIN_PC6;
uint8_t pinD5 = PIN_PC7;
uint8_t pinBuzzer = PIN_PB0;
// UART Declarations
HardwareSerial *SerialUSB = &Serial4;
HardwareSerial *SerialUmbilical = &Serial1;
uint8_t pinTX_USB = PIN_PE4;
uint8_t pinRX_USB = PIN_PE5;
uint8_t pinTX_Umbilical = PIN_PC0;
uint8_t pinRX_Umbilical = PIN_PC1;
// Initialize Radio Modules
RC17xxHP_RC232 rc1780hp(&Serial0, PIN_PA0, PIN_PA1, 19200, PIN_PA5, PIN_PG7, PIN_PA3, PIN_PA4);
RC17xxHP_RC232 rc1701hp(&Serial3, PIN_PB4, PIN_PB5, 19200, PIN_PB3, PIN_PG6, PIN_PB1, PIN_PB2);
dataStruct dataVars;
// Data Arrays Preparations
const uint8_t uint8CountPower = 3;
uint8_t *uint8ListPower[uint8CountPower] = {&dataVars.statePower, &dataVars.stateUmbilical, &dataVars.temperatureBattery};
const uint8_t floatCountPower = 4;
float *floatListPower[floatCountPower] = {&dataVars.currentUmbilical, &dataVars.currentBattery, &dataVars.voltageBattery, &dataVars.voltageBatteryCOTS};
const uint8_t uint8CountSens = 3;
uint8_t *uint8ListSens[uint8CountSens] = {&dataVars.stateSens, &dataVars.satCountGNSS, &dataVars.temperatureElectronics};
const uint8_t floatCountSens = 6;
float *floatListSens[floatCountSens] = {&dataVars.latitude, &dataVars.longitude, &dataVars.heightPressure, &dataVars.acceleration, &dataVars.heightGNSS, &dataVars.hdopGNSS};
const uint8_t uint8CountControl = 6;
uint8_t *uint8ListControl[uint8CountControl] = {&dataVars.stateControl, &dataVars.flightEvents, &dataVars.stateCapacitors, &dataVars.pressureDecoupler, &dataVars.ldrDecoupler, &dataVars.continuityPyros};
const uint8_t floatCountControl = 0;
float *floatListControl[floatCountControl] = {};
// Subsystems Initialization
Subsystem subsystemPower(0x50, &pinLed.Power, &dataVars.statePower, uint8ListPower, uint8CountPower, floatListPower, floatCountPower);
Subsystem subsystemSens(0x20, &pinLed.Sens, &dataVars.stateSens, uint8ListSens, uint8CountSens, floatListSens, floatCountSens);
Subsystem subsystemControl(0x40, &pinLed.Control, &dataVars.stateControl, uint8ListControl, uint8CountControl, floatListControl, floatCountControl);
const uint8_t subsystemsCount = 3;
Subsystem *subsystemList[subsystemsCount] = {&subsystemSens, &subsystemPower, &subsystemControl};
// Packet Declarations
Packet commandPacket;
Packet flightDataPacket;
Packet telemetryDataPacket;
// Loop Variables Declaration
const uint8_t loopFrequency = 10; // in Hz 10 Hz = 100 ms interval
const uint8_t timeBetweenStandbyPackets = 5; // in seconds. In standby, data packets aren't send every loop
uint8_t flightMode = 0;
uint32_t loopCount = 0;
uint32_t loopStartTime = 0;
void setup()
{
pinLed.R = PIN_PF0;
pinLed.G = PIN_PE7;
pinLed.B = PIN_PE6;
pinLed.D1 = PIN_PF3;
pinLed.D2 = PIN_PF2;
pinLed.D3 = PIN_PF1;
pinLed.Debug1 = PIN_PB6;
pinLed.Debug2 = PIN_PB7;
pinLed.Power = PIN_PD3;
pinLed.Sens = PIN_PD4;
pinLed.Control = PIN_PD2;
pinLed.lowPowerMode = new uint8_t(0);
pinLed.pinMode();
ledUpdate(SETUPBEGIN, &pinLed); // R On
// Pin Initialisations
pinMode(pinSLP, OUTPUT);
pinMode(pinARM1, OUTPUT);
pinMode(pinBuzzer, OUTPUT);
digitalWrite(pinSLP, LOW);
digitalWrite(pinARM1, LOW);
// UART Declarations
SerialUSB->pins(pinTX_USB, pinRX_USB);
SerialUmbilical->pins(pinTX_Umbilical, pinRX_Umbilical);
SerialUSB->begin(115200);
SerialUmbilical->begin(115200);
// Initialize I2C
Wire.pins(PIN_PC2, PIN_PC3);
Wire.begin();
// Initialize Radio Modules
radioModulesSetup(&rc1780hp, &rc1701hp, &pinLed, pinBuzzer);
ledUpdate(SETUPRADIOMODULS, &pinLed); // B On
// Packet Components Initializations
commandPacket.addComponent(new parity_Component());
commandPacket.addComponent(new char_Component(&dataVars.command));
flightDataPacket.addComponent(new cobs_Component(0xEE, 4));
flightDataPacket.addComponent(new parity_Component());
flightDataPacket.addComponent(new const_Component(0, 1));
flightDataPacket.addComponent(new float_Component(&dataVars.acceleration, 10, -17, 17.1));
flightDataPacket.addComponent(new float_Component(&dataVars.heightPressure, 15, 0, 6553.4));
flightDataPacket.addComponent(new uint8_t_Component(&dataVars.flightEvents, 5, 0, 31));
flightDataPacket.addComponent(new float_Component(&dataVars.latitude, 26, -90, 90));
flightDataPacket.addComponent(new float_Component(&dataVars.longitude, 26, -180, 180));
flightDataPacket.addComponent(new const_Component(0xEE, 8, 255));
telemetryDataPacket.addComponent(new cobs_Component(0xEE, 4));
telemetryDataPacket.addComponent(new parity_Component());
telemetryDataPacket.addComponent(new const_Component(1, 1));
telemetryDataPacket.addComponent(new empty_Component(2));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.stateTelemetry, 2, 0, 3));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.stateControl, 2, 0, 3));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.statePower, 2, 0, 3));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.stateSens, 2, 0, 3));
telemetryDataPacket.addComponent(new empty_Component(1));
telemetryDataPacket.addComponent(new float_Component(&dataVars.heightGNSS, 15, 0, 6553.4));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.satCountGNSS, 4, 0, 15));
telemetryDataPacket.addComponent(new float_Component(&dataVars.hdopGNSS, 4, 0, 7.5));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.temperatureElectronics, 4, 0, 150));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.temperatureBattery, 4, 0, 150));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.stateCapacitors, 4, 0, 15));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.continuityPyros, 2, 0, 3));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.pressureDecoupler, 1, 0, 1));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.ldrDecoupler, 1, 0, 1));
telemetryDataPacket.addComponent(new empty_Component(2));
telemetryDataPacket.addComponent(new float_Component(&dataVars.voltageBattery, 6, 5, 8.15));
telemetryDataPacket.addComponent(new float_Component(&dataVars.currentBattery, 3, 0, 1.75));
telemetryDataPacket.addComponent(new float_Component(&dataVars.currentUmbilical, 3, 0, 1.75));
telemetryDataPacket.addComponent(new uint8_t_Component(&dataVars.stateUmbilical, 1, 0, 1));
telemetryDataPacket.addComponent(new uint8_t_Component(pinLed.lowPowerMode, 1, 0, 1));
telemetryDataPacket.addComponent(new float_Component(&dataVars.voltageBatteryCOTS, 5, 5, 11.2));
telemetryDataPacket.addComponent(new empty_Component(11));
telemetryDataPacket.addComponent(new const_Component(0xEE, 8, 255));
// Setup Complete
buzzerSound(pinBuzzer);
dataVars.stateTelemetry = 3;
ledUpdate(SETUPEND, &pinLed); // G On
}
void loop()
{
subsystemsConnCheck(subsystemList, subsystemsCount);
subsystemsDataGet(subsystemList, subsystemsCount);
subsystemsLedUpdate(subsystemList, subsystemsCount, *(pinLed.lowPowerMode));
commandReceive(&rc1701hp, &commandPacket);
commandExecute(dataVars.command, &rc1780hp, &dataVars, &pinLed, &flightMode, subsystemList, subsystemsCount, &subsystemSens, &subsystemControl, &flightDataPacket, &telemetryDataPacket, pinARM1, pinSLP);
uint8_t packetType = packetSendCheck(&flightMode, loopFrequency, timeBetweenStandbyPackets, loopCount);
packetSend(&rc1780hp, packetType, &flightDataPacket, &telemetryDataPacket);
flashWrite(&dataVars);
ledUpdate(UPDATE, &pinLed);
loopVariablesUpdate(&loopCount, &loopStartTime, loopFrequency, pinLed.D1);
}