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/m2mfirmware.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
Christopher Haster 1:79b6cc67d8b4 23 M2MFirmware* M2MFirmware::_instance = NULL;
Christopher Haster 1:79b6cc67d8b4 24
Christopher Haster 1:79b6cc67d8b4 25 M2MFirmware* M2MFirmware::get_instance()
Christopher Haster 1:79b6cc67d8b4 26 {
Christopher Haster 1:79b6cc67d8b4 27 if(_instance == NULL) {
Christopher Haster 1:79b6cc67d8b4 28 _instance = new M2MFirmware();
Christopher Haster 1:79b6cc67d8b4 29 }
Christopher Haster 1:79b6cc67d8b4 30 return _instance;
Christopher Haster 1:79b6cc67d8b4 31 }
Christopher Haster 1:79b6cc67d8b4 32
Christopher Haster 1:79b6cc67d8b4 33 void M2MFirmware::delete_instance()
Christopher Haster 1:79b6cc67d8b4 34 {
Christopher Haster 1:79b6cc67d8b4 35 if(_instance) {
Christopher Haster 1:79b6cc67d8b4 36 delete _instance;
Christopher Haster 1:79b6cc67d8b4 37 _instance = NULL;
Christopher Haster 1:79b6cc67d8b4 38 }
Christopher Haster 1:79b6cc67d8b4 39 }
Christopher Haster 1:79b6cc67d8b4 40
Christopher Haster 1:79b6cc67d8b4 41 M2MFirmware::M2MFirmware()
Christopher Haster 1:79b6cc67d8b4 42 : M2MObject(M2M_FIRMWARE_ID)
Christopher Haster 1:79b6cc67d8b4 43 {
Christopher Haster 1:79b6cc67d8b4 44 _firmware_instance = M2MObject::create_object_instance();
Christopher Haster 1:79b6cc67d8b4 45 if(_firmware_instance) {
Christopher Haster 1:79b6cc67d8b4 46 create_mandatory_resources();
Christopher Haster 1:79b6cc67d8b4 47 }
Christopher Haster 1:79b6cc67d8b4 48 }
Christopher Haster 1:79b6cc67d8b4 49
Christopher Haster 1:79b6cc67d8b4 50 M2MFirmware::~M2MFirmware()
Christopher Haster 1:79b6cc67d8b4 51 {
Christopher Haster 1:79b6cc67d8b4 52 }
Christopher Haster 1:79b6cc67d8b4 53
Christopher Haster 1:79b6cc67d8b4 54 void M2MFirmware::create_mandatory_resources()
Christopher Haster 1:79b6cc67d8b4 55 {
Christopher Haster 1:79b6cc67d8b4 56 _firmware_instance->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE);
Christopher Haster 1:79b6cc67d8b4 57 M2MResource* res = _firmware_instance->create_dynamic_resource(FIRMWARE_PACKAGE,
Christopher Haster 1:79b6cc67d8b4 58 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 59 M2MResourceInstance::OPAQUE,
Christopher Haster 1:79b6cc67d8b4 60 false);
Christopher Haster 1:79b6cc67d8b4 61 if(res) {
Christopher Haster 1:79b6cc67d8b4 62 res->set_operation(M2MBase::PUT_ALLOWED);
Christopher Haster 1:79b6cc67d8b4 63 }
Christopher Haster 1:79b6cc67d8b4 64
Christopher Haster 1:79b6cc67d8b4 65 res = _firmware_instance->create_dynamic_resource(FIRMWARE_PACKAGE_URI,
Christopher Haster 1:79b6cc67d8b4 66 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 67 M2MResourceInstance::STRING,
Christopher Haster 1:79b6cc67d8b4 68 false);
Christopher Haster 1:79b6cc67d8b4 69 if(res) {
Christopher Haster 1:79b6cc67d8b4 70 res->set_operation(M2MBase::PUT_ALLOWED);
Christopher Haster 1:79b6cc67d8b4 71 }
Christopher Haster 1:79b6cc67d8b4 72
Christopher Haster 1:79b6cc67d8b4 73 res = _firmware_instance->create_dynamic_resource(FIRMWARE_UPDATE,
Christopher Haster 1:79b6cc67d8b4 74 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 75 M2MResourceInstance::OPAQUE,
Christopher Haster 1:79b6cc67d8b4 76 false);
Christopher Haster 1:79b6cc67d8b4 77 if(res) {
Christopher Haster 1:79b6cc67d8b4 78 res->set_operation(M2MBase::NOT_ALLOWED);
Christopher Haster 1:79b6cc67d8b4 79 }
Christopher Haster 1:79b6cc67d8b4 80
Christopher Haster 1:79b6cc67d8b4 81 res = _firmware_instance->create_dynamic_resource(FIRMWARE_STATE,
Christopher Haster 1:79b6cc67d8b4 82 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 83 M2MResourceInstance::INTEGER,
Christopher Haster 1:79b6cc67d8b4 84 false);
Christopher Haster 1:79b6cc67d8b4 85 if(res) {
Christopher Haster 1:79b6cc67d8b4 86 res->set_operation(M2MBase::GET_ALLOWED);
Christopher Haster 1:79b6cc67d8b4 87 }
Christopher Haster 1:79b6cc67d8b4 88
Christopher Haster 1:79b6cc67d8b4 89 res = _firmware_instance->create_dynamic_resource(FIRMWARE_UPDATE_RESULT,
Christopher Haster 1:79b6cc67d8b4 90 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 91 M2MResourceInstance::INTEGER,
Christopher Haster 1:79b6cc67d8b4 92 false);
Christopher Haster 1:79b6cc67d8b4 93 if(res) {
Christopher Haster 1:79b6cc67d8b4 94 res->set_operation(M2MBase::GET_ALLOWED);
Christopher Haster 1:79b6cc67d8b4 95 }
Christopher Haster 1:79b6cc67d8b4 96 }
Christopher Haster 1:79b6cc67d8b4 97
Christopher Haster 1:79b6cc67d8b4 98 M2MResource* M2MFirmware::create_resource(FirmwareResource resource, const String &value)
Christopher Haster 1:79b6cc67d8b4 99 {
Christopher Haster 1:79b6cc67d8b4 100 M2MResource* res = NULL;
Christopher Haster 1:79b6cc67d8b4 101 String firmware_id = "";
Christopher Haster 1:79b6cc67d8b4 102 M2MBase::Operation operation = M2MBase::GET_ALLOWED;
Christopher Haster 1:79b6cc67d8b4 103 if(!is_resource_present(resource)) {
Christopher Haster 1:79b6cc67d8b4 104 switch(resource) {
Christopher Haster 1:79b6cc67d8b4 105 case PackageName:
Christopher Haster 1:79b6cc67d8b4 106 firmware_id = FIRMWARE_PACKAGE_NAME;
Christopher Haster 1:79b6cc67d8b4 107 break;
Christopher Haster 1:79b6cc67d8b4 108 case PackageVersion:
Christopher Haster 1:79b6cc67d8b4 109 firmware_id = FIRMWARE_PACKAGE_VERSION;
Christopher Haster 1:79b6cc67d8b4 110 break;
Christopher Haster 1:79b6cc67d8b4 111 default:
Christopher Haster 1:79b6cc67d8b4 112 break;
Christopher Haster 1:79b6cc67d8b4 113 }
Christopher Haster 1:79b6cc67d8b4 114 }
Christopher Haster 1:79b6cc67d8b4 115 if(!firmware_id.empty() && value.size() < 256) {
Christopher Haster 1:79b6cc67d8b4 116 if(_firmware_instance) {
Christopher Haster 1:79b6cc67d8b4 117 res = _firmware_instance->create_dynamic_resource(firmware_id,
Christopher Haster 1:79b6cc67d8b4 118 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 119 M2MResourceInstance::STRING,
Christopher Haster 1:79b6cc67d8b4 120 false);
Christopher Haster 1:79b6cc67d8b4 121
Christopher Haster 1:79b6cc67d8b4 122 if(res) {
Christopher Haster 1:79b6cc67d8b4 123 res->set_operation(operation);
Christopher Haster 1:79b6cc67d8b4 124 if(value.empty()) {
Christopher Haster 1:79b6cc67d8b4 125 res->clear_value();
Christopher Haster 1:79b6cc67d8b4 126 } else {
Christopher Haster 1:79b6cc67d8b4 127 res->set_value((const uint8_t*)value.c_str(),
Christopher Haster 1:79b6cc67d8b4 128 (uint32_t)value.length());
Christopher Haster 1:79b6cc67d8b4 129 }
Christopher Haster 1:79b6cc67d8b4 130 }
Christopher Haster 1:79b6cc67d8b4 131 }
Christopher Haster 1:79b6cc67d8b4 132 }
Christopher Haster 1:79b6cc67d8b4 133 return res;
Christopher Haster 1:79b6cc67d8b4 134 }
Christopher Haster 1:79b6cc67d8b4 135
Christopher Haster 1:79b6cc67d8b4 136 M2MResource* M2MFirmware::create_resource(FirmwareResource resource, int64_t value)
Christopher Haster 1:79b6cc67d8b4 137 {
Christopher Haster 1:79b6cc67d8b4 138 M2MResource* res = NULL;
Christopher Haster 1:79b6cc67d8b4 139 String firmware_id = "";
Christopher Haster 1:79b6cc67d8b4 140 M2MBase::Operation operation = M2MBase::GET_ALLOWED;
Christopher Haster 1:79b6cc67d8b4 141 if(!is_resource_present(resource)) {
Christopher Haster 1:79b6cc67d8b4 142 switch(resource) {
Christopher Haster 1:79b6cc67d8b4 143 case UpdateSupportedObjects:
Christopher Haster 1:79b6cc67d8b4 144 if(check_value_range(resource, value)) {
Christopher Haster 1:79b6cc67d8b4 145 firmware_id = FIRMWARE_UPDATE_SUPPORTED_OBJECTS;
Christopher Haster 1:79b6cc67d8b4 146 operation = M2MBase::GET_PUT_ALLOWED;
Christopher Haster 1:79b6cc67d8b4 147 }
Christopher Haster 1:79b6cc67d8b4 148 break;
Christopher Haster 1:79b6cc67d8b4 149 default:
Christopher Haster 1:79b6cc67d8b4 150 break;
Christopher Haster 1:79b6cc67d8b4 151 }
Christopher Haster 1:79b6cc67d8b4 152 }
Christopher Haster 1:79b6cc67d8b4 153 if(!firmware_id.empty()) {
Christopher Haster 1:79b6cc67d8b4 154 if(_firmware_instance) {
Christopher Haster 1:79b6cc67d8b4 155 res = _firmware_instance->create_dynamic_resource(firmware_id,
Christopher Haster 1:79b6cc67d8b4 156 OMA_RESOURCE_TYPE,
Christopher Haster 1:79b6cc67d8b4 157 M2MResourceInstance::INTEGER,
Christopher Haster 1:79b6cc67d8b4 158 false);
Christopher Haster 1:79b6cc67d8b4 159
Christopher Haster 1:79b6cc67d8b4 160 if(res) {
Christopher Haster 1:79b6cc67d8b4 161 char *buffer = (char*)memory_alloc(20);
Christopher Haster 1:79b6cc67d8b4 162 if(buffer) {
Christopher Haster 1:79b6cc67d8b4 163 int size = snprintf(buffer, 20,"%lld",(long long int)value);
Christopher Haster 1:79b6cc67d8b4 164
Christopher Haster 1:79b6cc67d8b4 165 res->set_operation(operation);
Christopher Haster 1:79b6cc67d8b4 166 res->set_value((const uint8_t*)buffer,
Christopher Haster 1:79b6cc67d8b4 167 (uint32_t)size);
Christopher Haster 1:79b6cc67d8b4 168 memory_free(buffer);
Christopher Haster 1:79b6cc67d8b4 169 }
Christopher Haster 1:79b6cc67d8b4 170 }
Christopher Haster 1:79b6cc67d8b4 171 }
Christopher Haster 1:79b6cc67d8b4 172 }
Christopher Haster 1:79b6cc67d8b4 173 return res;
Christopher Haster 1:79b6cc67d8b4 174 }
Christopher Haster 1:79b6cc67d8b4 175
Christopher Haster 1:79b6cc67d8b4 176 bool M2MFirmware::set_resource_value(FirmwareResource resource,
Christopher Haster 1:79b6cc67d8b4 177 const String &value)
Christopher Haster 1:79b6cc67d8b4 178 {
Christopher Haster 1:79b6cc67d8b4 179 bool success = false;
Christopher Haster 1:79b6cc67d8b4 180 M2MResource* res = get_resource(resource);
Christopher Haster 1:79b6cc67d8b4 181 if(res) {
Christopher Haster 1:79b6cc67d8b4 182 if(M2MFirmware::PackageUri == resource ||
Christopher Haster 1:79b6cc67d8b4 183 M2MFirmware::PackageName == resource ||
Christopher Haster 1:79b6cc67d8b4 184 M2MFirmware::PackageVersion == resource) {
Christopher Haster 1:79b6cc67d8b4 185 if (value.size() < 256) {
Christopher Haster 1:79b6cc67d8b4 186 if(value.empty()) {
Christopher Haster 1:79b6cc67d8b4 187 res->clear_value();
Christopher Haster 1:79b6cc67d8b4 188 success = true;
Christopher Haster 1:79b6cc67d8b4 189 } else {
Christopher Haster 1:79b6cc67d8b4 190 success = res->set_value((const uint8_t*)value.c_str(),(uint32_t)value.length());
Christopher Haster 1:79b6cc67d8b4 191 }
Christopher Haster 1:79b6cc67d8b4 192 }
Christopher Haster 1:79b6cc67d8b4 193 }
Christopher Haster 1:79b6cc67d8b4 194 }
Christopher Haster 1:79b6cc67d8b4 195 return success;
Christopher Haster 1:79b6cc67d8b4 196 }
Christopher Haster 1:79b6cc67d8b4 197
Christopher Haster 1:79b6cc67d8b4 198 bool M2MFirmware::set_resource_value(FirmwareResource resource,
Christopher Haster 1:79b6cc67d8b4 199 int64_t value)
Christopher Haster 1:79b6cc67d8b4 200 {
Christopher Haster 1:79b6cc67d8b4 201 bool success = false;
Christopher Haster 1:79b6cc67d8b4 202 M2MResource* res = get_resource(resource);
Christopher Haster 1:79b6cc67d8b4 203 if(res) {
Christopher Haster 1:79b6cc67d8b4 204 if(M2MFirmware::State == resource ||
Christopher Haster 1:79b6cc67d8b4 205 M2MFirmware::UpdateSupportedObjects == resource ||
Christopher Haster 1:79b6cc67d8b4 206 M2MFirmware::UpdateResult == resource) {
Christopher Haster 1:79b6cc67d8b4 207 // If it is any of the above resource
Christopher Haster 1:79b6cc67d8b4 208 // set the value of the resource.
Christopher Haster 1:79b6cc67d8b4 209 if (check_value_range(resource, value)) {
Christopher Haster 1:79b6cc67d8b4 210 char *buffer = (char*)memory_alloc(20);
Christopher Haster 1:79b6cc67d8b4 211 if(buffer) {
Christopher Haster 1:79b6cc67d8b4 212 int size = snprintf(buffer, 20,"%lld",(long long int)value);
Christopher Haster 1:79b6cc67d8b4 213 success = res->set_value((const uint8_t*)buffer,
Christopher Haster 1:79b6cc67d8b4 214 (uint32_t)size);
Christopher Haster 1:79b6cc67d8b4 215 memory_free(buffer);
Christopher Haster 1:79b6cc67d8b4 216 }
Christopher Haster 1:79b6cc67d8b4 217 }
Christopher Haster 1:79b6cc67d8b4 218 }
Christopher Haster 1:79b6cc67d8b4 219 }
Christopher Haster 1:79b6cc67d8b4 220 return success;
Christopher Haster 1:79b6cc67d8b4 221 }
Christopher Haster 1:79b6cc67d8b4 222
Christopher Haster 1:79b6cc67d8b4 223 bool M2MFirmware::set_resource_value(FirmwareResource resource,
Christopher Haster 1:79b6cc67d8b4 224 const uint8_t *value,
Christopher Haster 1:79b6cc67d8b4 225 const uint32_t length)
Christopher Haster 1:79b6cc67d8b4 226 {
Christopher Haster 1:79b6cc67d8b4 227 bool success = false;
Christopher Haster 1:79b6cc67d8b4 228 M2MResource* res = get_resource(resource);
Christopher Haster 1:79b6cc67d8b4 229 if(res) {
Christopher Haster 1:79b6cc67d8b4 230 if(M2MFirmware::Package == resource) {
Christopher Haster 1:79b6cc67d8b4 231 success = res->set_value(value,length);
Christopher Haster 1:79b6cc67d8b4 232 }
Christopher Haster 1:79b6cc67d8b4 233 }
Christopher Haster 1:79b6cc67d8b4 234 return success;
Christopher Haster 1:79b6cc67d8b4 235 }
Christopher Haster 1:79b6cc67d8b4 236
Christopher Haster 1:79b6cc67d8b4 237 bool M2MFirmware::is_resource_present(FirmwareResource resource) const
Christopher Haster 1:79b6cc67d8b4 238 {
Christopher Haster 1:79b6cc67d8b4 239 bool success = false;
Christopher Haster 1:79b6cc67d8b4 240 M2MResource* res = get_resource(resource);
Christopher Haster 1:79b6cc67d8b4 241 if(res) {
Christopher Haster 1:79b6cc67d8b4 242 success = true;
Christopher Haster 1:79b6cc67d8b4 243 }
Christopher Haster 1:79b6cc67d8b4 244 return success;
Christopher Haster 1:79b6cc67d8b4 245 }
Christopher Haster 1:79b6cc67d8b4 246
Christopher Haster 1:79b6cc67d8b4 247 String M2MFirmware::resource_name(FirmwareResource resource) const
Christopher Haster 1:79b6cc67d8b4 248 {
Christopher Haster 1:79b6cc67d8b4 249 String res_name = "";
Christopher Haster 1:79b6cc67d8b4 250 switch(resource) {
Christopher Haster 1:79b6cc67d8b4 251 case Package:
Christopher Haster 1:79b6cc67d8b4 252 res_name = FIRMWARE_PACKAGE;
Christopher Haster 1:79b6cc67d8b4 253 break;
Christopher Haster 1:79b6cc67d8b4 254 case PackageUri:
Christopher Haster 1:79b6cc67d8b4 255 res_name = FIRMWARE_PACKAGE_URI;
Christopher Haster 1:79b6cc67d8b4 256 break;
Christopher Haster 1:79b6cc67d8b4 257 case Update:
Christopher Haster 1:79b6cc67d8b4 258 res_name = FIRMWARE_UPDATE;
Christopher Haster 1:79b6cc67d8b4 259 break;
Christopher Haster 1:79b6cc67d8b4 260 case State:
Christopher Haster 1:79b6cc67d8b4 261 res_name = FIRMWARE_STATE;
Christopher Haster 1:79b6cc67d8b4 262 break;
Christopher Haster 1:79b6cc67d8b4 263 case UpdateSupportedObjects:
Christopher Haster 1:79b6cc67d8b4 264 res_name = FIRMWARE_UPDATE_SUPPORTED_OBJECTS;
Christopher Haster 1:79b6cc67d8b4 265 break;
Christopher Haster 1:79b6cc67d8b4 266 case UpdateResult:
Christopher Haster 1:79b6cc67d8b4 267 res_name = FIRMWARE_UPDATE_RESULT;
Christopher Haster 1:79b6cc67d8b4 268 break;
Christopher Haster 1:79b6cc67d8b4 269 case PackageName:
Christopher Haster 1:79b6cc67d8b4 270 res_name = FIRMWARE_PACKAGE_NAME;
Christopher Haster 1:79b6cc67d8b4 271 break;
Christopher Haster 1:79b6cc67d8b4 272 case PackageVersion:
Christopher Haster 1:79b6cc67d8b4 273 res_name = FIRMWARE_PACKAGE_VERSION;
Christopher Haster 1:79b6cc67d8b4 274 break;
Christopher Haster 1:79b6cc67d8b4 275 }
Christopher Haster 1:79b6cc67d8b4 276 return res_name;
Christopher Haster 1:79b6cc67d8b4 277 }
Christopher Haster 1:79b6cc67d8b4 278
Christopher Haster 1:79b6cc67d8b4 279 uint16_t M2MFirmware::per_resource_count(FirmwareResource res) const
Christopher Haster 1:79b6cc67d8b4 280 {
Christopher Haster 1:79b6cc67d8b4 281 uint16_t count = 0;
Christopher Haster 1:79b6cc67d8b4 282 if(_firmware_instance) {
Christopher Haster 1:79b6cc67d8b4 283 count = _firmware_instance->resource_count(resource_name(res));
Christopher Haster 1:79b6cc67d8b4 284 }
Christopher Haster 1:79b6cc67d8b4 285 return count;
Christopher Haster 1:79b6cc67d8b4 286 }
Christopher Haster 1:79b6cc67d8b4 287
Christopher Haster 1:79b6cc67d8b4 288 uint16_t M2MFirmware::total_resource_count() const
Christopher Haster 1:79b6cc67d8b4 289 {
Christopher Haster 1:79b6cc67d8b4 290 uint16_t count = 0;
Christopher Haster 1:79b6cc67d8b4 291 if(_firmware_instance) {
Christopher Haster 1:79b6cc67d8b4 292 count = _firmware_instance->resources().size();
Christopher Haster 1:79b6cc67d8b4 293 }
Christopher Haster 1:79b6cc67d8b4 294 return count;
Christopher Haster 1:79b6cc67d8b4 295 }
Christopher Haster 1:79b6cc67d8b4 296
Christopher Haster 1:79b6cc67d8b4 297 uint32_t M2MFirmware::resource_value_buffer(FirmwareResource resource,
Christopher Haster 1:79b6cc67d8b4 298 uint8_t *&data) const
Christopher Haster 1:79b6cc67d8b4 299 {
Christopher Haster 1:79b6cc67d8b4 300 uint32_t size = 0;
Christopher Haster 1:79b6cc67d8b4 301 M2MResource* res = get_resource(resource);
Christopher Haster 1:79b6cc67d8b4 302 if(res) {
Christopher Haster 1:79b6cc67d8b4 303 if(M2MFirmware::Package == resource) {
Christopher Haster 1:79b6cc67d8b4 304 res->get_value(data,size);
Christopher Haster 1:79b6cc67d8b4 305 }
Christopher Haster 1:79b6cc67d8b4 306 }
Christopher Haster 1:79b6cc67d8b4 307 return size;
Christopher Haster 1:79b6cc67d8b4 308 }
Christopher Haster 1:79b6cc67d8b4 309
Christopher Haster 1:79b6cc67d8b4 310 M2MResource* M2MFirmware::get_resource(FirmwareResource res) const
Christopher Haster 1:79b6cc67d8b4 311 {
Christopher Haster 1:79b6cc67d8b4 312 M2MResource* res_object = NULL;
Christopher Haster 1:79b6cc67d8b4 313 if(_firmware_instance) {
Christopher Haster 1:79b6cc67d8b4 314 String res_name = "";
Christopher Haster 1:79b6cc67d8b4 315 switch(res) {
Christopher Haster 1:79b6cc67d8b4 316 case Package:
Christopher Haster 1:79b6cc67d8b4 317 res_name = FIRMWARE_PACKAGE;
Christopher Haster 1:79b6cc67d8b4 318 break;
Christopher Haster 1:79b6cc67d8b4 319 case PackageUri:
Christopher Haster 1:79b6cc67d8b4 320 res_name = FIRMWARE_PACKAGE_URI;
Christopher Haster 1:79b6cc67d8b4 321 break;
Christopher Haster 1:79b6cc67d8b4 322 case Update:
Christopher Haster 1:79b6cc67d8b4 323 res_name = FIRMWARE_UPDATE;
Christopher Haster 1:79b6cc67d8b4 324 break;
Christopher Haster 1:79b6cc67d8b4 325 case State:
Christopher Haster 1:79b6cc67d8b4 326 res_name = FIRMWARE_STATE;
Christopher Haster 1:79b6cc67d8b4 327 break;
Christopher Haster 1:79b6cc67d8b4 328 case UpdateSupportedObjects:
Christopher Haster 1:79b6cc67d8b4 329 res_name = FIRMWARE_UPDATE_SUPPORTED_OBJECTS;
Christopher Haster 1:79b6cc67d8b4 330 break;
Christopher Haster 1:79b6cc67d8b4 331 case UpdateResult:
Christopher Haster 1:79b6cc67d8b4 332 res_name = FIRMWARE_UPDATE_RESULT;
Christopher Haster 1:79b6cc67d8b4 333 break;
Christopher Haster 1:79b6cc67d8b4 334 case PackageName:
Christopher Haster 1:79b6cc67d8b4 335 res_name = FIRMWARE_PACKAGE_NAME;
Christopher Haster 1:79b6cc67d8b4 336 break;
Christopher Haster 1:79b6cc67d8b4 337 case PackageVersion:
Christopher Haster 1:79b6cc67d8b4 338 res_name = FIRMWARE_PACKAGE_VERSION;
Christopher Haster 1:79b6cc67d8b4 339 break;
Christopher Haster 1:79b6cc67d8b4 340 }
Christopher Haster 1:79b6cc67d8b4 341 res_object = _firmware_instance->resource(res_name);
Christopher Haster 1:79b6cc67d8b4 342 }
Christopher Haster 1:79b6cc67d8b4 343 return res_object;
Christopher Haster 1:79b6cc67d8b4 344 }
Christopher Haster 1:79b6cc67d8b4 345
Christopher Haster 1:79b6cc67d8b4 346 bool M2MFirmware::delete_resource(FirmwareResource resource)
Christopher Haster 1:79b6cc67d8b4 347 {
Christopher Haster 1:79b6cc67d8b4 348 bool success = false;
Christopher Haster 1:79b6cc67d8b4 349 if(M2MFirmware::UpdateSupportedObjects == resource ||
Christopher Haster 1:79b6cc67d8b4 350 M2MFirmware::PackageName == resource ||
Christopher Haster 1:79b6cc67d8b4 351 M2MFirmware::PackageVersion == resource) {
Christopher Haster 1:79b6cc67d8b4 352 if(_firmware_instance) {
Christopher Haster 1:79b6cc67d8b4 353 success = _firmware_instance->remove_resource(resource_name(resource));
Christopher Haster 1:79b6cc67d8b4 354 }
Christopher Haster 1:79b6cc67d8b4 355 }
Christopher Haster 1:79b6cc67d8b4 356 return success;
Christopher Haster 1:79b6cc67d8b4 357 }
Christopher Haster 1:79b6cc67d8b4 358
Christopher Haster 1:79b6cc67d8b4 359 int64_t M2MFirmware::resource_value_int(FirmwareResource resource) const
Christopher Haster 1:79b6cc67d8b4 360 {
Christopher Haster 1:79b6cc67d8b4 361 int64_t value = -1;
Christopher Haster 1:79b6cc67d8b4 362 M2MResource* res = get_resource(resource);
Christopher Haster 1:79b6cc67d8b4 363 if(res) {
Christopher Haster 1:79b6cc67d8b4 364 if(M2MFirmware::State == resource ||
Christopher Haster 1:79b6cc67d8b4 365 M2MFirmware::UpdateSupportedObjects == resource ||
Christopher Haster 1:79b6cc67d8b4 366 M2MFirmware::UpdateResult == resource) {
Christopher Haster 1:79b6cc67d8b4 367 // Get the value and convert it into integer
Christopher Haster 1:79b6cc67d8b4 368 uint8_t* buffer = NULL;
Christopher Haster 1:79b6cc67d8b4 369 uint32_t length = 0;
Christopher Haster 1:79b6cc67d8b4 370 res->get_value(buffer,length);
Christopher Haster 1:79b6cc67d8b4 371 if(buffer) {
Christopher Haster 1:79b6cc67d8b4 372 value = atoi((const char*)buffer);
Christopher Haster 1:79b6cc67d8b4 373 free(buffer);
Christopher Haster 1:79b6cc67d8b4 374 }
Christopher Haster 1:79b6cc67d8b4 375 }
Christopher Haster 1:79b6cc67d8b4 376 }
Christopher Haster 1:79b6cc67d8b4 377 return value;
Christopher Haster 1:79b6cc67d8b4 378 }
Christopher Haster 1:79b6cc67d8b4 379
Christopher Haster 1:79b6cc67d8b4 380 String M2MFirmware::resource_value_string(FirmwareResource resource) const
Christopher Haster 1:79b6cc67d8b4 381 {
Christopher Haster 1:79b6cc67d8b4 382 String value = "";
Christopher Haster 1:79b6cc67d8b4 383 M2MResource* res = get_resource(resource);
Christopher Haster 1:79b6cc67d8b4 384 if(res) {
Christopher Haster 1:79b6cc67d8b4 385 if(M2MFirmware::PackageUri == resource ||
Christopher Haster 1:79b6cc67d8b4 386 M2MFirmware::PackageName == resource ||
Christopher Haster 1:79b6cc67d8b4 387 M2MFirmware::PackageVersion == resource) {
Christopher Haster 1:79b6cc67d8b4 388 uint8_t* buffer = NULL;
Christopher Haster 1:79b6cc67d8b4 389 uint32_t length = 0;
Christopher Haster 1:79b6cc67d8b4 390 res->get_value(buffer,length);
Christopher Haster 1:79b6cc67d8b4 391
Christopher Haster 1:79b6cc67d8b4 392 char *char_buffer = (char*)malloc(length+1);
Christopher Haster 1:79b6cc67d8b4 393 if(char_buffer) {
Christopher Haster 1:79b6cc67d8b4 394 memset(char_buffer,0,length+1);
Christopher Haster 1:79b6cc67d8b4 395 memcpy(char_buffer,(char*)buffer,length);
Christopher Haster 1:79b6cc67d8b4 396
Christopher Haster 1:79b6cc67d8b4 397 String s_name(char_buffer);
Christopher Haster 1:79b6cc67d8b4 398 value = s_name;
Christopher Haster 1:79b6cc67d8b4 399 if(char_buffer) {
Christopher Haster 1:79b6cc67d8b4 400 free(char_buffer);
Christopher Haster 1:79b6cc67d8b4 401 }
Christopher Haster 1:79b6cc67d8b4 402 }
Christopher Haster 1:79b6cc67d8b4 403 if(buffer) {
Christopher Haster 1:79b6cc67d8b4 404 free(buffer);
Christopher Haster 1:79b6cc67d8b4 405 }
Christopher Haster 1:79b6cc67d8b4 406 }
Christopher Haster 1:79b6cc67d8b4 407 }
Christopher Haster 1:79b6cc67d8b4 408 return value;
Christopher Haster 1:79b6cc67d8b4 409 }
Christopher Haster 1:79b6cc67d8b4 410
Christopher Haster 1:79b6cc67d8b4 411 bool M2MFirmware::check_value_range(FirmwareResource resource, int64_t value) const
Christopher Haster 1:79b6cc67d8b4 412 {
Christopher Haster 1:79b6cc67d8b4 413 bool success = false;
Christopher Haster 1:79b6cc67d8b4 414 switch (resource) {
Christopher Haster 1:79b6cc67d8b4 415 case UpdateSupportedObjects:
Christopher Haster 1:79b6cc67d8b4 416 if(value == 0 || value == 1) {
Christopher Haster 1:79b6cc67d8b4 417 success = true;
Christopher Haster 1:79b6cc67d8b4 418 }
Christopher Haster 1:79b6cc67d8b4 419 break;
Christopher Haster 1:79b6cc67d8b4 420 case State:
Christopher Haster 1:79b6cc67d8b4 421 if (value >= 0 && value <= 2) {
Christopher Haster 1:79b6cc67d8b4 422 success = true;
Christopher Haster 1:79b6cc67d8b4 423 M2MResource* updateRes = get_resource(M2MFirmware::Update);
Christopher Haster 1:79b6cc67d8b4 424 if (updateRes){
Christopher Haster 1:79b6cc67d8b4 425 if (value == M2MFirmware::Downloaded) {
Christopher Haster 1:79b6cc67d8b4 426 updateRes->set_operation(M2MBase::POST_ALLOWED);
Christopher Haster 1:79b6cc67d8b4 427 }
Christopher Haster 1:79b6cc67d8b4 428 else {
Christopher Haster 1:79b6cc67d8b4 429 updateRes->set_operation(M2MBase::NOT_ALLOWED);
Christopher Haster 1:79b6cc67d8b4 430 }
Christopher Haster 1:79b6cc67d8b4 431 }
Christopher Haster 1:79b6cc67d8b4 432 }
Christopher Haster 1:79b6cc67d8b4 433 break;
Christopher Haster 1:79b6cc67d8b4 434 case UpdateResult:
Christopher Haster 1:79b6cc67d8b4 435 if (value >= 0 && value <= 7) {
Christopher Haster 1:79b6cc67d8b4 436 success = true;
Christopher Haster 1:79b6cc67d8b4 437 }
Christopher Haster 1:79b6cc67d8b4 438 break;
Christopher Haster 1:79b6cc67d8b4 439 default:
Christopher Haster 1:79b6cc67d8b4 440 break;
Christopher Haster 1:79b6cc67d8b4 441 }
Christopher Haster 1:79b6cc67d8b4 442 return success;
Christopher Haster 1:79b6cc67d8b4 443 }
Christopher Haster 1:79b6cc67d8b4 444