Dreamforce 2013 MiniHack Thermostat Challenge
Dependencies: C12832_lcd EthernetInterface-ansond-patched HTTPClient-thermostat-remotes LM75B MMA7660 SocketIO WebSocketClient-ThermostatDemo mbed-rtos mbed picojson
ThermostatSocketIO.cpp@3:399f01802514, 2013-11-11 (annotated)
- Committer:
- ansond
- Date:
- Mon Nov 11 20:36:21 2013 +0000
- Revision:
- 3:399f01802514
- Parent:
- 0:bca7aceedd02
updates
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ansond | 0:bca7aceedd02 | 1 | #include "ThermostatSocketIO.h" |
ansond | 0:bca7aceedd02 | 2 | |
ansond | 0:bca7aceedd02 | 3 | // Default SocketIO URL |
ansond | 0:bca7aceedd02 | 4 | #define DEFAULT_URL "mc-control-1.herokuapp.com" |
ansond | 0:bca7aceedd02 | 5 | |
ansond | 0:bca7aceedd02 | 6 | // message counter |
ansond | 0:bca7aceedd02 | 7 | int counter = 1; |
ansond | 0:bca7aceedd02 | 8 | |
ansond | 0:bca7aceedd02 | 9 | // constructor |
ansond | 0:bca7aceedd02 | 10 | ThermostatSocketIO::ThermostatSocketIO(char *devname) : SocketIO(DEFAULT_URL) { |
ansond | 0:bca7aceedd02 | 11 | this->device_name = devname; |
ansond | 0:bca7aceedd02 | 12 | } |
ansond | 0:bca7aceedd02 | 13 | |
ansond | 0:bca7aceedd02 | 14 | // constructor |
ansond | 0:bca7aceedd02 | 15 | ThermostatSocketIO::ThermostatSocketIO(char * myurl, char *devname) : SocketIO(myurl) { |
ansond | 0:bca7aceedd02 | 16 | this->device_name = devname; |
ansond | 0:bca7aceedd02 | 17 | } |
ansond | 0:bca7aceedd02 | 18 | |
ansond | 0:bca7aceedd02 | 19 | // reset the message counter |
ansond | 0:bca7aceedd02 | 20 | void ThermostatSocketIO::resetMessageCounter() { |
ansond | 0:bca7aceedd02 | 21 | counter = 1; |
ansond | 0:bca7aceedd02 | 22 | } |
ansond | 0:bca7aceedd02 | 23 | |
ansond | 0:bca7aceedd02 | 24 | // emit a message (broadcast) to the SocketIO server |
ansond | 0:bca7aceedd02 | 25 | int ThermostatSocketIO::emit(float temp, float latitude, float longitude, float bat, int errorState, char *t_status) { |
ansond | 0:bca7aceedd02 | 26 | // create json string with acc/tmp data |
ansond | 0:bca7aceedd02 | 27 | char send[256]; |
ansond | 0:bca7aceedd02 | 28 | char *json = this->createJSON(send,temp,latitude,longitude,bat,errorState,t_status); |
ansond | 0:bca7aceedd02 | 29 | |
ansond | 0:bca7aceedd02 | 30 | // handle the message name |
ansond | 0:bca7aceedd02 | 31 | char message_name[32]; |
ansond | 0:bca7aceedd02 | 32 | if (counter == 1) |
ansond | 0:bca7aceedd02 | 33 | // we need to register the device |
ansond | 0:bca7aceedd02 | 34 | sprintf(message_name,"register-device"); |
ansond | 0:bca7aceedd02 | 35 | else |
ansond | 0:bca7aceedd02 | 36 | // we are simply issuing readings... |
ansond | 0:bca7aceedd02 | 37 | sprintf(message_name,"readings"); |
ansond | 0:bca7aceedd02 | 38 | |
ansond | 0:bca7aceedd02 | 39 | // increment our counter |
ansond | 0:bca7aceedd02 | 40 | ++counter; |
ansond | 0:bca7aceedd02 | 41 | |
ansond | 0:bca7aceedd02 | 42 | // emit this json |
ansond | 0:bca7aceedd02 | 43 | return ((SocketIO *)this)->emit(message_name,json); |
ansond | 0:bca7aceedd02 | 44 | } |
ansond | 0:bca7aceedd02 | 45 | |
ansond | 0:bca7aceedd02 | 46 | // Close the thermostat socket.io |
ansond | 0:bca7aceedd02 | 47 | bool ThermostatSocketIO::close() { |
ansond | 0:bca7aceedd02 | 48 | char buf[256]; |
ansond | 0:bca7aceedd02 | 49 | char message_name[32]; |
ansond | 0:bca7aceedd02 | 50 | |
ansond | 0:bca7aceedd02 | 51 | // we need to register the device |
ansond | 0:bca7aceedd02 | 52 | sprintf(message_name,"disconnect"); |
ansond | 0:bca7aceedd02 | 53 | |
ansond | 0:bca7aceedd02 | 54 | // create the deregister JSON message |
ansond | 0:bca7aceedd02 | 55 | char *json = this->createDeregisterJSON(buf); |
ansond | 0:bca7aceedd02 | 56 | |
ansond | 0:bca7aceedd02 | 57 | // now send... |
ansond | 0:bca7aceedd02 | 58 | int sent = ((SocketIO *)this)->emit(message_name,json); |
ansond | 0:bca7aceedd02 | 59 | |
ansond | 0:bca7aceedd02 | 60 | // now close |
ansond | 0:bca7aceedd02 | 61 | return ((SocketIO *)this)->close(); |
ansond | 0:bca7aceedd02 | 62 | } |
ansond | 0:bca7aceedd02 | 63 | |
ansond | 0:bca7aceedd02 | 64 | // create the JSON to deregister the device |
ansond | 0:bca7aceedd02 | 65 | char *ThermostatSocketIO::createDeregisterJSON(char *buffer) { |
ansond | 0:bca7aceedd02 | 66 | // create the JSON to just register the device |
ansond | 0:bca7aceedd02 | 67 | sprintf(buffer,"[{ \"device_id\": \"%s\" } }]",this->device_name); |
ansond | 0:bca7aceedd02 | 68 | |
ansond | 0:bca7aceedd02 | 69 | // return the JSON |
ansond | 0:bca7aceedd02 | 70 | return buffer; |
ansond | 0:bca7aceedd02 | 71 | } |
ansond | 0:bca7aceedd02 | 72 | |
ansond | 0:bca7aceedd02 | 73 | // Create the JSON that is consumable by the demo webservice |
ansond | 0:bca7aceedd02 | 74 | char *ThermostatSocketIO::createJSON(char *buffer, float temp, float latitude, float longitude, float bat, int errorState, char *t_status) { |
ansond | 0:bca7aceedd02 | 75 | // create the message name |
ansond | 0:bca7aceedd02 | 76 | if (counter == 1) { |
ansond | 0:bca7aceedd02 | 77 | // create the JSON to just register the device |
ansond | 0:bca7aceedd02 | 78 | sprintf(buffer,"[\"%s\",{\"battery\": %d, \"city\": \"Austin\", \"country\": \"US\", \"device_id\": \"%s\", \"lat\": %4.6f, \"long\": %4.6f, \"status\": \"%s\", \"temp\": %4.1f, \"switch\": %d}]", |
ansond | 0:bca7aceedd02 | 79 | device_name, (int)bat, this->device_name, latitude, longitude, t_status, temp, errorState); |
ansond | 0:bca7aceedd02 | 80 | } |
ansond | 0:bca7aceedd02 | 81 | else { |
ansond | 0:bca7aceedd02 | 82 | // create the JSON |
ansond | 0:bca7aceedd02 | 83 | sprintf(buffer,"[{\"battery\": %d, \"city\": \"Austin\", \"country\": \"US\", \"device_id\": \"%s\", \"lat\": %4.6f, \"long\": %4.6f, \"status\": \"%s\", \"temp\": %4.1f, \"switch\": %d}]", |
ansond | 0:bca7aceedd02 | 84 | (int)bat, this->device_name, latitude, longitude, t_status, temp, errorState); |
ansond | 0:bca7aceedd02 | 85 | } |
ansond | 0:bca7aceedd02 | 86 | |
ansond | 0:bca7aceedd02 | 87 | // return the JSON |
ansond | 0:bca7aceedd02 | 88 | return buffer; |
ansond | 0:bca7aceedd02 | 89 | } |