LoRa Access Point 1.5.2018
Dependencies: mbed ds3231 SX1276Lib_LoRa_Access_Point
RFM95W.cpp@11:376bfcdda0d4, 2021-05-08 (annotated)
- Committer:
- lukas_formanek
- Date:
- Sat May 08 16:23:46 2021 +0000
- Revision:
- 11:376bfcdda0d4
- Parent:
- 10:e62222c46ee9
LoRa_Access_Point
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lukas_formanek | 0:ea088908ad26 | 1 | #include "RFM95W.h" |
lukas_formanek | 0:ea088908ad26 | 2 | |
lukas_formanek | 5:19b34c4d27a1 | 3 | RFM95W rfm; |
lukas_formanek | 0:ea088908ad26 | 4 | |
lukas_formanek | 0:ea088908ad26 | 5 | //--------------------------- Callback funkcie --------------------------------- |
lukas_formanek | 5:19b34c4d27a1 | 6 | void TxDone(void) |
lukas_formanek | 5:19b34c4d27a1 | 7 | { |
lukas_formanek | 5:19b34c4d27a1 | 8 | rfm.OnTxDone(); |
lukas_formanek | 5:19b34c4d27a1 | 9 | }; |
lukas_formanek | 0:ea088908ad26 | 10 | |
lukas_formanek | 5:19b34c4d27a1 | 11 | void RxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) |
lukas_formanek | 5:19b34c4d27a1 | 12 | { |
lukas_formanek | 5:19b34c4d27a1 | 13 | rfm.OnRxDone(payload,size,rssi,snr); |
lukas_formanek | 5:19b34c4d27a1 | 14 | }; |
lukas_formanek | 0:ea088908ad26 | 15 | |
lukas_formanek | 5:19b34c4d27a1 | 16 | void TxTimeout(void) |
lukas_formanek | 5:19b34c4d27a1 | 17 | { |
lukas_formanek | 5:19b34c4d27a1 | 18 | rfm.OnTxTimeout(); |
lukas_formanek | 5:19b34c4d27a1 | 19 | }; |
lukas_formanek | 0:ea088908ad26 | 20 | |
lukas_formanek | 5:19b34c4d27a1 | 21 | void RxTimeout(void) |
lukas_formanek | 5:19b34c4d27a1 | 22 | { |
lukas_formanek | 5:19b34c4d27a1 | 23 | rfm.OnRxTimeout(); |
lukas_formanek | 5:19b34c4d27a1 | 24 | }; |
lukas_formanek | 0:ea088908ad26 | 25 | |
lukas_formanek | 5:19b34c4d27a1 | 26 | void RxError(void) |
lukas_formanek | 5:19b34c4d27a1 | 27 | { |
lukas_formanek | 5:19b34c4d27a1 | 28 | rfm.OnRxError(); |
lukas_formanek | 5:19b34c4d27a1 | 29 | }; |
lukas_formanek | 0:ea088908ad26 | 30 | |
lukas_formanek | 5:19b34c4d27a1 | 31 | void CadDone(bool channelActivityDetected) |
lukas_formanek | 5:19b34c4d27a1 | 32 | { |
lukas_formanek | 5:19b34c4d27a1 | 33 | rfm.OnCadDone(channelActivityDetected); |
lukas_formanek | 5:19b34c4d27a1 | 34 | }; |
lukas_formanek | 0:ea088908ad26 | 35 | //------------------------------------------------------------------------------ |
lukas_formanek | 0:ea088908ad26 | 36 | |
lukas_formanek | 0:ea088908ad26 | 37 | RFM95W::RFM95W() |
lukas_formanek | 0:ea088908ad26 | 38 | : radio(NULL), |
lukas_formanek | 3:7a3ddda464bf | 39 | indicationLed(LED_PIN), |
lukas_formanek | 3:7a3ddda464bf | 40 | noise(NOISE_PIN) |
lukas_formanek | 0:ea088908ad26 | 41 | { |
lukas_formanek | 5:19b34c4d27a1 | 42 | for(uint16_t i=0; i<MAX_DEVICES; i++) |
lukas_formanek | 3:7a3ddda464bf | 43 | messageNumbers[i]=NULL; |
lukas_formanek | 0:ea088908ad26 | 44 | memset(receivedMessage, '\0', sizeof(receivedMessage)); |
lukas_formanek | 0:ea088908ad26 | 45 | ledState = 0; |
lukas_formanek | 0:ea088908ad26 | 46 | timeOnAirSec = 0.3; |
lukas_formanek | 0:ea088908ad26 | 47 | indicationLed = 1; |
lukas_formanek | 3:7a3ddda464bf | 48 | messageNumber = GATEWAY_ID; |
lukas_formanek | 3:7a3ddda464bf | 49 | sendCounter = 0; |
lukas_formanek | 3:7a3ddda464bf | 50 | receivedAck = false; |
lukas_formanek | 8:5d99fbf255d6 | 51 | writeDataToSD = false; |
lukas_formanek | 0:ea088908ad26 | 52 | }; |
lukas_formanek | 0:ea088908ad26 | 53 | |
lukas_formanek | 0:ea088908ad26 | 54 | void RFM95W::OnLedTick() |
lukas_formanek | 0:ea088908ad26 | 55 | { |
lukas_formanek | 11:376bfcdda0d4 | 56 | if(ledState<4) { |
lukas_formanek | 0:ea088908ad26 | 57 | indicationLed = !indicationLed; |
lukas_formanek | 0:ea088908ad26 | 58 | } else { |
lukas_formanek | 0:ea088908ad26 | 59 | ledState = 0; |
lukas_formanek | 0:ea088908ad26 | 60 | indicationLed = 1; |
lukas_formanek | 0:ea088908ad26 | 61 | ledTicker.detach(); |
lukas_formanek | 0:ea088908ad26 | 62 | } |
lukas_formanek | 0:ea088908ad26 | 63 | ledState++; |
lukas_formanek | 0:ea088908ad26 | 64 | } |
lukas_formanek | 0:ea088908ad26 | 65 | |
lukas_formanek | 3:7a3ddda464bf | 66 | void RFM95W::SendMessage() |
lukas_formanek | 3:7a3ddda464bf | 67 | { |
lukas_formanek | 3:7a3ddda464bf | 68 | snprintf((char *)ack, 3, "%c%c%c",GATEWAY_ID, sendBuffer[0], messageNumber); |
lukas_formanek | 11:376bfcdda0d4 | 69 | radio.Send( sendBuffer, 30 ); |
lukas_formanek | 3:7a3ddda464bf | 70 | } |
lukas_formanek | 3:7a3ddda464bf | 71 | |
lukas_formanek | 0:ea088908ad26 | 72 | void RFM95W::SendAck(uint8_t addr, uint8_t messageNumber) |
lukas_formanek | 0:ea088908ad26 | 73 | { |
lukas_formanek | 0:ea088908ad26 | 74 | uint8_t ack[3]; |
lukas_formanek | 3:7a3ddda464bf | 75 | snprintf((char *)ack, sizeof(ack), "%c%c%c", addr, GATEWAY_ID, messageNumber); |
lukas_formanek | 10:e62222c46ee9 | 76 | // pc.printf("Sending Ack : %s \r\n",ack); |
lukas_formanek | 10:e62222c46ee9 | 77 | pc.printf("Sending Ack : %d \r\n",addr); |
lukas_formanek | 0:ea088908ad26 | 78 | radio.Send(ack, 3); |
lukas_formanek | 0:ea088908ad26 | 79 | }; |
lukas_formanek | 0:ea088908ad26 | 80 | |
lukas_formanek | 3:7a3ddda464bf | 81 | float RFM95W::CalculateRandomTime() |
lukas_formanek | 3:7a3ddda464bf | 82 | { |
lukas_formanek | 4:e20eb5efd859 | 83 | uint8_t number = rand() % 1500;; |
lukas_formanek | 5:19b34c4d27a1 | 84 | while(number == 0) { |
lukas_formanek | 5:19b34c4d27a1 | 85 | number = rand() % 1500; |
lukas_formanek | 5:19b34c4d27a1 | 86 | } |
lukas_formanek | 8:5d99fbf255d6 | 87 | return (timeOnAirSec * (number / 500.0)); |
lukas_formanek | 3:7a3ddda464bf | 88 | }; |
lukas_formanek | 3:7a3ddda464bf | 89 | |
lukas_formanek | 3:7a3ddda464bf | 90 | void RFM95W::OnCheckAck() |
lukas_formanek | 3:7a3ddda464bf | 91 | { |
lukas_formanek | 3:7a3ddda464bf | 92 | if((receivedAck == false) && (sendCounter < MAX_RESENDS)) |
lukas_formanek | 8:5d99fbf255d6 | 93 | { |
lukas_formanek | 8:5d99fbf255d6 | 94 | sendTicker.detach(); |
lukas_formanek | 4:e20eb5efd859 | 95 | sendTicker.attach(callback(this,&RFM95W::OnSendAgain), CalculateRandomTime()); |
lukas_formanek | 8:5d99fbf255d6 | 96 | } |
lukas_formanek | 5:19b34c4d27a1 | 97 | else if((receivedAck == false) && (sendCounter >= MAX_RESENDS)) { |
lukas_formanek | 4:e20eb5efd859 | 98 | messageNumber++; |
lukas_formanek | 4:e20eb5efd859 | 99 | if(messageNumber>255) |
lukas_formanek | 4:e20eb5efd859 | 100 | messageNumber = 0; |
lukas_formanek | 3:7a3ddda464bf | 101 | } |
lukas_formanek | 3:7a3ddda464bf | 102 | ackTicker.detach(); |
lukas_formanek | 3:7a3ddda464bf | 103 | }; |
lukas_formanek | 3:7a3ddda464bf | 104 | |
lukas_formanek | 3:7a3ddda464bf | 105 | void RFM95W::OnSendAgain() |
lukas_formanek | 3:7a3ddda464bf | 106 | { |
lukas_formanek | 4:e20eb5efd859 | 107 | pc.printf("On send again \r\n"); |
lukas_formanek | 3:7a3ddda464bf | 108 | SendMessage(); |
lukas_formanek | 3:7a3ddda464bf | 109 | sendCounter++; |
lukas_formanek | 3:7a3ddda464bf | 110 | sendTicker.detach(); |
lukas_formanek | 3:7a3ddda464bf | 111 | }; |
lukas_formanek | 3:7a3ddda464bf | 112 | |
lukas_formanek | 0:ea088908ad26 | 113 | void RFM95W::OnTxDone( void ) |
lukas_formanek | 0:ea088908ad26 | 114 | { |
lukas_formanek | 0:ea088908ad26 | 115 | radio.Sleep(); |
lukas_formanek | 3:7a3ddda464bf | 116 | if(sendingAck) |
lukas_formanek | 8:5d99fbf255d6 | 117 | { |
lukas_formanek | 3:7a3ddda464bf | 118 | sendingAck = false; |
lukas_formanek | 8:5d99fbf255d6 | 119 | } |
lukas_formanek | 5:19b34c4d27a1 | 120 | else { |
lukas_formanek | 4:e20eb5efd859 | 121 | pc.printf("OnTxDone !\r\n"); |
lukas_formanek | 3:7a3ddda464bf | 122 | receivedAck = false; |
lukas_formanek | 8:5d99fbf255d6 | 123 | ackTicker.detach(); |
lukas_formanek | 3:7a3ddda464bf | 124 | ackTicker.attach(callback(this,&RFM95W::OnCheckAck),timeOnAirSec*3); |
lukas_formanek | 3:7a3ddda464bf | 125 | } |
lukas_formanek | 0:ea088908ad26 | 126 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 127 | }; |
lukas_formanek | 0:ea088908ad26 | 128 | |
lukas_formanek | 0:ea088908ad26 | 129 | void RFM95W::OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) |
lukas_formanek | 0:ea088908ad26 | 130 | { |
lukas_formanek | 0:ea088908ad26 | 131 | radio.Sleep(); |
lukas_formanek | 3:7a3ddda464bf | 132 | if(payload[0] == GATEWAY_ID) { |
lukas_formanek | 6:1ee035ae2a2c | 133 | uint8_t msgFrom = payload[1]; |
lukas_formanek | 3:7a3ddda464bf | 134 | indicationLed=0; |
lukas_formanek | 8:5d99fbf255d6 | 135 | ledTicker.detach(); |
lukas_formanek | 11:376bfcdda0d4 | 136 | ledTicker.attach(callback(this,&RFM95W::OnLedTick), 0.05); |
lukas_formanek | 5:19b34c4d27a1 | 137 | if((size == 3) && (strncmp( ( const char* )payload, ( const char* )ack, 3 ) == 0) ) { |
lukas_formanek | 3:7a3ddda464bf | 138 | receivedAck = true; |
lukas_formanek | 5:19b34c4d27a1 | 139 | wifi.ConfirmReceivedAck(msgFrom); |
lukas_formanek | 3:7a3ddda464bf | 140 | pc.printf("Received Ack : %s \r\n",ack); |
lukas_formanek | 3:7a3ddda464bf | 141 | messageNumber++; |
lukas_formanek | 3:7a3ddda464bf | 142 | if(messageNumber>255) |
lukas_formanek | 3:7a3ddda464bf | 143 | messageNumber = 0; |
lukas_formanek | 5:19b34c4d27a1 | 144 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 145 | return; |
lukas_formanek | 0:ea088908ad26 | 146 | } |
lukas_formanek | 5:19b34c4d27a1 | 147 | sendingAck = true; |
lukas_formanek | 5:19b34c4d27a1 | 148 | SendAck(msgFrom,payload[2]); |
lukas_formanek | 10:e62222c46ee9 | 149 | pc.printf("MSG from : %d , message number received= %d \r\n",msgFrom,payload[2]); |
lukas_formanek | 5:19b34c4d27a1 | 150 | if(payload[2] == messageNumbers[msgFrom]) { |
lukas_formanek | 5:19b34c4d27a1 | 151 | pc.printf("--------------------- Ta ista sprava -------------------- \r\n"); |
lukas_formanek | 5:19b34c4d27a1 | 152 | return; |
lukas_formanek | 5:19b34c4d27a1 | 153 | } |
lukas_formanek | 5:19b34c4d27a1 | 154 | messageNumbers[msgFrom] = payload[2]; |
lukas_formanek | 6:1ee035ae2a2c | 155 | payload[2] = 48; |
lukas_formanek | 3:7a3ddda464bf | 156 | memmove(payload, payload+4, size - 4 + 1); // orezem prve styri bajty |
lukas_formanek | 11:376bfcdda0d4 | 157 | snprintf((char *)receivedMessage, BUFF_SIZE, "%s|%d|%d|%d|%d|%s|",actual_time, rssi, snr, GATEWAY_ID, msgFrom, payload); |
lukas_formanek | 8:5d99fbf255d6 | 158 | writeDataToSD = true; |
lukas_formanek | 8:5d99fbf255d6 | 159 | wifi.SendMessage((char *)receivedMessage); |
lukas_formanek | 8:5d99fbf255d6 | 160 | SDcard.Write((char *)receivedMessage); |
lukas_formanek | 0:ea088908ad26 | 161 | return; |
lukas_formanek | 0:ea088908ad26 | 162 | } |
lukas_formanek | 5:19b34c4d27a1 | 163 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 164 | }; |
lukas_formanek | 0:ea088908ad26 | 165 | |
lukas_formanek | 0:ea088908ad26 | 166 | void RFM95W::OnTxTimeout( void ) |
lukas_formanek | 0:ea088908ad26 | 167 | { |
lukas_formanek | 0:ea088908ad26 | 168 | radio.Sleep(); |
lukas_formanek | 0:ea088908ad26 | 169 | Init(); |
lukas_formanek | 0:ea088908ad26 | 170 | }; |
lukas_formanek | 0:ea088908ad26 | 171 | |
lukas_formanek | 0:ea088908ad26 | 172 | void RFM95W::OnRxTimeout( void ) |
lukas_formanek | 0:ea088908ad26 | 173 | { |
lukas_formanek | 0:ea088908ad26 | 174 | radio.Sleep(); |
lukas_formanek | 0:ea088908ad26 | 175 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 176 | }; |
lukas_formanek | 0:ea088908ad26 | 177 | |
lukas_formanek | 0:ea088908ad26 | 178 | void RFM95W::OnRxError( void ) |
lukas_formanek | 0:ea088908ad26 | 179 | { |
lukas_formanek | 0:ea088908ad26 | 180 | radio.Sleep(); |
lukas_formanek | 0:ea088908ad26 | 181 | pc.printf("Chyba prijatia ! \r\n"); |
lukas_formanek | 0:ea088908ad26 | 182 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 183 | }; |
lukas_formanek | 0:ea088908ad26 | 184 | |
lukas_formanek | 5:19b34c4d27a1 | 185 | void RFM95W::OnCadDone( bool channelActivityDetected ) {}; |
lukas_formanek | 0:ea088908ad26 | 186 | |
lukas_formanek | 3:7a3ddda464bf | 187 | void RFM95W::SendValue(uint8_t addr, float value) |
lukas_formanek | 3:7a3ddda464bf | 188 | { |
lukas_formanek | 3:7a3ddda464bf | 189 | snprintf((char *)sendBuffer, BUFF_SIZE, "%c%c%c|%.2f|",addr, GATEWAY_ID, messageNumber, value); |
lukas_formanek | 3:7a3ddda464bf | 190 | sendCounter = 0; |
lukas_formanek | 3:7a3ddda464bf | 191 | receivedAck = false; |
lukas_formanek | 5:19b34c4d27a1 | 192 | SendMessage(); |
lukas_formanek | 4:e20eb5efd859 | 193 | }; |
lukas_formanek | 4:e20eb5efd859 | 194 | |
lukas_formanek | 4:e20eb5efd859 | 195 | void RFM95W::SendValue(uint8_t addr, int value) |
lukas_formanek | 4:e20eb5efd859 | 196 | { |
lukas_formanek | 4:e20eb5efd859 | 197 | snprintf((char *)sendBuffer, BUFF_SIZE, "%c%c%c|%d|",addr, GATEWAY_ID, messageNumber, value); |
lukas_formanek | 4:e20eb5efd859 | 198 | sendCounter = 0; |
lukas_formanek | 4:e20eb5efd859 | 199 | receivedAck = false; |
lukas_formanek | 5:19b34c4d27a1 | 200 | SendMessage(); |
lukas_formanek | 4:e20eb5efd859 | 201 | }; |
lukas_formanek | 4:e20eb5efd859 | 202 | |
lukas_formanek | 4:e20eb5efd859 | 203 | void RFM95W::SendMessage(char* message) |
lukas_formanek | 4:e20eb5efd859 | 204 | { |
lukas_formanek | 4:e20eb5efd859 | 205 | snprintf((char *)sendBuffer, BUFF_SIZE, "%s", message); |
lukas_formanek | 4:e20eb5efd859 | 206 | sendBuffer[0] = (char)sendBuffer[0]; |
lukas_formanek | 4:e20eb5efd859 | 207 | sendBuffer[1] = (char)GATEWAY_ID; |
lukas_formanek | 4:e20eb5efd859 | 208 | sendBuffer[2] = (char)messageNumber; |
lukas_formanek | 4:e20eb5efd859 | 209 | sendCounter = 0; |
lukas_formanek | 4:e20eb5efd859 | 210 | receivedAck = false; |
lukas_formanek | 4:e20eb5efd859 | 211 | |
lukas_formanek | 4:e20eb5efd859 | 212 | pc.printf("%s",sendBuffer); |
lukas_formanek | 5:19b34c4d27a1 | 213 | SendMessage(); |
lukas_formanek | 3:7a3ddda464bf | 214 | }; |
lukas_formanek | 3:7a3ddda464bf | 215 | |
lukas_formanek | 8:5d99fbf255d6 | 216 | void RFM95W::WriteDataToSDcard() |
lukas_formanek | 8:5d99fbf255d6 | 217 | { |
lukas_formanek | 8:5d99fbf255d6 | 218 | if(writeDataToSD) |
lukas_formanek | 8:5d99fbf255d6 | 219 | { |
lukas_formanek | 8:5d99fbf255d6 | 220 | // SDcard.Write((char *)receivedMessage); |
lukas_formanek | 8:5d99fbf255d6 | 221 | writeDataToSD = false; |
lukas_formanek | 8:5d99fbf255d6 | 222 | } |
lukas_formanek | 8:5d99fbf255d6 | 223 | } |
lukas_formanek | 8:5d99fbf255d6 | 224 | |
lukas_formanek | 0:ea088908ad26 | 225 | void RFM95W::Init( void ) |
lukas_formanek | 0:ea088908ad26 | 226 | { |
lukas_formanek | 0:ea088908ad26 | 227 | pc.printf( "\n\n\r------- RFM95W GATEWAY -------\n\r" ); |
lukas_formanek | 0:ea088908ad26 | 228 | // Initialize Radio driver |
lukas_formanek | 0:ea088908ad26 | 229 | radioEvents.TxDone = TxDone; |
lukas_formanek | 0:ea088908ad26 | 230 | radioEvents.RxDone = RxDone; |
lukas_formanek | 0:ea088908ad26 | 231 | radioEvents.RxError = RxError; |
lukas_formanek | 0:ea088908ad26 | 232 | radioEvents.TxTimeout = TxTimeout; |
lukas_formanek | 0:ea088908ad26 | 233 | radioEvents.RxTimeout = RxTimeout; |
lukas_formanek | 0:ea088908ad26 | 234 | radioEvents.CadDone = CadDone; |
lukas_formanek | 0:ea088908ad26 | 235 | radio.Init( &radioEvents ); |
lukas_formanek | 0:ea088908ad26 | 236 | // verify the connection with the board |
lukas_formanek | 0:ea088908ad26 | 237 | while( radio.Read( REG_VERSION ) == 0x00 ) { |
lukas_formanek | 0:ea088908ad26 | 238 | pc.printf( "Radiovy modul nie je pripojeny!\n\r", NULL ); |
lukas_formanek | 0:ea088908ad26 | 239 | wait(1); |
lukas_formanek | 0:ea088908ad26 | 240 | } |
lukas_formanek | 0:ea088908ad26 | 241 | radio.SetChannel( RF_FREQUENCY ); |
lukas_formanek | 0:ea088908ad26 | 242 | #if USE_MODEM_LORA == 1 |
lukas_formanek | 2:0499e1d037a5 | 243 | pc.printf("\n\r > LORA Mod < \n\n\r"); |
lukas_formanek | 0:ea088908ad26 | 244 | radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, |
lukas_formanek | 0:ea088908ad26 | 245 | LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
lukas_formanek | 0:ea088908ad26 | 246 | LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
lukas_formanek | 0:ea088908ad26 | 247 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
lukas_formanek | 0:ea088908ad26 | 248 | LORA_IQ_INVERSION_ON, 2000000 ); |
lukas_formanek | 0:ea088908ad26 | 249 | |
lukas_formanek | 0:ea088908ad26 | 250 | radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, |
lukas_formanek | 0:ea088908ad26 | 251 | LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, |
lukas_formanek | 0:ea088908ad26 | 252 | LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, |
lukas_formanek | 0:ea088908ad26 | 253 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
lukas_formanek | 0:ea088908ad26 | 254 | LORA_IQ_INVERSION_ON, true ); |
lukas_formanek | 0:ea088908ad26 | 255 | |
lukas_formanek | 0:ea088908ad26 | 256 | #elif USE_MODEM_FSK == 1 |
lukas_formanek | 0:ea088908ad26 | 257 | |
lukas_formanek | 2:0499e1d037a5 | 258 | pc.printf("\n\r > FSK Mod < \n\n\r"); |
lukas_formanek | 0:ea088908ad26 | 259 | radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0, |
lukas_formanek | 0:ea088908ad26 | 260 | FSK_DATARATE, 0, |
lukas_formanek | 0:ea088908ad26 | 261 | FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON, |
lukas_formanek | 0:ea088908ad26 | 262 | FSK_CRC_ENABLED, 0, 0, 0, 2000000 ); |
lukas_formanek | 0:ea088908ad26 | 263 | |
lukas_formanek | 0:ea088908ad26 | 264 | radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE, |
lukas_formanek | 0:ea088908ad26 | 265 | 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, |
lukas_formanek | 0:ea088908ad26 | 266 | 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED, |
lukas_formanek | 0:ea088908ad26 | 267 | 0, 0, false, true ); |
lukas_formanek | 0:ea088908ad26 | 268 | |
lukas_formanek | 0:ea088908ad26 | 269 | #else |
lukas_formanek | 0:ea088908ad26 | 270 | |
lukas_formanek | 0:ea088908ad26 | 271 | #error "Nie je definovany typ modemu." |
lukas_formanek | 0:ea088908ad26 | 272 | |
lukas_formanek | 0:ea088908ad26 | 273 | #endif |
lukas_formanek | 0:ea088908ad26 | 274 | // Konfiguracia pre moznost max. vysielacieho vykonu |
lukas_formanek | 0:ea088908ad26 | 275 | uint8_t paConfig; |
lukas_formanek | 0:ea088908ad26 | 276 | paConfig = radio.Read( REG_PACONFIG ); |
lukas_formanek | 0:ea088908ad26 | 277 | paConfig |= RF_PACONFIG_PASELECT_PABOOST; |
lukas_formanek | 0:ea088908ad26 | 278 | radio.Write( REG_PACONFIG, paConfig ); |
lukas_formanek | 5:19b34c4d27a1 | 279 | |
lukas_formanek | 0:ea088908ad26 | 280 | pc.printf("________Start aplikacie________\r\n" ); |
lukas_formanek | 11:376bfcdda0d4 | 281 | timeOnAirSec = (radio.TimeOnAir( MODEM_LORA, 25)/1000.0); // time on air v ms |
lukas_formanek | 0:ea088908ad26 | 282 | pc.printf( "\n\n\r------- Time on air : %f sec. -------\n\r", timeOnAirSec); |
lukas_formanek | 0:ea088908ad26 | 283 | indicationLed = 1; |
lukas_formanek | 3:7a3ddda464bf | 284 | InitRandom(); |
lukas_formanek | 3:7a3ddda464bf | 285 | messageNumber = rand(); |
lukas_formanek | 0:ea088908ad26 | 286 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 287 | }; |
lukas_formanek | 0:ea088908ad26 | 288 | |
lukas_formanek | 3:7a3ddda464bf | 289 | void RFM95W::InitRandom() |
lukas_formanek | 3:7a3ddda464bf | 290 | { |
lukas_formanek | 3:7a3ddda464bf | 291 | uint32_t seed; |
lukas_formanek | 3:7a3ddda464bf | 292 | uint8_t loops = 3; |
lukas_formanek | 3:7a3ddda464bf | 293 | for (int i=0; i<(32*loops); i++) { |
lukas_formanek | 3:7a3ddda464bf | 294 | seed ^= noise.read_u16(); |
lukas_formanek | 5:19b34c4d27a1 | 295 | if (seed & 1<31) { |
lukas_formanek | 3:7a3ddda464bf | 296 | seed <<= 1; |
lukas_formanek | 3:7a3ddda464bf | 297 | seed |= 1; |
lukas_formanek | 3:7a3ddda464bf | 298 | } else |
lukas_formanek | 3:7a3ddda464bf | 299 | seed <<= 1; |
lukas_formanek | 3:7a3ddda464bf | 300 | } |
lukas_formanek | 3:7a3ddda464bf | 301 | srand(seed); |
lukas_formanek | 3:7a3ddda464bf | 302 | }; |
lukas_formanek | 11:376bfcdda0d4 | 303 | |
lukas_formanek | 11:376bfcdda0d4 | 304 | bool RFM95W::ReceivedMessage() |
lukas_formanek | 11:376bfcdda0d4 | 305 | { |
lukas_formanek | 11:376bfcdda0d4 | 306 | if(writeDataToSD) return true; |
lukas_formanek | 11:376bfcdda0d4 | 307 | return false; |
lukas_formanek | 11:376bfcdda0d4 | 308 | }; |