Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-client by
m2mfirmware.cpp
00001 /* 00002 * Copyright (c) 2015 ARM Limited. All rights reserved. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * Licensed under the Apache License, Version 2.0 (the License); you may 00005 * not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 00012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #include <cstdio> 00017 #include "mbed-client/m2mfirmware.h" 00018 #include "mbed-client/m2mconstants.h" 00019 #include "mbed-client/m2mobject.h" 00020 #include "mbed-client/m2mobjectinstance.h" 00021 #include "mbed-client/m2mresource.h" 00022 00023 #define BUFFER_SIZE 21 00024 #define TRACE_GROUP "mClt" 00025 00026 M2MFirmware* M2MFirmware::_instance = NULL; 00027 00028 M2MFirmware* M2MFirmware::get_instance() 00029 { 00030 if(_instance == NULL) { 00031 _instance = new M2MFirmware(); 00032 } 00033 return _instance; 00034 } 00035 00036 void M2MFirmware::delete_instance() 00037 { 00038 if(_instance) { 00039 delete _instance; 00040 _instance = NULL; 00041 } 00042 } 00043 00044 M2MFirmware::M2MFirmware() 00045 : M2MObject(M2M_FIRMWARE_ID) 00046 { 00047 M2MBase::set_register_uri(false); 00048 M2MBase::set_operation(M2MBase::GET_PUT_ALLOWED); 00049 _firmware_instance = M2MObject::create_object_instance(); 00050 if(_firmware_instance) { 00051 _firmware_instance->set_operation(M2MBase::GET_PUT_ALLOWED); 00052 create_mandatory_resources(); 00053 } 00054 } 00055 00056 M2MFirmware::~M2MFirmware() 00057 { 00058 } 00059 00060 void M2MFirmware::create_mandatory_resources() 00061 { 00062 _firmware_instance->set_coap_content_type(COAP_CONTENT_OMA_TLV_TYPE); 00063 M2MResource* res = _firmware_instance->create_dynamic_resource(FIRMWARE_PACKAGE, 00064 OMA_RESOURCE_TYPE, 00065 M2MResourceInstance::OPAQUE, 00066 false); 00067 if(res) { 00068 res->set_operation(M2MBase::PUT_ALLOWED); 00069 res->set_register_uri(false); 00070 } 00071 00072 res = _firmware_instance->create_dynamic_resource(FIRMWARE_PACKAGE_URI, 00073 OMA_RESOURCE_TYPE, 00074 M2MResourceInstance::STRING, 00075 false); 00076 if(res) { 00077 res->set_operation(M2MBase::PUT_ALLOWED); 00078 res->set_register_uri(false); 00079 } 00080 00081 res = _firmware_instance->create_dynamic_resource(FIRMWARE_UPDATE, 00082 OMA_RESOURCE_TYPE, 00083 M2MResourceInstance::OPAQUE, 00084 false); 00085 if(res) { 00086 res->set_operation(M2MBase::NOT_ALLOWED); 00087 res->set_register_uri(false); 00088 } 00089 00090 res = _firmware_instance->create_dynamic_resource(FIRMWARE_STATE, 00091 OMA_RESOURCE_TYPE, 00092 M2MResourceInstance::INTEGER, 00093 true); 00094 set_zero_value(res); 00095 if(res) { 00096 res->set_operation(M2MBase::GET_ALLOWED); 00097 res->set_register_uri(false); 00098 } 00099 res = _firmware_instance->create_dynamic_resource(FIRMWARE_UPDATE_RESULT, 00100 OMA_RESOURCE_TYPE, 00101 M2MResourceInstance::INTEGER, 00102 true); 00103 set_zero_value(res); 00104 if(res) { 00105 res->set_operation(M2MBase::GET_ALLOWED); 00106 res->set_register_uri(false); 00107 } 00108 } 00109 00110 M2MResource* M2MFirmware::create_resource(FirmwareResource resource, const String &value) 00111 { 00112 M2MResource* res = NULL; 00113 String firmware_id = ""; 00114 M2MBase::Operation operation = M2MBase::GET_ALLOWED; 00115 if(!is_resource_present(resource)) { 00116 switch(resource) { 00117 case PackageName: 00118 firmware_id = FIRMWARE_PACKAGE_NAME; 00119 break; 00120 case PackageVersion: 00121 firmware_id = FIRMWARE_PACKAGE_VERSION; 00122 break; 00123 default: 00124 break; 00125 } 00126 } 00127 if(!firmware_id.empty() && value.size() < 256) { 00128 if(_firmware_instance) { 00129 res = _firmware_instance->create_dynamic_resource(firmware_id, 00130 OMA_RESOURCE_TYPE, 00131 M2MResourceInstance::STRING, 00132 false); 00133 00134 if(res) { 00135 res->set_register_uri(false); 00136 res->set_operation(operation); 00137 if(value.empty()) { 00138 res->clear_value(); 00139 } else { 00140 res->set_value((const uint8_t*)value.c_str(), 00141 (uint32_t)value.length()); 00142 } 00143 } 00144 } 00145 } 00146 return res; 00147 } 00148 00149 M2MResource* M2MFirmware::create_resource(FirmwareResource resource, int64_t value) 00150 { 00151 M2MResource* res = NULL; 00152 String firmware_id = ""; 00153 M2MBase::Operation operation = M2MBase::GET_ALLOWED; 00154 if(!is_resource_present(resource)) { 00155 switch(resource) { 00156 case UpdateSupportedObjects: 00157 if(check_value_range(resource, value)) { 00158 firmware_id = FIRMWARE_UPDATE_SUPPORTED_OBJECTS; 00159 operation = M2MBase::GET_PUT_ALLOWED; 00160 } 00161 break; 00162 default: 00163 break; 00164 } 00165 } 00166 if(!firmware_id.empty()) { 00167 if(_firmware_instance) { 00168 res = _firmware_instance->create_dynamic_resource(firmware_id, 00169 OMA_RESOURCE_TYPE, 00170 M2MResourceInstance::INTEGER, 00171 false); 00172 00173 if(res) { 00174 res->set_register_uri(false); 00175 char *buffer = (char*)malloc(BUFFER_SIZE); 00176 if(buffer) { 00177 uint32_t size = m2m::itoa_c(value, buffer); 00178 if (size <= BUFFER_SIZE) { 00179 res->set_operation(operation); 00180 res->set_value((const uint8_t*)buffer, size); 00181 } 00182 free(buffer); 00183 } 00184 } 00185 } 00186 } 00187 return res; 00188 } 00189 00190 bool M2MFirmware::set_resource_value(FirmwareResource resource, 00191 const String &value) 00192 { 00193 bool success = false; 00194 M2MResource* res = get_resource(resource); 00195 if(res) { 00196 if(M2MFirmware::PackageUri == resource || 00197 M2MFirmware::PackageName == resource || 00198 M2MFirmware::PackageVersion == resource) { 00199 if (value.size() < 256) { 00200 if(value.empty()) { 00201 res->clear_value(); 00202 success = true; 00203 } else { 00204 success = res->set_value((const uint8_t*)value.c_str(),(uint32_t)value.length()); 00205 } 00206 } 00207 } 00208 } 00209 return success; 00210 } 00211 00212 bool M2MFirmware::set_resource_value(FirmwareResource resource, 00213 int64_t value) 00214 { 00215 bool success = false; 00216 M2MResource* res = get_resource(resource); 00217 if(res) { 00218 if(M2MFirmware::State == resource || 00219 M2MFirmware::UpdateSupportedObjects == resource || 00220 M2MFirmware::UpdateResult == resource) { 00221 // If it is any of the above resource 00222 // set the value of the resource. 00223 if (check_value_range(resource, value)) { 00224 char *buffer = (char*)malloc(BUFFER_SIZE); 00225 if(buffer) { 00226 uint32_t size = m2m::itoa_c(value, buffer); 00227 if (size <= BUFFER_SIZE) { 00228 success = res->set_value((const uint8_t*)buffer, size); 00229 } 00230 free(buffer); 00231 } 00232 } 00233 } 00234 } 00235 return success; 00236 } 00237 00238 bool M2MFirmware::set_resource_value(FirmwareResource resource, 00239 const uint8_t *value, 00240 const uint32_t length) 00241 { 00242 bool success = false; 00243 M2MResource* res = get_resource(resource); 00244 if(res) { 00245 if(M2MFirmware::Package == resource) { 00246 success = res->set_value(value,length); 00247 } 00248 } 00249 return success; 00250 } 00251 00252 bool M2MFirmware::is_resource_present(FirmwareResource resource) const 00253 { 00254 bool success = false; 00255 M2MResource* res = get_resource(resource); 00256 if(res) { 00257 success = true; 00258 } 00259 return success; 00260 } 00261 00262 String M2MFirmware::resource_name(FirmwareResource resource) const 00263 { 00264 String res_name = ""; 00265 switch(resource) { 00266 case Package: 00267 res_name = FIRMWARE_PACKAGE; 00268 break; 00269 case PackageUri: 00270 res_name = FIRMWARE_PACKAGE_URI; 00271 break; 00272 case Update: 00273 res_name = FIRMWARE_UPDATE; 00274 break; 00275 case State: 00276 res_name = FIRMWARE_STATE; 00277 break; 00278 case UpdateSupportedObjects: 00279 res_name = FIRMWARE_UPDATE_SUPPORTED_OBJECTS; 00280 break; 00281 case UpdateResult: 00282 res_name = FIRMWARE_UPDATE_RESULT; 00283 break; 00284 case PackageName: 00285 res_name = FIRMWARE_PACKAGE_NAME; 00286 break; 00287 case PackageVersion: 00288 res_name = FIRMWARE_PACKAGE_VERSION; 00289 break; 00290 } 00291 return res_name; 00292 } 00293 00294 uint16_t M2MFirmware::per_resource_count(FirmwareResource res) const 00295 { 00296 uint16_t count = 0; 00297 if(_firmware_instance) { 00298 count = _firmware_instance->resource_count(resource_name(res)); 00299 } 00300 return count; 00301 } 00302 00303 uint16_t M2MFirmware::total_resource_count() const 00304 { 00305 uint16_t count = 0; 00306 if(_firmware_instance) { 00307 count = _firmware_instance->resources().size(); 00308 } 00309 return count; 00310 } 00311 00312 uint32_t M2MFirmware::resource_value_buffer(FirmwareResource resource, 00313 uint8_t *&data) const 00314 { 00315 uint32_t size = 0; 00316 M2MResource* res = get_resource(resource); 00317 if(res) { 00318 if(M2MFirmware::Package == resource) { 00319 res->get_value(data,size); 00320 } 00321 } 00322 return size; 00323 } 00324 00325 M2MResource* M2MFirmware::get_resource(FirmwareResource res) const 00326 { 00327 M2MResource* res_object = NULL; 00328 if(_firmware_instance) { 00329 String res_name = ""; 00330 switch(res) { 00331 case Package: 00332 res_name = FIRMWARE_PACKAGE; 00333 break; 00334 case PackageUri: 00335 res_name = FIRMWARE_PACKAGE_URI; 00336 break; 00337 case Update: 00338 res_name = FIRMWARE_UPDATE; 00339 break; 00340 case State: 00341 res_name = FIRMWARE_STATE; 00342 break; 00343 case UpdateSupportedObjects: 00344 res_name = FIRMWARE_UPDATE_SUPPORTED_OBJECTS; 00345 break; 00346 case UpdateResult: 00347 res_name = FIRMWARE_UPDATE_RESULT; 00348 break; 00349 case PackageName: 00350 res_name = FIRMWARE_PACKAGE_NAME; 00351 break; 00352 case PackageVersion: 00353 res_name = FIRMWARE_PACKAGE_VERSION; 00354 break; 00355 } 00356 res_object = _firmware_instance->resource(res_name); 00357 } 00358 return res_object; 00359 } 00360 00361 bool M2MFirmware::delete_resource(FirmwareResource resource) 00362 { 00363 bool success = false; 00364 if(M2MFirmware::UpdateSupportedObjects == resource || 00365 M2MFirmware::PackageName == resource || 00366 M2MFirmware::PackageVersion == resource) { 00367 if(_firmware_instance) { 00368 success = _firmware_instance->remove_resource(resource_name(resource)); 00369 } 00370 } 00371 return success; 00372 } 00373 00374 int64_t M2MFirmware::resource_value_int(FirmwareResource resource) const 00375 { 00376 int64_t value = -1; 00377 M2MResource* res = get_resource(resource); 00378 if(res) { 00379 if(M2MFirmware::State == resource || 00380 M2MFirmware::UpdateSupportedObjects == resource || 00381 M2MFirmware::UpdateResult == resource) { 00382 // Get the value and convert it into integer 00383 uint8_t* buffer = NULL; 00384 uint32_t length = 0; 00385 res->get_value(buffer,length); 00386 if(buffer) { 00387 value = atoi((const char*)buffer); 00388 free(buffer); 00389 } 00390 } 00391 } 00392 return value; 00393 } 00394 00395 String M2MFirmware::resource_value_string(FirmwareResource resource) const 00396 { 00397 String value = ""; 00398 M2MResource* res = get_resource(resource); 00399 if(res) { 00400 if(M2MFirmware::PackageUri == resource || 00401 M2MFirmware::PackageName == resource || 00402 M2MFirmware::PackageVersion == resource) { 00403 uint8_t* buffer = NULL; 00404 uint32_t length = 0; 00405 res->get_value(buffer,length); 00406 00407 char *char_buffer = (char*)malloc(length+1); 00408 if(char_buffer) { 00409 memset(char_buffer,0,length+1); 00410 memcpy(char_buffer,(char*)buffer,length); 00411 00412 String s_name(char_buffer); 00413 value = s_name; 00414 if(char_buffer) { 00415 free(char_buffer); 00416 } 00417 } 00418 if(buffer) { 00419 free(buffer); 00420 } 00421 } 00422 } 00423 return value; 00424 } 00425 00426 bool M2MFirmware::check_value_range(FirmwareResource resource, int64_t value) const 00427 { 00428 bool success = false; 00429 switch (resource) { 00430 case UpdateSupportedObjects: 00431 if(value == 0 || value == 1) { 00432 success = true; 00433 } 00434 break; 00435 case State: 00436 if (value >= 0 && value <= 3) { 00437 success = true; 00438 M2MResource* updateRes = get_resource(M2MFirmware::Update); 00439 if (updateRes){ 00440 if (value == M2MFirmware::Downloaded) { 00441 updateRes->set_operation(M2MBase::POST_ALLOWED); 00442 } 00443 else { 00444 updateRes->set_operation(M2MBase::NOT_ALLOWED); 00445 } 00446 } 00447 } 00448 break; 00449 case UpdateResult: 00450 if (value >= 0 && value <= 7) { 00451 success = true; 00452 } 00453 break; 00454 default: 00455 break; 00456 } 00457 return success; 00458 } 00459 00460 void M2MFirmware::set_zero_value(M2MResource *resource) 00461 { 00462 char *buffer = (char*)malloc(BUFFER_SIZE); 00463 int64_t value = 0; 00464 if(buffer) { 00465 uint32_t size = m2m::itoa_c(value, buffer); 00466 if (size <= BUFFER_SIZE) { 00467 resource->set_value((const uint8_t*)buffer, size); 00468 } 00469 free(buffer); 00470 } 00471 }
Generated on Tue Jul 12 2022 18:06:59 by
 1.7.2 
    