Example
Dependencies: FXAS21002 FXOS8700Q
simple-mbed-cloud-client/mbed-cloud-client/source/ServiceClient.cpp@0:11cc2b7889af, 2019-11-19 (annotated)
- Committer:
- maygup01
- Date:
- Tue Nov 19 09:49:38 2019 +0000
- Revision:
- 0:11cc2b7889af
Example
Who changed what in which revision?
User | Revision | Line number | New 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 = ®_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 |