Astek

Dependencies:   mbed GPS_I2C_astek Sensors LSM9DS1 DigitDisplay Chainable_RGB_LED LoRaWAN-lib SX1272Lib

Files at this revision

API Documentation at this revision

Comitter:
RoddyRod
Date:
Fri Dec 27 16:05:09 2019 +0000
Parent:
9:0083afd69815
Commit message:
astek;

Changed in this revision

GPS_I2C.lib Show annotated file Show diff for this revision Revisions of this file
LSM9DS1.lib Show annotated file Show diff for this revision Revisions of this file
Sensors.lib Show annotated file Show diff for this revision Revisions of this file
app/Commissioning.h Show annotated file Show diff for this revision Revisions of this file
app/main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS_I2C.lib	Fri Dec 27 16:05:09 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/RoddyRod/code/GPS_I2C_astek/#f4c7ece483fe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LSM9DS1.lib	Fri Dec 27 16:05:09 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/RoddyRod/code/LSM9DS1/#4b0b0a4b20e3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sensors.lib	Fri Dec 27 16:05:09 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/RoddyRod/code/Sensors/#ea630d259217
--- a/app/Commissioning.h	Mon Apr 24 13:31:49 2017 +0000
+++ b/app/Commissioning.h	Fri Dec 27 16:05:09 2019 +0000
@@ -19,7 +19,7 @@
  * When set to 1 the application uses the Over-the-Air activation procedure
  * When set to 0 the application uses the Personalization activation procedure
  */
-#define OVER_THE_AIR_ACTIVATION                     1
+#define OVER_THE_AIR_ACTIVATION                     0
 
 /*!
  * Indicates if the end-device is to be connected to a private or public network
@@ -35,17 +35,17 @@
 /*!
  * Mote device IEEE EUI (big endian)
  */
-#define LORAWAN_DEVICE_EUI                          { IEEE_OUI, 0x44, 0x55, 0x66, 0x77, 0x88 }
+#define LORAWAN_DEVICE_EUI                          { 0x00, 0x8F, 0xD4, 0x7D, 0xF8, 0x2D, 0xC8, 0xBC }
 
 /*!
  * Application IEEE EUI (big endian)
  */
-#define LORAWAN_APPLICATION_EUI                     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+#define LORAWAN_APPLICATION_EUI                     { 0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x00, 0xFB, 0xF8 }
 
 /*!
  * AES encryption/decryption cipher application key
  */
-#define LORAWAN_APPLICATION_KEY                     { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
+#define LORAWAN_APPLICATION_KEY                     { 0x87, 0xD3, 0xDC, 0x3E, 0xAD, 0x15, 0xC0, 0x19, 0x6D, 0x1A, 0x72, 0x2F, 0x0C, 0xD8, 0x98, 0x1B }
 
 /*!
  * Current network ID
@@ -55,16 +55,16 @@
 /*!
  * Device address on the network (big endian)
  */
-#define LORAWAN_DEVICE_ADDRESS                      ( uint32_t )0x12345678
+#define LORAWAN_DEVICE_ADDRESS                      ( uint32_t )0x26011563
 
 /*!
  * AES encryption/decryption cipher network session key
  */
-#define LORAWAN_NWKSKEY                             { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
+#define LORAWAN_NWKSKEY                             { 0x03, 0x94, 0x81, 0x56, 0x85, 0xFD, 0xC9, 0xF0, 0xC0, 0x3F, 0x57, 0xF9, 0xB3, 0x04, 0x90, 0x3B }
 
 /*!
  * AES encryption/decryption cipher application session key
  */
-#define LORAWAN_APPSKEY                             { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
+#define LORAWAN_APPSKEY                             { 0x87, 0xD3, 0xDC, 0x3E, 0xAD, 0x15, 0xC0, 0x19, 0x6D, 0x1A, 0x72, 0x2F, 0x0C, 0xD8, 0x98, 0x1B }
 
 #endif // __LORA_COMMISSIONING_H__
--- a/app/main.cpp	Mon Apr 24 13:31:49 2017 +0000
+++ b/app/main.cpp	Fri Dec 27 16:05:09 2019 +0000
@@ -22,6 +22,10 @@
 #include "DigitDisplay.h"
 #include "ChainableLED.h"
 
+#include "GPS_I2C.h"
+#include "LSM9DS1.h"
+#include "Sensors.h"
+
 /*!
  * Defines the application data transmission duty cycle. 5s, value in [ms].
  */
@@ -89,7 +93,7 @@
 #define LORAWAN_APP_DATA_SIZE                       6
 
 #else
