mqtt specific components for the impact mbed endpoint library
Dependents: mbed_mqtt_endpoint_ublox_ethernet mbed_mqtt_endpoint_ublox_cellular mbed_mqtt_endpoint_nxp
Diff: EmulatedResourceFactory.cpp
- Revision:
- 0:a3fc1c6ef150
- Child:
- 2:e949b5a5f40a
diff -r 000000000000 -r a3fc1c6ef150 EmulatedResourceFactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EmulatedResourceFactory.cpp Wed Mar 26 19:48:35 2014 +0000 @@ -0,0 +1,148 @@ +/* Copyright C2013 Doug Anson, MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software + * and associated documentation files the "Software", to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + // class definition + #include "EmulatedResourceFactory.h" + + // MBEDEndpoint support + #include "MBEDEndpoint.h" + + // MBED supports Battery Emulation + #include "MBEDBattery.h" + + // MBED supports Current Emulation + #include "MBEDCurrent.h" + + // MBED supports Temperature Sensing + #include "MBEDTemperature.h" + + // MBED supports GPS Emulation + #include "MBEDgps.h" + + // MBED supports RSSI Emulation + #include "MBEDrssi.h" + + // MBED supports Voltage Emulation + #include "MBEDVoltage.h" + + // MBED supports Wattage Emulation + #include "MBEDWattage.h" + + // Initializers + void init_battery(Resource *resource) { if (resource != NULL) new MBEDBattery(resource->logger(),resource); } + void init_current(Resource *resource) { if (resource != NULL) new MBEDCurrent(resource->logger(),resource); } + void init_gps(Resource *resource) { if (resource != NULL) new MBEDgps(resource->logger(),resource); } + void init_rssi(Resource *resource) { if (resource != NULL) new MBEDrssi(resource->logger(),resource); } + void init_temperature(Resource *resource) { if (resource != NULL) new MBEDTemperature(resource->logger(),resource); } + void init_voltage(Resource *resource) { if (resource != NULL) new MBEDVoltage(resource->logger(),resource); } + void init_wattage(Resource *resource) { if (resource != NULL) new MBEDWattage(resource->logger(),resource); } + + // Ethernet + #include "EthernetInterface.h" + extern EthernetInterface ethernet; + + // NSP supports Light Dimming + extern void emulated_light_dimming_cb(); + + // NSP supports Light Switch + extern void emulated_light_switch_cb(); + + // default constructor + EmulatedResourceFactory::EmulatedResourceFactory(ErrorHandler *error_handler,void *endpoint) : ResourceFactory(error_handler,endpoint) { + this->initGPSCoords(); + } + + // default destructor + EmulatedResourceFactory::~EmulatedResourceFactory() { + } + + // initialize our GPS coords + void EmulatedResourceFactory::initGPSCoords() { + memset(this->m_gps_coords,0,PREFERENCE_VALUE_LEN+1); + MBEDEndpoint *endpoint = (MBEDEndpoint *)this->m_endpoint; + endpoint->preferences()->getPreference("coords",this->m_gps_coords,PREFERENCE_VALUE_LEN,ENDPOINT_GPS_COORDS); + } + + // get our GPS coords from preferences + char *EmulatedResourceFactory::getGPSCoords() { return this->m_gps_coords; } + + // create resources + void EmulatedResourceFactory::createResources(char *endpoint_name) { + // create all of the resources we expect for this endpoint + this->createResource("/dev/addldata","id:0"); + this->createResource("/dev/location",ENDPOINT_LOCATION); + this->createResource("/fw/devtype","Light"); + this->createResource("/dev/bat","5.0V",(void *)&init_battery,NULL); + this->createResource("/sen/I","0.1A",(void *)&init_current,NULL); + this->createResource("/dev/I","0.1A",(void *)&init_current,NULL); + this->createResource("/nw/ipaddr",ethernet.getIPAddress()); + this->createResource(endpoint_name,"/lt/0/dim","25",(void *)&emulated_light_dimming_cb); // Action: dim/brighten light + this->createResource("/nw/eripaddr","N/A"); + this->createResource(endpoint_name,"/lt/0/on","1",(void *)&emulated_light_switch_cb); // Action: light on/off + this->createResource(endpoint_name,"/lt/0/ctr","1",(void *)&emulated_light_switch_cb); // Action: light on/off + this->createResource("/dev/mdl","MQTT MBED Light"); + this->createResource("/dev/mfg","NXP MBED"); + this->createResource("/gps/int","60"); + this->createResource("/gps/fix","1"); + this->createResource("/nw/pipaddr","N/A"); + this->createResource("/dev/W","0.1W",(void *)&init_wattage,NULL); + this->createResource("/nw/prssi","-75",(void *)&init_rssi,NULL); + this->createResource("/sen/temp","10.0C",(void *)&init_temperature,NULL); + this->createResource("/dev/t","10.0C",(void *)&init_temperature,NULL); + this->createResource("/sen/V","5.0V",(void *)&init_voltage,NULL); + this->createResource("/dev/V","5.0V",(void *)&init_voltage,NULL); + this->createResource("/gps/loc",this->getGPSCoords(),(void *)&init_gps,NULL); + this->createResource("/ns/nspaddr","(NA)"); + this->createResource(endpoint_name,"/dev/panic","0",(void *)&emulated_light_switch_cb); // Action: light on/off + +#ifdef MAC_ADDRESS + extern char fmt_mac[RESOURCE_VALUE_LEN+1]; + this->createResource("/nw/macaddr",fmt_mac); +#else + this->createResource("/nw/macaddr","00:00:00:00:00"); +#endif + } + + void EmulatedResourceFactory::createResource(char *name,char *value) { ResourceFactory::createResource(name,value); } + void EmulatedResourceFactory::createResource(char *ep_name,char *name,char *value,void *cb) { ResourceFactory::createResource(ep_name,name,value,cb); } + void EmulatedResourceFactory::createResource(char *name,char *value,void *io,void *notused) { + MBEDEndpoint *endpoint = (MBEDEndpoint *)this->m_endpoint; + char *ep_name = NULL; if (endpoint != NULL) ep_name = endpoint->getEndpointName(); + this->m_list[this->m_count] = new Resource(this->logger(),ep_name,name,value,NULL); + if (io != NULL && this->m_list[this->m_count] != NULL) { + resourceInitializer initializer = (resourceInitializer)io; + (initializer)(this->m_list[this->m_count]); + } + if (this->m_list[this->m_count] != NULL) ++this->m_count; + } + + // set a resource value (AND trigger the Emulated actions if registered) + bool EmulatedResourceFactory::setResourceValue(char *name, char *value) { + // set the resource value + bool success = ResourceFactory::setResourceValue(name,value); + if (success) { + // invoke an action if registered + EmulatedCallbackPointer cb = (EmulatedCallbackPointer)this->getCallbackPointer(name); + if (cb != NULL) { + // invoke the callback + this->logger()->log("Invoking Action..."); + cb(); + } + } + return success; + } \ No newline at end of file