Slave Implementation of WANOT Slave
Dependencies: SX1276Lib mbed-src
SlaveTDMA.cpp@0:80ebf9b1dd4f, 2016-05-23 (annotated)
- Committer:
- semsem
- Date:
- Mon May 23 22:28:07 2016 +0000
- Revision:
- 0:80ebf9b1dd4f
WANOT
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
semsem | 0:80ebf9b1dd4f | 1 | #include "WANOT.h" |
semsem | 0:80ebf9b1dd4f | 2 | |
semsem | 0:80ebf9b1dd4f | 3 | /* |
semsem | 0:80ebf9b1dd4f | 4 | * Global variables declarations |
semsem | 0:80ebf9b1dd4f | 5 | */ |
semsem | 0:80ebf9b1dd4f | 6 | |
semsem | 0:80ebf9b1dd4f | 7 | extern SuperSlotStates SuperSlotState; |
semsem | 0:80ebf9b1dd4f | 8 | extern SlaveRegStates SlaveRegState; |
semsem | 0:80ebf9b1dd4f | 9 | |
semsem | 0:80ebf9b1dd4f | 10 | extern RadioEvents_t RadioEvents; |
semsem | 0:80ebf9b1dd4f | 11 | extern SX1276MB1xAS Radio; |
semsem | 0:80ebf9b1dd4f | 12 | |
semsem | 0:80ebf9b1dd4f | 13 | extern uint16_t BufferSize; |
semsem | 0:80ebf9b1dd4f | 14 | extern uint8_t Buffer[]; |
semsem | 0:80ebf9b1dd4f | 15 | |
semsem | 0:80ebf9b1dd4f | 16 | extern uint32_t LORA_Channels[NUMBER_OF_CHANNELS]; |
semsem | 0:80ebf9b1dd4f | 17 | |
semsem | 0:80ebf9b1dd4f | 18 | extern int16_t RssiValue; |
semsem | 0:80ebf9b1dd4f | 19 | extern int8_t SnrValue; |
semsem | 0:80ebf9b1dd4f | 20 | |
semsem | 0:80ebf9b1dd4f | 21 | extern uint8_t TDMAChannel; |
semsem | 0:80ebf9b1dd4f | 22 | extern uint8_t SlaveLocalID; |
semsem | 0:80ebf9b1dd4f | 23 | |
semsem | 0:80ebf9b1dd4f | 24 | volatile SlaveTDMAStates SlaveTDMAState = TDMA_Wait_for_Beacon; |
semsem | 0:80ebf9b1dd4f | 25 | volatile TDMA_msgType TDMA_messageType = TDMA_msgRTS; |
semsem | 0:80ebf9b1dd4f | 26 | |
semsem | 0:80ebf9b1dd4f | 27 | |
semsem | 0:80ebf9b1dd4f | 28 | void TDMA_OnTxDone(void) |
semsem | 0:80ebf9b1dd4f | 29 | { |
semsem | 0:80ebf9b1dd4f | 30 | Radio.Rx(RX_TIMEOUT_VALUE); |
semsem | 0:80ebf9b1dd4f | 31 | debug("TDMA_OnTxDone!!\n\r"); |
semsem | 0:80ebf9b1dd4f | 32 | |
semsem | 0:80ebf9b1dd4f | 33 | } |
semsem | 0:80ebf9b1dd4f | 34 | |
semsem | 0:80ebf9b1dd4f | 35 | void TDMA_OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) |
semsem | 0:80ebf9b1dd4f | 36 | { |
semsem | 0:80ebf9b1dd4f | 37 | Radio.Sleep(); |
semsem | 0:80ebf9b1dd4f | 38 | BufferSize = size; |
semsem | 0:80ebf9b1dd4f | 39 | memcpy(Buffer, payload, BufferSize); |
semsem | 0:80ebf9b1dd4f | 40 | RssiValue = rssi; |
semsem | 0:80ebf9b1dd4f | 41 | SnrValue = snr; |
semsem | 0:80ebf9b1dd4f | 42 | debug("TDMA_OnRxDone!!\n\r"); |
semsem | 0:80ebf9b1dd4f | 43 | |
semsem | 0:80ebf9b1dd4f | 44 | switch (SlaveTDMAState) { |
semsem | 0:80ebf9b1dd4f | 45 | case TDMA_Wait_for_Beacon: |
semsem | 0:80ebf9b1dd4f | 46 | |
semsem | 0:80ebf9b1dd4f | 47 | if(Buffer[0] == SETUP_BEACON_SYNCWORD) { |
semsem | 0:80ebf9b1dd4f | 48 | debug("Beacon Packet\n\r"); |
semsem | 0:80ebf9b1dd4f | 49 | if(Buffer[1] == SlaveLocalID) |
semsem | 0:80ebf9b1dd4f | 50 | { |
semsem | 0:80ebf9b1dd4f | 51 | SlaveTDMAState = TDMA_Send_RTS; |
semsem | 0:80ebf9b1dd4f | 52 | debug("Slave Correct Slot \n\r"); |
semsem | 0:80ebf9b1dd4f | 53 | } else { |
semsem | 0:80ebf9b1dd4f | 54 | debug("Slave InCorrect Slot \n\r"); |
semsem | 0:80ebf9b1dd4f | 55 | //SlaveTDMAState = TDMA_Finished;//////////////////////////////// |
semsem | 0:80ebf9b1dd4f | 56 | SlaveTDMAState = TDMA_Wait_for_Beacon; |
semsem | 0:80ebf9b1dd4f | 57 | } |
semsem | 0:80ebf9b1dd4f | 58 | } else { |
semsem | 0:80ebf9b1dd4f | 59 | debug("Beacon Mismatch\n\r"); |
semsem | 0:80ebf9b1dd4f | 60 | |
semsem | 0:80ebf9b1dd4f | 61 | SlaveTDMAState = TDMA_Finished; |
semsem | 0:80ebf9b1dd4f | 62 | } |
semsem | 0:80ebf9b1dd4f | 63 | break; |
semsem | 0:80ebf9b1dd4f | 64 | |
semsem | 0:80ebf9b1dd4f | 65 | |
semsem | 0:80ebf9b1dd4f | 66 | case TDMA_Wait_for_CTS: |
semsem | 0:80ebf9b1dd4f | 67 | TDMA_messageType = TDMA_msgCTS; |
semsem | 0:80ebf9b1dd4f | 68 | if (TDMA_messageType == Buffer[0]) { |
semsem | 0:80ebf9b1dd4f | 69 | debug("CTS Packet\n\r"); |
semsem | 0:80ebf9b1dd4f | 70 | SlaveTDMAState = TDMA_Send_Data; |
semsem | 0:80ebf9b1dd4f | 71 | } else { |
semsem | 0:80ebf9b1dd4f | 72 | debug("Wait for CTS failed \n\r"); |
semsem | 0:80ebf9b1dd4f | 73 | |
semsem | 0:80ebf9b1dd4f | 74 | SlaveTDMAState = TDMA_Finished; |
semsem | 0:80ebf9b1dd4f | 75 | } |
semsem | 0:80ebf9b1dd4f | 76 | break; |
semsem | 0:80ebf9b1dd4f | 77 | |
semsem | 0:80ebf9b1dd4f | 78 | case TDMA_Wait_for_Ack: |
semsem | 0:80ebf9b1dd4f | 79 | TDMA_messageType = TDMA_msgAck; |
semsem | 0:80ebf9b1dd4f | 80 | if (TDMA_messageType == Buffer[0]) { |
semsem | 0:80ebf9b1dd4f | 81 | debug("Data Sent and Master Acked \n\r"); |
semsem | 0:80ebf9b1dd4f | 82 | SlaveTDMAState = TDMA_Wait_for_Beacon; |
semsem | 0:80ebf9b1dd4f | 83 | |
semsem | 0:80ebf9b1dd4f | 84 | SlaveTDMAState = TDMA_Finished; |
semsem | 0:80ebf9b1dd4f | 85 | } else { |
semsem | 0:80ebf9b1dd4f | 86 | debug("Master Ack Mismatch \n\r"); |
semsem | 0:80ebf9b1dd4f | 87 | |
semsem | 0:80ebf9b1dd4f | 88 | SlaveTDMAState = TDMA_Finished; |
semsem | 0:80ebf9b1dd4f | 89 | } |
semsem | 0:80ebf9b1dd4f | 90 | break; |
semsem | 0:80ebf9b1dd4f | 91 | |
semsem | 0:80ebf9b1dd4f | 92 | default: |
semsem | 0:80ebf9b1dd4f | 93 | debug("Invalid Packet!!"); |
semsem | 0:80ebf9b1dd4f | 94 | |
semsem | 0:80ebf9b1dd4f | 95 | SlaveTDMAState = TDMA_Finished; |
semsem | 0:80ebf9b1dd4f | 96 | } |
semsem | 0:80ebf9b1dd4f | 97 | |
semsem | 0:80ebf9b1dd4f | 98 | } |
semsem | 0:80ebf9b1dd4f | 99 | |
semsem | 0:80ebf9b1dd4f | 100 | void TDMA_OnTxTimeout(void) |
semsem | 0:80ebf9b1dd4f | 101 | { |
semsem | 0:80ebf9b1dd4f | 102 | debug("TDMA_OnTxTimeout!!\n\r"); |
semsem | 0:80ebf9b1dd4f | 103 | |
semsem | 0:80ebf9b1dd4f | 104 | SlaveTDMAState = TDMA_Finished; |
semsem | 0:80ebf9b1dd4f | 105 | } |
semsem | 0:80ebf9b1dd4f | 106 | |
semsem | 0:80ebf9b1dd4f | 107 | void TDMA_OnRxTimeout(void) |
semsem | 0:80ebf9b1dd4f | 108 | { |
semsem | 0:80ebf9b1dd4f | 109 | debug("TDMA_OnRxTimeout!!\n\r"); |
semsem | 0:80ebf9b1dd4f | 110 | |
semsem | 0:80ebf9b1dd4f | 111 | SlaveTDMAState = TDMA_Finished; |
semsem | 0:80ebf9b1dd4f | 112 | } |
semsem | 0:80ebf9b1dd4f | 113 | |
semsem | 0:80ebf9b1dd4f | 114 | void TDMA_OnRxError(void) |
semsem | 0:80ebf9b1dd4f | 115 | { |
semsem | 0:80ebf9b1dd4f | 116 | debug("TDMA_OnRxError!!\n\r"); |
semsem | 0:80ebf9b1dd4f | 117 | |
semsem | 0:80ebf9b1dd4f | 118 | SlaveTDMAState = TDMA_Finished; |
semsem | 0:80ebf9b1dd4f | 119 | } |
semsem | 0:80ebf9b1dd4f | 120 | |
semsem | 0:80ebf9b1dd4f | 121 | void SlaveTDMA() |
semsem | 0:80ebf9b1dd4f | 122 | { |
semsem | 0:80ebf9b1dd4f | 123 | |
semsem | 0:80ebf9b1dd4f | 124 | debug("Slave TDMA Started...\n\r"); |
semsem | 0:80ebf9b1dd4f | 125 | |
semsem | 0:80ebf9b1dd4f | 126 | SlaveTDMAState = TDMA_Wait_for_Beacon; |
semsem | 0:80ebf9b1dd4f | 127 | |
semsem | 0:80ebf9b1dd4f | 128 | // Initialize Radio driver |
semsem | 0:80ebf9b1dd4f | 129 | RadioEvents.TxDone = TDMA_OnTxDone; |
semsem | 0:80ebf9b1dd4f | 130 | RadioEvents.RxDone = TDMA_OnRxDone; |
semsem | 0:80ebf9b1dd4f | 131 | RadioEvents.RxError = TDMA_OnRxError; |
semsem | 0:80ebf9b1dd4f | 132 | RadioEvents.TxTimeout = TDMA_OnTxTimeout; |
semsem | 0:80ebf9b1dd4f | 133 | RadioEvents.RxTimeout = TDMA_OnRxTimeout; |
semsem | 0:80ebf9b1dd4f | 134 | Radio.Init(&RadioEvents); |
semsem | 0:80ebf9b1dd4f | 135 | |
semsem | 0:80ebf9b1dd4f | 136 | Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, SET_UP_LORA_BANDWIDTH, |
semsem | 0:80ebf9b1dd4f | 137 | SET_UP_LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
semsem | 0:80ebf9b1dd4f | 138 | LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
semsem | 0:80ebf9b1dd4f | 139 | SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
semsem | 0:80ebf9b1dd4f | 140 | LORA_IQ_INVERSION_ON, 2000000); |
semsem | 0:80ebf9b1dd4f | 141 | |
semsem | 0:80ebf9b1dd4f | 142 | Radio.SetRxConfig(MODEM_LORA, SET_UP_LORA_BANDWIDTH, SET_UP_LORA_SPREADING_FACTOR, |
semsem | 0:80ebf9b1dd4f | 143 | LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, |
semsem | 0:80ebf9b1dd4f | 144 | LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, |
semsem | 0:80ebf9b1dd4f | 145 | SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
semsem | 0:80ebf9b1dd4f | 146 | LORA_IQ_INVERSION_ON, true); |
semsem | 0:80ebf9b1dd4f | 147 | |
semsem | 0:80ebf9b1dd4f | 148 | Radio.SetChannel(LORA_Channels[TDMAChannel]); |
semsem | 0:80ebf9b1dd4f | 149 | Radio.Rx(RX_TIMEOUT_VALUE); |
semsem | 0:80ebf9b1dd4f | 150 | |
semsem | 0:80ebf9b1dd4f | 151 | |
semsem | 0:80ebf9b1dd4f | 152 | while (SuperSlotState == TDMA_Phase) { |
semsem | 0:80ebf9b1dd4f | 153 | |
semsem | 0:80ebf9b1dd4f | 154 | switch (SlaveTDMAState) { |
semsem | 0:80ebf9b1dd4f | 155 | |
semsem | 0:80ebf9b1dd4f | 156 | case TDMA_Send_RTS: |
semsem | 0:80ebf9b1dd4f | 157 | TDMA_messageType = TDMA_msgRTS; |
semsem | 0:80ebf9b1dd4f | 158 | Buffer[0] = TDMA_messageType; |
semsem | 0:80ebf9b1dd4f | 159 | Buffer[1] = SnrValue; |
semsem | 0:80ebf9b1dd4f | 160 | Radio.Send(Buffer, BUFFER_SIZE_RTS); |
semsem | 0:80ebf9b1dd4f | 161 | debug("Sending RTS\n\r"); |
semsem | 0:80ebf9b1dd4f | 162 | SlaveTDMAState = TDMA_Wait_for_CTS; |
semsem | 0:80ebf9b1dd4f | 163 | break; |
semsem | 0:80ebf9b1dd4f | 164 | |
semsem | 0:80ebf9b1dd4f | 165 | case TDMA_Send_Data: |
semsem | 0:80ebf9b1dd4f | 166 | TDMA_messageType = TDMA_msgData; |
semsem | 0:80ebf9b1dd4f | 167 | Buffer[0] = TDMA_messageType; |
semsem | 0:80ebf9b1dd4f | 168 | Radio.Send(Buffer, BUFFER_SIZE_TDMA_DATA); |
semsem | 0:80ebf9b1dd4f | 169 | debug("Sending DATA\n\r"); |
semsem | 0:80ebf9b1dd4f | 170 | SlaveTDMAState = TDMA_Wait_for_Ack; |
semsem | 0:80ebf9b1dd4f | 171 | break; |
semsem | 0:80ebf9b1dd4f | 172 | |
semsem | 0:80ebf9b1dd4f | 173 | case TDMA_Finished: |
semsem | 0:80ebf9b1dd4f | 174 | debug("Slave TDMA Slot Finished...\n\r"); |
semsem | 0:80ebf9b1dd4f | 175 | return; |
semsem | 0:80ebf9b1dd4f | 176 | |
semsem | 0:80ebf9b1dd4f | 177 | |
semsem | 0:80ebf9b1dd4f | 178 | case TDMA_Wait_for_Beacon: |
semsem | 0:80ebf9b1dd4f | 179 | case TDMA_Wait_for_CTS: |
semsem | 0:80ebf9b1dd4f | 180 | case TDMA_Wait_for_Ack: |
semsem | 0:80ebf9b1dd4f | 181 | |
semsem | 0:80ebf9b1dd4f | 182 | break; |
semsem | 0:80ebf9b1dd4f | 183 | default: |
semsem | 0:80ebf9b1dd4f | 184 | break; |
semsem | 0:80ebf9b1dd4f | 185 | |
semsem | 0:80ebf9b1dd4f | 186 | } |
semsem | 0:80ebf9b1dd4f | 187 | |
semsem | 0:80ebf9b1dd4f | 188 | } |
semsem | 0:80ebf9b1dd4f | 189 | } |