MBED_DEMOS / Mbed 2 deprecated mbed_mqtt_endpoint_nxp

Dependencies:   C12832_lcd EthernetInterface StatusReporter LM75B MQTT-ansond endpoint_core endpoint_mqtt mbed-rtos mbed

Committer:
ansond
Date:
Tue Mar 04 21:42:39 2014 +0000
Revision:
79:67accc95965a
Parent:
48:d3663434128d
Child:
85:9fdd9198001c
updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ansond 0:ae2a45502448 1 /* Copyright C2013 Doug Anson, MIT License
ansond 0:ae2a45502448 2 *
ansond 0:ae2a45502448 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
ansond 0:ae2a45502448 4 * and associated documentation files the "Software", to deal in the Software without restriction,
ansond 0:ae2a45502448 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
ansond 0:ae2a45502448 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
ansond 0:ae2a45502448 7 * furnished to do so, subject to the following conditions:
ansond 0:ae2a45502448 8 *
ansond 0:ae2a45502448 9 * The above copyright notice and this permission notice shall be included in all copies or
ansond 0:ae2a45502448 10 * substantial portions of the Software.
ansond 0:ae2a45502448 11 *
ansond 0:ae2a45502448 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
ansond 0:ae2a45502448 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
ansond 0:ae2a45502448 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
ansond 0:ae2a45502448 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ansond 0:ae2a45502448 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ansond 0:ae2a45502448 17 */
ansond 0:ae2a45502448 18
ansond 0:ae2a45502448 19 #include "MQTTTransport.h"
ansond 0:ae2a45502448 20 #include "MBEDEndpoint.h"
ansond 0:ae2a45502448 21
ansond 0:ae2a45502448 22 // MBED Light support
ansond 0:ae2a45502448 23 #include "MBEDLight.h"
ansond 0:ae2a45502448 24
ansond 2:90a84a216c58 25 // Emulated Resource Factory
ansond 2:90a84a216c58 26 #include "EmulatedResourceFactory.h"
ansond 2:90a84a216c58 27
ansond 0:ae2a45502448 28 // Emulated Actions we can act on
ansond 0:ae2a45502448 29 #include "EmulatedLightDimmerAction.h"
ansond 0:ae2a45502448 30 #include "EmulatedLightSwitchAction.h"
ansond 48:d3663434128d 31
ansond 48:d3663434128d 32 // string support
ansond 48:d3663434128d 33 #include <stdlib.h>
ansond 48:d3663434128d 34 #include <string.h>
ansond 22:f1002e5993c5 35
ansond 7:f570eb3f38cd 36 // shutdown endpoint reference
ansond 7:f570eb3f38cd 37 extern void closedown(int code);
ansond 0:ae2a45502448 38
ansond 0:ae2a45502448 39 // default constructor
ansond 0:ae2a45502448 40 MBEDEndpoint::MBEDEndpoint(ErrorHandler *error_handler,EthernetInterface *ethernet) {
ansond 0:ae2a45502448 41 bool success = true;
ansond 0:ae2a45502448 42 for(int i=0;i<NUM_TRANSPORTS;++i) this->m_transports[i] = NULL;
ansond 0:ae2a45502448 43 this->m_error_handler = error_handler;
ansond 32:a7b3c285446c 44 if (success) this->initEndpointName();
ansond 0:ae2a45502448 45 if (success) this->logger()->turnLEDBlue();
ansond 79:67accc95965a 46 #ifdef MAC_ADDRESS
ansond 79:67accc95965a 47 extern char fmt_mac[RESOURCE_VALUE_LEN+1];
ansond 79:67accc95965a 48 if (success)this->logger()->log("%s (MAC: %s)",ENDPOINT_VERSION_ANNOUNCE,fmt_mac);
ansond 79:67accc95965a 49 #else
ansond 30:5c670ec5d203 50 if (success)this->logger()->log(ENDPOINT_VERSION_ANNOUNCE);
ansond 79:67accc95965a 51 #endif
ansond 0:ae2a45502448 52 if (success) success = this->initializeEthernet(ethernet);
ansond 0:ae2a45502448 53 if (success) this->logger()->turnLEDYellow();
ansond 33:8302b02413bd 54 if (success)this->m_map = new MBEDToIOCResourceMap(error_handler);
ansond 30:5c670ec5d203 55 if (success) success = this->initializeTransports();
ansond 33:8302b02413bd 56 if (success) success = this->initializeLights();
ansond 0:ae2a45502448 57 if (success) this->logger()->turnLEDGreen();
ansond 7:f570eb3f38cd 58 if (!success) closedown(2);
ansond 0:ae2a45502448 59 }
ansond 0:ae2a45502448 60
ansond 0:ae2a45502448 61 // default destructor
ansond 0:ae2a45502448 62 MBEDEndpoint::~MBEDEndpoint() {
ansond 0:ae2a45502448 63 bool success = true;
ansond 0:ae2a45502448 64 if (success) this->logger()->turnLEDYellow();
ansond 0:ae2a45502448 65 if (success) success = this->closeLights();
ansond 0:ae2a45502448 66 if (success) success = this->closeTransports();
ansond 0:ae2a45502448 67 if (success) success = this->closeEthernet();
ansond 0:ae2a45502448 68 if (success) this->logger()->turnLEDBlue();
ansond 15:e44d75d95b38 69 if (this->m_map != NULL) delete this->m_map;
ansond 0:ae2a45502448 70 }
ansond 24:7b3a5c927a53 71
ansond 15:e44d75d95b38 72 // get the IOC <--> MBED resource map
ansond 15:e44d75d95b38 73 MBEDToIOCResourceMap *MBEDEndpoint::getMap() { return this->m_map; }
ansond 15:e44d75d95b38 74
ansond 0:ae2a45502448 75 // initialize the Lights
ansond 0:ae2a45502448 76 bool MBEDEndpoint::initializeLights() {
ansond 0:ae2a45502448 77 this->logger()->log("Initializing Lights...");
ansond 0:ae2a45502448 78 for(int i=0;i<NUM_LIGHTS;++i) {
ansond 0:ae2a45502448 79 this->m_lights[i] = new MBEDLight(this->logger(),this->m_transports,i+1,this);
ansond 0:ae2a45502448 80 this->m_lights[i]->setDimmerAction(new EmulatedLightDimmerAction(this->logger(),this->m_lights[i]));
ansond 0:ae2a45502448 81 this->m_lights[i]->setSwitchAction(new EmulatedLightSwitchAction(this->logger(),this->m_lights[i]));
ansond 0:ae2a45502448 82 }
ansond 0:ae2a45502448 83 return true;
ansond 0:ae2a45502448 84 }
ansond 0:ae2a45502448 85
ansond 0:ae2a45502448 86 // does the input name match any of our light resources?
ansond 0:ae2a45502448 87 int MBEDEndpoint::indexOfLight(char *name) {
ansond 0:ae2a45502448 88 bool found = false;
ansond 0:ae2a45502448 89 int index = -1;
ansond 0:ae2a45502448 90
ansond 0:ae2a45502448 91 for(int i=0;i<NUM_LIGHTS && !found;++i) {
ansond 0:ae2a45502448 92 if (strcmp(this->m_lights[i]->getName(),name) == 0) {
ansond 0:ae2a45502448 93 found = true;
ansond 0:ae2a45502448 94 index = i;
ansond 0:ae2a45502448 95 }
ansond 0:ae2a45502448 96 }
ansond 0:ae2a45502448 97
ansond 0:ae2a45502448 98 return index;
ansond 0:ae2a45502448 99 }
ansond 0:ae2a45502448 100
ansond 0:ae2a45502448 101 // get a specific resources
ansond 0:ae2a45502448 102 ResourceFactory *MBEDEndpoint::getResources(int index) {
ansond 0:ae2a45502448 103 if (index >= 0 && index < NUM_LIGHTS) return this->m_lights[index]->resources();
ansond 0:ae2a45502448 104 return NULL;
ansond 0:ae2a45502448 105 }
ansond 0:ae2a45502448 106
ansond 0:ae2a45502448 107 // initialize our ResourceFactory
ansond 39:bd5b2bcd2dcc 108 ResourceFactory *MBEDEndpoint::initResourceFactory() { return new EmulatedResourceFactory(this->logger(),(void *)this); }
ansond 2:90a84a216c58 109
ansond 32:a7b3c285446c 110 // Initialize the Endpoint Name - will be the first Light resource name (and there must be one...)
ansond 32:a7b3c285446c 111 void MBEDEndpoint::initEndpointName() {
ansond 32:a7b3c285446c 112 memset(this->m_endpoint_name,0,LIGHT_NAME_LEN+1);
ansond 32:a7b3c285446c 113 sprintf(this->m_endpoint_name,LIGHT_NAME,1);
ansond 32:a7b3c285446c 114 }
ansond 32:a7b3c285446c 115
ansond 32:a7b3c285446c 116 // get our endpoint name
ansond 32:a7b3c285446c 117 char *MBEDEndpoint::getEndpointName() { return this->m_endpoint_name; }
ansond 0:ae2a45502448 118
ansond 0:ae2a45502448 119 // initialize a specific transport
ansond 0:ae2a45502448 120 bool MBEDEndpoint::initializeTransport(int index,char *key,Transport *transport) {
ansond 0:ae2a45502448 121 bool success = false;
ansond 0:ae2a45502448 122 if (this->m_transports[index] == NULL) {
ansond 0:ae2a45502448 123 this->logger()->log("Initializing %s Transport...", key);
ansond 0:ae2a45502448 124 this->m_transports[index] = transport;
ansond 0:ae2a45502448 125 if (this->m_transports[index] != NULL) success = this->m_transports[index]->connect();
ansond 0:ae2a45502448 126 }
ansond 0:ae2a45502448 127 else {
ansond 0:ae2a45502448 128 this->logger()->log("%s already connected (OK)...", key);
ansond 0:ae2a45502448 129 success = true;
ansond 0:ae2a45502448 130 }
ansond 0:ae2a45502448 131 return success;
ansond 0:ae2a45502448 132 }
ansond 0:ae2a45502448 133
ansond 0:ae2a45502448 134 // initialize our transports
ansond 0:ae2a45502448 135 bool MBEDEndpoint::initializeTransports() {
ansond 0:ae2a45502448 136 bool success = true;
ansond 0:ae2a45502448 137
ansond 0:ae2a45502448 138 if (success == true) {
ansond 0:ae2a45502448 139 // MQTT Initialization
ansond 15:e44d75d95b38 140 success = this->initializeTransport(MQTT_TRANSPORT,"MQTT",new MQTTTransport(this->m_error_handler,this,this->getMap()));
ansond 0:ae2a45502448 141 }
ansond 0:ae2a45502448 142
ansond 0:ae2a45502448 143 if (success == true) {
ansond 0:ae2a45502448 144 // HTTP Initialization
ansond 36:210f3956038c 145 success = this->initializeTransport(HTTP_TRANSPORT,"HTTP",new IOCHTTPTransport(this->m_error_handler,this));
ansond 0:ae2a45502448 146 }
ansond 0:ae2a45502448 147 return success;
ansond 0:ae2a45502448 148 }
ansond 0:ae2a45502448 149
ansond 0:ae2a45502448 150 // initialize our Ethernet
ansond 0:ae2a45502448 151 bool MBEDEndpoint::initializeEthernet(EthernetInterface *ethernet) {
ansond 0:ae2a45502448 152 bool success = false;
ansond 0:ae2a45502448 153 this->m_ethernet = ethernet;
ansond 0:ae2a45502448 154 if (this->m_ethernet != NULL) {
ansond 0:ae2a45502448 155 this->logger()->log("Initializing Ethernet...");
ansond 0:ae2a45502448 156
ansond 0:ae2a45502448 157 // connect up ethernet
ansond 0:ae2a45502448 158 this->m_ethernet->init();
ansond 0:ae2a45502448 159 this->m_ethernet->connect();
ansond 0:ae2a45502448 160
ansond 0:ae2a45502448 161 // display our IP address
ansond 0:ae2a45502448 162 char *ipaddr = this->m_ethernet->getIPAddress();
ansond 0:ae2a45502448 163 if (ipaddr != NULL && strlen(ipaddr) > 0) {
ansond 0:ae2a45502448 164 this->logger()->log("IPAddress: %s",this->m_ethernet->getIPAddress());
ansond 0:ae2a45502448 165 success = true;
ansond 0:ae2a45502448 166 }
ansond 0:ae2a45502448 167 else {
ansond 0:ae2a45502448 168 this->logger()->log("Ethernet Not Connected...");
ansond 0:ae2a45502448 169 success = false;
ansond 0:ae2a45502448 170 }
ansond 0:ae2a45502448 171 }
ansond 0:ae2a45502448 172 else {
ansond 0:ae2a45502448 173 this->logger()->log("No Ethernet instance found");
ansond 0:ae2a45502448 174 success = false;
ansond 0:ae2a45502448 175 }
ansond 0:ae2a45502448 176 return success;
ansond 0:ae2a45502448 177 }
ansond 0:ae2a45502448 178
ansond 13:25448d92c205 179 // load up all endpoints into the IOC
ansond 13:25448d92c205 180 bool MBEDEndpoint::loadEndpoints() {
ansond 13:25448d92c205 181 bool success = true;
ansond 15:e44d75d95b38 182 this->logger()->log("Loading All Endpoints to IOC...");
ansond 13:25448d92c205 183 for(int i=0;i<NUM_LIGHTS && success;++i) success = this->loadEndpoint(this->m_lights[i]);
ansond 13:25448d92c205 184 return success;
ansond 13:25448d92c205 185 }
ansond 13:25448d92c205 186
ansond 0:ae2a45502448 187 // load up our endpoint to the IOC
ansond 15:e44d75d95b38 188 bool MBEDEndpoint::loadEndpoint(Light *light) {
ansond 11:59ee476fda24 189 bool success = false;
ansond 11:59ee476fda24 190 char result[IOC_RESULT_LEN+1];
ansond 11:59ee476fda24 191 char payload[IOC_PAYLOAD_LEN+1];
ansond 11:59ee476fda24 192
ansond 11:59ee476fda24 193 // initialize
ansond 17:84ab108ed670 194 memset(result,0,IOC_RESULT_LEN+1);
ansond 17:84ab108ed670 195 memset(payload,0,IOC_PAYLOAD_LEN+1);
ansond 15:e44d75d95b38 196
ansond 15:e44d75d95b38 197 // DEBUG
ansond 48:d3663434128d 198 this->logger()->log("Building Payload for Light: %s...",light->getName());
ansond 12:952dce085876 199
ansond 11:59ee476fda24 200 // build the payload
ansond 14:0a6497a380a4 201 char *data = this->buildIOCPayload(payload,IOC_PAYLOAD_LEN,light);
ansond 19:956b694f6542 202
ansond 11:59ee476fda24 203 // issue the request
ansond 48:d3663434128d 204 if (data != NULL && strlen(data) > 0) {
ansond 48:d3663434128d 205 // DEBUG
ansond 48:d3663434128d 206 this->logger()->log("Sending Light: %s to the IOC...",light->getName());
ansond 48:d3663434128d 207
ansond 48:d3663434128d 208 // load
ansond 48:d3663434128d 209 success = this->m_transports[LOAD_TRANSPORT]->loadEndpoint((char *)payload,strlen(payload),(char *)result,IOC_RESULT_LEN);
ansond 48:d3663434128d 210 }
ansond 11:59ee476fda24 211
ansond 15:e44d75d95b38 212 // DEBUG
ansond 23:793b2898522e 213 //if (success) this->logger()->log("Saving IOC ID for Light: %s...",light->getName());
ansond 15:e44d75d95b38 214
ansond 11:59ee476fda24 215 // update the IOC ID if found
ansond 24:7b3a5c927a53 216 if (success) this->saveIOCID(light,result);
ansond 11:59ee476fda24 217
ansond 15:e44d75d95b38 218 // DEBUG
ansond 24:7b3a5c927a53 219 if (success) this->logger()->log("Light: %s IOC ID=%d sent successfully",light->getName(),light->getIOCID());
ansond 19:956b694f6542 220
ansond 19:956b694f6542 221 // DEBUG
ansond 48:d3663434128d 222 if (!success) {
ansond 48:d3663434128d 223 if (light != NULL) this->logger()->log("Light: %s send FAILED",light->getName());
ansond 48:d3663434128d 224 else this->logger()->log("Light: send FAILED (NULL LIGHT)");
ansond 48:d3663434128d 225 }
ansond 15:e44d75d95b38 226
ansond 11:59ee476fda24 227 // return our status
ansond 11:59ee476fda24 228 return success;
ansond 11:59ee476fda24 229 }
ansond 0:ae2a45502448 230
ansond 13:25448d92c205 231 // update all endpoints to the IOC
ansond 13:25448d92c205 232 bool MBEDEndpoint::updateEndpoints() {
ansond 13:25448d92c205 233 bool success = true;
ansond 13:25448d92c205 234 for(int i=0;i<NUM_LIGHTS && success;++i) success = this->updateEndpoints(i);
ansond 13:25448d92c205 235 return success;
ansond 13:25448d92c205 236 }
ansond 13:25448d92c205 237
ansond 13:25448d92c205 238 // update all endpoints to the IOC
ansond 13:25448d92c205 239 bool MBEDEndpoint::updateEndpoints(int index) {
ansond 13:25448d92c205 240 if (index >= 0 && index < NUM_LIGHTS) return this->updateEndpoint(this->m_lights[index]);
ansond 13:25448d92c205 241 return false;
ansond 13:25448d92c205 242 }
ansond 13:25448d92c205 243
ansond 0:ae2a45502448 244 // update our endpoint with the IOC
ansond 13:25448d92c205 245 bool MBEDEndpoint::updateEndpoint(Light *light) {
ansond 11:59ee476fda24 246 bool success = false;
ansond 11:59ee476fda24 247 char result[IOC_RESULT_LEN+1];
ansond 11:59ee476fda24 248 char payload[IOC_PAYLOAD_LEN+1];
ansond 11:59ee476fda24 249
ansond 11:59ee476fda24 250 // initialize
ansond 17:84ab108ed670 251 memset(result,0,IOC_RESULT_LEN+1);
ansond 17:84ab108ed670 252 memset(payload,0,IOC_PAYLOAD_LEN+1);
ansond 12:952dce085876 253
ansond 11:59ee476fda24 254 // build the payload
ansond 14:0a6497a380a4 255 char *data = this->buildIOCPayload(payload,IOC_PAYLOAD_LEN,light);
ansond 11:59ee476fda24 256
ansond 48:d3663434128d 257 // issue the request
ansond 48:d3663434128d 258 if (data != NULL && strlen(data) > 0) {
ansond 48:d3663434128d 259 // DEBUG
ansond 48:d3663434128d 260 this->logger()->log("Updating Light: %s at the IOC...",light->getName());
ansond 48:d3663434128d 261
ansond 48:d3663434128d 262 // update
ansond 48:d3663434128d 263 success = this->m_transports[LOAD_TRANSPORT]->updateEndpoint(light->getIOCID(),(char *)payload,strlen(payload),(char *)result,IOC_RESULT_LEN);
ansond 48:d3663434128d 264 }
ansond 23:793b2898522e 265
ansond 23:793b2898522e 266 // DEBUG
ansond 23:793b2898522e 267 if (success) this->logger()->log("Update of Endpoint to IOC successful");
ansond 23:793b2898522e 268 else this->logger()->log("Update of Endpoint to IOC FAILED");
ansond 11:59ee476fda24 269
ansond 11:59ee476fda24 270 // return our status
ansond 11:59ee476fda24 271 return success;
ansond 11:59ee476fda24 272 }
ansond 11:59ee476fda24 273
ansond 11:59ee476fda24 274 // build out the Payload
ansond 13:25448d92c205 275 char *MBEDEndpoint::buildIOCPayload(char *data,int data_length,Light *light) {
ansond 48:d3663434128d 276 char tmp[TEMP_BUFFER_LEN+1];
ansond 48:d3663434128d 277
ansond 11:59ee476fda24 278 // construct the payload for Load/Updates
ansond 13:25448d92c205 279 ResourceFactory *factory = light->getResourceFactory();
ansond 48:d3663434128d 280
ansond 48:d3663434128d 281 // start the buffer
ansond 48:d3663434128d 282 strcat(data,"{");
ansond 13:25448d92c205 283
ansond 13:25448d92c205 284 // loop through the resources and build a JSON representation for the payload
ansond 13:25448d92c205 285 for(int i=0;i<factory->numResources();++i) {
ansond 13:25448d92c205 286 // get the ith resource
ansond 13:25448d92c205 287 Resource *resource = factory->getResource(i);
ansond 48:d3663434128d 288 if (resource != NULL) {
ansond 48:d3663434128d 289 // add to the JSON payload
ansond 48:d3663434128d 290 char *name = this->getMap()->endpointNameToIOCName(resource->getName());
ansond 48:d3663434128d 291 char *value = resource->getValue();
ansond 48:d3663434128d 292
ansond 48:d3663434128d 293 // Handle LOCATION a special way
ansond 48:d3663434128d 294 if (strcmp(name,"LOCATION") != 0) {
ansond 48:d3663434128d 295 // standard name,value for IOC
ansond 48:d3663434128d 296 sprintf(tmp, "\"%s\":\"%s\",",name,value);
ansond 48:d3663434128d 297 }
ansond 48:d3663434128d 298 else {
ansond 48:d3663434128d 299 // IOC expects "Point(X,Y)" for LOCATION
ansond 48:d3663434128d 300 sprintf(tmp, "\"%s\":\"Point(%s)\",",name,value);
ansond 48:d3663434128d 301 }
ansond 48:d3663434128d 302 strcat(data,tmp);
ansond 48:d3663434128d 303
ansond 48:d3663434128d 304 // Handle /dev/addldata
ansond 48:d3663434128d 305 char *dev_addldata = this->getMap()->endpointNameToIOCName("/dev/addldata");
ansond 48:d3663434128d 306 if (dev_addldata != NULL && strcmp(name,dev_addldata) == 0 && light != NULL && light->getIOCID() > 0) {
ansond 48:d3663434128d 307 char buf[IOC_IOC_ID_LEN+1]; memset(buf,0,IOC_IOC_ID_LEN+1); sprintf(buf,"%d",light->getIOCID());
ansond 48:d3663434128d 308 sprintf(tmp,"\"%s\":\"id:%s\",",name,buf);
ansond 48:d3663434128d 309 strcat(data,tmp);
ansond 48:d3663434128d 310 }
ansond 24:7b3a5c927a53 311 }
ansond 13:25448d92c205 312 }
ansond 13:25448d92c205 313
ansond 17:84ab108ed670 314 // Special Case: STARTDATETIME
ansond 48:d3663434128d 315 strcat(data,"\"STARTDATETIME\":\"2014-02-27T22:03:06.973Z\",");
ansond 17:84ab108ed670 316
ansond 17:84ab108ed670 317 // Special Case: ENDDATETIME
ansond 48:d3663434128d 318 strcat(data,"\"ENDDATETIME\":\"2015-02-27T03:35:55.940Z\",");
ansond 48:d3663434128d 319
ansond 21:d1ce325d1d32 320 // Special Case: NAME
ansond 48:d3663434128d 321 sprintf(tmp,"\"NAME\":\"%s\",",light->getName());
ansond 48:d3663434128d 322 strcat(data,tmp);
ansond 48:d3663434128d 323
ansond 21:d1ce325d1d32 324 // Special Case: TIMEZONEOFFSET
ansond 48:d3663434128d 325 strcat(data,"\"TIMEZONEOFFSET\":\"+2:00\"");
ansond 24:7b3a5c927a53 326
ansond 21:d1ce325d1d32 327 // close
ansond 48:d3663434128d 328 strcat(data,"}");
ansond 48:d3663434128d 329
ansond 13:25448d92c205 330 // DEBUG
ansond 23:793b2898522e 331 //this->logger()->log("Loading Payload: %s",data);
ansond 11:59ee476fda24 332
ansond 11:59ee476fda24 333 // return the payload
ansond 12:952dce085876 334 return data;
ansond 11:59ee476fda24 335 }
ansond 11:59ee476fda24 336
ansond 11:59ee476fda24 337 // save the IOC ID
ansond 24:7b3a5c927a53 338 void MBEDEndpoint::saveIOCID(Light *light,char *json) {
ansond 48:d3663434128d 339 if (json != NULL) {
ansond 48:d3663434128d 340 //this->logger()->log("RESULT: %s",json);
ansond 48:d3663434128d 341
ansond 22:f1002e5993c5 342 // look for "id":
ansond 48:d3663434128d 343 char *check = "\"id\":";
ansond 48:d3663434128d 344 char *pos1 = strstr(json,check);
ansond 48:d3663434128d 345 if (pos1 != NULL) {
ansond 48:d3663434128d 346 char *pos2 = strstr(pos1,",");
ansond 48:d3663434128d 347 if (pos1 != NULL && pos2 != NULL && pos2 > pos1) {
ansond 48:d3663434128d 348 pos1 += strlen(check);
ansond 48:d3663434128d 349 int length = pos2 - pos1;
ansond 48:d3663434128d 350 char str_ioc_id[IOC_IOC_ID_LEN+1];
ansond 48:d3663434128d 351 memset(str_ioc_id,0,IOC_IOC_ID_LEN+1);
ansond 48:d3663434128d 352 strncpy(str_ioc_id,pos1,length);
ansond 48:d3663434128d 353
ansond 48:d3663434128d 354 // DEBUG
ansond 48:d3663434128d 355 //this->logger()->log("IOC ID found: %s",str_ioc_id);
ansond 48:d3663434128d 356
ansond 48:d3663434128d 357 // parse into int
ansond 48:d3663434128d 358 int ioc_id = 0;
ansond 48:d3663434128d 359 sscanf(str_ioc_id,"%d",&ioc_id);
ansond 48:d3663434128d 360
ansond 48:d3663434128d 361 // save the IOC ID
ansond 48:d3663434128d 362 if (ioc_id > 0) light->setIOCID(ioc_id);
ansond 48:d3663434128d 363 }
ansond 48:d3663434128d 364 else {
ansond 48:d3663434128d 365 // cannot find the ID tag in the result JSON
ansond 48:d3663434128d 366 this->logger()->log("Cannot find the IOC ID in the JSON result");
ansond 48:d3663434128d 367 this->logger()->log("JSON: %s",json);
ansond 48:d3663434128d 368 }
ansond 23:793b2898522e 369 }
ansond 23:793b2898522e 370 else {
ansond 23:793b2898522e 371 // cannot find the ID tag in the result JSON
ansond 23:793b2898522e 372 this->logger()->log("Cannot find the IOC ID in the JSON result");
ansond 23:793b2898522e 373 this->logger()->log("JSON: %s",json);
ansond 48:d3663434128d 374 }
ansond 22:f1002e5993c5 375 }
ansond 22:f1002e5993c5 376 }
ansond 22:f1002e5993c5 377
ansond 0:ae2a45502448 378 // close down the Lights
ansond 0:ae2a45502448 379 bool MBEDEndpoint::closeLights() {
ansond 0:ae2a45502448 380 bool success = true;
ansond 0:ae2a45502448 381 this->logger()->log("Closing down Lights...");
ansond 15:e44d75d95b38 382 for(int i=0;i<NUM_LIGHTS;++i)
ansond 15:e44d75d95b38 383 if (this->m_lights[i] != NULL) delete this->m_lights[i];
ansond 0:ae2a45502448 384 return success;
ansond 0:ae2a45502448 385 }
ansond 0:ae2a45502448 386
ansond 0:ae2a45502448 387 // close a given transport
ansond 0:ae2a45502448 388 bool MBEDEndpoint::closeTransport(int index,char *key) {
ansond 0:ae2a45502448 389 this->logger()->log("Closing down %s Transport...", key);
ansond 0:ae2a45502448 390 if (this->m_transports[index] != NULL) delete this->m_transports[index];
ansond 0:ae2a45502448 391 return true;
ansond 0:ae2a45502448 392 }
ansond 0:ae2a45502448 393
ansond 0:ae2a45502448 394 // close down our transports
ansond 0:ae2a45502448 395 bool MBEDEndpoint::closeTransports() {
ansond 0:ae2a45502448 396 bool success = true;
ansond 0:ae2a45502448 397
ansond 0:ae2a45502448 398 if (success) {
ansond 0:ae2a45502448 399 // close MQTT
ansond 0:ae2a45502448 400 success = this->closeTransport(MQTT_TRANSPORT,"MQTT");
ansond 0:ae2a45502448 401 }
ansond 0:ae2a45502448 402
ansond 0:ae2a45502448 403 if (success) {
ansond 0:ae2a45502448 404 // close HTTP
ansond 0:ae2a45502448 405 success = this->closeTransport(HTTP_TRANSPORT,"HTTP");
ansond 0:ae2a45502448 406 }
ansond 0:ae2a45502448 407
ansond 0:ae2a45502448 408 return success;
ansond 0:ae2a45502448 409 }
ansond 0:ae2a45502448 410
ansond 0:ae2a45502448 411 // close down our Ethernet
ansond 0:ae2a45502448 412 bool MBEDEndpoint::closeEthernet() {
ansond 0:ae2a45502448 413 this->logger()->log("Closing down Ethernet...");
ansond 0:ae2a45502448 414 if (this->m_ethernet != NULL) this->m_ethernet->disconnect();
ansond 0:ae2a45502448 415 return true;
ansond 0:ae2a45502448 416 }
ansond 0:ae2a45502448 417
ansond 13:25448d92c205 418 // min function
ansond 13:25448d92c205 419 int MBEDEndpoint::min(int value1,int value2) {
ansond 13:25448d92c205 420 if (value1 < value2) return value1;
ansond 13:25448d92c205 421 return value2;
ansond 13:25448d92c205 422 }
ansond 13:25448d92c205 423
ansond 0:ae2a45502448 424 // get our error handler
ansond 0:ae2a45502448 425 ErrorHandler *MBEDEndpoint::logger() { return this->m_error_handler; }
ansond 0:ae2a45502448 426
ansond 0:ae2a45502448 427 // main running loop
ansond 0:ae2a45502448 428 void MBEDEndpoint::run() {
ansond 0:ae2a45502448 429 this->logger()->log("Endpoint Main Loop");
ansond 0:ae2a45502448 430 while(true) {
ansond 0:ae2a45502448 431 // sleep a bit
ansond 0:ae2a45502448 432 //this->logger()->log("Sleeping for a bit...");
ansond 0:ae2a45502448 433 wait_ms(MAIN_LOOP_SLEEP);
ansond 0:ae2a45502448 434
ansond 0:ae2a45502448 435 // check for events
ansond 0:ae2a45502448 436 //this->logger()->log("Processing Events...");
ansond 0:ae2a45502448 437 for(int i=0;i<NUM_TRANSPORTS;++i) this->m_transports[i]->checkAndProcess();
ansond 0:ae2a45502448 438
ansond 0:ae2a45502448 439 // check for exit
ansond 0:ae2a45502448 440 //this->logger()->log("Checking for exit...");
ansond 0:ae2a45502448 441 this->logger()->checkForExit();
ansond 0:ae2a45502448 442 }
ansond 0:ae2a45502448 443 }
ansond 0:ae2a45502448 444