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:
Fri Feb 28 21:21:19 2014 +0000
Revision:
33:8302b02413bd
Parent:
32:a7b3c285446c
Child:
36:210f3956038c
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 22:f1002e5993c5 31
ansond 7:f570eb3f38cd 32 // shutdown endpoint reference
ansond 7:f570eb3f38cd 33 extern void closedown(int code);
ansond 0:ae2a45502448 34
ansond 0:ae2a45502448 35 // default constructor
ansond 0:ae2a45502448 36 MBEDEndpoint::MBEDEndpoint(ErrorHandler *error_handler,EthernetInterface *ethernet) {
ansond 0:ae2a45502448 37 bool success = true;
ansond 0:ae2a45502448 38 for(int i=0;i<NUM_TRANSPORTS;++i) this->m_transports[i] = NULL;
ansond 0:ae2a45502448 39 this->m_error_handler = error_handler;
ansond 32:a7b3c285446c 40 if (success) this->initEndpointName();
ansond 0:ae2a45502448 41 if (success) this->logger()->turnLEDBlue();
ansond 30:5c670ec5d203 42 if (success)this->logger()->log(ENDPOINT_VERSION_ANNOUNCE);
ansond 0:ae2a45502448 43 if (success) success = this->initializeEthernet(ethernet);
ansond 0:ae2a45502448 44 if (success) this->logger()->turnLEDYellow();
ansond 33:8302b02413bd 45 if (success)this->m_map = new MBEDToIOCResourceMap(error_handler);
ansond 30:5c670ec5d203 46 if (success) success = this->initializeTransports();
ansond 33:8302b02413bd 47 if (success) success = this->initializeLights();
ansond 0:ae2a45502448 48 if (success) this->logger()->turnLEDGreen();
ansond 7:f570eb3f38cd 49 if (!success) closedown(2);
ansond 0:ae2a45502448 50 }
ansond 0:ae2a45502448 51
ansond 0:ae2a45502448 52 // default destructor
ansond 0:ae2a45502448 53 MBEDEndpoint::~MBEDEndpoint() {
ansond 0:ae2a45502448 54 bool success = true;
ansond 0:ae2a45502448 55 if (success) this->logger()->turnLEDYellow();
ansond 0:ae2a45502448 56 if (success) success = this->closeLights();
ansond 0:ae2a45502448 57 if (success) success = this->closeTransports();
ansond 0:ae2a45502448 58 if (success) success = this->closeEthernet();
ansond 0:ae2a45502448 59 if (success) this->logger()->turnLEDBlue();
ansond 15:e44d75d95b38 60 if (this->m_map != NULL) delete this->m_map;
ansond 0:ae2a45502448 61 }
ansond 24:7b3a5c927a53 62
ansond 15:e44d75d95b38 63 // get the IOC <--> MBED resource map
ansond 15:e44d75d95b38 64 MBEDToIOCResourceMap *MBEDEndpoint::getMap() { return this->m_map; }
ansond 15:e44d75d95b38 65
ansond 0:ae2a45502448 66 // initialize the Lights
ansond 0:ae2a45502448 67 bool MBEDEndpoint::initializeLights() {
ansond 0:ae2a45502448 68 this->logger()->log("Initializing Lights...");
ansond 0:ae2a45502448 69 for(int i=0;i<NUM_LIGHTS;++i) {
ansond 0:ae2a45502448 70 this->m_lights[i] = new MBEDLight(this->logger(),this->m_transports,i+1,this);
ansond 0:ae2a45502448 71 this->m_lights[i]->setDimmerAction(new EmulatedLightDimmerAction(this->logger(),this->m_lights[i]));
ansond 0:ae2a45502448 72 this->m_lights[i]->setSwitchAction(new EmulatedLightSwitchAction(this->logger(),this->m_lights[i]));
ansond 0:ae2a45502448 73 }
ansond 0:ae2a45502448 74 return true;
ansond 0:ae2a45502448 75 }
ansond 0:ae2a45502448 76
ansond 0:ae2a45502448 77 // does the input name match any of our light resources?
ansond 0:ae2a45502448 78 int MBEDEndpoint::indexOfLight(char *name) {
ansond 0:ae2a45502448 79 bool found = false;
ansond 0:ae2a45502448 80 int index = -1;
ansond 0:ae2a45502448 81
ansond 0:ae2a45502448 82 for(int i=0;i<NUM_LIGHTS && !found;++i) {
ansond 0:ae2a45502448 83 if (strcmp(this->m_lights[i]->getName(),name) == 0) {
ansond 0:ae2a45502448 84 found = true;
ansond 0:ae2a45502448 85 index = i;
ansond 0:ae2a45502448 86 }
ansond 0:ae2a45502448 87 }
ansond 0:ae2a45502448 88
ansond 0:ae2a45502448 89 return index;
ansond 0:ae2a45502448 90 }
ansond 0:ae2a45502448 91
ansond 0:ae2a45502448 92 // get a specific resources
ansond 0:ae2a45502448 93 ResourceFactory *MBEDEndpoint::getResources(int index) {
ansond 0:ae2a45502448 94 if (index >= 0 && index < NUM_LIGHTS) return this->m_lights[index]->resources();
ansond 0:ae2a45502448 95 return NULL;
ansond 0:ae2a45502448 96 }
ansond 0:ae2a45502448 97
ansond 0:ae2a45502448 98 // initialize our ResourceFactory
ansond 2:90a84a216c58 99 ResourceFactory *MBEDEndpoint::initResourceFactory() { return new EmulatedResourceFactory(this->logger()); }
ansond 2:90a84a216c58 100
ansond 32:a7b3c285446c 101 // Initialize the Endpoint Name - will be the first Light resource name (and there must be one...)
ansond 32:a7b3c285446c 102 void MBEDEndpoint::initEndpointName() {
ansond 32:a7b3c285446c 103 memset(this->m_endpoint_name,0,LIGHT_NAME_LEN+1);
ansond 32:a7b3c285446c 104 sprintf(this->m_endpoint_name,LIGHT_NAME,1);
ansond 32:a7b3c285446c 105 }
ansond 32:a7b3c285446c 106
ansond 32:a7b3c285446c 107 // get our endpoint name
ansond 32:a7b3c285446c 108 char *MBEDEndpoint::getEndpointName() { return this->m_endpoint_name; }
ansond 0:ae2a45502448 109
ansond 0:ae2a45502448 110 // initialize a specific transport
ansond 0:ae2a45502448 111 bool MBEDEndpoint::initializeTransport(int index,char *key,Transport *transport) {
ansond 0:ae2a45502448 112 bool success = false;
ansond 0:ae2a45502448 113 if (this->m_transports[index] == NULL) {
ansond 0:ae2a45502448 114 this->logger()->log("Initializing %s Transport...", key);
ansond 0:ae2a45502448 115 this->m_transports[index] = transport;
ansond 0:ae2a45502448 116 if (this->m_transports[index] != NULL) success = this->m_transports[index]->connect();
ansond 0:ae2a45502448 117 }
ansond 0:ae2a45502448 118 else {
ansond 0:ae2a45502448 119 this->logger()->log("%s already connected (OK)...", key);
ansond 0:ae2a45502448 120 success = true;
ansond 0:ae2a45502448 121 }
ansond 0:ae2a45502448 122 return success;
ansond 0:ae2a45502448 123 }
ansond 0:ae2a45502448 124
ansond 0:ae2a45502448 125 // initialize our transports
ansond 0:ae2a45502448 126 bool MBEDEndpoint::initializeTransports() {
ansond 0:ae2a45502448 127 bool success = true;
ansond 0:ae2a45502448 128
ansond 0:ae2a45502448 129 if (success == true) {
ansond 0:ae2a45502448 130 // MQTT Initialization
ansond 15:e44d75d95b38 131 success = this->initializeTransport(MQTT_TRANSPORT,"MQTT",new MQTTTransport(this->m_error_handler,this,this->getMap()));
ansond 0:ae2a45502448 132 }
ansond 0:ae2a45502448 133
ansond 0:ae2a45502448 134 if (success == true) {
ansond 0:ae2a45502448 135 // HTTP Initialization
ansond 7:f570eb3f38cd 136 success = this->initializeTransport(HTTP_TRANSPORT,"HTTP",new HTTPTransport(this->m_error_handler,this));
ansond 0:ae2a45502448 137 }
ansond 0:ae2a45502448 138 return success;
ansond 0:ae2a45502448 139 }
ansond 0:ae2a45502448 140
ansond 0:ae2a45502448 141 // initialize our Ethernet
ansond 0:ae2a45502448 142 bool MBEDEndpoint::initializeEthernet(EthernetInterface *ethernet) {
ansond 0:ae2a45502448 143 bool success = false;
ansond 0:ae2a45502448 144 this->m_ethernet = ethernet;
ansond 0:ae2a45502448 145 if (this->m_ethernet != NULL) {
ansond 0:ae2a45502448 146 this->logger()->log("Initializing Ethernet...");
ansond 0:ae2a45502448 147
ansond 0:ae2a45502448 148 // connect up ethernet
ansond 0:ae2a45502448 149 this->m_ethernet->init();
ansond 0:ae2a45502448 150 this->m_ethernet->connect();
ansond 0:ae2a45502448 151
ansond 0:ae2a45502448 152 // display our IP address
ansond 0:ae2a45502448 153 char *ipaddr = this->m_ethernet->getIPAddress();
ansond 0:ae2a45502448 154 if (ipaddr != NULL && strlen(ipaddr) > 0) {
ansond 0:ae2a45502448 155 this->logger()->log("IPAddress: %s",this->m_ethernet->getIPAddress());
ansond 0:ae2a45502448 156 success = true;
ansond 0:ae2a45502448 157 }
ansond 0:ae2a45502448 158 else {
ansond 0:ae2a45502448 159 this->logger()->log("Ethernet Not Connected...");
ansond 0:ae2a45502448 160 success = false;
ansond 0:ae2a45502448 161 }
ansond 0:ae2a45502448 162 }
ansond 0:ae2a45502448 163 else {
ansond 0:ae2a45502448 164 this->logger()->log("No Ethernet instance found");
ansond 0:ae2a45502448 165 success = false;
ansond 0:ae2a45502448 166 }
ansond 0:ae2a45502448 167 return success;
ansond 0:ae2a45502448 168 }
ansond 0:ae2a45502448 169
ansond 13:25448d92c205 170 // load up all endpoints into the IOC
ansond 13:25448d92c205 171 bool MBEDEndpoint::loadEndpoints() {
ansond 13:25448d92c205 172 bool success = true;
ansond 15:e44d75d95b38 173 this->logger()->log("Loading All Endpoints to IOC...");
ansond 13:25448d92c205 174 for(int i=0;i<NUM_LIGHTS && success;++i) success = this->loadEndpoint(this->m_lights[i]);
ansond 13:25448d92c205 175 return success;
ansond 13:25448d92c205 176 }
ansond 13:25448d92c205 177
ansond 0:ae2a45502448 178 // load up our endpoint to the IOC
ansond 15:e44d75d95b38 179 bool MBEDEndpoint::loadEndpoint(Light *light) {
ansond 11:59ee476fda24 180 bool success = false;
ansond 11:59ee476fda24 181 char result[IOC_RESULT_LEN+1];
ansond 11:59ee476fda24 182 char payload[IOC_PAYLOAD_LEN+1];
ansond 11:59ee476fda24 183
ansond 11:59ee476fda24 184 // initialize
ansond 17:84ab108ed670 185 memset(result,0,IOC_RESULT_LEN+1);
ansond 17:84ab108ed670 186 memset(payload,0,IOC_PAYLOAD_LEN+1);
ansond 15:e44d75d95b38 187
ansond 15:e44d75d95b38 188 // DEBUG
ansond 23:793b2898522e 189 //this->logger()->log("Loading Light: %s...",light->getName());
ansond 12:952dce085876 190
ansond 11:59ee476fda24 191 // build the payload
ansond 14:0a6497a380a4 192 char *data = this->buildIOCPayload(payload,IOC_PAYLOAD_LEN,light);
ansond 11:59ee476fda24 193
ansond 15:e44d75d95b38 194 // DEBUG
ansond 15:e44d75d95b38 195 this->logger()->log("Sending Light: %s to the IOC...",light->getName());
ansond 19:956b694f6542 196
ansond 11:59ee476fda24 197 // issue the request
ansond 12:952dce085876 198 success = this->m_transports[LOAD_TRANSPORT]->loadEndpoint((char *)payload,strlen(payload),(char *)result,IOC_RESULT_LEN);
ansond 11:59ee476fda24 199
ansond 15:e44d75d95b38 200 // DEBUG
ansond 23:793b2898522e 201 //if (success) this->logger()->log("Saving IOC ID for Light: %s...",light->getName());
ansond 15:e44d75d95b38 202
ansond 11:59ee476fda24 203 // update the IOC ID if found
ansond 24:7b3a5c927a53 204 if (success) this->saveIOCID(light,result);
ansond 11:59ee476fda24 205
ansond 15:e44d75d95b38 206 // DEBUG
ansond 24:7b3a5c927a53 207 if (success) this->logger()->log("Light: %s IOC ID=%d sent successfully",light->getName(),light->getIOCID());
ansond 24:7b3a5c927a53 208 else this->logger()->log("Light: %s send FAILED",light->getName());
ansond 19:956b694f6542 209
ansond 19:956b694f6542 210 // DEBUG
ansond 19:956b694f6542 211 if (!success) this->logger()->log("Loading Light: %s FAILED",light->getName());
ansond 15:e44d75d95b38 212
ansond 11:59ee476fda24 213 // return our status
ansond 11:59ee476fda24 214 return success;
ansond 11:59ee476fda24 215 }
ansond 0:ae2a45502448 216
ansond 13:25448d92c205 217 // update all endpoints to the IOC
ansond 13:25448d92c205 218 bool MBEDEndpoint::updateEndpoints() {
ansond 13:25448d92c205 219 bool success = true;
ansond 13:25448d92c205 220 for(int i=0;i<NUM_LIGHTS && success;++i) success = this->updateEndpoints(i);
ansond 13:25448d92c205 221 return success;
ansond 13:25448d92c205 222 }
ansond 13:25448d92c205 223
ansond 13:25448d92c205 224 // update all endpoints to the IOC
ansond 13:25448d92c205 225 bool MBEDEndpoint::updateEndpoints(int index) {
ansond 13:25448d92c205 226 if (index >= 0 && index < NUM_LIGHTS) return this->updateEndpoint(this->m_lights[index]);
ansond 13:25448d92c205 227 return false;
ansond 13:25448d92c205 228 }
ansond 13:25448d92c205 229
ansond 0:ae2a45502448 230 // update our endpoint with the IOC
ansond 13:25448d92c205 231 bool MBEDEndpoint::updateEndpoint(Light *light) {
ansond 11:59ee476fda24 232 bool success = false;
ansond 11:59ee476fda24 233 char result[IOC_RESULT_LEN+1];
ansond 11:59ee476fda24 234 char payload[IOC_PAYLOAD_LEN+1];
ansond 11:59ee476fda24 235
ansond 11:59ee476fda24 236 // initialize
ansond 17:84ab108ed670 237 memset(result,0,IOC_RESULT_LEN+1);
ansond 17:84ab108ed670 238 memset(payload,0,IOC_PAYLOAD_LEN+1);
ansond 12:952dce085876 239
ansond 11:59ee476fda24 240 // build the payload
ansond 14:0a6497a380a4 241 char *data = this->buildIOCPayload(payload,IOC_PAYLOAD_LEN,light);
ansond 11:59ee476fda24 242
ansond 11:59ee476fda24 243 // issue the request
ansond 24:7b3a5c927a53 244 success = this->m_transports[LOAD_TRANSPORT]->updateEndpoint(light->getIOCID(),(char *)payload,strlen(payload),(char *)result,IOC_RESULT_LEN);
ansond 23:793b2898522e 245
ansond 23:793b2898522e 246 // DEBUG
ansond 23:793b2898522e 247 if (success) this->logger()->log("Update of Endpoint to IOC successful");
ansond 23:793b2898522e 248 else this->logger()->log("Update of Endpoint to IOC FAILED");
ansond 11:59ee476fda24 249
ansond 11:59ee476fda24 250 // return our status
ansond 11:59ee476fda24 251 return success;
ansond 11:59ee476fda24 252 }
ansond 11:59ee476fda24 253
ansond 11:59ee476fda24 254 // build out the Payload
ansond 13:25448d92c205 255 char *MBEDEndpoint::buildIOCPayload(char *data,int data_length,Light *light) {
ansond 11:59ee476fda24 256 // construct the payload for Load/Updates
ansond 13:25448d92c205 257 ResourceFactory *factory = light->getResourceFactory();
ansond 21:d1ce325d1d32 258
ansond 19:956b694f6542 259 // accumulator string
ansond 19:956b694f6542 260 std::string str_json("{");
ansond 13:25448d92c205 261
ansond 13:25448d92c205 262 // loop through the resources and build a JSON representation for the payload
ansond 13:25448d92c205 263 for(int i=0;i<factory->numResources();++i) {
ansond 13:25448d92c205 264 // get the ith resource
ansond 13:25448d92c205 265 Resource *resource = factory->getResource(i);
ansond 13:25448d92c205 266
ansond 13:25448d92c205 267 // add to the JSON payload
ansond 17:84ab108ed670 268 char *name = this->getMap()->endpointNameToIOCName(resource->getName());
ansond 18:214698dbcdfa 269 char *value = resource->getValue();
ansond 17:84ab108ed670 270
ansond 21:d1ce325d1d32 271 // Handle LOCATION a special way
ansond 19:956b694f6542 272 if (strcmp(name,"LOCATION") != 0) {
ansond 21:d1ce325d1d32 273 str_json += "\"" + std::string(name) + "\":\"" + std::string(value) + "\",";
ansond 21:d1ce325d1d32 274 }
ansond 21:d1ce325d1d32 275 else {
ansond 22:f1002e5993c5 276 // IOC expects "Point(X,Y)" for LOCATION, but in reverse from MBED
ansond 23:793b2898522e 277 str_json += "\"" + std::string(name) + "\":\"Point(" + std::string(value) + ")\",";
ansond 21:d1ce325d1d32 278 }
ansond 24:7b3a5c927a53 279
ansond 24:7b3a5c927a53 280 // Handle /dev/addldata
ansond 25:8e960728d50a 281 char *dev_addldata = this->getMap()->endpointNameToIOCName("/dev/addldata");
ansond 25:8e960728d50a 282 if (dev_addldata != NULL && strcmp(name,dev_addldata) == 0 && light != NULL && light->getIOCID() > 0) {
ansond 25:8e960728d50a 283 char buf[10]; memset(buf,0,10); sprintf(buf,"%d",light->getIOCID());
ansond 25:8e960728d50a 284 str_json += "\"" + std::string(name) + "\":\"id:" + std::string(buf) + "\",";
ansond 24:7b3a5c927a53 285 }
ansond 13:25448d92c205 286 }
ansond 13:25448d92c205 287
ansond 17:84ab108ed670 288 // Special Case: STARTDATETIME
ansond 21:d1ce325d1d32 289 str_json += "\"STARTDATETIME\":\"2014-02-27T22:03:06.973Z\",";
ansond 17:84ab108ed670 290
ansond 17:84ab108ed670 291 // Special Case: ENDDATETIME
ansond 21:d1ce325d1d32 292 str_json += "\"ENDDATETIME\":\"2015-02-27T03:35:55.940Z\",";
ansond 21:d1ce325d1d32 293
ansond 21:d1ce325d1d32 294 // Special Case: NAME
ansond 21:d1ce325d1d32 295 str_json += "\"NAME\":\"" + std::string(light->getName()) + "\",";
ansond 19:956b694f6542 296
ansond 21:d1ce325d1d32 297 // Special Case: TIMEZONEOFFSET
ansond 21:d1ce325d1d32 298 str_json += "\"TIMEZONEOFFSET\":\"+2:00\"";
ansond 24:7b3a5c927a53 299
ansond 21:d1ce325d1d32 300 // close
ansond 21:d1ce325d1d32 301 str_json += "}";
ansond 21:d1ce325d1d32 302
ansond 13:25448d92c205 303 // copy over to the buffer
ansond 18:214698dbcdfa 304 strncpy(data,str_json.c_str(),this->min(str_json.length(),data_length));
ansond 15:e44d75d95b38 305
ansond 13:25448d92c205 306 // DEBUG
ansond 23:793b2898522e 307 //this->logger()->log("Loading Payload: %s",data);
ansond 11:59ee476fda24 308
ansond 11:59ee476fda24 309 // return the payload
ansond 12:952dce085876 310 return data;
ansond 11:59ee476fda24 311 }
ansond 11:59ee476fda24 312
ansond 11:59ee476fda24 313 // save the IOC ID
ansond 24:7b3a5c927a53 314 void MBEDEndpoint::saveIOCID(Light *light,char *json) {
ansond 22:f1002e5993c5 315 if (json != NULL) {
ansond 22:f1002e5993c5 316 std::string str_json(json);
ansond 22:f1002e5993c5 317
ansond 22:f1002e5993c5 318 // look for "id":
ansond 23:793b2898522e 319 std::string check("\"id\":");
ansond 23:793b2898522e 320 int pos1 = str_json.find(check);
ansond 23:793b2898522e 321 int pos2 = str_json.find(",",pos1);
ansond 23:793b2898522e 322 if (pos1 >= 0 && pos2 >= 0 && pos2 > pos1) {
ansond 23:793b2898522e 323 pos1 += check.length();
ansond 23:793b2898522e 324 int length = pos2 - pos1;
ansond 23:793b2898522e 325 std::string str_ioc_id = str_json.substr(pos1,length);
ansond 23:793b2898522e 326
ansond 23:793b2898522e 327 // DEBUG
ansond 23:793b2898522e 328 //this->logger()->log("IOC ID found: %s",str_ioc_id.c_str());
ansond 23:793b2898522e 329
ansond 23:793b2898522e 330 // parse into int
ansond 23:793b2898522e 331 int ioc_id = 0;
ansond 23:793b2898522e 332 sscanf(str_ioc_id.c_str(),"%d",&ioc_id);
ansond 23:793b2898522e 333
ansond 23:793b2898522e 334 // save the IOC ID
ansond 24:7b3a5c927a53 335 if (ioc_id > 0) light->setIOCID(ioc_id);
ansond 23:793b2898522e 336 }
ansond 23:793b2898522e 337 else {
ansond 23:793b2898522e 338 // cannot find the ID tag in the result JSON
ansond 23:793b2898522e 339 this->logger()->log("Cannot find the IOC ID in the JSON result");
ansond 23:793b2898522e 340 this->logger()->log("JSON: %s",json);
ansond 23:793b2898522e 341 }
ansond 22:f1002e5993c5 342 }
ansond 22:f1002e5993c5 343 }
ansond 22:f1002e5993c5 344
ansond 0:ae2a45502448 345 // close down the Lights
ansond 0:ae2a45502448 346 bool MBEDEndpoint::closeLights() {
ansond 0:ae2a45502448 347 bool success = true;
ansond 0:ae2a45502448 348 this->logger()->log("Closing down Lights...");
ansond 15:e44d75d95b38 349 for(int i=0;i<NUM_LIGHTS;++i)
ansond 15:e44d75d95b38 350 if (this->m_lights[i] != NULL) delete this->m_lights[i];
ansond 0:ae2a45502448 351 return success;
ansond 0:ae2a45502448 352 }
ansond 0:ae2a45502448 353
ansond 0:ae2a45502448 354 // close a given transport
ansond 0:ae2a45502448 355 bool MBEDEndpoint::closeTransport(int index,char *key) {
ansond 0:ae2a45502448 356 this->logger()->log("Closing down %s Transport...", key);
ansond 0:ae2a45502448 357 if (this->m_transports[index] != NULL) delete this->m_transports[index];
ansond 0:ae2a45502448 358 return true;
ansond 0:ae2a45502448 359 }
ansond 0:ae2a45502448 360
ansond 0:ae2a45502448 361 // close down our transports
ansond 0:ae2a45502448 362 bool MBEDEndpoint::closeTransports() {
ansond 0:ae2a45502448 363 bool success = true;
ansond 0:ae2a45502448 364
ansond 0:ae2a45502448 365 if (success) {
ansond 0:ae2a45502448 366 // close MQTT
ansond 0:ae2a45502448 367 success = this->closeTransport(MQTT_TRANSPORT,"MQTT");
ansond 0:ae2a45502448 368 }
ansond 0:ae2a45502448 369
ansond 0:ae2a45502448 370 if (success) {
ansond 0:ae2a45502448 371 // close HTTP
ansond 0:ae2a45502448 372 success = this->closeTransport(HTTP_TRANSPORT,"HTTP");
ansond 0:ae2a45502448 373 }
ansond 0:ae2a45502448 374
ansond 0:ae2a45502448 375 return success;
ansond 0:ae2a45502448 376 }
ansond 0:ae2a45502448 377
ansond 0:ae2a45502448 378 // close down our Ethernet
ansond 0:ae2a45502448 379 bool MBEDEndpoint::closeEthernet() {
ansond 0:ae2a45502448 380 this->logger()->log("Closing down Ethernet...");
ansond 0:ae2a45502448 381 if (this->m_ethernet != NULL) this->m_ethernet->disconnect();
ansond 0:ae2a45502448 382 return true;
ansond 0:ae2a45502448 383 }
ansond 0:ae2a45502448 384
ansond 13:25448d92c205 385 // min function
ansond 13:25448d92c205 386 int MBEDEndpoint::min(int value1,int value2) {
ansond 13:25448d92c205 387 if (value1 < value2) return value1;
ansond 13:25448d92c205 388 return value2;
ansond 13:25448d92c205 389 }
ansond 13:25448d92c205 390
ansond 0:ae2a45502448 391 // get our error handler
ansond 0:ae2a45502448 392 ErrorHandler *MBEDEndpoint::logger() { return this->m_error_handler; }
ansond 0:ae2a45502448 393
ansond 0:ae2a45502448 394 // main running loop
ansond 0:ae2a45502448 395 void MBEDEndpoint::run() {
ansond 0:ae2a45502448 396 this->logger()->log("Endpoint Main Loop");
ansond 0:ae2a45502448 397 while(true) {
ansond 0:ae2a45502448 398 // sleep a bit
ansond 0:ae2a45502448 399 //this->logger()->log("Sleeping for a bit...");
ansond 0:ae2a45502448 400 wait_ms(MAIN_LOOP_SLEEP);
ansond 0:ae2a45502448 401
ansond 0:ae2a45502448 402 // check for events
ansond 0:ae2a45502448 403 //this->logger()->log("Processing Events...");
ansond 0:ae2a45502448 404 for(int i=0;i<NUM_TRANSPORTS;++i) this->m_transports[i]->checkAndProcess();
ansond 0:ae2a45502448 405
ansond 0:ae2a45502448 406 // check for exit
ansond 0:ae2a45502448 407 //this->logger()->log("Checking for exit...");
ansond 0:ae2a45502448 408 this->logger()->checkForExit();
ansond 0:ae2a45502448 409 }
ansond 0:ae2a45502448 410 }
ansond 0:ae2a45502448 411