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@76:b07effe83fb8, 2015-02-25 (annotated)
- Committer:
- xinlei
- Date:
- Wed Feb 25 10:06:11 2015 +0000
- Revision:
- 76:b07effe83fb8
- Parent:
- 69:237c01eb36c2
- Child:
- 77:f6717e4eccc4
watchdog: added watchdog;
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) : |
vwochnik | 68:0dc778a16d0d | 9 | _client(client), |
vwochnik | 68:0dc778a16d0d | 10 | _tpl(tpl), |
vwochnik | 68:0dc778a16d0d | 11 | _deviceId(deviceId), |
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")) |
xinlei | 76:b07effe83fb8 | 28 | // if (!_tpl.add("10,130,PUT,/inventory/managedObjects/%%,application/vnd.com.nsn.cumulocity.managedObject+json,application/vnd.com.nsn.cumulocity.managedObject+json,%%,UNSIGNED NUMBER,\"{\"\"c8y_RequiredAvailability\"\":{ \"\"responseInterval\"\":%%}}\"\r\n")) |
vwochnik | 68:0dc778a16d0d | 29 | return false; |
vwochnik | 68:0dc778a16d0d | 30 | |
vwochnik | 68:0dc778a16d0d | 31 | _init = true; |
vwochnik | 68:0dc778a16d0d | 32 | return true; |
vwochnik | 68:0dc778a16d0d | 33 | } |
vwochnik | 68:0dc778a16d0d | 34 | |
vwochnik | 68:0dc778a16d0d | 35 | bool ConfigurationSynchronization::integrate() |
vwochnik | 68:0dc778a16d0d | 36 | { |
vwochnik | 69:237c01eb36c2 | 37 | if ((!loadConfiguration()) || (!_configurationProperties.validateProperties())) { |
vwochnik | 68:0dc778a16d0d | 38 | if ((!_configurationProperties.resetConfiguration()) || (!updateDeviceObject()) || (!saveConfiguration())) |
vwochnik | 68:0dc778a16d0d | 39 | return false; |
vwochnik | 68:0dc778a16d0d | 40 | } else { |
vwochnik | 68:0dc778a16d0d | 41 | if (!updateDeviceObject()) |
vwochnik | 68:0dc778a16d0d | 42 | return false; |
vwochnik | 68:0dc778a16d0d | 43 | } |
vwochnik | 68:0dc778a16d0d | 44 | |
vwochnik | 68:0dc778a16d0d | 45 | return true; |
vwochnik | 68:0dc778a16d0d | 46 | } |
vwochnik | 68:0dc778a16d0d | 47 | |
vwochnik | 68:0dc778a16d0d | 48 | bool ConfigurationSynchronization::run() |
vwochnik | 68:0dc778a16d0d | 49 | { |
vwochnik | 68:0dc778a16d0d | 50 | if (!_changed) |
vwochnik | 68:0dc778a16d0d | 51 | return true; |
vwochnik | 68:0dc778a16d0d | 52 | |
vwochnik | 68:0dc778a16d0d | 53 | if ((!updateDeviceObject()) || (!saveConfiguration())) |
vwochnik | 68:0dc778a16d0d | 54 | return false; |
vwochnik | 68:0dc778a16d0d | 55 | |
vwochnik | 68:0dc778a16d0d | 56 | _changed = false; |
vwochnik | 68:0dc778a16d0d | 57 | return true; |
vwochnik | 68:0dc778a16d0d | 58 | } |
vwochnik | 68:0dc778a16d0d | 59 | |
vwochnik | 68:0dc778a16d0d | 60 | bool ConfigurationSynchronization::updateConfiguration(const char *cfg) |
vwochnik | 68:0dc778a16d0d | 61 | { |
vwochnik | 68:0dc778a16d0d | 62 | if (!_deviceConfiguration.read(cfg)) |
vwochnik | 68:0dc778a16d0d | 63 | return false; |
vwochnik | 68:0dc778a16d0d | 64 | |
vwochnik | 69:237c01eb36c2 | 65 | if (!_configurationProperties.validateProperties()) { |
vwochnik | 69:237c01eb36c2 | 66 | loadConfiguration(); |
vwochnik | 69:237c01eb36c2 | 67 | return false; |
vwochnik | 69:237c01eb36c2 | 68 | } |
vwochnik | 69:237c01eb36c2 | 69 | |
vwochnik | 68:0dc778a16d0d | 70 | _changed = true; |
vwochnik | 68:0dc778a16d0d | 71 | return true; |
vwochnik | 68:0dc778a16d0d | 72 | } |
vwochnik | 68:0dc778a16d0d | 73 | |
vwochnik | 68:0dc778a16d0d | 74 | bool ConfigurationSynchronization::updateDeviceObject() |
vwochnik | 68:0dc778a16d0d | 75 | { |
vwochnik | 68:0dc778a16d0d | 76 | char buf[256]; |
vwochnik | 68:0dc778a16d0d | 77 | |
vwochnik | 68:0dc778a16d0d | 78 | if (!_deviceConfiguration.write(buf, sizeof(buf))) |
vwochnik | 68:0dc778a16d0d | 79 | return false; |
vwochnik | 68:0dc778a16d0d | 80 | |
vwochnik | 68:0dc778a16d0d | 81 | ComposedRecord record; |
vwochnik | 68:0dc778a16d0d | 82 | ParsedRecord received; |
vwochnik | 68:0dc778a16d0d | 83 | |
vwochnik | 68:0dc778a16d0d | 84 | IntegerValue msgId(130); |
vwochnik | 68:0dc778a16d0d | 85 | IntegerValue deviceId(_deviceId); |
vwochnik | 68:0dc778a16d0d | 86 | CharValue config(buf); |
vwochnik | 69:237c01eb36c2 | 87 | IntegerValue responsibility(_configurationProperties.readInterval()); |
vwochnik | 69:237c01eb36c2 | 88 | if ((!record.add(msgId)) || (!record.add(deviceId)) || (!record.add(config)) || (!record.add(responsibility))) |
vwochnik | 68:0dc778a16d0d | 89 | return false; |
vwochnik | 68:0dc778a16d0d | 90 | |
vwochnik | 68:0dc778a16d0d | 91 | if (_client.send(record) != SMARTREST_SUCCESS) { |
xinlei | 76:b07effe83fb8 | 92 | aWarning("Sending configuration failed."); |
vwochnik | 68:0dc778a16d0d | 93 | _client.stop(); |
vwochnik | 68:0dc778a16d0d | 94 | return false; |
vwochnik | 68:0dc778a16d0d | 95 | } |
vwochnik | 68:0dc778a16d0d | 96 | |
vwochnik | 68:0dc778a16d0d | 97 | if (_client.receive(received) != SMARTREST_SUCCESS) { |
xinlei | 76:b07effe83fb8 | 98 | aWarning("Receiving configuration failed."); |
vwochnik | 68:0dc778a16d0d | 99 | _client.stop(); |
vwochnik | 68:0dc778a16d0d | 100 | return false; |
vwochnik | 68:0dc778a16d0d | 101 | } |
vwochnik | 68:0dc778a16d0d | 102 | _client.stop(); |
vwochnik | 68:0dc778a16d0d | 103 | |
vwochnik | 68:0dc778a16d0d | 104 | if (received.values() != 3) { |
xinlei | 76:b07effe83fb8 | 105 | aWarning("Incomplete configuration data received."); |
vwochnik | 68:0dc778a16d0d | 106 | return false; |
vwochnik | 68:0dc778a16d0d | 107 | } |
vwochnik | 68:0dc778a16d0d | 108 | |
vwochnik | 68:0dc778a16d0d | 109 | if (received.value(0).integerValue() != 201) { |
xinlei | 76:b07effe83fb8 | 110 | aWarning("Bad configuration data received."); |
vwochnik | 68:0dc778a16d0d | 111 | return false; |
vwochnik | 68:0dc778a16d0d | 112 | } |
vwochnik | 68:0dc778a16d0d | 113 | return true; |
vwochnik | 68:0dc778a16d0d | 114 | } |
vwochnik | 68:0dc778a16d0d | 115 | |
vwochnik | 68:0dc778a16d0d | 116 | bool ConfigurationSynchronization::loadConfiguration() |
vwochnik | 68:0dc778a16d0d | 117 | { |
vwochnik | 68:0dc778a16d0d | 118 | char buf[256]; |
vwochnik | 68:0dc778a16d0d | 119 | |
vwochnik | 68:0dc778a16d0d | 120 | if (!_deviceMemory.loadConfiguration(buf, sizeof(buf))) |
vwochnik | 68:0dc778a16d0d | 121 | return false; |
vwochnik | 68:0dc778a16d0d | 122 | |
vwochnik | 68:0dc778a16d0d | 123 | if (!_deviceConfiguration.read(buf)) |
vwochnik | 68:0dc778a16d0d | 124 | return false; |
vwochnik | 68:0dc778a16d0d | 125 | |
vwochnik | 68:0dc778a16d0d | 126 | return true; |
vwochnik | 68:0dc778a16d0d | 127 | } |
vwochnik | 68:0dc778a16d0d | 128 | |
vwochnik | 68:0dc778a16d0d | 129 | bool ConfigurationSynchronization::saveConfiguration() |
vwochnik | 68:0dc778a16d0d | 130 | { |
vwochnik | 68:0dc778a16d0d | 131 | char buf[256]; |
vwochnik | 68:0dc778a16d0d | 132 | |
vwochnik | 68:0dc778a16d0d | 133 | if (!_deviceConfiguration.write(buf, sizeof(buf))) |
vwochnik | 68:0dc778a16d0d | 134 | return false; |
vwochnik | 68:0dc778a16d0d | 135 | |
vwochnik | 68:0dc778a16d0d | 136 | if (!_deviceMemory.saveConfiguration(buf)) |
vwochnik | 68:0dc778a16d0d | 137 | return false; |
vwochnik | 68:0dc778a16d0d | 138 | |
vwochnik | 68:0dc778a16d0d | 139 | return true; |
vwochnik | 68:0dc778a16d0d | 140 | } |