Updated Nov. 18th.

Dependencies:   SX1276Lib_modtronix

Fork of SX1276PingPong by Semtech

Files at this revision

API Documentation at this revision

Comitter:
AMNoll
Date:
Sun Nov 19 18:22:07 2017 +0000
Parent:
15:8b35dd7c1436
Commit message:
Updated Nov. 18th

Changed in this revision

README.md Show annotated file Show diff for this revision Revisions of this file
SX1276Lib.lib Show diff for this revision Revisions of this file
SX1276Lib_modtronix.lib Show annotated file Show diff for this revision Revisions of this file
img/uvision.png 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-os.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show diff for this revision Revisions of this file
diff -r 8b35dd7c1436 -r 4051b7c16410 README.md
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Sun Nov 19 18:22:07 2017 +0000
@@ -0,0 +1,87 @@
+# Getting started with Blinky on mbed OS
+
+This guide reviews the steps required to get Blinky working on an mbed OS platform.
+
+Please install [mbed CLI](https://github.com/ARMmbed/mbed-cli#installing-mbed-cli).
+
+## Import the example application
+
+From the command-line, import the example:
+
+```
+mbed import mbed-os-example-blinky
+cd mbed-os-example-blinky
+```
+
+### Now compile
+
+Invoke `mbed compile`, and specify the name of your platform and your favorite toolchain (`GCC_ARM`, `ARM`, `IAR`). For example, for the ARM Compiler 5:
+
+```
+mbed compile -m K64F -t ARM
+```
+
+Your PC may take a few minutes to compile your code. At the end, you see the following result:
+
+```
+[snip]
++----------------------------+-------+-------+------+
+| Module                     | .text | .data | .bss |
++----------------------------+-------+-------+------+
+| Misc                       | 13939 |    24 | 1372 |
+| core/hal                   | 16993 |    96 |  296 |
+| core/rtos                  |  7384 |    92 | 4204 |
+| features/FEATURE_IPV4      |    80 |     0 |  176 |
+| frameworks/greentea-client |  1830 |    60 |   44 |
+| frameworks/utest           |  2392 |   512 |  292 |
+| Subtotals                  | 42618 |   784 | 6384 |
++----------------------------+-------+-------+------+
+Allocated Heap: unknown
+Allocated Stack: unknown
+Total Static RAM memory (data + bss): 7168 bytes
+Total RAM memory (data + bss + heap + stack): 7168 bytes
+Total Flash memory (text + data + misc): 43402 bytes
+Image: .\.build\K64F\ARM\mbed-os-example-blinky.bin
+```
+
+### Program your board
+
+1. Connect your mbed device to the computer over USB.
+1. Copy the binary file to the mbed device.
+1. Press the reset button to start the program.
+
+The LED on your platform turns on and off.
+
+## Export the project to Keil MDK, and debug your application
+
+From the command-line, run the following command:
+
+```
+mbed export -m K64F -i uvision
+```
+
+To debug the application:
+
+1. Start uVision.
+1. Import the uVision project generated earlier.
+1. Compile your application, and generate an `.axf` file.
+1. Make sure uVision is configured to debug over CMSIS-DAP (From the Project menu > Options for Target '...' > Debug tab > Use CMSIS-DAP Debugger).
+1. Set breakpoints, and start a debug session.
+
+![Image of uVision](img/uvision.png)
+
+## Troubleshooting
+
+1. Make sure `mbed-cli` is working correctly and its version is `>1.0.0`
+
+ ```
+ mbed --version
+ ```
+
+ If not, you can update it:
+
+ ```
+ pip install mbed-cli --upgrade
+ ```
+
+2. If using Keil MDK, make sure you have a license installed. [MDK-Lite](http://www.keil.com/arm/mdk.asp) has a 32 KB restriction on code size.
\ No newline at end of file
diff -r 8b35dd7c1436 -r 4051b7c16410 SX1276Lib.lib
--- a/SX1276Lib.lib	Mon Apr 24 09:29:45 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://developer.mbed.org/teams/Semtech/code/SX1276Lib/#d09a8ef807e2
diff -r 8b35dd7c1436 -r 4051b7c16410 SX1276Lib_modtronix.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SX1276Lib_modtronix.lib	Sun Nov 19 18:22:07 2017 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/Capstone/code/SX1276Lib_modtronix/#ad32782125eb
diff -r 8b35dd7c1436 -r 4051b7c16410 img/uvision.png
Binary file img/uvision.png has changed
diff -r 8b35dd7c1436 -r 4051b7c16410 main.cpp
--- a/main.cpp	Mon Apr 24 09:29:45 2017 +0000
+++ b/main.cpp	Sun Nov 19 18:22:07 2017 +0000
@@ -1,347 +1,337 @@
-#include "mbed.h"
-#include "main.h"
-#include "sx1276-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 = LOWPOWER;
-
-/*!
- * Radio events function pointer
- */
-static RadioEvents_t RadioEvents;
-
-/*
- *  Global variables declarations
- */
-SX1276MB1xAS 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;
-
-int main( void ) 
-{
-    uint8_t i;
-    bool isMaster = true;
-
-    debug( "\n\n\r     SX1276 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( ) == SX1276MB1LAS ) ), "\n\r > Board Type: SX1276MB1LAS < \n\r" );
-    debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ), "\n\r > Board Type: SX1276MB1MAS < \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 Ping-Pong loop\r\n" );
-
-    led = 0;
-
-    Radio.Rx( RX_TIMEOUT_VALUE );
-
-    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 );
-                    }
-                }
-            }
-            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 );
-            }
-            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 );
-            }
-            State = LOWPOWER;
-            break;
-        case TX_TIMEOUT:
-            Radio.Rx( RX_TIMEOUT_VALUE );
-            State = LOWPOWER;
-            break;
-        case LOWPOWER:
-            break;
-        default:
-            State = LOWPOWER;
-            break;
-        }
-    }
-}
-
-void OnTxDone( void )
-{
-    Radio.Sleep( );
-    State = TX;
-    debug_if( DEBUG_MESSAGE, "> OnTxDone\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, "> OnRxDone\n\r" );
-}
-
-void OnTxTimeout( void )
-{
-    Radio.Sleep( );
-    State = TX_TIMEOUT;
-    debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
-}
-
-void OnRxTimeout( void )
-{
-    Radio.Sleep( );
-    Buffer[BufferSize] = 0;
-    State = RX_TIMEOUT;
-    debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
-}
-
-void OnRxError( void )
-{
-    Radio.Sleep( );
-    State = RX_ERROR;
-    debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
-}
+#include "mbed.h"
+#include "sx1276Regs-LoRa.h"
+#include "sx1276-inAir.h"
+ 
+#define DEBUG                           1
+ 
+#define RF_FREQUENCY                    915000000           // 915MHz
+#define TX_OUTPUT_POWER                 14                  // 14 dBm for inAir9
+#define LORA_BANDWIDTH                  7                   // 0: 7.8 kHz,  1: 10.4 kHz, 2: 15.6kHz, 3: 20.8kHz,
+                                                            // 4: 31.25kHz, 5: 41.7 kHz, 6: 62.5 kHz,
+                                                            // 7: 125 kHz,  8: 250 kHz,  9: 500 kHz
+#define LORA_SPREADING_FACTOR           12                  // 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
+ 
+#define TX_TIMEOUT_VALUE                2000000
+#define RX_TIMEOUT_VALUE                3500000     // in us
+#define BUFFER_SIZE                     32          // Define the payload size here
+ 
+ 
+void OnTxDone(void);
+void OnTxTimeout(void);
+void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr);
+void OnRxTimeout(void);
+void OnRxError(void);
+ 
+Serial      pc(USBTX, USBRX);   //Use default TX and RX. Available via USB Com port when using PGM-NUCLEO programmer
+SX1276inAir radio(OnTxDone, OnTxTimeout, OnRxDone, OnRxTimeout, OnRxError, NULL, NULL);
+DigitalOut led(LED1);
+ 
+uint8_t Buffer[BUFFER_SIZE];
+uint16_t BufferSize = BUFFER_SIZE;
+int16_t LoRaRssi;
+int8_t LoRaSNR;
+volatile RadioState State = LOWPOWER;
+
+const uint8_t PingMsg[] = "PING";
+const uint8_t PongMsg[] = "PONG";
+ 
+int main() { 
+    wait_ms(500); // start delay
+ 
+    // configure uart port
+    pc.baud(9600);
+    pc.format(8, SerialBase::None, 1);
+    pc.printf("PC printing enabled\n\r");
+    wait(2);
+    // configure radio
+    radio.SetBoardType(BOARD_INAIR9); // the correct hardware for our own board
+    pc.printf("Board type set\n\r");
+    
+    /*
+    while (true) {
+        led = !led;
+        pc.printf("loop reached\n\r");
+        wait(2);
+    }*/
+    
+    led = 0;
+    while (radio.Read(REG_VERSION) == 0x00)
+    {
+        pc.printf("Trying to connect to radio device\r\n");
+        wait_ms(200);
+    }
+    led = 1;
+ 
+    pc.printf("%u",radio.Read(REG_VERSION));
+    pc.printf("Radio is initialized\r\n");
+ 
+    // set radio frequency
+    radio.SetChannel(RF_FREQUENCY);
+ 
+    pc.printf("Freq set to 915 MHz\r\n");
+ 
+    // setup the modern
+    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,
+            TX_TIMEOUT_VALUE
+    );
+    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
+    );
+    pc.printf("TX and RX configured\r\n");
+ 
+    uint8_t i;
+    bool isMaster = true;
+ 
+    pc.printf("before .Rx\r\n");
+    radio.Rx(RX_TIMEOUT_VALUE);
+    pc.printf("RX_TIMEOUT_VALUE RX set\r\n");
+ 
+    State = RX_TIMEOUT;
+    
+    while (1)
+    {
+        // Check for connection to radio module
+        while (radio.Read(REG_VERSION) == 0x00)
+        {
+            led = !led;
+            pc.printf("Reconnecting...\r\n");
+            wait_ms(200);
+        }
+        led = 1;
+    
+        pc.printf("%s\r\n",State );
+        //pc.printf("About to check State value\r\n");
+        
+        switch(State)
+        {
+        case RX_DONE:
+            if (isMaster)
+            {
+                if (BufferSize > 0)
+                {
+                    if (strncmp((const char *)Buffer, (const char *)PongMsg, 4) == 0)
+                    {
+                        pc.printf("...Pong\r\n");
+                        // send next ping frame
+                        strcpy((char *)Buffer, (char *)PingMsg);
+                        // 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
+                        pc.printf("...Ping\r\n");
+                        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
+                    {
+                        isMaster = true;
+                        radio.Rx(RX_TIMEOUT_VALUE);
+                    }
+                }
+            }
+            else
+            {
+                if (BufferSize > 0)
+                {
+                    if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
+                    {
+                        pc.printf( "...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;
+            pc.printf( "\r\n");
+            break;
+ 
+        case TX_DONE:
+            if (isMaster)
+            {
+                pc.printf("Ping...\r\n");
+            }
+            else
+            {
+                pc.printf("Pong...\r\n");
+            }
+            radio.Rx(RX_TIMEOUT_VALUE);
+            State = LOWPOWER;
+            break;
+ 
+        case RX_TIMEOUT:
+            if( isMaster == true )
+            {
+                pc.printf("trying to send ping\r\n");
+                // 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 TX_TIMEOUT:
+            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 );
+            }
+            State = LOWPOWER;
+            break;
+ 
+        case LOWPOWER:
+            break;
+ 
+        default:
+            State = LOWPOWER;
+            break;
+        }
+    }
+} 
+
+
+void OnTxDone(void)
+{
+    radio.Sleep();
+    State = TX_DONE;
+ 
+#if DEBUG == 1
+    pc.printf("OnTxDone\r\n");
+#endif
+}
+ 
+void OnTxTimeout(void)
+{
+    radio.Sleep();
+    State = TX_TIMEOUT;
+ 
+#if DEBUG == 1
+    pc.printf("OnTxTimeout\r\n");
+#endif
+}
+ 
+void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
+{
+    radio.Sleep();
+    BufferSize = size;
+    memcpy(Buffer, payload, BufferSize);
+    LoRaRssi = rssi;
+    LoRaSNR = snr;
+    State = RX_DONE;
+ 
+#if DEBUG == 1
+    pc.printf("OnRxDone\r\n");
+#endif
+}
+ 
+void OnRxTimeout(void)
+{
+    radio.Sleep();
+    Buffer[BufferSize] = 0;
+    State = RX_TIMEOUT;
+ 
+#if DEBUG == 1
+    pc.printf("OnRxTimeout\r\n");
+#endif
+}
+ 
+void OnRxError(void)
+{
+    radio.Sleep();
+    State = RX_ERROR;
+ 
+#if DEBUG == 1
+    pc.printf("OnRxError\r\n");
+#endif
+}
diff -r 8b35dd7c1436 -r 4051b7c16410 mbed-os.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os.lib	Sun Nov 19 18:22:07 2017 +0000
@@ -0,0 +1,1 @@
+https://github.com/ARMmbed/mbed-os/#78474a5129e18e136cc7e872adbaa5b74fbb8f6a
diff -r 8b35dd7c1436 -r 4051b7c16410 mbed.bld
--- a/mbed.bld	Mon Apr 24 09:29:45 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://mbed.org/users/mbed_official/code/mbed/builds/97feb9bacc10
\ No newline at end of file