Skip to content

File utility.cpp

File List > firmware > src > utility.cpp

Go to the documentation of this file

#include "utility.h"

// LEDs states
#define SETUPBEGIN 1
#define SETUPRADIOMODULS 2
#define SETUPEND 3
#define RADIOMODUL_ONE 4
#define RADIOMODUL_TWO 5

static uint8_t radioModuleConfigure(RC17xxHP_RC232 *radioModule)
{
    radioModule->begin();
    radioModule->resetHard();     // initial reboot to clear setting
    if (radioModule->ping() != 0) // confirm response
    {
        return 1;
    }
    if (radioModule->set_RF_DATA_RATE(0x05) != 0) // radio data rate, higher than documentation until flow control is implemented
    {
        return 1;
    }
    if (radioModule->set_RSSI_MODE(0x01) != 0) // append signal strength to packet
    {
        return 1;
    }
    if (radioModule->set_PACKET_LENGTH(0x01) != 0) // send every byte when it arrives
    {
        return 1;
    }
    if (radioModule->set_PACKET_TIMEOUT(0x01) != 0) // send byte 32 ms after it arrives (backup when packet length fails)
    {
        return 1;
    }
    if (radioModule->set_ADDRESS_MODE(0x00) != 0) // addressing off (broadcast)
    {
        return 1;
    }
    if (radioModule->set_CRC_MODE(0x00) != 0) // CRC off
    {
        return 1;
    }
    if (radioModule->set_LED_CONTROL(0x01) != 0) // enable the module's status LED
    {
        return 1;
    }
    radioModule->resetHard(); // reboot settings take effect
    radioModule->flush();     // flush serial buffer
    return 0;
}

// Configures both radio modules; lights each module's status LED on success and sounds buzzzer
void radioModulesSetup(RC17xxHP_RC232 *rc1780hp, RC17xxHP_RC232 *rc1701hp, ledStruct *pinLed)
{
    // fallback loop
    uint8_t error1780 = radioModuleConfigure(rc1780hp); // module 1: downlink (TX)
    if (error1780 == 0)
    {
        ledUpdate(RADIOMODUL_ONE, pinLed);
    }

    uint8_t error1701 = radioModuleConfigure(rc1701hp); // module 2: uplink (RX)
    if (error1701 == 0)
    {
        ledUpdate(RADIOMODUL_TWO, pinLed);
    }

    if (error1780 != 0 || error1701 != 0)
    {
        exit(1);
    }
}

uint8_t commandReceive(HardwareSerial *serialUSB)
{
    // availability
    if (serialUSB->available() == 0)
    {
        return 0;
    }
    else
    {
        return serialUSB->read();
    }
}

void commandExecute(RC17xxHP_RC232 *radioModule, uint8_t command, Packet *commandPacket)
{
    if(command != 0)
    {
        uint8_t *packetBuffer = commandPacket->encode();
        radioModule->send(packetBuffer, commandPacket->getByteSize());
        free(packetBuffer);
    }
}

uint8_t packetReceive(RC17xxHP_RC232 *radioModule, uint8_t *packetBuffer, uint8_t *packetBufferIndex, dataStruct *dataVariables, Packet *framePacket, Packet *flightDataPacket, Packet *telemetryDataPacket)
{
    while ((radioModule->available() != 0) && (*packetBufferIndex < 32))
    {
        packetBuffer[*packetBufferIndex] = radioModule->read();
        (*packetBufferIndex)++;
    }

    if ((*packetBufferIndex >= 2) && (packetBuffer[*packetBufferIndex - 2] == 0xEE)) // -2 because of rssi
    {

        if (*packetBufferIndex >= 13)
        {
            dataVariables->timeSinceLastPacket = millis() - dataVariables->timestampLastPacket;
            dataVariables->timestampLastPacket = millis();

            if(framePacket->decode(&packetBuffer[*packetBufferIndex - 13]) == 0)
            {
                if(dataVariables->packetIdentifier == 0)
                {
                    flightDataPacket->decode(&packetBuffer[*packetBufferIndex - 13]);
                }
                else if(dataVariables->packetIdentifier == 1)
                {
                    telemetryDataPacket->decode(&packetBuffer[*packetBufferIndex - 13]);
                }
            }

            *packetBufferIndex = 0;
            return 0;
        }
    }
    // Serial5.print("nach decode");
    if (*packetBufferIndex > 31)
    {
        *packetBufferIndex = 0;
    }
    return 1;
}

