Peer to peer connection to switch on a led on slave

Dependencies:   SX1272Lib mbed

Revision:
0:1392ebe3241b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Mar 21 13:18:51 2018 +0000
@@ -0,0 +1,308 @@
+#include "mbed.h"
+#include "main.h"
+#include "sx1272-hal.h"
+#include "debug.h"
+
+/* Set this flag to '1' to display debug messages on the console */
+#define DEBUG_MESSAGE   1
+
+/* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
+#define USE_MODEM_LORA  1
+#define USE_MODEM_FSK   !USE_MODEM_LORA
+
+#define RF_FREQUENCY                                    868000000 // Hz
+#define TX_OUTPUT_POWER                                 14        // 14 dBm
+
+#if USE_MODEM_LORA == 1
+
+#define LORA_BANDWIDTH                              2         // [0: 125 kHz,
+//  1: 250 kHz,
+//  2: 500 kHz,
+//  3: Reserved]
+#define LORA_SPREADING_FACTOR                       7         // [SF7..SF12]
+#define LORA_CODINGRATE                             1         // [1: 4/5,
+//  2: 4/6,
+//  3: 4/7,
+//  4: 4/8]
+#define LORA_PREAMBLE_LENGTH                        8         // Same for Tx and Rx
+#define LORA_SYMBOL_TIMEOUT                         5         // Symbols
+#define LORA_FIX_LENGTH_PAYLOAD_ON                  false
+#define LORA_FHSS_ENABLED                           false
+#define LORA_NB_SYMB_HOP                            4
+#define LORA_IQ_INVERSION_ON                        false
+#define LORA_CRC_ENABLED                            true
+
+#elif USE_MODEM_FSK == 1
+
+#define FSK_FDEV                                    25000     // Hz
+#define FSK_DATARATE                                19200     // bps
+#define FSK_BANDWIDTH                               50000     // Hz
+#define FSK_AFC_BANDWIDTH                           83333     // Hz
+#define FSK_PREAMBLE_LENGTH                         5         // Same for Tx and Rx
+#define FSK_FIX_LENGTH_PAYLOAD_ON                   false
+#define FSK_CRC_ENABLED                             true
+
+#else
+#error "Please define a modem in the compiler options."
+#endif
+
+#define RX_TIMEOUT_VALUE                                3500      // in ms
+#define BUFFER_SIZE                                     32        // Define the payload size here
+
+#if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
+DigitalOut led( LED2 );
+#else
+DigitalOut led( LED1 );
+#endif
+
+/*
+ *  Global variables declarations
+ */
+typedef enum {
+    LOWPOWER = 0,
+    IDLE,
+
+    RX,
+    RX_TIMEOUT,
+    RX_ERROR,
+
+    TX,
+    TX_TIMEOUT,
+
+    CAD,
+    CAD_DONE
+} AppStates_t;
+
+volatile AppStates_t State = RX;
+
+/*!
+ * Radio events function pointer
+ */
+static RadioEvents_t RadioEvents;
+
+/*
+ *  Global variables declarations
+ */
+SX1272MB2xAS Radio( NULL );
+
+const uint8_t PingMsg[] = "PING";
+const uint8_t PongMsg[] = "PONG";
+const uint8_t Coucou[] = "Coucou";
+const uint8_t Loulou[] = "Loulou";
+
+uint16_t BufferSize = BUFFER_SIZE;
+uint8_t Buffer[BUFFER_SIZE];
+
+int16_t RssiValue = 0.0;
+int8_t SnrValue = 0.0;
+
+
+//lecture btn
+DigitalIn mybutton(USER_BUTTON);
+
+int main( void )
+{
+    uint8_t i;
+    bool isMaster = true;
+
+    debug( "\n\n\r     SX1272 Ping Pong Demo Application \n\n\r" );
+
+    // Initialize Radio driver
+    RadioEvents.TxDone = OnTxDone;
+    RadioEvents.RxDone = OnRxDone;
+    RadioEvents.RxError = OnRxError;
+    RadioEvents.TxTimeout = OnTxTimeout;
+    RadioEvents.RxTimeout = OnRxTimeout;
+    Radio.Init( &RadioEvents );
+
+    // verify the connection with the board
+    while( Radio.Read( REG_VERSION ) == 0x00  ) {
+        debug( "Radio could not be detected!\n\r", NULL );
+        wait( 1 );
+    }
+
+    debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1272MB2XAS ) ), "\n\r > Board Type: SX1272MB2xAS < \n\r" );
+
+    Radio.SetChannel( RF_FREQUENCY );
+
+#if USE_MODEM_LORA == 1
+
+    debug_if( LORA_FHSS_ENABLED, "\n\n\r             > LORA FHSS Mode < \n\n\r" );
+    debug_if( !LORA_FHSS_ENABLED, "\n\n\r             > LORA Mode < \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, 2000 );
+
+    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
+
+    debug("\n\n\r              > FSK Mode < \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, 2000 );
+
+    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 "Please define a modem in the compiler options."
+
+#endif
+
+    debug_if( DEBUG_MESSAGE, "Starting ON/OFF LED loop\r\n" );
+
+    led = 0;
+
+    Radio.Rx( RX_TIMEOUT_VALUE );
+
+    while( 1 ) {
+        switch( State ) {
+            case RX:
+                if( BufferSize > 0 ) {
+                    if( strncmp( ( const char* )Buffer, ( const char* )Coucou, 6 ) == 0 ) {
+                        debug("LED ON");
+                        for(i=10;i<10;i++){
+                            led = 1; // LED is ON
+                        led = 0;
+                        wait(0.2); // 200 ms
+                        led = 0; // LED is OFF
+                        led= 1;
+                        wait(0.2); // 1 sec
+                            }
+                        
+                        // envoi de la réponse
+                        strcpy( ( char* )Buffer, ( char* )Loulou );
+                        // We fill the buffer with numbers for the payload
+                        for( i = 6; i < BufferSize; i++ ) {
+                            Buffer[i] = i - 6;
+                        }
+                        wait_ms( 10 );
+                        Radio.Send( Buffer, BufferSize );
+                    }
+                State = LOWPOWER;
+                break;
+            case TX:
+                debug("state = TX\r\n");
+                //led = !led;
+                Radio.Rx( RX_TIMEOUT_VALUE );
+                State = LOWPOWER;
+                break;
+            case RX_TIMEOUT:
+                debug("state = RX_TIMEOUT\r\n");
+                /*  if( isMaster == true )
+                  {
+                      // Send the next PING frame
+                      strcpy( ( char* )Buffer, ( char* )PingMsg );
+                      for( i = 4; i < BufferSize; i++ )
+                      {
+                          Buffer[i] = i - 4;
+                      }
+                      wait_ms( 10 );
+                      Radio.Send( Buffer, BufferSize );
+                  }
+                  else
+                  {
+                      Radio.Rx( RX_TIMEOUT_VALUE );
+                  }*/
+                State = LOWPOWER;
+                break;
+            case RX_ERROR:
+                debug("state = RX_ERROR\r\n");
+                // We have received a Packet with a CRC error, send reply as if packet was correct
+                /* if( isMaster == true )
+                 {
+                     // Send the next PING frame
+                     strcpy( ( char* )Buffer, ( char* )PingMsg );
+                     for( i = 4; i < BufferSize; i++ )
+                     {
+                         Buffer[i] = i - 4;
+                     }
+                     wait_ms( 10 );
+                     Radio.Send( Buffer, BufferSize );
+                 }
+                 else
+                 {
+                     // Send the next PONG frame
+                     strcpy( ( char* )Buffer, ( char* )PongMsg );
+                     for( i = 4; i < BufferSize; i++ )
+                     {
+                         Buffer[i] = i - 4;
+                     }
+                     wait_ms( 10 );
+                     Radio.Send( Buffer, BufferSize );
+                 }*/
+                State = LOWPOWER;
+                break;
+            case TX_TIMEOUT:
+                debug("state = TX_TIMEOUT\r\n");
+                Radio.Rx( RX_TIMEOUT_VALUE );
+                State = RX;
+                break;
+            case LOWPOWER:
+                // debug("state = LOWPOWER\r\n");
+                //State = RX;
+                break;
+            default:
+                debug("default\r\n");
+                State = RX;
+                break;
+        }
+
+
+    }
+
+
+
+}
+
+void OnTxDone( void )
+{
+    Radio.Sleep( );
+    State = TX;
+    debug_if( DEBUG_MESSAGE, "> Transmission terminee\n\r" );
+}
+
+void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
+{
+    Radio.Sleep( );
+    BufferSize = size;
+    memcpy( Buffer, payload, BufferSize );
+    RssiValue = rssi;
+    SnrValue = snr;
+    State = RX;
+    debug_if( DEBUG_MESSAGE, "> Reception terminee \n\r" );
+}
+
+void OnTxTimeout( void )
+{
+    Radio.Sleep( );
+    State = TX_TIMEOUT;
+    debug_if( DEBUG_MESSAGE, "> Transmission timeout\n\r" );
+}
+
+void OnRxTimeout( void )
+{
+    Radio.Sleep( );
+    Buffer[BufferSize] = 0;
+    State = RX_TIMEOUT;
+    debug_if( DEBUG_MESSAGE, "> Reception timeout\n\r" );
+}
+
+void OnRxError( void )
+{
+    Radio.Sleep( );
+    State = RX_ERROR;
+    debug_if( DEBUG_MESSAGE, "> Erreur de reception \n\r" );
+}