sandbox / mbed-client

Fork of mbed-client by Christopher Haster

Committer:
Christopher Haster
Date:
Fri Jan 22 14:57:00 2016 -0600
Revision:
1:79b6cc67d8b4
Child:
4:ae5178938864
Initial move of mbed-client to mercurial

Who changed what in which revision?

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