void dataSendUsb(HardwareSerial *serialUSB, dataStruct *dataVariables)
{
    serialUSB->print("\n");
    serialUSB->print("Acceleration: ");
    serialUSB->println(dataVariables->acceleration);
    serialUSB->print("Height (Pressure): ");
    serialUSB->println(dataVariables->heightPressure);
    serialUSB->print("Flight Events: ");
    serialUSB->println(dataVariables->flightEvents);
    serialUSB->print("Latitude: ");
    serialUSB->println(dataVariables->latitude);
    serialUSB->print("Longitude: ");
    serialUSB->println(dataVariables->longitude);
    serialUSB->print("State Telemetry: ");
    serialUSB->println(dataVariables->stateTelemetry);
    serialUSB->print("State Power Supply: ");
    serialUSB->println(dataVariables->statePower);
    serialUSB->print("State Sensorics: ");
    serialUSB->println(dataVariables->stateSens);
    serialUSB->print("State Flight Control: ");
    serialUSB->println(dataVariables->stateControl);
    serialUSB->print("Height (GNSS): ");
    serialUSB->println(dataVariables->heightGNSS);
    serialUSB->print("GNSS Satellite Count: ");
    serialUSB->println(dataVariables->satCountGNSS);
    serialUSB->print("GNSS HDOP: ");
    serialUSB->println(dataVariables->hdopGNSS);
    serialUSB->print("Electronics Temperature: ");
    serialUSB->println(dataVariables->temperatureElectronics);
    serialUSB->print("Battery Temperature: ");
    serialUSB->println(dataVariables->temperatureBattery);
    serialUSB->print("Capacitors State: ");
    serialUSB->println(dataVariables->stateCapacitors);
    serialUSB->print("Pyros Continuity: ");
    serialUSB->println(dataVariables->continuityPyros);
    serialUSB->print("Decoupler Pressure: ");
    serialUSB->println(dataVariables->pressureDecoupler);
    serialUSB->print("Decoupler LDR: ");
    serialUSB->println(dataVariables->ldrDecoupler);
    serialUSB->print("Battery Voltage: ");
    serialUSB->println(dataVariables->voltageBattery);
    serialUSB->print("Battery Current: ");
    serialUSB->println(dataVariables->currentBattery);
    serialUSB->print("Umbilical Current: ");
    serialUSB->println(dataVariables->currentUmbilical);
    serialUSB->print("Umbilical State: ");
    serialUSB->println(dataVariables->stateUmbilical);
    serialUSB->print("Low Power Mode: ");
    serialUSB->println(dataVariables->lowPowerMode);
    serialUSB->print("COTS Battery Voltage: ");
    serialUSB->println(dataVariables->voltageBatteryCOTS);
    serialUSB->print("RSSI: ");
    serialUSB->println(dataVariables->rssi);
    serialUSB->print("Time Since Last Packet: ");
    serialUSB->println(dataVariables->timeSinceLastPacket);
    serialUSB->print("Packet Type: ");
    serialUSB->println(dataVariables->packetIdentifier == 0 ? "Flight Data Packet" : "Telemetry Data Packet");
}

