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 Vincent Wochnik

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?

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) :
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 }