nsp specific components for the NSP version of the impact endpoint

Dependents:   mbed_nsp_endpoint_ublox_cellular mbed_nsp_endpoint_ublox_ethernet mbed_nsp_endpoint_nxp

Committer:
ansond
Date:
Thu Mar 27 03:53:23 2014 +0000
Revision:
3:53a7333dd07a
Parent:
2:a895137e9082
Child:
4:7f7fe167d9c0
updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ansond 0:e1c4378df3fe 1 /* Copyright C2013 Doug Anson, MIT License
ansond 0:e1c4378df3fe 2 *
ansond 0:e1c4378df3fe 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
ansond 0:e1c4378df3fe 4 * and associated documentation files the "Software", to deal in the Software without restriction,
ansond 0:e1c4378df3fe 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
ansond 0:e1c4378df3fe 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
ansond 0:e1c4378df3fe 7 * furnished to do so, subject to the following conditions:
ansond 0:e1c4378df3fe 8 *
ansond 0:e1c4378df3fe 9 * The above copyright notice and this permission notice shall be included in all copies or
ansond 0:e1c4378df3fe 10 * substantial portions of the Software.
ansond 0:e1c4378df3fe 11 *
ansond 0:e1c4378df3fe 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
ansond 0:e1c4378df3fe 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
ansond 0:e1c4378df3fe 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
ansond 0:e1c4378df3fe 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ansond 0:e1c4378df3fe 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ansond 0:e1c4378df3fe 17 */
ansond 0:e1c4378df3fe 18
ansond 0:e1c4378df3fe 19 // class definition
ansond 0:e1c4378df3fe 20 #include "NSPResourceFactory.h"
ansond 0:e1c4378df3fe 21
ansond 0:e1c4378df3fe 22 // NSP support
ansond 0:e1c4378df3fe 23 #include "nsdl_support.h"
ansond 0:e1c4378df3fe 24
ansond 0:e1c4378df3fe 25 // NSP resource support
ansond 0:e1c4378df3fe 26 #include "NSPResource.h"
ansond 0:e1c4378df3fe 27
ansond 0:e1c4378df3fe 28 // Ethernet Interface
ansond 0:e1c4378df3fe 29 #include "EthernetInterface.h"
ansond 0:e1c4378df3fe 30 extern EthernetInterface ethernet;
ansond 0:e1c4378df3fe 31
ansond 0:e1c4378df3fe 32 // NSP Support Includes
ansond 0:e1c4378df3fe 33 #include "nsdl_support.h"
ansond 0:e1c4378df3fe 34
ansond 0:e1c4378df3fe 35 // MBED supports GPS location observation
ansond 0:e1c4378df3fe 36 #include "gps.h"
ansond 0:e1c4378df3fe 37
ansond 0:e1c4378df3fe 38 // MBED supports RSSI observation
ansond 0:e1c4378df3fe 39 #include "rssi.h"
ansond 0:e1c4378df3fe 40
ansond 0:e1c4378df3fe 41 // MBED supports Temperature Sensing
ansond 0:e1c4378df3fe 42 #include "temperature.h"
ansond 0:e1c4378df3fe 43
ansond 0:e1c4378df3fe 44 // MBED supports Battery Emulation
ansond 0:e1c4378df3fe 45 #include "battery.h"
ansond 0:e1c4378df3fe 46
ansond 0:e1c4378df3fe 47 // MBED supports Voltage Emulation
ansond 0:e1c4378df3fe 48 #include "voltage.h"
ansond 0:e1c4378df3fe 49
ansond 0:e1c4378df3fe 50 // MBED supports Wattage Emulation
ansond 0:e1c4378df3fe 51 #include "wattage.h"
ansond 0:e1c4378df3fe 52
ansond 0:e1c4378df3fe 53 // MBED support Current Emulation
ansond 0:e1c4378df3fe 54 #include "current.h"
ansond 0:e1c4378df3fe 55
ansond 0:e1c4378df3fe 56 // MBED support Dimming Operations
ansond 0:e1c4378df3fe 57 #include "dimmer.h"
ansond 0:e1c4378df3fe 58
ansond 0:e1c4378df3fe 59 // MBED support Light Switch Operations
ansond 0:e1c4378df3fe 60 #include "switch.h"
ansond 0:e1c4378df3fe 61
ansond 0:e1c4378df3fe 62 // MBED support AddlData for IOC Integration
ansond 0:e1c4378df3fe 63 #include "addldata.h"
ansond 0:e1c4378df3fe 64
ansond 0:e1c4378df3fe 65 // MBED supports observable MDL text
ansond 0:e1c4378df3fe 66 #include "mdltext.h"
ansond 0:e1c4378df3fe 67
ansond 0:e1c4378df3fe 68 // MBED supports observable MFG text
ansond 0:e1c4378df3fe 69 #include "mfgtext.h"
ansond 0:e1c4378df3fe 70
ansond 0:e1c4378df3fe 71 // MBED supports observable location text
ansond 0:e1c4378df3fe 72 #include "locationtext.h"
ansond 0:e1c4378df3fe 73
ansond 0:e1c4378df3fe 74 // default constructor
ansond 0:e1c4378df3fe 75 NSPResourceFactory::NSPResourceFactory(ErrorHandler *error_handler,void *endpoint) : ResourceFactory(error_handler,endpoint) {
ansond 0:e1c4378df3fe 76 memset(this->m_endpoint_name,0,LIGHT_NAME_LEN+1);
ansond 0:e1c4378df3fe 77 this->m_resource_ptr = NULL;
ansond 0:e1c4378df3fe 78 }
ansond 0:e1c4378df3fe 79
ansond 0:e1c4378df3fe 80 // default destructor
ansond 0:e1c4378df3fe 81 NSPResourceFactory::~NSPResourceFactory() {
ansond 0:e1c4378df3fe 82 }
ansond 0:e1c4378df3fe 83
ansond 0:e1c4378df3fe 84 // set the endpoint name
ansond 0:e1c4378df3fe 85 void NSPResourceFactory::setEndpointName(char *ep_name) {
ansond 0:e1c4378df3fe 86 memset(this->m_endpoint_name,0,LIGHT_NAME_LEN+1);
ansond 0:e1c4378df3fe 87 strncpy(this->m_endpoint_name,ep_name,this->min(strlen(ep_name),LIGHT_NAME_LEN));
ansond 0:e1c4378df3fe 88 }
ansond 0:e1c4378df3fe 89
ansond 0:e1c4378df3fe 90 // get the endpoint name
ansond 0:e1c4378df3fe 91 char *NSPResourceFactory::getEndpointName() { return this->m_endpoint_name; }
ansond 0:e1c4378df3fe 92
ansond 0:e1c4378df3fe 93 // send any observations we have
ansond 0:e1c4378df3fe 94 void NSPResourceFactory::sendObservations() {
ansond 0:e1c4378df3fe 95 for(int i=0;i<this->m_count;++i) {
ansond 0:e1c4378df3fe 96 NSPResource *resource = (NSPResource *)this->m_list[i];
ansond 0:e1c4378df3fe 97 if (resource != NULL) {
ansond 0:e1c4378df3fe 98 resource->sendObservation();
ansond 0:e1c4378df3fe 99 }
ansond 0:e1c4378df3fe 100 }
ansond 0:e1c4378df3fe 101 }
ansond 0:e1c4378df3fe 102
ansond 0:e1c4378df3fe 103 // create resources (base class does nothing)
ansond 0:e1c4378df3fe 104 void NSPResourceFactory::createResources(char *ep_name) {
ansond 0:e1c4378df3fe 105 // record the endpoint name
ansond 0:e1c4378df3fe 106 this->setEndpointName(ep_name);
ansond 0:e1c4378df3fe 107
ansond 0:e1c4378df3fe 108 // initialize resource structures
ansond 0:e1c4378df3fe 109 this->initResourceStructures();
ansond 0:e1c4378df3fe 110
ansond 0:e1c4378df3fe 111 // create all of the resources we expect for this endpoint
ansond 0:e1c4378df3fe 112 this->createResource(ep_name,"/dev/addldata","id:0",(void *)&addldata_cb,(sn_grs_resource_acl_e)(SN_GRS_GET_ALLOWED|SN_GRS_PUT_ALLOWED),(void *)&init_addldata,"core#s",(char *)NULL);
ansond 0:e1c4378df3fe 113 this->createResource(ep_name,"/dev/location",ENDPOINT_LOCATION,(void *)&locationtext_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_locationtext,"core#s","ns:location");
ansond 0:e1c4378df3fe 114 this->createResource("/fw/devtype",NSP_NODE_TYPE,"core#s","ns:devtype");
ansond 0:e1c4378df3fe 115 this->createResource(ep_name,"/dev/bat","5.0V",(void *)&battery_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_battery,(char *)NULL,"ipso:dev-bat");
ansond 0:e1c4378df3fe 116 this->createResource(ep_name,"/sen/I","0.1",(void *)&current_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_current,(char *)NULL,"ucum:A");
ansond 0:e1c4378df3fe 117 this->createResource(ep_name,"/dev/I","0.1",(void *)&current_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_current,(char *)NULL,"ucum:A");
ansond 0:e1c4378df3fe 118 this->createResource("/nw/ipaddr",ethernet.getIPAddress(),"core#s","ns:v4addr");
ansond 0:e1c4378df3fe 119 this->createResource(ep_name,"/lt/0/dim","25",(void *)&dimmer_cb,(sn_grs_resource_acl_e)(SN_GRS_GET_ALLOWED|SN_GRS_PUT_ALLOWED),(void *)&init_dimmer,(char *)NULL,"ipso:lt-dim"); // Action: dim/brighten light
ansond 0:e1c4378df3fe 120 this->createResource("/nw/eripaddr","N/A","core#s","ns:v4addr");
ansond 0:e1c4378df3fe 121 this->createResource(ep_name,"/lt/0/on","1",(void *)&switch_cb,(sn_grs_resource_acl_e)(SN_GRS_GET_ALLOWED|SN_GRS_PUT_ALLOWED),(void *)&init_switch,(char *)NULL,"ipso:lt-on"); // Action: light on/off
ansond 3:53a7333dd07a 122 //this->createResource(ep_name,"/lt/0/ctr","1",(void *)&switch_cb,(sn_grs_resource_acl_e)(SN_GRS_GET_ALLOWED|SN_GRS_PUT_ALLOWED),(void *)&init_switch,(char *)NULL,"ns:boolean"); // Action: light on/off
ansond 0:e1c4378df3fe 123 this->createResource(ep_name,"/dev/mdl","Sensinode MBED Light",(void *)&mdltext_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_mdltext,"core#s","ipso:dev-mdl");
ansond 2:a895137e9082 124 this->createResource(ep_name,"/dev/mfg",PLATFORM_STRING,(void *)&mfgtext_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_mfgtext,"core#s","ipso:dev-mfg");
ansond 0:e1c4378df3fe 125 this->createResource("/gps/int","60","core#s","ns:counter");
ansond 0:e1c4378df3fe 126 this->createResource("/gps/fix","1","core#s","ns:boolean");
ansond 0:e1c4378df3fe 127 this->createResource("/nw/pipaddr","N/A","core#s","ns:v4addr");
ansond 0:e1c4378df3fe 128 this->createResource(ep_name,"/nw/prssi","-75",(void *)&rssi_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_rssi,"core#s","ns:rssi");
ansond 0:e1c4378df3fe 129 this->createResource(ep_name,"/dev/W","0.1",(void *)&wattage_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_wattage,(char *)NULL,"ucum:W");
ansond 0:e1c4378df3fe 130 this->createResource(ep_name,"/sen/temp","10.0",(void *)&temp_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_temp,(char *)NULL,"ucum:Cel");
ansond 0:e1c4378df3fe 131 this->createResource(ep_name,"/dev/t","10.0",(void *)&temp_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_temp,(char *)NULL,"ucum:Cel");
ansond 0:e1c4378df3fe 132 this->createResource(ep_name,"/sen/V","5.0",(void *)&voltage_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_voltage,(char *)NULL,"ucum:V");
ansond 0:e1c4378df3fe 133 this->createResource(ep_name,"/dev/V","5.0",(void *)&voltage_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_voltage,(char *)NULL,"ucum:V");
ansond 0:e1c4378df3fe 134 this->createResource(ep_name,"/gps/loc",ENDPOINT_GPS_COORDS,(void *)&gps_location_cb,(sn_grs_resource_acl_e)SN_GRS_GET_ALLOWED,(void *)&init_gps,"core#s","ns:gpsloc");
ansond 0:e1c4378df3fe 135 this->createResource("/ns/nspaddr",NSP_ADDRESS,"core#s","ns:v4addr");
ansond 0:e1c4378df3fe 136 this->createResource(ep_name,"/dev/panic","0",(void *)&switch_cb,(sn_grs_resource_acl_e)(SN_GRS_GET_ALLOWED),(void *)&init_switch,"core#s","ns:panic");
ansond 0:e1c4378df3fe 137
ansond 0:e1c4378df3fe 138 #ifdef MAC_ADDRESS
ansond 0:e1c4378df3fe 139 extern char fmt_mac[RESOURCE_VALUE_LEN+1];
ansond 0:e1c4378df3fe 140 this->createResource("/nw/macaddr",fmt_mac,"core#s","ns:euid64");
ansond 0:e1c4378df3fe 141 #else
ansond 0:e1c4378df3fe 142 this->createResource("/nw/macaddr","00:00:00:00:00","core#s","ns:euid64");
ansond 0:e1c4378df3fe 143 #endif
ansond 0:e1c4378df3fe 144
ansond 0:e1c4378df3fe 145 // finalize the registration
ansond 0:e1c4378df3fe 146 this->finalizeRegistration();
ansond 0:e1c4378df3fe 147 }
ansond 0:e1c4378df3fe 148
ansond 0:e1c4378df3fe 149 // create an NSP resource
ansond 0:e1c4378df3fe 150 void NSPResourceFactory::createResource(char *name,char *value) { this->createResource(name,value,(char *)NULL,(char *)NULL); }
ansond 0:e1c4378df3fe 151 void NSPResourceFactory::createResource(char *name,char *value,char *interface,char *resource) {
ansond 0:e1c4378df3fe 152 this->createResource(this->getEndpointName(),name,value,NULL,SN_GRS_GET_ALLOWED,NULL,interface,resource);
ansond 0:e1c4378df3fe 153 }
ansond 0:e1c4378df3fe 154 void NSPResourceFactory::createResource(char *ep_name,char *name,char *value,void *cb) { this->createResource(ep_name,name,value,cb,(char *)NULL,(char *)NULL); }
ansond 0:e1c4378df3fe 155 void NSPResourceFactory::createResource(char *ep_name,char *name,char *value,void *cb,char *interface, char *resource) {
ansond 0:e1c4378df3fe 156 this->createResource(ep_name,name,value,cb,SN_GRS_GET_ALLOWED,NULL,interface,resource);
ansond 0:e1c4378df3fe 157 }
ansond 0:e1c4378df3fe 158 void NSPResourceFactory::createResource(char *ep_name,char *name,char *value,void *cb,sn_grs_resource_acl_e acl) {
ansond 0:e1c4378df3fe 159 this->createResource(ep_name,name,value,cb,acl,(char *)NULL,(char *)NULL);
ansond 0:e1c4378df3fe 160 }
ansond 0:e1c4378df3fe 161 void NSPResourceFactory::createResource(char *ep_name,char *name,char *value,void *cb,sn_grs_resource_acl_e acl,char *interface, char *resource) {
ansond 0:e1c4378df3fe 162 this->createResource(ep_name,name,value,cb,acl,NULL,interface,resource);
ansond 0:e1c4378df3fe 163 }
ansond 0:e1c4378df3fe 164 void NSPResourceFactory::createResource(char *ep_name,char *name,char *value,void *cb,sn_grs_resource_acl_e acl,void *io) {
ansond 0:e1c4378df3fe 165 this->createResource(ep_name,name,value,cb,acl,io,(char *)NULL,(char *)NULL);
ansond 0:e1c4378df3fe 166 }
ansond 0:e1c4378df3fe 167 void NSPResourceFactory::createResource(char *ep_name,char *name,char *value,void *cb,sn_grs_resource_acl_e acl,void *io,char *interface, char *resource) {
ansond 0:e1c4378df3fe 168 // initialize the resource
ansond 0:e1c4378df3fe 169 this->m_list[this->m_count] = new NSPResource(this->logger(),ep_name,name,value,cb,this->m_resource_ptr,acl,interface,resource);
ansond 0:e1c4378df3fe 170
ansond 0:e1c4378df3fe 171 // call the resource initializer if needed
ansond 0:e1c4378df3fe 172 if (io != NULL && this->m_list[this->m_count] != NULL) {
ansond 0:e1c4378df3fe 173 //this->logger()->log("Calling initializer for %s...",this->m_list[this->m_count]->getName());
ansond 0:e1c4378df3fe 174 resourceInitializer initializer = (resourceInitializer)io;
ansond 0:e1c4378df3fe 175 (initializer)(this->m_list[this->m_count]);
ansond 0:e1c4378df3fe 176 }
ansond 0:e1c4378df3fe 177
ansond 0:e1c4378df3fe 178 // increment the counter
ansond 0:e1c4378df3fe 179 if (this->m_list[this->m_count] != NULL) ++this->m_count;
ansond 0:e1c4378df3fe 180 }
ansond 0:e1c4378df3fe 181
ansond 0:e1c4378df3fe 182 // initialize resource structures if needed
ansond 0:e1c4378df3fe 183 void NSPResourceFactory::initResourceStructures() {
ansond 0:e1c4378df3fe 184 if (this->m_resource_ptr == NULL) {
ansond 0:e1c4378df3fe 185 this->m_resource_ptr = (void *)nsdl_alloc(sizeof(sn_nsdl_resource_info_s));
ansond 0:e1c4378df3fe 186 if (this->m_resource_ptr != NULL) {
ansond 0:e1c4378df3fe 187 memset(this->m_resource_ptr,0,sizeof(sn_nsdl_resource_info_s));
ansond 0:e1c4378df3fe 188 ((sn_nsdl_resource_info_s *)this->m_resource_ptr)->resource_parameters_ptr = (sn_nsdl_resource_parameters_s*)nsdl_alloc(sizeof(sn_nsdl_resource_parameters_s));
ansond 0:e1c4378df3fe 189 if (((sn_nsdl_resource_info_s *)this->m_resource_ptr)->resource_parameters_ptr != NULL) {
ansond 0:e1c4378df3fe 190 memset(((sn_nsdl_resource_info_s *)this->m_resource_ptr)->resource_parameters_ptr,0,sizeof(sn_nsdl_resource_parameters_s));
ansond 0:e1c4378df3fe 191 }
ansond 0:e1c4378df3fe 192 else {
ansond 0:e1c4378df3fe 193 this->logger()->log("NSP: malloc of NSP resource_parameters_ptr FAILED");
ansond 0:e1c4378df3fe 194 this->freeResourceStructures();
ansond 0:e1c4378df3fe 195 }
ansond 0:e1c4378df3fe 196 }
ansond 0:e1c4378df3fe 197 else {
ansond 0:e1c4378df3fe 198 this->logger()->log("NSP: malloc of NSP resource_ptr FAILED");
ansond 0:e1c4378df3fe 199 this->freeResourceStructures();
ansond 0:e1c4378df3fe 200 }
ansond 0:e1c4378df3fe 201 }
ansond 0:e1c4378df3fe 202 }
ansond 0:e1c4378df3fe 203
ansond 0:e1c4378df3fe 204 // free resource structures
ansond 0:e1c4378df3fe 205 void NSPResourceFactory::freeResourceStructures() {
ansond 0:e1c4378df3fe 206 if (this->m_resource_ptr != NULL) {
ansond 0:e1c4378df3fe 207 nsdl_free(((sn_nsdl_resource_info_s *)this->m_resource_ptr)->resource_parameters_ptr);
ansond 0:e1c4378df3fe 208 nsdl_free((sn_nsdl_resource_info_s *)this->m_resource_ptr);
ansond 0:e1c4378df3fe 209 }
ansond 0:e1c4378df3fe 210 this->m_resource_ptr = NULL;
ansond 0:e1c4378df3fe 211 }
ansond 0:e1c4378df3fe 212
ansond 0:e1c4378df3fe 213 // finalize the registrations
ansond 0:e1c4378df3fe 214 void NSPResourceFactory::finalizeRegistration() {
ansond 0:e1c4378df3fe 215 sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
ansond 0:e1c4378df3fe 216
ansond 0:e1c4378df3fe 217 // register the endpoint and its resources with NSP
ansond 0:e1c4378df3fe 218 endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr,(uint8_t*)_endpoint_name,_ep_type,_lifetime_ptr);
ansond 0:e1c4378df3fe 219 if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
ansond 0:e1c4378df3fe 220 this->logger()->log("NSP: Registration of resources for %s FAILED",this->getEndpointName());
ansond 0:e1c4378df3fe 221 else
ansond 0:e1c4378df3fe 222 this->logger()->log("Installed %d NSP resources",this->m_count);
ansond 0:e1c4378df3fe 223
ansond 0:e1c4378df3fe 224 // clean up
ansond 0:e1c4378df3fe 225 if (endpoint_ptr != NULL) nsdl_clean_register_endpoint(&endpoint_ptr);
ansond 0:e1c4378df3fe 226 this->freeResourceStructures();
ansond 0:e1c4378df3fe 227 }