void ledUpdate(uint8_t state, ledStruct *pinLed)
{
    switch (state)
    {
    case SETUPBEGIN:
        digitalWrite(pinLed->R, HIGH);
        digitalWrite(pinLed->G, LOW);
        digitalWrite(pinLed->B, LOW);
        break;
    case SETUPRADIOMODULS:
        digitalWrite(pinLed->R, LOW);
        digitalWrite(pinLed->G, LOW);
        digitalWrite(pinLed->B, HIGH);
        break;
    case SETUPEND:
        digitalWrite(pinLed->R, LOW);
        digitalWrite(pinLed->G, HIGH);
        digitalWrite(pinLed->B, LOW);
        break;
    case RADIOMODUL_ONE:
        digitalWrite(pinLed->D2, HIGH);
        break;
    case RADIOMODUL_TWO:
        digitalWrite(pinLed->D3, HIGH);
        break;
    default:
        break;
    }
}

void ledRssiUpdate(float rssi, ledStruct *pinLed)
{
    // RGB LED (RSSI)
    if (rssi > -40) // High signal strength
    {
        digitalWrite(pinLed->rssi_1, HIGH);
        digitalWrite(pinLed->rssi_2, HIGH);
        digitalWrite(pinLed->rssi_3, HIGH);
        digitalWrite(pinLed->rssi_4, HIGH);
        digitalWrite(pinLed->rssi_5, HIGH);
        digitalWrite(pinLed->rssi_6, HIGH);
        digitalWrite(pinLed->rssi_7, HIGH);
        digitalWrite(pinLed->rssi_8, HIGH);
    }
    else if (rssi > -50)
    {
        digitalWrite(pinLed->rssi_1, HIGH);
        digitalWrite(pinLed->rssi_2, HIGH);
        digitalWrite(pinLed->rssi_3, HIGH);
        digitalWrite(pinLed->rssi_4, HIGH);
        digitalWrite(pinLed->rssi_5, HIGH);
        digitalWrite(pinLed->rssi_6, HIGH);
        digitalWrite(pinLed->rssi_7, HIGH);
        digitalWrite(pinLed->rssi_8, LOW);
    }
    else if (rssi > -60)
    {
        digitalWrite(pinLed->rssi_1, HIGH);
        digitalWrite(pinLed->rssi_2, HIGH);
        digitalWrite(pinLed->rssi_3, HIGH);
        digitalWrite(pinLed->rssi_4, HIGH);
        digitalWrite(pinLed->rssi_5, HIGH);
        digitalWrite(pinLed->rssi_6, HIGH);
        digitalWrite(pinLed->rssi_7, LOW);
        digitalWrite(pinLed->rssi_8, LOW);
    }
    else if (rssi > -70) // Medium signal strength
    {
        digitalWrite(pinLed->rssi_1, HIGH);
        digitalWrite(pinLed->rssi_2, HIGH);
        digitalWrite(pinLed->rssi_3, HIGH);
        digitalWrite(pinLed->rssi_4, HIGH);
        digitalWrite(pinLed->rssi_5, HIGH);
        digitalWrite(pinLed->rssi_6, LOW);
        digitalWrite(pinLed->rssi_7, LOW);
        digitalWrite(pinLed->rssi_8, LOW);
    }
    else if (rssi > -80)
    {
        digitalWrite(pinLed->rssi_1, HIGH);
        digitalWrite(pinLed->rssi_2, HIGH);
        digitalWrite(pinLed->rssi_3, HIGH);
        digitalWrite(pinLed->rssi_4, HIGH);
        digitalWrite(pinLed->rssi_5, LOW);
        digitalWrite(pinLed->rssi_6, LOW);
        digitalWrite(pinLed->rssi_7, LOW);
        digitalWrite(pinLed->rssi_8, LOW);
    }
    else if (rssi > -90)
    {
        digitalWrite(pinLed->rssi_1, HIGH);
        digitalWrite(pinLed->rssi_2, HIGH);
        digitalWrite(pinLed->rssi_3, HIGH);
        digitalWrite(pinLed->rssi_4, LOW);
        digitalWrite(pinLed->rssi_5, LOW);
        digitalWrite(pinLed->rssi_6, LOW);
        digitalWrite(pinLed->rssi_7, LOW);
        digitalWrite(pinLed->rssi_8, LOW);
    }
    else if (rssi > -100) // Low signal strength
    {
        digitalWrite(pinLed->rssi_1, HIGH);
        digitalWrite(pinLed->rssi_2, HIGH);
        digitalWrite(pinLed->rssi_3, LOW);
        digitalWrite(pinLed->rssi_4, LOW);
        digitalWrite(pinLed->rssi_5, LOW);
        digitalWrite(pinLed->rssi_6, LOW);
        digitalWrite(pinLed->rssi_7, LOW);
        digitalWrite(pinLed->rssi_8, LOW);
    }
    else if (rssi > -110)
    {
        digitalWrite(pinLed->rssi_1, HIGH);
        digitalWrite(pinLed->rssi_2, LOW);
        digitalWrite(pinLed->rssi_3, LOW);
        digitalWrite(pinLed->rssi_4, LOW);
        digitalWrite(pinLed->rssi_5, LOW);
        digitalWrite(pinLed->rssi_6, LOW);
        digitalWrite(pinLed->rssi_7, LOW);
        digitalWrite(pinLed->rssi_8, LOW);
    }
    else if (rssi <= -110)
    {
        digitalWrite(pinLed->rssi_1, LOW);
        digitalWrite(pinLed->rssi_2, LOW);
        digitalWrite(pinLed->rssi_3, LOW);
        digitalWrite(pinLed->rssi_4, LOW);
        digitalWrite(pinLed->rssi_5, LOW);
        digitalWrite(pinLed->rssi_6, LOW);
        digitalWrite(pinLed->rssi_7, LOW);
        digitalWrite(pinLed->rssi_8, LOW);
    }
}

