mqtt specific components for the impact mbed endpoint library

Dependents:   mbed_mqtt_endpoint_ublox_ethernet mbed_mqtt_endpoint_ublox_cellular mbed_mqtt_endpoint_nxp

Committer:
ansond
Date:
Wed Apr 02 18:36:47 2014 +0000
Revision:
26:b9d74e06b3de
Parent:
25:5269e8881494
Child:
27:bb4253d9f1d0
updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ansond 0:a3fc1c6ef150 1 /* Copyright C2013 Doug Anson, MIT License
ansond 0:a3fc1c6ef150 2 *
ansond 0:a3fc1c6ef150 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
ansond 0:a3fc1c6ef150 4 * and associated documentation files the "Software", to deal in the Software without restriction,
ansond 0:a3fc1c6ef150 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
ansond 0:a3fc1c6ef150 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
ansond 0:a3fc1c6ef150 7 * furnished to do so, subject to the following conditions:
ansond 0:a3fc1c6ef150 8 *
ansond 0:a3fc1c6ef150 9 * The above copyright notice and this permission notice shall be included in all copies or
ansond 0:a3fc1c6ef150 10 * substantial portions of the Software.
ansond 0:a3fc1c6ef150 11 *
ansond 0:a3fc1c6ef150 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
ansond 0:a3fc1c6ef150 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
ansond 0:a3fc1c6ef150 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
ansond 0:a3fc1c6ef150 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ansond 0:a3fc1c6ef150 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ansond 0:a3fc1c6ef150 17 */
ansond 0:a3fc1c6ef150 18
ansond 0:a3fc1c6ef150 19 #include "MQTTTransport.h"
ansond 0:a3fc1c6ef150 20 #include "MBEDEndpoint.h"
ansond 0:a3fc1c6ef150 21
ansond 0:a3fc1c6ef150 22 // MBED Light support
ansond 0:a3fc1c6ef150 23 #include "MBEDLight.h"
ansond 0:a3fc1c6ef150 24
ansond 5:1ba6e68bf50e 25 // Light Personality: Emulated Light Resource Factory
ansond 5:1ba6e68bf50e 26 #include "EmulatedLightResourceFactory.h"
ansond 0:a3fc1c6ef150 27
ansond 5:1ba6e68bf50e 28 // Light Personality: Emulated Actions we can act on with the Light personalikty
ansond 0:a3fc1c6ef150 29 #include "EmulatedLightDimmerAction.h"
ansond 0:a3fc1c6ef150 30 #include "EmulatedLightSwitchAction.h"
ansond 0:a3fc1c6ef150 31
ansond 0:a3fc1c6ef150 32 // string support
ansond 0:a3fc1c6ef150 33 #include <stdlib.h>
ansond 0:a3fc1c6ef150 34 #include <string.h>
ansond 0:a3fc1c6ef150 35
ansond 0:a3fc1c6ef150 36 // shutdown endpoint reference
ansond 0:a3fc1c6ef150 37 extern void closedown(int code);
ansond 0:a3fc1c6ef150 38
ansond 0:a3fc1c6ef150 39 // default constructor
ansond 23:34086bc15b02 40 MBEDEndpoint::MBEDEndpoint(ErrorHandler *error_handler,void *transport,void *pinouts) : BaseClass(error_handler,NULL) {
ansond 0:a3fc1c6ef150 41 bool success = true;
ansond 0:a3fc1c6ef150 42 this->m_instance_id = 0;
ansond 0:a3fc1c6ef150 43 this->m_preferences = NULL;
ansond 0:a3fc1c6ef150 44 memset(this->m_lcd_status,0,TEMP_BUFFER_LEN+1);
ansond 0:a3fc1c6ef150 45 memset(this->m_gw_address,0,PREFERENCE_VALUE_LEN+1);
ansond 0:a3fc1c6ef150 46 for(int i=0;i<NUM_TRANSPORTS;++i) this->m_transports[i] = NULL;
ansond 11:9ae0fe4517c1 47 this->logger()->setEndpoint((void *)this);
ansond 13:66f6cf705184 48 this->setEndpoint(new IOCEndpoint(this->logger(),(void *)this));
ansond 0:a3fc1c6ef150 49 if (success) this->initPreferences();
ansond 0:a3fc1c6ef150 50 if (success) this->initEndpointName();
ansond 0:a3fc1c6ef150 51 if (success) this->logger()->turnLEDBlue();
ansond 0:a3fc1c6ef150 52 #ifdef MAC_ADDRESS
ansond 0:a3fc1c6ef150 53 extern char fmt_mac[RESOURCE_VALUE_LEN+1];
ansond 0:a3fc1c6ef150 54 if (success)this->logger()->log("%s (MAC: %s)",ENDPOINT_VERSION_ANNOUNCE,fmt_mac);
ansond 0:a3fc1c6ef150 55 #else
ansond 0:a3fc1c6ef150 56 if (success)this->logger()->log(ENDPOINT_VERSION_ANNOUNCE);
ansond 0:a3fc1c6ef150 57 #endif
ansond 0:a3fc1c6ef150 58 if (success) this->initGWAddress();
ansond 0:a3fc1c6ef150 59 if (success) this->logger()->log("IOC GW IP: %s",GW_IPADDRESS);
ansond 0:a3fc1c6ef150 60 if (PL_ENABLE && success) this->logger()->log("Philips Light ID: %d Philips Gateway IP: %s",PL_LIGHT_ID,PL_GW_ADDRESS);
ansond 18:8ab7aa1dbb41 61 #ifdef CELLULAR_NETWORK
ansond 18:8ab7aa1dbb41 62 this->m_cellular_modem = NULL;
ansond 18:8ab7aa1dbb41 63 this->m_gps = NULL;
ansond 23:34086bc15b02 64 if (success) success = this->initializeCellularModem(transport,pinouts);
ansond 25:5269e8881494 65 if (success) success = this->initializeGPSReceiver(pinouts);
ansond 18:8ab7aa1dbb41 66 #else
ansond 23:34086bc15b02 67 if (success) success = this->initializeEthernet((EthernetInterface *)transport);
ansond 14:717372430717 68 #endif
ansond 0:a3fc1c6ef150 69 if (success) this->logger()->turnLEDYellow();
ansond 0:a3fc1c6ef150 70 if (success)this->m_map = new MBEDToIOCResourceMap(error_handler);
ansond 0:a3fc1c6ef150 71 if (success) success = this->initializeTransports();
ansond 7:8a4a61202b36 72 if (success) success = this->initializePersonalities();
ansond 0:a3fc1c6ef150 73 if (success) this->logger()->turnLEDOrange();
ansond 0:a3fc1c6ef150 74 this->logger()->lcdStatusOnly(true);
ansond 0:a3fc1c6ef150 75 if (!success) closedown(2);
ansond 0:a3fc1c6ef150 76 }
ansond 0:a3fc1c6ef150 77
ansond 0:a3fc1c6ef150 78 // default destructor
ansond 0:a3fc1c6ef150 79 MBEDEndpoint::~MBEDEndpoint() {
ansond 0:a3fc1c6ef150 80 bool success = true;
ansond 0:a3fc1c6ef150 81 if (success) this->logger()->turnLEDYellow();
ansond 7:8a4a61202b36 82 if (success) success = this->closePersonalities();
ansond 0:a3fc1c6ef150 83 if (success) success = this->closeTransports();
ansond 18:8ab7aa1dbb41 84 #ifdef CELLULAR_NETWORK
ansond 18:8ab7aa1dbb41 85 if (success) success = this->closeCellularModem();
ansond 18:8ab7aa1dbb41 86 if (success) success = this->closeGPSReceiver();
ansond 19:194cdc5e5a1e 87 if (this->m_cellular_modem != NULL) delete this->m_cellular_modem;
ansond 18:8ab7aa1dbb41 88 if (this->m_gps != NULL) delete this->m_gps;
ansond 24:e706feda4970 89 if (this->m_preferences != NULL) delete this->m_preferences;
ansond 18:8ab7aa1dbb41 90 #else
ansond 0:a3fc1c6ef150 91 if (success) success = this->closeEthernet();
ansond 14:717372430717 92 #endif
ansond 0:a3fc1c6ef150 93 if (success) this->logger()->turnLEDBlue();
ansond 0:a3fc1c6ef150 94 if (this->m_map != NULL) delete this->m_map;
ansond 13:66f6cf705184 95 if (this->getEndpoint() != NULL) delete (IOCEndpoint *)this->getEndpoint();
ansond 0:a3fc1c6ef150 96 }
ansond 0:a3fc1c6ef150 97
ansond 0:a3fc1c6ef150 98 // get the IOC <--> MBED resource map
ansond 0:a3fc1c6ef150 99 MBEDToIOCResourceMap *MBEDEndpoint::getMap() { return this->m_map; }
ansond 0:a3fc1c6ef150 100
ansond 0:a3fc1c6ef150 101 // initialize our preferences
ansond 0:a3fc1c6ef150 102 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 0:a3fc1c6ef150 103
ansond 0:a3fc1c6ef150 104 // get our preferences
ansond 0:a3fc1c6ef150 105 Preferences *MBEDEndpoint::preferences() { return this->m_preferences; }
ansond 0:a3fc1c6ef150 106
ansond 0:a3fc1c6ef150 107 // initialize the GW address from the configuration
ansond 0:a3fc1c6ef150 108 void MBEDEndpoint::initGWAddress() {
ansond 0:a3fc1c6ef150 109 memset(this->m_gw_address,0,PREFERENCE_VALUE_LEN+1);
ansond 0:a3fc1c6ef150 110 this->preferences()->getPreference("gw_address",this->m_gw_address,PREFERENCE_VALUE_LEN,GW_IPADDRESS);
ansond 0:a3fc1c6ef150 111 this->logger()->log("GW IP: %s",this->getGWAddress());
ansond 0:a3fc1c6ef150 112 }
ansond 0:a3fc1c6ef150 113
ansond 0:a3fc1c6ef150 114 // get our GW address
ansond 0:a3fc1c6ef150 115 char *MBEDEndpoint::getGWAddress() { return this->m_gw_address; }
ansond 0:a3fc1c6ef150 116
ansond 0:a3fc1c6ef150 117 // get our LCD status
ansond 0:a3fc1c6ef150 118 char *MBEDEndpoint::getLCDStatus() {
ansond 0:a3fc1c6ef150 119 memset(this->m_lcd_status,0,TEMP_BUFFER_LEN+1);
ansond 0:a3fc1c6ef150 120
ansond 0:a3fc1c6ef150 121 // look at Light#0 to determine the IOC linkage ID...
ansond 7:8a4a61202b36 122 char *ioc = this->m_personalities[0]->getResourceFactory()->getResourceValue(EXTERNAL_LINKAGE_RESOURCE);
ansond 0:a3fc1c6ef150 123
ansond 0:a3fc1c6ef150 124 // color our LED depending on whether we have IOC linkage or not...
ansond 7:8a4a61202b36 125 if (ioc == NULL || strcmp(ioc,EXTERNAL_LINKAGE_UNSET) == 0) this->logger()->turnLEDOrange();
ansond 0:a3fc1c6ef150 126 else this->logger()->turnLEDGreen();
ansond 0:a3fc1c6ef150 127
ansond 0:a3fc1c6ef150 128 sprintf(this->m_lcd_status,"Node: %s\nGW IP: %s\nIOC Link: %s",this->getEndpointName(),this->getGWAddress(),ioc);
ansond 0:a3fc1c6ef150 129 return this->m_lcd_status;
ansond 0:a3fc1c6ef150 130 }
ansond 0:a3fc1c6ef150 131
ansond 5:1ba6e68bf50e 132 // initialize our personality
ansond 7:8a4a61202b36 133 bool MBEDEndpoint::initializePersonalities() {
ansond 5:1ba6e68bf50e 134 #ifdef LIGHT_PERSONALITY
ansond 5:1ba6e68bf50e 135 return this->initializeLights();
ansond 17:36a4ab911aaa 136 #endif
ansond 17:36a4ab911aaa 137 #ifdef COPCAR_PERSONALITY
ansond 17:36a4ab911aaa 138 return this->initializeLights();
ansond 5:1ba6e68bf50e 139 #endif
ansond 5:1ba6e68bf50e 140 }
ansond 5:1ba6e68bf50e 141
ansond 0:a3fc1c6ef150 142 // initialize the Lights
ansond 0:a3fc1c6ef150 143 bool MBEDEndpoint::initializeLights() {
ansond 7:8a4a61202b36 144 int index = this->preferences()->getIntPreference("endpoint_id",PERSONALITY_NAME_INDEX);
ansond 0:a3fc1c6ef150 145 this->logger()->log("Initializing Lights...");
ansond 7:8a4a61202b36 146 for(int i=0;i<NUM_PERSONALITY_INSTANCES;++i) {
ansond 7:8a4a61202b36 147 this->m_personalities[i] = new MBEDLight(this->logger(),this->m_transports,i+index,this);
ansond 10:d96c57c19611 148 ((Light *)this->m_personalities[i])->setDimmerAction(new EmulatedLightDimmerAction(this->logger(),(Light *)this->m_personalities[i]));
ansond 10:d96c57c19611 149 ((Light *)this->m_personalities[i])->setSwitchAction(new EmulatedLightSwitchAction(this->logger(),(Light *)this->m_personalities[i]));
ansond 0:a3fc1c6ef150 150 }
ansond 0:a3fc1c6ef150 151 return true;
ansond 0:a3fc1c6ef150 152 }
ansond 0:a3fc1c6ef150 153
ansond 7:8a4a61202b36 154 // does the input name match any of our personality instances?
ansond 7:8a4a61202b36 155 int MBEDEndpoint::indexOfPersonality(char *name) {
ansond 0:a3fc1c6ef150 156 bool found = false;
ansond 0:a3fc1c6ef150 157 int index = -1;
ansond 0:a3fc1c6ef150 158
ansond 7:8a4a61202b36 159 for(int i=0;i<NUM_PERSONALITY_INSTANCES && !found;++i) {
ansond 7:8a4a61202b36 160 if (strcmp(this->m_personalities[i]->getName(),name) == 0) {
ansond 0:a3fc1c6ef150 161 found = true;
ansond 0:a3fc1c6ef150 162 index = i;
ansond 0:a3fc1c6ef150 163 }
ansond 0:a3fc1c6ef150 164 }
ansond 0:a3fc1c6ef150 165
ansond 0:a3fc1c6ef150 166 return index;
ansond 0:a3fc1c6ef150 167 }
ansond 0:a3fc1c6ef150 168
ansond 0:a3fc1c6ef150 169 // get a specific resources
ansond 0:a3fc1c6ef150 170 ResourceFactory *MBEDEndpoint::getResources(int index) {
ansond 7:8a4a61202b36 171 if (index >= 0 && index < NUM_PERSONALITY_INSTANCES) return this->m_personalities[index]->getResourceFactory();
ansond 0:a3fc1c6ef150 172 return NULL;
ansond 0:a3fc1c6ef150 173 }
ansond 0:a3fc1c6ef150 174
ansond 5:1ba6e68bf50e 175 // initialize the ResourceFactory to fit our personality
ansond 5:1ba6e68bf50e 176 ResourceFactory *MBEDEndpoint::initResourceFactory() {
ansond 17:36a4ab911aaa 177 #ifdef LIGHT_PERSONALITY
ansond 17:36a4ab911aaa 178 return this->initLightResourceFactory();
ansond 17:36a4ab911aaa 179 #endif
ansond 17:36a4ab911aaa 180 #ifdef COPCAR_PERSONALITY
ansond 17:36a4ab911aaa 181 return this->initLightResourceFactory();
ansond 17:36a4ab911aaa 182 #endif
ansond 5:1ba6e68bf50e 183 }
ansond 5:1ba6e68bf50e 184
ansond 5:1ba6e68bf50e 185 // initialize a Light Resource Factory
ansond 5:1ba6e68bf50e 186 ResourceFactory *MBEDEndpoint::initLightResourceFactory() { return new EmulatedLightResourceFactory(this->logger(),(void *)this); }
ansond 0:a3fc1c6ef150 187
ansond 0:a3fc1c6ef150 188 // Initialize the Endpoint Name - will be the first Light resource name (and there must be one...)
ansond 0:a3fc1c6ef150 189 void MBEDEndpoint::initEndpointName() {
ansond 7:8a4a61202b36 190 this->m_instance_id = this->preferences()->getIntPreference("endpoint_id",PERSONALITY_NAME_INDEX);
ansond 7:8a4a61202b36 191 memset(this->m_endpoint_name,0,PERSONALITY_NAME_LEN+1);
ansond 7:8a4a61202b36 192 sprintf(this->m_endpoint_name,PERSONALITY_NAME,this->m_instance_id);
ansond 0:a3fc1c6ef150 193 }
ansond 0:a3fc1c6ef150 194
ansond 0:a3fc1c6ef150 195 // get our endpoint name
ansond 0:a3fc1c6ef150 196 char *MBEDEndpoint::getEndpointName() { return this->m_endpoint_name; }
ansond 0:a3fc1c6ef150 197
ansond 0:a3fc1c6ef150 198 // get our instance id
ansond 0:a3fc1c6ef150 199 int MBEDEndpoint::getInstanceID() { return this->m_instance_id; }
ansond 0:a3fc1c6ef150 200
ansond 0:a3fc1c6ef150 201 // initialize a specific transport
ansond 0:a3fc1c6ef150 202 bool MBEDEndpoint::initializeTransport(int index,char *key,Transport *transport) {
ansond 0:a3fc1c6ef150 203 bool success = false;
ansond 0:a3fc1c6ef150 204 if (this->m_transports[index] == NULL) {
ansond 0:a3fc1c6ef150 205 this->logger()->log("Initializing %s Transport...", key);
ansond 0:a3fc1c6ef150 206 this->m_transports[index] = transport;
ansond 0:a3fc1c6ef150 207 if (this->m_transports[index] != NULL) success = this->m_transports[index]->connect();
ansond 0:a3fc1c6ef150 208 if (success) this->logger()->log("Transport %s initialized and connected",key);
ansond 0:a3fc1c6ef150 209 }
ansond 0:a3fc1c6ef150 210 else {
ansond 0:a3fc1c6ef150 211 this->logger()->log("%s already connected (OK)...", key);
ansond 0:a3fc1c6ef150 212 success = true;
ansond 0:a3fc1c6ef150 213 }
ansond 0:a3fc1c6ef150 214 return success;
ansond 0:a3fc1c6ef150 215 }
ansond 0:a3fc1c6ef150 216
ansond 0:a3fc1c6ef150 217 // initialize our transports
ansond 0:a3fc1c6ef150 218 bool MBEDEndpoint::initializeTransports() {
ansond 0:a3fc1c6ef150 219 bool success = true;
ansond 0:a3fc1c6ef150 220
ansond 0:a3fc1c6ef150 221 if (success == true) {
ansond 0:a3fc1c6ef150 222 // MQTT Initialization
ansond 13:66f6cf705184 223 success = this->initializeTransport(MQTT_TRANSPORT,"MQTT",new MQTTTransport(this->logger(),this,this->getMap()));
ansond 0:a3fc1c6ef150 224 }
ansond 0:a3fc1c6ef150 225
ansond 0:a3fc1c6ef150 226 if (success == true) {
ansond 0:a3fc1c6ef150 227 // HTTP Initialization
ansond 13:66f6cf705184 228 success = this->initializeTransport(HTTP_TRANSPORT,"HTTP",new IOCHTTPTransport(this->logger(),this));
ansond 0:a3fc1c6ef150 229 }
ansond 0:a3fc1c6ef150 230 return success;
ansond 0:a3fc1c6ef150 231 }
ansond 0:a3fc1c6ef150 232
ansond 18:8ab7aa1dbb41 233 #ifdef CELLULAR_NETWORK
ansond 23:34086bc15b02 234 bool MBEDEndpoint::initializeCellularModem(void *transport,void *pinouts) {
ansond 18:8ab7aa1dbb41 235 bool success = false;
ansond 18:8ab7aa1dbb41 236
ansond 18:8ab7aa1dbb41 237 // initialize
ansond 26:b9d74e06b3de 238 if (this->m_cellular_modem == NULL) this->m_cellular_modem = new MBEDUbloxCellRadio(this->logger(),(void *)this,(UBLOX_MODEM *)transport,(C027 *)pinouts);
ansond 18:8ab7aa1dbb41 239 if (this->m_cellular_modem != NULL) success = this->m_cellular_modem->connect();
ansond 18:8ab7aa1dbb41 240
ansond 18:8ab7aa1dbb41 241 // return our status
ansond 18:8ab7aa1dbb41 242 return success;
ansond 18:8ab7aa1dbb41 243 }
ansond 18:8ab7aa1dbb41 244
ansond 25:5269e8881494 245 bool MBEDEndpoint::initializeGPSReceiver(void *pinouts) {
ansond 18:8ab7aa1dbb41 246 bool success = false;
ansond 18:8ab7aa1dbb41 247
ansond 18:8ab7aa1dbb41 248 // initialize
ansond 25:5269e8881494 249 if (this->m_gps == NULL) this->m_gps = new MBEDUbloxGPS(this->logger(),this,(C027 *)pinouts);
ansond 18:8ab7aa1dbb41 250 if (this->m_gps != NULL) success = this->m_gps->connect();
ansond 18:8ab7aa1dbb41 251
ansond 18:8ab7aa1dbb41 252 // return our status
ansond 18:8ab7aa1dbb41 253 return success;
ansond 18:8ab7aa1dbb41 254 }
ansond 18:8ab7aa1dbb41 255 #endif
ansond 18:8ab7aa1dbb41 256
ansond 14:717372430717 257 #ifndef CELLULAR_NETWORK
ansond 0:a3fc1c6ef150 258 // initialize our Ethernet
ansond 0:a3fc1c6ef150 259 bool MBEDEndpoint::initializeEthernet(EthernetInterface *ethernet) {
ansond 0:a3fc1c6ef150 260 bool success = false;
ansond 0:a3fc1c6ef150 261 this->m_ethernet = ethernet;
ansond 0:a3fc1c6ef150 262 if (this->m_ethernet != NULL) {
ansond 0:a3fc1c6ef150 263 this->logger()->log("Initializing Ethernet...");
ansond 0:a3fc1c6ef150 264
ansond 0:a3fc1c6ef150 265 // connect up ethernet
ansond 0:a3fc1c6ef150 266 this->m_ethernet->init();
ansond 0:a3fc1c6ef150 267 this->m_ethernet->connect();
ansond 0:a3fc1c6ef150 268
ansond 0:a3fc1c6ef150 269 // display our IP address
ansond 0:a3fc1c6ef150 270 char *ipaddr = this->m_ethernet->getIPAddress();
ansond 0:a3fc1c6ef150 271 if (ipaddr != NULL && strlen(ipaddr) > 0) {
ansond 0:a3fc1c6ef150 272 this->logger()->log("IPAddress: %s",this->m_ethernet->getIPAddress());
ansond 0:a3fc1c6ef150 273 success = true;
ansond 0:a3fc1c6ef150 274 }
ansond 0:a3fc1c6ef150 275 else {
ansond 0:a3fc1c6ef150 276 this->logger()->log("Ethernet Not Connected...");
ansond 0:a3fc1c6ef150 277 success = false;
ansond 0:a3fc1c6ef150 278 }
ansond 0:a3fc1c6ef150 279 }
ansond 0:a3fc1c6ef150 280 else {
ansond 0:a3fc1c6ef150 281 this->logger()->log("No Ethernet instance found");
ansond 0:a3fc1c6ef150 282 success = false;
ansond 0:a3fc1c6ef150 283 }
ansond 0:a3fc1c6ef150 284 return success;
ansond 0:a3fc1c6ef150 285 }
ansond 14:717372430717 286 #endif
ansond 0:a3fc1c6ef150 287
ansond 7:8a4a61202b36 288 // load up all personality instances into the IOC
ansond 7:8a4a61202b36 289 bool MBEDEndpoint::loadPersonalities() {
ansond 0:a3fc1c6ef150 290 bool success = true;
ansond 7:8a4a61202b36 291 this->logger()->log("Loading All Personalities into the IOC...");
ansond 7:8a4a61202b36 292 for(int i=0;i<NUM_PERSONALITY_INSTANCES && success;++i) success = this->loadPersonality(this->m_personalities[i]);
ansond 0:a3fc1c6ef150 293 return success;
ansond 0:a3fc1c6ef150 294 }
ansond 0:a3fc1c6ef150 295
ansond 7:8a4a61202b36 296 // load up our personality to the IOC
ansond 7:8a4a61202b36 297 bool MBEDEndpoint::loadPersonality(Personality *instance) {
ansond 0:a3fc1c6ef150 298 bool success = false;
ansond 0:a3fc1c6ef150 299 char result[IOC_RESULT_LEN+1];
ansond 0:a3fc1c6ef150 300 char payload[IOC_PAYLOAD_LEN+1];
ansond 0:a3fc1c6ef150 301
ansond 0:a3fc1c6ef150 302 // initialize
ansond 0:a3fc1c6ef150 303 memset(result,0,IOC_RESULT_LEN+1);
ansond 0:a3fc1c6ef150 304 memset(payload,0,IOC_PAYLOAD_LEN+1);
ansond 0:a3fc1c6ef150 305
ansond 0:a3fc1c6ef150 306 // DEBUG
ansond 7:8a4a61202b36 307 this->logger()->log("Building Payload for Personality(%s): %s...",instance->getType(),instance->getName());
ansond 0:a3fc1c6ef150 308
ansond 7:8a4a61202b36 309 // build the personality payload
ansond 7:8a4a61202b36 310 char *data = NULL;
ansond 7:8a4a61202b36 311 #ifdef LIGHT_PERSONALITY
ansond 11:9ae0fe4517c1 312 data = ((IOCEndpoint *)this->getEndpoint())->buildLightPayload(payload,IOC_PAYLOAD_LEN,(Light *)instance);
ansond 7:8a4a61202b36 313 #endif
ansond 0:a3fc1c6ef150 314
ansond 0:a3fc1c6ef150 315 // issue the request
ansond 0:a3fc1c6ef150 316 if (data != NULL && strlen(data) > 0) {
ansond 0:a3fc1c6ef150 317 // DEBUG
ansond 7:8a4a61202b36 318 this->logger()->log("Sending Personality(%s): %s to the IOC...",instance->getType(),instance->getName());
ansond 0:a3fc1c6ef150 319
ansond 0:a3fc1c6ef150 320 // load
ansond 0:a3fc1c6ef150 321 success = this->m_transports[LOAD_TRANSPORT]->loadEndpoint((char *)payload,strlen(payload),(char *)result,IOC_RESULT_LEN);
ansond 0:a3fc1c6ef150 322 }
ansond 0:a3fc1c6ef150 323
ansond 0:a3fc1c6ef150 324 // DEBUG
ansond 0:a3fc1c6ef150 325 //if (success) this->logger()->log("Saving IOC ID for Light: %s...",light->getName());
ansond 0:a3fc1c6ef150 326
ansond 7:8a4a61202b36 327 // update the External ID if found
ansond 11:9ae0fe4517c1 328 if (success) ((IOCEndpoint *)this->getEndpoint())->saveExternalID(instance,result);
ansond 0:a3fc1c6ef150 329
ansond 0:a3fc1c6ef150 330 // DEBUG
ansond 7:8a4a61202b36 331 if (success) this->logger()->log("Personality(%s): %s IOC ID=%d sent successfully",instance->getType(),instance->getName(),instance->getExternalID());
ansond 0:a3fc1c6ef150 332
ansond 0:a3fc1c6ef150 333 // DEBUG
ansond 0:a3fc1c6ef150 334 if (!success) {
ansond 7:8a4a61202b36 335 if (instance != NULL) this->logger()->log("Personality(%s): %s send FAILED",instance->getType(),instance->getName());
ansond 7:8a4a61202b36 336 else this->logger()->log("Personality send FAILED: NULL Personality instance");
ansond 0:a3fc1c6ef150 337 }
ansond 0:a3fc1c6ef150 338
ansond 0:a3fc1c6ef150 339 // return our status
ansond 0:a3fc1c6ef150 340 return success;
ansond 0:a3fc1c6ef150 341 }
ansond 0:a3fc1c6ef150 342
ansond 7:8a4a61202b36 343 // update all personality instances into the IOC
ansond 7:8a4a61202b36 344 bool MBEDEndpoint::updatePersonalities() {
ansond 0:a3fc1c6ef150 345 bool success = true;
ansond 7:8a4a61202b36 346 for(int i=0;i<NUM_PERSONALITY_INSTANCES && success;++i) success = this->updatePersonality(i);
ansond 0:a3fc1c6ef150 347 return success;
ansond 0:a3fc1c6ef150 348 }
ansond 0:a3fc1c6ef150 349
ansond 7:8a4a61202b36 350 // update all personality instances to the IOC
ansond 7:8a4a61202b36 351 bool MBEDEndpoint::updatePersonality(int index) {
ansond 7:8a4a61202b36 352 if (index >= 0 && index < NUM_PERSONALITY_INSTANCES) return this->updatePersonality(this->m_personalities[index]);
ansond 0:a3fc1c6ef150 353 return false;
ansond 0:a3fc1c6ef150 354 }
ansond 0:a3fc1c6ef150 355
ansond 7:8a4a61202b36 356 // update our ith personality instance with the IOC
ansond 7:8a4a61202b36 357 bool MBEDEndpoint::updatePersonality(Personality *instance) {
ansond 0:a3fc1c6ef150 358 bool success = false;
ansond 0:a3fc1c6ef150 359 char result[IOC_RESULT_LEN+1];
ansond 0:a3fc1c6ef150 360 char payload[IOC_PAYLOAD_LEN+1];
ansond 0:a3fc1c6ef150 361
ansond 0:a3fc1c6ef150 362 // initialize
ansond 0:a3fc1c6ef150 363 memset(result,0,IOC_RESULT_LEN+1);
ansond 0:a3fc1c6ef150 364 memset(payload,0,IOC_PAYLOAD_LEN+1);
ansond 0:a3fc1c6ef150 365
ansond 0:a3fc1c6ef150 366 // build the payload
ansond 7:8a4a61202b36 367 char *data = NULL;
ansond 7:8a4a61202b36 368
ansond 7:8a4a61202b36 369 #ifdef LIGHT_PERSONALITY
ansond 11:9ae0fe4517c1 370 data = ((IOCEndpoint *)this->getEndpoint())->buildLightPayload(payload,IOC_PAYLOAD_LEN,(Light *)instance);
ansond 7:8a4a61202b36 371 #endif
ansond 7:8a4a61202b36 372
ansond 0:a3fc1c6ef150 373 // issue the request
ansond 0:a3fc1c6ef150 374 if (data != NULL && strlen(data) > 0) {
ansond 0:a3fc1c6ef150 375 // DEBUG
ansond 7:8a4a61202b36 376 this->logger()->log("Updating Personality(%s): %s at the IOC...",instance->getType(),instance->getName());
ansond 0:a3fc1c6ef150 377
ansond 0:a3fc1c6ef150 378 // update
ansond 7:8a4a61202b36 379 success = this->m_transports[LOAD_TRANSPORT]->updateEndpoint(instance->getExternalID(),(char *)payload,strlen(payload),(char *)result,IOC_RESULT_LEN);
ansond 0:a3fc1c6ef150 380 }
ansond 0:a3fc1c6ef150 381
ansond 0:a3fc1c6ef150 382 // DEBUG
ansond 7:8a4a61202b36 383 if (success) this->logger()->log("Update of Personality instance to IOC successful");
ansond 7:8a4a61202b36 384 else this->logger()->log("Update of Personality instance to IOC FAILED");
ansond 0:a3fc1c6ef150 385
ansond 0:a3fc1c6ef150 386 // return our status
ansond 0:a3fc1c6ef150 387 return success;
ansond 0:a3fc1c6ef150 388 }
ansond 0:a3fc1c6ef150 389
ansond 7:8a4a61202b36 390 // close down our personalities
ansond 7:8a4a61202b36 391 bool MBEDEndpoint::closePersonalities() {
ansond 0:a3fc1c6ef150 392 bool success = true;
ansond 7:8a4a61202b36 393 this->logger()->log("Closing down Personalities...");
ansond 7:8a4a61202b36 394 for(int i=0;i<NUM_PERSONALITY_INSTANCES;++i)
ansond 7:8a4a61202b36 395 if (this->m_personalities[i] != NULL) delete this->m_personalities[i];
ansond 0:a3fc1c6ef150 396 return success;
ansond 0:a3fc1c6ef150 397 }
ansond 0:a3fc1c6ef150 398
ansond 0:a3fc1c6ef150 399 // close a given transport
ansond 0:a3fc1c6ef150 400 bool MBEDEndpoint::closeTransport(int index,char *key) {
ansond 0:a3fc1c6ef150 401 this->logger()->log("Closing down %s Transport...", key);
ansond 0:a3fc1c6ef150 402 if (this->m_transports[index] != NULL) delete this->m_transports[index];
ansond 0:a3fc1c6ef150 403 return true;
ansond 0:a3fc1c6ef150 404 }
ansond 0:a3fc1c6ef150 405
ansond 0:a3fc1c6ef150 406 // close down our transports
ansond 0:a3fc1c6ef150 407 bool MBEDEndpoint::closeTransports() {
ansond 0:a3fc1c6ef150 408 bool success = true;
ansond 0:a3fc1c6ef150 409
ansond 0:a3fc1c6ef150 410 if (success) {
ansond 0:a3fc1c6ef150 411 // close MQTT
ansond 0:a3fc1c6ef150 412 success = this->closeTransport(MQTT_TRANSPORT,"MQTT");
ansond 0:a3fc1c6ef150 413 }
ansond 0:a3fc1c6ef150 414
ansond 0:a3fc1c6ef150 415 if (success) {
ansond 0:a3fc1c6ef150 416 // close HTTP
ansond 0:a3fc1c6ef150 417 success = this->closeTransport(HTTP_TRANSPORT,"HTTP");
ansond 0:a3fc1c6ef150 418 }
ansond 0:a3fc1c6ef150 419
ansond 0:a3fc1c6ef150 420 return success;
ansond 0:a3fc1c6ef150 421 }
ansond 0:a3fc1c6ef150 422
ansond 18:8ab7aa1dbb41 423 #ifdef CELLULAR_NETWORK
ansond 18:8ab7aa1dbb41 424 bool MBEDEndpoint::closeCellularModem() {
ansond 18:8ab7aa1dbb41 425 bool success = true;
ansond 18:8ab7aa1dbb41 426 if (this->m_cellular_modem != NULL) success = this->m_cellular_modem->disconnect();
ansond 18:8ab7aa1dbb41 427 return success;
ansond 18:8ab7aa1dbb41 428 }
ansond 18:8ab7aa1dbb41 429
ansond 18:8ab7aa1dbb41 430 bool MBEDEndpoint::closeGPSReceiver() {
ansond 18:8ab7aa1dbb41 431 bool success = true;
ansond 18:8ab7aa1dbb41 432 if (this->m_gps != NULL) success = this->m_gps->disconnect();
ansond 18:8ab7aa1dbb41 433 return success;
ansond 18:8ab7aa1dbb41 434 }
ansond 18:8ab7aa1dbb41 435 #endif
ansond 18:8ab7aa1dbb41 436
ansond 14:717372430717 437 #ifndef CELLULAR_NETWORK
ansond 0:a3fc1c6ef150 438 // close down our Ethernet
ansond 0:a3fc1c6ef150 439 bool MBEDEndpoint::closeEthernet() {
ansond 0:a3fc1c6ef150 440 this->logger()->log("Closing down Ethernet...");
ansond 0:a3fc1c6ef150 441 if (this->m_ethernet != NULL) this->m_ethernet->disconnect();
ansond 0:a3fc1c6ef150 442 return true;
ansond 0:a3fc1c6ef150 443 }
ansond 14:717372430717 444 #endif
ansond 11:9ae0fe4517c1 445
ansond 0:a3fc1c6ef150 446 // main running loop
ansond 0:a3fc1c6ef150 447 void MBEDEndpoint::run() {
ansond 0:a3fc1c6ef150 448 this->logger()->log("Endpoint Main Loop");
ansond 0:a3fc1c6ef150 449 while(true) {
ansond 0:a3fc1c6ef150 450 // sleep a bit
ansond 0:a3fc1c6ef150 451 //this->logger()->log("Sleeping for a bit...");
ansond 0:a3fc1c6ef150 452 wait_ms(MAIN_LOOP_SLEEP);
ansond 0:a3fc1c6ef150 453
ansond 0:a3fc1c6ef150 454 // check for events
ansond 0:a3fc1c6ef150 455 //this->logger()->log("Processing Events...");
ansond 0:a3fc1c6ef150 456 for(int i=0;i<NUM_TRANSPORTS;++i) this->m_transports[i]->checkAndProcess();
ansond 0:a3fc1c6ef150 457
ansond 0:a3fc1c6ef150 458 // check for exit
ansond 0:a3fc1c6ef150 459 //this->logger()->log("Checking for exit...");
ansond 0:a3fc1c6ef150 460 this->logger()->checkForExit();
ansond 0:a3fc1c6ef150 461 }
ansond 0:a3fc1c6ef150 462 }
ansond 0:a3fc1c6ef150 463