FRDM K64F Metronome

Committer:
ram54288
Date:
Sun May 14 18:37:05 2017 +0000
Revision:
0:dbad57390bd1
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ram54288 0:dbad57390bd1 1 /*
ram54288 0:dbad57390bd1 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
ram54288 0:dbad57390bd1 3 * SPDX-License-Identifier: Apache-2.0
ram54288 0:dbad57390bd1 4 * Licensed under the Apache License, Version 2.0 (the License); you may
ram54288 0:dbad57390bd1 5 * not use this file except in compliance with the License.
ram54288 0:dbad57390bd1 6 * You may obtain a copy of the License at
ram54288 0:dbad57390bd1 7 *
ram54288 0:dbad57390bd1 8 * http://www.apache.org/licenses/LICENSE-2.0
ram54288 0:dbad57390bd1 9 *
ram54288 0:dbad57390bd1 10 * Unless required by applicable law or agreed to in writing, software
ram54288 0:dbad57390bd1 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
ram54288 0:dbad57390bd1 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ram54288 0:dbad57390bd1 13 * See the License for the specific language governing permissions and
ram54288 0:dbad57390bd1 14 * limitations under the License.
ram54288 0:dbad57390bd1 15 */
ram54288 0:dbad57390bd1 16
ram54288 0:dbad57390bd1 17 #include "mbed-client/m2mdevice.h"
ram54288 0:dbad57390bd1 18 #include "mbed-client/m2mconstants.h"
ram54288 0:dbad57390bd1 19 #include "mbed-client/m2mobject.h"
ram54288 0:dbad57390bd1 20 #include "mbed-client/m2mobjectinstance.h"
ram54288 0:dbad57390bd1 21 #include "mbed-client/m2mresource.h"
ram54288 0:dbad57390bd1 22 #include "mbed-trace/mbed_trace.h"
ram54288 0:dbad57390bd1 23
ram54288 0:dbad57390bd1 24 #define BUFFER_SIZE 21
ram54288 0:dbad57390bd1 25 #define TRACE_GROUP "mClt"
ram54288 0:dbad57390bd1 26
ram54288 0:dbad57390bd1 27 M2MDevice* M2MDevice::_instance = NULL;
ram54288 0:dbad57390bd1 28
ram54288 0:dbad57390bd1 29 M2MDevice* M2MDevice::get_instance()
ram54288 0:dbad57390bd1 30 {
ram54288 0:dbad57390bd1 31 if(_instance == NULL) {
ram54288 0:dbad57390bd1 32 // ownership of this path is transferred to M2MBase.
ram54288 0:dbad57390bd1 33 // Since this object is a singleton, we could use the C-structs to avoid heap
ram54288 0:dbad57390bd1 34 // allocation on a lot of M2MDevice -objects data.
ram54288 0:dbad57390bd1 35 char *path = stringdup(M2M_DEVICE_ID);
ram54288 0:dbad57390bd1 36 if (path) {
ram54288 0:dbad57390bd1 37 _instance = new M2MDevice(path);
ram54288 0:dbad57390bd1 38 }
ram54288 0:dbad57390bd1 39 }
ram54288 0:dbad57390bd1 40 return _instance;
ram54288 0:dbad57390bd1 41 }
ram54288 0:dbad57390bd1 42
ram54288 0:dbad57390bd1 43 void M2MDevice::delete_instance()
ram54288 0:dbad57390bd1 44 {
ram54288 0:dbad57390bd1 45 delete _instance;
ram54288 0:dbad57390bd1 46 _instance = NULL;
ram54288 0:dbad57390bd1 47 }
ram54288 0:dbad57390bd1 48
ram54288 0:dbad57390bd1 49 M2MDevice::M2MDevice(char *path)
ram54288 0:dbad57390bd1 50 : M2MObject(M2M_DEVICE_ID, path)
ram54288 0:dbad57390bd1 51 {
ram54288 0:dbad57390bd1 52 M2MBase::set_register_uri(false);
ram54288 0:dbad57390bd1 53 M2MBase::set_operation(M2MBase::GET_ALLOWED);
ram54288 0:dbad57390bd1 54
ram54288 0:dbad57390bd1 55 _device_instance = M2MObject::create_object_instance();
ram54288 0:dbad57390bd1 56 if(_device_instance) {
ram54288 0:dbad57390bd1 57 _device_instance->set_operation(M2MBase::GET_ALLOWED);
ram54288 0:dbad57390bd1 58 _device_instance->set_register_uri(true);
ram54288 0:dbad57390bd1 59 _device_instance->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE);
ram54288 0:dbad57390bd1 60 M2MResource* res = _device_instance->create_dynamic_resource(DEVICE_REBOOT,
ram54288 0:dbad57390bd1 61 OMA_RESOURCE_TYPE,
ram54288 0:dbad57390bd1 62 M2MResourceInstance::OPAQUE,
ram54288 0:dbad57390bd1 63 false);
ram54288 0:dbad57390bd1 64 if(res) {
ram54288 0:dbad57390bd1 65 res->set_operation(M2MBase::POST_ALLOWED);
ram54288 0:dbad57390bd1 66 res->set_register_uri(false);
ram54288 0:dbad57390bd1 67 }
ram54288 0:dbad57390bd1 68
ram54288 0:dbad57390bd1 69 M2MResourceInstance* instance = _device_instance->create_dynamic_resource_instance(DEVICE_ERROR_CODE,
ram54288 0:dbad57390bd1 70 OMA_RESOURCE_TYPE,
ram54288 0:dbad57390bd1 71 M2MResourceInstance::INTEGER,
ram54288 0:dbad57390bd1 72 true,0);
ram54288 0:dbad57390bd1 73 if(instance) {
ram54288 0:dbad57390bd1 74 M2MResource * dev_res = _device_instance->resource(DEVICE_ERROR_CODE);
ram54288 0:dbad57390bd1 75 if(dev_res) {
ram54288 0:dbad57390bd1 76 dev_res->set_register_uri(false);
ram54288 0:dbad57390bd1 77 }
ram54288 0:dbad57390bd1 78 instance->set_operation(M2MBase::GET_ALLOWED);
ram54288 0:dbad57390bd1 79
ram54288 0:dbad57390bd1 80 instance->set_value(0);
ram54288 0:dbad57390bd1 81
ram54288 0:dbad57390bd1 82 instance->set_register_uri(false);
ram54288 0:dbad57390bd1 83 }
ram54288 0:dbad57390bd1 84 res = _device_instance->create_dynamic_resource(DEVICE_SUPPORTED_BINDING_MODE,
ram54288 0:dbad57390bd1 85 OMA_RESOURCE_TYPE,
ram54288 0:dbad57390bd1 86 M2MResourceInstance::STRING,
ram54288 0:dbad57390bd1 87 true);
ram54288 0:dbad57390bd1 88 if(res) {
ram54288 0:dbad57390bd1 89 res->set_operation(M2MBase::GET_ALLOWED);
ram54288 0:dbad57390bd1 90 res->set_value((const uint8_t*)BINDING_MODE_UDP,sizeof(BINDING_MODE_UDP)-1);
ram54288 0:dbad57390bd1 91 res->set_register_uri(false);
ram54288 0:dbad57390bd1 92 }
ram54288 0:dbad57390bd1 93 }
ram54288 0:dbad57390bd1 94 }
ram54288 0:dbad57390bd1 95
ram54288 0:dbad57390bd1 96 M2MDevice::~M2MDevice()
ram54288 0:dbad57390bd1 97 {
ram54288 0:dbad57390bd1 98 }
ram54288 0:dbad57390bd1 99
ram54288 0:dbad57390bd1 100 M2MResource* M2MDevice::create_resource(DeviceResource resource, const String &value)
ram54288 0:dbad57390bd1 101 {
ram54288 0:dbad57390bd1 102 M2MResource* res = NULL;
ram54288 0:dbad57390bd1 103 const char* device_id_ptr = "";
ram54288 0:dbad57390bd1 104 M2MBase::Operation operation = M2MBase::GET_ALLOWED;
ram54288 0:dbad57390bd1 105 if(!is_resource_present(resource) && value.size() <= MAX_ALLOWED_STRING_LENGTH) {
ram54288 0:dbad57390bd1 106 switch(resource) {
ram54288 0:dbad57390bd1 107 case Manufacturer:
ram54288 0:dbad57390bd1 108 device_id_ptr = DEVICE_MANUFACTURER;
ram54288 0:dbad57390bd1 109 break;
ram54288 0:dbad57390bd1 110 case DeviceType:
ram54288 0:dbad57390bd1 111 device_id_ptr = DEVICE_DEVICE_TYPE;
ram54288 0:dbad57390bd1 112 break;
ram54288 0:dbad57390bd1 113 case ModelNumber:
ram54288 0:dbad57390bd1 114 device_id_ptr = DEVICE_MODEL_NUMBER;
ram54288 0:dbad57390bd1 115 break;
ram54288 0:dbad57390bd1 116 case SerialNumber:
ram54288 0:dbad57390bd1 117 device_id_ptr = DEVICE_SERIAL_NUMBER;
ram54288 0:dbad57390bd1 118 break;
ram54288 0:dbad57390bd1 119 case HardwareVersion:
ram54288 0:dbad57390bd1 120 device_id_ptr = DEVICE_HARDWARE_VERSION;
ram54288 0:dbad57390bd1 121 break;
ram54288 0:dbad57390bd1 122 case FirmwareVersion:
ram54288 0:dbad57390bd1 123 device_id_ptr = DEVICE_FIRMWARE_VERSION;
ram54288 0:dbad57390bd1 124 break;
ram54288 0:dbad57390bd1 125 case SoftwareVersion:
ram54288 0:dbad57390bd1 126 device_id_ptr = DEVICE_SOFTWARE_VERSION;
ram54288 0:dbad57390bd1 127 break;
ram54288 0:dbad57390bd1 128 case UTCOffset:
ram54288 0:dbad57390bd1 129 device_id_ptr = DEVICE_UTC_OFFSET;
ram54288 0:dbad57390bd1 130 operation = M2MBase::GET_PUT_ALLOWED;
ram54288 0:dbad57390bd1 131 break;
ram54288 0:dbad57390bd1 132 case Timezone:
ram54288 0:dbad57390bd1 133 device_id_ptr = DEVICE_TIMEZONE;
ram54288 0:dbad57390bd1 134 operation = M2MBase::GET_PUT_ALLOWED;
ram54288 0:dbad57390bd1 135 break;
ram54288 0:dbad57390bd1 136 default:
ram54288 0:dbad57390bd1 137 break;
ram54288 0:dbad57390bd1 138 }
ram54288 0:dbad57390bd1 139 }
ram54288 0:dbad57390bd1 140 const String device_id(device_id_ptr);
ram54288 0:dbad57390bd1 141
ram54288 0:dbad57390bd1 142 if(!device_id.empty()) {
ram54288 0:dbad57390bd1 143 if(_device_instance) {
ram54288 0:dbad57390bd1 144 res = _device_instance->create_dynamic_resource(device_id,
ram54288 0:dbad57390bd1 145 OMA_RESOURCE_TYPE,
ram54288 0:dbad57390bd1 146 M2MResourceInstance::STRING,
ram54288 0:dbad57390bd1 147 true);
ram54288 0:dbad57390bd1 148
ram54288 0:dbad57390bd1 149 if(res ) {
ram54288 0:dbad57390bd1 150 res->set_operation(operation);
ram54288 0:dbad57390bd1 151 if (value.empty()) {
ram54288 0:dbad57390bd1 152 res->clear_value();
ram54288 0:dbad57390bd1 153 } else {
ram54288 0:dbad57390bd1 154 res->set_value((const uint8_t*)value.c_str(),
ram54288 0:dbad57390bd1 155 (uint32_t)value.length());
ram54288 0:dbad57390bd1 156 }
ram54288 0:dbad57390bd1 157 res->set_register_uri(false);
ram54288 0:dbad57390bd1 158 }
ram54288 0:dbad57390bd1 159 }
ram54288 0:dbad57390bd1 160 }
ram54288 0:dbad57390bd1 161 return res;
ram54288 0:dbad57390bd1 162 }
ram54288 0:dbad57390bd1 163
ram54288 0:dbad57390bd1 164 M2MResource* M2MDevice::create_resource(DeviceResource resource, int64_t value)
ram54288 0:dbad57390bd1 165 {
ram54288 0:dbad57390bd1 166 M2MResource* res = NULL;
ram54288 0:dbad57390bd1 167 const char* device_id_ptr = "";
ram54288 0:dbad57390bd1 168 M2MBase::Operation operation = M2MBase::GET_ALLOWED;
ram54288 0:dbad57390bd1 169 if(!is_resource_present(resource)) {
ram54288 0:dbad57390bd1 170 switch(resource) {
ram54288 0:dbad57390bd1 171 case BatteryLevel:
ram54288 0:dbad57390bd1 172 if(check_value_range(resource, value)) {
ram54288 0:dbad57390bd1 173 device_id_ptr = DEVICE_BATTERY_LEVEL;
ram54288 0:dbad57390bd1 174 }
ram54288 0:dbad57390bd1 175 break;
ram54288 0:dbad57390bd1 176 case BatteryStatus:
ram54288 0:dbad57390bd1 177 if(check_value_range(resource, value)) {
ram54288 0:dbad57390bd1 178 device_id_ptr = DEVICE_BATTERY_STATUS;
ram54288 0:dbad57390bd1 179 }
ram54288 0:dbad57390bd1 180 break;
ram54288 0:dbad57390bd1 181 case MemoryFree:
ram54288 0:dbad57390bd1 182 device_id_ptr = DEVICE_MEMORY_FREE;
ram54288 0:dbad57390bd1 183 break;
ram54288 0:dbad57390bd1 184 case MemoryTotal:
ram54288 0:dbad57390bd1 185 device_id_ptr = DEVICE_MEMORY_TOTAL;
ram54288 0:dbad57390bd1 186 break;
ram54288 0:dbad57390bd1 187 case CurrentTime:
ram54288 0:dbad57390bd1 188 device_id_ptr = DEVICE_CURRENT_TIME;
ram54288 0:dbad57390bd1 189 operation = M2MBase::GET_PUT_ALLOWED;
ram54288 0:dbad57390bd1 190 break;
ram54288 0:dbad57390bd1 191 default:
ram54288 0:dbad57390bd1 192 break;
ram54288 0:dbad57390bd1 193 }
ram54288 0:dbad57390bd1 194 }
ram54288 0:dbad57390bd1 195
ram54288 0:dbad57390bd1 196 const String device_id(device_id_ptr);
ram54288 0:dbad57390bd1 197
ram54288 0:dbad57390bd1 198 if(!device_id.empty()) {
ram54288 0:dbad57390bd1 199 if(_device_instance) {
ram54288 0:dbad57390bd1 200 res = _device_instance->create_dynamic_resource(device_id,
ram54288 0:dbad57390bd1 201 OMA_RESOURCE_TYPE,
ram54288 0:dbad57390bd1 202 M2MResourceInstance::INTEGER,
ram54288 0:dbad57390bd1 203 true);
ram54288 0:dbad57390bd1 204
ram54288 0:dbad57390bd1 205 if(res) {
ram54288 0:dbad57390bd1 206
ram54288 0:dbad57390bd1 207
ram54288 0:dbad57390bd1 208 res->set_operation(operation);
ram54288 0:dbad57390bd1 209 res->set_value(value);
ram54288 0:dbad57390bd1 210
ram54288 0:dbad57390bd1 211 res->set_register_uri(false);
ram54288 0:dbad57390bd1 212 }
ram54288 0:dbad57390bd1 213 }
ram54288 0:dbad57390bd1 214 }
ram54288 0:dbad57390bd1 215 return res;
ram54288 0:dbad57390bd1 216 }
ram54288 0:dbad57390bd1 217
ram54288 0:dbad57390bd1 218 M2MResourceInstance* M2MDevice::create_resource_instance(DeviceResource resource, int64_t value,
ram54288 0:dbad57390bd1 219 uint16_t instance_id)
ram54288 0:dbad57390bd1 220 {
ram54288 0:dbad57390bd1 221 M2MResourceInstance* res = NULL;
ram54288 0:dbad57390bd1 222 const char* device_id_ptr = "";
ram54288 0:dbad57390bd1 223 // For these resources multiple instance can exist
ram54288 0:dbad57390bd1 224 if(AvailablePowerSources == resource) {
ram54288 0:dbad57390bd1 225 if(check_value_range(resource, value)) {
ram54288 0:dbad57390bd1 226 device_id_ptr = DEVICE_AVAILABLE_POWER_SOURCES;
ram54288 0:dbad57390bd1 227 }
ram54288 0:dbad57390bd1 228 } else if(PowerSourceVoltage == resource) {
ram54288 0:dbad57390bd1 229 device_id_ptr = DEVICE_POWER_SOURCE_VOLTAGE;
ram54288 0:dbad57390bd1 230 } else if(PowerSourceCurrent == resource) {
ram54288 0:dbad57390bd1 231 device_id_ptr = DEVICE_POWER_SOURCE_CURRENT;
ram54288 0:dbad57390bd1 232 } else if(ErrorCode == resource) {
ram54288 0:dbad57390bd1 233 if(check_value_range(resource, value)) {
ram54288 0:dbad57390bd1 234 device_id_ptr = DEVICE_ERROR_CODE;
ram54288 0:dbad57390bd1 235 }
ram54288 0:dbad57390bd1 236 }
ram54288 0:dbad57390bd1 237
ram54288 0:dbad57390bd1 238 const String device_id(device_id_ptr);
ram54288 0:dbad57390bd1 239
ram54288 0:dbad57390bd1 240 if(!device_id.empty()) {
ram54288 0:dbad57390bd1 241 if(_device_instance) {
ram54288 0:dbad57390bd1 242 res = _device_instance->create_dynamic_resource_instance(device_id,OMA_RESOURCE_TYPE,
ram54288 0:dbad57390bd1 243 M2MResourceInstance::INTEGER,
ram54288 0:dbad57390bd1 244 true, instance_id);
ram54288 0:dbad57390bd1 245
ram54288 0:dbad57390bd1 246 M2MResource *resource = _device_instance->resource(device_id);
ram54288 0:dbad57390bd1 247 if(resource) {
ram54288 0:dbad57390bd1 248 resource->set_register_uri(false);
ram54288 0:dbad57390bd1 249 }
ram54288 0:dbad57390bd1 250 if(res) {
ram54288 0:dbad57390bd1 251 res->set_value(value);
ram54288 0:dbad57390bd1 252 // Only read operation is allowed for above resources
ram54288 0:dbad57390bd1 253 res->set_operation(M2MBase::GET_ALLOWED);
ram54288 0:dbad57390bd1 254
ram54288 0:dbad57390bd1 255 res->set_register_uri(false);
ram54288 0:dbad57390bd1 256 }
ram54288 0:dbad57390bd1 257 }
ram54288 0:dbad57390bd1 258 }
ram54288 0:dbad57390bd1 259 return res;
ram54288 0:dbad57390bd1 260 }
ram54288 0:dbad57390bd1 261 M2MResource* M2MDevice::create_resource(DeviceResource resource)
ram54288 0:dbad57390bd1 262 {
ram54288 0:dbad57390bd1 263 M2MResource* res = NULL;
ram54288 0:dbad57390bd1 264 if(!is_resource_present(resource)) {
ram54288 0:dbad57390bd1 265 const char* device_Id_ptr = "";
ram54288 0:dbad57390bd1 266 if(FactoryReset == resource) {
ram54288 0:dbad57390bd1 267 device_Id_ptr = DEVICE_FACTORY_RESET;
ram54288 0:dbad57390bd1 268 } else if(ResetErrorCode == resource) {
ram54288 0:dbad57390bd1 269 device_Id_ptr = DEVICE_RESET_ERROR_CODE;
ram54288 0:dbad57390bd1 270 }
ram54288 0:dbad57390bd1 271 const String device_Id(device_Id_ptr);
ram54288 0:dbad57390bd1 272
ram54288 0:dbad57390bd1 273 if(_device_instance && !device_Id.empty()) {
ram54288 0:dbad57390bd1 274 res = _device_instance->create_dynamic_resource(device_Id,
ram54288 0:dbad57390bd1 275 OMA_RESOURCE_TYPE,
ram54288 0:dbad57390bd1 276 M2MResourceInstance::OPAQUE,
ram54288 0:dbad57390bd1 277 true);
ram54288 0:dbad57390bd1 278 M2MResource *resource = _device_instance->resource(device_Id);
ram54288 0:dbad57390bd1 279 if(resource) {
ram54288 0:dbad57390bd1 280 resource->set_register_uri(false);
ram54288 0:dbad57390bd1 281 }
ram54288 0:dbad57390bd1 282 if(res) {
ram54288 0:dbad57390bd1 283 res->set_operation(M2MBase::POST_ALLOWED);
ram54288 0:dbad57390bd1 284 res->set_register_uri(false);
ram54288 0:dbad57390bd1 285 }
ram54288 0:dbad57390bd1 286 }
ram54288 0:dbad57390bd1 287 }
ram54288 0:dbad57390bd1 288 return res;
ram54288 0:dbad57390bd1 289 }
ram54288 0:dbad57390bd1 290
ram54288 0:dbad57390bd1 291 bool M2MDevice::delete_resource(DeviceResource resource)
ram54288 0:dbad57390bd1 292 {
ram54288 0:dbad57390bd1 293 bool success = false;
ram54288 0:dbad57390bd1 294 if(M2MDevice::Reboot != resource &&
ram54288 0:dbad57390bd1 295 M2MDevice::ErrorCode != resource &&
ram54288 0:dbad57390bd1 296 M2MDevice::SupportedBindingMode != resource) {
ram54288 0:dbad57390bd1 297 if(_device_instance) {
ram54288 0:dbad57390bd1 298 success = _device_instance->remove_resource(resource_name(resource));
ram54288 0:dbad57390bd1 299 }
ram54288 0:dbad57390bd1 300 }
ram54288 0:dbad57390bd1 301 return success;
ram54288 0:dbad57390bd1 302 }
ram54288 0:dbad57390bd1 303
ram54288 0:dbad57390bd1 304 bool M2MDevice::delete_resource_instance(DeviceResource resource,
ram54288 0:dbad57390bd1 305 uint16_t instance_id)
ram54288 0:dbad57390bd1 306 {
ram54288 0:dbad57390bd1 307 bool success = false;
ram54288 0:dbad57390bd1 308 if(M2MDevice::Reboot != resource &&
ram54288 0:dbad57390bd1 309 M2MDevice::ErrorCode != resource &&
ram54288 0:dbad57390bd1 310 M2MDevice::SupportedBindingMode != resource) {
ram54288 0:dbad57390bd1 311 if(_device_instance) {
ram54288 0:dbad57390bd1 312 success = _device_instance->remove_resource_instance(resource_name(resource),instance_id);
ram54288 0:dbad57390bd1 313 }
ram54288 0:dbad57390bd1 314 }
ram54288 0:dbad57390bd1 315 return success;
ram54288 0:dbad57390bd1 316 }
ram54288 0:dbad57390bd1 317
ram54288 0:dbad57390bd1 318 bool M2MDevice::set_resource_value(DeviceResource resource,
ram54288 0:dbad57390bd1 319 const String &value,
ram54288 0:dbad57390bd1 320 uint16_t instance_id)
ram54288 0:dbad57390bd1 321 {
ram54288 0:dbad57390bd1 322 bool success = false;
ram54288 0:dbad57390bd1 323 M2MResourceInstance* res = get_resource_instance(resource,instance_id);
ram54288 0:dbad57390bd1 324 if(res && value.size() <= MAX_ALLOWED_STRING_LENGTH) {
ram54288 0:dbad57390bd1 325 if(M2MDevice::Manufacturer == resource ||
ram54288 0:dbad57390bd1 326 M2MDevice::ModelNumber == resource ||
ram54288 0:dbad57390bd1 327 M2MDevice::DeviceType == resource ||
ram54288 0:dbad57390bd1 328 M2MDevice::SerialNumber == resource ||
ram54288 0:dbad57390bd1 329 M2MDevice::HardwareVersion == resource ||
ram54288 0:dbad57390bd1 330 M2MDevice::FirmwareVersion == resource ||
ram54288 0:dbad57390bd1 331 M2MDevice::SoftwareVersion == resource ||
ram54288 0:dbad57390bd1 332 M2MDevice::UTCOffset == resource ||
ram54288 0:dbad57390bd1 333 M2MDevice::Timezone == resource) {
ram54288 0:dbad57390bd1 334 if (value.empty()) {
ram54288 0:dbad57390bd1 335 res->clear_value();
ram54288 0:dbad57390bd1 336 success = true;
ram54288 0:dbad57390bd1 337 } else {
ram54288 0:dbad57390bd1 338 success = res->set_value((const uint8_t*)value.c_str(),(uint32_t)value.length());
ram54288 0:dbad57390bd1 339 }
ram54288 0:dbad57390bd1 340 }
ram54288 0:dbad57390bd1 341 }
ram54288 0:dbad57390bd1 342 return success;
ram54288 0:dbad57390bd1 343 }
ram54288 0:dbad57390bd1 344
ram54288 0:dbad57390bd1 345 bool M2MDevice::set_resource_value(DeviceResource resource,
ram54288 0:dbad57390bd1 346 int64_t value,
ram54288 0:dbad57390bd1 347 uint16_t instance_id)
ram54288 0:dbad57390bd1 348 {
ram54288 0:dbad57390bd1 349 bool success = false;
ram54288 0:dbad57390bd1 350 M2MResourceInstance* res = get_resource_instance(resource,instance_id);
ram54288 0:dbad57390bd1 351 if(res) {
ram54288 0:dbad57390bd1 352 if(M2MDevice::BatteryLevel == resource ||
ram54288 0:dbad57390bd1 353 M2MDevice::BatteryStatus == resource ||
ram54288 0:dbad57390bd1 354 M2MDevice::MemoryFree == resource ||
ram54288 0:dbad57390bd1 355 M2MDevice::MemoryTotal == resource ||
ram54288 0:dbad57390bd1 356 M2MDevice::ErrorCode == resource ||
ram54288 0:dbad57390bd1 357 M2MDevice::CurrentTime == resource ||
ram54288 0:dbad57390bd1 358 M2MDevice::AvailablePowerSources == resource ||
ram54288 0:dbad57390bd1 359 M2MDevice::PowerSourceVoltage == resource ||
ram54288 0:dbad57390bd1 360 M2MDevice::PowerSourceCurrent == resource) {
ram54288 0:dbad57390bd1 361 // If it is any of the above resource
ram54288 0:dbad57390bd1 362 // set the value of the resource.
ram54288 0:dbad57390bd1 363 if (check_value_range(resource, value)) {
ram54288 0:dbad57390bd1 364
ram54288 0:dbad57390bd1 365 success = res->set_value(value);
ram54288 0:dbad57390bd1 366 }
ram54288 0:dbad57390bd1 367 }
ram54288 0:dbad57390bd1 368 }
ram54288 0:dbad57390bd1 369 return success;
ram54288 0:dbad57390bd1 370 }
ram54288 0:dbad57390bd1 371
ram54288 0:dbad57390bd1 372 String M2MDevice::resource_value_string(DeviceResource resource,
ram54288 0:dbad57390bd1 373 uint16_t instance_id) const
ram54288 0:dbad57390bd1 374 {
ram54288 0:dbad57390bd1 375 String value = "";
ram54288 0:dbad57390bd1 376 M2MResourceInstance* res = get_resource_instance(resource,instance_id);
ram54288 0:dbad57390bd1 377 if(res) {
ram54288 0:dbad57390bd1 378 if(M2MDevice::Manufacturer == resource ||
ram54288 0:dbad57390bd1 379 M2MDevice::ModelNumber == resource ||
ram54288 0:dbad57390bd1 380 M2MDevice::DeviceType == resource ||
ram54288 0:dbad57390bd1 381 M2MDevice::SerialNumber == resource ||
ram54288 0:dbad57390bd1 382 M2MDevice::HardwareVersion == resource ||
ram54288 0:dbad57390bd1 383 M2MDevice::FirmwareVersion == resource ||
ram54288 0:dbad57390bd1 384 M2MDevice::SoftwareVersion == resource ||
ram54288 0:dbad57390bd1 385 M2MDevice::UTCOffset == resource ||
ram54288 0:dbad57390bd1 386 M2MDevice::Timezone == resource) {
ram54288 0:dbad57390bd1 387
ram54288 0:dbad57390bd1 388
ram54288 0:dbad57390bd1 389 value = res->get_value_string();
ram54288 0:dbad57390bd1 390 }
ram54288 0:dbad57390bd1 391 }
ram54288 0:dbad57390bd1 392 return value;
ram54288 0:dbad57390bd1 393 }
ram54288 0:dbad57390bd1 394
ram54288 0:dbad57390bd1 395 int64_t M2MDevice::resource_value_int(DeviceResource resource,
ram54288 0:dbad57390bd1 396 uint16_t instance_id) const
ram54288 0:dbad57390bd1 397 {
ram54288 0:dbad57390bd1 398 int64_t value = -1;
ram54288 0:dbad57390bd1 399 M2MResourceInstance* res = get_resource_instance(resource,instance_id);
ram54288 0:dbad57390bd1 400 if(res) {
ram54288 0:dbad57390bd1 401 if(M2MDevice::BatteryLevel == resource ||
ram54288 0:dbad57390bd1 402 M2MDevice::BatteryStatus == resource ||
ram54288 0:dbad57390bd1 403 M2MDevice::MemoryFree == resource ||
ram54288 0:dbad57390bd1 404 M2MDevice::MemoryTotal == resource ||
ram54288 0:dbad57390bd1 405 M2MDevice::ErrorCode == resource ||
ram54288 0:dbad57390bd1 406 M2MDevice::CurrentTime == resource ||
ram54288 0:dbad57390bd1 407 M2MDevice::AvailablePowerSources == resource ||
ram54288 0:dbad57390bd1 408 M2MDevice::PowerSourceVoltage == resource ||
ram54288 0:dbad57390bd1 409 M2MDevice::PowerSourceCurrent == resource) {
ram54288 0:dbad57390bd1 410
ram54288 0:dbad57390bd1 411 // note: the value may be 32bit int on 32b archs.
ram54288 0:dbad57390bd1 412 value = res->get_value_int();
ram54288 0:dbad57390bd1 413 }
ram54288 0:dbad57390bd1 414 }
ram54288 0:dbad57390bd1 415 return value;
ram54288 0:dbad57390bd1 416 }
ram54288 0:dbad57390bd1 417
ram54288 0:dbad57390bd1 418 bool M2MDevice::is_resource_present(DeviceResource resource) const
ram54288 0:dbad57390bd1 419 {
ram54288 0:dbad57390bd1 420 bool success = false;
ram54288 0:dbad57390bd1 421 M2MResourceInstance* res = get_resource_instance(resource,0);
ram54288 0:dbad57390bd1 422 if(res) {
ram54288 0:dbad57390bd1 423 success = true;
ram54288 0:dbad57390bd1 424 }
ram54288 0:dbad57390bd1 425 return success;
ram54288 0:dbad57390bd1 426 }
ram54288 0:dbad57390bd1 427
ram54288 0:dbad57390bd1 428 uint16_t M2MDevice::per_resource_count(DeviceResource res) const
ram54288 0:dbad57390bd1 429 {
ram54288 0:dbad57390bd1 430 uint16_t count = 0;
ram54288 0:dbad57390bd1 431 if(_device_instance) {
ram54288 0:dbad57390bd1 432 count = _device_instance->resource_count(resource_name(res));
ram54288 0:dbad57390bd1 433 }
ram54288 0:dbad57390bd1 434 return count;
ram54288 0:dbad57390bd1 435 }
ram54288 0:dbad57390bd1 436
ram54288 0:dbad57390bd1 437 uint16_t M2MDevice::total_resource_count() const
ram54288 0:dbad57390bd1 438 {
ram54288 0:dbad57390bd1 439 uint16_t count = 0;
ram54288 0:dbad57390bd1 440 if(_device_instance) {
ram54288 0:dbad57390bd1 441 count = _device_instance->resources().size();
ram54288 0:dbad57390bd1 442 }
ram54288 0:dbad57390bd1 443 return count;
ram54288 0:dbad57390bd1 444 }
ram54288 0:dbad57390bd1 445
ram54288 0:dbad57390bd1 446 M2MResourceInstance* M2MDevice::get_resource_instance(DeviceResource dev_res,
ram54288 0:dbad57390bd1 447 uint16_t instance_id) const
ram54288 0:dbad57390bd1 448 {
ram54288 0:dbad57390bd1 449 M2MResource* res = NULL;
ram54288 0:dbad57390bd1 450 M2MResourceInstance* inst = NULL;
ram54288 0:dbad57390bd1 451 if(_device_instance) {
ram54288 0:dbad57390bd1 452 res = _device_instance->resource(resource_name(dev_res));
ram54288 0:dbad57390bd1 453 if(res) {
ram54288 0:dbad57390bd1 454 if(res->supports_multiple_instances()) {
ram54288 0:dbad57390bd1 455 inst = res->resource_instance(instance_id);
ram54288 0:dbad57390bd1 456 } else {
ram54288 0:dbad57390bd1 457 inst = res;
ram54288 0:dbad57390bd1 458 }
ram54288 0:dbad57390bd1 459 }
ram54288 0:dbad57390bd1 460 }
ram54288 0:dbad57390bd1 461 return inst;
ram54288 0:dbad57390bd1 462 }
ram54288 0:dbad57390bd1 463
ram54288 0:dbad57390bd1 464 const char* M2MDevice::resource_name(DeviceResource resource)
ram54288 0:dbad57390bd1 465 {
ram54288 0:dbad57390bd1 466 const char* res_name = "";
ram54288 0:dbad57390bd1 467 switch(resource) {
ram54288 0:dbad57390bd1 468 case Manufacturer:
ram54288 0:dbad57390bd1 469 res_name = DEVICE_MANUFACTURER;
ram54288 0:dbad57390bd1 470 break;
ram54288 0:dbad57390bd1 471 case DeviceType:
ram54288 0:dbad57390bd1 472 res_name = DEVICE_DEVICE_TYPE;
ram54288 0:dbad57390bd1 473 break;
ram54288 0:dbad57390bd1 474 case ModelNumber:
ram54288 0:dbad57390bd1 475 res_name = DEVICE_MODEL_NUMBER;
ram54288 0:dbad57390bd1 476 break;
ram54288 0:dbad57390bd1 477 case SerialNumber:
ram54288 0:dbad57390bd1 478 res_name = DEVICE_SERIAL_NUMBER;
ram54288 0:dbad57390bd1 479 break;
ram54288 0:dbad57390bd1 480 case HardwareVersion:
ram54288 0:dbad57390bd1 481 res_name = DEVICE_HARDWARE_VERSION;
ram54288 0:dbad57390bd1 482 break;
ram54288 0:dbad57390bd1 483 case FirmwareVersion:
ram54288 0:dbad57390bd1 484 res_name = DEVICE_FIRMWARE_VERSION;
ram54288 0:dbad57390bd1 485 break;
ram54288 0:dbad57390bd1 486 case SoftwareVersion:
ram54288 0:dbad57390bd1 487 res_name = DEVICE_SOFTWARE_VERSION;
ram54288 0:dbad57390bd1 488 break;
ram54288 0:dbad57390bd1 489 case Reboot:
ram54288 0:dbad57390bd1 490 res_name = DEVICE_REBOOT;
ram54288 0:dbad57390bd1 491 break;
ram54288 0:dbad57390bd1 492 case FactoryReset:
ram54288 0:dbad57390bd1 493 res_name = DEVICE_FACTORY_RESET;
ram54288 0:dbad57390bd1 494 break;
ram54288 0:dbad57390bd1 495 case AvailablePowerSources:
ram54288 0:dbad57390bd1 496 res_name = DEVICE_AVAILABLE_POWER_SOURCES;
ram54288 0:dbad57390bd1 497 break;
ram54288 0:dbad57390bd1 498 case PowerSourceVoltage:
ram54288 0:dbad57390bd1 499 res_name = DEVICE_POWER_SOURCE_VOLTAGE;
ram54288 0:dbad57390bd1 500 break;
ram54288 0:dbad57390bd1 501 case PowerSourceCurrent:
ram54288 0:dbad57390bd1 502 res_name = DEVICE_POWER_SOURCE_CURRENT;
ram54288 0:dbad57390bd1 503 break;
ram54288 0:dbad57390bd1 504 case BatteryLevel:
ram54288 0:dbad57390bd1 505 res_name = DEVICE_BATTERY_LEVEL;
ram54288 0:dbad57390bd1 506 break;
ram54288 0:dbad57390bd1 507 case BatteryStatus:
ram54288 0:dbad57390bd1 508 res_name = DEVICE_BATTERY_STATUS;
ram54288 0:dbad57390bd1 509 break;
ram54288 0:dbad57390bd1 510 case MemoryFree:
ram54288 0:dbad57390bd1 511 res_name = DEVICE_MEMORY_FREE;
ram54288 0:dbad57390bd1 512 break;
ram54288 0:dbad57390bd1 513 case MemoryTotal:
ram54288 0:dbad57390bd1 514 res_name = DEVICE_MEMORY_TOTAL;
ram54288 0:dbad57390bd1 515 break;
ram54288 0:dbad57390bd1 516 case ErrorCode:
ram54288 0:dbad57390bd1 517 res_name = DEVICE_ERROR_CODE;
ram54288 0:dbad57390bd1 518 break;
ram54288 0:dbad57390bd1 519 case ResetErrorCode:
ram54288 0:dbad57390bd1 520 res_name = DEVICE_RESET_ERROR_CODE;
ram54288 0:dbad57390bd1 521 break;
ram54288 0:dbad57390bd1 522 case CurrentTime:
ram54288 0:dbad57390bd1 523 res_name = DEVICE_CURRENT_TIME;
ram54288 0:dbad57390bd1 524 break;
ram54288 0:dbad57390bd1 525 case UTCOffset:
ram54288 0:dbad57390bd1 526 res_name = DEVICE_UTC_OFFSET;
ram54288 0:dbad57390bd1 527 break;
ram54288 0:dbad57390bd1 528 case Timezone:
ram54288 0:dbad57390bd1 529 res_name = DEVICE_TIMEZONE;
ram54288 0:dbad57390bd1 530 break;
ram54288 0:dbad57390bd1 531 case SupportedBindingMode:
ram54288 0:dbad57390bd1 532 res_name = DEVICE_SUPPORTED_BINDING_MODE;
ram54288 0:dbad57390bd1 533 break;
ram54288 0:dbad57390bd1 534 }
ram54288 0:dbad57390bd1 535 return res_name;
ram54288 0:dbad57390bd1 536 }
ram54288 0:dbad57390bd1 537
ram54288 0:dbad57390bd1 538 bool M2MDevice::check_value_range(DeviceResource resource, int64_t value) const
ram54288 0:dbad57390bd1 539 {
ram54288 0:dbad57390bd1 540 bool success = false;
ram54288 0:dbad57390bd1 541 switch (resource) {
ram54288 0:dbad57390bd1 542 case AvailablePowerSources:
ram54288 0:dbad57390bd1 543 if(value >= 0 && value <= 7) {
ram54288 0:dbad57390bd1 544 success = true;
ram54288 0:dbad57390bd1 545 }
ram54288 0:dbad57390bd1 546 break;
ram54288 0:dbad57390bd1 547 case BatteryLevel:
ram54288 0:dbad57390bd1 548 if (value >= 0 && value <= 100) {
ram54288 0:dbad57390bd1 549 success = true;
ram54288 0:dbad57390bd1 550 }
ram54288 0:dbad57390bd1 551 break;
ram54288 0:dbad57390bd1 552 case BatteryStatus:
ram54288 0:dbad57390bd1 553 if (value >= 0 && value <= 6) {
ram54288 0:dbad57390bd1 554 success = true;
ram54288 0:dbad57390bd1 555 }
ram54288 0:dbad57390bd1 556 break;
ram54288 0:dbad57390bd1 557 case ErrorCode:
ram54288 0:dbad57390bd1 558 if (value >= 0 && value <= 8) {
ram54288 0:dbad57390bd1 559 success = true;
ram54288 0:dbad57390bd1 560 }
ram54288 0:dbad57390bd1 561 break;
ram54288 0:dbad57390bd1 562 default:
ram54288 0:dbad57390bd1 563 success = true;
ram54288 0:dbad57390bd1 564 break;
ram54288 0:dbad57390bd1 565 }
ram54288 0:dbad57390bd1 566 return success;
ram54288 0:dbad57390bd1 567 }
ram54288 0:dbad57390bd1 568