Master_Node

Dependencies:   XBeeLib_Master mbed

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?

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