Slave Implementation of WANOT Slave

Dependencies:   SX1276Lib mbed-src

SlaveTDMA.cpp

Committer:
semsem
Date:
2016-05-23
Revision:
0:80ebf9b1dd4f

File content as of revision 0:80ebf9b1dd4f:

#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;

        }

    }
}