houss red
/
Master_F
Master Implementation of WANOT
MasterSetUp.cpp@0:8b449140caa2, 2016-05-23 (annotated)
- Committer:
- semsem
- Date:
- Mon May 23 22:25:40 2016 +0000
- Revision:
- 0:8b449140caa2
V0.2
Who changed what in which revision?
User | Revision | Line number | New 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 | } |