Master_Node

Dependencies:   XBeeLib_Master mbed

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?

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