LoRa_Node_STM32F103C8T6

Dependencies:   mbed mbed-STM32F103C8T6 OneWireCRC_LoRa_Node SX1276Lib_LoRa_Node

Revision:
0:cc04364f049a
Child:
1:a54ff5e2c2f3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RFM95W.cpp	Thu Apr 19 14:09:56 2018 +0000
@@ -0,0 +1,206 @@
+#include "RFM95W.h"
+
+RFM95W rfm; // Globalna instancia
+
+//--------------------------- Callback funkcie ---------------------------------
+void TxDone(void){rfm.OnTxDone();};
+
+void RxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ){rfm.OnRxDone(payload,size,rssi,snr);};
+
+void TxTimeout(void){rfm.OnTxTimeout();};
+
+void RxTimeout(void){rfm.OnRxTimeout();};
+
+void RxError(void){rfm.OnRxError();};
+
+void CadDone(bool channelActivityDetected){rfm.OnCadDone(channelActivityDetected);};
+//------------------------------------------------------------------------------
+
+RFM95W::RFM95W()
+    : radio(NULL),
+      indicationLed(LED),
+      noise(NOISE_PIN)
+{
+//     messageNumbers ={[0 ... 254] = NULL};
+    for(uint16_t i=0; i<MAX_DEVICES;i++)
+         messageNumbers[i]=NULL;
+    memset(receivedMessage, '\0', sizeof(receivedMessage));
+    ledState = 0;
+    timeOnAirSec = 0.3;
+    indicationLed = 1;
+    messageNumber = NODE_ID;
+};
+
+void RFM95W::OnLedTick()
+{
+    if(ledState<6) {
+        indicationLed = !indicationLed;
+    } else {
+        ledState = 0;
+        indicationLed = 1;
+        ledTicker.detach();
+    }
+    ledState++;
+}
+
+void RFM95W::SendAck(uint8_t addr, uint8_t messageNumber)
+{
+    uint8_t ack[3];
+    snprintf((char *)ack, sizeof(ack), "%d%d%c", addr, GATEWAY_ID, messageNumber);
+    PC.printf("Sending Ack : %s \r\n",ack);
+    radio.Send(ack, 3);
+};
+
+void RFM95W::OnTxDone( void )
+{
+    radio.Sleep();
+    radio.Rx(0);
+};
+
+void RFM95W::OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
+{
+    radio.Sleep();
+//    debug("%d \r\n", payload[0]-'0');
+    if(payload[0]-'0' == GATEWAY_ID) {
+        // moje ID - adresa brany, konverzia na cislo     
+        uint8_t MsgFrom = payload[1]-'0';           // konverzia na cislo
+        SendAck(MsgFrom,payload[2]);
+        PC.printf("MSG from : %d , message number received= %d \r\n",MsgFrom,payload[2]);
+        if(payload[2] == messageNumbers[MsgFrom])
+        {
+            PC.printf("--------------------- Ta ista sprava -------------------- \r\n");
+            return;
+        }
+        messageNumbers[MsgFrom] = payload[2];
+        
+        payload[2] = 48;        // ASCII hodnota cisla 0
+        PC.printf("Message number saved= %d \r\n",messageNumbers[MsgFrom]);
+        snprintf((char *)receivedMessage, BUFF_SIZE, "%d|%d|%s|\r\n", rssi, snr, payload);
+
+//        debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" );
+        ledTicker.attach(callback(this,&RFM95W::OnLedTick), LED_BLIK_PERIOD);    
+        indicationLed=0;
+      
+        return;
+    }
+      radio.Rx(0);                  // som zakomentil :P
+};
+
+void RFM95W::OnTxTimeout( void )
+{
+    radio.Sleep();
+    Init();
+    radio.Rx(0);
+};
+
+void RFM95W::OnRxTimeout( void )
+{
+    radio.Sleep();
+    radio.Rx(0);
+};
+
+void RFM95W::OnRxError( void )
+{
+    radio.Sleep();
+    PC.printf("Chyba prijatia ! \r\n");
+    radio.Rx(0);
+};
+
+void RFM95W::OnCadDone( bool channelActivityDetected ){};
+
+void RFM95W::SendValue(uint8_t addr, float value)
+{
+    snprintf((char *)sendBuffer, BUFF_SIZE, "%d%d%c|%.2f|",GATEWAY_ID, NODE_ID, messageNumber, value);
+};
+
+float RFM95W::CalculateRandomTime()
+{
+    uint8_t number;
+    while(number == 0) {number = rand() % 1200;}
+    return (TimeOnAirSec * (number / 200.0));
+};
+
+void RFM95W::Init( void )
+{
+    PC.printf( "\n\n\r------- RFM95W GATEWAY -------\n\r" );
+    // Initialize Radio driver
+    radioEvents.TxDone = TxDone;
+    radioEvents.RxDone = RxDone;
+    radioEvents.RxError = RxError;
+    radioEvents.TxTimeout = TxTimeout;
+    radioEvents.RxTimeout = RxTimeout;
+    radioEvents.CadDone = CadDone;
+    radio.Init( &radioEvents );
+    // verify the connection with the board
+    while( radio.Read( REG_VERSION ) == 0x00  ) {
+        PC.printf( "Radiovy modul nie je pripojeny!\n\r", NULL );
+        wait(1);
+    }
+
+//    debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ) , "\n\r        > TYP: RFM95W < \n\r" );
+//    debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ) , "\n\r        > TYP: RFM95W < \n\r" );
+    radio.SetChannel( RF_FREQUENCY );
+#if USE_MODEM_LORA == 1
+
+//    debug_if( LORA_FHSS_ENABLED, "\n\r        > LORA FHSS Mod < \n\n\r");
+//    debug_if( !LORA_FHSS_ENABLED, "\n\r        > LORA Mod < \n\n\r");
+    PC.printf("\n\r        > LORA Mod <        \n\n\r");
+    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, 2000000 );
+
+    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 );
+
+#elif USE_MODEM_FSK == 1
+
+    PC.printf("\n\r        > FSK Mod <        \n\n\r");
+    radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
+                       FSK_DATARATE, 0,
+                       FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
+                       FSK_CRC_ENABLED, 0, 0, 0, 2000000 );
+
+    radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
+                       0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
+                       0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
+                       0, 0, false, true );
+
+#else
+
+#error "Nie je definovany typ modemu."
+
+#endif
+    // Konfiguracia pre moznost max. vysielacieho vykonu
+    uint8_t paConfig;
+    paConfig = radio.Read( REG_PACONFIG );
+    paConfig |= RF_PACONFIG_PASELECT_PABOOST;
+    radio.Write( REG_PACONFIG, paConfig );
+      
+    PC.printf("________Start aplikacie________\r\n" );
+    timeOnAirSec = (radio.TimeOnAir( MODEM_LORA, 10)/1000.0);              // time on air v ms
+    PC.printf( "\n\n\r------- Time on air : %f sec. -------\n\r", timeOnAirSec);
+    indicationLed = 1;
+    InitRandom();
+    messageNumber = rand();
+    radio.Rx(0);
+};
+
+void RFM95W::InitRandom()
+{
+    uint32_t seed;
+    uint8_t loops = 3;
+    for (int i=0; i<(32*loops); i++) {
+        seed ^= noise.read_u16();
+        if (seed & 1<31) { // shift left and wrap.
+            seed <<= 1;
+            seed |= 1;
+        } else
+            seed <<= 1;
+    }
+    srand(seed);
+};