void displayUpdate(uint8_t address, dataStruct *dataVariables)
{
}

void buttonCheck(buttonStruct pinButton)
{
}

void controlBoxCheck(uint8_t pin1, uint8_t pin2)
{
}

void ledStruct::pinMode()
{
    ::pinMode(R, OUTPUT);
    digitalWrite(R, LOW);
    ::pinMode(G, OUTPUT);
    digitalWrite(G, LOW);
    ::pinMode(B, OUTPUT);
    digitalWrite(B, LOW);

    ::pinMode(D1, OUTPUT);
    ::digitalWrite(D1, LOW);
    ::pinMode(D2, OUTPUT);
    ::digitalWrite(D2, LOW);
    ::pinMode(D3, OUTPUT);
    ::digitalWrite(D3, LOW);

    ::pinMode(rssi_1, OUTPUT);
    ::digitalWrite(rssi_1, LOW);
    ::pinMode(rssi_2, OUTPUT);
    ::digitalWrite(rssi_2, LOW);
    ::pinMode(rssi_3, OUTPUT);
    ::digitalWrite(rssi_3, LOW);
    ::pinMode(rssi_4, OUTPUT);
    ::digitalWrite(rssi_4, LOW);
    ::pinMode(rssi_5, OUTPUT);
    ::digitalWrite(rssi_5, LOW);
    ::pinMode(rssi_6, OUTPUT);
    ::digitalWrite(rssi_6, LOW);
    ::pinMode(rssi_7, OUTPUT);
    ::digitalWrite(rssi_7, LOW);
    ::pinMode(rssi_8, OUTPUT);
    ::digitalWrite(rssi_8, LOW);
}

void buttonStruct::pinMode()
{
    ::pinMode(sw1, INPUT);
    ::digitalWrite(sw1, LOW);
    ::pinMode(sw2, INPUT);
    ::digitalWrite(sw2, LOW);
    ::pinMode(sw3, INPUT);
    ::digitalWrite(sw3, LOW);
    ::pinMode(sw4, INPUT);
    ::digitalWrite(sw4, LOW);
    ::pinMode(sw5, INPUT);
    ::digitalWrite(sw5, LOW);
    ::pinMode(sw6, INPUT);
    ::digitalWrite(sw6, LOW);
}