Skip to content

File main.cpp

File List > firmware > src > main.cpp

Go to the documentation of this file

/*
    groundstation - main.cpp of the groundstation 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;

// Button Pins Initialization

buttonStruct pinButton;

// Pin Declarations

uint8_t pinControlBox1 = PIN_PE7;
uint8_t pinControlBox2 = PIN_PE6;

// UART Declarations

HardwareSerial *SerialUSB1 = &Serial5;
HardwareSerial *SerialUSB2 = &Serial2;

uint8_t pinTX_USB1 = PIN_PG0;
uint8_t pinRX_USB1 = PIN_PG1;
uint8_t pinTX_USB2 = PIN_PF0;
uint8_t pinRX_USB2 = PIN_PF1;

// Initialize Radio Modules

// First D-Sub
RC17xxHP_RC232 rc1780hp(&Serial4, PIN_PE0, PIN_PE1, 19200, PIN_PE4, PIN_PE5, PIN_PE2, PIN_PE3);
// Second D-Sub
RC17xxHP_RC232 rc1701hp(&Serial1, PIN_PC0, PIN_PC1, 19200, PIN_PC4, PIN_PC5, PIN_PC2, PIN_PC3);

// Packet Declarations

Packet commandPacket;
Packet framePacket;
Packet flightDataPacket;
Packet telemetryDataPacket;

// 

dataStruct dataVars;

uint8_t packetBuffer[32];
uint8_t packetBufferIndex = 0;

void setup()
{
  pinLed.R = PIN_PG5;
  pinLed.G = PIN_PG4;
  pinLed.B = PIN_PG3;
  pinLed.D1 = PIN_PA0;
  pinLed.D2 = PIN_PG7;
  pinLed.D3 = PIN_PG6;
  pinLed.rssi_1 = PIN_PD7;
  pinLed.rssi_2 = PIN_PD6;
  pinLed.rssi_3 = PIN_PD5;
  pinLed.rssi_4 = PIN_PD4;
  pinLed.rssi_5 = PIN_PD3;
  pinLed.rssi_6 = PIN_PD2;
  pinLed.rssi_7 = PIN_PD1;
  pinLed.rssi_8 = PIN_PD0;

  pinLed.pinMode();

  pinButton.sw1 = PIN_PG2;
  pinButton.sw2 = PIN_PF6;
  pinButton.sw3 = PIN_PF5;
  pinButton.sw4 = PIN_PF4;
  pinButton.sw5 = PIN_PF3;
  pinButton.sw6 = PIN_PF2;

  pinButton.pinMode();

  pinMode(pinControlBox1, INPUT);
  pinMode(pinControlBox2, INPUT);

  ledUpdate(SETUPBEGIN, &pinLed); // R On

  // UART Declarations

  SerialUSB1->pins(pinTX_USB1, pinRX_USB1);
  SerialUSB2->pins(pinTX_USB2, pinRX_USB2);

  SerialUSB1->begin(115200);
  SerialUSB2->begin(115200);

  // Initialize I2C (Display)

  // Wire.pins(PIN_PC6, PIN_PC7);
  // Wire.begin();

  // Initialize Radio Modules

  radioModulesSetup(&rc1780hp, &rc1701hp, &pinLed);

  ledUpdate(SETUPRADIOMODULS, &pinLed); // B On

  // Packet Components Initializations

  commandPacket.addComponent(new parity_Component());
  commandPacket.addComponent(new char_Component(&dataVars.command));

  framePacket.addComponent(new cobs_Component(0xEE, 4));
  framePacket.addComponent(new parity_Component());
  framePacket.addComponent(new uint8_t_Component(&dataVars.packetIdentifier, 1, 0, 1));
  framePacket.addComponent(new empty_Component(18));
  framePacket.addComponent(new empty_Component(32));
  framePacket.addComponent(new empty_Component(32));
  framePacket.addComponent(new const_Component(0xEE, 8, 255));
  framePacket.addComponent(new float_Component(&dataVars.rssi, 8, 0.0f, -127.5f, 255));

  flightDataPacket.addComponent(new empty_Component(6));
  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 empty_Component(16));

  telemetryDataPacket.addComponent(new empty_Component(6));
  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(&dataVars.lowPowerMode, 1, 0, 1));
  telemetryDataPacket.addComponent(new float_Component(&dataVars.voltageBatteryCOTS, 5, 5, 11.2));
  telemetryDataPacket.addComponent(new empty_Component(11));
  telemetryDataPacket.addComponent(new empty_Component(16));

  // Setup Complete

  ledUpdate(SETUPEND, &pinLed); // G On
}

void loop()
{
  // Check both USBs for commands
  dataVars.command = commandReceive(SerialUSB1);
  commandExecute(&rc1701hp, dataVars.command, &commandPacket);
  dataVars.command = commandReceive(SerialUSB2);
  commandExecute(&rc1701hp, dataVars.command, &commandPacket);

  buttonCheck(pinButton);
  controlBoxCheck(pinControlBox1, pinControlBox2);

  if (packetReceive(&rc1780hp, packetBuffer, &packetBufferIndex, &dataVars, &framePacket, &flightDataPacket, &telemetryDataPacket) == 0)
  {
    dataSendUsb(SerialUSB1, &dataVars);
    dataSendUsb(SerialUSB2, &dataVars);

    displayUpdate(0x00, &dataVars);

    ledRssiUpdate(dataVars.rssi, &pinLed);
  }
}