mbed Connector Interface simplification API on top of mbed-client
Fork of mbedConnectorInterfaceV3 by
NOTE:
This repo has been replaced with https://github.com/ARMmbed/mbedConnectorInterface. No further updates will occur with this repo. Please use the github repo instead. Thanks!
Diff: source/DynamicResource.cpp
- Revision:
- 27:b8aaf7dc7023
- Parent:
- 24:c92984bede9c
- Child:
- 33:1d0b855df5a5
diff -r d7b009313e3b -r b8aaf7dc7023 source/DynamicResource.cpp --- a/source/DynamicResource.cpp Sun Jun 12 03:18:25 2016 +0000 +++ b/source/DynamicResource.cpp Tue Jun 14 04:01:34 2016 +0000 @@ -42,9 +42,10 @@ #define DEFAULT_CONTENT_FORMAT 0 // default constructor -DynamicResource::DynamicResource(const Logger *logger,const char *obj_name,const char *res_name,const char *res_type,uint8_t res_mask,const bool observable) : Resource<string>(logger,string(obj_name),string(res_name),string("")) +DynamicResource::DynamicResource(const Logger *logger,const char *obj_name,const char *res_name,const char *res_type,uint8_t res_mask,const bool observable,const ResourceType type) : Resource<string>(logger,string(obj_name),string(res_name),string("")) { this->m_res_type = string(res_type); + this->m_type = type; this->m_observable = observable; this->m_res_mask = res_mask; this->m_obs_number = 0; @@ -52,14 +53,15 @@ this->m_observer = NULL; this->m_maxage = DEFAULT_MAXAGE; this->m_content_format = DEFAULT_CONTENT_FORMAT; - this->m_object = NULL; - this->m_op_processor = NULL; + this->m_ep = NULL; + this->m_res = NULL; } // constructor (input initial value) -DynamicResource::DynamicResource(const Logger *logger,const char *obj_name,const char *res_name,const char *res_type,const string value,uint8_t res_mask,const bool observable) : Resource<string>(logger,string(obj_name),string(res_name),value) +DynamicResource::DynamicResource(const Logger *logger,const char *obj_name,const char *res_name,const char *res_type,const string value,uint8_t res_mask,const bool observable,const ResourceType type) : Resource<string>(logger,string(obj_name),string(res_name),value) { this->m_res_type = string(res_type); + this->m_type = type; this->m_observable = observable; this->m_res_mask = res_mask; this->m_obs_number = 0; @@ -67,14 +69,15 @@ this->m_observer = NULL; this->m_maxage = DEFAULT_MAXAGE; this->m_content_format = DEFAULT_CONTENT_FORMAT; - this->m_object = NULL; - this->m_op_processor = NULL; + this->m_ep = NULL; + this->m_res = NULL; } // constructor (strings) -DynamicResource::DynamicResource(const Logger *logger,const string obj_name,const string res_name,const string res_type,const string value,uint8_t res_mask,const bool observable) : Resource<string>(logger,obj_name,res_name,value) +DynamicResource::DynamicResource(const Logger *logger,const string obj_name,const string res_name,const string res_type,const string value,uint8_t res_mask,const bool observable,const ResourceType type) : Resource<string>(logger,obj_name,res_name,value) { this->m_res_type = res_type; + this->m_type = type; this->m_observable = observable; this->m_res_mask = res_mask; this->m_obs_number = 0; @@ -82,14 +85,15 @@ this->m_observer = NULL; this->m_maxage = DEFAULT_MAXAGE; this->m_content_format = DEFAULT_CONTENT_FORMAT; - this->m_object = NULL; - this->m_op_processor = NULL; + this->m_ep = NULL; + this->m_res = NULL; } // copy constructor DynamicResource::DynamicResource(const DynamicResource &resource) : Resource<string>((const Resource<string> &)resource) { this->m_res_type = resource.m_res_type; + this->m_type = resource.m_type; this->m_observable = resource.m_observable; this->m_res_mask = resource.m_res_mask; this->m_obs_number = resource.m_obs_number; @@ -97,8 +101,8 @@ this->m_observer = resource.m_observer; this->m_maxage = resource.m_maxage; this->m_content_format = resource.m_content_format; - this->m_object = resource.m_object; - this->m_op_processor = resource.m_op_processor; + this->m_ep = resource.m_ep; + this->m_res = resource.m_res; } // destructor @@ -106,79 +110,55 @@ } // bind CoAP Resource... -M2MObject *DynamicResource::bind(void *p) { - if (p != NULL) { - this->m_object = M2MInterfaceFactory::create_object(this->getObjName().c_str()); - if (this->m_object != NULL) { - this->m_obj_instance = this->m_object->create_object_instance(); - if (this->m_obj_instance != NULL) { - this->m_res = this->m_obj_instance->create_dynamic_resource(this->getResName().c_str(),this->m_res_type.c_str(),M2MResourceInstance::STRING,this->m_observable); - if (this->m_res != NULL) { - // perform an initial get() to initialize our data value - this->setValue(this->get()); - - // now record the data value - if (this->getDataWrapper() != NULL) { - // wrap the data... - this->getDataWrapper()->wrap((uint8_t *)this->getValue().c_str(),(int)this->getValue().size()); - this->m_res->set_operation((M2MBase::Operation)this->m_res_mask); - this->m_res->set_value( this->getDataWrapper()->get(),(uint8_t)this->getDataWrapper()->length()); - this->logger()->log("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getDataWrapper()->get(),this->m_observable); - this->m_op_processor = (void *)p; - } - else { - // do not wrap the data... - this->m_res->set_operation((M2MBase::Operation)this->m_res_mask); - this->m_res->set_value((uint8_t *)this->getValue().c_str(),(uint8_t)this->getValue().size()); - this->logger()->log("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getValue().c_str(),this->m_observable); - this->m_op_processor = (void *)p; - } - - // For POST-enabled RESOURCES (only...), we must add a callback - if ((this->m_res_mask & M2MBase::POST_ALLOWED) != 0) { - // add a callback for the execute function...we will just direct through process()... - //this->logger()->log("DynamicResource::bind(): Setting up POST execute callback function"); - this->m_res->set_execute_function(execute_callback(this, &DynamicResource::process_resource_post)); - } - -// DISABLE for now... -#if 0 - // For DELETE-enabled RESOURCES (only...), we must add a callback - if ((this->m_res_mask & M2MBase::DELETE_ALLOWED) != 0) { - // add a callback for the execute function...we will just direct through process()... - //this->logger()->log("DynamicResource::bind(): Setting up DELETE execute callback function"); - this->m_res->set_execute_function(execute_callback(this, &DynamicResource::process_resource_delete)); - } -#endif - } - else { - // create_dynamic_resource() failed - this->logger()->log("%s: Unable to create dynamic resource...",this->m_res_type.c_str()); - delete this->m_object; - this->m_object = NULL; - } - } - else { - // create_object_instance() failed... - this->logger()->log("%s: Unable to create object instance...",this->m_res_type.c_str()); - delete this->m_object; - this->m_object = NULL; - } - } - else { - // create_object() failed - this->logger()->log("%s: Unable to create object...",this->m_res_type.c_str()); - } +void DynamicResource::bind(void *ep) { + if (ep != NULL) { + // cast + Connector::Endpoint *endpoint = (Connector::Endpoint *)ep; + + // get our ObjectInstanceManager + ObjectInstanceManager *oim = endpoint->getObjectInstanceManager(); + + // Create our Resource + this->m_res = (M2MResource *)oim->createDynamicResourceInstance((char *)this->getObjName().c_str(),(char *)this->getResName().c_str(),(char *)this->m_res_type.c_str(),(int)this->m_type,this->m_observable); + if (this->m_res != NULL) { + // perform an initial get() to initialize our data value + this->setValue(this->get()); + + // now record the data value + if (this->getDataWrapper() != NULL) { + // wrap the data... + this->getDataWrapper()->wrap((uint8_t *)this->getValue().c_str(),(int)this->getValue().size()); + this->m_res->set_operation((M2MBase::Operation)this->m_res_mask); + this->m_res->set_value( this->getDataWrapper()->get(),(uint8_t)this->getDataWrapper()->length()); + this->logger()->log("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getDataWrapper()->get(),this->m_observable); + } + else { + // do not wrap the data... + this->m_res->set_operation((M2MBase::Operation)this->m_res_mask); + this->m_res->set_value((uint8_t *)this->getValue().c_str(),(uint8_t)this->getValue().size()); + this->logger()->log("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getValue().c_str(),this->m_observable); + } + + // set our endpoint instance + this->m_ep = (void *)ep; + + // For POST-enabled RESOURCES (only...), we must add a callback + if ((this->m_res_mask & M2MBase::POST_ALLOWED) != 0) { + // add a callback for the execute function...we will just direct through process()... + //this->logger()->log("DynamicResource::bind(): Setting up POST execute callback function"); + this->m_res->set_execute_function(execute_callback(this, &DynamicResource::process_resource_post)); + } + } } else { - this->logger()->log("%s: NULL value parameter in bind() request...",this->m_res_type.c_str()); + // no instance pointer to our endpoint + this->logger()->log("%s: NULL endpoint instance pointer in bind() request...",this->m_res_type.c_str()); } - return this->m_object; } // get our M2MBase representation -M2MBase *DynamicResource::getResource() { - return (M2MBase *)this->m_res; +M2MResource *DynamicResource::getResource() { + return this->m_res; } // process inbound mbed-client POST message for a Resource @@ -188,13 +168,6 @@ (void)this->process(M2MBase::POST_ALLOWED,this->m_res->base_type(),args); } -// process inbound mbed-client DELETE message for a Resource -void DynamicResource::process_resource_delete(void *args) { - // just call process() for DELETE and Resources... - //this->logger()->log("DynamicResource::process_resource_delete(): calling process(DELETE)"); - (void)this->process(M2MBase::DELETE_ALLOWED,this->m_res->base_type(),args); -} - // process inbound mbed-client message uint8_t DynamicResource::process(M2MBase::Operation op,M2MBase::BaseType type,void *args) { #if defined (HAS_EXECUTE_PARAMS) @@ -334,6 +307,14 @@ return status; } +// default GET (does nothing) +string DynamicResource::get() +{ + // not used by default + this->logger()->log("DynamicResource::get() invoked (NOOP)"); + return string(""); +} + // default PUT (does nothing) void DynamicResource::put(const string value) { @@ -377,7 +358,7 @@ this->m_maxage = maxage; } -// convenience method to get the URI from its buffer field... +// convert the CoAP data pointer to a string type string DynamicResource::coapDataToString(uint8_t *coap_data_ptr,int coap_data_ptr_length) { if (coap_data_ptr != NULL && coap_data_ptr_length > 0) { @@ -398,6 +379,53 @@ return string(""); } +// convert the CoAP data pointer to an integer type +int DynamicResource::coapDataToInteger(uint8_t *coap_data_ptr,int coap_data_ptr_length) { + int value = 0; + if (coap_data_ptr != NULL && coap_data_ptr_length > 0) { + if (this->getDataWrapper() != NULL) { + // unwrap the data... + this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length); + //value = (int)this->getDataWrapper()->get(); // assumes data is null terminated in DataWrapper... + } + else { + // no unwrap of the data... + //value = (int)coap_data_ptr; + } + } + return value; +} + +// convert the CoAP data pointer to a float type +float DynamicResource::coapDataToFloat(uint8_t *coap_data_ptr,int coap_data_ptr_length) { + float value = 0.0; + if (coap_data_ptr != NULL && coap_data_ptr_length > 0) { + if (this->getDataWrapper() != NULL) { + // unwrap the data... + this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length); + //value = (float)this->getDataWrapper()->get(); // assumes data is null terminated in DataWrapper... + } + else { + // no unwrap of the data... + //value = (float)coap_data_ptr; + } + } + return value; +} + +// convert the CoAP data pointer to an opaque type +void *DynamicResource::coapDataToOpaque(uint8_t *coap_data_ptr,int coap_data_ptr_length) { + if (coap_data_ptr != NULL && coap_data_ptr_length > 0) { + if (this->getDataWrapper() != NULL) { + // unwrap the data... + this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length); + char *buf = (char *)this->getDataWrapper()->get(); // assumes data is null terminated in DataWrapper... + return (void *)buf; + } + } + return (void *)coap_data_ptr; +} + // Determine if we are connected or not bool DynamicResource::isConnected() { bool is_connected = false;