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 May 20 09:55:49 2015 +0000
Revision:
117:5de54f09f754
Parent:
111:ee9ae4a5e55c
Child:
122:68217ccb8cd1
device bootstrap revamp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xinlei 99:e369fc75c000 1 #include <stdio.h>
xinlei 105:fd3571349e5d 2 #include "Storage.h"
xinlei 101:dbcd3bc51758 3 #include "ConfigSync.h"
xinlei 101:dbcd3bc51758 4 #include "SmartRestConf.h"
xinlei 99:e369fc75c000 5 #include "logging.h"
xinlei 99:e369fc75c000 6
xinlei 101:dbcd3bc51758 7 // default connectivity checking interval [minutes].
xinlei 101:dbcd3bc51758 8 #define INTERVAL_KEY "interval"
xinlei 101:dbcd3bc51758 9 #define DEFAULT_INTERVAL "20"
xinlei 101:dbcd3bc51758 10
xinlei 111:ee9ae4a5e55c 11 static bool validateConfiguration(const Dict& d)
xinlei 99:e369fc75c000 12 {
xinlei 106:c61f0d62b625 13 const Dict::Item *p = d.get(INTERVAL_KEY);
xinlei 106:c61f0d62b625 14 if (p) {
xinlei 106:c61f0d62b625 15 int v = 0, n = 0;
xinlei 106:c61f0d62b625 16 sscanf(p->value, "%d%n", &v, &n);
xinlei 106:c61f0d62b625 17 if (v > 0 && n == strlen(p->value))
xinlei 106:c61f0d62b625 18 return true;
xinlei 106:c61f0d62b625 19 else
xinlei 106:c61f0d62b625 20 return false;
xinlei 106:c61f0d62b625 21 } else
xinlei 106:c61f0d62b625 22 return false;
xinlei 99:e369fc75c000 23 }
xinlei 99:e369fc75c000 24
xinlei 103:ede6611e064e 25 size_t ConfigSync::read(char *buf, size_t maxLen, char *status, size_t num)
xinlei 99:e369fc75c000 26 {
xinlei 106:c61f0d62b625 27 static const char *fmt = "130,%ld,\"%s\",%.*s\r\n";
xinlei 101:dbcd3bc51758 28 int l = 0;
xinlei 101:dbcd3bc51758 29 if (changed) {
xinlei 101:dbcd3bc51758 30 changed = false;
xinlei 103:ede6611e064e 31 char s[(MAX_KEY_LEN+MAX_VALUE_LEN+4)*dict.size()+1];
xinlei 101:dbcd3bc51758 32 dict.dump(s);
xinlei 101:dbcd3bc51758 33 const char *p = dict.get("interval")->value;
xinlei 101:dbcd3bc51758 34 l = snprintf(buf, maxLen, fmt, deviceID, s, MAX_VALUE_LEN, p);
xinlei 103:ede6611e064e 35 snprintf(status, num, "%s", "Sync Config");
xinlei 101:dbcd3bc51758 36 }
xinlei 101:dbcd3bc51758 37 return l;
xinlei 99:e369fc75c000 38 }
xinlei 99:e369fc75c000 39
xinlei 101:dbcd3bc51758 40 bool ConfigSync::updateConfiguration(const char *buf)
xinlei 99:e369fc75c000 41 {
xinlei 117:5de54f09f754 42 // compromise for the platform, which requires a conf report despite
xinlei 117:5de54f09f754 43 // the conf is updated or NOT. More appropriately would be setting
xinlei 117:5de54f09f754 44 // `changed=true` inside the `if` block, when the conf is actually updated.
xinlei 117:5de54f09f754 45 changed = true;
xinlei 101:dbcd3bc51758 46 bool b = cp.parse(buf);
xinlei 101:dbcd3bc51758 47 if (b && validateConfiguration(cp.dict)) {
xinlei 101:dbcd3bc51758 48 dict = cp.dict;
xinlei 101:dbcd3bc51758 49 saveConfiguration();
xinlei 103:ede6611e064e 50 return true;
xinlei 103:ede6611e064e 51 } else {
xinlei 103:ede6611e064e 52 return false;
xinlei 101:dbcd3bc51758 53 }
xinlei 101:dbcd3bc51758 54 }
xinlei 101:dbcd3bc51758 55
xinlei 101:dbcd3bc51758 56 void ConfigSync::resetConfiguration()
xinlei 101:dbcd3bc51758 57 {
xinlei 101:dbcd3bc51758 58 dict.clear();
xinlei 101:dbcd3bc51758 59 dict.set(INTERVAL_KEY, DEFAULT_INTERVAL);
xinlei 101:dbcd3bc51758 60 aDebug("Reset conf\n");
xinlei 101:dbcd3bc51758 61 changed = true;
xinlei 99:e369fc75c000 62 }
xinlei 99:e369fc75c000 63
xinlei 101:dbcd3bc51758 64 void ConfigSync::loadConfiguration()
xinlei 99:e369fc75c000 65 {
xinlei 103:ede6611e064e 66 char buf[(MAX_KEY_LEN+MAX_VALUE_LEN+4)*MAX_ITEM_SIZE+1];
xinlei 111:ee9ae4a5e55c 67 resetConfiguration();
xinlei 101:dbcd3bc51758 68 int l = loadConfigFile(buf, sizeof(buf));
xinlei 111:ee9ae4a5e55c 69 if (l > 0)
xinlei 101:dbcd3bc51758 70 updateConfiguration(buf);
xinlei 111:ee9ae4a5e55c 71 else
xinlei 111:ee9ae4a5e55c 72 saveConfiguration();
xinlei 99:e369fc75c000 73 }
xinlei 99:e369fc75c000 74
xinlei 101:dbcd3bc51758 75 void ConfigSync::saveConfiguration() const
xinlei 99:e369fc75c000 76 {
xinlei 103:ede6611e064e 77 char s[(MAX_KEY_LEN+MAX_VALUE_LEN+3)*dict.size()+1];
xinlei 101:dbcd3bc51758 78 size_t l = dict.dump(s);
xinlei 101:dbcd3bc51758 79 if (l) {
xinlei 111:ee9ae4a5e55c 80 if (!saveConfigFile(s, l))
xinlei 101:dbcd3bc51758 81 aError("Save config.\n");
xinlei 101:dbcd3bc51758 82 }
xinlei 101:dbcd3bc51758 83 }