This is the sample program that can see the decode result of barcode data on Watson IoT.

Dependencies:   AsciiFont DisplayApp GR-PEACH_video LCD_shield_config LWIPBP3595Interface_STA_for_mbed-os USBDevice

Committer:
Osamu Nakamura
Date:
Thu Nov 10 20:23:55 2016 +0900
Revision:
1:67f8b5cfde75
Parent:
0:7d720671e6dc
Revised the initial value of /888/0/7700

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Osamu Nakamura 0:7d720671e6dc 1 /**
Osamu Nakamura 0:7d720671e6dc 2 * @file DynamicResource.cpp
Osamu Nakamura 0:7d720671e6dc 3 * @brief mbed CoAP Endpoint Dynamic Resource class
Osamu Nakamura 0:7d720671e6dc 4 * @author Doug Anson/Chris Paola
Osamu Nakamura 0:7d720671e6dc 5 * @version 1.0
Osamu Nakamura 0:7d720671e6dc 6 * @see
Osamu Nakamura 0:7d720671e6dc 7 *
Osamu Nakamura 0:7d720671e6dc 8 * Copyright (c) 2014
Osamu Nakamura 0:7d720671e6dc 9 *
Osamu Nakamura 0:7d720671e6dc 10 * Licensed under the Apache License, Version 2.0 (the "License");
Osamu Nakamura 0:7d720671e6dc 11 * you may not use this file except in compliance with the License.
Osamu Nakamura 0:7d720671e6dc 12 * You may obtain a copy of the License at
Osamu Nakamura 0:7d720671e6dc 13 *
Osamu Nakamura 0:7d720671e6dc 14 * http://www.apache.org/licenses/LICENSE-2.0
Osamu Nakamura 0:7d720671e6dc 15 *
Osamu Nakamura 0:7d720671e6dc 16 * Unless required by applicable law or agreed to in writing, software
Osamu Nakamura 0:7d720671e6dc 17 * distributed under the License is distributed on an "AS IS" BASIS,
Osamu Nakamura 0:7d720671e6dc 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Osamu Nakamura 0:7d720671e6dc 19 * See the License for the specific language governing permissions and
Osamu Nakamura 0:7d720671e6dc 20 * limitations under the License.
Osamu Nakamura 0:7d720671e6dc 21 */
Osamu Nakamura 0:7d720671e6dc 22
Osamu Nakamura 0:7d720671e6dc 23 // Class support
Osamu Nakamura 0:7d720671e6dc 24 #include "mbed-connector-interface/DynamicResource.h"
Osamu Nakamura 0:7d720671e6dc 25
Osamu Nakamura 0:7d720671e6dc 26 // ResourceObserver help
Osamu Nakamura 0:7d720671e6dc 27 #include "mbed-connector-interface/ResourceObserver.h"
Osamu Nakamura 0:7d720671e6dc 28
Osamu Nakamura 0:7d720671e6dc 29 // Options enablement
Osamu Nakamura 0:7d720671e6dc 30 #include "mbed-connector-interface/Options.h"
Osamu Nakamura 0:7d720671e6dc 31
Osamu Nakamura 0:7d720671e6dc 32 // Endpoint
Osamu Nakamura 0:7d720671e6dc 33 #include "mbed-connector-interface/ConnectorEndpoint.h"
Osamu Nakamura 0:7d720671e6dc 34
Osamu Nakamura 0:7d720671e6dc 35 // GET option that can be used to Start/Stop Observations...
Osamu Nakamura 0:7d720671e6dc 36 #define START_OBS 0
Osamu Nakamura 0:7d720671e6dc 37 #define STOP_OBS 1
Osamu Nakamura 0:7d720671e6dc 38
Osamu Nakamura 0:7d720671e6dc 39 // MaxAge support for each DynamicResource
Osamu Nakamura 0:7d720671e6dc 40 #define DEFAULT_MAXAGE 60
Osamu Nakamura 0:7d720671e6dc 41
Osamu Nakamura 0:7d720671e6dc 42 // ContentFormat defaults for each DynamicResource
Osamu Nakamura 0:7d720671e6dc 43 #define DEFAULT_CONTENT_FORMAT 0
Osamu Nakamura 0:7d720671e6dc 44
Osamu Nakamura 0:7d720671e6dc 45 // default constructor
Osamu Nakamura 0:7d720671e6dc 46 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(""))
Osamu Nakamura 0:7d720671e6dc 47 {
Osamu Nakamura 0:7d720671e6dc 48 this->m_res_type = string(res_type);
Osamu Nakamura 0:7d720671e6dc 49 this->m_type = type;
Osamu Nakamura 0:7d720671e6dc 50 this->m_observable = observable;
Osamu Nakamura 0:7d720671e6dc 51 this->m_res_mask = res_mask;
Osamu Nakamura 0:7d720671e6dc 52 this->m_obs_number = 0;
Osamu Nakamura 0:7d720671e6dc 53 this->m_data_wrapper = NULL;
Osamu Nakamura 0:7d720671e6dc 54 this->m_observer = NULL;
Osamu Nakamura 0:7d720671e6dc 55 this->m_maxage = DEFAULT_MAXAGE;
Osamu Nakamura 0:7d720671e6dc 56 this->m_content_format = DEFAULT_CONTENT_FORMAT;
Osamu Nakamura 0:7d720671e6dc 57 this->m_ep = NULL;
Osamu Nakamura 0:7d720671e6dc 58 this->m_res = NULL;
Osamu Nakamura 0:7d720671e6dc 59 }
Osamu Nakamura 0:7d720671e6dc 60
Osamu Nakamura 0:7d720671e6dc 61 // constructor (input initial value)
Osamu Nakamura 0:7d720671e6dc 62 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)
Osamu Nakamura 0:7d720671e6dc 63 {
Osamu Nakamura 0:7d720671e6dc 64 this->m_res_type = string(res_type);
Osamu Nakamura 0:7d720671e6dc 65 this->m_type = type;
Osamu Nakamura 0:7d720671e6dc 66 this->m_observable = observable;
Osamu Nakamura 0:7d720671e6dc 67 this->m_res_mask = res_mask;
Osamu Nakamura 0:7d720671e6dc 68 this->m_obs_number = 0;
Osamu Nakamura 0:7d720671e6dc 69 this->m_data_wrapper = NULL;
Osamu Nakamura 0:7d720671e6dc 70 this->m_observer = NULL;
Osamu Nakamura 0:7d720671e6dc 71 this->m_maxage = DEFAULT_MAXAGE;
Osamu Nakamura 0:7d720671e6dc 72 this->m_content_format = DEFAULT_CONTENT_FORMAT;
Osamu Nakamura 0:7d720671e6dc 73 this->m_ep = NULL;
Osamu Nakamura 0:7d720671e6dc 74 this->m_res = NULL;
Osamu Nakamura 0:7d720671e6dc 75 }
Osamu Nakamura 0:7d720671e6dc 76
Osamu Nakamura 0:7d720671e6dc 77 // constructor (strings)
Osamu Nakamura 0:7d720671e6dc 78 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)
Osamu Nakamura 0:7d720671e6dc 79 {
Osamu Nakamura 0:7d720671e6dc 80 this->m_res_type = res_type;
Osamu Nakamura 0:7d720671e6dc 81 this->m_type = type;
Osamu Nakamura 0:7d720671e6dc 82 this->m_observable = observable;
Osamu Nakamura 0:7d720671e6dc 83 this->m_res_mask = res_mask;
Osamu Nakamura 0:7d720671e6dc 84 this->m_obs_number = 0;
Osamu Nakamura 0:7d720671e6dc 85 this->m_data_wrapper = NULL;
Osamu Nakamura 0:7d720671e6dc 86 this->m_observer = NULL;
Osamu Nakamura 0:7d720671e6dc 87 this->m_maxage = DEFAULT_MAXAGE;
Osamu Nakamura 0:7d720671e6dc 88 this->m_content_format = DEFAULT_CONTENT_FORMAT;
Osamu Nakamura 0:7d720671e6dc 89 this->m_ep = NULL;
Osamu Nakamura 0:7d720671e6dc 90 this->m_res = NULL;
Osamu Nakamura 0:7d720671e6dc 91 }
Osamu Nakamura 0:7d720671e6dc 92
Osamu Nakamura 0:7d720671e6dc 93 // copy constructor
Osamu Nakamura 0:7d720671e6dc 94 DynamicResource::DynamicResource(const DynamicResource &resource) : Resource<string>((const Resource<string> &)resource)
Osamu Nakamura 0:7d720671e6dc 95 {
Osamu Nakamura 0:7d720671e6dc 96 this->m_res_type = resource.m_res_type;
Osamu Nakamura 0:7d720671e6dc 97 this->m_type = resource.m_type;
Osamu Nakamura 0:7d720671e6dc 98 this->m_observable = resource.m_observable;
Osamu Nakamura 0:7d720671e6dc 99 this->m_res_mask = resource.m_res_mask;
Osamu Nakamura 0:7d720671e6dc 100 this->m_obs_number = resource.m_obs_number;
Osamu Nakamura 0:7d720671e6dc 101 this->m_data_wrapper = resource.m_data_wrapper;
Osamu Nakamura 0:7d720671e6dc 102 this->m_observer = resource.m_observer;
Osamu Nakamura 0:7d720671e6dc 103 this->m_maxage = resource.m_maxage;
Osamu Nakamura 0:7d720671e6dc 104 this->m_content_format = resource.m_content_format;
Osamu Nakamura 0:7d720671e6dc 105 this->m_ep = resource.m_ep;
Osamu Nakamura 0:7d720671e6dc 106 this->m_res = resource.m_res;
Osamu Nakamura 0:7d720671e6dc 107 }
Osamu Nakamura 0:7d720671e6dc 108
Osamu Nakamura 0:7d720671e6dc 109 // destructor
Osamu Nakamura 0:7d720671e6dc 110 DynamicResource::~DynamicResource() {
Osamu Nakamura 0:7d720671e6dc 111 }
Osamu Nakamura 0:7d720671e6dc 112
Osamu Nakamura 0:7d720671e6dc 113 // bind CoAP Resource...
Osamu Nakamura 0:7d720671e6dc 114 void DynamicResource::bind(void *ep) {
Osamu Nakamura 0:7d720671e6dc 115 if (ep != NULL) {
Osamu Nakamura 0:7d720671e6dc 116 // cast
Osamu Nakamura 0:7d720671e6dc 117 Connector::Endpoint *endpoint = (Connector::Endpoint *)ep;
Osamu Nakamura 0:7d720671e6dc 118
Osamu Nakamura 0:7d720671e6dc 119 // get our ObjectInstanceManager
Osamu Nakamura 0:7d720671e6dc 120 ObjectInstanceManager *oim = endpoint->getObjectInstanceManager();
Osamu Nakamura 0:7d720671e6dc 121
Osamu Nakamura 0:7d720671e6dc 122 // Create our Resource
Osamu Nakamura 0:7d720671e6dc 123 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);
Osamu Nakamura 0:7d720671e6dc 124 if (this->m_res != NULL) {
Osamu Nakamura 0:7d720671e6dc 125 // Record our Instance Number
Osamu Nakamura 0:7d720671e6dc 126 this->setInstanceNumber(oim->getLastCreatedInstanceNumber());
Osamu Nakamura 0:7d720671e6dc 127
Osamu Nakamura 0:7d720671e6dc 128 // perform an initial get() to initialize our data value
Osamu Nakamura 0:7d720671e6dc 129 this->setValue(this->get());
Osamu Nakamura 0:7d720671e6dc 130
Osamu Nakamura 0:7d720671e6dc 131 // now record the data value
Osamu Nakamura 0:7d720671e6dc 132 if (this->getDataWrapper() != NULL) {
Osamu Nakamura 0:7d720671e6dc 133 // wrap the data...
Osamu Nakamura 0:7d720671e6dc 134 this->getDataWrapper()->wrap((uint8_t *)this->getValue().c_str(),(int)this->getValue().size());
Osamu Nakamura 0:7d720671e6dc 135 this->m_res->set_operation((M2MBase::Operation)this->m_res_mask);
Osamu Nakamura 0:7d720671e6dc 136 this->m_res->set_value( this->getDataWrapper()->get(),(uint8_t)this->getDataWrapper()->length());
Osamu Nakamura 0:7d720671e6dc 137 this->logger()->logging("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getDataWrapper()->get(),this->m_observable);
Osamu Nakamura 0:7d720671e6dc 138 }
Osamu Nakamura 0:7d720671e6dc 139 else {
Osamu Nakamura 0:7d720671e6dc 140 // do not wrap the data...
Osamu Nakamura 0:7d720671e6dc 141 this->m_res->set_operation((M2MBase::Operation)this->m_res_mask);
Osamu Nakamura 0:7d720671e6dc 142 this->m_res->set_value((uint8_t *)this->getValue().c_str(),(uint8_t)this->getValue().size());
Osamu Nakamura 0:7d720671e6dc 143 this->logger()->logging("%s: [%s] value: [%s] bound (observable: %d)",this->m_res_type.c_str(),this->getFullName().c_str(),this->getValue().c_str(),this->m_observable);
Osamu Nakamura 0:7d720671e6dc 144 }
Osamu Nakamura 0:7d720671e6dc 145
Osamu Nakamura 0:7d720671e6dc 146 // set our endpoint instance
Osamu Nakamura 0:7d720671e6dc 147 this->m_ep = (void *)ep;
Osamu Nakamura 0:7d720671e6dc 148
Osamu Nakamura 0:7d720671e6dc 149 // For POST-enabled RESOURCES (only...), we must add a callback
Osamu Nakamura 0:7d720671e6dc 150 if ((this->m_res_mask & M2MBase::POST_ALLOWED) != 0) {
Osamu Nakamura 0:7d720671e6dc 151 // add a callback for the execute function...we will just direct through process()...
Osamu Nakamura 0:7d720671e6dc 152 //this->logger()->logging("DynamicResource::bind(): Setting up POST execute callback function");
Osamu Nakamura 0:7d720671e6dc 153 this->m_res->set_execute_function(execute_callback(this, &DynamicResource::process_resource_post));
Osamu Nakamura 0:7d720671e6dc 154 }
Osamu Nakamura 0:7d720671e6dc 155 }
Osamu Nakamura 0:7d720671e6dc 156 }
Osamu Nakamura 0:7d720671e6dc 157 else {
Osamu Nakamura 0:7d720671e6dc 158 // no instance pointer to our endpoint
Osamu Nakamura 0:7d720671e6dc 159 this->logger()->logging("%s: NULL endpoint instance pointer in bind() request...",this->m_res_type.c_str());
Osamu Nakamura 0:7d720671e6dc 160 }
Osamu Nakamura 0:7d720671e6dc 161 }
Osamu Nakamura 0:7d720671e6dc 162
Osamu Nakamura 0:7d720671e6dc 163 // get our M2MBase representation
Osamu Nakamura 0:7d720671e6dc 164 M2MResource *DynamicResource::getResource() {
Osamu Nakamura 0:7d720671e6dc 165 return this->m_res;
Osamu Nakamura 0:7d720671e6dc 166 }
Osamu Nakamura 0:7d720671e6dc 167
Osamu Nakamura 0:7d720671e6dc 168 // process inbound mbed-client POST message for a Resource
Osamu Nakamura 0:7d720671e6dc 169 void DynamicResource::process_resource_post(void *args) {
Osamu Nakamura 0:7d720671e6dc 170 // just call process() for POST and Resources...
Osamu Nakamura 0:7d720671e6dc 171 //this->logger()->logging("DynamicResource::process_resource_post(): calling process(POST)");
Osamu Nakamura 0:7d720671e6dc 172 (void)this->process(M2MBase::POST_ALLOWED,this->m_res->base_type(),args);
Osamu Nakamura 0:7d720671e6dc 173 }
Osamu Nakamura 0:7d720671e6dc 174
Osamu Nakamura 0:7d720671e6dc 175 // process inbound mbed-client message
Osamu Nakamura 0:7d720671e6dc 176 uint8_t DynamicResource::process(M2MBase::Operation op,M2MBase::BaseType type,void *args) {
Osamu Nakamura 0:7d720671e6dc 177 #if defined (HAS_EXECUTE_PARAMS)
Osamu Nakamura 0:7d720671e6dc 178 M2MResource::M2MExecuteParameter* param = NULL;
Osamu Nakamura 0:7d720671e6dc 179
Osamu Nakamura 0:7d720671e6dc 180 // cast args if present...
Osamu Nakamura 0:7d720671e6dc 181 if (args != NULL) {
Osamu Nakamura 0:7d720671e6dc 182 param = (M2MResource::M2MExecuteParameter*)args;
Osamu Nakamura 0:7d720671e6dc 183 }
Osamu Nakamura 0:7d720671e6dc 184 #endif
Osamu Nakamura 0:7d720671e6dc 185 // DEBUG
Osamu Nakamura 0:7d720671e6dc 186 //this->logger()->logging("in %s::process() Operation=0x0%x Type=%x%x",this->m_res_type.c_str(),op,type);
Osamu Nakamura 0:7d720671e6dc 187
Osamu Nakamura 0:7d720671e6dc 188 // PUT() check
Osamu Nakamura 0:7d720671e6dc 189 if ((op & M2MBase::PUT_ALLOWED) != 0) {
Osamu Nakamura 0:7d720671e6dc 190 string value = this->coapDataToString(this->m_res->value(),this->m_res->value_length());
Osamu Nakamura 0:7d720671e6dc 191 this->logger()->logging("%s: put(%d) [%s]=[%s] called.",this->m_res_type.c_str(),type,this->getFullName().c_str(),value.c_str());
Osamu Nakamura 0:7d720671e6dc 192 this->put(value.c_str());
Osamu Nakamura 0:7d720671e6dc 193 return 0;
Osamu Nakamura 0:7d720671e6dc 194 }
Osamu Nakamura 0:7d720671e6dc 195
Osamu Nakamura 0:7d720671e6dc 196 #if defined (HAS_EXECUTE_PARAMS)
Osamu Nakamura 0:7d720671e6dc 197 // POST() check
Osamu Nakamura 0:7d720671e6dc 198 if ((op & M2MBase::POST_ALLOWED) != 0) {
Osamu Nakamura 0:7d720671e6dc 199 string value;
Osamu Nakamura 0:7d720671e6dc 200 if (param != NULL) {
Osamu Nakamura 0:7d720671e6dc 201 // use parameters
Osamu Nakamura 0:7d720671e6dc 202 String object_name = param->get_argument_object_name();
Osamu Nakamura 0:7d720671e6dc 203 int instance_id = (int)param->get_argument_object_instance_id();
Osamu Nakamura 0:7d720671e6dc 204 String resource_name = param->get_argument_resource_name();
Osamu Nakamura 0:7d720671e6dc 205 value = this->coapDataToString(param->get_argument_value(),param->get_argument_value_length());
Osamu Nakamura 0:7d720671e6dc 206 this->logger()->logging("%s: post(%d) [%s/%d/%s]=[%s]) called.",this->m_res_type.c_str(),type,object_name.c_str(),instance_id,resource_name.c_str(),value.c_str());
Osamu Nakamura 0:7d720671e6dc 207 }
Osamu Nakamura 0:7d720671e6dc 208 else {
Osamu Nakamura 0:7d720671e6dc 209 // use the resource value itself
Osamu Nakamura 0:7d720671e6dc 210 value = this->coapDataToString(this->m_res->value(),this->m_res->value_length());
Osamu Nakamura 0:7d720671e6dc 211 this->logger()->logging("%s: post(%d) [%s]=[%s] called.",this->m_res_type.c_str(),type,this->getFullName().c_str(),value.c_str());
Osamu Nakamura 0:7d720671e6dc 212 }
Osamu Nakamura 0:7d720671e6dc 213
Osamu Nakamura 0:7d720671e6dc 214 // invoke
Osamu Nakamura 0:7d720671e6dc 215 this->post(args);
Osamu Nakamura 0:7d720671e6dc 216 return 0;
Osamu Nakamura 0:7d720671e6dc 217 }
Osamu Nakamura 0:7d720671e6dc 218 #else
Osamu Nakamura 0:7d720671e6dc 219 // POST() check
Osamu Nakamura 0:7d720671e6dc 220 if ((op & M2MBase::POST_ALLOWED) != 0) {
Osamu Nakamura 0:7d720671e6dc 221 if (args != NULL) {
Osamu Nakamura 0:7d720671e6dc 222 this->logger()->logging("%s: post(%d) [%s]=[%s] called.",this->m_res_type.c_str(),type,this->getFullName().c_str(),(char *)args);
Osamu Nakamura 0:7d720671e6dc 223 this->post(args);
Osamu Nakamura 0:7d720671e6dc 224 }
Osamu Nakamura 0:7d720671e6dc 225 else {
Osamu Nakamura 0:7d720671e6dc 226 string value = this->coapDataToString(this->m_res->value(),this->m_res->value_length());
Osamu Nakamura 0:7d720671e6dc 227 this->logger()->logging("%s: post(%d) [%s]=[%s] called.",this->m_res_type.c_str(),type,this->getFullName().c_str(),value.c_str());
Osamu Nakamura 0:7d720671e6dc 228 this->post((void *)value.c_str());
Osamu Nakamura 0:7d720671e6dc 229 }
Osamu Nakamura 0:7d720671e6dc 230 return 0;
Osamu Nakamura 0:7d720671e6dc 231 }
Osamu Nakamura 0:7d720671e6dc 232 #endif
Osamu Nakamura 0:7d720671e6dc 233
Osamu Nakamura 0:7d720671e6dc 234 #if defined (HAS_EXECUTE_PARAMS)
Osamu Nakamura 0:7d720671e6dc 235 // DELETE() check
Osamu Nakamura 0:7d720671e6dc 236 if ((op & M2MBase::DELETE_ALLOWED) != 0) {
Osamu Nakamura 0:7d720671e6dc 237 if (param != NULL) {
Osamu Nakamura 0:7d720671e6dc 238 // use parameters
Osamu Nakamura 0:7d720671e6dc 239 String object_name = param->get_argument_object_name();
Osamu Nakamura 0:7d720671e6dc 240 int instance_id = (int)param->get_argument_object_instance_id();
Osamu Nakamura 0:7d720671e6dc 241 String resource_name = param->get_argument_resource_name();
Osamu Nakamura 0:7d720671e6dc 242 string value = this->coapDataToString(param->get_argument_value(),param->get_argument_value_length());
Osamu Nakamura 0:7d720671e6dc 243 this->logger()->logging("%s: delete(%d) [%s/%d/%s]=[%s]) called.",this->m_res_type.c_str(),type,object_name.c_str(),instance_id,resource_name.c_str(),value.c_str());
Osamu Nakamura 0:7d720671e6dc 244 }
Osamu Nakamura 0:7d720671e6dc 245 else {
Osamu Nakamura 0:7d720671e6dc 246 // use the resource value itself
Osamu Nakamura 0:7d720671e6dc 247 string value = this->coapDataToString(this->m_res->value(),this->m_res->value_length());
Osamu Nakamura 0:7d720671e6dc 248 this->logger()->logging("%s: delete(%d) [%s]=[%s] called.",this->m_res_type.c_str(),type,this->getFullName().c_str(),value.c_str());
Osamu Nakamura 0:7d720671e6dc 249 }
Osamu Nakamura 0:7d720671e6dc 250
Osamu Nakamura 0:7d720671e6dc 251 // invoke
Osamu Nakamura 0:7d720671e6dc 252 this->del(args);
Osamu Nakamura 0:7d720671e6dc 253 return 0;
Osamu Nakamura 0:7d720671e6dc 254 }
Osamu Nakamura 0:7d720671e6dc 255 #else
Osamu Nakamura 0:7d720671e6dc 256 // DELETE() check
Osamu Nakamura 0:7d720671e6dc 257 if ((op & M2MBase::DELETE_ALLOWED) != 0) {
Osamu Nakamura 0:7d720671e6dc 258 if (args != NULL) {
Osamu Nakamura 0:7d720671e6dc 259 this->logger()->logging("%s: delete(%d) [%s]=[%s] called.",this->m_res_type.c_str(),type,this->getFullName().c_str(),(char *)args);
Osamu Nakamura 0:7d720671e6dc 260 this->del(args);
Osamu Nakamura 0:7d720671e6dc 261 }
Osamu Nakamura 0:7d720671e6dc 262 else {
Osamu Nakamura 0:7d720671e6dc 263 string value = this->coapDataToString(this->m_res->value(),this->m_res->value_length());
Osamu Nakamura 0:7d720671e6dc 264 this->logger()->logging("%s: delete(%d) [%s]=[%s] called.",this->m_res_type.c_str(),type,this->getFullName().c_str(),value.c_str());
Osamu Nakamura 0:7d720671e6dc 265 this->del((void *)value.c_str());
Osamu Nakamura 0:7d720671e6dc 266 }
Osamu Nakamura 0:7d720671e6dc 267 }
Osamu Nakamura 0:7d720671e6dc 268 #endif
Osamu Nakamura 0:7d720671e6dc 269
Osamu Nakamura 0:7d720671e6dc 270 // unknown type...
Osamu Nakamura 0:7d720671e6dc 271 this->logger()->logging("%s: Unknown Operation (0x%x) for [%s]=[%s]... FAILED.",op,this->m_res_type.c_str(),this->getFullName().c_str(),this->m_res->value());
Osamu Nakamura 0:7d720671e6dc 272 return 1;
Osamu Nakamura 0:7d720671e6dc 273 }
Osamu Nakamura 0:7d720671e6dc 274
Osamu Nakamura 0:7d720671e6dc 275 // send the notification
Osamu Nakamura 0:7d720671e6dc 276 int DynamicResource::notify(const string data) {
Osamu Nakamura 0:7d720671e6dc 277 return this->notify((uint8_t *)data.c_str(),(int)data.length());
Osamu Nakamura 0:7d720671e6dc 278 }
Osamu Nakamura 0:7d720671e6dc 279
Osamu Nakamura 0:7d720671e6dc 280 // send the notification
Osamu Nakamura 0:7d720671e6dc 281 int DynamicResource::notify(uint8_t *data,int data_length) {
Osamu Nakamura 0:7d720671e6dc 282 uint8_t *notify_data = NULL;
Osamu Nakamura 0:7d720671e6dc 283 int notify_data_length = 0;
Osamu Nakamura 0:7d720671e6dc 284 int status = 0;
Osamu Nakamura 0:7d720671e6dc 285
Osamu Nakamura 0:7d720671e6dc 286 // convert the string from the GET to something suitable for CoAP payloads
Osamu Nakamura 0:7d720671e6dc 287 if (this->getDataWrapper() != NULL) {
Osamu Nakamura 0:7d720671e6dc 288 // wrap the data...
Osamu Nakamura 0:7d720671e6dc 289 this->getDataWrapper()->wrap((uint8_t *)data,data_length);
Osamu Nakamura 0:7d720671e6dc 290
Osamu Nakamura 0:7d720671e6dc 291 // announce (after wrap)
Osamu Nakamura 0:7d720671e6dc 292 //this->logger()->logging("Notify payload [%s]...",this->getDataWrapper()->get());
Osamu Nakamura 0:7d720671e6dc 293
Osamu Nakamura 0:7d720671e6dc 294 // fill notify
Osamu Nakamura 0:7d720671e6dc 295 notify_data_length = this->getDataWrapper()->length();
Osamu Nakamura 0:7d720671e6dc 296 notify_data = this->getDataWrapper()->get();
Osamu Nakamura 0:7d720671e6dc 297 }
Osamu Nakamura 0:7d720671e6dc 298 else {
Osamu Nakamura 0:7d720671e6dc 299 // announce (no wrap)
Osamu Nakamura 0:7d720671e6dc 300 //this->logger()->logging("Notify payload [%s]...",data);
Osamu Nakamura 0:7d720671e6dc 301
Osamu Nakamura 0:7d720671e6dc 302 // do not wrap the data...
Osamu Nakamura 0:7d720671e6dc 303 notify_data_length = data_length;
Osamu Nakamura 0:7d720671e6dc 304 notify_data = data;
Osamu Nakamura 0:7d720671e6dc 305 }
Osamu Nakamura 0:7d720671e6dc 306
Osamu Nakamura 0:7d720671e6dc 307 // update the resource
Osamu Nakamura 0:7d720671e6dc 308 this->m_res->set_value((uint8_t *)notify_data,(uint8_t)notify_data_length);
Osamu Nakamura 0:7d720671e6dc 309
Osamu Nakamura 0:7d720671e6dc 310 // return our status
Osamu Nakamura 0:7d720671e6dc 311 return status;
Osamu Nakamura 0:7d720671e6dc 312 }
Osamu Nakamura 0:7d720671e6dc 313
Osamu Nakamura 0:7d720671e6dc 314 // default GET (does nothing)
Osamu Nakamura 0:7d720671e6dc 315 string DynamicResource::get()
Osamu Nakamura 0:7d720671e6dc 316 {
Osamu Nakamura 0:7d720671e6dc 317 // not used by default
Osamu Nakamura 0:7d720671e6dc 318 //this->logger()->logging("DynamicResource::get() invoked (NOOP)");
Osamu Nakamura 0:7d720671e6dc 319 return string("");
Osamu Nakamura 0:7d720671e6dc 320 }
Osamu Nakamura 0:7d720671e6dc 321
Osamu Nakamura 0:7d720671e6dc 322 // default PUT (does nothing)
Osamu Nakamura 0:7d720671e6dc 323 void DynamicResource::put(const string /* value */)
Osamu Nakamura 0:7d720671e6dc 324 {
Osamu Nakamura 0:7d720671e6dc 325 // not used by default
Osamu Nakamura 0:7d720671e6dc 326 //this->logger()->logging("DynamicResource::put() invoked (NOOP)");
Osamu Nakamura 0:7d720671e6dc 327 }
Osamu Nakamura 0:7d720671e6dc 328
Osamu Nakamura 0:7d720671e6dc 329 // default POST (does nothing)
Osamu Nakamura 0:7d720671e6dc 330 void DynamicResource::post(void * /* args */)
Osamu Nakamura 0:7d720671e6dc 331 {
Osamu Nakamura 0:7d720671e6dc 332 // not used by default
Osamu Nakamura 0:7d720671e6dc 333 //this->logger()->logging("DynamicResource::post() invoked (NOOP)");
Osamu Nakamura 0:7d720671e6dc 334 }
Osamu Nakamura 0:7d720671e6dc 335
Osamu Nakamura 0:7d720671e6dc 336 // default DELETE (does nothing)
Osamu Nakamura 0:7d720671e6dc 337 void DynamicResource::del(void * /* args */)
Osamu Nakamura 0:7d720671e6dc 338 {
Osamu Nakamura 0:7d720671e6dc 339 // not used by default
Osamu Nakamura 0:7d720671e6dc 340 //this->logger()->logging("DynamicResource::del() invoked (NOOP)");
Osamu Nakamura 0:7d720671e6dc 341 }
Osamu Nakamura 0:7d720671e6dc 342
Osamu Nakamura 0:7d720671e6dc 343 // default observe behavior
Osamu Nakamura 0:7d720671e6dc 344 void DynamicResource::observe() {
Osamu Nakamura 0:7d720671e6dc 345 if (this->m_observable == true && this->isRegistered() == true) {
Osamu Nakamura 0:7d720671e6dc 346 this->notify(this->get());
Osamu Nakamura 0:7d720671e6dc 347 }
Osamu Nakamura 0:7d720671e6dc 348 }
Osamu Nakamura 0:7d720671e6dc 349
Osamu Nakamura 0:7d720671e6dc 350 // set the observer pointer
Osamu Nakamura 0:7d720671e6dc 351 void DynamicResource::setObserver(void *observer) {
Osamu Nakamura 0:7d720671e6dc 352 this->m_observer = observer;
Osamu Nakamura 0:7d720671e6dc 353 }
Osamu Nakamura 0:7d720671e6dc 354
Osamu Nakamura 0:7d720671e6dc 355 // set the content-format in responses
Osamu Nakamura 0:7d720671e6dc 356 void DynamicResource::setContentFormat(uint8_t content_format) {
Osamu Nakamura 0:7d720671e6dc 357 this->m_content_format = content_format;
Osamu Nakamura 0:7d720671e6dc 358 }
Osamu Nakamura 0:7d720671e6dc 359
Osamu Nakamura 0:7d720671e6dc 360 // set the max-age of responses
Osamu Nakamura 0:7d720671e6dc 361 void DynamicResource::setMaxAge(uint8_t maxage) {
Osamu Nakamura 0:7d720671e6dc 362 this->m_maxage = maxage;
Osamu Nakamura 0:7d720671e6dc 363 }
Osamu Nakamura 0:7d720671e6dc 364
Osamu Nakamura 0:7d720671e6dc 365 // convert the CoAP data pointer to a string type
Osamu Nakamura 0:7d720671e6dc 366 string DynamicResource::coapDataToString(uint8_t *coap_data_ptr,int coap_data_ptr_length)
Osamu Nakamura 0:7d720671e6dc 367 {
Osamu Nakamura 0:7d720671e6dc 368 if (coap_data_ptr != NULL && coap_data_ptr_length > 0) {
Osamu Nakamura 0:7d720671e6dc 369 if (this->getDataWrapper() != NULL) {
Osamu Nakamura 0:7d720671e6dc 370 // unwrap the data...
Osamu Nakamura 0:7d720671e6dc 371 this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length);
Osamu Nakamura 0:7d720671e6dc 372 char *buf = (char *)this->getDataWrapper()->get(); // assumes data is null terminated in DataWrapper...
Osamu Nakamura 0:7d720671e6dc 373 return string(buf);
Osamu Nakamura 0:7d720671e6dc 374 }
Osamu Nakamura 0:7d720671e6dc 375 else {
Osamu Nakamura 0:7d720671e6dc 376 // no unwrap of the data...
Osamu Nakamura 0:7d720671e6dc 377 char buf[MAX_VALUE_BUFFER_LENGTH+1];
Osamu Nakamura 0:7d720671e6dc 378 memset(buf,0,MAX_VALUE_BUFFER_LENGTH+1);
Osamu Nakamura 0:7d720671e6dc 379 memcpy(buf,(char *)coap_data_ptr,coap_data_ptr_length);
Osamu Nakamura 0:7d720671e6dc 380 return string(buf);
Osamu Nakamura 0:7d720671e6dc 381 }
Osamu Nakamura 0:7d720671e6dc 382 }
Osamu Nakamura 0:7d720671e6dc 383 return string("");
Osamu Nakamura 0:7d720671e6dc 384 }
Osamu Nakamura 0:7d720671e6dc 385
Osamu Nakamura 0:7d720671e6dc 386 // convert the CoAP data pointer to an integer type
Osamu Nakamura 0:7d720671e6dc 387 int DynamicResource::coapDataToInteger(uint8_t *coap_data_ptr,int coap_data_ptr_length) {
Osamu Nakamura 0:7d720671e6dc 388 int value = 0;
Osamu Nakamura 0:7d720671e6dc 389 if (coap_data_ptr != NULL && coap_data_ptr_length > 0) {
Osamu Nakamura 0:7d720671e6dc 390 if (this->getDataWrapper() != NULL) {
Osamu Nakamura 0:7d720671e6dc 391 // unwrap the data...
Osamu Nakamura 0:7d720671e6dc 392 this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length);
Osamu Nakamura 0:7d720671e6dc 393 //value = (int)this->getDataWrapper()->get(); // assumes data is null terminated in DataWrapper...
Osamu Nakamura 0:7d720671e6dc 394 }
Osamu Nakamura 0:7d720671e6dc 395 else {
Osamu Nakamura 0:7d720671e6dc 396 // no unwrap of the data...
Osamu Nakamura 0:7d720671e6dc 397 //value = (int)coap_data_ptr;
Osamu Nakamura 0:7d720671e6dc 398 }
Osamu Nakamura 0:7d720671e6dc 399 }
Osamu Nakamura 0:7d720671e6dc 400 return value;
Osamu Nakamura 0:7d720671e6dc 401 }
Osamu Nakamura 0:7d720671e6dc 402
Osamu Nakamura 0:7d720671e6dc 403 // convert the CoAP data pointer to a float type
Osamu Nakamura 0:7d720671e6dc 404 float DynamicResource::coapDataToFloat(uint8_t *coap_data_ptr,int coap_data_ptr_length) {
Osamu Nakamura 0:7d720671e6dc 405 float value = 0.0;
Osamu Nakamura 0:7d720671e6dc 406 if (coap_data_ptr != NULL && coap_data_ptr_length > 0) {
Osamu Nakamura 0:7d720671e6dc 407 if (this->getDataWrapper() != NULL) {
Osamu Nakamura 0:7d720671e6dc 408 // unwrap the data...
Osamu Nakamura 0:7d720671e6dc 409 this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length);
Osamu Nakamura 0:7d720671e6dc 410 //value = (float)this->getDataWrapper()->get(); // assumes data is null terminated in DataWrapper...
Osamu Nakamura 0:7d720671e6dc 411 }
Osamu Nakamura 0:7d720671e6dc 412 else {
Osamu Nakamura 0:7d720671e6dc 413 // no unwrap of the data...
Osamu Nakamura 0:7d720671e6dc 414 //value = (float)coap_data_ptr;
Osamu Nakamura 0:7d720671e6dc 415 }
Osamu Nakamura 0:7d720671e6dc 416 }
Osamu Nakamura 0:7d720671e6dc 417 return value;
Osamu Nakamura 0:7d720671e6dc 418 }
Osamu Nakamura 0:7d720671e6dc 419
Osamu Nakamura 0:7d720671e6dc 420 // convert the CoAP data pointer to an opaque type
Osamu Nakamura 0:7d720671e6dc 421 void *DynamicResource::coapDataToOpaque(uint8_t *coap_data_ptr,int coap_data_ptr_length) {
Osamu Nakamura 0:7d720671e6dc 422 if (coap_data_ptr != NULL && coap_data_ptr_length > 0) {
Osamu Nakamura 0:7d720671e6dc 423 if (this->getDataWrapper() != NULL) {
Osamu Nakamura 0:7d720671e6dc 424 // unwrap the data...
Osamu Nakamura 0:7d720671e6dc 425 this->getDataWrapper()->unwrap(coap_data_ptr,coap_data_ptr_length);
Osamu Nakamura 0:7d720671e6dc 426 char *buf = (char *)this->getDataWrapper()->get(); // assumes data is null terminated in DataWrapper...
Osamu Nakamura 0:7d720671e6dc 427 return (void *)buf;
Osamu Nakamura 0:7d720671e6dc 428 }
Osamu Nakamura 0:7d720671e6dc 429 }
Osamu Nakamura 0:7d720671e6dc 430 return (void *)coap_data_ptr;
Osamu Nakamura 0:7d720671e6dc 431 }
Osamu Nakamura 0:7d720671e6dc 432
Osamu Nakamura 0:7d720671e6dc 433 // Determine if we are connected or not
Osamu Nakamura 0:7d720671e6dc 434 bool DynamicResource::isConnected() {
Osamu Nakamura 0:7d720671e6dc 435 bool is_connected = false;
Osamu Nakamura 0:7d720671e6dc 436
Osamu Nakamura 0:7d720671e6dc 437 // get our Endpoint
Osamu Nakamura 0:7d720671e6dc 438 Connector::Endpoint *ep = (Connector::Endpoint *)this->m_endpoint;
Osamu Nakamura 0:7d720671e6dc 439 if (ep != NULL) {
Osamu Nakamura 0:7d720671e6dc 440 is_connected = ep->isConnected();
Osamu Nakamura 0:7d720671e6dc 441 if (is_connected) {
Osamu Nakamura 0:7d720671e6dc 442 //this->logger()->logging("DynamicResource::isConnected = true");
Osamu Nakamura 0:7d720671e6dc 443 }
Osamu Nakamura 0:7d720671e6dc 444 else {
Osamu Nakamura 0:7d720671e6dc 445 //this->logger()->logging("DynamicResource::isConnected = false");
Osamu Nakamura 0:7d720671e6dc 446 }
Osamu Nakamura 0:7d720671e6dc 447 }
Osamu Nakamura 0:7d720671e6dc 448 else {
Osamu Nakamura 0:7d720671e6dc 449 this->logger()->logging("DynamicResource::isConnected = false (no endpoint)");
Osamu Nakamura 0:7d720671e6dc 450 }
Osamu Nakamura 0:7d720671e6dc 451
Osamu Nakamura 0:7d720671e6dc 452 // return our endpoint connection state
Osamu Nakamura 0:7d720671e6dc 453 return is_connected;
Osamu Nakamura 0:7d720671e6dc 454 }
Osamu Nakamura 0:7d720671e6dc 455
Osamu Nakamura 0:7d720671e6dc 456 // Determine if we are registered or not
Osamu Nakamura 0:7d720671e6dc 457 bool DynamicResource::isRegistered() {
Osamu Nakamura 0:7d720671e6dc 458 bool is_registered = false;
Osamu Nakamura 0:7d720671e6dc 459
Osamu Nakamura 0:7d720671e6dc 460 if (this->isConnected() == true) {
Osamu Nakamura 0:7d720671e6dc 461 // get our Endpoint
Osamu Nakamura 0:7d720671e6dc 462 Connector::Endpoint *ep = (Connector::Endpoint *)this->m_endpoint;
Osamu Nakamura 0:7d720671e6dc 463 if (ep != NULL) {
Osamu Nakamura 0:7d720671e6dc 464 is_registered = ep->isRegistered();
Osamu Nakamura 0:7d720671e6dc 465 if (is_registered) {
Osamu Nakamura 0:7d720671e6dc 466 //this->logger()->logging("DynamicResource::isRegistered = true");
Osamu Nakamura 0:7d720671e6dc 467 }
Osamu Nakamura 0:7d720671e6dc 468 else {
Osamu Nakamura 0:7d720671e6dc 469 //this->logger()->logging("DynamicResource::isRegistered = false");
Osamu Nakamura 0:7d720671e6dc 470 }
Osamu Nakamura 0:7d720671e6dc 471 }
Osamu Nakamura 0:7d720671e6dc 472 else {
Osamu Nakamura 0:7d720671e6dc 473 this->logger()->logging("DynamicResource::isRegistered = false (no endpoint)");
Osamu Nakamura 0:7d720671e6dc 474 }
Osamu Nakamura 0:7d720671e6dc 475 }
Osamu Nakamura 0:7d720671e6dc 476
Osamu Nakamura 0:7d720671e6dc 477 // return our endpoint registration state
Osamu Nakamura 0:7d720671e6dc 478 return is_registered;
Osamu Nakamura 0:7d720671e6dc 479 }
Osamu Nakamura 0:7d720671e6dc 480
Osamu Nakamura 0:7d720671e6dc 481 // get our observer
Osamu Nakamura 0:7d720671e6dc 482 void *DynamicResource::getObserver() {
Osamu Nakamura 0:7d720671e6dc 483 return this->m_observer;
Osamu Nakamura 0:7d720671e6dc 484 }