This is the sample program that can see the decode result of barcode data on Watson IoT.

Dependencies:   AsciiFont DisplayApp GR-PEACH_video LCD_shield_config LWIPBP3595Interface_STA_for_mbed-os USBDevice

Committer:
Osamu Nakamura
Date:
Thu Nov 10 20:23:55 2016 +0900
Revision:
1:67f8b5cfde75
Parent:
0:7d720671e6dc
Revised the initial value of /888/0/7700

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Osamu Nakamura 0:7d720671e6dc 1 /**
Osamu Nakamura 0:7d720671e6dc 2 * @file DeviceManager.cpp
Osamu Nakamura 0:7d720671e6dc 3 * @brief mbed CoAP Endpoint Device Management class
Osamu Nakamura 0:7d720671e6dc 4 * @author Doug Anson
Osamu Nakamura 0:7d720671e6dc 5 * @version 1.0
Osamu Nakamura 0:7d720671e6dc 6 * @see
Osamu Nakamura 0:7d720671e6dc 7 *
Osamu Nakamura 0:7d720671e6dc 8 * Copyright (c) 2016
Osamu Nakamura 0:7d720671e6dc 9 *
Osamu Nakamura 0:7d720671e6dc 10 * Licensed under the Apache License, Version 2.0 (the "License");
Osamu Nakamura 0:7d720671e6dc 11 * you may not use this file except in compliance with the License.
Osamu Nakamura 0:7d720671e6dc 12 * You may obtain a copy of the License at
Osamu Nakamura 0:7d720671e6dc 13 *
Osamu Nakamura 0:7d720671e6dc 14 * http://www.apache.org/licenses/LICENSE-2.0
Osamu Nakamura 0:7d720671e6dc 15 *
Osamu Nakamura 0:7d720671e6dc 16 * Unless required by applicable law or agreed to in writing, software
Osamu Nakamura 0:7d720671e6dc 17 * distributed under the License is distributed on an "AS IS" BASIS,
Osamu Nakamura 0:7d720671e6dc 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Osamu Nakamura 0:7d720671e6dc 19 * See the License for the specific language governing permissions and
Osamu Nakamura 0:7d720671e6dc 20 * limitations under the License.
Osamu Nakamura 0:7d720671e6dc 21 */
Osamu Nakamura 0:7d720671e6dc 22
Osamu Nakamura 0:7d720671e6dc 23 // configuration
Osamu Nakamura 0:7d720671e6dc 24 #include "mbed-connector-interface/mbedConnectorInterface.h"
Osamu Nakamura 0:7d720671e6dc 25
Osamu Nakamura 0:7d720671e6dc 26 // BaseClass
Osamu Nakamura 0:7d720671e6dc 27 #include "mbed-connector-interface/DeviceManager.h"
Osamu Nakamura 0:7d720671e6dc 28
Osamu Nakamura 0:7d720671e6dc 29 // Endpoint Class
Osamu Nakamura 0:7d720671e6dc 30 #include "mbed-connector-interface/ConnectorEndpoint.h"
Osamu Nakamura 0:7d720671e6dc 31
Osamu Nakamura 0:7d720671e6dc 32 // Options Builder
Osamu Nakamura 0:7d720671e6dc 33 #include "mbed-connector-interface/OptionsBuilder.h"
Osamu Nakamura 0:7d720671e6dc 34
Osamu Nakamura 0:7d720671e6dc 35 // Device Management Responder
Osamu Nakamura 0:7d720671e6dc 36 #include "mbed-connector-interface/DeviceManagementResponder.h"
Osamu Nakamura 0:7d720671e6dc 37
Osamu Nakamura 0:7d720671e6dc 38 // Constructor
Osamu Nakamura 0:7d720671e6dc 39 DeviceManager::DeviceManager(const Logger *logger,const void *dm_responder,const char *mfg,const char *dev_type,const char *model,const char *serial,const char *fw_vers,const char *hw_vers,const char *sw_vers) {
Osamu Nakamura 0:7d720671e6dc 40 // record the data management responder if we have one
Osamu Nakamura 0:7d720671e6dc 41 this->m_dm_responder = (void *)dm_responder;
Osamu Nakamura 0:7d720671e6dc 42
Osamu Nakamura 0:7d720671e6dc 43 // save off for later
Osamu Nakamura 0:7d720671e6dc 44 this->m_dev_type = (char *)dev_type;
Osamu Nakamura 0:7d720671e6dc 45 this->m_logger = (Logger *)logger;
Osamu Nakamura 0:7d720671e6dc 46 this->m_mfg = (char *)mfg;
Osamu Nakamura 0:7d720671e6dc 47 this->m_model = (char *)model;
Osamu Nakamura 0:7d720671e6dc 48 this->m_serial = (char *)serial;
Osamu Nakamura 0:7d720671e6dc 49 this->m_fw_vers = (char *)fw_vers;
Osamu Nakamura 0:7d720671e6dc 50 this->m_sw_vers = (char *)sw_vers;
Osamu Nakamura 0:7d720671e6dc 51 this->m_hw_vers = (char *)hw_vers;
Osamu Nakamura 0:7d720671e6dc 52
Osamu Nakamura 0:7d720671e6dc 53 // initialize
Osamu Nakamura 0:7d720671e6dc 54 this->m_device = NULL;
Osamu Nakamura 0:7d720671e6dc 55 for(int i=0;i<NUM_DEVICE_RESOURCES;++i) {
Osamu Nakamura 0:7d720671e6dc 56 this->m_dev_res[i] = NULL;
Osamu Nakamura 0:7d720671e6dc 57 }
Osamu Nakamura 0:7d720671e6dc 58 for(int i=0;i<NUM_FIRMWARE_RESOURCES;++i) {
Osamu Nakamura 0:7d720671e6dc 59 this->m_fw_res[i] = NULL;
Osamu Nakamura 0:7d720671e6dc 60 }
Osamu Nakamura 0:7d720671e6dc 61 this->m_deregister_resource = NULL;
Osamu Nakamura 0:7d720671e6dc 62 this->m_endpoint = NULL;
Osamu Nakamura 0:7d720671e6dc 63 this->m_config = NULL;
Osamu Nakamura 0:7d720671e6dc 64 this->m_fw_manifest = NULL;
Osamu Nakamura 0:7d720671e6dc 65 this->m_fw_manifest_length = 0;
Osamu Nakamura 0:7d720671e6dc 66 this->m_fw_image = NULL;
Osamu Nakamura 0:7d720671e6dc 67 this->m_fw_image_length = 0;
Osamu Nakamura 0:7d720671e6dc 68 }
Osamu Nakamura 0:7d720671e6dc 69
Osamu Nakamura 0:7d720671e6dc 70 // Copy constructor
Osamu Nakamura 0:7d720671e6dc 71 DeviceManager::DeviceManager(const DeviceManager &manager) {
Osamu Nakamura 0:7d720671e6dc 72 for(int i=0;i<NUM_DEVICE_RESOURCES;++i) {
Osamu Nakamura 0:7d720671e6dc 73 this->m_dev_res[i] = manager.m_dev_res[i];
Osamu Nakamura 0:7d720671e6dc 74 }
Osamu Nakamura 0:7d720671e6dc 75 for(int i=0;i<NUM_FIRMWARE_RESOURCES;++i) {
Osamu Nakamura 0:7d720671e6dc 76 this->m_fw_res[i] = manager.m_fw_res[i];
Osamu Nakamura 0:7d720671e6dc 77 }
Osamu Nakamura 0:7d720671e6dc 78 this->m_dm_responder = manager.m_dm_responder;
Osamu Nakamura 0:7d720671e6dc 79 this->m_device = manager.m_device;
Osamu Nakamura 0:7d720671e6dc 80 this->m_dev_type = manager.m_dev_type;
Osamu Nakamura 0:7d720671e6dc 81 this->m_logger = manager.m_logger;
Osamu Nakamura 0:7d720671e6dc 82 this->m_endpoint = manager.m_endpoint;
Osamu Nakamura 0:7d720671e6dc 83 this->m_config = manager.m_config;
Osamu Nakamura 0:7d720671e6dc 84 this->m_mfg = manager.m_mfg;
Osamu Nakamura 0:7d720671e6dc 85 this->m_model = manager.m_model;
Osamu Nakamura 0:7d720671e6dc 86 this->m_serial = manager.m_serial;
Osamu Nakamura 0:7d720671e6dc 87 this->m_fw_vers = manager.m_fw_vers;
Osamu Nakamura 0:7d720671e6dc 88 this->m_sw_vers = manager.m_sw_vers;
Osamu Nakamura 0:7d720671e6dc 89 this->m_hw_vers = manager.m_hw_vers;
Osamu Nakamura 0:7d720671e6dc 90 this->m_deregister_resource = manager.m_deregister_resource;
Osamu Nakamura 0:7d720671e6dc 91 this->m_fw_manifest = this->saveManifest((uint8_t *)manager.m_fw_manifest,manager.m_fw_manifest_length);
Osamu Nakamura 0:7d720671e6dc 92 this->m_fw_manifest_length = manager.m_fw_manifest_length;
Osamu Nakamura 0:7d720671e6dc 93 this->m_fw_image = this->saveImage(manager.m_fw_image,manager.m_fw_image_length);
Osamu Nakamura 0:7d720671e6dc 94 this->m_fw_image_length = manager.m_fw_image_length;
Osamu Nakamura 0:7d720671e6dc 95 }
Osamu Nakamura 0:7d720671e6dc 96
Osamu Nakamura 0:7d720671e6dc 97 // Destructor
Osamu Nakamura 0:7d720671e6dc 98 DeviceManager::~DeviceManager() {
Osamu Nakamura 0:7d720671e6dc 99 if (this->m_fw_manifest != NULL) {
Osamu Nakamura 0:7d720671e6dc 100 free(this->m_fw_manifest);
Osamu Nakamura 0:7d720671e6dc 101 }
Osamu Nakamura 0:7d720671e6dc 102 if (this->m_fw_image != NULL) {
Osamu Nakamura 0:7d720671e6dc 103 free(this->m_fw_image);
Osamu Nakamura 0:7d720671e6dc 104 }
Osamu Nakamura 0:7d720671e6dc 105 this->m_fw_manifest = NULL;
Osamu Nakamura 0:7d720671e6dc 106 this->m_fw_manifest_length = 0;
Osamu Nakamura 0:7d720671e6dc 107 this->m_fw_image = NULL;
Osamu Nakamura 0:7d720671e6dc 108 this->m_fw_image_length = 0;
Osamu Nakamura 0:7d720671e6dc 109 }
Osamu Nakamura 0:7d720671e6dc 110
Osamu Nakamura 0:7d720671e6dc 111 // save the fota manifest
Osamu Nakamura 0:7d720671e6dc 112 char *DeviceManager::saveManifest(uint8_t *manifest,uint32_t manifest_length) {
Osamu Nakamura 0:7d720671e6dc 113 if (manifest != NULL && manifest_length > 0) {
Osamu Nakamura 0:7d720671e6dc 114 if (this->m_fw_manifest != NULL) {
Osamu Nakamura 0:7d720671e6dc 115 free(this->m_fw_manifest);
Osamu Nakamura 0:7d720671e6dc 116 }
Osamu Nakamura 0:7d720671e6dc 117 this->m_fw_manifest = (char *)malloc(manifest_length+1);
Osamu Nakamura 0:7d720671e6dc 118 memset(this->m_fw_manifest,0,manifest_length+1);
Osamu Nakamura 0:7d720671e6dc 119 memcpy(this->m_fw_manifest,manifest,manifest_length);
Osamu Nakamura 0:7d720671e6dc 120 this->m_fw_manifest_length = manifest_length;
Osamu Nakamura 0:7d720671e6dc 121 }
Osamu Nakamura 0:7d720671e6dc 122 return this->m_fw_manifest;
Osamu Nakamura 0:7d720671e6dc 123 }
Osamu Nakamura 0:7d720671e6dc 124
Osamu Nakamura 0:7d720671e6dc 125 // save the fota image
Osamu Nakamura 0:7d720671e6dc 126 void *DeviceManager::saveImage(void *image,uint32_t image_length) {
Osamu Nakamura 0:7d720671e6dc 127 if (image != NULL && image_length > 0) {
Osamu Nakamura 0:7d720671e6dc 128 if (this->m_fw_image != NULL) {
Osamu Nakamura 0:7d720671e6dc 129 free(this->m_fw_image);
Osamu Nakamura 0:7d720671e6dc 130 }
Osamu Nakamura 0:7d720671e6dc 131 this->m_fw_image = (char *)malloc(image_length);
Osamu Nakamura 0:7d720671e6dc 132 memset(this->m_fw_image,0,image_length);
Osamu Nakamura 0:7d720671e6dc 133 memcpy(this->m_fw_image,image,image_length);
Osamu Nakamura 0:7d720671e6dc 134 }
Osamu Nakamura 0:7d720671e6dc 135 return this->m_fw_image;
Osamu Nakamura 0:7d720671e6dc 136 }
Osamu Nakamura 0:7d720671e6dc 137
Osamu Nakamura 0:7d720671e6dc 138 // bind the device resources
Osamu Nakamura 0:7d720671e6dc 139 void DeviceManager::bindDeviceResources() {
Osamu Nakamura 0:7d720671e6dc 140 // our Endpoint configuration
Osamu Nakamura 0:7d720671e6dc 141 Connector::OptionsBuilder *cfg = (Connector::OptionsBuilder *)this->m_config;
Osamu Nakamura 0:7d720671e6dc 142
Osamu Nakamura 0:7d720671e6dc 143 // establish the default base LWM2M device info resource values
Osamu Nakamura 0:7d720671e6dc 144 this->m_device = M2MInterfaceFactory::create_device();
Osamu Nakamura 0:7d720671e6dc 145 if (this->m_device != NULL) {
Osamu Nakamura 0:7d720671e6dc 146 this->m_dev_res[0] = this->m_device->create_resource(M2MDevice::Manufacturer,this->m_mfg); // Manufacturer
Osamu Nakamura 0:7d720671e6dc 147 this->m_dev_res[1] = this->m_device->create_resource(M2MDevice::DeviceType,this->m_dev_type); // Device Type
Osamu Nakamura 0:7d720671e6dc 148 this->m_dev_res[2] = this->m_device->create_resource(M2MDevice::ModelNumber,this->m_model); // Device Model
Osamu Nakamura 0:7d720671e6dc 149 this->m_dev_res[3] = this->m_device->create_resource(M2MDevice::SerialNumber,this->m_serial); // Device Serial
Osamu Nakamura 0:7d720671e6dc 150 this->m_dev_res[4] = this->m_device->create_resource(M2MDevice::FirmwareVersion,this->m_fw_vers); // Firmware Version
Osamu Nakamura 0:7d720671e6dc 151 this->m_dev_res[5] = this->m_device->create_resource(M2MDevice::HardwareVersion,this->m_hw_vers); // Hardware Version
Osamu Nakamura 0:7d720671e6dc 152 this->m_dev_res[6] = this->m_device->create_resource(M2MDevice::SoftwareVersion,this->m_sw_vers); // Software Version
Osamu Nakamura 0:7d720671e6dc 153 this->m_dev_res[7] = this->getDeviceRebootResource(); // Reboot
Osamu Nakamura 0:7d720671e6dc 154 this->m_dev_res[8] = this->m_device->create_resource(M2MDevice::FactoryReset); // Reset
Osamu Nakamura 0:7d720671e6dc 155
Osamu Nakamura 0:7d720671e6dc 156 // set the callback functions for Reboot and Reset
Osamu Nakamura 0:7d720671e6dc 157 if (this->m_dev_res[7] != NULL) {
Osamu Nakamura 0:7d720671e6dc 158 this->m_dev_res[7]->set_operation(M2MBase::POST_ALLOWED);
Osamu Nakamura 0:7d720671e6dc 159 this->m_dev_res[7]->set_execute_function(execute_callback(this,&DeviceManager::process_reboot_action));
Osamu Nakamura 0:7d720671e6dc 160 }
Osamu Nakamura 0:7d720671e6dc 161 if (this->m_dev_res[8] != NULL) {
Osamu Nakamura 0:7d720671e6dc 162 this->m_dev_res[8]->set_operation(M2MBase::POST_ALLOWED);
Osamu Nakamura 0:7d720671e6dc 163 this->m_dev_res[8]->set_execute_function(execute_callback(this,&DeviceManager::process_reset_action));
Osamu Nakamura 0:7d720671e6dc 164 }
Osamu Nakamura 0:7d720671e6dc 165
Osamu Nakamura 0:7d720671e6dc 166 // set the Device Resources Object
Osamu Nakamura 0:7d720671e6dc 167 if (cfg != NULL) {
Osamu Nakamura 0:7d720671e6dc 168 cfg->setDeviceResourcesObject(this->m_device); // device resources created under single device object... so just set it
Osamu Nakamura 0:7d720671e6dc 169 }
Osamu Nakamura 0:7d720671e6dc 170 }
Osamu Nakamura 0:7d720671e6dc 171 else {
Osamu Nakamura 0:7d720671e6dc 172 // unable to create the device object
Osamu Nakamura 0:7d720671e6dc 173 this->m_logger->logging("DeviceManager::bindDeviceResources(): Unable to create Device Object!");
Osamu Nakamura 0:7d720671e6dc 174 }
Osamu Nakamura 0:7d720671e6dc 175 }
Osamu Nakamura 0:7d720671e6dc 176
Osamu Nakamura 0:7d720671e6dc 177 // bind the firmware resources
Osamu Nakamura 0:7d720671e6dc 178 void DeviceManager::bindFirmwareResources() {
Osamu Nakamura 0:7d720671e6dc 179 // our Endpoint configuration
Osamu Nakamura 0:7d720671e6dc 180 Connector::OptionsBuilder *cfg = (Connector::OptionsBuilder *)this->m_config;
Osamu Nakamura 0:7d720671e6dc 181
Osamu Nakamura 0:7d720671e6dc 182 // establish the default base LWM2M firmware info resource values
Osamu Nakamura 0:7d720671e6dc 183 this->m_firmware = M2MInterfaceFactory::create_firmware();
Osamu Nakamura 0:7d720671e6dc 184 if (this->m_firmware != NULL) {
Osamu Nakamura 0:7d720671e6dc 185 // Create our optional resources
Osamu Nakamura 0:7d720671e6dc 186 this->m_fw_res[0] = this->m_firmware->create_resource(M2MFirmware::PackageName,""); // Package Name
Osamu Nakamura 0:7d720671e6dc 187 this->m_fw_res[1] = this->m_firmware->create_resource(M2MFirmware::PackageVersion,""); // Package Version
Osamu Nakamura 0:7d720671e6dc 188
Osamu Nakamura 0:7d720671e6dc 189 // Get the speciality resources
Osamu Nakamura 0:7d720671e6dc 190 this->m_fw_res[2] = this->getFirmwareUpdateResource();
Osamu Nakamura 0:7d720671e6dc 191 this->m_fw_res[3] = this->getFirmwarePackageResource();
Osamu Nakamura 0:7d720671e6dc 192 this->m_fw_res[4] = this->getFirmwarePackageURIResource();
Osamu Nakamura 0:7d720671e6dc 193 this->m_fw_res[5] = this->getFirmwareStateResource();
Osamu Nakamura 0:7d720671e6dc 194 this->m_fw_res[6] = this->getFirmwareUpdateResultResource();
Osamu Nakamura 0:7d720671e6dc 195
Osamu Nakamura 0:7d720671e6dc 196 // set the callback functions for Update
Osamu Nakamura 0:7d720671e6dc 197 if (this->m_fw_res[2] != NULL) {
Osamu Nakamura 0:7d720671e6dc 198 this->m_fw_res[2]->set_operation(M2MBase::POST_ALLOWED);
Osamu Nakamura 0:7d720671e6dc 199 this->m_fw_res[2]->set_execute_function(execute_callback(this,&DeviceManager::process_firmware_update_action));
Osamu Nakamura 0:7d720671e6dc 200 }
Osamu Nakamura 0:7d720671e6dc 201
Osamu Nakamura 0:7d720671e6dc 202 // set the Firmware Resources Object
Osamu Nakamura 0:7d720671e6dc 203 if (cfg != NULL) {
Osamu Nakamura 0:7d720671e6dc 204 cfg->setFirmwareResourcesObject(this->m_firmware); // firmware resources created under single firmware object... so just set it
Osamu Nakamura 0:7d720671e6dc 205 }
Osamu Nakamura 0:7d720671e6dc 206 }
Osamu Nakamura 0:7d720671e6dc 207 else {
Osamu Nakamura 0:7d720671e6dc 208 // unable to create the firmware object
Osamu Nakamura 0:7d720671e6dc 209 this->m_logger->logging("DeviceManager::bindFirmwareResources(): Unable to create Firmware Object!");
Osamu Nakamura 0:7d720671e6dc 210 }
Osamu Nakamura 0:7d720671e6dc 211 }
Osamu Nakamura 0:7d720671e6dc 212
Osamu Nakamura 0:7d720671e6dc 213 // bind mbed Cloud resources
Osamu Nakamura 0:7d720671e6dc 214 void DeviceManager::bindMBEDCloudResources() {
Osamu Nakamura 0:7d720671e6dc 215 // our Endpoint configuration
Osamu Nakamura 0:7d720671e6dc 216 Connector::OptionsBuilder *cfg = (Connector::OptionsBuilder *)this->m_config;
Osamu Nakamura 0:7d720671e6dc 217
Osamu Nakamura 0:7d720671e6dc 218 // Add mbed Cloud resources here...
Osamu Nakamura 0:7d720671e6dc 219
Osamu Nakamura 0:7d720671e6dc 220 // mbed Cloud DeRegistration Resource
Osamu Nakamura 0:7d720671e6dc 221 this->m_deregister_resource = new DeviceDeRegisterResource(this->m_logger,LWM2M_DREGISTER_OBJ_ID,LWM2M_DEV_DEREGISTER_ID,this->m_dm_responder);
Osamu Nakamura 0:7d720671e6dc 222 if (this->m_deregister_resource != NULL) {
Osamu Nakamura 0:7d720671e6dc 223 cfg->addResource(this->m_deregister_resource); // de-registration action resource added
Osamu Nakamura 0:7d720671e6dc 224 }
Osamu Nakamura 0:7d720671e6dc 225 }
Osamu Nakamura 0:7d720671e6dc 226
Osamu Nakamura 0:7d720671e6dc 227 // setup the Device Manager
Osamu Nakamura 0:7d720671e6dc 228 void DeviceManager::bind() {
Osamu Nakamura 0:7d720671e6dc 229 // Bind our Device Resources
Osamu Nakamura 0:7d720671e6dc 230 this->bindDeviceResources();
Osamu Nakamura 0:7d720671e6dc 231
Osamu Nakamura 0:7d720671e6dc 232 // Bind our Firmware Resources
Osamu Nakamura 0:7d720671e6dc 233 this->bindFirmwareResources();
Osamu Nakamura 0:7d720671e6dc 234
Osamu Nakamura 0:7d720671e6dc 235 // Bind our mbed Cloud Resources
Osamu Nakamura 0:7d720671e6dc 236 this->bindMBEDCloudResources();
Osamu Nakamura 0:7d720671e6dc 237 }
Osamu Nakamura 0:7d720671e6dc 238
Osamu Nakamura 0:7d720671e6dc 239 // process updated values (PUT): The only updatable device management resources are: Firmware::Package, Firmware::PackageURI
Osamu Nakamura 0:7d720671e6dc 240 void DeviceManager::process(M2MBase *base, M2MBase::BaseType type) {
Osamu Nakamura 0:7d720671e6dc 241 // DeviceManagementResponder
Osamu Nakamura 0:7d720671e6dc 242 DeviceManagementResponder *dmr = (DeviceManagementResponder *)this->m_dm_responder;
Osamu Nakamura 0:7d720671e6dc 243
Osamu Nakamura 0:7d720671e6dc 244 // PackageURI handler
Osamu Nakamura 0:7d720671e6dc 245 if (base == this->getFirmwareResource(PackageURI)) {
Osamu Nakamura 0:7d720671e6dc 246 // PackageURI resource
Osamu Nakamura 0:7d720671e6dc 247 M2MResource *res = this->getFirmwareResource(PackageURI);
Osamu Nakamura 0:7d720671e6dc 248
Osamu Nakamura 0:7d720671e6dc 249 // Save off the manifest
Osamu Nakamura 0:7d720671e6dc 250 this->saveManifest(res->value(),res->value_length());
Osamu Nakamura 0:7d720671e6dc 251
Osamu Nakamura 0:7d720671e6dc 252 // DEBUG
Osamu Nakamura 0:7d720671e6dc 253 this->m_logger->logging("DeviceManager::process(PUT): Setting FOTA Manifest: [%s] type: %d length: %d",this->m_fw_manifest,type,this->m_fw_manifest_length);
Osamu Nakamura 0:7d720671e6dc 254
Osamu Nakamura 0:7d720671e6dc 255 // Manifest Updated
Osamu Nakamura 0:7d720671e6dc 256 dmr->setFOTAManifest(this->m_fw_manifest,this->m_fw_manifest_length);
Osamu Nakamura 0:7d720671e6dc 257 }
Osamu Nakamura 0:7d720671e6dc 258
Osamu Nakamura 0:7d720671e6dc 259 // Package handler
Osamu Nakamura 0:7d720671e6dc 260 if (base == this->getFirmwareResource(Package)) {
Osamu Nakamura 0:7d720671e6dc 261 // FOTA Image (direct) Updated
Osamu Nakamura 0:7d720671e6dc 262 M2MResource *res = this->getFirmwareResource(PackageURI);
Osamu Nakamura 0:7d720671e6dc 263
Osamu Nakamura 0:7d720671e6dc 264 // DEBUG
Osamu Nakamura 0:7d720671e6dc 265 this->m_logger->logging("DeviceManager::process(PUT): Setting FOTA Image. Length=%d type: %d",res->value_length(),type);
Osamu Nakamura 0:7d720671e6dc 266
Osamu Nakamura 0:7d720671e6dc 267 // FOTA Image updated
Osamu Nakamura 0:7d720671e6dc 268 dmr->setFOTAImage(res->value(),res->value_length());
Osamu Nakamura 0:7d720671e6dc 269 }
Osamu Nakamura 0:7d720671e6dc 270 }
Osamu Nakamura 0:7d720671e6dc 271
Osamu Nakamura 0:7d720671e6dc 272 // Get the Device Reboot Resource from the Device Object
Osamu Nakamura 0:7d720671e6dc 273 M2MResource *DeviceManager::getDeviceRebootResource() {
Osamu Nakamura 0:7d720671e6dc 274 if (this->m_device != NULL) {
Osamu Nakamura 0:7d720671e6dc 275 // Get /3/0/3
Osamu Nakamura 0:7d720671e6dc 276 return this->getResourceFromObject(this->m_device,0,M2MDevice::Reboot);
Osamu Nakamura 0:7d720671e6dc 277 }
Osamu Nakamura 0:7d720671e6dc 278 return NULL;
Osamu Nakamura 0:7d720671e6dc 279 }
Osamu Nakamura 0:7d720671e6dc 280
Osamu Nakamura 0:7d720671e6dc 281 // Get the Firmware Update Resource from the Firmware Object
Osamu Nakamura 0:7d720671e6dc 282 M2MResource *DeviceManager::getFirmwareUpdateResource() {
Osamu Nakamura 0:7d720671e6dc 283 if (this->m_firmware != NULL) {
Osamu Nakamura 0:7d720671e6dc 284 // Get /5/0/2
Osamu Nakamura 0:7d720671e6dc 285 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::Update);
Osamu Nakamura 0:7d720671e6dc 286 }
Osamu Nakamura 0:7d720671e6dc 287 return NULL;
Osamu Nakamura 0:7d720671e6dc 288 }
Osamu Nakamura 0:7d720671e6dc 289
Osamu Nakamura 0:7d720671e6dc 290 // Get the Firmware Package Resource from the Firmware Object
Osamu Nakamura 0:7d720671e6dc 291 M2MResource *DeviceManager::getFirmwarePackageResource() {
Osamu Nakamura 0:7d720671e6dc 292 if (this->m_firmware != NULL) {
Osamu Nakamura 0:7d720671e6dc 293 // Get /5/0/0
Osamu Nakamura 0:7d720671e6dc 294 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::Package);
Osamu Nakamura 0:7d720671e6dc 295 }
Osamu Nakamura 0:7d720671e6dc 296 return NULL;
Osamu Nakamura 0:7d720671e6dc 297 }
Osamu Nakamura 0:7d720671e6dc 298
Osamu Nakamura 0:7d720671e6dc 299 // Get the Firmware Package URI Resource from the Firmware Object
Osamu Nakamura 0:7d720671e6dc 300 M2MResource *DeviceManager::getFirmwarePackageURIResource() {
Osamu Nakamura 0:7d720671e6dc 301 if (this->m_firmware != NULL) {
Osamu Nakamura 0:7d720671e6dc 302 // Get /5/0/1
Osamu Nakamura 0:7d720671e6dc 303 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::PackageUri);
Osamu Nakamura 0:7d720671e6dc 304 }
Osamu Nakamura 0:7d720671e6dc 305 return NULL;
Osamu Nakamura 0:7d720671e6dc 306 }
Osamu Nakamura 0:7d720671e6dc 307
Osamu Nakamura 0:7d720671e6dc 308 // Get the Firmware State Resource from the Firmware Object
Osamu Nakamura 0:7d720671e6dc 309 M2MResource *DeviceManager::getFirmwareStateResource() {
Osamu Nakamura 0:7d720671e6dc 310 if (this->m_firmware != NULL) {
Osamu Nakamura 0:7d720671e6dc 311 // Get /5/0/3
Osamu Nakamura 0:7d720671e6dc 312 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::State);
Osamu Nakamura 0:7d720671e6dc 313 }
Osamu Nakamura 0:7d720671e6dc 314 return NULL;
Osamu Nakamura 0:7d720671e6dc 315 }
Osamu Nakamura 0:7d720671e6dc 316
Osamu Nakamura 0:7d720671e6dc 317 // Get the Firmware UpdateResult Resource from the Firmware Object
Osamu Nakamura 0:7d720671e6dc 318 M2MResource *DeviceManager::getFirmwareUpdateResultResource() {
Osamu Nakamura 0:7d720671e6dc 319 if (this->m_firmware != NULL) {
Osamu Nakamura 0:7d720671e6dc 320 // Get /5/0/5
Osamu Nakamura 0:7d720671e6dc 321 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::UpdateResult);
Osamu Nakamura 0:7d720671e6dc 322 }
Osamu Nakamura 0:7d720671e6dc 323 return NULL;
Osamu Nakamura 0:7d720671e6dc 324 }
Osamu Nakamura 0:7d720671e6dc 325 // Get a specific resource from a resource object
Osamu Nakamura 0:7d720671e6dc 326 M2MResource *DeviceManager::getResourceFromObject(M2MObject *obj,int instanceID,int resID) {
Osamu Nakamura 0:7d720671e6dc 327 if (obj != NULL) {
Osamu Nakamura 0:7d720671e6dc 328 M2MObjectInstanceList instances = obj->instances();
Osamu Nakamura 0:7d720671e6dc 329 if (instances.size() > 0 && instances.size() > instanceID) {
Osamu Nakamura 0:7d720671e6dc 330 M2MObjectInstance *instance = instances[instanceID];
Osamu Nakamura 0:7d720671e6dc 331 if (instance != NULL) {
Osamu Nakamura 0:7d720671e6dc 332 M2MResourceList resources = instance->resources();
Osamu Nakamura 0:7d720671e6dc 333 if (resources.size() > 0 && resources.size() > resID) {
Osamu Nakamura 0:7d720671e6dc 334 M2MResource *resource = resources[resID];
Osamu Nakamura 0:7d720671e6dc 335 return resource;
Osamu Nakamura 0:7d720671e6dc 336 }
Osamu Nakamura 0:7d720671e6dc 337 }
Osamu Nakamura 0:7d720671e6dc 338 }
Osamu Nakamura 0:7d720671e6dc 339 }
Osamu Nakamura 0:7d720671e6dc 340 return NULL;
Osamu Nakamura 0:7d720671e6dc 341 }
Osamu Nakamura 0:7d720671e6dc 342
Osamu Nakamura 0:7d720671e6dc 343 // Get the Device Object
Osamu Nakamura 0:7d720671e6dc 344 M2MDevice *DeviceManager::getDeviceObject() {
Osamu Nakamura 0:7d720671e6dc 345 return this->m_device;
Osamu Nakamura 0:7d720671e6dc 346 }
Osamu Nakamura 0:7d720671e6dc 347
Osamu Nakamura 0:7d720671e6dc 348 // Get the Firmware Object
Osamu Nakamura 0:7d720671e6dc 349 M2MFirmware *DeviceManager::getFirmwareObject() {
Osamu Nakamura 0:7d720671e6dc 350 return this->m_firmware;
Osamu Nakamura 0:7d720671e6dc 351 }
Osamu Nakamura 0:7d720671e6dc 352
Osamu Nakamura 0:7d720671e6dc 353 // extract a specific firmware resource
Osamu Nakamura 0:7d720671e6dc 354 M2MResource *DeviceManager::getFirmwareResource(FirmwareResources res) {
Osamu Nakamura 0:7d720671e6dc 355 // indexed optional resources
Osamu Nakamura 0:7d720671e6dc 356 int index = (int)res;
Osamu Nakamura 0:7d720671e6dc 357 if (index >= 0 && index <NUM_FIRMWARE_RESOURCES) {
Osamu Nakamura 0:7d720671e6dc 358 return this->m_fw_res[index];
Osamu Nakamura 0:7d720671e6dc 359 }
Osamu Nakamura 0:7d720671e6dc 360 return NULL;
Osamu Nakamura 0:7d720671e6dc 361 }
Osamu Nakamura 0:7d720671e6dc 362
Osamu Nakamura 0:7d720671e6dc 363 // extract a specific device resource
Osamu Nakamura 0:7d720671e6dc 364 M2MResource *DeviceManager::getDeviceResource(DeviceResources res) {
Osamu Nakamura 0:7d720671e6dc 365 // special case: DeRegistration
Osamu Nakamura 0:7d720671e6dc 366 if (res == DeRegistration){
Osamu Nakamura 0:7d720671e6dc 367 return this->m_deregister_resource->getResource();
Osamu Nakamura 0:7d720671e6dc 368 }
Osamu Nakamura 0:7d720671e6dc 369
Osamu Nakamura 0:7d720671e6dc 370 // indexed optional resources
Osamu Nakamura 0:7d720671e6dc 371 int index = (int)res;
Osamu Nakamura 0:7d720671e6dc 372 if (index >= 0 && index <NUM_DEVICE_RESOURCES) {
Osamu Nakamura 0:7d720671e6dc 373 return this->m_dev_res[index];
Osamu Nakamura 0:7d720671e6dc 374 }
Osamu Nakamura 0:7d720671e6dc 375 return NULL;
Osamu Nakamura 0:7d720671e6dc 376 }
Osamu Nakamura 0:7d720671e6dc 377
Osamu Nakamura 0:7d720671e6dc 378 // Install the device manager into the Connector Endpoint
Osamu Nakamura 0:7d720671e6dc 379 void DeviceManager::install(const void *endpoint,const void *config) {
Osamu Nakamura 0:7d720671e6dc 380 // record the configuration
Osamu Nakamura 0:7d720671e6dc 381 this->m_config = (void *)config;
Osamu Nakamura 0:7d720671e6dc 382
Osamu Nakamura 0:7d720671e6dc 383 // record the endpoint
Osamu Nakamura 0:7d720671e6dc 384 this->m_endpoint = (void *)endpoint;
Osamu Nakamura 0:7d720671e6dc 385
Osamu Nakamura 0:7d720671e6dc 386 // set the endpoint type
Osamu Nakamura 0:7d720671e6dc 387 Connector::OptionsBuilder *cfg = (Connector::OptionsBuilder *)this->m_config;
Osamu Nakamura 0:7d720671e6dc 388 if (cfg != NULL) {
Osamu Nakamura 0:7d720671e6dc 389 // set our device type
Osamu Nakamura 0:7d720671e6dc 390 cfg->setEndpointType(this->m_dev_type);
Osamu Nakamura 0:7d720671e6dc 391 }
Osamu Nakamura 0:7d720671e6dc 392
Osamu Nakamura 0:7d720671e6dc 393 // establish connection to our responder
Osamu Nakamura 0:7d720671e6dc 394 if (this->m_dm_responder != NULL) {
Osamu Nakamura 0:7d720671e6dc 395 ((DeviceManagementResponder *)this->m_dm_responder)->setEndpoint(this->m_endpoint);
Osamu Nakamura 0:7d720671e6dc 396 }
Osamu Nakamura 0:7d720671e6dc 397 }
Osamu Nakamura 0:7d720671e6dc 398
Osamu Nakamura 0:7d720671e6dc 399 // get our device management responder
Osamu Nakamura 0:7d720671e6dc 400 void *DeviceManager::getResponder() {
Osamu Nakamura 0:7d720671e6dc 401 return this->m_dm_responder;
Osamu Nakamura 0:7d720671e6dc 402 }
Osamu Nakamura 0:7d720671e6dc 403
Osamu Nakamura 0:7d720671e6dc 404 // process our reboot action
Osamu Nakamura 0:7d720671e6dc 405 void DeviceManager::process_reboot_action(void *args) {
Osamu Nakamura 0:7d720671e6dc 406 if (this->m_dm_responder != NULL) {
Osamu Nakamura 0:7d720671e6dc 407 ((DeviceManagementResponder *)this->m_dm_responder)->rebootDevice(args);
Osamu Nakamura 0:7d720671e6dc 408 }
Osamu Nakamura 0:7d720671e6dc 409 else {
Osamu Nakamura 0:7d720671e6dc 410 // no device management responder instance
Osamu Nakamura 0:7d720671e6dc 411 this->m_logger->logging("DeviceManager::process_reboot_action: DeviceManagementResponder is NULL. No reboot processed");
Osamu Nakamura 0:7d720671e6dc 412 }
Osamu Nakamura 0:7d720671e6dc 413 }
Osamu Nakamura 0:7d720671e6dc 414
Osamu Nakamura 0:7d720671e6dc 415 // process our reset action
Osamu Nakamura 0:7d720671e6dc 416 void DeviceManager::process_reset_action(void *args) {
Osamu Nakamura 0:7d720671e6dc 417 if (this->m_dm_responder != NULL) {
Osamu Nakamura 0:7d720671e6dc 418 ((DeviceManagementResponder *)this->m_dm_responder)->resetDevice(args);
Osamu Nakamura 0:7d720671e6dc 419 }
Osamu Nakamura 0:7d720671e6dc 420 else {
Osamu Nakamura 0:7d720671e6dc 421 // no device management responder instance
Osamu Nakamura 0:7d720671e6dc 422 this->m_logger->logging("DeviceManager:: process_reset_action: DeviceManagementResponder is NULL. No reset processed");
Osamu Nakamura 0:7d720671e6dc 423 }
Osamu Nakamura 0:7d720671e6dc 424 }
Osamu Nakamura 0:7d720671e6dc 425
Osamu Nakamura 0:7d720671e6dc 426 // process our firmware update action
Osamu Nakamura 0:7d720671e6dc 427 void DeviceManager::process_firmware_update_action(void *args) {
Osamu Nakamura 0:7d720671e6dc 428 if (this->m_dm_responder != NULL) {
Osamu Nakamura 0:7d720671e6dc 429 ((DeviceManagementResponder *)this->m_dm_responder)->invokeFOTA(args);
Osamu Nakamura 0:7d720671e6dc 430 }
Osamu Nakamura 0:7d720671e6dc 431 else {
Osamu Nakamura 0:7d720671e6dc 432 // no device management responder instance
Osamu Nakamura 0:7d720671e6dc 433 this->m_logger->logging("DeviceManager:: process_firmware_update_action: DeviceManagementResponder is NULL. No firmware update action processed");
Osamu Nakamura 0:7d720671e6dc 434 }
Osamu Nakamura 0:7d720671e6dc 435 }