Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed
Fork of MbedSmartRestMain by
config/ConfigurationSynchronization.cpp@93:0acd11870c6a, 2015-04-13 (annotated)
- Committer:
- xinlei
- Date:
- Mon Apr 13 14:24:58 2015 +0000
- Revision:
- 93:0acd11870c6a
- Parent:
- 92:48069375dffa
- Child:
- 96:5dfdc8568e9f
v2.1rc1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
xinlei | 76:b07effe83fb8 | 1 | #include <stdio.h> |
vwochnik | 68:0dc778a16d0d | 2 | #include "ConfigurationSynchronization.h" |
vwochnik | 68:0dc778a16d0d | 3 | #include "ComposedRecord.h" |
vwochnik | 68:0dc778a16d0d | 4 | #include "CharValue.h" |
vwochnik | 68:0dc778a16d0d | 5 | #include "IntegerValue.h" |
xinlei | 76:b07effe83fb8 | 6 | #include "logging.h" |
vwochnik | 68:0dc778a16d0d | 7 | |
vwochnik | 68:0dc778a16d0d | 8 | ConfigurationSynchronization::ConfigurationSynchronization(AbstractSmartRest& client, SmartRestTemplate& tpl, long& deviceId, DeviceMemory& deviceMemory, DeviceConfiguration& deviceConfiguration, ConfigurationProperties& configurationProperties) : |
xinlei | 92:48069375dffa | 9 | _deviceId(deviceId), |
vwochnik | 68:0dc778a16d0d | 10 | _tpl(tpl), |
xinlei | 92:48069375dffa | 11 | _client(client), |
vwochnik | 68:0dc778a16d0d | 12 | _deviceMemory(deviceMemory), |
vwochnik | 68:0dc778a16d0d | 13 | _deviceConfiguration(deviceConfiguration), |
vwochnik | 68:0dc778a16d0d | 14 | _configurationProperties(configurationProperties) |
vwochnik | 68:0dc778a16d0d | 15 | { |
vwochnik | 68:0dc778a16d0d | 16 | _init = false; |
vwochnik | 68:0dc778a16d0d | 17 | _changed = false; |
vwochnik | 68:0dc778a16d0d | 18 | } |
vwochnik | 68:0dc778a16d0d | 19 | |
vwochnik | 68:0dc778a16d0d | 20 | bool ConfigurationSynchronization::init() |
vwochnik | 68:0dc778a16d0d | 21 | { |
vwochnik | 68:0dc778a16d0d | 22 | if (_init) |
vwochnik | 68:0dc778a16d0d | 23 | return false; |
vwochnik | 68:0dc778a16d0d | 24 | |
vwochnik | 68:0dc778a16d0d | 25 | // Update Configuration |
vwochnik | 69:237c01eb36c2 | 26 | // Usage: 130,<DEVICE/ID>,<CONFIG/STRING>,<RESPONSIBILITY> |
vwochnik | 69:237c01eb36c2 | 27 | if (!_tpl.add("10,130,PUT,/inventory/managedObjects/%%,application/vnd.com.nsn.cumulocity.managedObject+json,application/vnd.com.nsn.cumulocity.managedObject+json,%%,UNSIGNED STRING NUMBER,\"{\"\"c8y_Configuration\"\":{\"\"config\"\":\"\"%%\"\"},\"\"c8y_RequiredAvailability\"\":{ \"\"responseInterval\"\":%%}}\"\r\n")) |
vwochnik | 68:0dc778a16d0d | 28 | return false; |
vwochnik | 68:0dc778a16d0d | 29 | |
vwochnik | 68:0dc778a16d0d | 30 | _init = true; |
vwochnik | 68:0dc778a16d0d | 31 | return true; |
vwochnik | 68:0dc778a16d0d | 32 | } |
vwochnik | 68:0dc778a16d0d | 33 | |
vwochnik | 68:0dc778a16d0d | 34 | bool ConfigurationSynchronization::integrate() |
vwochnik | 68:0dc778a16d0d | 35 | { |
vwochnik | 69:237c01eb36c2 | 36 | if ((!loadConfiguration()) || (!_configurationProperties.validateProperties())) { |
vwochnik | 68:0dc778a16d0d | 37 | if ((!_configurationProperties.resetConfiguration()) || (!updateDeviceObject()) || (!saveConfiguration())) |
vwochnik | 68:0dc778a16d0d | 38 | return false; |
vwochnik | 68:0dc778a16d0d | 39 | } else { |
vwochnik | 68:0dc778a16d0d | 40 | if (!updateDeviceObject()) |
vwochnik | 68:0dc778a16d0d | 41 | return false; |
vwochnik | 68:0dc778a16d0d | 42 | } |
vwochnik | 68:0dc778a16d0d | 43 | |
vwochnik | 68:0dc778a16d0d | 44 | return true; |
vwochnik | 68:0dc778a16d0d | 45 | } |
vwochnik | 68:0dc778a16d0d | 46 | |
vwochnik | 68:0dc778a16d0d | 47 | bool ConfigurationSynchronization::run() |
vwochnik | 68:0dc778a16d0d | 48 | { |
vwochnik | 68:0dc778a16d0d | 49 | if (!_changed) |
vwochnik | 68:0dc778a16d0d | 50 | return true; |
vwochnik | 68:0dc778a16d0d | 51 | |
vwochnik | 68:0dc778a16d0d | 52 | if ((!updateDeviceObject()) || (!saveConfiguration())) |
vwochnik | 68:0dc778a16d0d | 53 | return false; |
vwochnik | 68:0dc778a16d0d | 54 | |
vwochnik | 68:0dc778a16d0d | 55 | _changed = false; |
vwochnik | 68:0dc778a16d0d | 56 | return true; |
vwochnik | 68:0dc778a16d0d | 57 | } |
vwochnik | 68:0dc778a16d0d | 58 | |
vwochnik | 68:0dc778a16d0d | 59 | bool ConfigurationSynchronization::updateConfiguration(const char *cfg) |
vwochnik | 68:0dc778a16d0d | 60 | { |
xinlei | 93:0acd11870c6a | 61 | if (!_deviceConfiguration.read(cfg)) { |
xinlei | 93:0acd11870c6a | 62 | aError("updateConfiguration: Unable to read device configuration!\r\n"); |
vwochnik | 68:0dc778a16d0d | 63 | return false; |
xinlei | 93:0acd11870c6a | 64 | } |
vwochnik | 68:0dc778a16d0d | 65 | |
vwochnik | 69:237c01eb36c2 | 66 | if (!_configurationProperties.validateProperties()) { |
vwochnik | 69:237c01eb36c2 | 67 | loadConfiguration(); |
vwochnik | 69:237c01eb36c2 | 68 | return false; |
vwochnik | 69:237c01eb36c2 | 69 | } |
vwochnik | 69:237c01eb36c2 | 70 | |
vwochnik | 68:0dc778a16d0d | 71 | _changed = true; |
vwochnik | 68:0dc778a16d0d | 72 | return true; |
vwochnik | 68:0dc778a16d0d | 73 | } |
vwochnik | 68:0dc778a16d0d | 74 | |
vwochnik | 68:0dc778a16d0d | 75 | bool ConfigurationSynchronization::updateDeviceObject() |
vwochnik | 68:0dc778a16d0d | 76 | { |
vwochnik | 68:0dc778a16d0d | 77 | char buf[256]; |
vwochnik | 68:0dc778a16d0d | 78 | |
xinlei | 93:0acd11870c6a | 79 | if (!_deviceConfiguration.write(buf, sizeof(buf))) { |
xinlei | 93:0acd11870c6a | 80 | aError("updateDeviceObject: Unable to write device configuration!\r\n"); |
vwochnik | 68:0dc778a16d0d | 81 | return false; |
xinlei | 93:0acd11870c6a | 82 | } |
vwochnik | 68:0dc778a16d0d | 83 | |
vwochnik | 68:0dc778a16d0d | 84 | ComposedRecord record; |
vwochnik | 68:0dc778a16d0d | 85 | ParsedRecord received; |
vwochnik | 68:0dc778a16d0d | 86 | |
vwochnik | 68:0dc778a16d0d | 87 | IntegerValue msgId(130); |
vwochnik | 68:0dc778a16d0d | 88 | IntegerValue deviceId(_deviceId); |
vwochnik | 68:0dc778a16d0d | 89 | CharValue config(buf); |
vwochnik | 69:237c01eb36c2 | 90 | IntegerValue responsibility(_configurationProperties.readInterval()); |
xinlei | 93:0acd11870c6a | 91 | if (!record.add(msgId) || !record.add(deviceId) || !record.add(config) || !record.add(responsibility)) { |
xinlei | 93:0acd11870c6a | 92 | aWarning("updateDeviceObject: Adding record failed!\r\n"); |
vwochnik | 68:0dc778a16d0d | 93 | return false; |
xinlei | 93:0acd11870c6a | 94 | } |
xinlei | 93:0acd11870c6a | 95 | |
vwochnik | 68:0dc778a16d0d | 96 | if (_client.send(record) != SMARTREST_SUCCESS) { |
xinlei | 93:0acd11870c6a | 97 | aWarning("Sending configuration failed.\r\n"); |
vwochnik | 68:0dc778a16d0d | 98 | _client.stop(); |
vwochnik | 68:0dc778a16d0d | 99 | return false; |
vwochnik | 68:0dc778a16d0d | 100 | } |
xinlei | 93:0acd11870c6a | 101 | |
vwochnik | 68:0dc778a16d0d | 102 | if (_client.receive(received) != SMARTREST_SUCCESS) { |
xinlei | 93:0acd11870c6a | 103 | aWarning("Receiving configuration failed.\r\n"); |
vwochnik | 68:0dc778a16d0d | 104 | _client.stop(); |
vwochnik | 68:0dc778a16d0d | 105 | return false; |
vwochnik | 68:0dc778a16d0d | 106 | } |
vwochnik | 68:0dc778a16d0d | 107 | _client.stop(); |
vwochnik | 68:0dc778a16d0d | 108 | |
vwochnik | 68:0dc778a16d0d | 109 | if (received.values() != 3) { |
xinlei | 93:0acd11870c6a | 110 | aError("Invalid configuration received, expected 3 values, but %d received.\r\n", received.values()); |
vwochnik | 68:0dc778a16d0d | 111 | return false; |
xinlei | 93:0acd11870c6a | 112 | } else if (received.value(0).integerValue() != 201) { |
xinlei | 93:0acd11870c6a | 113 | aError("updateDeviceObject: Unexpected message ID %ld received.\r\n", received.value(0).integerValue()); |
vwochnik | 68:0dc778a16d0d | 114 | return false; |
vwochnik | 68:0dc778a16d0d | 115 | } |
vwochnik | 68:0dc778a16d0d | 116 | return true; |
vwochnik | 68:0dc778a16d0d | 117 | } |
vwochnik | 68:0dc778a16d0d | 118 | |
vwochnik | 68:0dc778a16d0d | 119 | bool ConfigurationSynchronization::loadConfiguration() |
vwochnik | 68:0dc778a16d0d | 120 | { |
vwochnik | 68:0dc778a16d0d | 121 | char buf[256]; |
vwochnik | 68:0dc778a16d0d | 122 | |
xinlei | 93:0acd11870c6a | 123 | if (!_deviceMemory.loadConfiguration(buf, sizeof(buf))) { |
xinlei | 93:0acd11870c6a | 124 | aError("loadConfiguration: Unable to load device configuration!\r\n"); |
vwochnik | 68:0dc778a16d0d | 125 | return false; |
xinlei | 93:0acd11870c6a | 126 | } |
xinlei | 93:0acd11870c6a | 127 | if (!_deviceConfiguration.read(buf)) { |
xinlei | 93:0acd11870c6a | 128 | aError("loadConfiguration: Unable to read device configuration!\r\n"); |
vwochnik | 68:0dc778a16d0d | 129 | return false; |
xinlei | 93:0acd11870c6a | 130 | } |
vwochnik | 68:0dc778a16d0d | 131 | return true; |
vwochnik | 68:0dc778a16d0d | 132 | } |
vwochnik | 68:0dc778a16d0d | 133 | |
vwochnik | 68:0dc778a16d0d | 134 | bool ConfigurationSynchronization::saveConfiguration() |
vwochnik | 68:0dc778a16d0d | 135 | { |
vwochnik | 68:0dc778a16d0d | 136 | char buf[256]; |
vwochnik | 68:0dc778a16d0d | 137 | |
xinlei | 93:0acd11870c6a | 138 | if (!_deviceConfiguration.write(buf, sizeof(buf))) { |
xinlei | 93:0acd11870c6a | 139 | aError("saveConfiguration: Unable to write device configuration!\r\n"); |
vwochnik | 68:0dc778a16d0d | 140 | return false; |
xinlei | 93:0acd11870c6a | 141 | } |
xinlei | 93:0acd11870c6a | 142 | if (!_deviceMemory.saveConfiguration(buf)) { |
xinlei | 93:0acd11870c6a | 143 | aError("saveConfiguration: Unable to save device configuration!\r\n"); |
vwochnik | 68:0dc778a16d0d | 144 | return false; |
xinlei | 93:0acd11870c6a | 145 | } |
vwochnik | 68:0dc778a16d0d | 146 | return true; |
vwochnik | 68:0dc778a16d0d | 147 | } |