Cumulocity Official / Mbed 2 deprecated MbedSmartRestMain Featured

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Vincent Wochnik

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?

UserRevisionLine numberNew 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 }