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-cloud-workshop-connect-HTS221 by
lwm2m-source.cpp
00001 // ---------------------------------------------------------------------------- 00002 // Copyright 2016-2017 ARM Ltd. 00003 // 00004 // SPDX-License-Identifier: Apache-2.0 00005 // 00006 // Licensed under the Apache License, Version 2.0 (the "License"); 00007 // you may not use this file except in compliance with the License. 00008 // You may obtain a copy of the License at 00009 // 00010 // http://www.apache.org/licenses/LICENSE-2.0 00011 // 00012 // Unless required by applicable law or agreed to in writing, software 00013 // distributed under the License is distributed on an "AS IS" BASIS, 00014 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00015 // See the License for the specific language governing permissions and 00016 // limitations under the License. 00017 // ---------------------------------------------------------------------------- 00018 00019 #include "update-lwm2m-mbed-apis.h" 00020 #include "update-client-common/arm_uc_common.h" 00021 #include "update-client-lwm2m/lwm2m-source.h" 00022 #include "update-client-lwm2m/FirmwareUpdateResource.h" 00023 #include "update-client-lwm2m/DeviceMetadataResource.h" 00024 00025 00026 /* forward declaration */ 00027 static void ARM_UCS_PackageCallback(const uint8_t* buffer, uint16_t length); 00028 00029 /* local copy of the received manifest */ 00030 static uint8_t* arm_ucs_manifest_buffer = NULL; 00031 static uint16_t arm_ucs_manifest_length = 0; 00032 00033 /* callback function pointer and struct */ 00034 static void (*ARM_UCS_EventHandler)(uint32_t event) = 0; 00035 static arm_uc_callback_t callbackNodeManifest = { NULL, 0, NULL, 0 }; 00036 static arm_uc_callback_t callbackNodeNotification = { NULL, 0, NULL, 0 }; 00037 00038 /** 00039 * @brief Get driver version. 00040 * @return Driver version. 00041 */ 00042 uint32_t ARM_UCS_LWM2M_SOURCE_GetVersion(void) 00043 { 00044 return 0; 00045 } 00046 00047 /** 00048 * @brief Get Source capabilities. 00049 * @return Struct containing capabilites. See definition above. 00050 */ 00051 ARM_SOURCE_CAPABILITIES ARM_UCS_LWM2M_SOURCE_GetCapabilities(void) 00052 { 00053 ARM_SOURCE_CAPABILITIES result; 00054 result.notify = 0; 00055 result.manifest_default = 0; 00056 result.manifest_url = 0; 00057 result.firmware = 0; 00058 result.keytable = 0; 00059 00060 /* the event handler must be set before module can be used */ 00061 if (ARM_UCS_EventHandler != 0) 00062 { 00063 result.notify = 1; 00064 result.manifest_default = 1; 00065 } 00066 00067 return result; 00068 } 00069 00070 /** 00071 * @brief Initialize Source. 00072 * @details Function pointer to event handler is passed as argument. 00073 * 00074 * @param cb_event Function pointer to event handler. See events above. 00075 * @return Error code. 00076 */ 00077 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_Initialize(ARM_SOURCE_SignalEvent_t cb_event) 00078 { 00079 UC_SRCE_TRACE("ARM_UCS_LWM2M_SOURCE_Initialize: %p", cb_event); 00080 ARM_UC_INIT_ERROR(result, SRCE_ERR_INVALID_PARAMETER); 00081 00082 if (cb_event != 0) 00083 { 00084 /* store callback handler */ 00085 ARM_UCS_EventHandler = cb_event; 00086 00087 /* Initialize LWM2M Firmware Update Object */ 00088 FirmwareUpdateResource::Initialize(); 00089 00090 /* Register callback handler */ 00091 FirmwareUpdateResource::addPackageCallback(ARM_UCS_PackageCallback); 00092 00093 DeviceMetadataResource::Initialize(); 00094 00095 ARM_UC_SET_ERROR(result, SRCE_ERR_NONE); 00096 } 00097 00098 return result; 00099 } 00100 00101 /** 00102 * @brief Uninitialized Source. 00103 * @return Error code. 00104 */ 00105 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_Uninitialize(void) 00106 { 00107 ARM_UC_INIT_ERROR(retval, SRCE_ERR_NONE); 00108 DeviceMetadataResource::Uninitialize(); 00109 FirmwareUpdateResource::Uninitialize(); 00110 00111 return retval; 00112 } 00113 00114 /** 00115 * @brief Cost estimation for retrieving manifest from the default location. 00116 * @details The estimation can vary over time and should not be cached too long. 00117 * 0x00000000 - The manifest is already downloaded. 00118 * 0xFFFFFFFF - Cannot retrieve manifest from this Source. 00119 * 00120 * @param cost Pointer to variable for the return value. 00121 * @return Error code. 00122 */ 00123 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_GetManifestDefaultCost(uint32_t* cost) 00124 { 00125 ARM_UC_INIT_ERROR(result, SRCE_ERR_INVALID_PARAMETER); 00126 00127 if (cost != 0) 00128 { 00129 /* set cost to 0 when manifest is cached */ 00130 if (arm_ucs_manifest_buffer && arm_ucs_manifest_length) 00131 { 00132 *cost = 0; 00133 } 00134 /* set cost to 0xFFFFFFFF when manifest has been read */ 00135 else 00136 { 00137 *cost = 0xFFFFFFFF; 00138 } 00139 00140 ARM_UC_SET_ERROR(result, SRCE_ERR_NONE); 00141 } 00142 00143 return result; 00144 } 00145 00146 /** 00147 * @brief Retrieve manifest from the default location. 00148 * @details Manifest is stored in supplied buffer. 00149 * Event is generated once manifest is in buffer. 00150 * 00151 * @param buffer Struct containing byte array, maximum size, and actual size. 00152 * @return Error code. 00153 */ 00154 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_GetManifestDefault(arm_uc_buffer_t* buffer, 00155 uint32_t offset) 00156 { 00157 ARM_UC_INIT_ERROR(result, SRCE_ERR_INVALID_PARAMETER); 00158 00159 /* copy manifest from cache into buffer */ 00160 if ((buffer != NULL) && 00161 (buffer->ptr != NULL) && 00162 (arm_ucs_manifest_buffer != NULL) && 00163 (arm_ucs_manifest_length != 0) && 00164 (offset < arm_ucs_manifest_length)) 00165 { 00166 /* remaining length based on offset request */ 00167 uint16_t length = arm_ucs_manifest_length - offset; 00168 00169 /* set actual length based on buffer size */ 00170 if (length > buffer->size_max) 00171 { 00172 length = buffer->size_max; 00173 } 00174 00175 /* size check */ 00176 if (length > 0) 00177 { 00178 /* copy manifest from local buffer to external buffer */ 00179 memcpy(buffer->ptr, &arm_ucs_manifest_buffer[offset], length); 00180 buffer->size = length; 00181 00182 /* delete local buffer once the entire manifest has been read */ 00183 if (offset + length >= arm_ucs_manifest_length) 00184 { 00185 delete[] arm_ucs_manifest_buffer; 00186 arm_ucs_manifest_buffer = NULL; 00187 arm_ucs_manifest_length = 0; 00188 } 00189 00190 ARM_UC_SET_ERROR(result, SRCE_ERR_NONE); 00191 00192 /* signal event handler that manifest has been copied to buffer */ 00193 if (ARM_UCS_EventHandler) 00194 { 00195 ARM_UC_PostCallback(&callbackNodeManifest, 00196 ARM_UCS_EventHandler, 00197 EVENT_MANIFEST); 00198 } 00199 } 00200 } 00201 00202 return result; 00203 } 00204 00205 static void ARM_UCS_PackageCallback(const uint8_t* buffer, uint16_t length) 00206 { 00207 uint32_t event_code = EVENT_ERROR; 00208 00209 if (arm_ucs_manifest_buffer) 00210 { 00211 UC_SRCE_ERR_MSG("received new manifest before reading the old one"); 00212 00213 /* delete old buffer to make space for the new one */ 00214 delete[] arm_ucs_manifest_buffer; 00215 arm_ucs_manifest_length = 0; 00216 } 00217 00218 /* allocate a local buffer of the same size as the manifest */ 00219 arm_ucs_manifest_buffer = new uint8_t[length]; 00220 00221 if (arm_ucs_manifest_buffer) 00222 { 00223 /* copy manifest from payload to local buffer */ 00224 memcpy(arm_ucs_manifest_buffer, buffer, length); 00225 arm_ucs_manifest_length = length; 00226 00227 event_code = EVENT_NOTIFICATION; 00228 } 00229 00230 /* signal event handler with result */ 00231 if (ARM_UCS_EventHandler) 00232 { 00233 ARM_UC_PostCallback(&callbackNodeNotification, 00234 ARM_UCS_EventHandler, 00235 event_code); 00236 } 00237 } 00238 00239 /*****************************************************************************/ 00240 /* Capabilities not supported by this source */ 00241 /*****************************************************************************/ 00242 00243 /** 00244 * @brief Cost estimation for retrieving manifest from URL. 00245 * @details The estimation can vary over time and should not be cached too long. 00246 * 0x00000000 - The manifest is already downloaded. 00247 * 0xFFFFFFFF - Cannot retrieve manifest from this Source. 00248 * 00249 * @param uri URI struct with manifest location. 00250 * @param cost Pointer to variable for the return value. 00251 * @return Error code. 00252 */ 00253 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_GetManifestURLCost(arm_uc_uri_t* uri, 00254 uint32_t* cost) 00255 { 00256 (void) uri; 00257 (void) cost; 00258 00259 ARM_UC_INIT_ERROR(result, SRCE_ERR_INVALID_PARAMETER); 00260 00261 /* not supported - return default cost regardless of actual uri location */ 00262 if (cost) 00263 { 00264 *cost = 0xFFFFFFFF; 00265 ARM_UC_SET_ERROR(result, SRCE_ERR_NONE); 00266 } 00267 00268 return result; 00269 } 00270 00271 /** 00272 * @brief Cost estimation for retrieving firmware from URL. 00273 * @details The estimation can vary over time and should not be cached too long. 00274 * 0x00000000 - The firmware is already downloaded. 00275 * 0xFFFFFFFF - Cannot retrieve firmware from this Source. 00276 * 00277 * @param uri URI struct with firmware location. 00278 * @param cost Pointer to variable for the return value. 00279 * @return Error code. 00280 */ 00281 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_GetFirmwareURLCost(arm_uc_uri_t* uri, 00282 uint32_t* cost) 00283 { 00284 (void) uri; 00285 (void) cost; 00286 00287 ARM_UC_INIT_ERROR(result, SRCE_ERR_INVALID_PARAMETER); 00288 00289 /* not supported - return default cost regardless of actual uri location */ 00290 if (cost != 0) 00291 { 00292 *cost = 0xFFFFFFFF; 00293 ARM_UC_SET_ERROR(result, SRCE_ERR_NONE); 00294 } 00295 00296 return result; 00297 } 00298 00299 /** 00300 * @brief Cost estimation for retrieving key table from URL. 00301 * @details The estimation can vary over time and should not be cached too long. 00302 * 0x00000000 - The firmware is already downloaded. 00303 * 0xFFFFFFFF - Cannot retrieve firmware from this Source. 00304 * 00305 * @param uri URI struct with keytable location. 00306 * @param cost Pointer to variable for the return value. 00307 * @return Error code. 00308 */ 00309 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_GetKeytableURLCost(arm_uc_uri_t* uri, 00310 uint32_t* cost) 00311 { 00312 (void) uri; 00313 (void) cost; 00314 00315 ARM_UC_INIT_ERROR(result, SRCE_ERR_INVALID_PARAMETER); 00316 00317 /* not supported - return default cost regardless of actual uri location */ 00318 if ((uri != 0) && (cost != 0)) 00319 { 00320 *cost = 0xFFFFFFFF; 00321 ARM_UC_SET_ERROR(result, SRCE_ERR_NONE); 00322 } 00323 00324 return result; 00325 } 00326 00327 /** 00328 * @brief Retrieve manifest from URL. 00329 * @details Manifest is stored in supplied buffer. 00330 * Event is generated once manifest is in buffer. 00331 * 00332 * @param uri URI struct with manifest location. 00333 * @param buffer Struct containing byte array, maximum size, and actual size. 00334 * 00335 * @return Error code. 00336 */ 00337 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_GetManifestURL(arm_uc_uri_t* uri, 00338 arm_uc_buffer_t* buffer, 00339 uint32_t offset) 00340 { 00341 (void) uri; 00342 (void) buffer; 00343 (void) offset; 00344 00345 ARM_UC_INIT_ERROR(retval, SRCE_ERR_INVALID_PARAMETER); 00346 00347 return retval; 00348 } 00349 00350 /** 00351 * @brief Retrieve firmware fragment. 00352 * @details Firmware fragment is stored in supplied buffer. 00353 * Event is generated once fragment is in buffer. 00354 * 00355 * @param uri URI struct with firmware location. 00356 * @param buffer Struct containing byte array, maximum size, and actual size. 00357 * @param offset Firmware offset to retrieve fragment from. 00358 * @return Error code. 00359 */ 00360 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_GetFirmwareFragment(arm_uc_uri_t* uri, 00361 arm_uc_buffer_t* buffer, 00362 uint32_t offset) 00363 { 00364 (void) uri; 00365 (void) buffer; 00366 (void) offset; 00367 00368 ARM_UC_INIT_ERROR(retval, SRCE_ERR_INVALID_PARAMETER); 00369 00370 return retval; 00371 } 00372 00373 /** 00374 * @brief Retrieve a key table from a URL. 00375 * @details Key table is stored in supplied buffer. 00376 * Event is generated once fragment is in buffer. 00377 * 00378 * @param uri URI struct with keytable location. 00379 * @param buffer Struct containing byte array, maximum size, and actual size. 00380 * @return Error code. 00381 */ 00382 arm_uc_error_t ARM_UCS_LWM2M_SOURCE_GetKeytableURL(arm_uc_uri_t* uri, 00383 arm_uc_buffer_t* buffer) 00384 { 00385 (void) uri; 00386 (void) buffer; 00387 00388 ARM_UC_INIT_ERROR(retval, SRCE_ERR_INVALID_PARAMETER); 00389 00390 return retval; 00391 } 00392
Generated on Tue Jul 12 2022 19:12:12 by
1.7.2
