Jim Carver / Mbed OS mbed-cloud-workshop-connect-HTS221

Dependencies:   HTS221

Committer:
JimCarver
Date:
Fri Oct 12 21:22:49 2018 +0000
Revision:
0:6b753f761943
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JimCarver 0:6b753f761943 1 // ----------------------------------------------------------------------------
JimCarver 0:6b753f761943 2 // Copyright 2016-2017 ARM Ltd.
JimCarver 0:6b753f761943 3 //
JimCarver 0:6b753f761943 4 // SPDX-License-Identifier: Apache-2.0
JimCarver 0:6b753f761943 5 //
JimCarver 0:6b753f761943 6 // Licensed under the Apache License, Version 2.0 (the "License");
JimCarver 0:6b753f761943 7 // you may not use this file except in compliance with the License.
JimCarver 0:6b753f761943 8 // You may obtain a copy of the License at
JimCarver 0:6b753f761943 9 //
JimCarver 0:6b753f761943 10 // http://www.apache.org/licenses/LICENSE-2.0
JimCarver 0:6b753f761943 11 //
JimCarver 0:6b753f761943 12 // Unless required by applicable law or agreed to in writing, software
JimCarver 0:6b753f761943 13 // distributed under the License is distributed on an "AS IS" BASIS,
JimCarver 0:6b753f761943 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
JimCarver 0:6b753f761943 15 // See the License for the specific language governing permissions and
JimCarver 0:6b753f761943 16 // limitations under the License.
JimCarver 0:6b753f761943 17 // ----------------------------------------------------------------------------
JimCarver 0:6b753f761943 18
JimCarver 0:6b753f761943 19 // Needed for PRIu64 on FreeRTOS
JimCarver 0:6b753f761943 20 #include <stdio.h>
JimCarver 0:6b753f761943 21 // Note: this macro is needed on armcc to get the the limit macros like UINT16_MAX
JimCarver 0:6b753f761943 22 #ifndef __STDC_LIMIT_MACROS
JimCarver 0:6b753f761943 23 #define __STDC_LIMIT_MACROS
JimCarver 0:6b753f761943 24 #endif
JimCarver 0:6b753f761943 25
JimCarver 0:6b753f761943 26 // Note: this macro is needed on armcc to get the the PRI*32 macros
JimCarver 0:6b753f761943 27 // from inttypes.h in a C++ code.
JimCarver 0:6b753f761943 28 #ifndef __STDC_FORMAT_MACROS
JimCarver 0:6b753f761943 29 #define __STDC_FORMAT_MACROS
JimCarver 0:6b753f761943 30 #endif
JimCarver 0:6b753f761943 31
JimCarver 0:6b753f761943 32 #ifdef MBED_CLOUD_CLIENT_USER_CONFIG_FILE
JimCarver 0:6b753f761943 33 #include MBED_CLOUD_CLIENT_USER_CONFIG_FILE
JimCarver 0:6b753f761943 34 #endif
JimCarver 0:6b753f761943 35
JimCarver 0:6b753f761943 36 #ifdef MBED_CLOUD_CLIENT_SUPPORT_UPDATE
JimCarver 0:6b753f761943 37 #include "update-client-hub/update_client_hub.h"
JimCarver 0:6b753f761943 38
JimCarver 0:6b753f761943 39 #include "update-client-source-http/arm_uc_source_http.h"
JimCarver 0:6b753f761943 40 #include "update-client-lwm2m/lwm2m-source.h"
JimCarver 0:6b753f761943 41 #include "update-client-lwm2m/lwm2m-monitor.h"
JimCarver 0:6b753f761943 42 #include "update-client-lwm2m/lwm2m-control.h"
JimCarver 0:6b753f761943 43 #include "update-client-lwm2m/FirmwareUpdateResource.h"
JimCarver 0:6b753f761943 44 #include "update-client-lwm2m/DeviceMetadataResource.h"
JimCarver 0:6b753f761943 45
JimCarver 0:6b753f761943 46 #include "eventOS_scheduler.h"
JimCarver 0:6b753f761943 47 #include "eventOS_event.h"
JimCarver 0:6b753f761943 48
JimCarver 0:6b753f761943 49 #include "include/UpdateClient.h"
JimCarver 0:6b753f761943 50 #include "include/UpdateClientResources.h"
JimCarver 0:6b753f761943 51 #include "include/CloudClientStorage.h"
JimCarver 0:6b753f761943 52
JimCarver 0:6b753f761943 53 #include "pal.h"
JimCarver 0:6b753f761943 54
JimCarver 0:6b753f761943 55 #if (!defined(MBED_CONF_MBED_TRACE_ENABLE) || MBED_CONF_MBED_TRACE_ENABLE == 0) \
JimCarver 0:6b753f761943 56 && ARM_UC_ALL_TRACE_ENABLE == 1
JimCarver 0:6b753f761943 57 #define tr_info(...) { printf(__VA_ARGS__); printf("\r\n"); }
JimCarver 0:6b753f761943 58 #else
JimCarver 0:6b753f761943 59 #include "mbed-trace/mbed_trace.h"
JimCarver 0:6b753f761943 60 #define TRACE_GROUP "uccc"
JimCarver 0:6b753f761943 61 #endif
JimCarver 0:6b753f761943 62
JimCarver 0:6b753f761943 63 /* To be removed once update storage is defined in user config file.
JimCarver 0:6b753f761943 64 Default to filesystem in the meantime.
JimCarver 0:6b753f761943 65 */
JimCarver 0:6b753f761943 66 #ifndef MBED_CLOUD_CLIENT_UPDATE_STORAGE
JimCarver 0:6b753f761943 67 #define MBED_CLOUD_CLIENT_UPDATE_STORAGE ARM_UCP_FILESYSTEM
JimCarver 0:6b753f761943 68 #endif
JimCarver 0:6b753f761943 69
JimCarver 0:6b753f761943 70 #ifdef MBED_CLOUD_CLIENT_UPDATE_STORAGE
JimCarver 0:6b753f761943 71 extern ARM_UC_PAAL_UPDATE MBED_CLOUD_CLIENT_UPDATE_STORAGE;
JimCarver 0:6b753f761943 72 #else
JimCarver 0:6b753f761943 73 #error Update client storage must be defined in user configuration file
JimCarver 0:6b753f761943 74 #endif
JimCarver 0:6b753f761943 75
JimCarver 0:6b753f761943 76 namespace UpdateClient
JimCarver 0:6b753f761943 77 {
JimCarver 0:6b753f761943 78 enum UpdateClientEventType {
JimCarver 0:6b753f761943 79 UPDATE_CLIENT_EVENT_INITIALIZE,
JimCarver 0:6b753f761943 80 UPDATE_CLIENT_EVENT_PROCESS_QUEUE
JimCarver 0:6b753f761943 81 };
JimCarver 0:6b753f761943 82
JimCarver 0:6b753f761943 83 static int8_t update_client_tasklet_id = -1;
JimCarver 0:6b753f761943 84 static FP1<void, int32_t> error_callback;
JimCarver 0:6b753f761943 85
JimCarver 0:6b753f761943 86 static void certificate_done(arm_uc_error_t error,
JimCarver 0:6b753f761943 87 const arm_uc_buffer_t* fingerprint);
JimCarver 0:6b753f761943 88 static void initialization(void);
JimCarver 0:6b753f761943 89 static void initialization_done(int32_t);
JimCarver 0:6b753f761943 90 static void event_handler(arm_event_s* event);
JimCarver 0:6b753f761943 91 static void queue_handler(void);
JimCarver 0:6b753f761943 92 static void schedule_event(void);
JimCarver 0:6b753f761943 93 static void error_handler(int32_t error);
JimCarver 0:6b753f761943 94 }
JimCarver 0:6b753f761943 95
JimCarver 0:6b753f761943 96 void UpdateClient::UpdateClient(FP1<void, int32_t> callback)
JimCarver 0:6b753f761943 97 {
JimCarver 0:6b753f761943 98 tr_info("Update Client External Initialization: %p", (void*)pal_osThreadGetId());
JimCarver 0:6b753f761943 99
JimCarver 0:6b753f761943 100 /* store callback handler */
JimCarver 0:6b753f761943 101 error_callback = callback;
JimCarver 0:6b753f761943 102
JimCarver 0:6b753f761943 103 /* create event */
JimCarver 0:6b753f761943 104 eventOS_scheduler_mutex_wait();
JimCarver 0:6b753f761943 105 if (update_client_tasklet_id == -1) {
JimCarver 0:6b753f761943 106 update_client_tasklet_id = eventOS_event_handler_create(UpdateClient::event_handler,
JimCarver 0:6b753f761943 107 UPDATE_CLIENT_EVENT_INITIALIZE);
JimCarver 0:6b753f761943 108
JimCarver 0:6b753f761943 109 tr_info("UpdateClient::update_client_tasklet_id: %d",
JimCarver 0:6b753f761943 110 update_client_tasklet_id);
JimCarver 0:6b753f761943 111 }
JimCarver 0:6b753f761943 112 eventOS_scheduler_mutex_release();
JimCarver 0:6b753f761943 113 }
JimCarver 0:6b753f761943 114
JimCarver 0:6b753f761943 115 /**
JimCarver 0:6b753f761943 116 * @brief Populate M2MObjectList with Update Client objects.
JimCarver 0:6b753f761943 117 */
JimCarver 0:6b753f761943 118 void UpdateClient::populate_object_list(M2MBaseList& list)
JimCarver 0:6b753f761943 119 {
JimCarver 0:6b753f761943 120 /* Setup Firmware Update LWM2M object */
JimCarver 0:6b753f761943 121 list.push_back(FirmwareUpdateResource::getObject());
JimCarver 0:6b753f761943 122 list.push_back(DeviceMetadataResource::getObject());
JimCarver 0:6b753f761943 123 }
JimCarver 0:6b753f761943 124
JimCarver 0:6b753f761943 125 void UpdateClient::set_update_authorize_handler(void (*handler)(int32_t request))
JimCarver 0:6b753f761943 126 {
JimCarver 0:6b753f761943 127 ARM_UC_SetAuthorizeHandler(handler);
JimCarver 0:6b753f761943 128 }
JimCarver 0:6b753f761943 129
JimCarver 0:6b753f761943 130 void UpdateClient::update_authorize(int32_t request)
JimCarver 0:6b753f761943 131 {
JimCarver 0:6b753f761943 132 switch (request)
JimCarver 0:6b753f761943 133 {
JimCarver 0:6b753f761943 134 case RequestDownload:
JimCarver 0:6b753f761943 135 ARM_UC_Authorize(ARM_UCCC_REQUEST_DOWNLOAD);
JimCarver 0:6b753f761943 136 break;
JimCarver 0:6b753f761943 137 case RequestInstall:
JimCarver 0:6b753f761943 138 ARM_UC_Authorize(ARM_UCCC_REQUEST_INSTALL);
JimCarver 0:6b753f761943 139 break;
JimCarver 0:6b753f761943 140 case RequestInvalid:
JimCarver 0:6b753f761943 141 default:
JimCarver 0:6b753f761943 142 break;
JimCarver 0:6b753f761943 143 }
JimCarver 0:6b753f761943 144 }
JimCarver 0:6b753f761943 145
JimCarver 0:6b753f761943 146 void UpdateClient::set_update_progress_handler(void (*handler)(uint32_t progress, uint32_t total))
JimCarver 0:6b753f761943 147 {
JimCarver 0:6b753f761943 148 ARM_UC_SetProgressHandler(handler);
JimCarver 0:6b753f761943 149 }
JimCarver 0:6b753f761943 150
JimCarver 0:6b753f761943 151 static void UpdateClient::initialization(void)
JimCarver 0:6b753f761943 152 {
JimCarver 0:6b753f761943 153 tr_info("internal initialization: %p", (void*)pal_osThreadGetId());
JimCarver 0:6b753f761943 154
JimCarver 0:6b753f761943 155 /* Register sources */
JimCarver 0:6b753f761943 156 static const ARM_UPDATE_SOURCE* sources[] = {
JimCarver 0:6b753f761943 157 &ARM_UCS_HTTPSource,
JimCarver 0:6b753f761943 158 &ARM_UCS_LWM2M_SOURCE
JimCarver 0:6b753f761943 159 };
JimCarver 0:6b753f761943 160
JimCarver 0:6b753f761943 161 ARM_UC_HUB_SetSources(sources, sizeof(sources)/sizeof(ARM_UPDATE_SOURCE*));
JimCarver 0:6b753f761943 162
JimCarver 0:6b753f761943 163 /* Register sink for telemetry */
JimCarver 0:6b753f761943 164 ARM_UC_HUB_AddMonitor(&ARM_UCS_LWM2M_MONITOR);
JimCarver 0:6b753f761943 165
JimCarver 0:6b753f761943 166 /* Register local error handler */
JimCarver 0:6b753f761943 167 ARM_UC_HUB_AddErrorCallback(UpdateClient::error_handler);
JimCarver 0:6b753f761943 168
JimCarver 0:6b753f761943 169 /* Link internal queue with external scheduler.
JimCarver 0:6b753f761943 170 The callback handler is called whenever a task is posted to
JimCarver 0:6b753f761943 171 an empty queue. This will trigger the queue to be processed.
JimCarver 0:6b753f761943 172 */
JimCarver 0:6b753f761943 173 ARM_UC_HUB_AddNotificationHandler(UpdateClient::queue_handler);
JimCarver 0:6b753f761943 174
JimCarver 0:6b753f761943 175 /* The override function enables the LWM2M Firmware Update Object
JimCarver 0:6b753f761943 176 to authorize both download and installation. The intention is
JimCarver 0:6b753f761943 177 that a buggy user application can't block an update.
JimCarver 0:6b753f761943 178 */
JimCarver 0:6b753f761943 179 ARM_UC_CONTROL_SetOverrideCallback(ARM_UC_OverrideAuthorization);
JimCarver 0:6b753f761943 180
JimCarver 0:6b753f761943 181 #ifdef MBED_CLOUD_CLIENT_UPDATE_STORAGE
JimCarver 0:6b753f761943 182 /* Set implementation for storing firmware */
JimCarver 0:6b753f761943 183 ARM_UC_HUB_SetStorage(&MBED_CLOUD_CLIENT_UPDATE_STORAGE);
JimCarver 0:6b753f761943 184 #endif
JimCarver 0:6b753f761943 185
JimCarver 0:6b753f761943 186 #ifdef MBED_CLOUD_DEV_UPDATE_PSK
JimCarver 0:6b753f761943 187 /* Add pre shared key */
JimCarver 0:6b753f761943 188 ARM_UC_AddPreSharedKey(arm_uc_default_psk, arm_uc_default_psk_bits);
JimCarver 0:6b753f761943 189 #endif
JimCarver 0:6b753f761943 190
JimCarver 0:6b753f761943 191 /* Insert default certificate if defined otherwise initialze
JimCarver 0:6b753f761943 192 Update client immediately.
JimCarver 0:6b753f761943 193 */
JimCarver 0:6b753f761943 194 #ifdef MBED_CLOUD_DEV_UPDATE_CERT
JimCarver 0:6b753f761943 195 /* Add verification certificate */
JimCarver 0:6b753f761943 196 arm_uc_error_t result = ARM_UC_AddCertificate(arm_uc_default_certificate,
JimCarver 0:6b753f761943 197 arm_uc_default_certificate_size,
JimCarver 0:6b753f761943 198 arm_uc_default_fingerprint,
JimCarver 0:6b753f761943 199 arm_uc_default_fingerprint_size,
JimCarver 0:6b753f761943 200 UpdateClient::certificate_done);
JimCarver 0:6b753f761943 201
JimCarver 0:6b753f761943 202 /* Certificate insertion failed, most likely because the certificate
JimCarver 0:6b753f761943 203 has already been inserted once before.
JimCarver 0:6b753f761943 204
JimCarver 0:6b753f761943 205 Continue initialization regardlessly, since the Update Client can still
JimCarver 0:6b753f761943 206 work if verification certificates are inserted through the Factory
JimCarver 0:6b753f761943 207 Client or by other means.
JimCarver 0:6b753f761943 208 */
JimCarver 0:6b753f761943 209 if (result.code != ARM_UC_CM_ERR_NONE)
JimCarver 0:6b753f761943 210 {
JimCarver 0:6b753f761943 211 tr_info("ARM_UC_AddCertificate failed");
JimCarver 0:6b753f761943 212
JimCarver 0:6b753f761943 213 ARM_UC_HUB_Initialize(UpdateClient::initialization_done);
JimCarver 0:6b753f761943 214 }
JimCarver 0:6b753f761943 215 #else
JimCarver 0:6b753f761943 216 ARM_UC_HUB_Initialize(UpdateClient::initialization_done);
JimCarver 0:6b753f761943 217 #endif
JimCarver 0:6b753f761943 218 }
JimCarver 0:6b753f761943 219
JimCarver 0:6b753f761943 220 static void UpdateClient::certificate_done(arm_uc_error_t error,
JimCarver 0:6b753f761943 221 const arm_uc_buffer_t* fingerprint)
JimCarver 0:6b753f761943 222 {
JimCarver 0:6b753f761943 223 (void) fingerprint;
JimCarver 0:6b753f761943 224
JimCarver 0:6b753f761943 225 /* Certificate insertion failure is not necessarily fatal.
JimCarver 0:6b753f761943 226 If verification certificates have been injected by other means
JimCarver 0:6b753f761943 227 it is still possible to perform updates, which is why the
JimCarver 0:6b753f761943 228 Update client initializes anyway.
JimCarver 0:6b753f761943 229 */
JimCarver 0:6b753f761943 230 if (error.code != ARM_UC_CM_ERR_NONE)
JimCarver 0:6b753f761943 231 {
JimCarver 0:6b753f761943 232 error_callback.call(WarningCertificateInsertion);
JimCarver 0:6b753f761943 233 }
JimCarver 0:6b753f761943 234
JimCarver 0:6b753f761943 235 ARM_UC_HUB_Initialize(UpdateClient::initialization_done);
JimCarver 0:6b753f761943 236 }
JimCarver 0:6b753f761943 237
JimCarver 0:6b753f761943 238 static void UpdateClient::initialization_done(int32_t result)
JimCarver 0:6b753f761943 239 {
JimCarver 0:6b753f761943 240 tr_info("internal initialization done: %" PRIu32 " %p", result, (void*)pal_osThreadGetId());
JimCarver 0:6b753f761943 241 }
JimCarver 0:6b753f761943 242
JimCarver 0:6b753f761943 243 static void UpdateClient::event_handler(arm_event_s* event)
JimCarver 0:6b753f761943 244 {
JimCarver 0:6b753f761943 245 switch (event->event_type)
JimCarver 0:6b753f761943 246 {
JimCarver 0:6b753f761943 247 case UPDATE_CLIENT_EVENT_INITIALIZE:
JimCarver 0:6b753f761943 248 UpdateClient::initialization();
JimCarver 0:6b753f761943 249 break;
JimCarver 0:6b753f761943 250
JimCarver 0:6b753f761943 251 case UPDATE_CLIENT_EVENT_PROCESS_QUEUE:
JimCarver 0:6b753f761943 252 {
JimCarver 0:6b753f761943 253 /* process a single callback, for better cooperability */
JimCarver 0:6b753f761943 254 bool queue_not_empty = ARM_UC_ProcessSingleCallback();
JimCarver 0:6b753f761943 255
JimCarver 0:6b753f761943 256 if (queue_not_empty)
JimCarver 0:6b753f761943 257 {
JimCarver 0:6b753f761943 258 /* reschedule event handler, if queue is not empty */
JimCarver 0:6b753f761943 259 UpdateClient::schedule_event();
JimCarver 0:6b753f761943 260 }
JimCarver 0:6b753f761943 261 }
JimCarver 0:6b753f761943 262 break;
JimCarver 0:6b753f761943 263
JimCarver 0:6b753f761943 264 default:
JimCarver 0:6b753f761943 265 break;
JimCarver 0:6b753f761943 266 }
JimCarver 0:6b753f761943 267 }
JimCarver 0:6b753f761943 268
JimCarver 0:6b753f761943 269 static void UpdateClient::queue_handler(void)
JimCarver 0:6b753f761943 270 {
JimCarver 0:6b753f761943 271 /* warning: queue_handler can be called from interrupt context.
JimCarver 0:6b753f761943 272 */
JimCarver 0:6b753f761943 273 UpdateClient::schedule_event();
JimCarver 0:6b753f761943 274 }
JimCarver 0:6b753f761943 275
JimCarver 0:6b753f761943 276 static void UpdateClient::schedule_event()
JimCarver 0:6b753f761943 277 {
JimCarver 0:6b753f761943 278 /* schedule event */
JimCarver 0:6b753f761943 279 arm_event_s event = {0};
JimCarver 0:6b753f761943 280 event.receiver = update_client_tasklet_id;
JimCarver 0:6b753f761943 281 event.sender = 0;
JimCarver 0:6b753f761943 282 event.event_type = UPDATE_CLIENT_EVENT_PROCESS_QUEUE;
JimCarver 0:6b753f761943 283 event.event_id = 0;
JimCarver 0:6b753f761943 284 event.data_ptr = NULL;
JimCarver 0:6b753f761943 285 event.priority = ARM_LIB_LOW_PRIORITY_EVENT;
JimCarver 0:6b753f761943 286 event.event_data = 0;
JimCarver 0:6b753f761943 287
JimCarver 0:6b753f761943 288 eventOS_event_send(&event);
JimCarver 0:6b753f761943 289 }
JimCarver 0:6b753f761943 290
JimCarver 0:6b753f761943 291 static void UpdateClient::error_handler(int32_t error)
JimCarver 0:6b753f761943 292 {
JimCarver 0:6b753f761943 293 tr_info("error reported: %" PRIi32, error);
JimCarver 0:6b753f761943 294
JimCarver 0:6b753f761943 295 /* add warning base if less severe than error */
JimCarver 0:6b753f761943 296 if (error < ARM_UC_ERROR)
JimCarver 0:6b753f761943 297 {
JimCarver 0:6b753f761943 298 error_callback.call(WarningBase + error);
JimCarver 0:6b753f761943 299 }
JimCarver 0:6b753f761943 300 /* add error base if less severe than fatal */
JimCarver 0:6b753f761943 301 else if (error < ARM_UC_FATAL)
JimCarver 0:6b753f761943 302 {
JimCarver 0:6b753f761943 303 error_callback.call(ErrorBase + error);
JimCarver 0:6b753f761943 304 }
JimCarver 0:6b753f761943 305 /* add fatal base */
JimCarver 0:6b753f761943 306 else
JimCarver 0:6b753f761943 307 {
JimCarver 0:6b753f761943 308 error_callback.call(FatalBase + error);
JimCarver 0:6b753f761943 309 }
JimCarver 0:6b753f761943 310 }
JimCarver 0:6b753f761943 311
JimCarver 0:6b753f761943 312 int UpdateClient::getVendorId(uint8_t* buffer, size_t buffer_size_max, size_t* value_size)
JimCarver 0:6b753f761943 313 {
JimCarver 0:6b753f761943 314 arm_uc_error_t err = ARM_UC_GetVendorId(buffer, buffer_size_max, value_size);
JimCarver 0:6b753f761943 315 if (err.code == ARM_UC_DI_ERR_SIZE)
JimCarver 0:6b753f761943 316 {
JimCarver 0:6b753f761943 317 return CCS_STATUS_MEMORY_ERROR;
JimCarver 0:6b753f761943 318 }
JimCarver 0:6b753f761943 319 if (err.error == ERR_NONE)
JimCarver 0:6b753f761943 320 {
JimCarver 0:6b753f761943 321 *value_size = 16;
JimCarver 0:6b753f761943 322 return CCS_STATUS_SUCCESS;
JimCarver 0:6b753f761943 323 }
JimCarver 0:6b753f761943 324 return CCS_STATUS_KEY_DOESNT_EXIST;
JimCarver 0:6b753f761943 325 }
JimCarver 0:6b753f761943 326 int UpdateClient::getClassId(uint8_t* buffer, size_t buffer_size_max, size_t* value_size)
JimCarver 0:6b753f761943 327 {
JimCarver 0:6b753f761943 328 arm_uc_error_t err = ARM_UC_GetClassId(buffer, buffer_size_max, value_size);
JimCarver 0:6b753f761943 329 if (err.code == ARM_UC_DI_ERR_SIZE)
JimCarver 0:6b753f761943 330 {
JimCarver 0:6b753f761943 331 return CCS_STATUS_MEMORY_ERROR;
JimCarver 0:6b753f761943 332 }
JimCarver 0:6b753f761943 333 if (err.error == ERR_NONE)
JimCarver 0:6b753f761943 334 {
JimCarver 0:6b753f761943 335 *value_size = 16;
JimCarver 0:6b753f761943 336 return CCS_STATUS_SUCCESS;
JimCarver 0:6b753f761943 337 }
JimCarver 0:6b753f761943 338 return CCS_STATUS_KEY_DOESNT_EXIST;
JimCarver 0:6b753f761943 339 }
JimCarver 0:6b753f761943 340 int UpdateClient::getDeviceId(uint8_t* buffer, size_t buffer_size_max, size_t* value_size)
JimCarver 0:6b753f761943 341 {
JimCarver 0:6b753f761943 342 arm_uc_error_t err = ARM_UC_GetDeviceId(buffer, buffer_size_max, value_size);
JimCarver 0:6b753f761943 343 if (err.code == ARM_UC_DI_ERR_SIZE)
JimCarver 0:6b753f761943 344 {
JimCarver 0:6b753f761943 345 return CCS_STATUS_MEMORY_ERROR;
JimCarver 0:6b753f761943 346 }
JimCarver 0:6b753f761943 347 if (err.error == ERR_NONE)
JimCarver 0:6b753f761943 348 {
JimCarver 0:6b753f761943 349 *value_size = 16;
JimCarver 0:6b753f761943 350 return CCS_STATUS_SUCCESS;
JimCarver 0:6b753f761943 351 }
JimCarver 0:6b753f761943 352 return CCS_STATUS_KEY_DOESNT_EXIST;
JimCarver 0:6b753f761943 353 }
JimCarver 0:6b753f761943 354
JimCarver 0:6b753f761943 355 #endif