GDP group 24 node core
Dependencies: EthernetInterface SDFileSystem mbed-rtos mbed snail MbedJSONValue
Revision 1:27b35752c5d0, committed 2014-11-18
- Comitter:
- Trumple
- Date:
- Tue Nov 18 18:28:52 2014 +0000
- Parent:
- 0:fcab3b154e49
- Child:
- 2:1cbb20dd1733
- Commit message:
- Initial commit
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EthernetInterface.lib Tue Nov 18 18:28:52 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/EthernetInterface/#5887ae6c0c2c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/http.cpp Tue Nov 18 18:28:52 2014 +0000 @@ -0,0 +1,107 @@ +#include "mbed.h" +#include "http.h" +#include <string> +#include <vector> +#include <sstream> + +http::http() +{ + #ifdef DEBUG + printf("[HTTP] Ethernet connecting...\r\n"); + #endif + + eth.init(); + eth.connect(); + + #ifdef DEBUG + printf("[HTTP] Ethernet connected, IP: %s\r\n", eth.getIPAddress()); + #endif +} + +string http::get(string address, int port, string url, int replyTimeout) +{ + #ifdef DEBUG + printf("[HTTP] Sending GET request to %s%s\r\n", address.c_str(), url.c_str()); + #endif + + TCPSocketConnection sock; + sock.connect(address.c_str(), port); + + #ifdef DEBUG + printf("[HTTP] Connected to endpoint...\r\n"); + #endif + + string httpget = "GET " + url + " HTTP/1.1"; + httpget += "\nHost: " + address + "\n\n"; + + //get a writable char* (I.E. not const char* returned by c_str), put it into a vector + vector<char> writable(httpget.begin(), httpget.end()); + writable.push_back('\0'); + + sock.send_all(&writable[0], writable.size()-1); + + string message = this->receiveFromSock(sock, replyTimeout); + + sock.close(); + + return this->parse(message); +} + +string http::post(string address, int port, string url, string jsonPayload, int replyTimeout) +{ + #ifdef DEBUG + printf("[HTTP] Sending POST request to %s%s\r\n", address.c_str(), url.c_str()); + #endif + + TCPSocketConnection sock; + sock.connect(address.c_str(), port); + + #ifdef DEBUG + printf("[HTTP] Connected to endpoint...\r\n"); + #endif + + stringstream contentLength; + contentLength << jsonPayload.size(); + string contentLengthStr = contentLength.str(); + + string httppost = "POST " + url + " HTTP/1.1"; + httppost += "\nHost: " + address; + httppost += "\nContent-Type: application/json"; + httppost += "\nContent-Length: " + contentLengthStr; + httppost += "\n\n" + jsonPayload; + + //to get a writable char* (I.E. not const char* returned by string.c_str), put it into a vector + vector<char> writable(httppost.begin(), httppost.end()); + writable.push_back('\0'); + + sock.send_all(&writable[0], writable.size()-1); + + string message = this->receiveFromSock(sock, replyTimeout); + + sock.close(); + + return this->parse(message); +} + +string http::receiveFromSock(TCPSocketConnection sock, int replyTimeout) +{ + char buffer[1024]; + int receiveByteCount; + string message; + + while (true) + { + receiveByteCount = sock.receive(buffer, sizeof(buffer)-1);//spare a byte for null termination byte + if (receiveByteCount <= 0) + break; + buffer[receiveByteCount] = '\0'; + message += buffer; + } + + return message; +} + +string http::parse(string httpReply) +{ + return httpReply; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/http.h Tue Nov 18 18:28:52 2014 +0000 @@ -0,0 +1,19 @@ +#include "mbed.h" +#include "EthernetInterface.h" +#include <string> + +#define DEBUG + +class http +{ + public: + string get(string address, int port, string url, int replyTimeout = 20); + string post(string address, int port, string url, string jsonPayload, int replyTimeout = 20); + string parse(string httpReply); + + http(); + + private: + EthernetInterface eth; + string receiveFromSock(TCPSocketConnection sock, int replyTimeout); +}; \ No newline at end of file
--- a/main.cpp Tue Nov 11 17:33:41 2014 +0000 +++ b/main.cpp Tue Nov 18 18:28:52 2014 +0000 @@ -2,28 +2,82 @@ #include "snail.h" #include "sensorinterface.h" #include "sdcard.h" +#include "http.h" #define DEBUG time_t lastPollTime = 0; time_t pollInterval = 30; +time_t timestamp = 0; bool isBasenode = false; + +char localAddress[8]; +char baseAddress[8]; +bool networkParametersUpdated = false; +bool networkParametersTimedOut = false; Serial pc(USBTX, USBRX); +snail xbee = snail(); +Ticker networkParametersTimeout; -char* getBasenodeAddress(snail* xbee) +void handleBaseAddressReply(snail::message& message) +{ + snail::baseaddressreply& reply = static_cast<snail::baseaddressreply&>(message); + memcpy(baseAddress, reply.baseAddress, sizeof(baseAddress)); + //TODO: Get timestamp + networkParametersUpdated = true; +} + +void handleBaseAddressRequest(snail::message& message) { - snail::baseaddressrequest request; - xbee->send(request); + if (isBasenode) + { + snail::baseaddressreply reply(snail::broadcastAddress, localAddress); + xbee.send(reply, sizeof(reply)); + } +} + +void handleNetworkParametersTimeout() +{ + networkParametersTimedOut = true; +} + +void getLocalAddress() +{ + //TODO: get local address from xbee +} + +void getNetworkParameters() +{ + #ifdef DEBUG + pc.printf("[MAIN] Requesting time and base address...\r\n"); + #endif - //TODO: only continue if type is base address reply - while(!xbee->isMessageWaiting()) - {} + xbee.registerMessageCallback(MESSAGE_BASE_ADDRESS_REPLY, handleBaseAddressReply); + + networkParametersTimeout.attach(&handleNetworkParametersTimeout, 10.0); + + snail::baseaddressrequest request; + xbee.send(request, sizeof(request)); - //snail::message reply = xbee->readMessage(); + while(!networkParametersUpdated) + { + if (networkParametersTimedOut) + { + #ifdef DEBUG + pc.printf("[MAIN] Timed out, retrying...\r\n"); + #endif + xbee.send(request, sizeof(request)); + networkParametersTimedOut = false; + } + xbee.readMessage(); + } - return ""; + #ifdef DEBUG + pc.printf("[MAIN] Got network parameters\r\n"); + #endif + networkParametersTimeout.detach(); } int main() @@ -51,28 +105,24 @@ printf("\r\n"); #endif - sensorinterface sensors = sensorinterface(); - sdcard sd = sdcard(); - snail xbee = snail(); + //sdcard sd = sdcard(); //TODO: read basenode pin #ifdef DEBUG pc.printf("[MAIN] Basenode switch: %i\r\n", isBasenode); #endif - time_t timestamp = 0; - //if (isBasenode) - //TODO: get timestamp from API - //TODO: be ready to broadcast as the basenode - //else - //TODO: request timestamp from base node - //TODO: find out who basenode is - - set_time(timestamp); - //TODO: load configuration from SD if (isBasenode) + { + getLocalAddress(); + http h = http(); + //TODO: get timestamp from API + set_time(timestamp); + + xbee.registerMessageCallback(MESSAGE_BASE_ADDRESS_REQUEST, handleBaseAddressRequest); + while(1) { #ifdef DEBUG @@ -81,10 +131,17 @@ wait(5); } + } else + { + sensorinterface sensors = sensorinterface(); + getNetworkParameters(); + set_time(timestamp); + while(1) { - //if xbee interrupt has woken us up + xbee.readMessage(); + //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 @@ -103,14 +160,17 @@ #ifdef DEBUG pc.printf("[MAIN] Data waiting, reading data...\r\n"); #endif + d_reply data = sensors.readData(); + #ifdef DEBUG for (int i = 0; i < data.readings.size(); i++) pc.printf("0x%.4X|", data.readings[i]); #endif + //log - sd.write(static_cast<long int>(time(NULL)), data); + //sd.write(static_cast<long int>(time(NULL)), data); } - } + } } \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Tue Nov 18 18:28:52 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#318e02f48146
--- a/sensorinterface.cpp Tue Nov 11 17:33:41 2014 +0000 +++ b/sensorinterface.cpp Tue Nov 18 18:28:52 2014 +0000 @@ -8,6 +8,10 @@ char buffer[255]; + #ifdef DEBUG + printf("[SIF] Scanning for devices...\r\n"); + #endif + for (char i=1; i<=254; i=i+2) { //last bit determines read/write not actual address @@ -31,13 +35,22 @@ void sensorinterface::requestData() { - currentSensor = sensors.begin(); - - #ifdef DEBUG - printf("[SIF] Beginning device query chain from 0x%.2X\r\n", currentSensor->first); - #endif - - sendRequest(currentSensor->first); + if (sensors.size() > 0) + { + currentSensor = sensors.begin(); + + #ifdef DEBUG + printf("[SIF] Beginning device query chain from 0x%.2X\r\n", currentSensor->first); + #endif + + sendRequest(currentSensor->first); + } + else + { + #ifdef DEBUG + printf("[SIF] Data requested, but no devices present\r\n"); + #endif + } } void sensorinterface::readyTrigger()
--- a/snail.lib Tue Nov 11 17:33:41 2014 +0000 +++ b/snail.lib Tue Nov 18 18:28:52 2014 +0000 @@ -1,1 +1,1 @@ -http://developer.mbed.org/users/Trumple/code/snail/#0b79538c5e5a +http://developer.mbed.org/users/Trumple/code/snail/#125dca84093e