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:
Fri Mar 20 14:27:10 2015 +0000
Revision:
92:48069375dffa
Parent:
77:f6717e4eccc4
Child:
93:0acd11870c6a
Get rid of all annoying warning messages.

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 {
vwochnik 68:0dc778a16d0d 61 if (!_deviceConfiguration.read(cfg))
vwochnik 68:0dc778a16d0d 62 return false;
vwochnik 68:0dc778a16d0d 63
vwochnik 69:237c01eb36c2 64 if (!_configurationProperties.validateProperties()) {
vwochnik 69:237c01eb36c2 65 loadConfiguration();
vwochnik 69:237c01eb36c2 66 return false;
vwochnik 69:237c01eb36c2 67 }
vwochnik 69:237c01eb36c2 68
vwochnik 68:0dc778a16d0d 69 _changed = true;
vwochnik 68:0dc778a16d0d 70 return true;
vwochnik 68:0dc778a16d0d 71 }
vwochnik 68:0dc778a16d0d 72
vwochnik 68:0dc778a16d0d 73 bool ConfigurationSynchronization::updateDeviceObject()
vwochnik 68:0dc778a16d0d 74 {
vwochnik 68:0dc778a16d0d 75 char buf[256];
vwochnik 68:0dc778a16d0d 76
vwochnik 68:0dc778a16d0d 77 if (!_deviceConfiguration.write(buf, sizeof(buf)))
vwochnik 68:0dc778a16d0d 78 return false;
vwochnik 68:0dc778a16d0d 79
vwochnik 68:0dc778a16d0d 80 ComposedRecord record;
vwochnik 68:0dc778a16d0d 81 ParsedRecord received;
vwochnik 68:0dc778a16d0d 82
vwochnik 68:0dc778a16d0d 83 IntegerValue msgId(130);
vwochnik 68:0dc778a16d0d 84 IntegerValue deviceId(_deviceId);
vwochnik 68:0dc778a16d0d 85 CharValue config(buf);
vwochnik 69:237c01eb36c2 86 IntegerValue responsibility(_configurationProperties.readInterval());
vwochnik 69:237c01eb36c2 87 if ((!record.add(msgId)) || (!record.add(deviceId)) || (!record.add(config)) || (!record.add(responsibility)))
vwochnik 68:0dc778a16d0d 88 return false;
vwochnik 68:0dc778a16d0d 89
vwochnik 68:0dc778a16d0d 90 if (_client.send(record) != SMARTREST_SUCCESS) {
xinlei 77:f6717e4eccc4 91 aError("Sending configuration failed.\r\n");
vwochnik 68:0dc778a16d0d 92 _client.stop();
vwochnik 68:0dc778a16d0d 93 return false;
vwochnik 68:0dc778a16d0d 94 }
vwochnik 68:0dc778a16d0d 95
vwochnik 68:0dc778a16d0d 96 if (_client.receive(received) != SMARTREST_SUCCESS) {
xinlei 77:f6717e4eccc4 97 aError("Connection failure or invalid configuration.\r\n");
vwochnik 68:0dc778a16d0d 98 _client.stop();
vwochnik 68:0dc778a16d0d 99 return false;
vwochnik 68:0dc778a16d0d 100 }
vwochnik 68:0dc778a16d0d 101 _client.stop();
vwochnik 68:0dc778a16d0d 102
vwochnik 68:0dc778a16d0d 103 if (received.values() != 3) {
xinlei 77:f6717e4eccc4 104 aError("Unmatching configuration data received, expected 3, but %d received.\r\n", received.values());
vwochnik 68:0dc778a16d0d 105 return false;
vwochnik 68:0dc778a16d0d 106 }
vwochnik 68:0dc778a16d0d 107
vwochnik 68:0dc778a16d0d 108 if (received.value(0).integerValue() != 201) {
xinlei 77:f6717e4eccc4 109 aError("Bad configuration data received.\r\n");
vwochnik 68:0dc778a16d0d 110 return false;
vwochnik 68:0dc778a16d0d 111 }
vwochnik 68:0dc778a16d0d 112 return true;
vwochnik 68:0dc778a16d0d 113 }
vwochnik 68:0dc778a16d0d 114
vwochnik 68:0dc778a16d0d 115 bool ConfigurationSynchronization::loadConfiguration()
vwochnik 68:0dc778a16d0d 116 {
vwochnik 68:0dc778a16d0d 117 char buf[256];
vwochnik 68:0dc778a16d0d 118
vwochnik 68:0dc778a16d0d 119 if (!_deviceMemory.loadConfiguration(buf, sizeof(buf)))
vwochnik 68:0dc778a16d0d 120 return false;
vwochnik 68:0dc778a16d0d 121
vwochnik 68:0dc778a16d0d 122 if (!_deviceConfiguration.read(buf))
vwochnik 68:0dc778a16d0d 123 return false;
vwochnik 68:0dc778a16d0d 124
vwochnik 68:0dc778a16d0d 125 return true;
vwochnik 68:0dc778a16d0d 126 }
vwochnik 68:0dc778a16d0d 127
vwochnik 68:0dc778a16d0d 128 bool ConfigurationSynchronization::saveConfiguration()
vwochnik 68:0dc778a16d0d 129 {
vwochnik 68:0dc778a16d0d 130 char buf[256];
vwochnik 68:0dc778a16d0d 131
vwochnik 68:0dc778a16d0d 132 if (!_deviceConfiguration.write(buf, sizeof(buf)))
vwochnik 68:0dc778a16d0d 133 return false;
vwochnik 68:0dc778a16d0d 134
vwochnik 68:0dc778a16d0d 135 if (!_deviceMemory.saveConfiguration(buf))
vwochnik 68:0dc778a16d0d 136 return false;
vwochnik 68:0dc778a16d0d 137
vwochnik 68:0dc778a16d0d 138 return true;
vwochnik 68:0dc778a16d0d 139 }