Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

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