-#define LORAWAN_APP_DATA_SIZE                       5
+#define LORAWAN_APP_DATA_SIZE                       8
 
 #endif
 
@@ -122,7 +126,7 @@
 /*!
  * User application data buffer size
  */
-#define LORAWAN_APP_DATA_MAX_SIZE                           64
+#define LORAWAN_APP_DATA_MAX_SIZE                          64
 
 /*!
  * User application data
@@ -167,62 +171,23 @@
  */
 static bool NextTx = true;
 
-/*!
- * Hold the value returned from the Light Sensor
- */
-static float LightValue = 0.0;
-
-/*!
- * Control the 3-color LED 
- * 0: automatic (LED goes brigther as the light decrease, 
- * 1: manual (The LED is controlled by the user)
- */
-static uint8_t LightMode = 0;  // 0: automatic, 1: manual
-
-/*!
- * Ticker to create a PWM for the buzzer
- */
-Ticker BuzzerTimer;
-
-
-/*!
- * Constructor for Buzzer
- */
-DigitalOut Buzzer( A3 );
-
-/*!
- * Constructor for the 3-color LED
- */
-#define NUM_LED 3
-ChainableLED ColorLed( D6, D7, NUM_LED );
-
-/*!
- * Constructor for Light Sensor
- */
-AnalogIn LightSens( A1 ); 
-
-/*!
- * Constructor for 4 Digit 7 semgent display
- */
-DigitDisplay Display( D8, D9 );
-
+GPS_I2C myGPS_I2C(I2C_SDA, I2C_SCL, I2C_SPEED_FAST);
+LSM9DS1 myIMU(I2C_SDA, I2C_SCL, 0xD6, 0x3C);
 /*!
  * Device states
  */
-static enum eDeviceState
-{
+static enum eDeviceState {
     DEVICE_STATE_INIT,
     DEVICE_STATE_JOIN,
     DEVICE_STATE_SEND,
     DEVICE_STATE_CYCLE,
     DEVICE_STATE_SLEEP
-}DeviceState;
+} DeviceState;
 
 /*!
  * LoRaWAN compliance tests support data
  */
-struct ComplianceTest_s
-{
+struct ComplianceTest_s {
     bool Running;
     uint8_t State;
     bool IsTxConfirmed;
@@ -233,7 +198,7 @@
     bool LinkCheck;
     uint8_t DemodMargin;
     uint8_t NbGateways;
-}ComplianceTest;
+} ComplianceTest;
 
 /*
  * SerialDisplay managment variables
@@ -247,22 +212,20 @@
 /*!
  * Strucure containing the Uplink status
  */
-struct sLoRaMacUplinkStatus
-{
+struct sLoRaMacUplinkStatus {
     uint8_t Acked;
     int8_t Datarate;
     uint16_t UplinkCounter;
     uint8_t Port;
     uint8_t *Buffer;
     uint8_t BufferSize;
-}LoRaMacUplinkStatus;
+} LoRaMacUplinkStatus;
 volatile bool UplinkStatusUpdated = false;
 
 /*!
  * Strucure containing the Downlink status
  */
-struct sLoRaMacDownlinkStatus
-{
+struct sLoRaMacDownlinkStatus {
     int16_t Rssi;
     int8_t Snr;
     uint16_t DownlinkCounter;
@@ -270,7 +233,7 @@
     uint8_t Port;
     uint8_t *Buffer;
     uint8_t BufferSize;
-}LoRaMacDownlinkStatus;
+} LoRaMacDownlinkStatus;
 volatile bool DownlinkStatusUpdated = false;
 
 void SerialDisplayRefresh( void )
@@ -301,16 +264,14 @@
     SerialDisplayUpdateDutyCycle( false );
 #endif
     SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
