LoRa Access Point 1.5.2018

Dependencies:   mbed ds3231 SX1276Lib_LoRa_Access_Point

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?

UserRevisionLine numberNew 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