![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Master_Node
Dependencies: XBeeLib_Master mbed
main.cpp@1:f28c98c04cbd, 2018-03-27 (annotated)
- Committer:
- basvuyk
- Date:
- Tue Mar 27 14:12:26 2018 +0000
- Revision:
- 1:f28c98c04cbd
- Parent:
- 0:a6ed4a102013
- Child:
- 2:bd4ef614ebb6
Master V1.0
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 | #include "buzzer.h" |
basvuyk | 1:f28c98c04cbd | 4 | #include "bootChime.h" |
basvuyk | 1:f28c98c04cbd | 5 | #include "breathLed.h" |
basvuyk | 0:a6ed4a102013 | 6 | |
basvuyk | 1:f28c98c04cbd | 7 | using namespace XBeeLib; |
basvuyk | 1:f28c98c04cbd | 8 | |
basvuyk | 1:f28c98c04cbd | 9 | typedef enum |
basvuyk | 1:f28c98c04cbd | 10 | { |
basvuyk | 1:f28c98c04cbd | 11 | BOOTING, |
basvuyk | 1:f28c98c04cbd | 12 | NORMAL_OPERATION, |
basvuyk | 1:f28c98c04cbd | 13 | EMERGENCY, |
basvuyk | 1:f28c98c04cbd | 14 | WAIT_FOR_RESET, |
basvuyk | 1:f28c98c04cbd | 15 | HEARTBEAT_ERROR, |
basvuyk | 1:f28c98c04cbd | 16 | } state_t; |
basvuyk | 0:a6ed4a102013 | 17 | |
basvuyk | 1:f28c98c04cbd | 18 | state_t currentState = BOOTING; |
basvuyk | 1:f28c98c04cbd | 19 | |
basvuyk | 0:a6ed4a102013 | 20 | |
basvuyk | 1:f28c98c04cbd | 21 | /* |
basvuyk | 1:f28c98c04cbd | 22 | STATE_MESSAGES: |
basvuyk | 1:f28c98c04cbd | 23 | HEARTBEAT = 49 |
basvuyk | 1:f28c98c04cbd | 24 | EMERGENCY = 50 |
basvuyk | 1:f28c98c04cbd | 25 | RESET = 51 |
basvuyk | 1:f28c98c04cbd | 26 | */ |
basvuyk | 1:f28c98c04cbd | 27 | |
basvuyk | 1:f28c98c04cbd | 28 | int receivedData; |
basvuyk | 0:a6ed4a102013 | 29 | |
basvuyk | 1:f28c98c04cbd | 30 | //------------Define Digimesh Variables------------// |
basvuyk | 1:f28c98c04cbd | 31 | #define channel 0x18 |
basvuyk | 1:f28c98c04cbd | 32 | #define networkId 0xD163 |
basvuyk | 1:f28c98c04cbd | 33 | #define powerLevel 4 |
basvuyk | 1:f28c98c04cbd | 34 | #define nodeId "masterNode" |
basvuyk | 1:f28c98c04cbd | 35 | //------------Define Digimesh Variables------------// |
basvuyk | 1:f28c98c04cbd | 36 | |
basvuyk | 1:f28c98c04cbd | 37 | //------------Define Pinouts-----------------------// |
basvuyk | 1:f28c98c04cbd | 38 | PwmOut statusLED(PA_11); |
basvuyk | 0:a6ed4a102013 | 39 | DigitalOut powerLED(PA_8); |
basvuyk | 0:a6ed4a102013 | 40 | |
basvuyk | 1:f28c98c04cbd | 41 | DigitalIn localEstop(PB_7); |
basvuyk | 0:a6ed4a102013 | 42 | DigitalIn resetButton(PB_0); |
basvuyk | 1:f28c98c04cbd | 43 | //------------Define Pinouts-----------------------// |
basvuyk | 0:a6ed4a102013 | 44 | |
basvuyk | 0:a6ed4a102013 | 45 | // Initialize Buzzer |
basvuyk | 0:a6ed4a102013 | 46 | Beep piezo(PB_4); |
basvuyk | 0:a6ed4a102013 | 47 | |
basvuyk | 1:f28c98c04cbd | 48 | Serial pc(USBTX, USBRX); |
basvuyk | 1:f28c98c04cbd | 49 | |
basvuyk | 1:f28c98c04cbd | 50 | Ticker checkResetButton, stateHandlerTimer, checkLocalEstopTimer, handleMessagesTimer, timerLED; |
basvuyk | 1:f28c98c04cbd | 51 | Timer runSystemChecksTimer, sendHeartbeatTimer; |
basvuyk | 1:f28c98c04cbd | 52 | |
basvuyk | 1:f28c98c04cbd | 53 | void radioConfig(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 54 | RadioStatus temp = DMLocalNode.init(); |
basvuyk | 1:f28c98c04cbd | 55 | temp = DMLocalNode.set_channel(channel); |
basvuyk | 1:f28c98c04cbd | 56 | temp = DMLocalNode.set_network_id(networkId); |
basvuyk | 1:f28c98c04cbd | 57 | temp = DMLocalNode.set_power_level(powerLevel); |
basvuyk | 1:f28c98c04cbd | 58 | temp = DMLocalNode.set_node_identifier("masterNode"); |
basvuyk | 1:f28c98c04cbd | 59 | temp = DMLocalNode.write_config(); |
basvuyk | 1:f28c98c04cbd | 60 | } |
basvuyk | 1:f28c98c04cbd | 61 | |
basvuyk | 1:f28c98c04cbd | 62 | void boot(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 63 | radioConfig(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 64 | bootChime(); |
basvuyk | 1:f28c98c04cbd | 65 | } |
basvuyk | 1:f28c98c04cbd | 66 | |
basvuyk | 1:f28c98c04cbd | 67 | void statusLedFunction(){ |
basvuyk | 1:f28c98c04cbd | 68 | breathLed(currentState); |
basvuyk | 1:f28c98c04cbd | 69 | } |
basvuyk | 1:f28c98c04cbd | 70 | |
basvuyk | 1:f28c98c04cbd | 71 | void errorHandle(){ |
basvuyk | 1:f28c98c04cbd | 72 | statusLED = !statusLED; |
basvuyk | 1:f28c98c04cbd | 73 | } |
basvuyk | 1:f28c98c04cbd | 74 | |
basvuyk | 1:f28c98c04cbd | 75 | static void receive_cb(const RemoteXBeeDM& remote, bool broadcast, const uint8_t *const data, uint16_t len){ |
basvuyk | 1:f28c98c04cbd | 76 | receivedData = (data[0]-3); |
basvuyk | 0:a6ed4a102013 | 77 | } |
basvuyk | 0:a6ed4a102013 | 78 | |
basvuyk | 1:f28c98c04cbd | 79 | static void sendMessage(XBeeDM &DMLocalNode, char *sendData){ |
basvuyk | 1:f28c98c04cbd | 80 | const char data[] = {*sendData}; |
basvuyk | 0:a6ed4a102013 | 81 | const uint16_t data_len = strlen(data); |
basvuyk | 1:f28c98c04cbd | 82 | |
basvuyk | 0:a6ed4a102013 | 83 | const TxStatus txStatus = DMLocalNode.send_data_broadcast((const uint8_t *)data, data_len); |
basvuyk | 1:f28c98c04cbd | 84 | |
basvuyk | 1:f28c98c04cbd | 85 | powerLED = !powerLED; |
basvuyk | 1:f28c98c04cbd | 86 | } |
basvuyk | 1:f28c98c04cbd | 87 | |
basvuyk | 1:f28c98c04cbd | 88 | void sendHeartbeat(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 89 | if (currentState == NORMAL_OPERATION){ |
basvuyk | 1:f28c98c04cbd | 90 | sendMessage(DMLocalNode, "49"); |
basvuyk | 1:f28c98c04cbd | 91 | } |
basvuyk | 0:a6ed4a102013 | 92 | } |
basvuyk | 0:a6ed4a102013 | 93 | |
basvuyk | 1:f28c98c04cbd | 94 | void checkLocalEstop(){ |
basvuyk | 1:f28c98c04cbd | 95 | if (localEstop == 0){ |
basvuyk | 1:f28c98c04cbd | 96 | currentState = EMERGENCY; |
basvuyk | 1:f28c98c04cbd | 97 | } |
basvuyk | 1:f28c98c04cbd | 98 | if (localEstop == 1 && currentState == EMERGENCY){ |
basvuyk | 1:f28c98c04cbd | 99 | currentState = WAIT_FOR_RESET; |
basvuyk | 1:f28c98c04cbd | 100 | } |
basvuyk | 1:f28c98c04cbd | 101 | } |
basvuyk | 1:f28c98c04cbd | 102 | |
basvuyk | 1:f28c98c04cbd | 103 | void checkLocalReset(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 104 | if (resetButton == 1 && localEstop == 1 && currentState == WAIT_FOR_RESET){ |
basvuyk | 1:f28c98c04cbd | 105 | sendMessage(DMLocalNode, "101"); |
basvuyk | 1:f28c98c04cbd | 106 | wait(0.1f); |
basvuyk | 1:f28c98c04cbd | 107 | currentState = NORMAL_OPERATION; |
basvuyk | 1:f28c98c04cbd | 108 | } |
basvuyk | 1:f28c98c04cbd | 109 | else if (resetButton == 1 && localEstop == 0){ |
basvuyk | 1:f28c98c04cbd | 110 | piezo.beep(2400, 1.0f); |
basvuyk | 1:f28c98c04cbd | 111 | } |
basvuyk | 0:a6ed4a102013 | 112 | } |
basvuyk | 0:a6ed4a102013 | 113 | |
basvuyk | 1:f28c98c04cbd | 114 | void stateHandler(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 115 | static int currentMessageCounter; |
basvuyk | 1:f28c98c04cbd | 116 | |
basvuyk | 1:f28c98c04cbd | 117 | if (currentState == NORMAL_OPERATION){ |
basvuyk | 1:f28c98c04cbd | 118 | checkLocalEstop(); |
basvuyk | 1:f28c98c04cbd | 119 | |
basvuyk | 1:f28c98c04cbd | 120 | timerLED.detach(); |
basvuyk | 1:f28c98c04cbd | 121 | timerLED.attach(&statusLedFunction, 0.03f); |
basvuyk | 1:f28c98c04cbd | 122 | } |
basvuyk | 1:f28c98c04cbd | 123 | if (currentState == EMERGENCY && currentMessageCounter != 5){ |
basvuyk | 1:f28c98c04cbd | 124 | sendMessage(DMLocalNode, "50"); |
basvuyk | 1:f28c98c04cbd | 125 | currentMessageCounter++; |
basvuyk | 1:f28c98c04cbd | 126 | |
basvuyk | 1:f28c98c04cbd | 127 | timerLED.detach(); |
basvuyk | 1:f28c98c04cbd | 128 | statusLED = 1; |
basvuyk | 1:f28c98c04cbd | 129 | piezo.beep(4800, 0.1f); |
basvuyk | 1:f28c98c04cbd | 130 | } |
basvuyk | 1:f28c98c04cbd | 131 | else if (currentState == WAIT_FOR_RESET){ |
basvuyk | 1:f28c98c04cbd | 132 | currentMessageCounter = 0; |
basvuyk | 1:f28c98c04cbd | 133 | } |
basvuyk | 1:f28c98c04cbd | 134 | } |
basvuyk | 1:f28c98c04cbd | 135 | |
basvuyk | 1:f28c98c04cbd | 136 | void handleMessages(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 137 | if (receivedData == 50){ |
basvuyk | 1:f28c98c04cbd | 138 | currentState = EMERGENCY; |
basvuyk | 1:f28c98c04cbd | 139 | } |
basvuyk | 1:f28c98c04cbd | 140 | } |
basvuyk | 1:f28c98c04cbd | 141 | |
basvuyk | 1:f28c98c04cbd | 142 | void runSystemChecks(XBeeDM &DMLocalNode){ |
basvuyk | 1:f28c98c04cbd | 143 | checkLocalEstop(); |
basvuyk | 1:f28c98c04cbd | 144 | stateHandler(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 145 | checkLocalReset(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 146 | handleMessages(DMLocalNode); |
basvuyk | 0:a6ed4a102013 | 147 | } |
basvuyk | 0:a6ed4a102013 | 148 | |
basvuyk | 1:f28c98c04cbd | 149 | int main() { |
basvuyk | 1:f28c98c04cbd | 150 | XBeeDM DMLocalNode = XBeeDM(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 115200); |
basvuyk | 1:f28c98c04cbd | 151 | |
basvuyk | 1:f28c98c04cbd | 152 | boot(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 153 | |
basvuyk | 1:f28c98c04cbd | 154 | DMLocalNode.register_receive_cb(&receive_cb); |
basvuyk | 1:f28c98c04cbd | 155 | |
basvuyk | 1:f28c98c04cbd | 156 | runSystemChecksTimer.start(); |
basvuyk | 1:f28c98c04cbd | 157 | sendHeartbeatTimer.start(); |
basvuyk | 1:f28c98c04cbd | 158 | |
basvuyk | 1:f28c98c04cbd | 159 | timerLED.attach(&statusLedFunction, 0.03f); |
basvuyk | 0:a6ed4a102013 | 160 | |
basvuyk | 1:f28c98c04cbd | 161 | currentState = NORMAL_OPERATION; |
basvuyk | 1:f28c98c04cbd | 162 | |
basvuyk | 1:f28c98c04cbd | 163 | static int heartbeatCounter; |
basvuyk | 1:f28c98c04cbd | 164 | static int systemTaskCounter; |
basvuyk | 1:f28c98c04cbd | 165 | |
basvuyk | 1:f28c98c04cbd | 166 | pc.baud(115200); |
basvuyk | 1:f28c98c04cbd | 167 | |
basvuyk | 1:f28c98c04cbd | 168 | while(1){ |
basvuyk | 1:f28c98c04cbd | 169 | systemTaskCounter = runSystemChecksTimer.read_ms(); |
basvuyk | 1:f28c98c04cbd | 170 | heartbeatCounter = sendHeartbeatTimer.read_ms(); |
basvuyk | 1:f28c98c04cbd | 171 | |
basvuyk | 1:f28c98c04cbd | 172 | if ( systemTaskCounter > 200){ |
basvuyk | 1:f28c98c04cbd | 173 | DMLocalNode.process_rx_frames(); |
basvuyk | 1:f28c98c04cbd | 174 | runSystemChecks(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 175 | systemTaskCounter = 0; |
basvuyk | 1:f28c98c04cbd | 176 | runSystemChecksTimer.reset(); |
basvuyk | 1:f28c98c04cbd | 177 | pc.printf("%d", receivedData); |
basvuyk | 1:f28c98c04cbd | 178 | receivedData = 0; |
basvuyk | 1:f28c98c04cbd | 179 | } |
basvuyk | 1:f28c98c04cbd | 180 | |
basvuyk | 1:f28c98c04cbd | 181 | if (heartbeatCounter > 257){ |
basvuyk | 1:f28c98c04cbd | 182 | sendHeartbeat(DMLocalNode); |
basvuyk | 1:f28c98c04cbd | 183 | heartbeatCounter = 0; |
basvuyk | 1:f28c98c04cbd | 184 | sendHeartbeatTimer.reset(); |
basvuyk | 1:f28c98c04cbd | 185 | } |
basvuyk | 0:a6ed4a102013 | 186 | } |
basvuyk | 1:f28c98c04cbd | 187 | } |