Handheld_Node

Dependencies:   XBeeLib_Handheld_V2 mbed

Committer:
basvuyk
Date:
Wed Jul 25 09:15:06 2018 +0000
Revision:
0:02cdf2401901
Handheld_Node

Who changed what in which revision?

UserRevisionLine numberNew 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 }