Master Implementation of WANOT

Dependencies:   SX1276Lib mbed

Committer:
semsem
Date:
Mon May 23 22:25:40 2016 +0000
Revision:
0:8b449140caa2
V0.2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
semsem 0:8b449140caa2 1
semsem 0:8b449140caa2 2 #include "WANOT.h"
semsem 0:8b449140caa2 3
semsem 0:8b449140caa2 4 /*
semsem 0:8b449140caa2 5 * Global variables declarations
semsem 0:8b449140caa2 6 */
semsem 0:8b449140caa2 7
semsem 0:8b449140caa2 8 extern SuperSlotStates SuperSlotState;
semsem 0:8b449140caa2 9
semsem 0:8b449140caa2 10 volatile MasterSetUpStates MasterSetUpState = sendBeacon;
semsem 0:8b449140caa2 11
semsem 0:8b449140caa2 12 volatile msgType messageType = msgRTS;
semsem 0:8b449140caa2 13
semsem 0:8b449140caa2 14 extern RadioEvents_t RadioEvents;
semsem 0:8b449140caa2 15 extern SX1276MB1xAS Radio;
semsem 0:8b449140caa2 16
semsem 0:8b449140caa2 17 extern uint16_t BufferSize;
semsem 0:8b449140caa2 18 extern uint8_t Buffer[];
semsem 0:8b449140caa2 19
semsem 0:8b449140caa2 20 extern uint32_t LORA_Channels[NUMBER_OF_CHANNELS];
semsem 0:8b449140caa2 21
semsem 0:8b449140caa2 22 extern int16_t RssiValue;
semsem 0:8b449140caa2 23 extern int8_t SnrValue;
semsem 0:8b449140caa2 24
semsem 0:8b449140caa2 25 extern uint8_t TDMAChannel;
semsem 0:8b449140caa2 26
semsem 0:8b449140caa2 27 static Timer timer;
semsem 0:8b449140caa2 28 static int begin, end;
semsem 0:8b449140caa2 29
semsem 0:8b449140caa2 30 void SetUp_OnTxDone(void)
semsem 0:8b449140caa2 31 {
semsem 0:8b449140caa2 32 if(MasterSetUpState != Wait_for_JoinReq)
semsem 0:8b449140caa2 33 Radio.Rx(RX_TIMEOUT_VALUE);
semsem 0:8b449140caa2 34 else
semsem 0:8b449140caa2 35 Radio.Rx(1.5 * RX_TIMEOUT_VALUE);
semsem 0:8b449140caa2 36 debug("OnTxDone!!\n\r");
semsem 0:8b449140caa2 37
semsem 0:8b449140caa2 38 }
semsem 0:8b449140caa2 39
semsem 0:8b449140caa2 40 void SetUp_OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
semsem 0:8b449140caa2 41 {
semsem 0:8b449140caa2 42 Radio.Sleep();
semsem 0:8b449140caa2 43 BufferSize = size;
semsem 0:8b449140caa2 44 memcpy(Buffer, payload, BufferSize);
semsem 0:8b449140caa2 45 RssiValue = rssi;
semsem 0:8b449140caa2 46 SnrValue = snr;
semsem 0:8b449140caa2 47
semsem 0:8b449140caa2 48 debug("OnRxDone!!\n\r");
semsem 0:8b449140caa2 49
semsem 0:8b449140caa2 50 switch (MasterSetUpState) {
semsem 0:8b449140caa2 51 case Wait_for_RTS:
semsem 0:8b449140caa2 52 messageType = msgRTS;
semsem 0:8b449140caa2 53 if (messageType == Buffer[0]) {
semsem 0:8b449140caa2 54 MasterSetUpState = Send_CTS;
semsem 0:8b449140caa2 55 debug("RTS Packet\n\r");
semsem 0:8b449140caa2 56 } else {
semsem 0:8b449140caa2 57 MasterSetUpState = sendBeacon;
semsem 0:8b449140caa2 58 debug("RTS Packet Mismatch\n\r");
semsem 0:8b449140caa2 59 }
semsem 0:8b449140caa2 60 break;
semsem 0:8b449140caa2 61
semsem 0:8b449140caa2 62 case Wait_for_JoinReq:
semsem 0:8b449140caa2 63 messageType = msgJoinReq;
semsem 0:8b449140caa2 64 if (messageType == Buffer[0]) {
semsem 0:8b449140caa2 65 MasterSetUpState = Send_JoinAccept;
semsem 0:8b449140caa2 66 debug("JoinReq Packet\n\r");
semsem 0:8b449140caa2 67 } else {
semsem 0:8b449140caa2 68 MasterSetUpState = sendBeacon;
semsem 0:8b449140caa2 69 debug("JoinReq Packet Mismatch\n\r");
semsem 0:8b449140caa2 70 }
semsem 0:8b449140caa2 71 break;
semsem 0:8b449140caa2 72
semsem 0:8b449140caa2 73 case Wait_for_Ack:
semsem 0:8b449140caa2 74 messageType = msgAck;
semsem 0:8b449140caa2 75 if (messageType == Buffer[0]) {
semsem 0:8b449140caa2 76 MasterSetUpState = AckDone;
semsem 0:8b449140caa2 77 debug("Ack Packet\n\r");
semsem 0:8b449140caa2 78 } else {
semsem 0:8b449140caa2 79 MasterSetUpState = sendBeacon;
semsem 0:8b449140caa2 80 debug("Ack Packet Mistmatch\n\r");
semsem 0:8b449140caa2 81
semsem 0:8b449140caa2 82 }
semsem 0:8b449140caa2 83 break;
semsem 0:8b449140caa2 84
semsem 0:8b449140caa2 85 default:
semsem 0:8b449140caa2 86 break;
semsem 0:8b449140caa2 87 }
semsem 0:8b449140caa2 88
semsem 0:8b449140caa2 89
semsem 0:8b449140caa2 90 }
semsem 0:8b449140caa2 91
semsem 0:8b449140caa2 92
semsem 0:8b449140caa2 93
semsem 0:8b449140caa2 94 void SetUp_OnTxTimeout(void)
semsem 0:8b449140caa2 95 {
semsem 0:8b449140caa2 96
semsem 0:8b449140caa2 97 }
semsem 0:8b449140caa2 98
semsem 0:8b449140caa2 99 void SetUp_OnRxTimeout(void)
semsem 0:8b449140caa2 100 {
semsem 0:8b449140caa2 101 MasterSetUpState = sendBeacon;
semsem 0:8b449140caa2 102 debug("OnRxTimeout!!\n\r");
semsem 0:8b449140caa2 103
semsem 0:8b449140caa2 104 }
semsem 0:8b449140caa2 105
semsem 0:8b449140caa2 106 void SetUp_OnRxError(void)
semsem 0:8b449140caa2 107 {
semsem 0:8b449140caa2 108 MasterSetUpState = sendBeacon;
semsem 0:8b449140caa2 109 }
semsem 0:8b449140caa2 110
semsem 0:8b449140caa2 111 void MasterSetUp()
semsem 0:8b449140caa2 112 {
semsem 0:8b449140caa2 113 debug("Master Set Up Phase Started...\n\r");
semsem 0:8b449140caa2 114
semsem 0:8b449140caa2 115 timer.start();
semsem 0:8b449140caa2 116 begin = timer.read_us();
semsem 0:8b449140caa2 117
semsem 0:8b449140caa2 118 // Initialize Radio driver
semsem 0:8b449140caa2 119 RadioEvents.TxDone = SetUp_OnTxDone;
semsem 0:8b449140caa2 120 RadioEvents.RxDone = SetUp_OnRxDone;
semsem 0:8b449140caa2 121 RadioEvents.RxError = SetUp_OnRxError;
semsem 0:8b449140caa2 122 RadioEvents.TxTimeout = SetUp_OnTxTimeout;
semsem 0:8b449140caa2 123 RadioEvents.RxTimeout = SetUp_OnRxTimeout;
semsem 0:8b449140caa2 124 Radio.Init(&RadioEvents);
semsem 0:8b449140caa2 125
semsem 0:8b449140caa2 126 uint8_t Beacon_Counter = 0;
semsem 0:8b449140caa2 127
semsem 0:8b449140caa2 128 while (SuperSlotState == SetUp_Phase) {
semsem 0:8b449140caa2 129 switch (MasterSetUpState) {
semsem 0:8b449140caa2 130 case sendBeacon:
semsem 0:8b449140caa2 131 if(Beacon_Counter <=4) {
semsem 0:8b449140caa2 132 Beacon_Counter++;
semsem 0:8b449140caa2 133 Buffer[0] = SETUP_BEACON_SYNCWORD;
semsem 0:8b449140caa2 134 Radio.Send(Buffer, BUFFER_SIZE_RTS);
semsem 0:8b449140caa2 135 debug("Sending Beacon\n\r");
semsem 0:8b449140caa2 136 MasterSetUpState = Wait_for_RTS;
semsem 0:8b449140caa2 137 } else {
semsem 0:8b449140caa2 138 debug("Beacon Timed Out without SLaves\n\r");
semsem 0:8b449140caa2 139 MasterSetUpState = Slave_Not_Found;
semsem 0:8b449140caa2 140 Beacon_Counter = 0;
semsem 0:8b449140caa2 141 }
semsem 0:8b449140caa2 142 break;
semsem 0:8b449140caa2 143
semsem 0:8b449140caa2 144 case Send_CTS:
semsem 0:8b449140caa2 145 messageType = msgCTS;
semsem 0:8b449140caa2 146 Buffer[0] = messageType;
semsem 0:8b449140caa2 147 Buffer[1] = SnrValue;
semsem 0:8b449140caa2 148 Radio.Send(Buffer, BUFFER_SIZE_CTS);
semsem 0:8b449140caa2 149 debug("Sending CTS\n\r");
semsem 0:8b449140caa2 150 MasterSetUpState = Wait_for_JoinReq;
semsem 0:8b449140caa2 151 break;
semsem 0:8b449140caa2 152
semsem 0:8b449140caa2 153 case Send_JoinAccept:
semsem 0:8b449140caa2 154 messageType = msgJoinAccept;
semsem 0:8b449140caa2 155 Buffer[0] = messageType;
semsem 0:8b449140caa2 156 Buffer[11] = 5;
semsem 0:8b449140caa2 157 Radio.Send(Buffer, BUFFER_SIZE_JoinAccept);
semsem 0:8b449140caa2 158 debug("Sending JoinAccept\n\r");
semsem 0:8b449140caa2 159 MasterSetUpState = Wait_for_Ack;
semsem 0:8b449140caa2 160 break;
semsem 0:8b449140caa2 161
semsem 0:8b449140caa2 162 case AckDone:
semsem 0:8b449140caa2 163 debug("Ack done: +1 \n\r");
semsem 0:8b449140caa2 164 MasterSetUpState = sendBeacon;
semsem 0:8b449140caa2 165 end = timer.read_us();
semsem 0:8b449140caa2 166 debug("Registeration took : %f S\n\r", (end-begin)/1000000.0);
semsem 0:8b449140caa2 167 break;
semsem 0:8b449140caa2 168
semsem 0:8b449140caa2 169 case Slave_Not_Found:
semsem 0:8b449140caa2 170 debug("Slave Not Found .. Sleep");
semsem 0:8b449140caa2 171 Radio.Sleep();
semsem 0:8b449140caa2 172 MasterSetUpState = sendBeacon;
semsem 0:8b449140caa2 173 break;
semsem 0:8b449140caa2 174
semsem 0:8b449140caa2 175 case Wait_for_Ack:
semsem 0:8b449140caa2 176 case Wait_for_RTS:
semsem 0:8b449140caa2 177 case Wait_for_JoinReq:
semsem 0:8b449140caa2 178 break;
semsem 0:8b449140caa2 179 default:
semsem 0:8b449140caa2 180 break;
semsem 0:8b449140caa2 181
semsem 0:8b449140caa2 182 }
semsem 0:8b449140caa2 183
semsem 0:8b449140caa2 184 }
semsem 0:8b449140caa2 185 debug("Master Set Up Phase Finished...\n\r");
semsem 0:8b449140caa2 186 }