-    
+
     SerialDisplayUpdateLedState( 3, AppLedStateOn );
 }
 
 void SerialRxProcess( void )
 {
-    if( SerialDisplayReadable( ) == true )
-    {
-        switch( SerialDisplayGetChar( ) )
-        {
+    if( SerialDisplayReadable( ) == true ) {
+        switch( SerialDisplayGetChar( ) ) {
             case 'R':
             case 'r':
                 // Refresh Serial screen
@@ -327,23 +288,15 @@
  */
 static void PrepareTxFrame( uint8_t port )
 {
-    switch( port )
-    {
-    case 10:
-        {  
-            uint32_t tempValue = ( uint32_t )( LightValue * 1000000.0 );
-            AppData[0] = LightMode;
-            AppData[1] = ( ( tempValue & 0xFF000000 ) >> 24 ) & 0xFF;
-            AppData[2] = ( ( tempValue & 0x00FF0000 ) >> 16 ) & 0xFF;
-            AppData[3] = ( ( tempValue & 0x0000FF00 ) >> 8 ) & 0xFF;
-            AppData[4] = ( tempValue & 0x000000FF );
+    switch( port ) {
+        case 10: {
+            string nmea_sentence = "$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A";
+            strcpy((char*)AppData, nmea_sentence.c_str());
         }
         break;
-    case 15:
-        {
+        case 15: {
             AppData[0] = AppLedStateOn;
-            if( IsTxConfirmed == true )
-            {
+            if( IsTxConfirmed == true ) {
                 AppData[1] = LoRaMacDownlinkStatus.DownlinkCounter >> 8;
                 AppData[2] = LoRaMacDownlinkStatus.DownlinkCounter;
                 AppData[3] = LoRaMacDownlinkStatus.Rssi >> 8;
@@ -352,33 +305,29 @@
             }
         }
         break;
-    case 224:
-        if( ComplianceTest.LinkCheck == true )
-        {
-            ComplianceTest.LinkCheck = false;
-            AppDataSize = 3;
-            AppData[0] = 5;
-            AppData[1] = ComplianceTest.DemodMargin;
-            AppData[2] = ComplianceTest.NbGateways;
-            ComplianceTest.State = 1;
-        }
-        else
-        {
-            switch( ComplianceTest.State )
-            {
-            case 4:
+        case 224:
+            if( ComplianceTest.LinkCheck == true ) {
+                ComplianceTest.LinkCheck = false;
+                AppDataSize = 3;
+                AppData[0] = 5;
+                AppData[1] = ComplianceTest.DemodMargin;
+                AppData[2] = ComplianceTest.NbGateways;
                 ComplianceTest.State = 1;
-                break;
-            case 1:
-                AppDataSize = 2;
-                AppData[0] = ComplianceTest.DownLinkCounter >> 8;
-                AppData[1] = ComplianceTest.DownLinkCounter;
-                break;
+            } else {
+                switch( ComplianceTest.State ) {
+                    case 4:
+                        ComplianceTest.State = 1;
+                        break;
+                    case 1:
+                        AppDataSize = 2;
+                        AppData[0] = ComplianceTest.DownLinkCounter >> 8;
+                        AppData[1] = ComplianceTest.DownLinkCounter;
+                        break;
+                }
             }
-        }
-        break;
-    default:
-        break;
+            break;
+        default:
+            break;
     }
 }
 
@@ -392,8 +341,7 @@
     McpsReq_t mcpsReq;
     LoRaMacTxInfo_t txInfo;
 
-    if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK )
-    {
+    if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK ) {
         // Send empty frame in order to flush MAC commands
         mcpsReq.Type = MCPS_UNCONFIRMED;
         mcpsReq.Req.Unconfirmed.fBuffer = NULL;
@@ -405,25 +353,20 @@
         LoRaMacUplinkStatus.Buffer = NULL;
         LoRaMacUplinkStatus.BufferSize = 0;
         SerialDisplayUpdateFrameType( false );
-    }
-    else
-    {
+    } else {
         LoRaMacUplinkStatus.Acked = false;
         LoRaMacUplinkStatus.Port = AppPort;
         LoRaMacUplinkStatus.Buffer = AppData;
         LoRaMacUplinkStatus.BufferSize = AppDataSize;
         SerialDisplayUpdateFrameType( IsTxConfirmed );
 
-        if( IsTxConfirmed == false )
-        {
+        if( IsTxConfirmed == false ) {
             mcpsReq.Type = MCPS_UNCONFIRMED;
             mcpsReq.Req.Unconfirmed.fPort = AppPort;
             mcpsReq.Req.Unconfirmed.fBuffer = AppData;
             mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
             mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
-        }
-        else
-        {
+        } else {
             mcpsReq.Type = MCPS_CONFIRMED;
             mcpsReq.Req.Confirmed.fPort = AppPort;
             mcpsReq.Req.Confirmed.fBuffer = AppData;
@@ -433,8 +376,7 @@
         }
     }
 
-    if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK )
-    {
+    if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK ) {
         return false;
     }
     return true;
@@ -453,15 +395,11 @@
     mibReq.Type = MIB_NETWORK_JOINED;
     status = LoRaMacMibGetRequestConfirm( &mibReq );
 
-    if( status == LORAMAC_STATUS_OK )
-    {
-        if( mibReq.Param.IsNetworkJoined == true )
-        {
+    if( status == LORAMAC_STATUS_OK ) {
+        if( mibReq.Param.IsNetworkJoined == true ) {
             DeviceState = DEVICE_STATE_SEND;
             NextTx = true;
-        }
-        else
-        {
+        } else {
             DeviceState = DEVICE_STATE_JOIN;
         }
     }
@@ -489,14 +427,6 @@
     Led2StateChanged = true;
 }
 
-/*!
- * \brief Function executed on Buzzer Timeout event
- */
-static void OnBuzzerTimerEvent( void )
-{
-    Buzzer = 0;
-    BuzzerTimer.detach( );
-}
 
 /*!
  * \brief   MCPS-Confirm event function
@@ -506,18 +436,14 @@
  */
 static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
 {
-    if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
-    {
-        switch( mcpsConfirm->McpsRequest )
-        {
-            case MCPS_UNCONFIRMED:
-            {
+    if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) {
+        switch( mcpsConfirm->McpsRequest ) {
+            case MCPS_UNCONFIRMED: {
                 // Check Datarate
                 // Check TxPower
                 break;
             }
-            case MCPS_CONFIRMED:
-            {
+            case MCPS_CONFIRMED: {
                 // Check Datarate
                 // Check TxPower
                 // Check AckReceived
@@ -525,8 +451,7 @@
                 LoRaMacUplinkStatus.Acked = mcpsConfirm->AckReceived;
                 break;
             }
-            case MCPS_PROPRIETARY:
-            {
+            case MCPS_PROPRIETARY: {
                 break;
             }
             default:
@@ -553,27 +478,21 @@
  */
 static void McpsIndication( McpsIndication_t *mcpsIndication )
 {
-    if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
-    {
+    if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK ) {
         return;
     }
 
-    switch( mcpsIndication->McpsIndication )
-    {
-        case MCPS_UNCONFIRMED:
-        {
+    switch( mcpsIndication->McpsIndication ) {
+        case MCPS_UNCONFIRMED: {
             break;
         }
-        case MCPS_CONFIRMED:
-        {
+        case MCPS_CONFIRMED: {
             break;
         }
-        case MCPS_PROPRIETARY:
-        {
+        case MCPS_PROPRIETARY: {
             break;
         }
-        case MCPS_MULTICAST:
-        {
+        case MCPS_MULTICAST: {
             break;
         }
         default:
@@ -590,14 +509,11 @@
     // Check Snr
     // Check RxSlot
     LoRaMacDownlinkStatus.Rssi = mcpsIndication->Rssi;
-    if( mcpsIndication->Snr & 0x80 ) // The SNR sign bit is 1
-    {
+    if( mcpsIndication->Snr & 0x80 ) { // The SNR sign bit is 1
         // Invert and divide by 4
         LoRaMacDownlinkStatus.Snr = ( ( ~mcpsIndication->Snr + 1 ) & 0xFF ) >> 2;
         LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
-    }
-    else
-    {
+    } else {
         // Divide by 4
         LoRaMacDownlinkStatus.Snr = ( mcpsIndication->Snr & 0xFF ) >> 2;
     }
@@ -607,175 +523,148 @@
     LoRaMacDownlinkStatus.Buffer = mcpsIndication->Buffer;
     LoRaMacDownlinkStatus.BufferSize = mcpsIndication->BufferSize;
 
-    if( ComplianceTest.Running == true )
-    {
+    if( ComplianceTest.Running == true ) {
         ComplianceTest.DownLinkCounter++;
     }
 
-    if( mcpsIndication->RxData == true )
-    {
-        switch( mcpsIndication->Port )
-        {
-        case 1: // The application LED can be controlled on port 1 or 2
-        case 2:
-            if( mcpsIndication->BufferSize == 1 )
-            {
-                AppLedStateOn = mcpsIndication->Buffer[0] & 0x01;
-                Led3StateChanged = true;
-            }
-            break;
-        case 10: 
-            Display.write( 0, mcpsIndication->Buffer[0] );
-            Display.write( 1, mcpsIndication->Buffer[1] );
-            Display.write( 2, mcpsIndication->Buffer[2] );
-            Display.write( 3, mcpsIndication->Buffer[3] ); 
-            break;
-        case 20:
-            LightMode = mcpsIndication->Buffer[0];
-            if( LightMode )
-            {
-                ColorLed.setColorRGB( 0, mcpsIndication->Buffer[1], mcpsIndication->Buffer[2], mcpsIndication->Buffer[3] );
-            }
-            break;
-        case 30:
-            BuzzerTimer.attach_us( &OnBuzzerTimerEvent, 200000 );
-            Buzzer = 1;
-            break;
-        case 224:
-            if( ComplianceTest.Running == false )
-            {
-                // Check compliance test enable command (i)
-                if( ( mcpsIndication->BufferSize == 4 ) &&
-                    ( mcpsIndication->Buffer[0] == 0x01 ) &&
-                    ( mcpsIndication->Buffer[1] == 0x01 ) &&
-                    ( mcpsIndication->Buffer[2] == 0x01 ) &&
-                    ( mcpsIndication->Buffer[3] == 0x01 ) )
-                {
-                    IsTxConfirmed = false;
-                    AppPort = 224;
-                    AppDataSize = 2;
-                    ComplianceTest.DownLinkCounter = 0;
-                    ComplianceTest.LinkCheck = false;
-                    ComplianceTest.DemodMargin = 0;
-                    ComplianceTest.NbGateways = 0;
-                    ComplianceTest.Running = true;
-                    ComplianceTest.State = 1;
-
-                    MibRequestConfirm_t mibReq;
-                    mibReq.Type = MIB_ADR;
-                    mibReq.Param.AdrEnable = true;
-                    LoRaMacMibSetRequestConfirm( &mibReq );
-
-#if defined( USE_BAND_868 )
-                    LoRaMacTestSetDutyCycleOn( false );
-#endif
+    if( mcpsIndication->RxData == true ) {
+        switch( mcpsIndication->Port ) {
+            case 1: // The application LED can be controlled on port 1 or 2
+            case 2:
+                if( mcpsIndication->BufferSize == 1 ) {
+                    AppLedStateOn = mcpsIndication->Buffer[0] & 0x01;
+                    Led3StateChanged = true;
                 }
-            }
-            else
-            {
-                ComplianceTest.State = mcpsIndication->Buffer[0];
-                switch( ComplianceTest.State )
-                {
-                case 0: // Check compliance test disable command (ii)
-                    IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
-                    AppPort = LORAWAN_APP_PORT;
-                    AppDataSize = LORAWAN_APP_DATA_SIZE;
-                    ComplianceTest.DownLinkCounter = 0;
-                    ComplianceTest.Running = false;
-
-                    MibRequestConfirm_t mibReq;
-                    mibReq.Type = MIB_ADR;
-                    mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
-                    LoRaMacMibSetRequestConfirm( &mibReq );
-#if defined( USE_BAND_868 )
-                    LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
-#endif
-                    break;
-                case 1: // (iii, iv)
-                    AppDataSize = 2;
-                    break;
-                case 2: // Enable confirmed messages (v)
-                    IsTxConfirmed = true;
-                    ComplianceTest.State = 1;
-                    break;
-                case 3:  // Disable confirmed messages (vi)
-                    IsTxConfirmed = false;
-                    ComplianceTest.State = 1;
-                    break;
-                case 4: // (vii)
-                    AppDataSize = mcpsIndication->BufferSize;
-
-                    AppData[0] = 4;
-                    for( uint8_t i = 1; i < AppDataSize; i++ )
-                    {
-                        AppData[i] = mcpsIndication->Buffer[i] + 1;
-                    }
-                    break;
-                case 5: // (viii)
-                    {
-                        MlmeReq_t mlmeReq;
-                        mlmeReq.Type = MLME_LINK_CHECK;
-                        LoRaMacMlmeRequest( &mlmeReq );
-                    }
-                    break;
-                case 6: // (ix)
-                    {
-                        MlmeReq_t mlmeReq;
-
-                        // Disable TestMode and revert back to normal operation
-                        IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
-                        AppPort = LORAWAN_APP_PORT;
-                        AppDataSize = LORAWAN_APP_DATA_SIZE;
+                break;
+            case 10:
+                break;
+            case 20:
+                break;
+            case 30:
+                break;
+            case 224:
+                if( ComplianceTest.Running == false ) {
+                    // Check compliance test enable command (i)
+                    if( ( mcpsIndication->BufferSize == 4 ) &&
+                            ( mcpsIndication->Buffer[0] == 0x01 ) &&
+                            ( mcpsIndication->Buffer[1] == 0x01 ) &&
+                            ( mcpsIndication->Buffer[2] == 0x01 ) &&
+                            ( mcpsIndication->Buffer[3] == 0x01 ) ) {
+                        IsTxConfirmed = false;
+                        AppPort = 224;
+                        AppDataSize = 2;
                         ComplianceTest.DownLinkCounter = 0;
-                        ComplianceTest.Running = false;
+                        ComplianceTest.LinkCheck = false;
+                        ComplianceTest.DemodMargin = 0;
+                        ComplianceTest.NbGateways = 0;
+                        ComplianceTest.Running = true;
+                        ComplianceTest.State = 1;
 
                         MibRequestConfirm_t mibReq;
                         mibReq.Type = MIB_ADR;
-                        mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
+                        mibReq.Param.AdrEnable = true;
                         LoRaMacMibSetRequestConfirm( &mibReq );
+
 #if defined( USE_BAND_868 )
-                        LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
+                        LoRaMacTestSetDutyCycleOn( false );
+#endif
+                    }
+                } else {
+                    ComplianceTest.State = mcpsIndication->Buffer[0];
+                    switch( ComplianceTest.State ) {
+                        case 0: // Check compliance test disable command (ii)
+                            IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
+                            AppPort = LORAWAN_APP_PORT;
+                            AppDataSize = LORAWAN_APP_DATA_SIZE;
+                            ComplianceTest.DownLinkCounter = 0;
+                            ComplianceTest.Running = false;
+
+                            MibRequestConfirm_t mibReq;
+                            mibReq.Type = MIB_ADR;
+                            mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
+                            LoRaMacMibSetRequestConfirm( &mibReq );
+#if defined( USE_BAND_868 )
+                            LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
+#endif
+                            break;
+                        case 1: // (iii, iv)
+                            AppDataSize = 2;
+                            break;
+                        case 2: // Enable confirmed messages (v)
+                            IsTxConfirmed = true;
+                            ComplianceTest.State = 1;
+                            break;
+                        case 3:  // Disable confirmed messages (vi)
+                            IsTxConfirmed = false;
+                            ComplianceTest.State = 1;
+                            break;
+                        case 4: // (vii)
+                            AppDataSize = mcpsIndication->BufferSize;
+
+                            AppData[0] = 4;
+                            for( uint8_t i = 1; i < AppDataSize; i++ ) {
+                                AppData[i] = mcpsIndication->Buffer[i] + 1;
+                            }
+                            break;
+                        case 5: { // (viii)
+                            MlmeReq_t mlmeReq;
+                            mlmeReq.Type = MLME_LINK_CHECK;
+                            LoRaMacMlmeRequest( &mlmeReq );
+                        }
+                        break;
+                        case 6: { // (ix)
+                            MlmeReq_t mlmeReq;
+
+                            // Disable TestMode and revert back to normal operation
+                            IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
+                            AppPort = LORAWAN_APP_PORT;
+                            AppDataSize = LORAWAN_APP_DATA_SIZE;
+                            ComplianceTest.DownLinkCounter = 0;
+                            ComplianceTest.Running = false;
+
+                            MibRequestConfirm_t mibReq;
+                            mibReq.Type = MIB_ADR;
+                            mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
+                            LoRaMacMibSetRequestConfirm( &mibReq );
+#if defined( USE_BAND_868 )
+                            LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
 #endif
 
-                        mlmeReq.Type = MLME_JOIN;
-
-                        mlmeReq.Req.Join.DevEui = DevEui;
-                        mlmeReq.Req.Join.AppEui = AppEui;
-                        mlmeReq.Req.Join.AppKey = AppKey;
-                        mlmeReq.Req.Join.NbTrials = 3;
+                            mlmeReq.Type = MLME_JOIN;
 
-                        LoRaMacMlmeRequest( &mlmeReq );
-                        DeviceState = DEVICE_STATE_SLEEP;
-                    }
-                    break;
-                case 7: // (x)
-                    {
-                        if( mcpsIndication->BufferSize == 3 )
-                        {
-                            MlmeReq_t mlmeReq;
-                            mlmeReq.Type = MLME_TXCW;
-                            mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
+                            mlmeReq.Req.Join.DevEui = DevEui;
+                            mlmeReq.Req.Join.AppEui = AppEui;
+                            mlmeReq.Req.Join.AppKey = AppKey;
+                            mlmeReq.Req.Join.NbTrials = 3;
+
                             LoRaMacMlmeRequest( &mlmeReq );
+                            DeviceState = DEVICE_STATE_SLEEP;
                         }
-                        else if( mcpsIndication->BufferSize == 7 )
-                        {
-                            MlmeReq_t mlmeReq;
-                            mlmeReq.Type = MLME_TXCW_1;
-                            mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
-                            mlmeReq.Req.TxCw.Frequency = ( uint32_t )( ( mcpsIndication->Buffer[3] << 16 ) | ( mcpsIndication->Buffer[4] << 8 ) | mcpsIndication->Buffer[5] ) * 100;
-                            mlmeReq.Req.TxCw.Power = mcpsIndication->Buffer[6];
-                            LoRaMacMlmeRequest( &mlmeReq );
+                        break;
+                        case 7: { // (x)
+                            if( mcpsIndication->BufferSize == 3 ) {
+                                MlmeReq_t mlmeReq;
+                                mlmeReq.Type = MLME_TXCW;
+                                mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
+                                LoRaMacMlmeRequest( &mlmeReq );
+                            } else if( mcpsIndication->BufferSize == 7 ) {
+                                MlmeReq_t mlmeReq;
+                                mlmeReq.Type = MLME_TXCW_1;
+                                mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
+                                mlmeReq.Req.TxCw.Frequency = ( uint32_t )( ( mcpsIndication->Buffer[3] << 16 ) | ( mcpsIndication->Buffer[4] << 8 ) | mcpsIndication->Buffer[5] ) * 100;
+                                mlmeReq.Req.TxCw.Power = mcpsIndication->Buffer[6];
+                                LoRaMacMlmeRequest( &mlmeReq );
+                            }
+                            ComplianceTest.State = 1;
                         }
-                        ComplianceTest.State = 1;
+                        break;
+                        default:
+                            break;
                     }
-                    break;
-                default:
-                    break;
                 }
-            }
-            break;
-        default:
-            break;
+                break;
+            default:
+                break;
         }
     }
 
@@ -794,31 +683,23 @@
  */
 static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
 {
-    switch( mlmeConfirm->MlmeRequest )
-    {
-        case MLME_JOIN:
-        {
-            if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
-            {
+    switch( mlmeConfirm->MlmeRequest ) {
+        case MLME_JOIN: {
+            if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) {
                 // Status is OK, node has joined the network
                 IsNetworkJoinedStatusUpdate = true;
                 DeviceState = DEVICE_STATE_SEND;
-            }
-            else
-            {
+            } else {
                 // Join was not successful. Try to join again
                 DeviceState = DEVICE_STATE_JOIN;
             }
             break;
         }
-        case MLME_LINK_CHECK:
-        {
-            if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
-            {
+        case MLME_LINK_CHECK: {
+            if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) {
                 // Check DemodMargin
                 // Check NbGateways
-                if( ComplianceTest.Running == true )
-                {
+                if( ComplianceTest.Running == true ) {
                     ComplianceTest.LinkCheck = true;
                     ComplianceTest.DemodMargin = mlmeConfirm->DemodMargin;
                     ComplianceTest.NbGateways = mlmeConfirm->NbGateways;
@@ -845,9 +726,6 @@
     BoardInit( );
     SerialDisplayInit( );
 
-    LightMode = 0;      // 0: manual,   1: automatic
-    Buzzer = 0;         // 0: OFF,      1: ON
-
     SerialDisplayUpdateEui( 5, DevEui );
     SerialDisplayUpdateEui( 6, AppEui );
     SerialDisplayUpdateKey( 7, AppKey );
@@ -860,48 +738,40 @@
 #endif
 
     DeviceState = DEVICE_STATE_INIT;
+    init_sensors(myGPS_I2C, myIMU);
 
-    while( 1 )
-    {
+    while( 1 ) {
         SerialRxProcess( );
-        if( IsNetworkJoinedStatusUpdate == true )
-        {
+        if( IsNetworkJoinedStatusUpdate == true ) {
             IsNetworkJoinedStatusUpdate = false;
             mibReq.Type = MIB_NETWORK_JOINED;
             LoRaMacMibGetRequestConfirm( &mibReq );
             SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
         }
-        if( Led1StateChanged == true )
-        {
+        if( Led1StateChanged == true ) {
             Led1StateChanged = false;
             SerialDisplayUpdateLedState( 1, Led1State );
         }
-        if( Led2StateChanged == true )
-        {
+        if( Led2StateChanged == true ) {
             Led2StateChanged = false;
             SerialDisplayUpdateLedState( 2, Led2State );
         }
-        if( Led3StateChanged == true )
-        {
+        if( Led3StateChanged == true ) {
             Led3StateChanged = false;
             SerialDisplayUpdateLedState( 3, AppLedStateOn );
         }
-        if( UplinkStatusUpdated == true )
-        {
+        if( UplinkStatusUpdated == true ) {
             UplinkStatusUpdated = false;
             SerialDisplayUpdateUplink( LoRaMacUplinkStatus.Acked, LoRaMacUplinkStatus.Datarate, LoRaMacUplinkStatus.UplinkCounter, LoRaMacUplinkStatus.Port, LoRaMacUplinkStatus.Buffer, LoRaMacUplinkStatus.BufferSize );
         }
-        if( DownlinkStatusUpdated == true )
-        {
+        if( DownlinkStatusUpdated == true ) {
             DownlinkStatusUpdated = false;
             SerialDisplayUpdateLedState( 2, Led2State );
             SerialDisplayUpdateDownlink( LoRaMacDownlinkStatus.RxData, LoRaMacDownlinkStatus.Rssi, LoRaMacDownlinkStatus.Snr, LoRaMacDownlinkStatus.DownlinkCounter, LoRaMacDownlinkStatus.Port, LoRaMacDownlinkStatus.Buffer, LoRaMacDownlinkStatus.BufferSize );
         }
-        
-        switch( DeviceState )
-        {
-            case DEVICE_STATE_INIT:
-            {
+
+        switch( DeviceState ) {
+            case DEVICE_STATE_INIT: {
                 LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
                 LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
                 LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
@@ -938,11 +808,15 @@
                 LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 );
 
                 mibReq.Type = MIB_RX2_DEFAULT_CHANNEL;
-                mibReq.Param.Rx2DefaultChannel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
+                mibReq.Param.Rx2DefaultChannel = ( Rx2ChannelParams_t ) {
+                    869525000, DR_3
+                };
                 LoRaMacMibSetRequestConfirm( &mibReq );
 
                 mibReq.Type = MIB_RX2_CHANNEL;
-                mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
+                mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ) {
+                    869525000, DR_3
+                };
                 LoRaMacMibSetRequestConfirm( &mibReq );
 #endif
 
@@ -956,8 +830,7 @@
                 DeviceState = DEVICE_STATE_JOIN;
                 break;
             }
-            case DEVICE_STATE_JOIN:
-            {
+            case DEVICE_STATE_JOIN: {
 #if( OVER_THE_AIR_ACTIVATION != 0 )
                 MlmeReq_t mlmeReq;
 
@@ -967,8 +840,7 @@
                 mlmeReq.Req.Join.AppEui = AppEui;
                 mlmeReq.Req.Join.AppKey = AppKey;
 
-                if( NextTx == true )
-                {
+                if( NextTx == true ) {
                     LoRaMacMlmeRequest( &mlmeReq );
                 }
                 DeviceState = DEVICE_STATE_SLEEP;
@@ -998,31 +870,25 @@
                 IsNetworkJoinedStatusUpdate = true;
                 break;
             }
-            case DEVICE_STATE_SEND:
-            {
-                if( NextTx == true )
-                {
+            case DEVICE_STATE_SEND: {
+                if( NextTx == true ) {
                     SerialDisplayUpdateUplinkAcked( false );
                     SerialDisplayUpdateDonwlinkRxData( false );
                     PrepareTxFrame( AppPort );
 
                     NextTx = SendFrame( );
                 }
-                if( ComplianceTest.Running == true )
-                {
+                if( ComplianceTest.Running == true ) {
                     // Schedule next packet transmission
                     TxDutyCycleTime = 5000; // 5000 ms
-                }
-                else
-                {
+                } else {
                     // Schedule next packet transmission
                     TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
                 }
                 DeviceState = DEVICE_STATE_CYCLE;
                 break;
             }
-            case DEVICE_STATE_CYCLE:
-            {
+            case DEVICE_STATE_CYCLE: {
                 DeviceState = DEVICE_STATE_SLEEP;
 
                 // Schedule next packet transmission
@@ -1030,26 +896,21 @@
                 TimerStart( &TxNextPacketTimer );
                 break;
             }
-            case DEVICE_STATE_SLEEP:
-            {
+            case DEVICE_STATE_SLEEP: {
                 // Wake up through events
                 break;
             }
-            default:
-            {
+            default: {
                 DeviceState = DEVICE_STATE_INIT;
                 break;
             }
-            
+
         }
 
-        // Read light sensor
-        LightValue = ( 1 - ( LightSens.read( ) * 1.65 ) );
+        // Read GPS
+        //read_gps(myGPS_I2C);
 
         // Set automatic RGB from light sensor
-        if( LightMode == 0 )
-        {
-            ColorLed.setColorRGB( 0, ( uint8_t )( 255 * LightValue ), ( uint8_t )( 255 * LightValue ), ( uint8_t )( 255 * LightValue ) );
-        }
+
     }
 }