![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
RX
Dependencies: mbed BufferedSerial SX1276GenericLib X_NUCLEO_IKS01A2
main.cpp@2:e7d7e80256cc, 2019-06-17 (annotated)
- Committer:
- LucasKB
- Date:
- Mon Jun 17 00:10:40 2019 +0000
- Revision:
- 2:e7d7e80256cc
- Parent:
- 1:bd8b9ad01400
RX;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TMRL123 | 0:a73914f20498 | 1 | /* Includes */ |
TMRL123 | 0:a73914f20498 | 2 | #include "mbed.h" /* Mbed include */ |
TMRL123 | 0:a73914f20498 | 3 | |
LucasKB | 2:e7d7e80256cc | 4 | /* Lora includes */ |
LucasKB | 2:e7d7e80256cc | 5 | #include "PinMap.h" |
LucasKB | 2:e7d7e80256cc | 6 | #include "sx1276-mbed-hal.h" |
TMRL123 | 0:a73914f20498 | 7 | |
LucasKB | 2:e7d7e80256cc | 8 | /* Serial communication include */ |
LucasKB | 2:e7d7e80256cc | 9 | #include "BufferedSerial.h" |
TMRL123 | 0:a73914f20498 | 10 | |
TMRL123 | 0:a73914f20498 | 11 | /* Set this flag to '1' to display debug messages on the console */ |
TMRL123 | 0:a73914f20498 | 12 | #define DEBUG_MESSAGE 1 |
TMRL123 | 0:a73914f20498 | 13 | |
TMRL123 | 0:a73914f20498 | 14 | /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */ |
TMRL123 | 0:a73914f20498 | 15 | #define USE_MODEM_LORA 1 |
TMRL123 | 0:a73914f20498 | 16 | #define USE_MODEM_FSK !USE_MODEM_LORA |
LucasKB | 2:e7d7e80256cc | 17 | #define RF_FREQUENCY RF_FREQUENCY_915_0 // Hz |
TMRL123 | 0:a73914f20498 | 18 | #define TX_OUTPUT_POWER 14 // 14 dBm |
TMRL123 | 0:a73914f20498 | 19 | |
TMRL123 | 0:a73914f20498 | 20 | #if USE_MODEM_LORA == 1 |
TMRL123 | 0:a73914f20498 | 21 | |
TMRL123 | 0:a73914f20498 | 22 | #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap |
TMRL123 | 0:a73914f20498 | 23 | #define LORA_SPREADING_FACTOR LORA_SF7 |
TMRL123 | 0:a73914f20498 | 24 | #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5 |
TMRL123 | 0:a73914f20498 | 25 | |
TMRL123 | 0:a73914f20498 | 26 | #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx |
TMRL123 | 0:a73914f20498 | 27 | #define LORA_SYMBOL_TIMEOUT 5 // Symbols |
TMRL123 | 0:a73914f20498 | 28 | #define LORA_FIX_LENGTH_PAYLOAD_ON false |
TMRL123 | 0:a73914f20498 | 29 | #define LORA_FHSS_ENABLED false |
TMRL123 | 0:a73914f20498 | 30 | #define LORA_NB_SYMB_HOP 4 |
TMRL123 | 0:a73914f20498 | 31 | #define LORA_IQ_INVERSION_ON false |
TMRL123 | 0:a73914f20498 | 32 | #define LORA_CRC_ENABLED true |
TMRL123 | 0:a73914f20498 | 33 | |
TMRL123 | 0:a73914f20498 | 34 | #endif |
TMRL123 | 0:a73914f20498 | 35 | |
LucasKB | 2:e7d7e80256cc | 36 | #define RX_TIMEOUT_VALUE 0 // In ms |
LucasKB | 2:e7d7e80256cc | 37 | #define TX_TIMEOUT_VALUE 1000000 // In ms |
TMRL123 | 0:a73914f20498 | 38 | |
TMRL123 | 0:a73914f20498 | 39 | //#define BUFFER_SIZE 32 // Define the payload size here |
LucasKB | 2:e7d7e80256cc | 40 | #define BUFFER_SIZE 64 // Define the payload size here |
TMRL123 | 0:a73914f20498 | 41 | |
LucasKB | 2:e7d7e80256cc | 42 | typedef struct { |
LucasKB | 2:e7d7e80256cc | 43 | uint8_t header; // Header for identification of updated informations - 0 0 p temp LSM6DSL LSM303AGR |
LucasKB | 2:e7d7e80256cc | 44 | int time; // Time between transmissions |
LucasKB | 2:e7d7e80256cc | 45 | float p; // Pressure of LPS22HB |
LucasKB | 2:e7d7e80256cc | 46 | float temperatureLPS22HB; // Temperature from LPS22HB |
LucasKB | 2:e7d7e80256cc | 47 | int32_t ag[3]; // Acceleration of the accelerometer and gyroscope LSM6DSL |
LucasKB | 2:e7d7e80256cc | 48 | int32_t w[3]; // Angular velocity of LSM6DSL |
LucasKB | 2:e7d7e80256cc | 49 | int32_t a[3]; // Acceleration of the accelerometer LSM303AGR |
LucasKB | 2:e7d7e80256cc | 50 | int32_t m[3]; // Heading of LSM303AGR |
LucasKB | 2:e7d7e80256cc | 51 | }Pkg1; |
TMRL123 | 0:a73914f20498 | 52 | |
LucasKB | 2:e7d7e80256cc | 53 | typedef struct { |
LucasKB | 2:e7d7e80256cc | 54 | uint8_t header; // Header for identification of updated informations - 0 1 InternalCommunication HTS221 |
LucasKB | 2:e7d7e80256cc | 55 | int time; // Time between transmissions |
LucasKB | 2:e7d7e80256cc | 56 | bool drogueStatus; // Drogue parachute status provided by Avionics |
LucasKB | 2:e7d7e80256cc | 57 | bool mainStatus; //Main parachute status provided by Avionics |
LucasKB | 2:e7d7e80256cc | 58 | bool mainStatusCOTS; // Main parachute status provided by COTS Altimeter |
LucasKB | 2:e7d7e80256cc | 59 | bool drogueStatusCOTS; // Drogue status provided by COTS Altimeter |
LucasKB | 2:e7d7e80256cc | 60 | float pressureBar; // Pressure by COTS Altimeter |
LucasKB | 2:e7d7e80256cc | 61 | float temperature; // Temperature by COTS Altimeter |
LucasKB | 2:e7d7e80256cc | 62 | int16_t timeStamp; // Timestamp from COTS Altimeter |
LucasKB | 2:e7d7e80256cc | 63 | int16_t aglAlt; // AGL Altitude from COTS Altimeter |
LucasKB | 2:e7d7e80256cc | 64 | int8_t battery; // Battery voltage reading from COTS Altimeter |
LucasKB | 2:e7d7e80256cc | 65 | float humidity; // Humidity of HTS221 |
LucasKB | 2:e7d7e80256cc | 66 | float temperatureHTS221; // Temperature from HTS221 |
LucasKB | 2:e7d7e80256cc | 67 | //uint8_t filler[25]; |
LucasKB | 2:e7d7e80256cc | 68 | }Pkg2; |
LucasKB | 2:e7d7e80256cc | 69 | |
LucasKB | 1:bd8b9ad01400 | 70 | typedef struct { |
LucasKB | 2:e7d7e80256cc | 71 | uint8_t header; // Header for identification of updated informations - 1 0 GPS |
LucasKB | 2:e7d7e80256cc | 72 | int time; // Time between transmissions |
LucasKB | 2:e7d7e80256cc | 73 | unsigned long timeOfWeek; //GPS time of week |
LucasKB | 2:e7d7e80256cc | 74 | long timeOfWeekFracPart; // GPS time of week fractional part |
LucasKB | 2:e7d7e80256cc | 75 | unsigned char gpsFix; // GPS fix |
LucasKB | 2:e7d7e80256cc | 76 | long ecefx; // GPS X posiition |
LucasKB | 2:e7d7e80256cc | 77 | long ecefy; // GPS Y posistion |
LucasKB | 2:e7d7e80256cc | 78 | long ecefz; // GPS Z postion |
LucasKB | 2:e7d7e80256cc | 79 | unsigned long positionAcc3D; // GPS 3D position accuracy |
LucasKB | 2:e7d7e80256cc | 80 | long ecefvx; // GPS X velocity |
LucasKB | 2:e7d7e80256cc | 81 | long ecefvy; // GPS Y velocity |
LucasKB | 2:e7d7e80256cc | 82 | long ecefvz; // GPS Z velocity |
LucasKB | 2:e7d7e80256cc | 83 | unsigned long speedAcc; // GPS speed accuracy |
LucasKB | 2:e7d7e80256cc | 84 | unsigned char numbSat; // GPS number of satellites conected |
LucasKB | 2:e7d7e80256cc | 85 | //uint8_t filler[8]; |
LucasKB | 2:e7d7e80256cc | 86 | }Pkg3; |
LucasKB | 2:e7d7e80256cc | 87 | |
LucasKB | 2:e7d7e80256cc | 88 | |
LucasKB | 2:e7d7e80256cc | 89 | union Data { |
LucasKB | 2:e7d7e80256cc | 90 | Pkg1 pkg1; |
LucasKB | 2:e7d7e80256cc | 91 | Pkg2 pkg2; |
LucasKB | 2:e7d7e80256cc | 92 | Pkg3 pkg3; |
LucasKB | 2:e7d7e80256cc | 93 | }; |
LucasKB | 2:e7d7e80256cc | 94 | |
LucasKB | 2:e7d7e80256cc | 95 | Data data; |
TMRL123 | 0:a73914f20498 | 96 | |
TMRL123 | 0:a73914f20498 | 97 | /* LoRa modem instances and configurations */ |
TMRL123 | 0:a73914f20498 | 98 | |
TMRL123 | 0:a73914f20498 | 99 | static RadioEvents_t RadioEvents; // Calback functions struct |
TMRL123 | 0:a73914f20498 | 100 | |
LucasKB | 2:e7d7e80256cc | 101 | SX1276Generic *Radio; // Definition of a Radio object |
TMRL123 | 0:a73914f20498 | 102 | |
LucasKB | 2:e7d7e80256cc | 103 | bool received = false; // Flag to indicate the end of reception |
LucasKB | 2:e7d7e80256cc | 104 | |
LucasKB | 2:e7d7e80256cc | 105 | /* Configuration function */ |
TMRL123 | 0:a73914f20498 | 106 | void SystemClock_Config(void); |
TMRL123 | 0:a73914f20498 | 107 | |
LucasKB | 2:e7d7e80256cc | 108 | /* Callback functions prototypes */ |
TMRL123 | 0:a73914f20498 | 109 | |
LucasKB | 2:e7d7e80256cc | 110 | // Brief Function to be executed on Radio Tx Done event |
TMRL123 | 0:a73914f20498 | 111 | void OnTxDone(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:a73914f20498 | 112 | |
LucasKB | 2:e7d7e80256cc | 113 | // Brief Function to be executed on Radio Rx Done event |
TMRL123 | 0:a73914f20498 | 114 | void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); |
TMRL123 | 0:a73914f20498 | 115 | |
LucasKB | 2:e7d7e80256cc | 116 | // Brief Function executed on Radio Tx Timeout event |
TMRL123 | 0:a73914f20498 | 117 | void OnTxTimeout(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:a73914f20498 | 118 | |
LucasKB | 2:e7d7e80256cc | 119 | // Brief Function executed on Radio Rx Timeout event |
TMRL123 | 0:a73914f20498 | 120 | void OnRxTimeout(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:a73914f20498 | 121 | |
LucasKB | 2:e7d7e80256cc | 122 | // Brief Function executed on Radio Rx Error event |
TMRL123 | 0:a73914f20498 | 123 | void OnRxError(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:a73914f20498 | 124 | |
LucasKB | 2:e7d7e80256cc | 125 | // Brief Function executed on Radio Fhss Change Channel event |
TMRL123 | 0:a73914f20498 | 126 | void OnFhssChangeChannel(void *radio, void *userThisPtr, void *userData, uint8_t channelIndex); |
TMRL123 | 0:a73914f20498 | 127 | |
LucasKB | 2:e7d7e80256cc | 128 | // Brief Function executed on CAD Done event |
TMRL123 | 0:a73914f20498 | 129 | void OnCadDone(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:a73914f20498 | 130 | |
TMRL123 | 0:a73914f20498 | 131 | /* Serial communication to debug program */ |
LucasKB | 2:e7d7e80256cc | 132 | BufferedSerial *ser; |
TMRL123 | 0:a73914f20498 | 133 | |
TMRL123 | 0:a73914f20498 | 134 | int main() { |
LucasKB | 2:e7d7e80256cc | 135 | SystemClock_Config(); /* Synchronize clock for TX and RX boards */ |
TMRL123 | 0:a73914f20498 | 136 | |
LucasKB | 2:e7d7e80256cc | 137 | /* Serial configuration */ |
LucasKB | 2:e7d7e80256cc | 138 | if (DEBUG_MESSAGE) { |
LucasKB | 2:e7d7e80256cc | 139 | ser = new BufferedSerial(USBTX, USBRX); |
LucasKB | 2:e7d7e80256cc | 140 | ser->baud(115200); |
LucasKB | 2:e7d7e80256cc | 141 | ser->format(8); |
LucasKB | 2:e7d7e80256cc | 142 | } |
TMRL123 | 0:a73914f20498 | 143 | |
LucasKB | 2:e7d7e80256cc | 144 | /* General Header*/ |
LucasKB | 2:e7d7e80256cc | 145 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 146 | ser->printf("Telemetry Rx inicial version program\r\n\r\n"); |
TMRL123 | 0:a73914f20498 | 147 | |
TMRL123 | 0:a73914f20498 | 148 | Radio = new SX1276Generic(NULL, MURATA_SX1276, |
TMRL123 | 0:a73914f20498 | 149 | LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, |
TMRL123 | 0:a73914f20498 | 150 | LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, |
TMRL123 | 0:a73914f20498 | 151 | LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO); |
LucasKB | 2:e7d7e80256cc | 152 | |
LucasKB | 2:e7d7e80256cc | 153 | if (DEBUG_MESSAGE) { |
LucasKB | 2:e7d7e80256cc | 154 | ser->printf("SX1276 Simple receiver aplication\r\n" ); |
LucasKB | 2:e7d7e80256cc | 155 | ser->printf("Frequency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0); |
LucasKB | 2:e7d7e80256cc | 156 | ser->printf("TXPower: %d dBm\r\n", TX_OUTPUT_POWER); |
LucasKB | 2:e7d7e80256cc | 157 | ser->printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH); |
LucasKB | 2:e7d7e80256cc | 158 | ser->printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR); |
LucasKB | 2:e7d7e80256cc | 159 | } |
TMRL123 | 0:a73914f20498 | 160 | |
TMRL123 | 0:a73914f20498 | 161 | // Initialize Radio driver |
TMRL123 | 0:a73914f20498 | 162 | RadioEvents.TxDone = OnTxDone; |
TMRL123 | 0:a73914f20498 | 163 | RadioEvents.RxDone = OnRxDone; |
TMRL123 | 0:a73914f20498 | 164 | RadioEvents.RxError = OnRxError; |
TMRL123 | 0:a73914f20498 | 165 | RadioEvents.TxTimeout = OnTxTimeout; |
LucasKB | 2:e7d7e80256cc | 166 | RadioEvents.RxTimeout = OnRxTimeout; |
LucasKB | 2:e7d7e80256cc | 167 | |
LucasKB | 2:e7d7e80256cc | 168 | // Initializes the radio |
TMRL123 | 0:a73914f20498 | 169 | while (Radio->Init( &RadioEvents ) == false) { |
LucasKB | 2:e7d7e80256cc | 170 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 171 | ser->printf("Radio could not be detected!\r\n"); |
TMRL123 | 0:a73914f20498 | 172 | wait( 1 ); |
TMRL123 | 0:a73914f20498 | 173 | } |
TMRL123 | 0:a73914f20498 | 174 | |
LucasKB | 2:e7d7e80256cc | 175 | // Display the board type |
TMRL123 | 0:a73914f20498 | 176 | switch(Radio->DetectBoardType()) { |
TMRL123 | 0:a73914f20498 | 177 | case SX1276MB1LAS: |
TMRL123 | 0:a73914f20498 | 178 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 179 | ser->printf(" > Board Type: SX1276MB1LAS <\r\n"); |
TMRL123 | 0:a73914f20498 | 180 | break; |
TMRL123 | 0:a73914f20498 | 181 | case SX1276MB1MAS: |
TMRL123 | 0:a73914f20498 | 182 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 183 | ser->printf(" > Board Type: SX1276MB1LAS <\r\n"); |
TMRL123 | 0:a73914f20498 | 184 | case MURATA_SX1276: |
TMRL123 | 0:a73914f20498 | 185 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 186 | ser->printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n"); |
TMRL123 | 0:a73914f20498 | 187 | break; |
TMRL123 | 0:a73914f20498 | 188 | case RFM95_SX1276: |
LucasKB | 2:e7d7e80256cc | 189 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 190 | ser->printf(" > HopeRF RFM95xx <\r\n"); |
TMRL123 | 0:a73914f20498 | 191 | break; |
TMRL123 | 0:a73914f20498 | 192 | default: |
LucasKB | 2:e7d7e80256cc | 193 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 194 | ser->printf(" > Board Type: unknown <\r\n"); |
TMRL123 | 0:a73914f20498 | 195 | } |
TMRL123 | 0:a73914f20498 | 196 | |
LucasKB | 2:e7d7e80256cc | 197 | Radio->SetChannel(RF_FREQUENCY ); // Sets the frequency of the communication |
TMRL123 | 0:a73914f20498 | 198 | |
LucasKB | 2:e7d7e80256cc | 199 | // Debug message of the state of fhss |
LucasKB | 2:e7d7e80256cc | 200 | if (LORA_FHSS_ENABLED) { |
LucasKB | 2:e7d7e80256cc | 201 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 202 | ser->printf(" > LORA FHSS Mode <\r\n"); |
LucasKB | 2:e7d7e80256cc | 203 | } |
LucasKB | 2:e7d7e80256cc | 204 | if (!LORA_FHSS_ENABLED) { |
LucasKB | 2:e7d7e80256cc | 205 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 206 | ser->printf(" > LORA Mode <\r\n"); |
LucasKB | 2:e7d7e80256cc | 207 | } |
LucasKB | 2:e7d7e80256cc | 208 | // Sets the configuration of the transmission |
TMRL123 | 0:a73914f20498 | 209 | Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, |
TMRL123 | 0:a73914f20498 | 210 | LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
TMRL123 | 0:a73914f20498 | 211 | LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
TMRL123 | 0:a73914f20498 | 212 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
TMRL123 | 0:a73914f20498 | 213 | LORA_IQ_INVERSION_ON, 2000 ); |
TMRL123 | 0:a73914f20498 | 214 | |
LucasKB | 2:e7d7e80256cc | 215 | // Sets the configuration of the reception |
TMRL123 | 0:a73914f20498 | 216 | Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, |
TMRL123 | 0:a73914f20498 | 217 | LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, |
TMRL123 | 0:a73914f20498 | 218 | LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, |
TMRL123 | 0:a73914f20498 | 219 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
TMRL123 | 0:a73914f20498 | 220 | LORA_IQ_INVERSION_ON, true ); |
LucasKB | 2:e7d7e80256cc | 221 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 222 | ser->printf("Starting Receive loop\r\n"); |
TMRL123 | 0:a73914f20498 | 223 | |
LucasKB | 2:e7d7e80256cc | 224 | Radio->Rx(RX_TIMEOUT_VALUE); // Puts the device in reception mode continuously |
LucasKB | 2:e7d7e80256cc | 225 | |
LucasKB | 2:e7d7e80256cc | 226 | while( 1 ) |
LucasKB | 2:e7d7e80256cc | 227 | { |
LucasKB | 2:e7d7e80256cc | 228 | //After the receiving, puts the device again in receive mode |
LucasKB | 2:e7d7e80256cc | 229 | if (received == true) { |
LucasKB | 2:e7d7e80256cc | 230 | received = false; |
LucasKB | 2:e7d7e80256cc | 231 | Radio->Rx(RX_TIMEOUT_VALUE); |
TMRL123 | 0:a73914f20498 | 232 | } |
TMRL123 | 0:a73914f20498 | 233 | } |
LucasKB | 2:e7d7e80256cc | 234 | |
TMRL123 | 0:a73914f20498 | 235 | } |
TMRL123 | 0:a73914f20498 | 236 | |
LucasKB | 2:e7d7e80256cc | 237 | |
TMRL123 | 0:a73914f20498 | 238 | void SystemClock_Config(void) |
TMRL123 | 0:a73914f20498 | 239 | { |
TMRL123 | 0:a73914f20498 | 240 | #ifdef B_L072Z_LRWAN1_LORA |
TMRL123 | 0:a73914f20498 | 241 | /* |
TMRL123 | 0:a73914f20498 | 242 | * The L072Z_LRWAN1_LORA clock setup is somewhat differnt from the Nucleo board. |
TMRL123 | 0:a73914f20498 | 243 | * It has no LSE. |
TMRL123 | 0:a73914f20498 | 244 | */ |
TMRL123 | 0:a73914f20498 | 245 | RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; |
TMRL123 | 0:a73914f20498 | 246 | RCC_OscInitTypeDef RCC_OscInitStruct = {0}; |
TMRL123 | 0:a73914f20498 | 247 | |
TMRL123 | 0:a73914f20498 | 248 | /* Enable HSE Oscillator and Activate PLL with HSE as source */ |
TMRL123 | 0:a73914f20498 | 249 | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; |
TMRL123 | 0:a73914f20498 | 250 | RCC_OscInitStruct.HSEState = RCC_HSE_OFF; |
TMRL123 | 0:a73914f20498 | 251 | RCC_OscInitStruct.HSIState = RCC_HSI_ON; |
TMRL123 | 0:a73914f20498 | 252 | RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; |
TMRL123 | 0:a73914f20498 | 253 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
TMRL123 | 0:a73914f20498 | 254 | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; |
TMRL123 | 0:a73914f20498 | 255 | RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6; |
TMRL123 | 0:a73914f20498 | 256 | RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3; |
TMRL123 | 0:a73914f20498 | 257 | |
TMRL123 | 0:a73914f20498 | 258 | if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { |
TMRL123 | 0:a73914f20498 | 259 | // Error_Handler(); |
TMRL123 | 0:a73914f20498 | 260 | } |
TMRL123 | 0:a73914f20498 | 261 | |
TMRL123 | 0:a73914f20498 | 262 | /* Set Voltage scale1 as MCU will run at 32MHz */ |
TMRL123 | 0:a73914f20498 | 263 | __HAL_RCC_PWR_CLK_ENABLE(); |
TMRL123 | 0:a73914f20498 | 264 | __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); |
TMRL123 | 0:a73914f20498 | 265 | |
TMRL123 | 0:a73914f20498 | 266 | /* Poll VOSF bit of in PWR_CSR. Wait until it is reset to 0 */ |
TMRL123 | 0:a73914f20498 | 267 | while (__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) != RESET) {}; |
TMRL123 | 0:a73914f20498 | 268 | |
TMRL123 | 0:a73914f20498 | 269 | /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 |
TMRL123 | 0:a73914f20498 | 270 | clocks dividers */ |
TMRL123 | 0:a73914f20498 | 271 | RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); |
TMRL123 | 0:a73914f20498 | 272 | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; |
TMRL123 | 0:a73914f20498 | 273 | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
TMRL123 | 0:a73914f20498 | 274 | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; |
TMRL123 | 0:a73914f20498 | 275 | RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; |
TMRL123 | 0:a73914f20498 | 276 | if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { |
TMRL123 | 0:a73914f20498 | 277 | // Error_Handler(); |
TMRL123 | 0:a73914f20498 | 278 | } |
TMRL123 | 0:a73914f20498 | 279 | #endif |
TMRL123 | 0:a73914f20498 | 280 | } |
TMRL123 | 0:a73914f20498 | 281 | |
TMRL123 | 0:a73914f20498 | 282 | void OnTxDone(void *radio, void *userThisPtr, void *userData) |
LucasKB | 2:e7d7e80256cc | 283 | { |
TMRL123 | 0:a73914f20498 | 284 | Radio->Sleep( ); |
LucasKB | 2:e7d7e80256cc | 285 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 286 | ser->printf("> OnTxDone\r\n"); |
TMRL123 | 0:a73914f20498 | 287 | } |
TMRL123 | 0:a73914f20498 | 288 | |
TMRL123 | 0:a73914f20498 | 289 | void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) |
TMRL123 | 0:a73914f20498 | 290 | { |
TMRL123 | 0:a73914f20498 | 291 | Radio->Sleep( ); |
LucasKB | 2:e7d7e80256cc | 292 | received = true; |
LucasKB | 2:e7d7e80256cc | 293 | uint8_t state = payload[0] >> 6; |
LucasKB | 2:e7d7e80256cc | 294 | |
LucasKB | 2:e7d7e80256cc | 295 | //ser->printf("The state is %x\r\n", state); |
LucasKB | 2:e7d7e80256cc | 296 | ser->printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d, State=%d\r\n", rssi, snr, state); |
LucasKB | 2:e7d7e80256cc | 297 | //for(int i = 0; i < BUFFER_SIZE; i++){ |
LucasKB | 2:e7d7e80256cc | 298 | // ser->printf("%x ", payload[i]); |
LucasKB | 2:e7d7e80256cc | 299 | //} |
LucasKB | 2:e7d7e80256cc | 300 | ser->printf("\r\n"); |
LucasKB | 2:e7d7e80256cc | 301 | if(state == 3){ |
LucasKB | 2:e7d7e80256cc | 302 | memcpy(&data.pkg1, payload, BUFFER_SIZE); |
LucasKB | 2:e7d7e80256cc | 303 | //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]); |
LucasKB | 2:e7d7e80256cc | 304 | 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]); |
LucasKB | 2:e7d7e80256cc | 305 | } |
LucasKB | 2:e7d7e80256cc | 306 | else if(state == 1){ |
LucasKB | 2:e7d7e80256cc | 307 | memcpy(&data.pkg2, payload, BUFFER_SIZE); |
LucasKB | 2:e7d7e80256cc | 308 | //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); |
LucasKB | 2:e7d7e80256cc | 309 | 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); |
LucasKB | 2:e7d7e80256cc | 310 | } |
LucasKB | 2:e7d7e80256cc | 311 | else if(state == 2){ |
LucasKB | 2:e7d7e80256cc | 312 | memcpy(&data.pkg3, payload, BUFFER_SIZE); |
LucasKB | 2:e7d7e80256cc | 313 | //ser->printf("Header: %x, time: %d, timeOfWeek: %d, frac: %d, gpsFix: %d\r\n", pkg3.header, pkg3.time, pkg3.timeOfWeek, pkg3.timeOfWeekFracPart, pkg3.gpsFix); |
LucasKB | 2:e7d7e80256cc | 314 | //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); |
LucasKB | 2:e7d7e80256cc | 315 | //ser->printf("speedAcc: %d, numbSat: %d\r\n", pkg3.speedAcc, pkg3.numbSat); |
LucasKB | 2:e7d7e80256cc | 316 | 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); |
LucasKB | 2:e7d7e80256cc | 317 | } |
TMRL123 | 0:a73914f20498 | 318 | } |
TMRL123 | 0:a73914f20498 | 319 | |
TMRL123 | 0:a73914f20498 | 320 | void OnTxTimeout(void *radio, void *userThisPtr, void *userData) |
TMRL123 | 0:a73914f20498 | 321 | { |
TMRL123 | 0:a73914f20498 | 322 | Radio->Sleep( ); |
TMRL123 | 0:a73914f20498 | 323 | if(DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 324 | ser->printf("> OnTxTimeout\r\n"); |
TMRL123 | 0:a73914f20498 | 325 | } |
TMRL123 | 0:a73914f20498 | 326 | |
TMRL123 | 0:a73914f20498 | 327 | void OnRxTimeout(void *radio, void *userThisPtr, void *userData) |
TMRL123 | 0:a73914f20498 | 328 | { |
TMRL123 | 0:a73914f20498 | 329 | Radio->Sleep( ); |
TMRL123 | 0:a73914f20498 | 330 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 331 | ser->printf("> OnRxTimeout\r\n"); |
TMRL123 | 0:a73914f20498 | 332 | } |
TMRL123 | 0:a73914f20498 | 333 | |
TMRL123 | 0:a73914f20498 | 334 | void OnRxError(void *radio, void *userThisPtr, void *userData) |
TMRL123 | 0:a73914f20498 | 335 | { |
TMRL123 | 0:a73914f20498 | 336 | Radio->Sleep( ); |
LucasKB | 2:e7d7e80256cc | 337 | received = true; |
TMRL123 | 0:a73914f20498 | 338 | if (DEBUG_MESSAGE) |
LucasKB | 2:e7d7e80256cc | 339 | ser->printf("> OnRxError\r\n"); |
TMRL123 | 0:a73914f20498 | 340 | } |