MBED_DEMOS / Mbed 2 deprecated mbed_mqtt_endpoint_ublox_ethernet

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

Committer:
ansond
Date:
Fri Mar 21 03:19:38 2014 +0000
Revision:
158:dbade2c795c7
Parent:
156:4d75f2dffd8c
Child:
163:392f89530162
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 140:37588866ce18 42 this->m_preferences = NULL;
ansond 140:37588866ce18 43 memset(this->m_lcd_status,0,TEMP_BUFFER_LEN+1);
ansond 141:0a09f2d03528 44 memset(this->m_gw_address,0,PREFERENCE_VALUE_LEN+1);
ansond 0:ae2a45502448 45 for(int i=0;i<NUM_TRANSPORTS;++i) this->m_transports[i] = NULL;
ansond 0:ae2a45502448 46 this->m_error_handler = error_handler;
ansond 158:dbade2c795c7 47 this->m_error_handler->setEndpoint((void *)this);
ansond 138:6159f1940b1d 48 if (success) this->initPreferences();
ansond 32:a7b3c285446c 49 if (success) this->initEndpointName();
ansond 0:ae2a45502448 50 if (success) this->logger()->turnLEDBlue();
ansond 79:67accc95965a 51 #ifdef MAC_ADDRESS
ansond 94:0159f907859b 52 extern char fmt_mac[RESOURCE_VALUE_LEN+1];
ansond 94:0159f907859b 53 if (success)this->logger()->log("%s (MAC: %s)",ENDPOINT_VERSION_ANNOUNCE,fmt_mac);
ansond 79:67accc95965a 54 #else
ansond 30:5c670ec5d203 55 if (success)this->logger()->log(ENDPOINT_VERSION_ANNOUNCE);
ansond 79:67accc95965a 56 #endif
ansond 139:1eef48a644a0 57 if (success) this->initGWAddress();
ansond 140:37588866ce18 58 if (success) this->logger()->log("IOC GW IP: %s",GW_IPADDRESS);
ansond 115:7c8b958dfaa7 59 if (PL_ENABLE && success) this->logger()->log("Philips Light ID: %d Philips Gateway IP: %s",PL_LIGHT_ID,PL_GW_ADDRESS);
ansond 0:ae2a45502448 60 if (success) success = this->initializeEthernet(ethernet);
ansond 0:ae2a45502448 61 if (success) this->logger()->turnLEDYellow();
ansond 33:8302b02413bd 62 if (success)this->m_map = new MBEDToIOCResourceMap(error_handler);
ansond 30:5c670ec5d203 63 if (success) success = this->initializeTransports();
ansond 33:8302b02413bd 64 if (success) success = this->initializeLights();
ansond 139:1eef48a644a0 65 if (success) this->logger()->turnLEDOrange();
ansond 139:1eef48a644a0 66 this->logger()->lcdStatusOnly(true);
ansond 7:f570eb3f38cd 67 if (!success) closedown(2);
ansond 0:ae2a45502448 68 }
ansond 0:ae2a45502448 69
ansond 0:ae2a45502448 70 // default destructor
ansond 0:ae2a45502448 71 MBEDEndpoint::~MBEDEndpoint() {
ansond 0:ae2a45502448 72 bool success = true;
ansond 0:ae2a45502448 73 if (success) this->logger()->turnLEDYellow();
ansond 0:ae2a45502448 74 if (success) success = this->closeLights();
ansond 0:ae2a45502448 75 if (success) success = this->closeTransports();
ansond 0:ae2a45502448 76 if (success) success = this->closeEthernet();
ansond 0:ae2a45502448 77 if (success) this->logger()->turnLEDBlue();
ansond 15:e44d75d95b38 78 if (this->m_map != NULL) delete this->m_map;
ansond 0:ae2a45502448 79 }
ansond 24:7b3a5c927a53 80
ansond 15:e44d75d95b38 81 // get the IOC <--> MBED resource map
ansond 15:e44d75d95b38 82 MBEDToIOCResourceMap *MBEDEndpoint::getMap() { return this->m_map; }
ansond 15:e44d75d95b38 83
ansond 138:6159f1940b1d 84 // initialize our preferences
ansond 151:75b96c3419ae 85 void MBEDEndpoint::initPreferences() { if (this->m_preferences == NULL) this->m_preferences = new Preferences(this->logger()); if (this->m_preferences != NULL) this->m_preferences->fixCoordsForIOC(); }
ansond 139:1eef48a644a0 86
ansond 139:1eef48a644a0 87 // get our preferences
ansond 139:1eef48a644a0 88 Preferences *MBEDEndpoint::preferences() { return this->m_preferences; }
ansond 139:1eef48a644a0 89
ansond 139:1eef48a644a0 90 // initialize the GW address from the configuration
ansond 139:1eef48a644a0 91 void MBEDEndpoint::initGWAddress() {
ansond 139:1eef48a644a0 92 memset(this->m_gw_address,0,PREFERENCE_VALUE_LEN+1);
ansond 139:1eef48a644a0 93 this->preferences()->getPreference("gw_address",this->m_gw_address,PREFERENCE_VALUE_LEN,GW_IPADDRESS);
ansond 139:1eef48a644a0 94 this->logger()->log("GW IP: %s",this->getGWAddress());
ansond 138:6159f1940b1d 95 }
ansond 138:6159f1940b1d 96
ansond 139:1eef48a644a0 97 // get our GW address
ansond 156:4d75f2dffd8c 98 char *MBEDEndpoint::getGWAddress() { return this->m_gw_address; }
ansond 139:1eef48a644a0 99
ansond 139:1eef48a644a0 100 // get our LCD status
ansond 139:1eef48a644a0 101 char *MBEDEndpoint::getLCDStatus() {
ansond 139:1eef48a644a0 102 memset(this->m_lcd_status,0,TEMP_BUFFER_LEN+1);
ansond 139:1eef48a644a0 103
ansond 139:1eef48a644a0 104 // look at Light#0 to determine the IOC linkage ID...
ansond 139:1eef48a644a0 105 char *ioc = this->m_lights[0]->getResourceFactory()->getResourceValue(IOC_LINKAGE_RESOURCE);
ansond 139:1eef48a644a0 106
ansond 139:1eef48a644a0 107 // color our LED depending on whether we have IOC linkage or not...
ansond 139:1eef48a644a0 108 if (ioc == NULL || strcmp(ioc,IOC_LINKAGE_UNSET) == 0) this->logger()->turnLEDOrange();
ansond 139:1eef48a644a0 109 else this->logger()->turnLEDGreen();
ansond 139:1eef48a644a0 110
ansond 139:1eef48a644a0 111 sprintf(this->m_lcd_status,"Node: %s\nGW IP: %s\nIOC Link: %s",this->getEndpointName(),this->getGWAddress(),ioc);
ansond 139:1eef48a644a0 112 return this->m_lcd_status;
ansond 139:1eef48a644a0 113 }
ansond 138:6159f1940b1d 114
ansond 0:ae2a45502448 115 // initialize the Lights
ansond 0:ae2a45502448 116 bool MBEDEndpoint::initializeLights() {
ansond 140:37588866ce18 117 int index = this->preferences()->getIntPreference("endpoint_id",LIGHT_NAME_INDEX);
ansond 0:ae2a45502448 118 this->logger()->log("Initializing Lights...");
ansond 0:ae2a45502448 119 for(int i=0;i<NUM_LIGHTS;++i) {
ansond 140:37588866ce18 120 this->m_lights[i] = new MBEDLight(this->logger(),this->m_transports,i+index,this);
ansond 0:ae2a45502448 121 this->m_lights[i]->setDimmerAction(new EmulatedLightDimmerAction(this->logger(),this->m_lights[i]));
ansond 0:ae2a45502448 122 this->m_lights[i]->setSwitchAction(new EmulatedLightSwitchAction(this->logger(),this->m_lights[i]));
ansond 0:ae2a45502448 123 }
ansond 0:ae2a45502448 124 return true;
ansond 0:ae2a45502448 125 }
ansond 0:ae2a45502448 126
ansond 0:ae2a45502448 127 // does the input name match any of our light resources?
ansond 0:ae2a45502448 128 int MBEDEndpoint::indexOfLight(char *name) {
ansond 0:ae2a45502448 129 bool found = false;
ansond 0:ae2a45502448 130 int index = -1;
ansond 0:ae2a45502448 131
ansond 0:ae2a45502448 132 for(int i=0;i<NUM_LIGHTS && !found;++i) {
ansond 0:ae2a45502448 133 if (strcmp(this->m_lights[i]->getName(),name) == 0) {
ansond 0:ae2a45502448 134 found = true;
ansond 0:ae2a45502448 135 index = i;
ansond 0:ae2a45502448 136 }
ansond 0:ae2a45502448 137 }
ansond 0:ae2a45502448 138
ansond 0:ae2a45502448 139 return index;
ansond 0:ae2a45502448 140 }
ansond 0:ae2a45502448 141
ansond 0:ae2a45502448 142 // get a specific resources
ansond 0:ae2a45502448 143 ResourceFactory *MBEDEndpoint::getResources(int index) {
ansond 0:ae2a45502448 144 if (index >= 0 && index < NUM_LIGHTS) return this->m_lights[index]->resources();
ansond 0:ae2a45502448 145 return NULL;
ansond 0:ae2a45502448 146 }
ansond 0:ae2a45502448 147
ansond 0:ae2a45502448 148 // initialize our ResourceFactory
ansond 39:bd5b2bcd2dcc 149 ResourceFactory *MBEDEndpoint::initResourceFactory() { return new EmulatedResourceFactory(this->logger(),(void *)this); }
ansond 2:90a84a216c58 150
ansond 32:a7b3c285446c 151 // Initialize the Endpoint Name - will be the first Light resource name (and there must be one...)
ansond 32:a7b3c285446c 152 void MBEDEndpoint::initEndpointName() {
ansond 143:fbdd4f74e1e9 153 int index = this->preferences()->getIntPreference("endpoint_id",LIGHT_NAME_INDEX);
ansond 32:a7b3c285446c 154 memset(this->m_endpoint_name,0,LIGHT_NAME_LEN+1);
ansond 143:fbdd4f74e1e9 155 sprintf(this->m_endpoint_name,LIGHT_NAME,index);
ansond 32:a7b3c285446c 156 }
ansond 32:a7b3c285446c 157
ansond 32:a7b3c285446c 158 // get our endpoint name
ansond 32:a7b3c285446c 159 char *MBEDEndpoint::getEndpointName() { return this->m_endpoint_name; }
ansond 0:ae2a45502448 160
ansond 0:ae2a45502448 161 // initialize a specific transport
ansond 0:ae2a45502448 162 bool MBEDEndpoint::initializeTransport(int index,char *key,Transport *transport) {
ansond 0:ae2a45502448 163 bool success = false;
ansond 0:ae2a45502448 164 if (this->m_transports[index] == NULL) {
ansond 0:ae2a45502448 165 this->logger()->log("Initializing %s Transport...", key);
ansond 0:ae2a45502448 166 this->m_transports[index] = transport;
ansond 0:ae2a45502448 167 if (this->m_transports[index] != NULL) success = this->m_transports[index]->connect();
ansond 148:b09187a0fa77 168 if (success) this->logger()->log("Transport %s initialized and connected",key);
ansond 0:ae2a45502448 169 }
ansond 0:ae2a45502448 170 else {
ansond 0:ae2a45502448 171 this->logger()->log("%s already connected (OK)...", key);
ansond 0:ae2a45502448 172 success = true;
ansond 0:ae2a45502448 173 }
ansond 0:ae2a45502448 174 return success;
ansond 0:ae2a45502448 175 }
ansond 0:ae2a45502448 176
ansond 0:ae2a45502448 177 // initialize our transports
ansond 0:ae2a45502448 178 bool MBEDEndpoint::initializeTransports() {
ansond 0:ae2a45502448 179 bool success = true;
ansond 0:ae2a45502448 180
ansond 0:ae2a45502448 181 if (success == true) {
ansond 0:ae2a45502448 182 // MQTT Initialization
ansond 15:e44d75d95b38 183 success = this->initializeTransport(MQTT_TRANSPORT,"MQTT",new MQTTTransport(this->m_error_handler,this,this->getMap()));
ansond 0:ae2a45502448 184 }
ansond 0:ae2a45502448 185
ansond 0:ae2a45502448 186 if (success == true) {
ansond 0:ae2a45502448 187 // HTTP Initialization
ansond 36:210f3956038c 188 success = this->initializeTransport(HTTP_TRANSPORT,"HTTP",new IOCHTTPTransport(this->m_error_handler,this));
ansond 0:ae2a45502448 189 }
ansond 0:ae2a45502448 190 return success;
ansond 0:ae2a45502448 191 }
ansond 0:ae2a45502448 192
ansond 0:ae2a45502448 193 // initialize our Ethernet
ansond 0:ae2a45502448 194 bool MBEDEndpoint::initializeEthernet(EthernetInterface *ethernet) {
ansond 0:ae2a45502448 195 bool success = false;
ansond 0:ae2a45502448 196 this->m_ethernet = ethernet;
ansond 0:ae2a45502448 197 if (this->m_ethernet != NULL) {
ansond 0:ae2a45502448 198 this->logger()->log("Initializing Ethernet...");
ansond 0:ae2a45502448 199
ansond 0:ae2a45502448 200 // connect up ethernet
ansond 0:ae2a45502448 201 this->m_ethernet->init();
ansond 0:ae2a45502448 202 this->m_ethernet->connect();
ansond 0:ae2a45502448 203
ansond 0:ae2a45502448 204 // display our IP address
ansond 0:ae2a45502448 205 char *ipaddr = this->m_ethernet->getIPAddress();
ansond 0:ae2a45502448 206 if (ipaddr != NULL && strlen(ipaddr) > 0) {
ansond 0:ae2a45502448 207 this->logger()->log("IPAddress: %s",this->m_ethernet->getIPAddress());
ansond 0:ae2a45502448 208 success = true;
ansond 0:ae2a45502448 209 }
ansond 0:ae2a45502448 210 else {
ansond 0:ae2a45502448 211 this->logger()->log("Ethernet Not Connected...");
ansond 0:ae2a45502448 212 success = false;
ansond 0:ae2a45502448 213 }
ansond 0:ae2a45502448 214 }
ansond 0:ae2a45502448 215 else {
ansond 0:ae2a45502448 216 this->logger()->log("No Ethernet instance found");
ansond 0:ae2a45502448 217 success = false;
ansond 0:ae2a45502448 218 }
ansond 0:ae2a45502448 219 return success;
ansond 0:ae2a45502448 220 }
ansond 0:ae2a45502448 221
ansond 13:25448d92c205 222 // load up all endpoints into the IOC
ansond 13:25448d92c205 223 bool MBEDEndpoint::loadEndpoints() {
ansond 13:25448d92c205 224 bool success = true;
ansond 15:e44d75d95b38 225 this->logger()->log("Loading All Endpoints to IOC...");
ansond 13:25448d92c205 226 for(int i=0;i<NUM_LIGHTS && success;++i) success = this->loadEndpoint(this->m_lights[i]);
ansond 13:25448d92c205 227 return success;
ansond 13:25448d92c205 228 }
ansond 13:25448d92c205 229
ansond 0:ae2a45502448 230 // load up our endpoint to the IOC
ansond 15:e44d75d95b38 231 bool MBEDEndpoint::loadEndpoint(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 15:e44d75d95b38 239
ansond 15:e44d75d95b38 240 // DEBUG
ansond 48:d3663434128d 241 this->logger()->log("Building Payload for Light: %s...",light->getName());
ansond 12:952dce085876 242
ansond 11:59ee476fda24 243 // build the payload
ansond 14:0a6497a380a4 244 char *data = this->buildIOCPayload(payload,IOC_PAYLOAD_LEN,light);
ansond 19:956b694f6542 245
ansond 11:59ee476fda24 246 // issue the request
ansond 48:d3663434128d 247 if (data != NULL && strlen(data) > 0) {
ansond 48:d3663434128d 248 // DEBUG
ansond 48:d3663434128d 249 this->logger()->log("Sending Light: %s to the IOC...",light->getName());
ansond 48:d3663434128d 250
ansond 48:d3663434128d 251 // load
ansond 48:d3663434128d 252 success = this->m_transports[LOAD_TRANSPORT]->loadEndpoint((char *)payload,strlen(payload),(char *)result,IOC_RESULT_LEN);
ansond 48:d3663434128d 253 }
ansond 11:59ee476fda24 254
ansond 15:e44d75d95b38 255 // DEBUG
ansond 23:793b2898522e 256 //if (success) this->logger()->log("Saving IOC ID for Light: %s...",light->getName());
ansond 15:e44d75d95b38 257
ansond 11:59ee476fda24 258 // update the IOC ID if found
ansond 24:7b3a5c927a53 259 if (success) this->saveIOCID(light,result);
ansond 11:59ee476fda24 260
ansond 15:e44d75d95b38 261 // DEBUG
ansond 24:7b3a5c927a53 262 if (success) this->logger()->log("Light: %s IOC ID=%d sent successfully",light->getName(),light->getIOCID());
ansond 19:956b694f6542 263
ansond 19:956b694f6542 264 // DEBUG
ansond 48:d3663434128d 265 if (!success) {
ansond 48:d3663434128d 266 if (light != NULL) this->logger()->log("Light: %s send FAILED",light->getName());
ansond 48:d3663434128d 267 else this->logger()->log("Light: send FAILED (NULL LIGHT)");
ansond 48:d3663434128d 268 }
ansond 15:e44d75d95b38 269
ansond 11:59ee476fda24 270 // return our status
ansond 11:59ee476fda24 271 return success;
ansond 11:59ee476fda24 272 }
ansond 0:ae2a45502448 273
ansond 13:25448d92c205 274 // update all endpoints to the IOC
ansond 13:25448d92c205 275 bool MBEDEndpoint::updateEndpoints() {
ansond 13:25448d92c205 276 bool success = true;
ansond 13:25448d92c205 277 for(int i=0;i<NUM_LIGHTS && success;++i) success = this->updateEndpoints(i);
ansond 13:25448d92c205 278 return success;
ansond 13:25448d92c205 279 }
ansond 13:25448d92c205 280
ansond 13:25448d92c205 281 // update all endpoints to the IOC
ansond 13:25448d92c205 282 bool MBEDEndpoint::updateEndpoints(int index) {
ansond 13:25448d92c205 283 if (index >= 0 && index < NUM_LIGHTS) return this->updateEndpoint(this->m_lights[index]);
ansond 13:25448d92c205 284 return false;
ansond 13:25448d92c205 285 }
ansond 13:25448d92c205 286
ansond 0:ae2a45502448 287 // update our endpoint with the IOC
ansond 13:25448d92c205 288 bool MBEDEndpoint::updateEndpoint(Light *light) {
ansond 11:59ee476fda24 289 bool success = false;
ansond 11:59ee476fda24 290 char result[IOC_RESULT_LEN+1];
ansond 11:59ee476fda24 291 char payload[IOC_PAYLOAD_LEN+1];
ansond 11:59ee476fda24 292
ansond 11:59ee476fda24 293 // initialize
ansond 17:84ab108ed670 294 memset(result,0,IOC_RESULT_LEN+1);
ansond 17:84ab108ed670 295 memset(payload,0,IOC_PAYLOAD_LEN+1);
ansond 12:952dce085876 296
ansond 11:59ee476fda24 297 // build the payload
ansond 14:0a6497a380a4 298 char *data = this->buildIOCPayload(payload,IOC_PAYLOAD_LEN,light);
ansond 11:59ee476fda24 299
ansond 48:d3663434128d 300 // issue the request
ansond 48:d3663434128d 301 if (data != NULL && strlen(data) > 0) {
ansond 48:d3663434128d 302 // DEBUG
ansond 48:d3663434128d 303 this->logger()->log("Updating Light: %s at the IOC...",light->getName());
ansond 48:d3663434128d 304
ansond 48:d3663434128d 305 // update
ansond 48:d3663434128d 306 success = this->m_transports[LOAD_TRANSPORT]->updateEndpoint(light->getIOCID(),(char *)payload,strlen(payload),(char *)result,IOC_RESULT_LEN);
ansond 48:d3663434128d 307 }
ansond 23:793b2898522e 308
ansond 23:793b2898522e 309 // DEBUG
ansond 23:793b2898522e 310 if (success) this->logger()->log("Update of Endpoint to IOC successful");
ansond 23:793b2898522e 311 else this->logger()->log("Update of Endpoint to IOC FAILED");
ansond 11:59ee476fda24 312
ansond 11:59ee476fda24 313 // return our status
ansond 11:59ee476fda24 314 return success;
ansond 11:59ee476fda24 315 }
ansond 11:59ee476fda24 316
ansond 11:59ee476fda24 317 // build out the Payload
ansond 13:25448d92c205 318 char *MBEDEndpoint::buildIOCPayload(char *data,int data_length,Light *light) {
ansond 48:d3663434128d 319 char tmp[TEMP_BUFFER_LEN+1];
ansond 48:d3663434128d 320
ansond 11:59ee476fda24 321 // construct the payload for Load/Updates
ansond 13:25448d92c205 322 ResourceFactory *factory = light->getResourceFactory();
ansond 48:d3663434128d 323
ansond 48:d3663434128d 324 // start the buffer
ansond 48:d3663434128d 325 strcat(data,"{");
ansond 13:25448d92c205 326
ansond 13:25448d92c205 327 // loop through the resources and build a JSON representation for the payload
ansond 13:25448d92c205 328 for(int i=0;i<factory->numResources();++i) {
ansond 13:25448d92c205 329 // get the ith resource
ansond 13:25448d92c205 330 Resource *resource = factory->getResource(i);
ansond 48:d3663434128d 331 if (resource != NULL) {
ansond 48:d3663434128d 332 // add to the JSON payload
ansond 48:d3663434128d 333 char *name = this->getMap()->endpointNameToIOCName(resource->getName());
ansond 48:d3663434128d 334 char *value = resource->getValue();
ansond 48:d3663434128d 335
ansond 86:2f9b9e0c7639 336 // make sure that we have a positive IOC resource match for the NSP resource
ansond 86:2f9b9e0c7639 337 if (name != NULL && strlen(name) > 0) {
ansond 86:2f9b9e0c7639 338 // Handle LOCATION a special way
ansond 86:2f9b9e0c7639 339 if (strcmp(name,"LOCATION") != 0) {
ansond 86:2f9b9e0c7639 340 // standard name,value for IOC
ansond 86:2f9b9e0c7639 341 sprintf(tmp, "\"%s\":\"%s\",",name,value);
ansond 86:2f9b9e0c7639 342 }
ansond 86:2f9b9e0c7639 343 else {
ansond 86:2f9b9e0c7639 344 // IOC expects "Point(X,Y)" for LOCATION
ansond 86:2f9b9e0c7639 345 sprintf(tmp, "\"%s\":\"Point(%s)\",",name,value);
ansond 86:2f9b9e0c7639 346 }
ansond 48:d3663434128d 347 strcat(data,tmp);
ansond 86:2f9b9e0c7639 348
ansond 86:2f9b9e0c7639 349 // Handle /dev/addldata
ansond 86:2f9b9e0c7639 350 char *dev_addldata = this->getMap()->endpointNameToIOCName("/dev/addldata");
ansond 86:2f9b9e0c7639 351 if (dev_addldata != NULL && strcmp(name,dev_addldata) == 0 && light != NULL && light->getIOCID() > 0) {
ansond 86:2f9b9e0c7639 352 char buf[IOC_IOC_ID_LEN+1]; memset(buf,0,IOC_IOC_ID_LEN+1); sprintf(buf,"%d",light->getIOCID());
ansond 86:2f9b9e0c7639 353 sprintf(tmp,"\"%s\":\"id:%s\",",name,buf);
ansond 86:2f9b9e0c7639 354 strcat(data,tmp);
ansond 86:2f9b9e0c7639 355 }
ansond 48:d3663434128d 356 }
ansond 24:7b3a5c927a53 357 }
ansond 13:25448d92c205 358 }
ansond 13:25448d92c205 359
ansond 17:84ab108ed670 360 // Special Case: STARTDATETIME
ansond 85:9fdd9198001c 361 strcat(data,ENDPOINT_STARTTIME);
ansond 17:84ab108ed670 362
ansond 17:84ab108ed670 363 // Special Case: ENDDATETIME
ansond 85:9fdd9198001c 364 strcat(data,ENDPOINT_STOPTIME);
ansond 48:d3663434128d 365
ansond 21:d1ce325d1d32 366 // Special Case: NAME
ansond 48:d3663434128d 367 sprintf(tmp,"\"NAME\":\"%s\",",light->getName());
ansond 48:d3663434128d 368 strcat(data,tmp);
ansond 48:d3663434128d 369
ansond 21:d1ce325d1d32 370 // Special Case: TIMEZONEOFFSET
ansond 85:9fdd9198001c 371 strcat(data,ENDPOINT_TIMEZONE);
ansond 24:7b3a5c927a53 372
ansond 21:d1ce325d1d32 373 // close
ansond 48:d3663434128d 374 strcat(data,"}");
ansond 48:d3663434128d 375
ansond 13:25448d92c205 376 // DEBUG
ansond 23:793b2898522e 377 //this->logger()->log("Loading Payload: %s",data);
ansond 11:59ee476fda24 378
ansond 11:59ee476fda24 379 // return the payload
ansond 12:952dce085876 380 return data;
ansond 11:59ee476fda24 381 }
ansond 11:59ee476fda24 382
ansond 11:59ee476fda24 383 // save the IOC ID
ansond 24:7b3a5c927a53 384 void MBEDEndpoint::saveIOCID(Light *light,char *json) {
ansond 48:d3663434128d 385 if (json != NULL) {
ansond 48:d3663434128d 386 //this->logger()->log("RESULT: %s",json);
ansond 48:d3663434128d 387
ansond 22:f1002e5993c5 388 // look for "id":
ansond 48:d3663434128d 389 char *check = "\"id\":";
ansond 48:d3663434128d 390 char *pos1 = strstr(json,check);
ansond 48:d3663434128d 391 if (pos1 != NULL) {
ansond 48:d3663434128d 392 char *pos2 = strstr(pos1,",");
ansond 48:d3663434128d 393 if (pos1 != NULL && pos2 != NULL && pos2 > pos1) {
ansond 48:d3663434128d 394 pos1 += strlen(check);
ansond 48:d3663434128d 395 int length = pos2 - pos1;
ansond 48:d3663434128d 396 char str_ioc_id[IOC_IOC_ID_LEN+1];
ansond 48:d3663434128d 397 memset(str_ioc_id,0,IOC_IOC_ID_LEN+1);
ansond 48:d3663434128d 398 strncpy(str_ioc_id,pos1,length);
ansond 48:d3663434128d 399
ansond 48:d3663434128d 400 // DEBUG
ansond 48:d3663434128d 401 //this->logger()->log("IOC ID found: %s",str_ioc_id);
ansond 48:d3663434128d 402
ansond 48:d3663434128d 403 // parse into int
ansond 48:d3663434128d 404 int ioc_id = 0;
ansond 48:d3663434128d 405 sscanf(str_ioc_id,"%d",&ioc_id);
ansond 48:d3663434128d 406
ansond 48:d3663434128d 407 // save the IOC ID
ansond 48:d3663434128d 408 if (ioc_id > 0) light->setIOCID(ioc_id);
ansond 48:d3663434128d 409 }
ansond 48:d3663434128d 410 else {
ansond 48:d3663434128d 411 // cannot find the ID tag in the result JSON
ansond 48:d3663434128d 412 this->logger()->log("Cannot find the IOC ID in the JSON result");
ansond 48:d3663434128d 413 this->logger()->log("JSON: %s",json);
ansond 48:d3663434128d 414 }
ansond 23:793b2898522e 415 }
ansond 23:793b2898522e 416 else {
ansond 23:793b2898522e 417 // cannot find the ID tag in the result JSON
ansond 23:793b2898522e 418 this->logger()->log("Cannot find the IOC ID in the JSON result");
ansond 23:793b2898522e 419 this->logger()->log("JSON: %s",json);
ansond 48:d3663434128d 420 }
ansond 22:f1002e5993c5 421 }
ansond 22:f1002e5993c5 422 }
ansond 22:f1002e5993c5 423
ansond 0:ae2a45502448 424 // close down the Lights
ansond 0:ae2a45502448 425 bool MBEDEndpoint::closeLights() {
ansond 0:ae2a45502448 426 bool success = true;
ansond 0:ae2a45502448 427 this->logger()->log("Closing down Lights...");
ansond 15:e44d75d95b38 428 for(int i=0;i<NUM_LIGHTS;++i)
ansond 15:e44d75d95b38 429 if (this->m_lights[i] != NULL) delete this->m_lights[i];
ansond 0:ae2a45502448 430 return success;
ansond 0:ae2a45502448 431 }
ansond 0:ae2a45502448 432
ansond 0:ae2a45502448 433 // close a given transport
ansond 0:ae2a45502448 434 bool MBEDEndpoint::closeTransport(int index,char *key) {
ansond 0:ae2a45502448 435 this->logger()->log("Closing down %s Transport...", key);
ansond 0:ae2a45502448 436 if (this->m_transports[index] != NULL) delete this->m_transports[index];
ansond 0:ae2a45502448 437 return true;
ansond 0:ae2a45502448 438 }
ansond 0:ae2a45502448 439
ansond 0:ae2a45502448 440 // close down our transports
ansond 0:ae2a45502448 441 bool MBEDEndpoint::closeTransports() {
ansond 0:ae2a45502448 442 bool success = true;
ansond 0:ae2a45502448 443
ansond 0:ae2a45502448 444 if (success) {
ansond 0:ae2a45502448 445 // close MQTT
ansond 0:ae2a45502448 446 success = this->closeTransport(MQTT_TRANSPORT,"MQTT");
ansond 0:ae2a45502448 447 }
ansond 0:ae2a45502448 448
ansond 0:ae2a45502448 449 if (success) {
ansond 0:ae2a45502448 450 // close HTTP
ansond 0:ae2a45502448 451 success = this->closeTransport(HTTP_TRANSPORT,"HTTP");
ansond 0:ae2a45502448 452 }
ansond 0:ae2a45502448 453
ansond 0:ae2a45502448 454 return success;
ansond 0:ae2a45502448 455 }
ansond 0:ae2a45502448 456
ansond 0:ae2a45502448 457 // close down our Ethernet
ansond 0:ae2a45502448 458 bool MBEDEndpoint::closeEthernet() {
ansond 0:ae2a45502448 459 this->logger()->log("Closing down Ethernet...");
ansond 0:ae2a45502448 460 if (this->m_ethernet != NULL) this->m_ethernet->disconnect();
ansond 0:ae2a45502448 461 return true;
ansond 0:ae2a45502448 462 }
ansond 0:ae2a45502448 463
ansond 13:25448d92c205 464 // min function
ansond 13:25448d92c205 465 int MBEDEndpoint::min(int value1,int value2) {
ansond 13:25448d92c205 466 if (value1 < value2) return value1;
ansond 13:25448d92c205 467 return value2;
ansond 13:25448d92c205 468 }
ansond 13:25448d92c205 469
ansond 0:ae2a45502448 470 // get our error handler
ansond 0:ae2a45502448 471 ErrorHandler *MBEDEndpoint::logger() { return this->m_error_handler; }
ansond 0:ae2a45502448 472
ansond 0:ae2a45502448 473 // main running loop
ansond 0:ae2a45502448 474 void MBEDEndpoint::run() {
ansond 0:ae2a45502448 475 this->logger()->log("Endpoint Main Loop");
ansond 0:ae2a45502448 476 while(true) {
ansond 0:ae2a45502448 477 // sleep a bit
ansond 0:ae2a45502448 478 //this->logger()->log("Sleeping for a bit...");
ansond 0:ae2a45502448 479 wait_ms(MAIN_LOOP_SLEEP);
ansond 0:ae2a45502448 480
ansond 0:ae2a45502448 481 // check for events
ansond 0:ae2a45502448 482 //this->logger()->log("Processing Events...");
ansond 0:ae2a45502448 483 for(int i=0;i<NUM_TRANSPORTS;++i) this->m_transports[i]->checkAndProcess();
ansond 0:ae2a45502448 484
ansond 0:ae2a45502448 485 // check for exit
ansond 0:ae2a45502448 486 //this->logger()->log("Checking for exit...");
ansond 0:ae2a45502448 487 this->logger()->checkForExit();
ansond 0:ae2a45502448 488 }
ansond 0:ae2a45502448 489 }
ansond 0:ae2a45502448 490