RX
Dependencies: mbed BufferedSerial SX1276GenericLib X_NUCLEO_IKS01A2
Diff: main.cpp
- Revision:
- 2:e7d7e80256cc
- Parent:
- 1:bd8b9ad01400
--- a/main.cpp Tue Jun 04 23:58:46 2019 +0000 +++ b/main.cpp Mon Jun 17 00:10:40 2019 +0000 @@ -1,13 +1,12 @@ /* Includes */ #include "mbed.h" /* Mbed include */ -#include "XNucleoIKS01A2.h" /* Sensors include*/ +/* Lora includes */ +#include "PinMap.h" +#include "sx1276-mbed-hal.h" -/* LoRa includes */ -#include "PinMap.h" -#include "sx1276-mbed-hal.h" - -/* LoRa definitions */ +/* Serial communication include */ +#include "BufferedSerial.h" /* Set this flag to '1' to display debug messages on the console */ #define DEBUG_MESSAGE 1 @@ -15,7 +14,7 @@ /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */ #define USE_MODEM_LORA 1 #define USE_MODEM_FSK !USE_MODEM_LORA -#define RF_FREQUENCY RF_FREQUENCY_915_0 // Hz +#define RF_FREQUENCY RF_FREQUENCY_915_0 // Hz #define TX_OUTPUT_POWER 14 // 14 dBm #if USE_MODEM_LORA == 1 @@ -34,206 +33,208 @@ #endif - -#define RX_TIMEOUT_VALUE 3500 // in ms +#define RX_TIMEOUT_VALUE 0 // In ms +#define TX_TIMEOUT_VALUE 1000000 // In ms //#define BUFFER_SIZE 32 // Define the payload size here -#define BUFFER_SIZE 64 // Define the payload size here - -/* Sensors instances */ - -/* Instantiate the expansion board */ -static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5); +#define BUFFER_SIZE 64 // Define the payload size here -/* Retrieve the composing elements of the expansion board */ -static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer; -static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor; -static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor; -static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro; -static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer; +typedef struct { + uint8_t header; // Header for identification of updated informations - 0 0 p temp LSM6DSL LSM303AGR + int time; // Time between transmissions + float p; // Pressure of LPS22HB + float temperatureLPS22HB; // Temperature from LPS22HB + int32_t ag[3]; // Acceleration of the accelerometer and gyroscope LSM6DSL + int32_t w[3]; // Angular velocity of LSM6DSL + int32_t a[3]; // Acceleration of the accelerometer LSM303AGR + int32_t m[3]; // Heading of LSM303AGR +}Pkg1; -//uint32_t dados[16]; //data vector +typedef struct { + uint8_t header; // Header for identification of updated informations - 0 1 InternalCommunication HTS221 + int time; // Time between transmissions + bool drogueStatus; // Drogue parachute status provided by Avionics + bool mainStatus; //Main parachute status provided by Avionics + bool mainStatusCOTS; // Main parachute status provided by COTS Altimeter + bool drogueStatusCOTS; // Drogue status provided by COTS Altimeter + float pressureBar; // Pressure by COTS Altimeter + float temperature; // Temperature by COTS Altimeter + int16_t timeStamp; // Timestamp from COTS Altimeter + int16_t aglAlt; // AGL Altitude from COTS Altimeter + int8_t battery; // Battery voltage reading from COTS Altimeter + float humidity; // Humidity of HTS221 + float temperatureHTS221; // Temperature from HTS221 + //uint8_t filler[25]; +}Pkg2; + typedef struct { - float p; //pressure - float temperatureHTS221; //temperature from HTS221 - float humidity; //humidity - float temperatureLPS22HB; //temperature from LPS22HB - int32_t w[3]; //angular velocity - int32_t a[3]; //acceleration of the accelerometer LSM303AGR - int32_t ag[3]; //acceleration of the accelerometer and gyroscope LSM6DSL - int32_t m [3]; //heading -}Dados; - -Dados dados; + uint8_t header; // Header for identification of updated informations - 1 0 GPS + int time; // Time between transmissions + unsigned long timeOfWeek; //GPS time of week + long timeOfWeekFracPart; // GPS time of week fractional part + unsigned char gpsFix; // GPS fix + long ecefx; // GPS X posiition + long ecefy; // GPS Y posistion + long ecefz; // GPS Z postion + unsigned long positionAcc3D; // GPS 3D position accuracy + long ecefvx; // GPS X velocity + long ecefvy; // GPS Y velocity + long ecefvz; // GPS Z velocity + unsigned long speedAcc; // GPS speed accuracy + unsigned char numbSat; // GPS number of satellites conected + //uint8_t filler[8]; +}Pkg3; + + +union Data { + Pkg1 pkg1; + Pkg2 pkg2; + Pkg3 pkg3; +}; + +Data data; /* LoRa modem instances and configurations */ static RadioEvents_t RadioEvents; // Calback functions struct -SX1276Generic *Radio; //Defenition of a Radio object +SX1276Generic *Radio; // Definition of a Radio object -/*Configuration function*/ +bool received = false; // Flag to indicate the end of reception + +/* Configuration function */ void SystemClock_Config(void); - bool transmited = true; +/* Callback functions prototypes */ -/* Callback functions prototypes */ +// Brief Function to be executed on Radio Tx Done event void OnTxDone(void *radio, void *userThisPtr, void *userData); +// Brief Function to be executed on Radio Rx Done event void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); +// Brief Function executed on Radio Tx Timeout event void OnTxTimeout(void *radio, void *userThisPtr, void *userData); +// Brief Function executed on Radio Rx Timeout event void OnRxTimeout(void *radio, void *userThisPtr, void *userData); +// Brief Function executed on Radio Rx Error event void OnRxError(void *radio, void *userThisPtr, void *userData); +// Brief Function executed on Radio Fhss Change Channel event void OnFhssChangeChannel(void *radio, void *userThisPtr, void *userData, uint8_t channelIndex); +// Brief Function executed on CAD Done event void OnCadDone(void *radio, void *userThisPtr, void *userData); /* Serial communication to debug program */ - -Serial pc(USBTX,USBRX); +BufferedSerial *ser; int main() { - /* General Header*/ - - pc.printf("Telemetry Tx inicial version program\r\n\r\n"); - - uint8_t id; //Sensor id parameter for debug purpose - - /* Enable all sensors */ - hum_temp->enable(); - press_temp->enable(); - magnetometer->enable(); - accelerometer->enable(); - acc_gyro->enable_x(); - acc_gyro->enable_g(); - - pc.printf("\r\n--- Starting the sensors ---\r\n"); + SystemClock_Config(); /* Synchronize clock for TX and RX boards */ - hum_temp->read_id(&id); - pc.printf("HTS221 humidity & temperature = 0x%X\r\n", id); - press_temp->read_id(&id); - pc.printf("LPS22HB pressure & temperature = 0x%X\r\n", id); - magnetometer->read_id(&id); - pc.printf("LSM303AGR magnetometer = 0x%X\r\n", id); - accelerometer->read_id(&id); - pc.printf("LSM303AGR accelerometer = 0x%X\r\n", id); - acc_gyro->read_id(&id); - pc.printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id); + /* Serial configuration */ + if (DEBUG_MESSAGE) { + ser = new BufferedSerial(USBTX, USBRX); + ser->baud(115200); + ser->format(8); + } - pc.printf("\r\n"); - - /* Radio setup */ - pc.printf("\r\n--- Starting the modem LoRa ---\r\n"); + /* General Header*/ + if (DEBUG_MESSAGE) + ser->printf("Telemetry Rx inicial version program\r\n\r\n"); Radio = new SX1276Generic(NULL, MURATA_SX1276, LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO); - pc.printf("SX1276 Simple transmission aplication\r\n" ); - pc.printf("Frequency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0); - pc.printf("TXPower: %d dBm\r\n", TX_OUTPUT_POWER); - pc.printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH); - pc.printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR); + + if (DEBUG_MESSAGE) { + ser->printf("SX1276 Simple receiver aplication\r\n" ); + ser->printf("Frequency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0); + ser->printf("TXPower: %d dBm\r\n", TX_OUTPUT_POWER); + ser->printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH); + ser->printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR); + } // Initialize Radio driver RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; RadioEvents.RxError = OnRxError; RadioEvents.TxTimeout = OnTxTimeout; - RadioEvents.RxTimeout = OnRxTimeout; + RadioEvents.RxTimeout = OnRxTimeout; + + // Initializes the radio while (Radio->Init( &RadioEvents ) == false) { - pc.printf("Radio could not be detected!\r\n"); + if (DEBUG_MESSAGE) + ser->printf("Radio could not be detected!\r\n"); wait( 1 ); } + // Display the board type switch(Radio->DetectBoardType()) { case SX1276MB1LAS: if (DEBUG_MESSAGE) - pc.printf(" > Board Type: SX1276MB1LAS <\r\n"); + ser->printf(" > Board Type: SX1276MB1LAS <\r\n"); break; case SX1276MB1MAS: if (DEBUG_MESSAGE) - pc.printf(" > Board Type: SX1276MB1LAS <\r\n"); + ser->printf(" > Board Type: SX1276MB1LAS <\r\n"); case MURATA_SX1276: if (DEBUG_MESSAGE) - pc.printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n"); + ser->printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n"); break; case RFM95_SX1276: - if (DEBUG_MESSAGE) - pc.printf(" > HopeRF RFM95xx <\r\n"); + if (DEBUG_MESSAGE) + ser->printf(" > HopeRF RFM95xx <\r\n"); break; default: - pc.printf(" > Board Type: unknown <\r\n"); + if (DEBUG_MESSAGE) + ser->printf(" > Board Type: unknown <\r\n"); } - Radio->SetChannel(RF_FREQUENCY ); + Radio->SetChannel(RF_FREQUENCY ); // Sets the frequency of the communication - if (LORA_FHSS_ENABLED) - pc.printf(" > LORA FHSS Mode <\r\n"); - if (!LORA_FHSS_ENABLED) - pc.printf(" > LORA Mode <\r\n"); - - pc.printf("\r\n"); - + // Debug message of the state of fhss + if (LORA_FHSS_ENABLED) { + if (DEBUG_MESSAGE) + ser->printf(" > LORA FHSS Mode <\r\n"); + } + if (!LORA_FHSS_ENABLED) { + if (DEBUG_MESSAGE) + ser->printf(" > LORA Mode <\r\n"); + } + // Sets the configuration of the transmission Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, LORA_IQ_INVERSION_ON, 2000 ); + // Sets the configuration of the reception Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, LORA_IQ_INVERSION_ON, true ); - - Radio->Tx(1000000); - - while(1) { - - - press_temp->get_pressure(&dados.p); //get the pressure - press_temp->get_temperature(&dados.temperatureLPS22HB); //get temperature from LPS22HB - accelerometer->get_x_axes(dados.a);//get the acceleration - acc_gyro->get_x_axes(dados.ag);//get the acceleration - acc_gyro->get_g_axes(dados.w);//get the angular velocity - magnetometer->get_m_axes(dados.m); //get the magnetometer heading - hum_temp->get_temperature(&dados.temperatureHTS221); //get temperature from HTS221 - hum_temp->get_humidity(&dados.humidity); //get humidity - - - //sensors data + if (DEBUG_MESSAGE) + ser->printf("Starting Receive loop\r\n"); - /*dados[0] = a[0]; - dados[1] = a[1]; - dados[2] = a[2]; - dados[3] = ag[0]; - dados[4] = ag[1]; - dados[5] = ag[2]; - dados[6] = w[0]; - dados[7] = w[1]; - dados[8] = w[2]; - dados[9] = m[0]; - dados[10] = m[1]; - dados[11] = m[2]; - dados[12] = humidity; - dados[13] = temperatureHTS221; - dados[14] = temperatureLPS22HB; - dados[15] = p;*/ - - - if (transmited==true) { - transmited = false; - wait_ms(10); - Radio->Send( &dados, sizeof(dados) ); + Radio->Rx(RX_TIMEOUT_VALUE); // Puts the device in reception mode continuously + + while( 1 ) + { + //After the receiving, puts the device again in receive mode + if (received == true) { + received = false; + Radio->Rx(RX_TIMEOUT_VALUE); } } + } + void SystemClock_Config(void) { #ifdef B_L072Z_LRWAN1_LORA @@ -278,44 +279,62 @@ #endif } -/* Helper function for printing floats & doubles */ - - void OnTxDone(void *radio, void *userThisPtr, void *userData) -{ +{ Radio->Sleep( ); - transmited = true; - if (DEBUG_MESSAGE) { - pc.printf("> OnTxDone\r\n"); - pc.printf("I transmited %d mg, %d mg, %d mg, %d mg, %d mg, %d mg, %d mdps, %d mdps, %d mdps\r\n", dados.a[0], dados.a[1], dados.a[2], dados.ag[0], dados.ag[1], dados.ag[2], dados.w[0], dados.w[1], dados.w[2]); - pc.printf("and %d mG, %d mG, %d mG, %g %%, %g C, %g C, %g mBar\r\n", dados.m[0], dados.m[1], dados.m[2], dados.humidity, dados.temperatureHTS221, dados.temperatureLPS22HB, dados.p); - } + if (DEBUG_MESSAGE) + ser->printf("> OnTxDone\r\n"); } void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) { Radio->Sleep( ); - if (DEBUG_MESSAGE) - pc.printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d\r\n", rssi, snr); + received = true; + uint8_t state = payload[0] >> 6; + + //ser->printf("The state is %x\r\n", state); + ser->printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d, State=%d\r\n", rssi, snr, state); + //for(int i = 0; i < BUFFER_SIZE; i++){ + // ser->printf("%x ", payload[i]); + //} + ser->printf("\r\n"); + if(state == 3){ + memcpy(&data.pkg1, payload, BUFFER_SIZE); + //ser->printf("Header: %x, time: %d, p: %f, tempLPS22HB: %f, ag: %d; %d; %d, w: %d; %d; %d, a: %d; %d; %d, m: %d; %d; %d\r\n", pkg1.header, pkg1.time, pkg1.p, pkg1.temperatureLPS22HB, pkg1.ag[0], pkg1.ag[1], pkg1.ag[2], pkg1.w[0], pkg1.w[1], pkg1.w[2], pkg1.a[0], pkg1.a[1], pkg1.a[2], pkg1.m[0], pkg1.m[1], pkg1.m[2]); + ser->printf("%x,%d,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n", data.pkg1.header, data.pkg1.time, data.pkg1.p, data.pkg1.temperatureLPS22HB, data.pkg1.ag[0], data.pkg1.ag[1], data.pkg1.ag[2], data.pkg1.w[0], data.pkg1.w[1], data.pkg1.w[2], data.pkg1.a[0], data.pkg1.a[1], data.pkg1.a[2], data.pkg1.m[0], data.pkg1.m[1], data.pkg1.m[2]); + } + else if(state == 1){ + memcpy(&data.pkg2, payload, BUFFER_SIZE); + //ser->printf("Header: %x, time: %d, parachuteStatus: %d%d%d%d, pressureBar: %f, temperature: %f, timeStamp: %d, aglAlt: %d, battery: %d, humidity: %f, tempHTS221: %f\r\n", pkg2.header, pkg2.time, pkg2.drogueStatus, pkg2.mainStatus, pkg2.mainStatusCOTS, pkg2.drogueStatusCOTS, pkg2.pressureBar, pkg2.temperature, pkg2.timeStamp, pkg2.aglAlt, pkg2.battery, pkg2.humidity, pkg2.temperatureHTS221); + ser->printf("%x,%d,%d%d%d%d,%f,%f,%d,%d,%d,%f,%f\r\n", data.pkg2.header, data.pkg2.time, data.pkg2.drogueStatus, data.pkg2.mainStatus, data.pkg2.mainStatusCOTS, data.pkg2.drogueStatusCOTS, data.pkg2.pressureBar, data.pkg2.temperature, data.pkg2.timeStamp, data.pkg2.aglAlt, data.pkg2.battery, data.pkg2.humidity, data.pkg2.temperatureHTS221); + } + else if(state == 2){ + memcpy(&data.pkg3, payload, BUFFER_SIZE); + //ser->printf("Header: %x, time: %d, timeOfWeek: %d, frac: %d, gpsFix: %d\r\n", pkg3.header, pkg3.time, pkg3.timeOfWeek, pkg3.timeOfWeekFracPart, pkg3.gpsFix); + //ser->printf("eceFx: %d, eceFy: %d, eceFz: %d, posAcc3D: %d, eceFvx: %d, eceFvy: %d, eceFvz: %d\r\n", pkg3.ecefx, pkg3.ecefy, pkg3.ecefz, pkg3.positionAcc3D, pkg3.ecefvx, pkg3.ecefvy, pkg3.ecefvz); + //ser->printf("speedAcc: %d, numbSat: %d\r\n", pkg3.speedAcc, pkg3.numbSat); + ser->printf("%x,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n", data.pkg3.header, data.pkg3.time, data.pkg3.timeOfWeek, data.pkg3.timeOfWeekFracPart, data.pkg3.gpsFix, data.pkg3.ecefx, data.pkg3.ecefy, data.pkg3.ecefz, data.pkg3.positionAcc3D, data.pkg3.ecefvx, data.pkg3.ecefvy, data.pkg3.ecefvz, data.pkg3.speedAcc, data.pkg3.numbSat); + } } void OnTxTimeout(void *radio, void *userThisPtr, void *userData) { Radio->Sleep( ); if(DEBUG_MESSAGE) - pc.printf("> OnTxTimeout\r\n"); + ser->printf("> OnTxTimeout\r\n"); } void OnRxTimeout(void *radio, void *userThisPtr, void *userData) { Radio->Sleep( ); if (DEBUG_MESSAGE) - pc.printf("> OnRxTimeout\r\n"); + ser->printf("> OnRxTimeout\r\n"); } void OnRxError(void *radio, void *userThisPtr, void *userData) { Radio->Sleep( ); + received = true; if (DEBUG_MESSAGE) - pc.printf("> OnRxError\r\n"); + ser->printf("> OnRxError\r\n"); }