Handheld_Node
Dependencies: XBeeLib_Handheld_V2 mbed
main.cpp@0:02cdf2401901, 2018-07-25 (annotated)
- Committer:
- basvuyk
- Date:
- Wed Jul 25 09:15:06 2018 +0000
- Revision:
- 0:02cdf2401901
Handheld_Node
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
basvuyk | 0:02cdf2401901 | 1 | #include "mbed.h" |
basvuyk | 0:02cdf2401901 | 2 | #include "XBeeLib.h" |
basvuyk | 0:02cdf2401901 | 3 | |
basvuyk | 0:02cdf2401901 | 4 | using namespace XBeeLib; |
basvuyk | 0:02cdf2401901 | 5 | |
basvuyk | 0:02cdf2401901 | 6 | typedef enum |
basvuyk | 0:02cdf2401901 | 7 | { |
basvuyk | 0:02cdf2401901 | 8 | BOOTING, |
basvuyk | 0:02cdf2401901 | 9 | NORMAL_OPERATION, |
basvuyk | 0:02cdf2401901 | 10 | EMERGENCY, |
basvuyk | 0:02cdf2401901 | 11 | WAIT_FOR_RESET, |
basvuyk | 0:02cdf2401901 | 12 | HEARTBEAT_ERROR, |
basvuyk | 0:02cdf2401901 | 13 | GRACE_PERIOD, |
basvuyk | 0:02cdf2401901 | 14 | } state_t; |
basvuyk | 0:02cdf2401901 | 15 | |
basvuyk | 0:02cdf2401901 | 16 | state_t currentState = BOOTING; |
basvuyk | 0:02cdf2401901 | 17 | |
basvuyk | 0:02cdf2401901 | 18 | int receivedData, currentMessageCounter, graceCounter, currentTimerValue; |
basvuyk | 0:02cdf2401901 | 19 | |
basvuyk | 0:02cdf2401901 | 20 | /* |
basvuyk | 0:02cdf2401901 | 21 | STATE_MESSAGES: |
basvuyk | 0:02cdf2401901 | 22 | HEARTBEAT = 49 |
basvuyk | 0:02cdf2401901 | 23 | EMERGENCY = 50 |
basvuyk | 0:02cdf2401901 | 24 | RESET = 46 |
basvuyk | 0:02cdf2401901 | 25 | */ |
basvuyk | 0:02cdf2401901 | 26 | |
basvuyk | 0:02cdf2401901 | 27 | //------------Define Digimesh Variables------------// |
basvuyk | 0:02cdf2401901 | 28 | #define channel 0x18 |
basvuyk | 0:02cdf2401901 | 29 | #define networkId 0xD164 |
basvuyk | 0:02cdf2401901 | 30 | #define powerLevel 4 |
basvuyk | 0:02cdf2401901 | 31 | #define nodeId "handheld" |
basvuyk | 0:02cdf2401901 | 32 | #define baudRate 230400 |
basvuyk | 0:02cdf2401901 | 33 | //------------Define Digimesh Variables------------// |
basvuyk | 0:02cdf2401901 | 34 | |
basvuyk | 0:02cdf2401901 | 35 | //------------Define Pinouts------------// |
basvuyk | 0:02cdf2401901 | 36 | DigitalOut statusLED(PB_5); |
basvuyk | 0:02cdf2401901 | 37 | DigitalOut powerLED(PB_4); |
basvuyk | 0:02cdf2401901 | 38 | |
basvuyk | 0:02cdf2401901 | 39 | DigitalIn localEstop(PA_12); |
basvuyk | 0:02cdf2401901 | 40 | |
basvuyk | 0:02cdf2401901 | 41 | DigitalOut BATT_100(PB_1); |
basvuyk | 0:02cdf2401901 | 42 | DigitalOut BATT_50(PB_7); |
basvuyk | 0:02cdf2401901 | 43 | DigitalOut BATT_0(PB_6); |
basvuyk | 0:02cdf2401901 | 44 | AnalogIn BATT_MON(PA_3); |
basvuyk | 0:02cdf2401901 | 45 | DigitalIn BATT_CHAR(PF_1); |
basvuyk | 0:02cdf2401901 | 46 | |
basvuyk | 0:02cdf2401901 | 47 | DigitalOut buzzerPin(PB_0); |
basvuyk | 0:02cdf2401901 | 48 | //------------Define Pinouts------------// |
basvuyk | 0:02cdf2401901 | 49 | |
basvuyk | 0:02cdf2401901 | 50 | Timer runHeartbeatTimer, runSystemChecksTimer, runBatteryTimer; |
basvuyk | 0:02cdf2401901 | 51 | |
basvuyk | 0:02cdf2401901 | 52 | void radioConfig(XBeeDM &DMLocalNode){ |
basvuyk | 0:02cdf2401901 | 53 | RadioStatus temp = DMLocalNode.init(); |
basvuyk | 0:02cdf2401901 | 54 | temp = DMLocalNode.set_channel(channel); |
basvuyk | 0:02cdf2401901 | 55 | temp = DMLocalNode.set_network_id(networkId); |
basvuyk | 0:02cdf2401901 | 56 | temp = DMLocalNode.set_power_level(powerLevel); |
basvuyk | 0:02cdf2401901 | 57 | temp = DMLocalNode.set_node_identifier(nodeId); |
basvuyk | 0:02cdf2401901 | 58 | temp = DMLocalNode.write_config(); |
basvuyk | 0:02cdf2401901 | 59 | } |
basvuyk | 0:02cdf2401901 | 60 | |
basvuyk | 0:02cdf2401901 | 61 | void boot(XBeeDM &DMLocalNode){ |
basvuyk | 0:02cdf2401901 | 62 | radioConfig(DMLocalNode); |
basvuyk | 0:02cdf2401901 | 63 | buzzerPin.write(1); |
basvuyk | 0:02cdf2401901 | 64 | wait(0.2); |
basvuyk | 0:02cdf2401901 | 65 | buzzerPin.write(0); |
basvuyk | 0:02cdf2401901 | 66 | } |
basvuyk | 0:02cdf2401901 | 67 | |
basvuyk | 0:02cdf2401901 | 68 | static void receive_cb(const RemoteXBeeDM& remote, bool broadcast, const uint8_t *const data, uint16_t len){ |
basvuyk | 0:02cdf2401901 | 69 | receivedData = (data[0]-3); |
basvuyk | 0:02cdf2401901 | 70 | } |
basvuyk | 0:02cdf2401901 | 71 | |
basvuyk | 0:02cdf2401901 | 72 | static void sendMessage(XBeeDM &DMLocalNode, char *sendData){ |
basvuyk | 0:02cdf2401901 | 73 | const char data[] = {*sendData}; |
basvuyk | 0:02cdf2401901 | 74 | const uint16_t data_len = strlen(data); |
basvuyk | 0:02cdf2401901 | 75 | |
basvuyk | 0:02cdf2401901 | 76 | const TxStatus txStatus = DMLocalNode.send_data_broadcast((const uint8_t *)data, data_len); |
basvuyk | 0:02cdf2401901 | 77 | } |
basvuyk | 0:02cdf2401901 | 78 | |
basvuyk | 0:02cdf2401901 | 79 | void checkLocalEstop(){ |
basvuyk | 0:02cdf2401901 | 80 | if (localEstop == 0){ |
basvuyk | 0:02cdf2401901 | 81 | currentState = EMERGENCY; |
basvuyk | 0:02cdf2401901 | 82 | } |
basvuyk | 0:02cdf2401901 | 83 | if (localEstop == 1 && currentState == EMERGENCY){ |
basvuyk | 0:02cdf2401901 | 84 | currentState = WAIT_FOR_RESET; |
basvuyk | 0:02cdf2401901 | 85 | } |
basvuyk | 0:02cdf2401901 | 86 | } |
basvuyk | 0:02cdf2401901 | 87 | |
basvuyk | 0:02cdf2401901 | 88 | void stateHandler(XBeeDM &DMLocalNode){ |
basvuyk | 0:02cdf2401901 | 89 | if (currentState == NORMAL_OPERATION){ |
basvuyk | 0:02cdf2401901 | 90 | checkLocalEstop(); |
basvuyk | 0:02cdf2401901 | 91 | |
basvuyk | 0:02cdf2401901 | 92 | statusLED.write(1); |
basvuyk | 0:02cdf2401901 | 93 | powerLED.write(0); |
basvuyk | 0:02cdf2401901 | 94 | } |
basvuyk | 0:02cdf2401901 | 95 | |
basvuyk | 0:02cdf2401901 | 96 | if (currentState == EMERGENCY && currentMessageCounter != 5){ |
basvuyk | 0:02cdf2401901 | 97 | sendMessage(DMLocalNode, "50"); |
basvuyk | 0:02cdf2401901 | 98 | checkLocalEstop(); |
basvuyk | 0:02cdf2401901 | 99 | currentMessageCounter++; |
basvuyk | 0:02cdf2401901 | 100 | |
basvuyk | 0:02cdf2401901 | 101 | statusLED.write(0); |
basvuyk | 0:02cdf2401901 | 102 | powerLED.write(1); |
basvuyk | 0:02cdf2401901 | 103 | } |
basvuyk | 0:02cdf2401901 | 104 | |
basvuyk | 0:02cdf2401901 | 105 | if (currentState == WAIT_FOR_RESET){ |
basvuyk | 0:02cdf2401901 | 106 | currentMessageCounter = 0; |
basvuyk | 0:02cdf2401901 | 107 | |
basvuyk | 0:02cdf2401901 | 108 | statusLED.write(0); |
basvuyk | 0:02cdf2401901 | 109 | powerLED.write(1); |
basvuyk | 0:02cdf2401901 | 110 | } |
basvuyk | 0:02cdf2401901 | 111 | |
basvuyk | 0:02cdf2401901 | 112 | if (currentState == HEARTBEAT_ERROR){ |
basvuyk | 0:02cdf2401901 | 113 | statusLED.write(0); |
basvuyk | 0:02cdf2401901 | 114 | powerLED.write(0); |
basvuyk | 0:02cdf2401901 | 115 | } |
basvuyk | 0:02cdf2401901 | 116 | |
basvuyk | 0:02cdf2401901 | 117 | if (currentState == GRACE_PERIOD){ |
basvuyk | 0:02cdf2401901 | 118 | graceCounter++; |
basvuyk | 0:02cdf2401901 | 119 | if (graceCounter == 100){ |
basvuyk | 0:02cdf2401901 | 120 | currentState = NORMAL_OPERATION; |
basvuyk | 0:02cdf2401901 | 121 | graceCounter = 0; |
basvuyk | 0:02cdf2401901 | 122 | } |
basvuyk | 0:02cdf2401901 | 123 | } |
basvuyk | 0:02cdf2401901 | 124 | } |
basvuyk | 0:02cdf2401901 | 125 | |
basvuyk | 0:02cdf2401901 | 126 | void heartbeatTimerReset(){ |
basvuyk | 0:02cdf2401901 | 127 | currentTimerValue = 0; |
basvuyk | 0:02cdf2401901 | 128 | } |
basvuyk | 0:02cdf2401901 | 129 | |
basvuyk | 0:02cdf2401901 | 130 | void checkHeartbeat(){ |
basvuyk | 0:02cdf2401901 | 131 | if (currentState == NORMAL_OPERATION){ |
basvuyk | 0:02cdf2401901 | 132 | currentTimerValue++; |
basvuyk | 0:02cdf2401901 | 133 | if (currentTimerValue > 7){ |
basvuyk | 0:02cdf2401901 | 134 | currentState = HEARTBEAT_ERROR; |
basvuyk | 0:02cdf2401901 | 135 | } |
basvuyk | 0:02cdf2401901 | 136 | } |
basvuyk | 0:02cdf2401901 | 137 | } |
basvuyk | 0:02cdf2401901 | 138 | |
basvuyk | 0:02cdf2401901 | 139 | void handleMessages(XBeeDM &DMLocalNode){ |
basvuyk | 0:02cdf2401901 | 140 | if (receivedData == 50){ |
basvuyk | 0:02cdf2401901 | 141 | currentState = EMERGENCY; |
basvuyk | 0:02cdf2401901 | 142 | graceCounter = 0; |
basvuyk | 0:02cdf2401901 | 143 | } |
basvuyk | 0:02cdf2401901 | 144 | |
basvuyk | 0:02cdf2401901 | 145 | if (localEstop == 1 && currentState == EMERGENCY){ |
basvuyk | 0:02cdf2401901 | 146 | currentState = WAIT_FOR_RESET; |
basvuyk | 0:02cdf2401901 | 147 | } |
basvuyk | 0:02cdf2401901 | 148 | |
basvuyk | 0:02cdf2401901 | 149 | if (currentState == WAIT_FOR_RESET && localEstop == 1 && receivedData == 46){ |
basvuyk | 0:02cdf2401901 | 150 | currentState = GRACE_PERIOD; |
basvuyk | 0:02cdf2401901 | 151 | } |
basvuyk | 0:02cdf2401901 | 152 | |
basvuyk | 0:02cdf2401901 | 153 | if (receivedData == 49){ |
basvuyk | 0:02cdf2401901 | 154 | heartbeatTimerReset(); |
basvuyk | 0:02cdf2401901 | 155 | } |
basvuyk | 0:02cdf2401901 | 156 | |
basvuyk | 0:02cdf2401901 | 157 | if (receivedData == 49 && currentState == HEARTBEAT_ERROR){ |
basvuyk | 0:02cdf2401901 | 158 | currentState = WAIT_FOR_RESET; |
basvuyk | 0:02cdf2401901 | 159 | heartbeatTimerReset(); |
basvuyk | 0:02cdf2401901 | 160 | } |
basvuyk | 0:02cdf2401901 | 161 | |
basvuyk | 0:02cdf2401901 | 162 | if (currentState == EMERGENCY && currentMessageCounter == 5 && receivedData == 46){ |
basvuyk | 0:02cdf2401901 | 163 | currentMessageCounter = 0; |
basvuyk | 0:02cdf2401901 | 164 | } |
basvuyk | 0:02cdf2401901 | 165 | } |
basvuyk | 0:02cdf2401901 | 166 | |
basvuyk | 0:02cdf2401901 | 167 | void runSystemChecks(XBeeDM &DMLocalNode){ |
basvuyk | 0:02cdf2401901 | 168 | stateHandler(DMLocalNode); |
basvuyk | 0:02cdf2401901 | 169 | handleMessages(DMLocalNode); |
basvuyk | 0:02cdf2401901 | 170 | } |
basvuyk | 0:02cdf2401901 | 171 | |
basvuyk | 0:02cdf2401901 | 172 | void batteryMonitor(){ |
basvuyk | 0:02cdf2401901 | 173 | float batVal = BATT_MON*5.9f; |
basvuyk | 0:02cdf2401901 | 174 | |
basvuyk | 0:02cdf2401901 | 175 | if (batVal > 3.9f){ |
basvuyk | 0:02cdf2401901 | 176 | BATT_100.write(1); |
basvuyk | 0:02cdf2401901 | 177 | BATT_50.write(1); |
basvuyk | 0:02cdf2401901 | 178 | BATT_0.write(1); |
basvuyk | 0:02cdf2401901 | 179 | buzzerPin.write(0); |
basvuyk | 0:02cdf2401901 | 180 | } |
basvuyk | 0:02cdf2401901 | 181 | else if (batVal < 3.89f && batVal > 3.65f){ |
basvuyk | 0:02cdf2401901 | 182 | BATT_100.write(0); |
basvuyk | 0:02cdf2401901 | 183 | BATT_50.write(1); |
basvuyk | 0:02cdf2401901 | 184 | BATT_0.write(1); |
basvuyk | 0:02cdf2401901 | 185 | buzzerPin.write(0); |
basvuyk | 0:02cdf2401901 | 186 | } |
basvuyk | 0:02cdf2401901 | 187 | else if (batVal < 3.64f && batVal > 3.4f){ |
basvuyk | 0:02cdf2401901 | 188 | BATT_100.write(0); |
basvuyk | 0:02cdf2401901 | 189 | BATT_50.write(0); |
basvuyk | 0:02cdf2401901 | 190 | BATT_0.write(1); |
basvuyk | 0:02cdf2401901 | 191 | buzzerPin.write(0); |
basvuyk | 0:02cdf2401901 | 192 | } |
basvuyk | 0:02cdf2401901 | 193 | else if (batVal < 3.39f){ |
basvuyk | 0:02cdf2401901 | 194 | BATT_100.write(0); |
basvuyk | 0:02cdf2401901 | 195 | BATT_50.write(0); |
basvuyk | 0:02cdf2401901 | 196 | BATT_0.write(0); |
basvuyk | 0:02cdf2401901 | 197 | if (BATT_CHAR == 0){ |
basvuyk | 0:02cdf2401901 | 198 | buzzerPin.write(1); |
basvuyk | 0:02cdf2401901 | 199 | } |
basvuyk | 0:02cdf2401901 | 200 | else |
basvuyk | 0:02cdf2401901 | 201 | { |
basvuyk | 0:02cdf2401901 | 202 | buzzerPin.write(0); |
basvuyk | 0:02cdf2401901 | 203 | } |
basvuyk | 0:02cdf2401901 | 204 | } |
basvuyk | 0:02cdf2401901 | 205 | } |
basvuyk | 0:02cdf2401901 | 206 | |
basvuyk | 0:02cdf2401901 | 207 | int main() { |
basvuyk | 0:02cdf2401901 | 208 | XBeeDM DMLocalNode = XBeeDM(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, baudRate); |
basvuyk | 0:02cdf2401901 | 209 | |
basvuyk | 0:02cdf2401901 | 210 | boot(DMLocalNode); |
basvuyk | 0:02cdf2401901 | 211 | batteryMonitor(); |
basvuyk | 0:02cdf2401901 | 212 | DMLocalNode.register_receive_cb(&receive_cb); |
basvuyk | 0:02cdf2401901 | 213 | |
basvuyk | 0:02cdf2401901 | 214 | currentState = WAIT_FOR_RESET; |
basvuyk | 0:02cdf2401901 | 215 | |
basvuyk | 0:02cdf2401901 | 216 | runSystemChecksTimer.start(); |
basvuyk | 0:02cdf2401901 | 217 | runHeartbeatTimer.start(); |
basvuyk | 0:02cdf2401901 | 218 | runBatteryTimer.start(); |
basvuyk | 0:02cdf2401901 | 219 | |
basvuyk | 0:02cdf2401901 | 220 | static int systemTaskCounter, heartbeatCounter, batteryCounter; |
basvuyk | 0:02cdf2401901 | 221 | |
basvuyk | 0:02cdf2401901 | 222 | while(1){ |
basvuyk | 0:02cdf2401901 | 223 | |
basvuyk | 0:02cdf2401901 | 224 | systemTaskCounter = runSystemChecksTimer.read_ms(); |
basvuyk | 0:02cdf2401901 | 225 | heartbeatCounter = runHeartbeatTimer.read_ms(); |
basvuyk | 0:02cdf2401901 | 226 | batteryCounter = runBatteryTimer.read_ms(); |
basvuyk | 0:02cdf2401901 | 227 | |
basvuyk | 0:02cdf2401901 | 228 | checkLocalEstop(); |
basvuyk | 0:02cdf2401901 | 229 | if ( systemTaskCounter > 3){ |
basvuyk | 0:02cdf2401901 | 230 | DMLocalNode.process_rx_frames(); |
basvuyk | 0:02cdf2401901 | 231 | runSystemChecks(DMLocalNode); |
basvuyk | 0:02cdf2401901 | 232 | |
basvuyk | 0:02cdf2401901 | 233 | systemTaskCounter = 0; |
basvuyk | 0:02cdf2401901 | 234 | runSystemChecksTimer.reset(); |
basvuyk | 0:02cdf2401901 | 235 | receivedData = 0; |
basvuyk | 0:02cdf2401901 | 236 | } |
basvuyk | 0:02cdf2401901 | 237 | |
basvuyk | 0:02cdf2401901 | 238 | if ( heartbeatCounter > 100){ |
basvuyk | 0:02cdf2401901 | 239 | DMLocalNode.process_rx_frames(); |
basvuyk | 0:02cdf2401901 | 240 | |
basvuyk | 0:02cdf2401901 | 241 | checkHeartbeat(); |
basvuyk | 0:02cdf2401901 | 242 | heartbeatCounter = 0; |
basvuyk | 0:02cdf2401901 | 243 | runHeartbeatTimer.reset(); |
basvuyk | 0:02cdf2401901 | 244 | receivedData = 0; |
basvuyk | 0:02cdf2401901 | 245 | } |
basvuyk | 0:02cdf2401901 | 246 | |
basvuyk | 0:02cdf2401901 | 247 | if (batteryCounter > 5000){ |
basvuyk | 0:02cdf2401901 | 248 | batteryMonitor(); |
basvuyk | 0:02cdf2401901 | 249 | batteryCounter = 0; |
basvuyk | 0:02cdf2401901 | 250 | runBatteryTimer.reset(); |
basvuyk | 0:02cdf2401901 | 251 | } |
basvuyk | 0:02cdf2401901 | 252 | } |
basvuyk | 0:02cdf2401901 | 253 | } |