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:
Mon Apr 27 10:50:21 2015 +0000
Revision:
96:5dfdc8568e9f
Parent:
93:0acd11870c6a
Child:
98:9f2de96941c4
LCDDisplay now is singleton

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
xinlei 96:5dfdc8568e9f 8 ConfigurationSynchronization::ConfigurationSynchronization(
xinlei 96:5dfdc8568e9f 9 AbstractSmartRest& client, SmartRestTemplate& tpl,
xinlei 96:5dfdc8568e9f 10 long& deviceId, DeviceMemory& deviceMemory) :
xinlei 96:5dfdc8568e9f 11 _init (false),
xinlei 96:5dfdc8568e9f 12 _changed (false),
vwochnik 68:0dc778a16d0d 13 _tpl(tpl),
xinlei 92:48069375dffa 14 _client(client),
vwochnik 68:0dc778a16d0d 15 _deviceMemory(deviceMemory),
xinlei 96:5dfdc8568e9f 16 _deviceId(deviceId),
xinlei 96:5dfdc8568e9f 17 _deviceConfiguration(),
xinlei 96:5dfdc8568e9f 18 _configurationProperties(_deviceConfiguration)
vwochnik 68:0dc778a16d0d 19 {
vwochnik 68:0dc778a16d0d 20 }
vwochnik 68:0dc778a16d0d 21
vwochnik 68:0dc778a16d0d 22 bool ConfigurationSynchronization::init()
vwochnik 68:0dc778a16d0d 23 {
vwochnik 68:0dc778a16d0d 24 if (_init)
vwochnik 68:0dc778a16d0d 25 return false;
vwochnik 68:0dc778a16d0d 26
vwochnik 68:0dc778a16d0d 27 // Update Configuration
vwochnik 69:237c01eb36c2 28 // Usage: 130,<DEVICE/ID>,<CONFIG/STRING>,<RESPONSIBILITY>
vwochnik 69:237c01eb36c2 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"))
vwochnik 68:0dc778a16d0d 30 return false;
vwochnik 68:0dc778a16d0d 31
vwochnik 68:0dc778a16d0d 32 _init = true;
vwochnik 68:0dc778a16d0d 33 return true;
vwochnik 68:0dc778a16d0d 34 }
vwochnik 68:0dc778a16d0d 35
vwochnik 68:0dc778a16d0d 36 bool ConfigurationSynchronization::integrate()
vwochnik 68:0dc778a16d0d 37 {
vwochnik 69:237c01eb36c2 38 if ((!loadConfiguration()) || (!_configurationProperties.validateProperties())) {
vwochnik 68:0dc778a16d0d 39 if ((!_configurationProperties.resetConfiguration()) || (!updateDeviceObject()) || (!saveConfiguration()))
vwochnik 68:0dc778a16d0d 40 return false;
vwochnik 68:0dc778a16d0d 41 } else {
vwochnik 68:0dc778a16d0d 42 if (!updateDeviceObject())
vwochnik 68:0dc778a16d0d 43 return false;
vwochnik 68:0dc778a16d0d 44 }
vwochnik 68:0dc778a16d0d 45
vwochnik 68:0dc778a16d0d 46 return true;
vwochnik 68:0dc778a16d0d 47 }
vwochnik 68:0dc778a16d0d 48
vwochnik 68:0dc778a16d0d 49 bool ConfigurationSynchronization::run()
vwochnik 68:0dc778a16d0d 50 {
vwochnik 68:0dc778a16d0d 51 if (!_changed)
vwochnik 68:0dc778a16d0d 52 return true;
vwochnik 68:0dc778a16d0d 53
vwochnik 68:0dc778a16d0d 54 if ((!updateDeviceObject()) || (!saveConfiguration()))
vwochnik 68:0dc778a16d0d 55 return false;
vwochnik 68:0dc778a16d0d 56
vwochnik 68:0dc778a16d0d 57 _changed = false;
vwochnik 68:0dc778a16d0d 58 return true;
vwochnik 68:0dc778a16d0d 59 }
vwochnik 68:0dc778a16d0d 60
vwochnik 68:0dc778a16d0d 61 bool ConfigurationSynchronization::updateConfiguration(const char *cfg)
vwochnik 68:0dc778a16d0d 62 {
xinlei 93:0acd11870c6a 63 if (!_deviceConfiguration.read(cfg)) {
xinlei 96:5dfdc8568e9f 64 aError("Read device config.\n");
vwochnik 68:0dc778a16d0d 65 return false;
xinlei 93:0acd11870c6a 66 }
vwochnik 68:0dc778a16d0d 67
vwochnik 69:237c01eb36c2 68 if (!_configurationProperties.validateProperties()) {
vwochnik 69:237c01eb36c2 69 loadConfiguration();
vwochnik 69:237c01eb36c2 70 return false;
vwochnik 69:237c01eb36c2 71 }
vwochnik 69:237c01eb36c2 72
vwochnik 68:0dc778a16d0d 73 _changed = true;
vwochnik 68:0dc778a16d0d 74 return true;
vwochnik 68:0dc778a16d0d 75 }
vwochnik 68:0dc778a16d0d 76
vwochnik 68:0dc778a16d0d 77 bool ConfigurationSynchronization::updateDeviceObject()
vwochnik 68:0dc778a16d0d 78 {
vwochnik 68:0dc778a16d0d 79 char buf[256];
vwochnik 68:0dc778a16d0d 80
xinlei 93:0acd11870c6a 81 if (!_deviceConfiguration.write(buf, sizeof(buf))) {
xinlei 96:5dfdc8568e9f 82 aError("Unable to write config.\n");
vwochnik 68:0dc778a16d0d 83 return false;
xinlei 93:0acd11870c6a 84 }
vwochnik 68:0dc778a16d0d 85
vwochnik 68:0dc778a16d0d 86 ComposedRecord record;
vwochnik 68:0dc778a16d0d 87 ParsedRecord received;
vwochnik 68:0dc778a16d0d 88
vwochnik 68:0dc778a16d0d 89 IntegerValue msgId(130);
vwochnik 68:0dc778a16d0d 90 IntegerValue deviceId(_deviceId);
vwochnik 68:0dc778a16d0d 91 CharValue config(buf);
vwochnik 69:237c01eb36c2 92 IntegerValue responsibility(_configurationProperties.readInterval());
xinlei 93:0acd11870c6a 93 if (!record.add(msgId) || !record.add(deviceId) || !record.add(config) || !record.add(responsibility)) {
vwochnik 68:0dc778a16d0d 94 return false;
xinlei 93:0acd11870c6a 95 }
xinlei 93:0acd11870c6a 96
vwochnik 68:0dc778a16d0d 97 if (_client.send(record) != SMARTREST_SUCCESS) {
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) {
vwochnik 68:0dc778a16d0d 103 _client.stop();
vwochnik 68:0dc778a16d0d 104 return false;
vwochnik 68:0dc778a16d0d 105 }
vwochnik 68:0dc778a16d0d 106 _client.stop();
vwochnik 68:0dc778a16d0d 107
vwochnik 68:0dc778a16d0d 108 if (received.values() != 3) {
xinlei 96:5dfdc8568e9f 109 aError("Invalid config, %d (3) values received.\n", received.values());
vwochnik 68:0dc778a16d0d 110 return false;
xinlei 93:0acd11870c6a 111 } else if (received.value(0).integerValue() != 201) {
xinlei 96:5dfdc8568e9f 112 aError("updateDeviceObject: Message ID %ld .\n", received.value(0).integerValue());
vwochnik 68:0dc778a16d0d 113 return false;
vwochnik 68:0dc778a16d0d 114 }
vwochnik 68:0dc778a16d0d 115 return true;
vwochnik 68:0dc778a16d0d 116 }
vwochnik 68:0dc778a16d0d 117
vwochnik 68:0dc778a16d0d 118 bool ConfigurationSynchronization::loadConfiguration()
vwochnik 68:0dc778a16d0d 119 {
vwochnik 68:0dc778a16d0d 120 char buf[256];
vwochnik 68:0dc778a16d0d 121
xinlei 93:0acd11870c6a 122 if (!_deviceMemory.loadConfiguration(buf, sizeof(buf))) {
xinlei 96:5dfdc8568e9f 123 aError("Load device config.\n");
vwochnik 68:0dc778a16d0d 124 return false;
xinlei 93:0acd11870c6a 125 }
xinlei 93:0acd11870c6a 126 if (!_deviceConfiguration.read(buf)) {
xinlei 96:5dfdc8568e9f 127 aError("Read device config.\n");
vwochnik 68:0dc778a16d0d 128 return false;
xinlei 93:0acd11870c6a 129 }
vwochnik 68:0dc778a16d0d 130 return true;
vwochnik 68:0dc778a16d0d 131 }
vwochnik 68:0dc778a16d0d 132
vwochnik 68:0dc778a16d0d 133 bool ConfigurationSynchronization::saveConfiguration()
vwochnik 68:0dc778a16d0d 134 {
vwochnik 68:0dc778a16d0d 135 char buf[256];
vwochnik 68:0dc778a16d0d 136
xinlei 93:0acd11870c6a 137 if (!_deviceConfiguration.write(buf, sizeof(buf))) {
xinlei 96:5dfdc8568e9f 138 aError("Write device config.\n");
vwochnik 68:0dc778a16d0d 139 return false;
xinlei 93:0acd11870c6a 140 }
xinlei 93:0acd11870c6a 141 if (!_deviceMemory.saveConfiguration(buf)) {
xinlei 96:5dfdc8568e9f 142 aError("Save device config.\n");
vwochnik 68:0dc778a16d0d 143 return false;
xinlei 93:0acd11870c6a 144 }
vwochnik 68:0dc778a16d0d 145 return true;
vwochnik 68:0dc778a16d0d 146 }