Slave Implementation of WANOT Slave

Dependencies:   SX1276Lib mbed-src

Files at this revision

API Documentation at this revision

Comitter:
semsem
Date:
Mon May 23 22:28:07 2016 +0000
Commit message:
WANOT

Changed in this revision

GPS.cpp Show annotated file Show diff for this revision Revisions of this file
GPS.h Show annotated file Show diff for this revision Revisions of this file
SX1276Lib.lib Show annotated file Show diff for this revision Revisions of this file
SlaveBeacon.cpp Show annotated file Show diff for this revision Revisions of this file
SlaveBeacon.h Show annotated file Show diff for this revision Revisions of this file
SlaveData.cpp Show annotated file Show diff for this revision Revisions of this file
SlaveSetUp.cpp Show annotated file Show diff for this revision Revisions of this file
SlaveSetUp.h Show annotated file Show diff for this revision Revisions of this file
SlaveTDMA.cpp Show annotated file Show diff for this revision Revisions of this file
SlaveTDMA.h Show annotated file Show diff for this revision Revisions of this file
SuperSlot.cpp Show annotated file Show diff for this revision Revisions of this file
SuperSlot.h Show annotated file Show diff for this revision Revisions of this file
WANOT.h 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-src.lib Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 80ebf9b1dd4f GPS.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS.cpp	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,50 @@
+#include "WANOT.h"
+
+/*
+ *  Global variables declarations
+ */
+
+
+void GPS_Read(char* StoreRead)
+{
+    debug("GPS Data Query Started...\n\r");
+    int j;
+    int parts;
+    char Parts_TimeBuffer[4];
+
+
+    // struct tm t;         // setup time structure reffered to GPS
+
+    Serial SS(NC,PC_11);
+    SS.baud(4800);
+
+    uint8_t Loop_Counter = 0;
+
+    while(Loop_Counter < 3) {
+        
+        SS.gets(StoreRead,50);
+        
+        debug("New Statement Read\n\r");
+
+        if(StoreRead[0]=='$' && StoreRead[1]=='G' && StoreRead[2]=='P'&& StoreRead[3]=='G'&& StoreRead[4]=='G' && StoreRead[5]=='A') { //GPGGA Message
+
+            debug("GPGGA Statement\n\r");
+            Loop_Counter++;          // To make sure it gets GPGGA Statement
+        }
+    }
+    
+    debug("GPS Data Fix Finished...\n\r");
+    
+    /*Parts of second*/
+    for(j=0; j<3; j++) {
+        //debug("%c",StoreRead[14+j]);//send parts of second
+        Parts_TimeBuffer[j] = StoreRead[14+j];
+    }
+
+    Parts_TimeBuffer[3] = 0;
+
+    parts = atoi(Parts_TimeBuffer);   // change to intege for mktime function
+    wait_ms(1000-parts);              // to make time reffered to 00.00 of parts
+    
+    debug("GPS Synch Finished...\n\r");
+}
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f GPS.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS.h	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,8 @@
+#ifndef _GPS_H_
+#define _GPS_H_
+
+#include "WANOT.h"
+
+void GPS_Read(char* StoreRead);
+
+#endif //_GPS_H_
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f SX1276Lib.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SX1276Lib.lib	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/Semtech/code/SX1276Lib/#3778e6204cc1
diff -r 000000000000 -r 80ebf9b1dd4f SlaveBeacon.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SlaveBeacon.cpp	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,108 @@
+#include "WANOT.h"
+
+/*
+ *  Global variables declarations
+ */
+ 
+extern SuperSlotStates SuperSlotState;
+
+volatile SlaveRegStates SlaveRegState = UnRegistered;  
+volatile Slave_Beacon_State Slave_Beacon_States = Beacon_Wait; 
+
+extern RadioEvents_t RadioEvents;
+extern SX1276MB1xAS Radio;
+
+extern uint16_t BufferSize;
+extern uint8_t Buffer[];
+
+extern int16_t RssiValue;
+extern int8_t SnrValue;
+
+extern uint32_t LORA_Channels[];
+
+extern uint8_t TDMAChannel;
+
+volatile uint8_t Beacon_New_Rx_Flag = 0;
+volatile uint8_t Beacon_Counter = 0;
+
+void Beacon_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;
+    debug("Beacon_OnRxDone!!\n\r");
+
+    Beacon_New_Rx_Flag = 0;
+
+    if(Buffer[0] == SETUP_BEACON_SYNCWORD) {
+        TDMAChannel = Buffer[1];
+        debug("Beacon Recieved!!\n\r");
+        Slave_Beacon_States = Beacon_Recieved;
+    } else {
+        debug("Beacon Mismatch\n\r");
+    }
+}
+
+void Beacon_OnRxTimeout(void)
+{
+    Beacon_Counter++;
+    Beacon_New_Rx_Flag = 0;
+    debug("Beacon Not Found!!\n\r");
+}
+
+
+void SetUp_Beacon(void)
+{
+    debug("Beacon SetUP State!!\n\r");
+    
+    Beacon_New_Rx_Flag = 0;
+    Beacon_Counter = 0;
+
+    Slave_Beacon_States = Beacon_Wait;
+
+    RadioEvents.RxDone = Beacon_OnRxDone;
+    RadioEvents.RxTimeout = Beacon_OnRxTimeout;
+    Radio.Init(&RadioEvents);
+
+    Radio.SetChannel(SET_UP_FREQUENCY);
+
+    Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, SET_UP_LORA_BANDWIDTH,
+                      SET_UP_LORA_SPREADING_FACTOR, LORA_CODINGRATE,
+                      LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
+                      SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
+                      LORA_IQ_INVERSION_ON, 2000000);
+
+    Radio.SetRxConfig(MODEM_LORA, SET_UP_LORA_BANDWIDTH, SET_UP_LORA_SPREADING_FACTOR,
+                      LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
+                      LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
+                      SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
+                      LORA_IQ_INVERSION_ON, true);
+
+    while((SuperSlotState == SetUp_Beacon_Phase) && (Beacon_Counter != 8) && (Slave_Beacon_States != Beacon_Recieved)) {
+        debug("Waiting for Beacon\n\r");
+        Beacon_New_Rx_Flag = 1;
+        Radio.Rx( RX_TIMEOUT_VALUE );
+        while(Beacon_New_Rx_Flag == 1);
+    }
+
+
+    Radio.SetChannel(LORA_Channels[TDMAChannel]);
+
+    Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, SET_UP_LORA_BANDWIDTH,
+                      SET_UP_LORA_SPREADING_FACTOR, LORA_CODINGRATE,
+                      LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
+                      SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
+                      LORA_IQ_INVERSION_ON, 2000000);
+
+    Radio.SetRxConfig(MODEM_LORA, SET_UP_LORA_BANDWIDTH, SET_UP_LORA_SPREADING_FACTOR,
+                      LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
+                      LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
+                      SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
+                      LORA_IQ_INVERSION_ON, true);
+
+
+    debug("Finished Beacon State\n\r");
+    //RTC Sleep for the rest of setup beacon
+}
diff -r 000000000000 -r 80ebf9b1dd4f SlaveBeacon.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SlaveBeacon.h	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,20 @@
+#ifndef _SLAVEBEACON_H_
+#define _SLAVEBEACON_H_
+
+#include "WANOT.h"
+
+typedef enum {
+    UnRegistered = 0,
+    Registered
+} SlaveRegStates;
+
+typedef enum {
+    Beacon_Wait = 0,
+    Beacon_Recieved
+
+} Slave_Beacon_State;
+
+void SetUp_Beacon(void);
+
+
+#endif //_SLAVEBEACON_H_
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f SlaveData.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SlaveData.cpp	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,14 @@
+#include "WANOT.h"
+
+uint16_t BufferSize = BUFFER_SIZE;
+uint8_t Buffer[BUFFER_SIZE];
+
+int16_t RssiValue = 0.0;
+int8_t SnrValue = 0.0;
+
+uint32_t LORA_Channels[NUMBER_OF_CHANNELS] = {868100000,868300000,868500000,867100000,867300000,867500000,867700000,867900000};
+
+uint8_t SlotNumber =  0;
+uint8_t TDMAChannel = 0;
+
+uint8_t SlaveLocalID = 0;
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f SlaveSetUp.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SlaveSetUp.cpp	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,202 @@
+
+#include "WANOT.h"
+
+/*
+ *  Global variables declarations
+ */
+ 
+extern SuperSlotStates SuperSlotState;
+
+extern Slave_Beacon_State Slave_Beacon_States;
+
+volatile SlaveSetUpStates SlaveSetUpState = Rx_Init;
+extern SlaveRegStates SlaveRegState;
+
+volatile msgType messageType = msgRTS;
+volatile msgType messageType2 = msgCTS;
+
+extern RadioEvents_t RadioEvents;
+extern SX1276MB1xAS Radio;
+
+extern uint16_t BufferSize;
+extern uint8_t Buffer[];
+
+extern uint32_t LORA_Channels[NUMBER_OF_CHANNELS];
+
+extern int16_t RssiValue;
+extern int8_t SnrValue;
+
+extern uint8_t TDMAChannel;
+extern uint8_t SlaveLocalID;
+
+void SetUp_OnTxDone(void)
+{
+    Radio.Rx(RX_TIMEOUT_VALUE);
+    debug("SetUp_OnTxDone!!\n\r");
+
+}
+
+void SetUp_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;
+    debug("SetUp_OnRxDone!!\n\r");
+
+    switch (SlaveSetUpState) {
+        case Wait_for_Beacon:
+            if(Buffer[0] == BEACON_SYNCWORD) {
+                SlaveSetUpState = Phy_CS;
+                debug("Beacon Packet\n\r");
+            } else {
+                SlaveSetUpState = Rx_Init;
+                debug("Beacon Mismatch\n\r");
+
+            }
+            break;
+
+        case Virtual_CS:
+            if ((messageType == Buffer[0]) || (messageType2 == Buffer[0])) {
+                SlaveSetUpState = Channel_Busy;
+                debug("Channel is Busy(CTS/RTS)!!\n\r");
+            } else {
+                SlaveSetUpState = Channel_Busy;
+                debug("Channel is Busy(Invalid Packet)!!\n\r");
+            }
+            break;
+
+        case Wait_for_CTS:
+            messageType = msgCTS;
+            if (messageType == Buffer[0]) {
+                SlaveSetUpState = Send_JoinReq;
+                debug("CTS Packet\n\r");
+            } else {
+                SlaveSetUpState = Rx_Init;
+                debug("CTS Mismatch\n\r");
+            }
+            break;
+
+        case Wait_for_JoinAccept:
+            messageType = msgJoinAccept;
+            if (messageType == Buffer[0]) {
+                SlaveLocalID = Buffer[11];
+                SlaveSetUpState = Send_ACK;
+                debug("JoinAccept Packet\n\r");
+            } else {
+                SlaveSetUpState = Rx_Init;
+                debug("JoinAccept Mismatch\n\r");
+            }
+            break;
+
+        default:
+            debug("Invalid Packet!!");
+    }
+
+
+}
+
+void SetUp_OnTxTimeout(void)
+{
+    SlaveSetUpState = Rx_Init;
+    debug("SetUp_OnTxTimeout!!\n\r");
+
+}
+
+void SetUp_OnRxTimeout(void)
+{
+    switch(SlaveSetUpState) {
+        case Virtual_CS:
+            SlaveSetUpState = Send_RTS;
+            debug("Channel is Free!!\n\r");
+            break;
+        default:
+            SlaveSetUpState = Rx_Init;
+            debug("SetUp_OnRxTimeout!!\n\r");
+    }
+}
+
+void SetUp_OnRxError(void)
+{
+    SlaveSetUpState = Rx_Init;
+
+}
+
+void SlaveSetUp()
+{
+    debug("Slave Set Up Phase Started...\n\r");
+    
+    // Initialize Radio driver
+    RadioEvents.TxDone = SetUp_OnTxDone;
+    RadioEvents.RxDone = SetUp_OnRxDone;
+    RadioEvents.RxError = SetUp_OnRxError;
+    RadioEvents.TxTimeout = SetUp_OnTxTimeout;
+    RadioEvents.RxTimeout = SetUp_OnRxTimeout;
+    Radio.Init(&RadioEvents);
+
+    while ((SuperSlotState == SetUp_Phase) && (SlaveRegState == UnRegistered) && (Slave_Beacon_States == Beacon_Recieved)) {
+        switch (SlaveSetUpState) {
+            case Phy_CS:
+                if(Radio.IsChannelFree(MODEM_LORA, SET_UP_FREQUENCY, RSSI_THRESHOLD))   {
+                    uint16_t BackOffValue = MIN_BACK_OFF + /*rand()%*/RANDOM_BACK_OFF_WINDOW;
+                    SlaveSetUpState = Virtual_CS;
+                    Radio.Rx(BackOffValue);
+                }   else    {
+                    SlaveSetUpState = Channel_Busy;
+                }
+                break;
+
+
+            case Virtual_CS:
+                break;
+
+            case Channel_Busy:
+                debug("Channel Busy !!\n\r");
+                wait_ms(MIN_BACK_OFF + RANDOM_BACK_OFF_WINDOW * rand());
+                SlaveSetUpState = Wait_for_Beacon;
+                break;
+
+            case Send_RTS:
+                messageType = msgRTS;
+                Buffer[0] = messageType;
+                Buffer[1] = SnrValue;
+                Radio.Send(Buffer, BUFFER_SIZE_RTS);
+                debug("Case of RTS Sent\n\r");
+                SlaveSetUpState = Wait_for_CTS;
+                break;
+
+            case Send_JoinReq:
+                messageType = msgJoinReq;
+                Buffer[0] = messageType;
+                Radio.Send(Buffer, BUFFER_SIZE_JoinReq);
+                debug("Case of JoinRequest Sent\n\r");
+                SlaveSetUpState = Wait_for_JoinAccept;
+                break;
+
+            case Send_ACK:
+                messageType = msgAck;
+                Buffer[0] = messageType;
+                Radio.Send(Buffer, BUFFER_SIZE_Ack);
+                debug("Registered\n\r");
+                SlaveSetUpState = Rx_Init;
+                SlaveRegState = Registered;
+                debug("Slave Set Up Phase Finished...\n\r");
+                return;
+
+            case Rx_Init:
+                Radio.Rx( RX_TIMEOUT_VALUE );
+                SlaveSetUpState = Wait_for_Beacon;
+                debug("Case of Rx_Init\n\r");
+                break;
+            case Wait_for_Beacon:
+            case Wait_for_CTS:
+            case Wait_for_JoinAccept:
+                break;
+            default:
+                break;
+
+        }
+
+    }
+}
diff -r 000000000000 -r 80ebf9b1dd4f SlaveSetUp.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SlaveSetUp.h	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,30 @@
+#ifndef SLAVESETUP_H_
+#define SLAVESETUP_H_
+
+#include "WANOT.h"
+
+typedef enum {
+    Wait_for_Beacon = 0,
+    Send_RTS,
+    Send_JoinReq,
+    Send_ACK,
+    Wait_for_CTS,
+    Wait_for_JoinAccept,
+    Rx_Init,
+    Phy_CS, //CSMA
+    Virtual_CS,
+    Channel_Busy
+
+} SlaveSetUpStates;
+
+typedef enum {
+    msgRTS = 0x11,
+    msgCTS = 0x12,
+    msgJoinReq = 0x13,
+    msgJoinAccept = 0x14,
+    msgAck = 0x15
+
+} msgType;
+
+void SlaveSetUp();
+#endif
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f SlaveTDMA.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SlaveTDMA.cpp	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,189 @@
+#include "WANOT.h"
+
+/*
+ *  Global variables declarations
+ */
+
+extern SuperSlotStates SuperSlotState;
+extern SlaveRegStates SlaveRegState;
+
+extern RadioEvents_t RadioEvents;
+extern SX1276MB1xAS Radio;
+
+extern uint16_t BufferSize;
+extern uint8_t Buffer[];
+
+extern uint32_t LORA_Channels[NUMBER_OF_CHANNELS];
+
+extern int16_t RssiValue;
+extern int8_t SnrValue;
+
+extern uint8_t TDMAChannel;
+extern uint8_t SlaveLocalID;
+
+volatile SlaveTDMAStates SlaveTDMAState = TDMA_Wait_for_Beacon;
+volatile TDMA_msgType TDMA_messageType = TDMA_msgRTS;
+
+
+void TDMA_OnTxDone(void)
+{
+    Radio.Rx(RX_TIMEOUT_VALUE);
+    debug("TDMA_OnTxDone!!\n\r");
+
+}
+
+void TDMA_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;
+    debug("TDMA_OnRxDone!!\n\r");
+
+    switch (SlaveTDMAState) {
+        case TDMA_Wait_for_Beacon:
+
+            if(Buffer[0] == SETUP_BEACON_SYNCWORD) {
+                debug("Beacon Packet\n\r");
+                if(Buffer[1] == SlaveLocalID)
+                {
+                    SlaveTDMAState = TDMA_Send_RTS;
+                    debug("Slave Correct Slot \n\r");
+                }   else    {
+                    debug("Slave InCorrect Slot \n\r");
+                    //SlaveTDMAState = TDMA_Finished;////////////////////////////////
+                    SlaveTDMAState = TDMA_Wait_for_Beacon;
+                }
+            } else {
+                debug("Beacon Mismatch\n\r");
+                
+                SlaveTDMAState = TDMA_Finished;
+            }
+            break;
+
+
+        case TDMA_Wait_for_CTS:
+            TDMA_messageType = TDMA_msgCTS;
+            if (TDMA_messageType == Buffer[0]) {
+                debug("CTS Packet\n\r");
+                SlaveTDMAState = TDMA_Send_Data;
+            } else {
+                debug("Wait for CTS failed \n\r");
+                
+                SlaveTDMAState = TDMA_Finished;
+            }
+            break;
+
+        case TDMA_Wait_for_Ack:
+            TDMA_messageType = TDMA_msgAck;
+            if (TDMA_messageType == Buffer[0]) {
+                debug("Data Sent and Master Acked \n\r");
+                SlaveTDMAState = TDMA_Wait_for_Beacon;
+                
+                SlaveTDMAState = TDMA_Finished;
+            } else {
+                debug("Master Ack Mismatch \n\r");
+                
+                SlaveTDMAState = TDMA_Finished;
+            }
+            break;
+
+        default:
+            debug("Invalid Packet!!");
+            
+            SlaveTDMAState = TDMA_Finished;
+    }
+    
+}
+
+void TDMA_OnTxTimeout(void)
+{
+    debug("TDMA_OnTxTimeout!!\n\r");
+    
+    SlaveTDMAState = TDMA_Finished;
+}
+
+void TDMA_OnRxTimeout(void)
+{
+    debug("TDMA_OnRxTimeout!!\n\r");
+    
+    SlaveTDMAState = TDMA_Finished;
+}
+
+void TDMA_OnRxError(void)
+{
+    debug("TDMA_OnRxError!!\n\r");
+    
+    SlaveTDMAState = TDMA_Finished;
+}
+
+void SlaveTDMA()
+{
+    
+    debug("Slave TDMA Started...\n\r");
+    
+    SlaveTDMAState = TDMA_Wait_for_Beacon;
+
+    // Initialize Radio driver
+    RadioEvents.TxDone = TDMA_OnTxDone;
+    RadioEvents.RxDone = TDMA_OnRxDone;
+    RadioEvents.RxError = TDMA_OnRxError;
+    RadioEvents.TxTimeout = TDMA_OnTxTimeout;
+    RadioEvents.RxTimeout = TDMA_OnRxTimeout;
+    Radio.Init(&RadioEvents);
+
+    Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, SET_UP_LORA_BANDWIDTH,
+                      SET_UP_LORA_SPREADING_FACTOR, LORA_CODINGRATE,
+                      LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
+                      SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
+                      LORA_IQ_INVERSION_ON, 2000000);
+
+    Radio.SetRxConfig(MODEM_LORA, SET_UP_LORA_BANDWIDTH, SET_UP_LORA_SPREADING_FACTOR,
+                      LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
+                      LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
+                      SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
+                      LORA_IQ_INVERSION_ON, true);
+
+    Radio.SetChannel(LORA_Channels[TDMAChannel]);
+    Radio.Rx(RX_TIMEOUT_VALUE);
+
+
+    while (SuperSlotState == TDMA_Phase) {
+        
+        switch (SlaveTDMAState) {
+
+            case TDMA_Send_RTS:
+                TDMA_messageType = TDMA_msgRTS;
+                Buffer[0] = TDMA_messageType;
+                Buffer[1] = SnrValue;
+                Radio.Send(Buffer, BUFFER_SIZE_RTS);
+                debug("Sending RTS\n\r");
+                SlaveTDMAState = TDMA_Wait_for_CTS;
+                break;
+
+            case TDMA_Send_Data:
+                TDMA_messageType = TDMA_msgData;
+                Buffer[0] = TDMA_messageType;
+                Radio.Send(Buffer, BUFFER_SIZE_TDMA_DATA);
+                debug("Sending DATA\n\r");
+                SlaveTDMAState = TDMA_Wait_for_Ack;
+                break;
+                
+            case TDMA_Finished:
+                debug("Slave TDMA Slot Finished...\n\r");
+                return;
+
+
+            case TDMA_Wait_for_Beacon:
+            case TDMA_Wait_for_CTS:
+            case TDMA_Wait_for_Ack:
+
+                break;
+            default:
+                break;
+
+        }
+
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f SlaveTDMA.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SlaveTDMA.h	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,30 @@
+#ifndef _SLAVETDMA_H_
+#define _SLAVETDMA_H_
+
+#include "WANOT.h"
+
+
+typedef enum {
+    TDMA_Wait_for_Beacon = 0,
+    TDMA_Send_RTS,
+    TDMA_Wait_for_CTS,
+    TDMA_Send_Data,
+    TDMA_Wait_for_Ack,
+    TDMA_Finished
+
+
+} SlaveTDMAStates;
+
+
+typedef enum {
+    TDMA_msgRTS = 0x11,
+    TDMA_msgCTS = 0x12,
+    TDMA_msgData = 0x13,
+    TDMA_msgAck = 0x14
+
+} TDMA_msgType;
+
+void SlaveTDMA();
+
+
+#endif //_SLAVETDMA_H_
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f SuperSlot.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SuperSlot.cpp	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,41 @@
+#include "WANOT.h"
+
+/*
+ *  Global variables declarations
+ */
+
+volatile SuperSlotStates SuperSlotState = SetUp_Beacon_Phase;
+Timeout SwitchState;
+
+void SwitchState_Fn(void)
+{
+    switch(SuperSlotState) {
+        case SetUp_Beacon_Phase:
+            debug("Switching to SetUp Phase State !!\n\r");
+            SuperSlotState = SetUp_Phase;
+            SwitchState.attach(&SwitchState_Fn,SET_UP_INTERVAL);
+            break;
+
+        case SetUp_Phase:
+            debug("Switching to TDMA Phase State !!\n\r");
+            SuperSlotState = TDMA_Phase;
+            SwitchState.attach(&SwitchState_Fn,TDMA_INTERVAL);
+            break;
+
+        case TDMA_Phase:
+            debug("SuperSlot States finished\n\r\n\r\n\r");
+            debug("Switching to SetUp Beacon State !! \n\r");
+            SuperSlotState = SetUp_Beacon_Phase;
+            SwitchState.attach(&SwitchState_Fn, BEACON_SET_UP_INTERVAL);
+            break;
+
+    }
+}
+
+void SuperSlotInit ()
+{
+
+    debug("Switching to SetUp Beacon State !! \n\r");
+    SuperSlotState = SetUp_Beacon_Phase;
+    SwitchState.attach(&SwitchState_Fn, BEACON_SET_UP_INTERVAL);
+}
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f SuperSlot.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SuperSlot.h	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,15 @@
+#ifndef _MASTERSUPERSLOT_H_
+#define _MASTERSUPERSLOT_H_
+
+#include "WANOT.h"
+
+typedef enum {
+    SetUp_Beacon_Phase = 0,
+    SetUp_Phase,
+    TDMA_Phase
+
+} SuperSlotStates;
+
+void SuperSlotInit (void);
+
+#endif //_MASTERSUPERSLOT_H_
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f WANOT.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WANOT.h	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,74 @@
+#include "mbed.h"
+#include "sx1276-hal.h"
+#include "debug.h"
+#include "radio.h"
+#include "Serial.h"
+#include "Timeout.h"
+
+#include "SuperSlot.h"
+
+#include "SlaveSetUp.h"
+#include "SlaveBeacon.h"
+#include "SlaveTDMA.h"
+
+#include"GPS.h"
+
+/*
+ *  LoRa Default Params
+ */
+
+#define TX_OUTPUT_POWER                             10        // 14 dBm
+
+#define LORA_CODINGRATE                             1         // [1: 4/5]
+#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 NUMBER_OF_CHANNELS                          8
+#define RSSI_THRESHOLD                              -90
+
+/*
+ *  Set Up Phase Params
+ */
+
+#define SET_UP_LORA_SPREADING_FACTOR                7        // [SF7..SF12]
+#define SET_UP_LORA_CRC_ENABLED                     false
+#define SET_UP_LORA_BANDWIDTH                       0        // [0: 125 kHz,
+#define SET_UP_FREQUENCY                            LORA_Channels[0]
+#define MIN_BACK_OFF                                1000 //uS
+#define RANDOM_BACK_OFF_WINDOW                      10000 //uS
+#define BEACON_TIMEOUT_VALUE                        100000   // in us
+#define TDMA_TIME_OUT_VALUE                         100000
+
+
+/*
+ *  Buffer Sizes
+ */
+
+#define RX_TIMEOUT_VALUE                            100000   // in us
+#define BUFFER_SIZE                                 70        // Define the payload size here
+#define BUFFER_SIZE_RTS                             2
+#define BUFFER_SIZE_CTS                             2
+#define BUFFER_SIZE_JoinReq                         6
+#define BUFFER_SIZE_JoinAccept                      14
+#define BUFFER_SIZE_Ack                             2
+#define BUFFER_SIZE_Beacon                          1
+#define BUFFER_SIZE_TDMA_DATA                       50
+
+/*
+ *  Beacons Synch Words
+ */
+
+#define SETUP_BEACON_SYNCWORD                       0x74
+#define BEACON_SYNCWORD                             0x74
+
+/*
+ *  SuperSlot Phases Intervals
+ */
+ 
+ #define BEACON_SET_UP_INTERVAL                     1.2
+ #define SET_UP_INTERVAL                            19.8
+ #define TDMA_INTERVAL                              39
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,51 @@
+#include"WANOT.h"
+
+/*
+ *  Global variables declarations
+ */
+
+/*!
+ * Radio events function pointer
+ */
+RadioEvents_t RadioEvents;
+
+/*
+ *  Global variables declarations
+ */
+SX1276MB1xAS Radio(NULL);
+
+extern SuperSlotStates SuperSlotState;
+
+
+int main()
+{
+
+    // verify the connection with the board
+    while (Radio.Read(REG_VERSION) == 0x00) {
+        debug("Radio could not be detected!\n\r\r", NULL);
+        wait(1);
+    }
+    debug("WANOT Slave Started...\n\r");
+
+    char StoreRead[50];
+    GPS_Read(StoreRead);
+
+    SuperSlotInit();
+
+    while(1)    {
+        switch(SuperSlotState) {
+            case SetUp_Beacon_Phase:
+                SetUp_Beacon();
+                break;
+
+            case SetUp_Phase:
+                SlaveSetUp();
+                break;
+
+            case TDMA_Phase:
+                SlaveTDMA();
+                break;
+        }
+    }
+
+}
\ No newline at end of file
diff -r 000000000000 -r 80ebf9b1dd4f mbed-src.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-src.lib	Mon May 23 22:28:07 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-src/#a11c0372f0ba