Official reference client implementation for Cumulocity SmartREST on u-blox C027.
Dependencies: C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed
Fork of MbedSmartRestMain by
config/ConfigurationSynchronization.cpp@96:5dfdc8568e9f, 2015-04-27 (annotated)
- Committer:
- xinlei
- Date:
- Mon Apr 27 10:50:21 2015 +0000
- Revision:
- 96:5dfdc8568e9f
- Parent:
- 93:0acd11870c6a
- Child:
- 98:9f2de96941c4
LCDDisplay now is singleton
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 | |
xinlei | 96:5dfdc8568e9f | 8 | ConfigurationSynchronization::ConfigurationSynchronization( |
xinlei | 96:5dfdc8568e9f | 9 | AbstractSmartRest& client, SmartRestTemplate& tpl, |
xinlei | 96:5dfdc8568e9f | 10 | long& deviceId, DeviceMemory& deviceMemory) : |
xinlei | 96:5dfdc8568e9f | 11 | _init (false), |
xinlei | 96:5dfdc8568e9f | 12 | _changed (false), |
vwochnik | 68:0dc778a16d0d | 13 | _tpl(tpl), |
xinlei | 92:48069375dffa | 14 | _client(client), |
vwochnik | 68:0dc778a16d0d | 15 | _deviceMemory(deviceMemory), |
xinlei | 96:5dfdc8568e9f | 16 | _deviceId(deviceId), |
xinlei | 96:5dfdc8568e9f | 17 | _deviceConfiguration(), |
xinlei | 96:5dfdc8568e9f | 18 | _configurationProperties(_deviceConfiguration) |
vwochnik | 68:0dc778a16d0d | 19 | { |
vwochnik | 68:0dc778a16d0d | 20 | } |
vwochnik | 68:0dc778a16d0d | 21 | |
vwochnik | 68:0dc778a16d0d | 22 | bool ConfigurationSynchronization::init() |
vwochnik | 68:0dc778a16d0d | 23 | { |
vwochnik | 68:0dc778a16d0d | 24 | if (_init) |
vwochnik | 68:0dc778a16d0d | 25 | return false; |
vwochnik | 68:0dc778a16d0d | 26 | |
vwochnik | 68:0dc778a16d0d | 27 | // Update Configuration |
vwochnik | 69:237c01eb36c2 | 28 | // Usage: 130,<DEVICE/ID>,<CONFIG/STRING>,<RESPONSIBILITY> |
vwochnik | 69:237c01eb36c2 | 29 | 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 | 30 | return false; |
vwochnik | 68:0dc778a16d0d | 31 | |
vwochnik | 68:0dc778a16d0d | 32 | _init = true; |
vwochnik | 68:0dc778a16d0d | 33 | return true; |
vwochnik | 68:0dc778a16d0d | 34 | } |
vwochnik | 68:0dc778a16d0d | 35 | |
vwochnik | 68:0dc778a16d0d | 36 | bool ConfigurationSynchronization::integrate() |
vwochnik | 68:0dc778a16d0d | 37 | { |
vwochnik | 69:237c01eb36c2 | 38 | if ((!loadConfiguration()) || (!_configurationProperties.validateProperties())) { |
vwochnik | 68:0dc778a16d0d | 39 | if ((!_configurationProperties.resetConfiguration()) || (!updateDeviceObject()) || (!saveConfiguration())) |
vwochnik | 68:0dc778a16d0d | 40 | return false; |
vwochnik | 68:0dc778a16d0d | 41 | } else { |
vwochnik | 68:0dc778a16d0d | 42 | if (!updateDeviceObject()) |
vwochnik | 68:0dc778a16d0d | 43 | return false; |
vwochnik | 68:0dc778a16d0d | 44 | } |
vwochnik | 68:0dc778a16d0d | 45 | |
vwochnik | 68:0dc778a16d0d | 46 | return true; |
vwochnik | 68:0dc778a16d0d | 47 | } |
vwochnik | 68:0dc778a16d0d | 48 | |
vwochnik | 68:0dc778a16d0d | 49 | bool ConfigurationSynchronization::run() |
vwochnik | 68:0dc778a16d0d | 50 | { |
vwochnik | 68:0dc778a16d0d | 51 | if (!_changed) |
vwochnik | 68:0dc778a16d0d | 52 | return true; |
vwochnik | 68:0dc778a16d0d | 53 | |
vwochnik | 68:0dc778a16d0d | 54 | if ((!updateDeviceObject()) || (!saveConfiguration())) |
vwochnik | 68:0dc778a16d0d | 55 | return false; |
vwochnik | 68:0dc778a16d0d | 56 | |
vwochnik | 68:0dc778a16d0d | 57 | _changed = false; |
vwochnik | 68:0dc778a16d0d | 58 | return true; |
vwochnik | 68:0dc778a16d0d | 59 | } |
vwochnik | 68:0dc778a16d0d | 60 | |
vwochnik | 68:0dc778a16d0d | 61 | bool ConfigurationSynchronization::updateConfiguration(const char *cfg) |
vwochnik | 68:0dc778a16d0d | 62 | { |
xinlei | 93:0acd11870c6a | 63 | if (!_deviceConfiguration.read(cfg)) { |
xinlei | 96:5dfdc8568e9f | 64 | aError("Read device config.\n"); |
vwochnik | 68:0dc778a16d0d | 65 | return false; |
xinlei | 93:0acd11870c6a | 66 | } |
vwochnik | 68:0dc778a16d0d | 67 | |
vwochnik | 69:237c01eb36c2 | 68 | if (!_configurationProperties.validateProperties()) { |
vwochnik | 69:237c01eb36c2 | 69 | loadConfiguration(); |
vwochnik | 69:237c01eb36c2 | 70 | return false; |
vwochnik | 69:237c01eb36c2 | 71 | } |
vwochnik | 69:237c01eb36c2 | 72 | |
vwochnik | 68:0dc778a16d0d | 73 | _changed = true; |
vwochnik | 68:0dc778a16d0d | 74 | return true; |
vwochnik | 68:0dc778a16d0d | 75 | } |
vwochnik | 68:0dc778a16d0d | 76 | |
vwochnik | 68:0dc778a16d0d | 77 | bool ConfigurationSynchronization::updateDeviceObject() |
vwochnik | 68:0dc778a16d0d | 78 | { |
vwochnik | 68:0dc778a16d0d | 79 | char buf[256]; |
vwochnik | 68:0dc778a16d0d | 80 | |
xinlei | 93:0acd11870c6a | 81 | if (!_deviceConfiguration.write(buf, sizeof(buf))) { |
xinlei | 96:5dfdc8568e9f | 82 | aError("Unable to write config.\n"); |
vwochnik | 68:0dc778a16d0d | 83 | return false; |
xinlei | 93:0acd11870c6a | 84 | } |
vwochnik | 68:0dc778a16d0d | 85 | |
vwochnik | 68:0dc778a16d0d | 86 | ComposedRecord record; |
vwochnik | 68:0dc778a16d0d | 87 | ParsedRecord received; |
vwochnik | 68:0dc778a16d0d | 88 | |
vwochnik | 68:0dc778a16d0d | 89 | IntegerValue msgId(130); |
vwochnik | 68:0dc778a16d0d | 90 | IntegerValue deviceId(_deviceId); |
vwochnik | 68:0dc778a16d0d | 91 | CharValue config(buf); |
vwochnik | 69:237c01eb36c2 | 92 | IntegerValue responsibility(_configurationProperties.readInterval()); |
xinlei | 93:0acd11870c6a | 93 | if (!record.add(msgId) || !record.add(deviceId) || !record.add(config) || !record.add(responsibility)) { |
vwochnik | 68:0dc778a16d0d | 94 | return false; |
xinlei | 93:0acd11870c6a | 95 | } |
xinlei | 93:0acd11870c6a | 96 | |
vwochnik | 68:0dc778a16d0d | 97 | if (_client.send(record) != SMARTREST_SUCCESS) { |
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) { |
vwochnik | 68:0dc778a16d0d | 103 | _client.stop(); |
vwochnik | 68:0dc778a16d0d | 104 | return false; |
vwochnik | 68:0dc778a16d0d | 105 | } |
vwochnik | 68:0dc778a16d0d | 106 | _client.stop(); |
vwochnik | 68:0dc778a16d0d | 107 | |
vwochnik | 68:0dc778a16d0d | 108 | if (received.values() != 3) { |
xinlei | 96:5dfdc8568e9f | 109 | aError("Invalid config, %d (3) values received.\n", received.values()); |
vwochnik | 68:0dc778a16d0d | 110 | return false; |
xinlei | 93:0acd11870c6a | 111 | } else if (received.value(0).integerValue() != 201) { |
xinlei | 96:5dfdc8568e9f | 112 | aError("updateDeviceObject: Message ID %ld .\n", received.value(0).integerValue()); |
vwochnik | 68:0dc778a16d0d | 113 | return false; |
vwochnik | 68:0dc778a16d0d | 114 | } |
vwochnik | 68:0dc778a16d0d | 115 | return true; |
vwochnik | 68:0dc778a16d0d | 116 | } |
vwochnik | 68:0dc778a16d0d | 117 | |
vwochnik | 68:0dc778a16d0d | 118 | bool ConfigurationSynchronization::loadConfiguration() |
vwochnik | 68:0dc778a16d0d | 119 | { |
vwochnik | 68:0dc778a16d0d | 120 | char buf[256]; |
vwochnik | 68:0dc778a16d0d | 121 | |
xinlei | 93:0acd11870c6a | 122 | if (!_deviceMemory.loadConfiguration(buf, sizeof(buf))) { |
xinlei | 96:5dfdc8568e9f | 123 | aError("Load device config.\n"); |
vwochnik | 68:0dc778a16d0d | 124 | return false; |
xinlei | 93:0acd11870c6a | 125 | } |
xinlei | 93:0acd11870c6a | 126 | if (!_deviceConfiguration.read(buf)) { |
xinlei | 96:5dfdc8568e9f | 127 | aError("Read device config.\n"); |
vwochnik | 68:0dc778a16d0d | 128 | return false; |
xinlei | 93:0acd11870c6a | 129 | } |
vwochnik | 68:0dc778a16d0d | 130 | return true; |
vwochnik | 68:0dc778a16d0d | 131 | } |
vwochnik | 68:0dc778a16d0d | 132 | |
vwochnik | 68:0dc778a16d0d | 133 | bool ConfigurationSynchronization::saveConfiguration() |
vwochnik | 68:0dc778a16d0d | 134 | { |
vwochnik | 68:0dc778a16d0d | 135 | char buf[256]; |
vwochnik | 68:0dc778a16d0d | 136 | |
xinlei | 93:0acd11870c6a | 137 | if (!_deviceConfiguration.write(buf, sizeof(buf))) { |
xinlei | 96:5dfdc8568e9f | 138 | aError("Write device config.\n"); |
vwochnik | 68:0dc778a16d0d | 139 | return false; |
xinlei | 93:0acd11870c6a | 140 | } |
xinlei | 93:0acd11870c6a | 141 | if (!_deviceMemory.saveConfiguration(buf)) { |
xinlei | 96:5dfdc8568e9f | 142 | aError("Save device config.\n"); |
vwochnik | 68:0dc778a16d0d | 143 | return false; |
xinlei | 93:0acd11870c6a | 144 | } |
vwochnik | 68:0dc778a16d0d | 145 | return true; |
vwochnik | 68:0dc778a16d0d | 146 | } |