LoRa Access Point 1.5.2018
Dependencies: mbed ds3231 SX1276Lib_LoRa_Access_Point
RFM95W.cpp@2:0499e1d037a5, 2018-04-23 (annotated)
- Committer:
- lukas_formanek
- Date:
- Mon Apr 23 10:30:01 2018 +0000
- Revision:
- 2:0499e1d037a5
- Parent:
- 0:ea088908ad26
- Child:
- 3:7a3ddda464bf
23.4.2018
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 | 0:ea088908ad26 | 3 | RFM95W rfm; // Globalna instancia |
lukas_formanek | 0:ea088908ad26 | 4 | |
lukas_formanek | 0:ea088908ad26 | 5 | //--------------------------- Callback funkcie --------------------------------- |
lukas_formanek | 0:ea088908ad26 | 6 | void TxDone(void){rfm.OnTxDone();}; |
lukas_formanek | 0:ea088908ad26 | 7 | |
lukas_formanek | 0:ea088908ad26 | 8 | void RxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ){rfm.OnRxDone(payload,size,rssi,snr);}; |
lukas_formanek | 0:ea088908ad26 | 9 | |
lukas_formanek | 0:ea088908ad26 | 10 | void TxTimeout(void){rfm.OnTxTimeout();}; |
lukas_formanek | 0:ea088908ad26 | 11 | |
lukas_formanek | 0:ea088908ad26 | 12 | void RxTimeout(void){rfm.OnRxTimeout();}; |
lukas_formanek | 0:ea088908ad26 | 13 | |
lukas_formanek | 0:ea088908ad26 | 14 | void RxError(void){rfm.OnRxError();}; |
lukas_formanek | 0:ea088908ad26 | 15 | |
lukas_formanek | 0:ea088908ad26 | 16 | void CadDone(bool channelActivityDetected){rfm.OnCadDone(channelActivityDetected);}; |
lukas_formanek | 0:ea088908ad26 | 17 | //------------------------------------------------------------------------------ |
lukas_formanek | 0:ea088908ad26 | 18 | |
lukas_formanek | 0:ea088908ad26 | 19 | RFM95W::RFM95W() |
lukas_formanek | 0:ea088908ad26 | 20 | : radio(NULL), |
lukas_formanek | 0:ea088908ad26 | 21 | indicationLed(LED) |
lukas_formanek | 0:ea088908ad26 | 22 | { |
lukas_formanek | 0:ea088908ad26 | 23 | // messageNumbers ={[0 ... 254] = NULL}; |
lukas_formanek | 0:ea088908ad26 | 24 | for(uint16_t i=0; i<MAX_DEVICES;i++) |
lukas_formanek | 0:ea088908ad26 | 25 | messageNumbers[i]=NULL; |
lukas_formanek | 0:ea088908ad26 | 26 | memset(receivedMessage, '\0', sizeof(receivedMessage)); |
lukas_formanek | 0:ea088908ad26 | 27 | ledState = 0; |
lukas_formanek | 0:ea088908ad26 | 28 | timeOnAirSec = 0.3; |
lukas_formanek | 0:ea088908ad26 | 29 | indicationLed = 1; |
lukas_formanek | 0:ea088908ad26 | 30 | }; |
lukas_formanek | 0:ea088908ad26 | 31 | |
lukas_formanek | 0:ea088908ad26 | 32 | void RFM95W::OnLedTick() |
lukas_formanek | 0:ea088908ad26 | 33 | { |
lukas_formanek | 0:ea088908ad26 | 34 | if(ledState<6) { |
lukas_formanek | 0:ea088908ad26 | 35 | indicationLed = !indicationLed; |
lukas_formanek | 0:ea088908ad26 | 36 | } else { |
lukas_formanek | 0:ea088908ad26 | 37 | ledState = 0; |
lukas_formanek | 0:ea088908ad26 | 38 | indicationLed = 1; |
lukas_formanek | 0:ea088908ad26 | 39 | ledTicker.detach(); |
lukas_formanek | 0:ea088908ad26 | 40 | } |
lukas_formanek | 0:ea088908ad26 | 41 | ledState++; |
lukas_formanek | 0:ea088908ad26 | 42 | } |
lukas_formanek | 0:ea088908ad26 | 43 | |
lukas_formanek | 0:ea088908ad26 | 44 | void RFM95W::SendAck(uint8_t addr, uint8_t messageNumber) |
lukas_formanek | 0:ea088908ad26 | 45 | { |
lukas_formanek | 0:ea088908ad26 | 46 | uint8_t ack[3]; |
lukas_formanek | 0:ea088908ad26 | 47 | snprintf((char *)ack, sizeof(ack), "%d%d%c", addr, GATEWAY_ID, messageNumber); |
lukas_formanek | 0:ea088908ad26 | 48 | pc.printf("Sending Ack : %s \r\n",ack); |
lukas_formanek | 0:ea088908ad26 | 49 | radio.Send(ack, 3); |
lukas_formanek | 0:ea088908ad26 | 50 | }; |
lukas_formanek | 0:ea088908ad26 | 51 | |
lukas_formanek | 0:ea088908ad26 | 52 | void RFM95W::OnTxDone( void ) |
lukas_formanek | 0:ea088908ad26 | 53 | { |
lukas_formanek | 0:ea088908ad26 | 54 | radio.Sleep(); |
lukas_formanek | 0:ea088908ad26 | 55 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 56 | }; |
lukas_formanek | 0:ea088908ad26 | 57 | |
lukas_formanek | 0:ea088908ad26 | 58 | void RFM95W::OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) |
lukas_formanek | 0:ea088908ad26 | 59 | { |
lukas_formanek | 0:ea088908ad26 | 60 | radio.Sleep(); |
lukas_formanek | 0:ea088908ad26 | 61 | // debug("%d \r\n", payload[0]-'0'); |
lukas_formanek | 0:ea088908ad26 | 62 | if(payload[0]-'0' == GATEWAY_ID) { |
lukas_formanek | 0:ea088908ad26 | 63 | // moje ID - adresa brany, konverzia na cislo |
lukas_formanek | 0:ea088908ad26 | 64 | uint8_t MsgFrom = payload[1]-'0'; // konverzia na cislo |
lukas_formanek | 0:ea088908ad26 | 65 | SendAck(MsgFrom,payload[2]); |
lukas_formanek | 0:ea088908ad26 | 66 | pc.printf("MSG from : %d , message number received= %d \r\n",MsgFrom,payload[2]); |
lukas_formanek | 0:ea088908ad26 | 67 | if(payload[2] == messageNumbers[MsgFrom]) |
lukas_formanek | 0:ea088908ad26 | 68 | { |
lukas_formanek | 0:ea088908ad26 | 69 | pc.printf("--------------------- Ta ista sprava -------------------- \r\n"); |
lukas_formanek | 0:ea088908ad26 | 70 | return; |
lukas_formanek | 0:ea088908ad26 | 71 | } |
lukas_formanek | 0:ea088908ad26 | 72 | messageNumbers[MsgFrom] = payload[2]; |
lukas_formanek | 0:ea088908ad26 | 73 | |
lukas_formanek | 0:ea088908ad26 | 74 | payload[2] = 48; // ASCII hodnota cisla 0 |
lukas_formanek | 0:ea088908ad26 | 75 | pc.printf("Message number saved= %d \r\n",messageNumbers[MsgFrom]); |
lukas_formanek | 0:ea088908ad26 | 76 | snprintf((char *)receivedMessage, BUFF_SIZE, "%d|%d|%s|\r\n", rssi, snr, payload); |
lukas_formanek | 0:ea088908ad26 | 77 | wifi.SendMessage((char *)receivedMessage); |
lukas_formanek | 0:ea088908ad26 | 78 | // debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" ); |
lukas_formanek | 0:ea088908ad26 | 79 | ledTicker.attach(callback(this,&RFM95W::OnLedTick), LED_BLIK_PERIOD); |
lukas_formanek | 0:ea088908ad26 | 80 | indicationLed=0; |
lukas_formanek | 0:ea088908ad26 | 81 | |
lukas_formanek | 0:ea088908ad26 | 82 | return; |
lukas_formanek | 0:ea088908ad26 | 83 | } |
lukas_formanek | 0:ea088908ad26 | 84 | radio.Rx(0); // som zakomentil :P |
lukas_formanek | 0:ea088908ad26 | 85 | }; |
lukas_formanek | 0:ea088908ad26 | 86 | |
lukas_formanek | 0:ea088908ad26 | 87 | void RFM95W::OnTxTimeout( void ) |
lukas_formanek | 0:ea088908ad26 | 88 | { |
lukas_formanek | 0:ea088908ad26 | 89 | radio.Sleep(); |
lukas_formanek | 0:ea088908ad26 | 90 | Init(); |
lukas_formanek | 0:ea088908ad26 | 91 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 92 | }; |
lukas_formanek | 0:ea088908ad26 | 93 | |
lukas_formanek | 0:ea088908ad26 | 94 | void RFM95W::OnRxTimeout( void ) |
lukas_formanek | 0:ea088908ad26 | 95 | { |
lukas_formanek | 0:ea088908ad26 | 96 | radio.Sleep(); |
lukas_formanek | 0:ea088908ad26 | 97 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 98 | }; |
lukas_formanek | 0:ea088908ad26 | 99 | |
lukas_formanek | 0:ea088908ad26 | 100 | void RFM95W::OnRxError( void ) |
lukas_formanek | 0:ea088908ad26 | 101 | { |
lukas_formanek | 0:ea088908ad26 | 102 | radio.Sleep(); |
lukas_formanek | 0:ea088908ad26 | 103 | pc.printf("Chyba prijatia ! \r\n"); |
lukas_formanek | 0:ea088908ad26 | 104 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 105 | }; |
lukas_formanek | 0:ea088908ad26 | 106 | |
lukas_formanek | 0:ea088908ad26 | 107 | void RFM95W::OnCadDone( bool channelActivityDetected ){}; |
lukas_formanek | 0:ea088908ad26 | 108 | |
lukas_formanek | 0:ea088908ad26 | 109 | void RFM95W::Init( void ) |
lukas_formanek | 0:ea088908ad26 | 110 | { |
lukas_formanek | 0:ea088908ad26 | 111 | pc.printf( "\n\n\r------- RFM95W GATEWAY -------\n\r" ); |
lukas_formanek | 0:ea088908ad26 | 112 | // Initialize Radio driver |
lukas_formanek | 0:ea088908ad26 | 113 | radioEvents.TxDone = TxDone; |
lukas_formanek | 0:ea088908ad26 | 114 | radioEvents.RxDone = RxDone; |
lukas_formanek | 0:ea088908ad26 | 115 | radioEvents.RxError = RxError; |
lukas_formanek | 0:ea088908ad26 | 116 | radioEvents.TxTimeout = TxTimeout; |
lukas_formanek | 0:ea088908ad26 | 117 | radioEvents.RxTimeout = RxTimeout; |
lukas_formanek | 0:ea088908ad26 | 118 | radioEvents.CadDone = CadDone; |
lukas_formanek | 0:ea088908ad26 | 119 | radio.Init( &radioEvents ); |
lukas_formanek | 0:ea088908ad26 | 120 | // verify the connection with the board |
lukas_formanek | 0:ea088908ad26 | 121 | while( radio.Read( REG_VERSION ) == 0x00 ) { |
lukas_formanek | 0:ea088908ad26 | 122 | pc.printf( "Radiovy modul nie je pripojeny!\n\r", NULL ); |
lukas_formanek | 0:ea088908ad26 | 123 | wait(1); |
lukas_formanek | 0:ea088908ad26 | 124 | } |
lukas_formanek | 0:ea088908ad26 | 125 | |
lukas_formanek | 0:ea088908ad26 | 126 | // debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ) , "\n\r > TYP: RFM95W < \n\r" ); |
lukas_formanek | 0:ea088908ad26 | 127 | // debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ) , "\n\r > TYP: RFM95W < \n\r" ); |
lukas_formanek | 0:ea088908ad26 | 128 | radio.SetChannel( RF_FREQUENCY ); |
lukas_formanek | 0:ea088908ad26 | 129 | #if USE_MODEM_LORA == 1 |
lukas_formanek | 0:ea088908ad26 | 130 | |
lukas_formanek | 0:ea088908ad26 | 131 | // debug_if( LORA_FHSS_ENABLED, "\n\r > LORA FHSS Mod < \n\n\r"); |
lukas_formanek | 0:ea088908ad26 | 132 | // debug_if( !LORA_FHSS_ENABLED, "\n\r > LORA Mod < \n\n\r"); |
lukas_formanek | 2:0499e1d037a5 | 133 | pc.printf("\n\r > LORA Mod < \n\n\r"); |
lukas_formanek | 0:ea088908ad26 | 134 | radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, |
lukas_formanek | 0:ea088908ad26 | 135 | LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
lukas_formanek | 0:ea088908ad26 | 136 | LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
lukas_formanek | 0:ea088908ad26 | 137 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
lukas_formanek | 0:ea088908ad26 | 138 | LORA_IQ_INVERSION_ON, 2000000 ); |
lukas_formanek | 0:ea088908ad26 | 139 | |
lukas_formanek | 0:ea088908ad26 | 140 | radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, |
lukas_formanek | 0:ea088908ad26 | 141 | LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, |
lukas_formanek | 0:ea088908ad26 | 142 | LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, |
lukas_formanek | 0:ea088908ad26 | 143 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
lukas_formanek | 0:ea088908ad26 | 144 | LORA_IQ_INVERSION_ON, true ); |
lukas_formanek | 0:ea088908ad26 | 145 | |
lukas_formanek | 0:ea088908ad26 | 146 | #elif USE_MODEM_FSK == 1 |
lukas_formanek | 0:ea088908ad26 | 147 | |
lukas_formanek | 2:0499e1d037a5 | 148 | pc.printf("\n\r > FSK Mod < \n\n\r"); |
lukas_formanek | 0:ea088908ad26 | 149 | radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0, |
lukas_formanek | 0:ea088908ad26 | 150 | FSK_DATARATE, 0, |
lukas_formanek | 0:ea088908ad26 | 151 | FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON, |
lukas_formanek | 0:ea088908ad26 | 152 | FSK_CRC_ENABLED, 0, 0, 0, 2000000 ); |
lukas_formanek | 0:ea088908ad26 | 153 | |
lukas_formanek | 0:ea088908ad26 | 154 | radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE, |
lukas_formanek | 0:ea088908ad26 | 155 | 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, |
lukas_formanek | 0:ea088908ad26 | 156 | 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED, |
lukas_formanek | 0:ea088908ad26 | 157 | 0, 0, false, true ); |
lukas_formanek | 0:ea088908ad26 | 158 | |
lukas_formanek | 0:ea088908ad26 | 159 | #else |
lukas_formanek | 0:ea088908ad26 | 160 | |
lukas_formanek | 0:ea088908ad26 | 161 | #error "Nie je definovany typ modemu." |
lukas_formanek | 0:ea088908ad26 | 162 | |
lukas_formanek | 0:ea088908ad26 | 163 | #endif |
lukas_formanek | 0:ea088908ad26 | 164 | // Konfiguracia pre moznost max. vysielacieho vykonu |
lukas_formanek | 0:ea088908ad26 | 165 | uint8_t paConfig; |
lukas_formanek | 0:ea088908ad26 | 166 | paConfig = radio.Read( REG_PACONFIG ); |
lukas_formanek | 0:ea088908ad26 | 167 | paConfig |= RF_PACONFIG_PASELECT_PABOOST; |
lukas_formanek | 0:ea088908ad26 | 168 | radio.Write( REG_PACONFIG, paConfig ); |
lukas_formanek | 0:ea088908ad26 | 169 | |
lukas_formanek | 0:ea088908ad26 | 170 | pc.printf("________Start aplikacie________\r\n" ); |
lukas_formanek | 2:0499e1d037a5 | 171 | timeOnAirSec = (radio.TimeOnAir( MODEM_LORA, 10)/1000.0); // time on air v ms |
lukas_formanek | 0:ea088908ad26 | 172 | pc.printf( "\n\n\r------- Time on air : %f sec. -------\n\r", timeOnAirSec); |
lukas_formanek | 0:ea088908ad26 | 173 | indicationLed = 1; |
lukas_formanek | 0:ea088908ad26 | 174 | radio.Rx(0); |
lukas_formanek | 0:ea088908ad26 | 175 | }; |
lukas_formanek | 0:ea088908ad26 | 176 | |
lukas_formanek | 0:ea088908ad26 | 177 |