Master_Node
Dependencies: XBeeLib_Master mbed
main.cpp@2:bd4ef614ebb6, 2018-07-25 (annotated)
- Committer:
- basvuyk
- Date:
- Wed Jul 25 09:14:25 2018 +0000
- Revision:
- 2:bd4ef614ebb6
- Parent:
- 1:f28c98c04cbd
Master_Node
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
basvuyk | 0:a6ed4a102013 | 1 | #include "mbed.h" |
basvuyk | 0:a6ed4a102013 | 2 | #include "XBeeLib.h" |
basvuyk | 0:a6ed4a102013 | 3 | |
basvuyk | 1:f28c98c04cbd | 4 | using namespace XBeeLib; |
basvuyk | 1:f28c98c04cbd | 5 | |
basvuyk | 1:f28c98c04cbd | 6 | typedef enum |
basvuyk | 1:f28c98c04cbd | 7 | { |
basvuyk | 1:f28c98c04cbd | 8 | BOOTING, |
basvuyk | 1:f28c98c04cbd | 9 | NORMAL_OPERATION, |
basvuyk | 1:f28c98c04cbd | 10 | EMERGENCY, |
basvuyk | 1:f28c98c04cbd | 11 | WAIT_FOR_RESET, |
basvuyk | 1:f28c98c04cbd | 12 | } state_t; |
basvuyk | 0:a6ed4a102013 | 13 | |
basvuyk | 1:f28c98c04cbd | 14 | state_t currentState = BOOTING; |
basvuyk | 1:f28c98c04cbd | 15 | |
basvuyk | 2:bd4ef614ebb6 | 16 | char *HEARTBEAT_MSG = "49"; |
basvuyk | 2:bd4ef614ebb6 | 17 | char *EMERGENCY_MSG = "50"; |
basvuyk | 2:bd4ef614ebb6 | 18 | char *RESET_MSG = "101"; |
basvuyk | 1:f28c98c04cbd | 19 | |
basvuyk | 1:f28c98c04cbd | 20 | int receivedData; |
basvuyk | 0:a6ed4a102013 | 21 | |
basvuyk | 1:f28c98c04cbd | 22 | //------------Define Digimesh Variables------------// |
basvuyk | 2:bd4ef614ebb6 | 23 | #define channel 0x15 |
basvuyk | 2:bd4ef614ebb6 | 24 | #define networkId 0xD160 |
basvuyk | 1:f28c98c04cbd | 25 | #define powerLevel 4 |
basvuyk | 1:f28c98c04cbd | 26 | #define nodeId "masterNode" |
basvuyk | 2:bd4ef614ebb6 | 27 | #define baudRate 230400 |
basvuyk | 1:f28c98c04cbd | 28 | //------------Define Digimesh Variables------------// |
basvuyk | 1:f28c98c04cbd | 29 | |
basvuyk | 1:f28c98c04cbd | 30 | //------------Define Pinouts-----------------------// |
basvuyk | 2:bd4ef614ebb6 | 31 | DigitalOut statusLED(PB_5); |
basvuyk | 2:bd4ef614ebb6 | 32 | PwmOut powerLED(PB_4); |
basvuyk | 0:a6ed4a102013 | 33 | |
basvuyk | 2:bd4ef614ebb6 | 34 | DigitalIn localEstop(PA_11); |
basvuyk | 2:bd4ef614ebb6 | 35 | DigitalIn resetButton(PA_12); |
basvuyk | 1:f28c98c04cbd | 36 | //------------Define Pinouts-----------------------// |
basvuyk | 0:a6ed4a102013 | 37 | |
basvuyk | 2:bd4ef614ebb6 | 38 | //-----------TIMER CONFIG----------// |
basvuyk | 2:bd4ef614ebb6 | 39 | Timer runHeartbeatTimer, runSystemChecksTimer; |
basvuyk | 2:bd4ef614ebb6 | 40 | #define systemCheckTimeout 5 // ms // Check system state every 5ms |
basvuyk | 2:bd4ef614ebb6 | 41 | #define heartbeatTimeout 200 // ms // Check heartbeat every 100ms |
basvuyk | 2:bd4ef614ebb6 | 42 | //-----------TIMER CONFIG----------// |
basvuyk | 0:a6ed4a102013 | 43 | |
basvuyk | 2:bd4ef614ebb6 | 44 | // Initiate XBEE Module |
basvuyk | 1:f28c98c04cbd | 45 | void radioConfig(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 46 | RadioStatus temp = DMLocalNode.init(); |
basvuyk | 1:f28c98c04cbd | 47 | temp = DMLocalNode.set_channel(channel); |
basvuyk | 1:f28c98c04cbd | 48 | temp = DMLocalNode.set_network_id(networkId); |
basvuyk | 1:f28c98c04cbd | 49 | temp = DMLocalNode.set_power_level(powerLevel); |
basvuyk | 1:f28c98c04cbd | 50 | temp = DMLocalNode.set_node_identifier("masterNode"); |
basvuyk | 1:f28c98c04cbd | 51 | temp = DMLocalNode.write_config(); |
basvuyk | 1:f28c98c04cbd | 52 | } |
basvuyk | 1:f28c98c04cbd | 53 | |
basvuyk | 1:f28c98c04cbd | 54 | void boot(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 55 | radioConfig(DMLocalNode); |
basvuyk | 2:bd4ef614ebb6 | 56 | powerLED.write(255); |
basvuyk | 1:f28c98c04cbd | 57 | } |
basvuyk | 1:f28c98c04cbd | 58 | |
basvuyk | 1:f28c98c04cbd | 59 | static void receive_cb(const RemoteXBeeDM& remote, bool broadcast, const uint8_t *const data, uint16_t len){ |
basvuyk | 2:bd4ef614ebb6 | 60 | receivedData = (data[0]-3); // -3 for offset |
basvuyk | 0:a6ed4a102013 | 61 | } |
basvuyk | 0:a6ed4a102013 | 62 | |
basvuyk | 1:f28c98c04cbd | 63 | static void sendMessage(XBeeDM &DMLocalNode, char *sendData){ |
basvuyk | 1:f28c98c04cbd | 64 | const char data[] = {*sendData}; |
basvuyk | 0:a6ed4a102013 | 65 | const uint16_t data_len = strlen(data); |
basvuyk | 1:f28c98c04cbd | 66 | |
basvuyk | 0:a6ed4a102013 | 67 | const TxStatus txStatus = DMLocalNode.send_data_broadcast((const uint8_t *)data, data_len); |
basvuyk | 1:f28c98c04cbd | 68 | } |
basvuyk | 1:f28c98c04cbd | 69 | |
basvuyk | 1:f28c98c04cbd | 70 | void sendHeartbeat(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 71 | if (currentState == NORMAL_OPERATION){ |
basvuyk | 2:bd4ef614ebb6 | 72 | sendMessage(DMLocalNode, HEARTBEAT_MSG); |
basvuyk | 1:f28c98c04cbd | 73 | } |
basvuyk | 0:a6ed4a102013 | 74 | } |
basvuyk | 0:a6ed4a102013 | 75 | |
basvuyk | 1:f28c98c04cbd | 76 | void checkLocalEstop(){ |
basvuyk | 1:f28c98c04cbd | 77 | if (localEstop == 0){ |
basvuyk | 1:f28c98c04cbd | 78 | currentState = EMERGENCY; |
basvuyk | 1:f28c98c04cbd | 79 | } |
basvuyk | 1:f28c98c04cbd | 80 | if (localEstop == 1 && currentState == EMERGENCY){ |
basvuyk | 1:f28c98c04cbd | 81 | currentState = WAIT_FOR_RESET; |
basvuyk | 1:f28c98c04cbd | 82 | } |
basvuyk | 1:f28c98c04cbd | 83 | } |
basvuyk | 1:f28c98c04cbd | 84 | |
basvuyk | 2:bd4ef614ebb6 | 85 | void checkReset(XBeeDM &DMLocalNode){ |
basvuyk | 2:bd4ef614ebb6 | 86 | if (resetButton == 1 && localEstop == 1 && currentState == NORMAL_OPERATION){ |
basvuyk | 2:bd4ef614ebb6 | 87 | sendMessage(DMLocalNode, RESET_MSG); |
basvuyk | 2:bd4ef614ebb6 | 88 | } |
basvuyk | 2:bd4ef614ebb6 | 89 | } |
basvuyk | 2:bd4ef614ebb6 | 90 | |
basvuyk | 2:bd4ef614ebb6 | 91 | /* Function that avoids the misuse of the reset button, |
basvuyk | 2:bd4ef614ebb6 | 92 | If the button is continuously pressed, this function |
basvuyk | 2:bd4ef614ebb6 | 93 | disables the reset button to prevent excessive network load */ |
basvuyk | 1:f28c98c04cbd | 94 | void checkLocalReset(XBeeDM &DMLocalNode){ |
basvuyk | 2:bd4ef614ebb6 | 95 | static int resetCounter = 0, sendReset = 1; |
basvuyk | 2:bd4ef614ebb6 | 96 | |
basvuyk | 2:bd4ef614ebb6 | 97 | if (resetButton == 1 && resetCounter < 5){ |
basvuyk | 2:bd4ef614ebb6 | 98 | resetCounter++; |
basvuyk | 2:bd4ef614ebb6 | 99 | sendReset = 1; |
basvuyk | 2:bd4ef614ebb6 | 100 | } |
basvuyk | 2:bd4ef614ebb6 | 101 | |
basvuyk | 2:bd4ef614ebb6 | 102 | if (resetCounter == 5 && resetButton == 1){ |
basvuyk | 2:bd4ef614ebb6 | 103 | resetCounter = 50; |
basvuyk | 2:bd4ef614ebb6 | 104 | sendReset = 0; |
basvuyk | 2:bd4ef614ebb6 | 105 | } |
basvuyk | 2:bd4ef614ebb6 | 106 | |
basvuyk | 2:bd4ef614ebb6 | 107 | if (resetButton == 0 && resetCounter > 0){ |
basvuyk | 2:bd4ef614ebb6 | 108 | resetCounter--; |
basvuyk | 2:bd4ef614ebb6 | 109 | } |
basvuyk | 2:bd4ef614ebb6 | 110 | |
basvuyk | 2:bd4ef614ebb6 | 111 | if (sendReset == 1 && resetButton == 1 && localEstop == 1 && currentState == WAIT_FOR_RESET){ |
basvuyk | 2:bd4ef614ebb6 | 112 | sendMessage(DMLocalNode, RESET_MSG); |
basvuyk | 1:f28c98c04cbd | 113 | currentState = NORMAL_OPERATION; |
basvuyk | 1:f28c98c04cbd | 114 | } |
basvuyk | 0:a6ed4a102013 | 115 | } |
basvuyk | 0:a6ed4a102013 | 116 | |
basvuyk | 1:f28c98c04cbd | 117 | void stateHandler(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 118 | static int currentMessageCounter; |
basvuyk | 1:f28c98c04cbd | 119 | |
basvuyk | 1:f28c98c04cbd | 120 | if (currentState == NORMAL_OPERATION){ |
basvuyk | 2:bd4ef614ebb6 | 121 | checkLocalEstop(); |
basvuyk | 2:bd4ef614ebb6 | 122 | statusLED.write(1); |
basvuyk | 1:f28c98c04cbd | 123 | } |
basvuyk | 1:f28c98c04cbd | 124 | if (currentState == EMERGENCY && currentMessageCounter != 5){ |
basvuyk | 2:bd4ef614ebb6 | 125 | sendMessage(DMLocalNode, EMERGENCY_MSG); |
basvuyk | 1:f28c98c04cbd | 126 | currentMessageCounter++; |
basvuyk | 2:bd4ef614ebb6 | 127 | statusLED = 0; |
basvuyk | 1:f28c98c04cbd | 128 | } |
basvuyk | 1:f28c98c04cbd | 129 | else if (currentState == WAIT_FOR_RESET){ |
basvuyk | 1:f28c98c04cbd | 130 | currentMessageCounter = 0; |
basvuyk | 2:bd4ef614ebb6 | 131 | statusLED = 0; |
basvuyk | 1:f28c98c04cbd | 132 | } |
basvuyk | 1:f28c98c04cbd | 133 | } |
basvuyk | 1:f28c98c04cbd | 134 | |
basvuyk | 1:f28c98c04cbd | 135 | void handleMessages(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 136 | if (receivedData == 50){ |
basvuyk | 1:f28c98c04cbd | 137 | currentState = EMERGENCY; |
basvuyk | 1:f28c98c04cbd | 138 | } |
basvuyk | 1:f28c98c04cbd | 139 | } |
basvuyk | 1:f28c98c04cbd | 140 | |
basvuyk | 1:f28c98c04cbd | 141 | void runSystemChecks(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 142 | checkLocalEstop(); |
basvuyk | 1:f28c98c04cbd | 143 | stateHandler(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 144 | checkLocalReset(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 145 | handleMessages(DMLocalNode); |
basvuyk | 0:a6ed4a102013 | 146 | } |
basvuyk | 0:a6ed4a102013 | 147 | |
basvuyk | 1:f28c98c04cbd | 148 | int main() { |
basvuyk | 2:bd4ef614ebb6 | 149 | XBeeDM DMLocalNode = XBeeDM(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, baudRate); |
basvuyk | 1:f28c98c04cbd | 150 | |
basvuyk | 1:f28c98c04cbd | 151 | boot(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 152 | |
basvuyk | 1:f28c98c04cbd | 153 | DMLocalNode.register_receive_cb(&receive_cb); |
basvuyk | 1:f28c98c04cbd | 154 | |
basvuyk | 1:f28c98c04cbd | 155 | runSystemChecksTimer.start(); |
basvuyk | 2:bd4ef614ebb6 | 156 | runHeartbeatTimer.start(); |
basvuyk | 2:bd4ef614ebb6 | 157 | |
basvuyk | 1:f28c98c04cbd | 158 | currentState = NORMAL_OPERATION; |
basvuyk | 1:f28c98c04cbd | 159 | |
basvuyk | 2:bd4ef614ebb6 | 160 | static int systemTaskCounter, heartbeatCounter; |
basvuyk | 1:f28c98c04cbd | 161 | |
basvuyk | 1:f28c98c04cbd | 162 | while(1){ |
basvuyk | 1:f28c98c04cbd | 163 | systemTaskCounter = runSystemChecksTimer.read_ms(); |
basvuyk | 2:bd4ef614ebb6 | 164 | heartbeatCounter = runHeartbeatTimer.read_ms(); |
basvuyk | 2:bd4ef614ebb6 | 165 | |
basvuyk | 2:bd4ef614ebb6 | 166 | if (systemTaskCounter > systemCheckTimeout){ |
basvuyk | 1:f28c98c04cbd | 167 | DMLocalNode.process_rx_frames(); |
basvuyk | 1:f28c98c04cbd | 168 | systemTaskCounter = 0; |
basvuyk | 1:f28c98c04cbd | 169 | runSystemChecksTimer.reset(); |
basvuyk | 2:bd4ef614ebb6 | 170 | runSystemChecks(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 171 | receivedData = 0; |
basvuyk | 2:bd4ef614ebb6 | 172 | } |
basvuyk | 1:f28c98c04cbd | 173 | |
basvuyk | 2:bd4ef614ebb6 | 174 | if (heartbeatCounter > heartbeatTimeout){ |
basvuyk | 2:bd4ef614ebb6 | 175 | sendHeartbeat(DMLocalNode); |
basvuyk | 2:bd4ef614ebb6 | 176 | checkReset(DMLocalNode); |
basvuyk | 2:bd4ef614ebb6 | 177 | |
basvuyk | 1:f28c98c04cbd | 178 | heartbeatCounter = 0; |
basvuyk | 2:bd4ef614ebb6 | 179 | runHeartbeatTimer.reset(); |
basvuyk | 2:bd4ef614ebb6 | 180 | } |
basvuyk | 0:a6ed4a102013 | 181 | } |
basvuyk | 1:f28c98c04cbd | 182 | } |