GDP group 24 node core
Dependencies: EthernetInterface SDFileSystem mbed-rtos mbed snail MbedJSONValue
Diff: main.cpp
- Revision:
- 2:1cbb20dd1733
- Parent:
- 1:27b35752c5d0
- Child:
- 3:71b090ec5c69
--- a/main.cpp Tue Nov 18 18:28:52 2014 +0000 +++ b/main.cpp Sun Dec 14 22:28:24 2014 +0000 @@ -3,17 +3,19 @@ #include "sensorinterface.h" #include "sdcard.h" #include "http.h" +#include "MbedJSONValue.h" #define DEBUG time_t lastPollTime = 0; time_t pollInterval = 30; -time_t timestamp = 0; + bool isBasenode = false; +http h = http(); char localAddress[8]; -char baseAddress[8]; +char baseNodeAddress[8]; bool networkParametersUpdated = false; bool networkParametersTimedOut = false; @@ -21,23 +23,40 @@ snail xbee = snail(); Ticker networkParametersTimeout; -void handleBaseAddressReply(snail::message& message) +void handleJoinNetworkReply(snail::message& message) { - snail::baseaddressreply& reply = static_cast<snail::baseaddressreply&>(message); - memcpy(baseAddress, reply.baseAddress, sizeof(baseAddress)); - //TODO: Get timestamp + pc.printf("[MAIN] Got join network reply...\r\n"); + snail::joinnetworkreply& reply = static_cast<snail::joinnetworkreply&>(message); + set_time(reply.timestamp); + memcpy(baseNodeAddress, reply.baseNodeAddress, sizeof(baseNodeAddress)); + networkParametersUpdated = true; } -void handleBaseAddressRequest(snail::message& message) +void handleJoinNetworkRequest(snail::message& message) { + pc.printf("[MAIN] Got join network request...\r\n"); if (isBasenode) { - snail::baseaddressreply reply(snail::broadcastAddress, localAddress); + snail::joinnetworkrequest& request = static_cast<snail::joinnetworkrequest&>(message); + + //TODO: Send sensors data to server + snail::joinnetworkreply reply(request.source, time(NULL), localAddress); xbee.send(reply, sizeof(reply)); } } +void handleSensorData(snail::message& message) +{ + pc.printf("[MAIN] Got sensor data...\r\n"); + snail::sensordata& d = static_cast<snail::sensordata&>(message); + +// MbedJSONValue j; +// j["timestamp"] = (int)time(NULL); +// j["value"] = value; +// pc.printf(h.post("178.62.84.55", 8888, "/field/testfield/testnode/testsensor/", j.serialize()).c_str()); +} + void handleNetworkParametersTimeout() { networkParametersTimedOut = true; @@ -45,20 +64,48 @@ void getLocalAddress() { - //TODO: get local address from xbee + pc.printf("[MAIN] Requesting lower address bits...\r\n"); + xbee.ATCommand("SL"); + + while (!xbee.isATCommandResponseWaiting()) + xbee.processIncomingData(); + + snail::atcommandresponse SLr = xbee.getATCommandResponse(); + + pc.printf("[MAIN] Requesting upper address bits...\r\n"); + xbee.ATCommand("SH"); + + while (!xbee.isATCommandResponseWaiting()) + xbee.processIncomingData(); + + snail::atcommandresponse SHr = xbee.getATCommandResponse(); + + string address(SHr.response); + address += SLr.response; + + pc.printf("[MAIN] Got local address: "); + + for (int i = 0; i < address.size(); i++) + pc.printf("%.2X", address[i]); + + pc.printf("\r\n"); + + memcpy(localAddress, address.c_str(), sizeof(localAddress)); } void getNetworkParameters() { #ifdef DEBUG - pc.printf("[MAIN] Requesting time and base address...\r\n"); + pc.printf("[MAIN] Requesting to join network...\r\n"); #endif - xbee.registerMessageCallback(MESSAGE_BASE_ADDRESS_REPLY, handleBaseAddressReply); + xbee.registerMessageCallback(MESSAGE_JOIN_NETWORK_REPLY, handleJoinNetworkReply); + + networkParametersTimeout.attach(&handleNetworkParametersTimeout, 30.0); - networkParametersTimeout.attach(&handleNetworkParametersTimeout, 10.0); + snail::joinnetworkrequest::sensor sensors[255]; + snail::joinnetworkrequest request(sensors); - snail::baseaddressrequest request; xbee.send(request, sizeof(request)); while(!networkParametersUpdated) @@ -71,11 +118,15 @@ xbee.send(request, sizeof(request)); networkParametersTimedOut = false; } - xbee.readMessage(); + xbee.processIncomingData(); } #ifdef DEBUG - pc.printf("[MAIN] Got network parameters\r\n"); + pc.printf("[MAIN] Got network parameters. Time: %i, base node address: ", time(NULL)); + + for (int i = 0; i < sizeof(baseNodeAddress); i++) + pc.printf("%.2X", baseNodeAddress[i]); + pc.printf("\r\n"); #endif networkParametersTimeout.detach(); } @@ -84,27 +135,26 @@ { #ifdef DEBUG pc.printf("[MAIN] Starting up...\r\n"); - printf(" . .\r\n"); - printf(" / `. .' \\\r\n"); - printf(" .---. < > < > .---.\r\n"); - printf(" | \\ \\ - ~ ~ - / / |\r\n"); - printf(" ~-..-~ ~-..-~\r\n"); - printf(" \\~~~\\.' `./~~~/\r\n"); - printf(" .-~~^-. \\__/ \\__/\r\n"); - printf(" .' O \\ / / \\ \\\r\n"); - printf("(_____, `._.' | } \\/~~~/\r\n"); - printf(" `----. / } | / \\__/\r\n"); - printf(" `-. | / | / `. ,~~|\r\n"); - printf(" ~-.__| /_ - ~ ^| /- _ `..-' f: f:\r\n"); - printf(" | / | / ~-. `-. _||_||_\r\n"); - printf(" |_____| |_____| ~ - . _ _ _ _ _>\r\n"); - printf("\r\n"); - printf("\r\n"); - printf(" Sensorsaurus | Team 24 GDP | Southampton | 2014\r\n"); - printf("\r\n"); - printf("\r\n"); + pc.printf(" . .\r\n"); + pc.printf(" / `. .' \\\r\n"); + pc.printf(" .---. < > < > .---.\r\n"); + pc.printf(" | \\ \\ - ~ ~ - / / |\r\n"); + pc.printf(" ~-..-~ ~-..-~\r\n"); + pc.printf(" \\~~~\\.' `./~~~/\r\n"); + pc.printf(" .-~~^-. \\__/ \\__/\r\n"); + pc.printf(" .' O \\ / / \\ \\\r\n"); + pc.printf("(_____, `._.' | } \\/~~~/\r\n"); + pc.printf(" `----. / } | / \\__/\r\n"); + pc.printf(" `-. | / | / `. ,~~|\r\n"); + pc.printf(" ~-.__| /_ - ~ ^| /- _ `..-' f: f:\r\n"); + pc.printf(" | / | / ~-. `-. _||_||_\r\n"); + pc.printf(" |_____| |_____| ~ - . _ _ _ _ _>\r\n"); + pc.printf("\r\n"); + pc.printf("\r\n"); + pc.printf(" Sensorsaurus | Team 24 GDP | Southampton | 2014\r\n"); + pc.printf("\r\n"); + pc.printf("\r\n"); #endif - //sdcard sd = sdcard(); //TODO: read basenode pin @@ -114,14 +164,22 @@ //TODO: load configuration from SD + getLocalAddress(); + if (isBasenode) { getLocalAddress(); - http h = http(); - //TODO: get timestamp from API + h.connect(); + + string timestampStr = h.get("time.bitnode.co.uk", 80, "/"); + time_t timestamp = atoi(timestampStr.c_str()); + set_time(timestamp); - xbee.registerMessageCallback(MESSAGE_BASE_ADDRESS_REQUEST, handleBaseAddressRequest); + pc.printf("[MAIN] Got time: %i\r\n", timestamp); + + xbee.registerMessageCallback(MESSAGE_JOIN_NETWORK_REQUEST, handleJoinNetworkRequest); + xbee.registerMessageCallback(MESSAGE_SENSOR_DATA, handleSensorData); while(1) { @@ -129,23 +187,23 @@ pc.printf("[MAIN] Basenode is idle\r\n"); #endif - wait(5); + wait(1); + xbee.processIncomingData(); } } else { sensorinterface sensors = sensorinterface(); getNetworkParameters(); - set_time(timestamp); while(1) { - xbee.readMessage(); + xbee.processIncomingData(); //TODO: if xbee interrupt has woken us up //transmit 10 latest readings //check if it's time to poll TODO: add check to see if sensorinterface is ready - if (time(NULL) - lastPollTime > 10) + if (time(NULL) - lastPollTime > pollInterval) { #ifdef DEBUG pc.printf("[MAIN] Requesting data...\r\n"); @@ -164,8 +222,8 @@ d_reply data = sensors.readData(); #ifdef DEBUG - for (int i = 0; i < data.readings.size(); i++) - pc.printf("0x%.4X|", data.readings[i]); + for (int i = 0; i < data.readings.size(); i++) + pc.printf("0x%.4X|", data.readings[i]); #endif //log