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:
Thu May 07 09:57:55 2015 +0000
Revision:
99:e369fc75c000
Child:
100:47ea098f8a47
prepare for v2.1rc3.

Who changed what in which revision?

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