Example

Dependencies:   FXAS21002 FXOS8700Q

Committer:
maygup01
Date:
Tue Nov 19 09:49:38 2019 +0000
Revision:
0:11cc2b7889af
Example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maygup01 0:11cc2b7889af 1 // ----------------------------------------------------------------------------
maygup01 0:11cc2b7889af 2 // Copyright 2016-2017 ARM Ltd.
maygup01 0:11cc2b7889af 3 //
maygup01 0:11cc2b7889af 4 // SPDX-License-Identifier: Apache-2.0
maygup01 0:11cc2b7889af 5 //
maygup01 0:11cc2b7889af 6 // Licensed under the Apache License, Version 2.0 (the "License");
maygup01 0:11cc2b7889af 7 // you may not use this file except in compliance with the License.
maygup01 0:11cc2b7889af 8 // You may obtain a copy of the License at
maygup01 0:11cc2b7889af 9 //
maygup01 0:11cc2b7889af 10 // http://www.apache.org/licenses/LICENSE-2.0
maygup01 0:11cc2b7889af 11 //
maygup01 0:11cc2b7889af 12 // Unless required by applicable law or agreed to in writing, software
maygup01 0:11cc2b7889af 13 // distributed under the License is distributed on an "AS IS" BASIS,
maygup01 0:11cc2b7889af 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
maygup01 0:11cc2b7889af 15 // See the License for the specific language governing permissions and
maygup01 0:11cc2b7889af 16 // limitations under the License.
maygup01 0:11cc2b7889af 17 // ----------------------------------------------------------------------------
maygup01 0:11cc2b7889af 18
maygup01 0:11cc2b7889af 19 // Note: this macro is needed on armcc to get the the PRI*32 macros
maygup01 0:11cc2b7889af 20 // from inttypes.h in a C++ code.
maygup01 0:11cc2b7889af 21 #ifndef __STDC_FORMAT_MACROS
maygup01 0:11cc2b7889af 22 #define __STDC_FORMAT_MACROS
maygup01 0:11cc2b7889af 23 #endif
maygup01 0:11cc2b7889af 24 #include <inttypes.h>
maygup01 0:11cc2b7889af 25
maygup01 0:11cc2b7889af 26 #include "include/ServiceClient.h"
maygup01 0:11cc2b7889af 27 #include "include/CloudClientStorage.h"
maygup01 0:11cc2b7889af 28 #include "include/UpdateClientResources.h"
maygup01 0:11cc2b7889af 29 #include "include/UpdateClient.h"
maygup01 0:11cc2b7889af 30 #include "factory_configurator_client.h"
maygup01 0:11cc2b7889af 31 #include "mbed-client/m2mconstants.h"
maygup01 0:11cc2b7889af 32 #include "mbed-trace/mbed_trace.h"
maygup01 0:11cc2b7889af 33 #include "pal.h"
maygup01 0:11cc2b7889af 34 #ifndef MBED_CONF_MBED_CLOUD_CLIENT_DISABLE_CERTIFICATE_ENROLLMENT
maygup01 0:11cc2b7889af 35 #include "CertificateEnrollmentClient.h"
maygup01 0:11cc2b7889af 36 #endif // MBED_CONF_MBED_CLOUD_CLIENT_DISABLE_CERTIFICATE_ENROLLMENT
maygup01 0:11cc2b7889af 37
maygup01 0:11cc2b7889af 38 #if MBED_CLOUD_CLIENT_STL_API
maygup01 0:11cc2b7889af 39 #include <string>
maygup01 0:11cc2b7889af 40 #endif
maygup01 0:11cc2b7889af 41
maygup01 0:11cc2b7889af 42 #include <assert.h>
maygup01 0:11cc2b7889af 43
maygup01 0:11cc2b7889af 44 #define TRACE_GROUP "mClt"
maygup01 0:11cc2b7889af 45
maygup01 0:11cc2b7889af 46 #define CONNECT 0
maygup01 0:11cc2b7889af 47 #define ERROR_UPDATE "Update has failed, check MbedCloudClient::Error"
maygup01 0:11cc2b7889af 48
maygup01 0:11cc2b7889af 49 /* lookup table for printing hexadecimal values */
maygup01 0:11cc2b7889af 50 const uint8_t ServiceClient::hex_table[16] = {
maygup01 0:11cc2b7889af 51 '0', '1', '2', '3', '4', '5', '6', '7',
maygup01 0:11cc2b7889af 52 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
maygup01 0:11cc2b7889af 53 };
maygup01 0:11cc2b7889af 54
maygup01 0:11cc2b7889af 55 ServiceClient::ServiceClient(ServiceClientCallback& callback)
maygup01 0:11cc2b7889af 56 : _service_callback(callback),
maygup01 0:11cc2b7889af 57 _service_uri(NULL),
maygup01 0:11cc2b7889af 58 _stack(NULL),
maygup01 0:11cc2b7889af 59 _client_objs(NULL),
maygup01 0:11cc2b7889af 60 _current_state(State_Init),
maygup01 0:11cc2b7889af 61 _event_generated(false),
maygup01 0:11cc2b7889af 62 _state_engine_running(false),
maygup01 0:11cc2b7889af 63 #ifdef MBED_CLOUD_CLIENT_SUPPORT_UPDATE
maygup01 0:11cc2b7889af 64 _setup_update_client(false),
maygup01 0:11cc2b7889af 65 #endif
maygup01 0:11cc2b7889af 66 _connector_client(this)
maygup01 0:11cc2b7889af 67 {
maygup01 0:11cc2b7889af 68 }
maygup01 0:11cc2b7889af 69
maygup01 0:11cc2b7889af 70 ServiceClient::~ServiceClient()
maygup01 0:11cc2b7889af 71 {
maygup01 0:11cc2b7889af 72 #ifdef MBED_CLOUD_CLIENT_SUPPORT_UPDATE
maygup01 0:11cc2b7889af 73 ARM_UC_HUB_Uninitialize();
maygup01 0:11cc2b7889af 74 #endif
maygup01 0:11cc2b7889af 75 #ifndef MBED_CONF_MBED_CLOUD_CLIENT_DISABLE_CERTIFICATE_ENROLLMENT
maygup01 0:11cc2b7889af 76 CertificateEnrollmentClient::finalize();
maygup01 0:11cc2b7889af 77 #endif // MBED_CONF_MBED_CLOUD_CLIENT_DISABLE_CERTIFICATE_ENROLLMENT
maygup01 0:11cc2b7889af 78 }
maygup01 0:11cc2b7889af 79
maygup01 0:11cc2b7889af 80 void ServiceClient::initialize_and_register(M2MBaseList& reg_objs)
maygup01 0:11cc2b7889af 81 {
maygup01 0:11cc2b7889af 82 tr_debug("ServiceClient::initialize_and_register");
maygup01 0:11cc2b7889af 83 if(_current_state == State_Init ||
maygup01 0:11cc2b7889af 84 _current_state == State_Unregister ||
maygup01 0:11cc2b7889af 85 _current_state == State_Failure) {
maygup01 0:11cc2b7889af 86 _client_objs = &reg_objs;
maygup01 0:11cc2b7889af 87
maygup01 0:11cc2b7889af 88 #ifdef MBED_CLOUD_CLIENT_SUPPORT_UPDATE
maygup01 0:11cc2b7889af 89 tr_debug("ServiceClient::initialize_and_register: update client supported");
maygup01 0:11cc2b7889af 90
maygup01 0:11cc2b7889af 91 if(!_setup_update_client) {
maygup01 0:11cc2b7889af 92 _setup_update_client = true;
maygup01 0:11cc2b7889af 93
maygup01 0:11cc2b7889af 94 #ifdef MBED_CLOUD_DEV_UPDATE_ID
maygup01 0:11cc2b7889af 95 /* Overwrite values stored in KCM. This is for development only
maygup01 0:11cc2b7889af 96 since these IDs should be provisioned in the factory.
maygup01 0:11cc2b7889af 97 */
maygup01 0:11cc2b7889af 98 tr_debug("ServiceClient::initialize_and_register: update IDs defined");
maygup01 0:11cc2b7889af 99
maygup01 0:11cc2b7889af 100 /* Delete VendorId */
maygup01 0:11cc2b7889af 101 ccs_delete_item("mbed.VendorId", CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 102 /* Store Vendor Id to mbed.VendorId. No conversion is performed. */
maygup01 0:11cc2b7889af 103 set_device_resource_value(M2MDevice::Manufacturer,
maygup01 0:11cc2b7889af 104 (const char*) arm_uc_vendor_id,
maygup01 0:11cc2b7889af 105 arm_uc_vendor_id_size);
maygup01 0:11cc2b7889af 106
maygup01 0:11cc2b7889af 107 /* Delete ClassId */
maygup01 0:11cc2b7889af 108 ccs_delete_item("mbed.ClassId", CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 109 /* Store Class Id to mbed.ClassId. No conversion is performed. */
maygup01 0:11cc2b7889af 110 set_device_resource_value(M2MDevice::ModelNumber,
maygup01 0:11cc2b7889af 111 (const char*) arm_uc_class_id,
maygup01 0:11cc2b7889af 112 arm_uc_class_id_size);
maygup01 0:11cc2b7889af 113 #endif /* MBED_CLOUD_DEV_UPDATE_ID */
maygup01 0:11cc2b7889af 114
maygup01 0:11cc2b7889af 115 #ifdef ARM_UPDATE_CLIENT_VERSION
maygup01 0:11cc2b7889af 116 /* Inject Update Client version number if no other software
maygup01 0:11cc2b7889af 117 version is present in the KCM.
maygup01 0:11cc2b7889af 118 */
maygup01 0:11cc2b7889af 119 tr_debug("ServiceClient::initialize_and_register: update version defined");
maygup01 0:11cc2b7889af 120
maygup01 0:11cc2b7889af 121 const size_t buffer_size = 16;
maygup01 0:11cc2b7889af 122 uint8_t buffer[buffer_size];
maygup01 0:11cc2b7889af 123 size_t size = 0;
maygup01 0:11cc2b7889af 124
maygup01 0:11cc2b7889af 125 /* check if software version is already set */
maygup01 0:11cc2b7889af 126 ccs_status_e status = ccs_get_item(KEY_DEVICE_SOFTWAREVERSION,
maygup01 0:11cc2b7889af 127 buffer, buffer_size, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 128
maygup01 0:11cc2b7889af 129 if (status == CCS_STATUS_KEY_DOESNT_EXIST) {
maygup01 0:11cc2b7889af 130 tr_debug("ServiceClient::initialize_and_register: insert update version");
maygup01 0:11cc2b7889af 131
maygup01 0:11cc2b7889af 132 /* insert value from Update Client Common */
maygup01 0:11cc2b7889af 133 ccs_set_item(KEY_DEVICE_SOFTWAREVERSION,
maygup01 0:11cc2b7889af 134 (const uint8_t*) ARM_UPDATE_CLIENT_VERSION,
maygup01 0:11cc2b7889af 135 sizeof(ARM_UPDATE_CLIENT_VERSION),
maygup01 0:11cc2b7889af 136 CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 137 }
maygup01 0:11cc2b7889af 138 #endif /* ARM_UPDATE_CLIENT_VERSION */
maygup01 0:11cc2b7889af 139
maygup01 0:11cc2b7889af 140 /* Update Client adds the OMA LWM2M Firmware Update object */
maygup01 0:11cc2b7889af 141 UpdateClient::populate_object_list(*_client_objs);
maygup01 0:11cc2b7889af 142
maygup01 0:11cc2b7889af 143 /* Initialize Update Client */
maygup01 0:11cc2b7889af 144 FP1<void, int32_t> callback(this, &ServiceClient::update_error_callback);
maygup01 0:11cc2b7889af 145 UpdateClient::UpdateClient(callback, _connector_client.m2m_interface(), this);
maygup01 0:11cc2b7889af 146 }
maygup01 0:11cc2b7889af 147 // else branch is required for re-initialization.
maygup01 0:11cc2b7889af 148 else {
maygup01 0:11cc2b7889af 149 finish_initialization();
maygup01 0:11cc2b7889af 150 }
maygup01 0:11cc2b7889af 151 #else /* MBED_CLOUD_CLIENT_SUPPORT_UPDATE */
maygup01 0:11cc2b7889af 152 finish_initialization();
maygup01 0:11cc2b7889af 153 #endif /* MBED_CLOUD_CLIENT_SUPPORT_UPDATE */
maygup01 0:11cc2b7889af 154 } else if (_current_state == State_Success) {
maygup01 0:11cc2b7889af 155 state_success();
maygup01 0:11cc2b7889af 156 }
maygup01 0:11cc2b7889af 157 }
maygup01 0:11cc2b7889af 158
maygup01 0:11cc2b7889af 159 void ServiceClient::finish_initialization(void)
maygup01 0:11cc2b7889af 160 {
maygup01 0:11cc2b7889af 161 /* Device Object is mandatory.
maygup01 0:11cc2b7889af 162 Get instance and add it to object list
maygup01 0:11cc2b7889af 163 */
maygup01 0:11cc2b7889af 164 M2MDevice *device_object = device_object_from_storage();
maygup01 0:11cc2b7889af 165
maygup01 0:11cc2b7889af 166 #ifndef MBED_CONF_MBED_CLOUD_CLIENT_DISABLE_CERTIFICATE_ENROLLMENT
maygup01 0:11cc2b7889af 167 // Initialize the certificate enrollment resources and module
maygup01 0:11cc2b7889af 168 if (CertificateEnrollmentClient::init(*_client_objs, &_connector_client.est_client()) != CE_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 169 _service_callback.error((int)CE_STATUS_INIT_FAILED, "Certificate Enrollment initialization failed");
maygup01 0:11cc2b7889af 170 }
maygup01 0:11cc2b7889af 171 #endif /* !MBED_CONF_MBED_CLOUD_CLIENT_DISABLE_CERTIFICATE_ENROLLMENT */
maygup01 0:11cc2b7889af 172
maygup01 0:11cc2b7889af 173 if (device_object) {
maygup01 0:11cc2b7889af 174 /* Publish device object resource to mds */
maygup01 0:11cc2b7889af 175 M2MResourceList list = device_object->object_instance()->resources();
maygup01 0:11cc2b7889af 176 if(!list.empty()) {
maygup01 0:11cc2b7889af 177 M2MResourceList::const_iterator it;
maygup01 0:11cc2b7889af 178 it = list.begin();
maygup01 0:11cc2b7889af 179 for ( ; it != list.end(); it++ ) {
maygup01 0:11cc2b7889af 180 (*it)->set_register_uri(true);
maygup01 0:11cc2b7889af 181 }
maygup01 0:11cc2b7889af 182 }
maygup01 0:11cc2b7889af 183
maygup01 0:11cc2b7889af 184 /* Add Device Object to object list. */
maygup01 0:11cc2b7889af 185 _client_objs->push_back(device_object);
maygup01 0:11cc2b7889af 186 }
maygup01 0:11cc2b7889af 187
maygup01 0:11cc2b7889af 188 internal_event(State_Bootstrap);
maygup01 0:11cc2b7889af 189 }
maygup01 0:11cc2b7889af 190
maygup01 0:11cc2b7889af 191 ConnectorClient &ServiceClient::connector_client()
maygup01 0:11cc2b7889af 192 {
maygup01 0:11cc2b7889af 193 return _connector_client;
maygup01 0:11cc2b7889af 194 }
maygup01 0:11cc2b7889af 195
maygup01 0:11cc2b7889af 196 const ConnectorClient &ServiceClient::connector_client() const
maygup01 0:11cc2b7889af 197 {
maygup01 0:11cc2b7889af 198 return _connector_client;
maygup01 0:11cc2b7889af 199 }
maygup01 0:11cc2b7889af 200
maygup01 0:11cc2b7889af 201 // generates an internal event. called from within a state
maygup01 0:11cc2b7889af 202 // function to transition to a new state
maygup01 0:11cc2b7889af 203 void ServiceClient::internal_event(StartupMainState new_state)
maygup01 0:11cc2b7889af 204 {
maygup01 0:11cc2b7889af 205 tr_debug("ServiceClient::internal_event: state: %d -> %d", _current_state, new_state);
maygup01 0:11cc2b7889af 206
maygup01 0:11cc2b7889af 207 _event_generated = true;
maygup01 0:11cc2b7889af 208 _current_state = new_state;
maygup01 0:11cc2b7889af 209
maygup01 0:11cc2b7889af 210 if (!_state_engine_running) {
maygup01 0:11cc2b7889af 211 state_engine();
maygup01 0:11cc2b7889af 212 }
maygup01 0:11cc2b7889af 213 }
maygup01 0:11cc2b7889af 214
maygup01 0:11cc2b7889af 215 // the state engine executes the state machine states
maygup01 0:11cc2b7889af 216 void ServiceClient::state_engine(void)
maygup01 0:11cc2b7889af 217 {
maygup01 0:11cc2b7889af 218 tr_debug("ServiceClient::state_engine");
maygup01 0:11cc2b7889af 219
maygup01 0:11cc2b7889af 220 // this simple flagging gets rid of recursive calls to this method
maygup01 0:11cc2b7889af 221 _state_engine_running = true;
maygup01 0:11cc2b7889af 222
maygup01 0:11cc2b7889af 223 // while events are being generated keep executing states
maygup01 0:11cc2b7889af 224 while (_event_generated) {
maygup01 0:11cc2b7889af 225 _event_generated = false; // event used up, reset flag
maygup01 0:11cc2b7889af 226
maygup01 0:11cc2b7889af 227 state_function(_current_state);
maygup01 0:11cc2b7889af 228 }
maygup01 0:11cc2b7889af 229
maygup01 0:11cc2b7889af 230 _state_engine_running = false;
maygup01 0:11cc2b7889af 231 }
maygup01 0:11cc2b7889af 232
maygup01 0:11cc2b7889af 233 void ServiceClient::state_function(StartupMainState current_state)
maygup01 0:11cc2b7889af 234 {
maygup01 0:11cc2b7889af 235 switch (current_state) {
maygup01 0:11cc2b7889af 236 case State_Init: // -> Goes to bootstrap state
maygup01 0:11cc2b7889af 237 case State_Bootstrap: // -> State_Register OR State_Failure
maygup01 0:11cc2b7889af 238 state_bootstrap();
maygup01 0:11cc2b7889af 239 break;
maygup01 0:11cc2b7889af 240 case State_Register: // -> State_Succes OR State_Failure
maygup01 0:11cc2b7889af 241 state_register();
maygup01 0:11cc2b7889af 242 break;
maygup01 0:11cc2b7889af 243 case State_Success: // return success to user
maygup01 0:11cc2b7889af 244 state_success();
maygup01 0:11cc2b7889af 245 break;
maygup01 0:11cc2b7889af 246 case State_Failure: // return error to user
maygup01 0:11cc2b7889af 247 state_failure();
maygup01 0:11cc2b7889af 248 break;
maygup01 0:11cc2b7889af 249 case State_Unregister: // return error to user
maygup01 0:11cc2b7889af 250 state_unregister();
maygup01 0:11cc2b7889af 251 break;
maygup01 0:11cc2b7889af 252 }
maygup01 0:11cc2b7889af 253 }
maygup01 0:11cc2b7889af 254
maygup01 0:11cc2b7889af 255 void ServiceClient::state_bootstrap()
maygup01 0:11cc2b7889af 256 {
maygup01 0:11cc2b7889af 257 tr_info("ServiceClient::state_bootstrap()");
maygup01 0:11cc2b7889af 258 bool credentials_ready = _connector_client.connector_credentials_available();
maygup01 0:11cc2b7889af 259 bool bootstrap = _connector_client.use_bootstrap();
maygup01 0:11cc2b7889af 260 tr_info("ServiceClient::state_bootstrap() - lwm2m credentials available: %d", credentials_ready);
maygup01 0:11cc2b7889af 261 tr_info("ServiceClient::state_bootstrap() - use bootstrap: %d", bootstrap);
maygup01 0:11cc2b7889af 262
maygup01 0:11cc2b7889af 263 bool get_time = false;
maygup01 0:11cc2b7889af 264 #if defined (PAL_USE_SECURE_TIME) && (PAL_USE_SECURE_TIME == 1)
maygup01 0:11cc2b7889af 265 // Strong time is mandatory in bootstrap mode
maygup01 0:11cc2b7889af 266 get_time = pal_osGetTime() == 0 ? true : false;
maygup01 0:11cc2b7889af 267 #endif
maygup01 0:11cc2b7889af 268 // Fallback to rebootstrap if time fetch fails in PAL_USE_SECURE_TIME case
maygup01 0:11cc2b7889af 269 if (credentials_ready && bootstrap && get_time) {
maygup01 0:11cc2b7889af 270 _connector_client.bootstrap_again();
maygup01 0:11cc2b7889af 271 } else if (credentials_ready || !bootstrap) {
maygup01 0:11cc2b7889af 272 internal_event(State_Register);
maygup01 0:11cc2b7889af 273 } else {
maygup01 0:11cc2b7889af 274 _connector_client.start_bootstrap();
maygup01 0:11cc2b7889af 275 }
maygup01 0:11cc2b7889af 276 }
maygup01 0:11cc2b7889af 277
maygup01 0:11cc2b7889af 278 void ServiceClient::state_register()
maygup01 0:11cc2b7889af 279 {
maygup01 0:11cc2b7889af 280 tr_info("ServiceClient::state_register()");
maygup01 0:11cc2b7889af 281 _connector_client.start_registration(_client_objs);
maygup01 0:11cc2b7889af 282 }
maygup01 0:11cc2b7889af 283
maygup01 0:11cc2b7889af 284 void ServiceClient::registration_process_result(ConnectorClient::StartupSubStateRegistration status)
maygup01 0:11cc2b7889af 285 {
maygup01 0:11cc2b7889af 286 tr_debug("ServiceClient::registration_process_result(): status: %d", status);
maygup01 0:11cc2b7889af 287 if (status == ConnectorClient::State_Registration_Success) {
maygup01 0:11cc2b7889af 288 internal_event(State_Success);
maygup01 0:11cc2b7889af 289 } else if(status == ConnectorClient::State_Registration_Failure ||
maygup01 0:11cc2b7889af 290 status == ConnectorClient::State_Bootstrap_Failure){
maygup01 0:11cc2b7889af 291 internal_event(State_Failure); // XXX: the status should be saved to eg. event object
maygup01 0:11cc2b7889af 292 }
maygup01 0:11cc2b7889af 293 if(status == ConnectorClient::State_Bootstrap_Success) {
maygup01 0:11cc2b7889af 294 internal_event(State_Register);
maygup01 0:11cc2b7889af 295 }
maygup01 0:11cc2b7889af 296 if(status == ConnectorClient::State_Unregistered) {
maygup01 0:11cc2b7889af 297 internal_event(State_Unregister);
maygup01 0:11cc2b7889af 298 }
maygup01 0:11cc2b7889af 299 if (status == ConnectorClient::State_Registration_Updated) {
maygup01 0:11cc2b7889af 300 _service_callback.complete(ServiceClientCallback::Service_Client_Status_Register_Updated);
maygup01 0:11cc2b7889af 301 }
maygup01 0:11cc2b7889af 302 }
maygup01 0:11cc2b7889af 303
maygup01 0:11cc2b7889af 304 void ServiceClient::connector_error(M2MInterface::Error error, const char *reason)
maygup01 0:11cc2b7889af 305 {
maygup01 0:11cc2b7889af 306 tr_error("ServiceClient::connector_error() error %d", (int)error);
maygup01 0:11cc2b7889af 307 if (_current_state == State_Register) {
maygup01 0:11cc2b7889af 308 registration_process_result(ConnectorClient::State_Registration_Failure);
maygup01 0:11cc2b7889af 309 }
maygup01 0:11cc2b7889af 310 else if (_current_state == State_Bootstrap) {
maygup01 0:11cc2b7889af 311 registration_process_result(ConnectorClient::State_Bootstrap_Failure);
maygup01 0:11cc2b7889af 312 }
maygup01 0:11cc2b7889af 313 _service_callback.error(int(error),reason);
maygup01 0:11cc2b7889af 314 internal_event(State_Failure);
maygup01 0:11cc2b7889af 315 }
maygup01 0:11cc2b7889af 316
maygup01 0:11cc2b7889af 317 void ServiceClient::value_updated(M2MBase *base, M2MBase::BaseType type)
maygup01 0:11cc2b7889af 318 {
maygup01 0:11cc2b7889af 319 tr_debug("ServiceClient::value_updated()");
maygup01 0:11cc2b7889af 320 _service_callback.value_updated(base, type);
maygup01 0:11cc2b7889af 321 }
maygup01 0:11cc2b7889af 322
maygup01 0:11cc2b7889af 323 void ServiceClient::state_success()
maygup01 0:11cc2b7889af 324 {
maygup01 0:11cc2b7889af 325 tr_info("ServiceClient::state_success()");
maygup01 0:11cc2b7889af 326 // this is verified already at client API level, but this might still catch some logic failures
maygup01 0:11cc2b7889af 327 _service_callback.complete(ServiceClientCallback::Service_Client_Status_Registered);
maygup01 0:11cc2b7889af 328 }
maygup01 0:11cc2b7889af 329
maygup01 0:11cc2b7889af 330 void ServiceClient::state_failure()
maygup01 0:11cc2b7889af 331 {
maygup01 0:11cc2b7889af 332 tr_error("ServiceClient::state_failure()");
maygup01 0:11cc2b7889af 333 _service_callback.complete(ServiceClientCallback::Service_Client_Status_Failure);
maygup01 0:11cc2b7889af 334 }
maygup01 0:11cc2b7889af 335
maygup01 0:11cc2b7889af 336 void ServiceClient::state_unregister()
maygup01 0:11cc2b7889af 337 {
maygup01 0:11cc2b7889af 338 tr_debug("ServiceClient::state_unregister()");
maygup01 0:11cc2b7889af 339 _service_callback.complete(ServiceClientCallback::Service_Client_Status_Unregistered);
maygup01 0:11cc2b7889af 340 }
maygup01 0:11cc2b7889af 341
maygup01 0:11cc2b7889af 342 M2MDevice* ServiceClient::device_object_from_storage()
maygup01 0:11cc2b7889af 343 {
maygup01 0:11cc2b7889af 344 M2MDevice *device_object = M2MInterfaceFactory::create_device();
maygup01 0:11cc2b7889af 345 if (device_object == NULL) {
maygup01 0:11cc2b7889af 346 return NULL;
maygup01 0:11cc2b7889af 347 }
maygup01 0:11cc2b7889af 348 M2MObjectInstance* instance = device_object->object_instance(0);
maygup01 0:11cc2b7889af 349 if(instance == NULL) {
maygup01 0:11cc2b7889af 350 return NULL;
maygup01 0:11cc2b7889af 351 }
maygup01 0:11cc2b7889af 352
maygup01 0:11cc2b7889af 353 const size_t buffer_size = 128;
maygup01 0:11cc2b7889af 354 uint8_t buffer[buffer_size];
maygup01 0:11cc2b7889af 355 size_t size = 0;
maygup01 0:11cc2b7889af 356 M2MResource *res = NULL;
maygup01 0:11cc2b7889af 357
maygup01 0:11cc2b7889af 358 // Read values to device object
maygup01 0:11cc2b7889af 359 // create_resource() function returns NULL if resource already exists
maygup01 0:11cc2b7889af 360 ccs_status_e status = ccs_get_item(g_fcc_manufacturer_parameter_name, buffer, buffer_size, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 361 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 362 const String data((char*)buffer, size);
maygup01 0:11cc2b7889af 363 res = device_object->create_resource(M2MDevice::Manufacturer, data);
maygup01 0:11cc2b7889af 364 if (res == NULL) {
maygup01 0:11cc2b7889af 365 res = instance->resource(DEVICE_MANUFACTURER);
maygup01 0:11cc2b7889af 366 device_object->set_resource_value(M2MDevice::Manufacturer, data);
maygup01 0:11cc2b7889af 367 }
maygup01 0:11cc2b7889af 368 if(res) {
maygup01 0:11cc2b7889af 369 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 370 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 371 }
maygup01 0:11cc2b7889af 372 }
maygup01 0:11cc2b7889af 373 status = ccs_get_item(g_fcc_model_number_parameter_name, buffer, buffer_size, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 374 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 375 const String data((char*)buffer, size);
maygup01 0:11cc2b7889af 376 res = device_object->create_resource(M2MDevice::ModelNumber, data);
maygup01 0:11cc2b7889af 377 if (res == NULL) {
maygup01 0:11cc2b7889af 378 res = instance->resource(DEVICE_MODEL_NUMBER);
maygup01 0:11cc2b7889af 379 device_object->set_resource_value(M2MDevice::ModelNumber, data);
maygup01 0:11cc2b7889af 380 }
maygup01 0:11cc2b7889af 381 if(res) {
maygup01 0:11cc2b7889af 382 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 383 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 384 }
maygup01 0:11cc2b7889af 385 }
maygup01 0:11cc2b7889af 386 status = ccs_get_item(g_fcc_device_serial_number_parameter_name, buffer, buffer_size, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 387 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 388 const String data((char*)buffer, size);
maygup01 0:11cc2b7889af 389 res = device_object->create_resource(M2MDevice::SerialNumber, data);
maygup01 0:11cc2b7889af 390 if (res == NULL) {
maygup01 0:11cc2b7889af 391 res = instance->resource(DEVICE_SERIAL_NUMBER);
maygup01 0:11cc2b7889af 392 device_object->set_resource_value(M2MDevice::SerialNumber, data);
maygup01 0:11cc2b7889af 393 }
maygup01 0:11cc2b7889af 394 if(res) {
maygup01 0:11cc2b7889af 395 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 396 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 397 }
maygup01 0:11cc2b7889af 398 }
maygup01 0:11cc2b7889af 399
maygup01 0:11cc2b7889af 400 status = ccs_get_item(g_fcc_device_type_parameter_name, buffer, buffer_size, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 401 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 402 const String data((char*)buffer, size);
maygup01 0:11cc2b7889af 403 res = device_object->create_resource(M2MDevice::DeviceType, data);
maygup01 0:11cc2b7889af 404 if (res == NULL) {
maygup01 0:11cc2b7889af 405 res = instance->resource(DEVICE_DEVICE_TYPE);
maygup01 0:11cc2b7889af 406 device_object->set_resource_value(M2MDevice::DeviceType, data);
maygup01 0:11cc2b7889af 407 }
maygup01 0:11cc2b7889af 408 if(res) {
maygup01 0:11cc2b7889af 409 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 410 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 411 }
maygup01 0:11cc2b7889af 412 }
maygup01 0:11cc2b7889af 413
maygup01 0:11cc2b7889af 414 status = ccs_get_item(g_fcc_hardware_version_parameter_name, buffer, buffer_size, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 415 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 416 const String data((char*)buffer, size);
maygup01 0:11cc2b7889af 417 res = device_object->create_resource(M2MDevice::HardwareVersion, data);
maygup01 0:11cc2b7889af 418 if (res == NULL) {
maygup01 0:11cc2b7889af 419 res = instance->resource(DEVICE_HARDWARE_VERSION);
maygup01 0:11cc2b7889af 420 device_object->set_resource_value(M2MDevice::HardwareVersion, data);
maygup01 0:11cc2b7889af 421 }
maygup01 0:11cc2b7889af 422 if(res) {
maygup01 0:11cc2b7889af 423 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 424 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 425 }
maygup01 0:11cc2b7889af 426 }
maygup01 0:11cc2b7889af 427
maygup01 0:11cc2b7889af 428 status = ccs_get_item(KEY_DEVICE_SOFTWAREVERSION, buffer, buffer_size, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 429 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 430 const String data((char*)buffer, size);
maygup01 0:11cc2b7889af 431 res = device_object->create_resource(M2MDevice::SoftwareVersion, data);
maygup01 0:11cc2b7889af 432 if (res == NULL) {
maygup01 0:11cc2b7889af 433 res = instance->resource(DEVICE_SOFTWARE_VERSION);
maygup01 0:11cc2b7889af 434 device_object->set_resource_value(M2MDevice::SoftwareVersion, data);
maygup01 0:11cc2b7889af 435 }
maygup01 0:11cc2b7889af 436 if(res) {
maygup01 0:11cc2b7889af 437 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 438 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 439 }
maygup01 0:11cc2b7889af 440 }
maygup01 0:11cc2b7889af 441
maygup01 0:11cc2b7889af 442 uint8_t data[4] = {0};
maygup01 0:11cc2b7889af 443 uint32_t value;
maygup01 0:11cc2b7889af 444 status = ccs_get_item(g_fcc_memory_size_parameter_name, data, 4, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 445 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 446 memcpy(&value, data, 4);
maygup01 0:11cc2b7889af 447 res = device_object->create_resource(M2MDevice::MemoryTotal, value);
maygup01 0:11cc2b7889af 448 if (res == NULL) {
maygup01 0:11cc2b7889af 449 res = instance->resource(DEVICE_MEMORY_TOTAL);
maygup01 0:11cc2b7889af 450 device_object->set_resource_value(M2MDevice::MemoryTotal, value);
maygup01 0:11cc2b7889af 451 }
maygup01 0:11cc2b7889af 452 if(res) {
maygup01 0:11cc2b7889af 453 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 454 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 455 }
maygup01 0:11cc2b7889af 456 tr_debug("ServiceClient::device_object_from_storage() - setting memory total value %" PRIu32 " (%s)", value, tr_array(data, 4));
maygup01 0:11cc2b7889af 457 }
maygup01 0:11cc2b7889af 458
maygup01 0:11cc2b7889af 459 status = ccs_get_item(g_fcc_current_time_parameter_name, data, 4, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 460 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 461 memcpy(&value, data, 4);
maygup01 0:11cc2b7889af 462 res = device_object->create_resource(M2MDevice::CurrentTime, value);
maygup01 0:11cc2b7889af 463 if (res == NULL) {
maygup01 0:11cc2b7889af 464 res = instance->resource(DEVICE_CURRENT_TIME);
maygup01 0:11cc2b7889af 465 device_object->set_resource_value(M2MDevice::CurrentTime, value);
maygup01 0:11cc2b7889af 466 }
maygup01 0:11cc2b7889af 467 if(res) {
maygup01 0:11cc2b7889af 468 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 469 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 470 }
maygup01 0:11cc2b7889af 471 tr_debug("ServiceClient::device_object_from_storage() - setting current time value %" PRIu32 " (%s)", value, tr_array(data, 4));
maygup01 0:11cc2b7889af 472 }
maygup01 0:11cc2b7889af 473
maygup01 0:11cc2b7889af 474 status = ccs_get_item(g_fcc_device_time_zone_parameter_name, buffer, buffer_size, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 475 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 476 const String data((char*)buffer, size);
maygup01 0:11cc2b7889af 477 res = device_object->create_resource(M2MDevice::Timezone, data);
maygup01 0:11cc2b7889af 478 if ( res == NULL) {
maygup01 0:11cc2b7889af 479 res = instance->resource(DEVICE_TIMEZONE);
maygup01 0:11cc2b7889af 480 device_object->set_resource_value(M2MDevice::Timezone, data);
maygup01 0:11cc2b7889af 481 }
maygup01 0:11cc2b7889af 482 if(res) {
maygup01 0:11cc2b7889af 483 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 484 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 485 }
maygup01 0:11cc2b7889af 486 }
maygup01 0:11cc2b7889af 487
maygup01 0:11cc2b7889af 488 status = ccs_get_item(g_fcc_offset_from_utc_parameter_name, buffer, buffer_size, &size, CCS_CONFIG_ITEM);
maygup01 0:11cc2b7889af 489 if (status == CCS_STATUS_SUCCESS) {
maygup01 0:11cc2b7889af 490 const String data((char*)buffer, size);
maygup01 0:11cc2b7889af 491 res = device_object->create_resource(M2MDevice::UTCOffset, data);
maygup01 0:11cc2b7889af 492 if (res == NULL) {
maygup01 0:11cc2b7889af 493 res = instance->resource(DEVICE_UTC_OFFSET);
maygup01 0:11cc2b7889af 494 device_object->set_resource_value(M2MDevice::UTCOffset, data);
maygup01 0:11cc2b7889af 495 }
maygup01 0:11cc2b7889af 496 if(res) {
maygup01 0:11cc2b7889af 497 res->publish_value_in_registration_msg(true);
maygup01 0:11cc2b7889af 498 res->set_auto_observable(true);
maygup01 0:11cc2b7889af 499 }
maygup01 0:11cc2b7889af 500 }
maygup01 0:11cc2b7889af 501
maygup01 0:11cc2b7889af 502 return device_object;
maygup01 0:11cc2b7889af 503 }
maygup01 0:11cc2b7889af 504
maygup01 0:11cc2b7889af 505 /**
maygup01 0:11cc2b7889af 506 * \brief Set resource value in the Device Object
maygup01 0:11cc2b7889af 507 *
maygup01 0:11cc2b7889af 508 * \param resource Device enum to have value set.
maygup01 0:11cc2b7889af 509 * \param value String object.
maygup01 0:11cc2b7889af 510 * \return True if successful, false otherwise.
maygup01 0:11cc2b7889af 511 */
maygup01 0:11cc2b7889af 512 #if MBED_CLOUD_CLIENT_STL_API
maygup01 0:11cc2b7889af 513 bool ServiceClient::set_device_resource_value(M2MDevice::DeviceResource resource,
maygup01 0:11cc2b7889af 514 const std::string& value)
maygup01 0:11cc2b7889af 515 {
maygup01 0:11cc2b7889af 516 return set_device_resource_value(resource,
maygup01 0:11cc2b7889af 517 value.c_str(),
maygup01 0:11cc2b7889af 518 value.size());
maygup01 0:11cc2b7889af 519 }
maygup01 0:11cc2b7889af 520 #endif
maygup01 0:11cc2b7889af 521
maygup01 0:11cc2b7889af 522 /**
maygup01 0:11cc2b7889af 523 * \brief Set resource value in the Device Object
maygup01 0:11cc2b7889af 524 *
maygup01 0:11cc2b7889af 525 * \param resource Device enum to have value set.
maygup01 0:11cc2b7889af 526 * \param value Byte buffer.
maygup01 0:11cc2b7889af 527 * \param length Buffer length.
maygup01 0:11cc2b7889af 528 * \return True if successful, false otherwise.
maygup01 0:11cc2b7889af 529 */
maygup01 0:11cc2b7889af 530 bool ServiceClient::set_device_resource_value(M2MDevice::DeviceResource resource,
maygup01 0:11cc2b7889af 531 const char* value,
maygup01 0:11cc2b7889af 532 uint32_t length)
maygup01 0:11cc2b7889af 533 {
maygup01 0:11cc2b7889af 534 bool retval = false;
maygup01 0:11cc2b7889af 535
maygup01 0:11cc2b7889af 536 /* sanity check */
maygup01 0:11cc2b7889af 537 if (value && (length < 256) && (length > 0))
maygup01 0:11cc2b7889af 538 {
maygup01 0:11cc2b7889af 539 #ifdef MBED_CLOUD_CLIENT_SUPPORT_UPDATE
maygup01 0:11cc2b7889af 540 /* Pass resource value to Update Client.
maygup01 0:11cc2b7889af 541 Used for validating the manifest.
maygup01 0:11cc2b7889af 542 */
maygup01 0:11cc2b7889af 543 switch (resource) {
maygup01 0:11cc2b7889af 544 case M2MDevice::Manufacturer:
maygup01 0:11cc2b7889af 545 ARM_UC_SetVendorId((const uint8_t*) value, length);
maygup01 0:11cc2b7889af 546 break;
maygup01 0:11cc2b7889af 547 case M2MDevice::ModelNumber:
maygup01 0:11cc2b7889af 548 ARM_UC_SetClassId((const uint8_t*) value, length);
maygup01 0:11cc2b7889af 549 break;
maygup01 0:11cc2b7889af 550 default:
maygup01 0:11cc2b7889af 551 break;
maygup01 0:11cc2b7889af 552 }
maygup01 0:11cc2b7889af 553 #endif
maygup01 0:11cc2b7889af 554 }
maygup01 0:11cc2b7889af 555
maygup01 0:11cc2b7889af 556 return retval;
maygup01 0:11cc2b7889af 557 }
maygup01 0:11cc2b7889af 558
maygup01 0:11cc2b7889af 559 #ifdef MBED_CLOUD_CLIENT_SUPPORT_UPDATE
maygup01 0:11cc2b7889af 560 void ServiceClient::set_update_authorize_handler(void (*handler)(int32_t request))
maygup01 0:11cc2b7889af 561 {
maygup01 0:11cc2b7889af 562 UpdateClient::set_update_authorize_handler(handler);
maygup01 0:11cc2b7889af 563 }
maygup01 0:11cc2b7889af 564
maygup01 0:11cc2b7889af 565 void ServiceClient::update_authorize(int32_t request)
maygup01 0:11cc2b7889af 566 {
maygup01 0:11cc2b7889af 567 UpdateClient::update_authorize(request);
maygup01 0:11cc2b7889af 568 }
maygup01 0:11cc2b7889af 569
maygup01 0:11cc2b7889af 570 void ServiceClient::set_update_progress_handler(void (*handler)(uint32_t progress, uint32_t total))
maygup01 0:11cc2b7889af 571 {
maygup01 0:11cc2b7889af 572 UpdateClient::set_update_progress_handler(handler);
maygup01 0:11cc2b7889af 573 }
maygup01 0:11cc2b7889af 574
maygup01 0:11cc2b7889af 575 void ServiceClient::update_error_callback(int32_t error)
maygup01 0:11cc2b7889af 576 {
maygup01 0:11cc2b7889af 577 _service_callback.error(error, ERROR_UPDATE);
maygup01 0:11cc2b7889af 578 }
maygup01 0:11cc2b7889af 579 #endif