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
config/ConfigSync.cpp@117:5de54f09f754, 2015-05-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |