Jérémy RAKOTOARISOA / Mbed 2 deprecated SX1272Receiver

Dependencies:   SX1272Lib mbed

Fork of SX1272PingPong by Semtech

Files at this revision

API Documentation at this revision

Comitter:
jerem28
Date:
Wed Jan 25 12:16:30 2017 +0000
Parent:
13:edb9b443c1dd
Child:
15:9c3805baa6c1
Commit message:
SX1272 Receiver/Transmitter program based on SX1272PingPong and SX1276Receiver repository from Didier Donsez

Changed in this revision

SX1272Lib.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/SX1272Lib.lib	Wed Feb 17 09:17:46 2016 +0000
+++ b/SX1272Lib.lib	Wed Jan 25 12:16:30 2017 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/teams/Semtech/code/SX1272Lib/#cd1093b6676f
+http://mbed.org/teams/Semtech/code/SX1272Lib/#69d5976b504d
--- a/main.cpp	Wed Feb 17 09:17:46 2016 +0000
+++ b/main.cpp	Wed Jan 25 12:16:30 2017 +0000
@@ -3,23 +3,41 @@
 #include "sx1272-hal.h"
 #include "debug.h"
 
+/* CONFIGURATION */
+
+#define NODE_ADDR 0x411A
+
 /* Set this flag to '1' to display debug messages on the console */
 #define DEBUG_MESSAGE   1
 
+#define RX_MODE 1
+
+#define TX_MODE !RX_MODE
+
+/* Set the mode RX_MODE or TX_MODE */
+#define MODE TX_MODE
+
+/* Set the delay (according the duty cycle for the ISM band of the frequency RF_FREQUENCY */
+
+#define DUTY_CYCLE 0.01
+//#define DELAY_NEXT_TX_IN_MILLISEC ((int)((timeOnAirInMilli / DUTY_CYCLE)-timeOnAirInMilli))
+
+#define DELAY_NEXT_TX_IN_MILLISEC 5000
+
 /* 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 RF_FREQUENCY                                    868100000 // Hz
 #define TX_OUTPUT_POWER                                 14        // 14 dBm
 
 #if USE_MODEM_LORA == 1
 
-    #define LORA_BANDWIDTH                              2         // [0: 125 kHz,
+    #define LORA_BANDWIDTH                              0         // [0: 125 kHz,
                                                                   //  1: 250 kHz,
                                                                   //  2: 500 kHz,
                                                                   //  3: Reserved]
-    #define LORA_SPREADING_FACTOR                       7         // [SF7..SF12]
+    #define LORA_SPREADING_FACTOR                       12         // [SF7..SF12]
     #define LORA_CODINGRATE                             1         // [1: 4/5,
                                                                   //  2: 4/6,
                                                                   //  3: 4/7,
@@ -46,8 +64,11 @@
     #error "Please define a modem in the compiler options."
 #endif
 
-#define RX_TIMEOUT_VALUE                                3500000   // in us
-#define BUFFER_SIZE                                     32        // Define the payload size here
+#define RX_TIMEOUT_VALUE                                1000000000   // in us
+#define BUFFER_SIZE                                     17        // Define the payload size here
+
+
+Serial pc(USBTX,USBRX);
 
 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
 DigitalOut led(LED2);
@@ -85,23 +106,37 @@
  *  Global variables declarations
  */
 SX1272MB2xAS Radio( NULL );
-
-const uint8_t PingMsg[] = "PING";
-const uint8_t PongMsg[] = "PONG";
-
 uint16_t BufferSize = BUFFER_SIZE;
 uint8_t Buffer[BUFFER_SIZE];
 
-int16_t RssiValue = 0.0;
-int8_t SnrValue = 0.0;
+int16_t RssiValue = 0;
+int8_t SnrValue = 0;
+int8_t TemperatureValue = 0;
+
+ModemType Modem;
+
+uint16_t SeqNum = 0;
+
+// Address of the Source Node
+uint16_t NodeSrcAddr = NODE_ADDR;
+
+void hexprintf(Serial* pc, const uint8_t* buffer, uint16_t size)
+{
+    for(uint16_t count = 0; count < size; count++)
+    {
+        pc->printf("%02x", buffer[count]);
+    }
+}
+const uint8_t Msg[] = "TEST**##abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrs#"; /* abc.. is for padding */
 
 int main() 
 {
-    uint8_t i;
-    bool isMaster = true;
+
+    pc.format(8, Serial::None, 1);
+    pc.baud(115200);
     
-    debug( "\n\n\r     SX1272 Ping Pong Demo Application \n\n\r" );
-
+    debug( ">INFO RX/TX Modem \r\n\n" );
+    
     // Initialize Radio driver
     RadioEvents.TxDone = OnTxDone;
     RadioEvents.RxDone = OnRxDone;
@@ -156,146 +191,90 @@
 #error "Please define a modem in the compiler options."
 
 #endif
-     
-    debug_if( DEBUG_MESSAGE, "Starting Ping-Pong loop\r\n" ); 
-        
-    led = 0;
-        
+     led = 0;
+#if MODE == RX_MODE
+     debug_if( DEBUG_MESSAGE, ">INFO Starting RX loop\r\n" ); 
+
+    // start RX
     Radio.Rx( RX_TIMEOUT_VALUE );
+    State = LOWPOWER;
     
+#elif MODE == TX_MODE
+    debug_if( DEBUG_MESSAGE, ">INFO Starting TX loop\r\n" ); 
+    State = TX;
+    
+#else
+#error "Please define a valid mode (RX_MODE, TX_MODE)."
+#endif
+
+// TODO ECHO_MODE : RX_MODE then TX_MODE
+
     while( 1 )
     {
         switch( State )
         {
         case RX:
-            if( isMaster == true )
-            {
                 if( BufferSize > 0 )
                 {
-                    if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 )
-                    {
-                        led = !led;
-                        debug( "...Pong\r\n" );
-                        // Send the next PING frame            
-                        strcpy( ( char* )Buffer, ( char* )PingMsg );
-                        // We fill the buffer with numbers for the payload 
-                        for( i = 4; i < BufferSize; i++ )
-                        {
-                            Buffer[i] = i - 4;
-                        }
-                        wait_ms( 10 ); 
-                        Radio.Send( Buffer, BufferSize );
-                    }
-                    else if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
-                    { // A master already exists then become a slave
-                        debug( "...Ping\r\n" );
-                        led = !led;
-                        isMaster = false;
-                        // Send the next PONG frame            
-                        strcpy( ( char* )Buffer, ( char* )PongMsg );
-                        // We fill the buffer with numbers for the payload 
-                        for( i = 4; i < BufferSize; i++ )
-                        {
-                            Buffer[i] = i - 4;
-                        }
-                        wait_ms( 10 ); 
-                        Radio.Send( Buffer, BufferSize );
-                    }
-                    else // valid reception but neither a PING or a PONG message
-                    {    // Set device as master ans start again
-                        isMaster = true;
-                        Radio.Rx( RX_TIMEOUT_VALUE );
-                    }    
+                    led = !led; // Invert LED
+
+                    
+                    // TODO ADD  tmst | number | Internal timestamp of "RX finished" event (32b unsigned)
+
+                    pc.printf(">INFO RX modem=%d size=%d rssi=%d temp=%d snr=%d freq=%d bw=%d sf=%d cr=%d buffer=",
+                        Modem, BufferSize, RssiValue, TemperatureValue, SnrValue, RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE );
+                    hexprintf(&pc, Buffer, BufferSize);
+                    pc.printf("\r\n");
+
+                    pc.printf("RX;%d;%d;%d;%d;%d;%d;%d;%d;",
+                        Modem, BufferSize, RssiValue, SnrValue, RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE );
+                    hexprintf(&pc, Buffer, BufferSize);
+                    pc.printf("\r\n");
+//                        wait_ms( 10 ); 
+                    Radio.Rx( RX_TIMEOUT_VALUE );
                 }
-            }
-            else
-            {
-                if( BufferSize > 0 )
-                {
-                    if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
-                    {
-                        led = !led;
-                        debug( "...Ping\r\n" );
-                        // Send the reply to the PING string
-                        strcpy( ( char* )Buffer, ( char* )PongMsg );
-                        // We fill the buffer with numbers for the payload 
-                        for( i = 4; i < BufferSize; i++ )
-                        {
-                            Buffer[i] = i - 4;
-                        }
-                        wait_ms( 10 );  
-                        Radio.Send( Buffer, BufferSize );
-                    }
-                    else // valid reception but not a PING as expected
-                    {    // Set device as master and start again
-                        isMaster = true;
-                        Radio.Rx( RX_TIMEOUT_VALUE );
-                    }    
-                }
-            }
-            State = LOWPOWER;
-            break;
-        case TX:    
-            led = !led; 
-            if( isMaster == true )  
-            {
-                debug( "Ping...\r\n" );
-            }
-            else
-            {
-                debug( "Pong...\r\n" );
-            }
-            Radio.Rx( RX_TIMEOUT_VALUE );
+            
             State = LOWPOWER;
             break;
         case RX_TIMEOUT:
-            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 );  
-            }             
+            Radio.Rx( RX_TIMEOUT_VALUE );  
             State = LOWPOWER;
             break;
         case RX_ERROR:
-            // 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 );
-            }
+            // We have received a Packet with a CRC error
+            pc.printf(">INFO RX_ERROR size=%d\r\n", BufferSize); 
+            pc.printf("RX_ERROR;%d\r\n", BufferSize); 
+            Radio.Rx( RX_TIMEOUT_VALUE );  
             State = LOWPOWER;
             break;
         case TX_TIMEOUT:
-            Radio.Rx( RX_TIMEOUT_VALUE );
+            pc.printf(">TX: TIMEOUT\r\n");
+        case TX:
+            int timeOnAirInMilli = Radio.TimeOnAir(Modem,BufferSize)/1000;
+            if(DELAY_NEXT_TX_IN_MILLISEC!=0) {
+                pc.printf(">INFO: wait %.4f sec before TX\r\n", DELAY_NEXT_TX_IN_MILLISEC/1000.0);
+                wait_ms( DELAY_NEXT_TX_IN_MILLISEC );
+            }
+            led = !led; // Invert LED
+            memcpy(( char* )Buffer, ( char* ) Msg, BufferSize);
+            ++SeqNum;
+            
+            TemperatureValue = Radio.Read( REG_TEMP );
+            
+            /* refresh counters in payload (big endian, for readability) */
+            Buffer[4] = (uint8_t)(SeqNum >> 8); /* MSB */
+            Buffer[5] = (uint8_t)(SeqNum & 0x00FF); /* LSB */
+            Buffer[6] = (uint8_t)(NodeSrcAddr >> 8); /* MSB */
+            Buffer[7] = (uint8_t)(NodeSrcAddr & 0x00FF); /* LSB */
+            Buffer[8] = (uint8_t)(TemperatureValue >> 8); /* MSB */
+            Buffer[9] = (uint8_t)(TemperatureValue & 0x00FF); /* LSB */
+
+            /* send packet */
+            pc.printf(">TX: temp=%d src=%4x seqnum=%u size=%d timeOnAir=%.4f\r\n", TemperatureValue, NodeSrcAddr, SeqNum, BufferSize, timeOnAirInMilli/1000.0);
+            wait_ms( 10 ); 
+            Radio.Send( Buffer, BufferSize );
             State = LOWPOWER;
-            break;
+            break;            
         case LOWPOWER:
             break;
         default:
@@ -344,4 +323,3 @@
     State = RX_ERROR;
     debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
 }
-
--- a/mbed.bld	Wed Feb 17 09:17:46 2016 +0000
+++ b/mbed.bld	Wed Jan 25 12:16:30 2017 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/165afa46840b
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/ad3be0349dc5
\ No newline at end of file