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/ConfigSync.cpp@99:e369fc75c000, 2015-05-07 (annotated)
- Committer:
- xinlei
- Date:
- Thu May 07 09:57:55 2015 +0000
- Revision:
- 99:e369fc75c000
- Child:
- 100:47ea098f8a47
prepare for v2.1rc3.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
xinlei | 99:e369fc75c000 | 1 | #include <stdio.h> |
xinlei | 99:e369fc75c000 | 2 | #include "ConfigSync.h" |
xinlei | 99:e369fc75c000 | 3 | #include "DeviceMemory.h" |
xinlei | 99:e369fc75c000 | 4 | #include "ComposedRecord.h" |
xinlei | 99:e369fc75c000 | 5 | #include "CharValue.h" |
xinlei | 99:e369fc75c000 | 6 | #include "IntegerValue.h" |
xinlei | 99:e369fc75c000 | 7 | #include "logging.h" |
xinlei | 99:e369fc75c000 | 8 | |
xinlei | 99:e369fc75c000 | 9 | ConfigSync::ConfigSync( |
xinlei | 99:e369fc75c000 | 10 | AbstractSmartRest& client, SmartRestTemplate& tpl, |
xinlei | 99:e369fc75c000 | 11 | long& deviceId) : |
xinlei | 99:e369fc75c000 | 12 | _init (false), |
xinlei | 99:e369fc75c000 | 13 | _changed (false), |
xinlei | 99:e369fc75c000 | 14 | _tpl(tpl), |
xinlei | 99:e369fc75c000 | 15 | _client(client), |
xinlei | 99:e369fc75c000 | 16 | _deviceId(deviceId), |
xinlei | 99:e369fc75c000 | 17 | _deviceConfiguration(), |
xinlei | 99:e369fc75c000 | 18 | _configurationProperties(_deviceConfiguration) |
xinlei | 99:e369fc75c000 | 19 | { |
xinlei | 99:e369fc75c000 | 20 | } |
xinlei | 99:e369fc75c000 | 21 | |
xinlei | 99:e369fc75c000 | 22 | bool ConfigSync::init() |
xinlei | 99:e369fc75c000 | 23 | { |
xinlei | 99:e369fc75c000 | 24 | if (_init) |
xinlei | 99:e369fc75c000 | 25 | return false; |
xinlei | 99:e369fc75c000 | 26 | |
xinlei | 99:e369fc75c000 | 27 | // Update Configuration |
xinlei | 99:e369fc75c000 | 28 | // Usage: 130,<DEVICE/ID>,<CONFIG/STRING>,<RESPONSIBILITY> |
xinlei | 99:e369fc75c000 | 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")) |
xinlei | 99:e369fc75c000 | 30 | return false; |
xinlei | 99:e369fc75c000 | 31 | |
xinlei | 99:e369fc75c000 | 32 | _init = true; |
xinlei | 99:e369fc75c000 | 33 | return true; |
xinlei | 99:e369fc75c000 | 34 | } |
xinlei | 99:e369fc75c000 | 35 | |
xinlei | 99:e369fc75c000 | 36 | bool ConfigSync::integrate() |
xinlei | 99:e369fc75c000 | 37 | { |
xinlei | 99:e369fc75c000 | 38 | if ((!loadConfiguration()) || (!_configurationProperties.validateProperties())) { |
xinlei | 99:e369fc75c000 | 39 | if ((!_configurationProperties.resetConfiguration()) || (!updateDeviceObject()) || (!saveConfiguration())) |
xinlei | 99:e369fc75c000 | 40 | return false; |
xinlei | 99:e369fc75c000 | 41 | } else { |
xinlei | 99:e369fc75c000 | 42 | if (!updateDeviceObject()) |
xinlei | 99:e369fc75c000 | 43 | return false; |
xinlei | 99:e369fc75c000 | 44 | } |
xinlei | 99:e369fc75c000 | 45 | return true; |
xinlei | 99:e369fc75c000 | 46 | } |
xinlei | 99:e369fc75c000 | 47 | |
xinlei | 99:e369fc75c000 | 48 | bool ConfigSync::run() |
xinlei | 99:e369fc75c000 | 49 | { |
xinlei | 99:e369fc75c000 | 50 | if (!_changed) |
xinlei | 99:e369fc75c000 | 51 | return true; |
xinlei | 99:e369fc75c000 | 52 | |
xinlei | 99:e369fc75c000 | 53 | if ((!updateDeviceObject()) || (!saveConfiguration())) |
xinlei | 99:e369fc75c000 | 54 | return false; |
xinlei | 99:e369fc75c000 | 55 | |
xinlei | 99:e369fc75c000 | 56 | _changed = false; |
xinlei | 99:e369fc75c000 | 57 | return true; |
xinlei | 99:e369fc75c000 | 58 | } |
xinlei | 99:e369fc75c000 | 59 | |
xinlei | 99:e369fc75c000 | 60 | bool ConfigSync::updateConfiguration(const char *cfg) |
xinlei | 99:e369fc75c000 | 61 | { |
xinlei | 99:e369fc75c000 | 62 | if (!_deviceConfiguration.read(cfg)) { |
xinlei | 99:e369fc75c000 | 63 | aError("Read device config.\n"); |
xinlei | 99:e369fc75c000 | 64 | return false; |
xinlei | 99:e369fc75c000 | 65 | } |
xinlei | 99:e369fc75c000 | 66 | |
xinlei | 99:e369fc75c000 | 67 | if (!_configurationProperties.validateProperties()) { |
xinlei | 99:e369fc75c000 | 68 | loadConfiguration(); |
xinlei | 99:e369fc75c000 | 69 | return false; |
xinlei | 99:e369fc75c000 | 70 | } |
xinlei | 99:e369fc75c000 | 71 | |
xinlei | 99:e369fc75c000 | 72 | _changed = true; |
xinlei | 99:e369fc75c000 | 73 | return true; |
xinlei | 99:e369fc75c000 | 74 | } |
xinlei | 99:e369fc75c000 | 75 | |
xinlei | 99:e369fc75c000 | 76 | bool ConfigSync::updateDeviceObject() |
xinlei | 99:e369fc75c000 | 77 | { |
xinlei | 99:e369fc75c000 | 78 | char buf[256]; |
xinlei | 99:e369fc75c000 | 79 | |
xinlei | 99:e369fc75c000 | 80 | if (!_deviceConfiguration.write(buf, sizeof(buf))) { |
xinlei | 99:e369fc75c000 | 81 | aError("Unable to write config.\n"); |
xinlei | 99:e369fc75c000 | 82 | return false; |
xinlei | 99:e369fc75c000 | 83 | } |
xinlei | 99:e369fc75c000 | 84 | |
xinlei | 99:e369fc75c000 | 85 | ComposedRecord record; |
xinlei | 99:e369fc75c000 | 86 | ParsedRecord received; |
xinlei | 99:e369fc75c000 | 87 | |
xinlei | 99:e369fc75c000 | 88 | IntegerValue msgId(130); |
xinlei | 99:e369fc75c000 | 89 | IntegerValue deviceId(_deviceId); |
xinlei | 99:e369fc75c000 | 90 | CharValue config(buf); |
xinlei | 99:e369fc75c000 | 91 | IntegerValue responsibility(_configurationProperties.readInterval()); |
xinlei | 99:e369fc75c000 | 92 | if (!record.add(msgId) || !record.add(deviceId) || !record.add(config) || !record.add(responsibility)) { |
xinlei | 99:e369fc75c000 | 93 | return false; |
xinlei | 99:e369fc75c000 | 94 | } |
xinlei | 99:e369fc75c000 | 95 | |
xinlei | 99:e369fc75c000 | 96 | if (_client.send(record) != SMARTREST_SUCCESS) { |
xinlei | 99:e369fc75c000 | 97 | _client.stop(); |
xinlei | 99:e369fc75c000 | 98 | return false; |
xinlei | 99:e369fc75c000 | 99 | } |
xinlei | 99:e369fc75c000 | 100 | |
xinlei | 99:e369fc75c000 | 101 | if (_client.receive(received) != SMARTREST_SUCCESS) { |
xinlei | 99:e369fc75c000 | 102 | _client.stop(); |
xinlei | 99:e369fc75c000 | 103 | return false; |
xinlei | 99:e369fc75c000 | 104 | } |
xinlei | 99:e369fc75c000 | 105 | _client.stop(); |
xinlei | 99:e369fc75c000 | 106 | |
xinlei | 99:e369fc75c000 | 107 | if (received.values() != 3) { |
xinlei | 99:e369fc75c000 | 108 | aError("Invalid config, %d (3) values received.\n", received.values()); |
xinlei | 99:e369fc75c000 | 109 | return false; |
xinlei | 99:e369fc75c000 | 110 | } else if (received.value(0).integerValue() != 201) { |
xinlei | 99:e369fc75c000 | 111 | aError("updateDeviceObject: Message ID %ld .\n", received.value(0).integerValue()); |
xinlei | 99:e369fc75c000 | 112 | return false; |
xinlei | 99:e369fc75c000 | 113 | } |
xinlei | 99:e369fc75c000 | 114 | return true; |
xinlei | 99:e369fc75c000 | 115 | } |
xinlei | 99:e369fc75c000 | 116 | |
xinlei | 99:e369fc75c000 | 117 | bool ConfigSync::loadConfiguration() |
xinlei | 99:e369fc75c000 | 118 | { |
xinlei | 99:e369fc75c000 | 119 | char buf[256]; |
xinlei | 99:e369fc75c000 | 120 | |
xinlei | 99:e369fc75c000 | 121 | if (!::loadConfiguration(buf, sizeof(buf))) { |
xinlei | 99:e369fc75c000 | 122 | aError("Load device config.\n"); |
xinlei | 99:e369fc75c000 | 123 | return false; |
xinlei | 99:e369fc75c000 | 124 | } |
xinlei | 99:e369fc75c000 | 125 | if (!_deviceConfiguration.read(buf)) { |
xinlei | 99:e369fc75c000 | 126 | aError("Read device config.\n"); |
xinlei | 99:e369fc75c000 | 127 | return false; |
xinlei | 99:e369fc75c000 | 128 | } |
xinlei | 99:e369fc75c000 | 129 | return true; |
xinlei | 99:e369fc75c000 | 130 | } |
xinlei | 99:e369fc75c000 | 131 | |
xinlei | 99:e369fc75c000 | 132 | bool ConfigSync::saveConfiguration() |
xinlei | 99:e369fc75c000 | 133 | { |
xinlei | 99:e369fc75c000 | 134 | char buf[256]; |
xinlei | 99:e369fc75c000 | 135 | |
xinlei | 99:e369fc75c000 | 136 | if (!_deviceConfiguration.write(buf, sizeof(buf))) { |
xinlei | 99:e369fc75c000 | 137 | aError("Write device config.\n"); |
xinlei | 99:e369fc75c000 | 138 | return false; |
xinlei | 99:e369fc75c000 | 139 | } |
xinlei | 99:e369fc75c000 | 140 | if (!::saveConfiguration(buf)) { |
xinlei | 99:e369fc75c000 | 141 | aError("Save device config.\n"); |
xinlei | 99:e369fc75c000 | 142 | return false; |
xinlei | 99:e369fc75c000 | 143 | } |
xinlei | 99:e369fc75c000 | 144 | return true; |
xinlei | 99:e369fc75c000 | 145 | } |