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
mbedConnectorInterface/source/DeviceManager.cpp@1:67f8b5cfde75, 2016-11-10 (annotated)
- 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?
User | Revision | Line number | New 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 | } |