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/DeviceConfiguration.cpp@96:5dfdc8568e9f, 2015-04-27 (annotated)
- Committer:
- xinlei
- Date:
- Mon Apr 27 10:50:21 2015 +0000
- Revision:
- 96:5dfdc8568e9f
- Parent:
- 68:0dc778a16d0d
LCDDisplay now is singleton
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vwochnik | 68:0dc778a16d0d | 1 | #include <stdlib.h> |
vwochnik | 68:0dc778a16d0d | 2 | #include <stdio.h> |
vwochnik | 68:0dc778a16d0d | 3 | #include <string.h> |
xinlei | 96:5dfdc8568e9f | 4 | #include "DeviceConfiguration.h" |
vwochnik | 68:0dc778a16d0d | 5 | |
vwochnik | 68:0dc778a16d0d | 6 | DeviceConfiguration::DeviceConfiguration() |
vwochnik | 68:0dc778a16d0d | 7 | { |
xinlei | 96:5dfdc8568e9f | 8 | for (size_t i = 0; i < DEVICE_CONFIGURATION_SIZE; ++i) { |
vwochnik | 68:0dc778a16d0d | 9 | _items[i].key = NULL; |
vwochnik | 68:0dc778a16d0d | 10 | _items[i].value = NULL; |
vwochnik | 68:0dc778a16d0d | 11 | } |
vwochnik | 68:0dc778a16d0d | 12 | } |
vwochnik | 68:0dc778a16d0d | 13 | |
vwochnik | 68:0dc778a16d0d | 14 | DeviceConfiguration::~DeviceConfiguration() |
vwochnik | 68:0dc778a16d0d | 15 | { |
vwochnik | 68:0dc778a16d0d | 16 | clear(); |
vwochnik | 68:0dc778a16d0d | 17 | } |
vwochnik | 68:0dc778a16d0d | 18 | |
vwochnik | 68:0dc778a16d0d | 19 | bool DeviceConfiguration::read(const char *str) |
vwochnik | 68:0dc778a16d0d | 20 | { |
xinlei | 96:5dfdc8568e9f | 21 | DeviceConfiguration::KeyValue items[DEVICE_CONFIGURATION_SIZE]; |
xinlei | 96:5dfdc8568e9f | 22 | size_t i; |
vwochnik | 68:0dc778a16d0d | 23 | for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { |
vwochnik | 68:0dc778a16d0d | 24 | items[i].key = NULL; |
vwochnik | 68:0dc778a16d0d | 25 | items[i].value = NULL; |
vwochnik | 68:0dc778a16d0d | 26 | } |
vwochnik | 68:0dc778a16d0d | 27 | |
xinlei | 96:5dfdc8568e9f | 28 | const char *ptr = str; |
xinlei | 96:5dfdc8568e9f | 29 | const char *ptr2, *ptr3; |
xinlei | 96:5dfdc8568e9f | 30 | int len1, len2; |
vwochnik | 68:0dc778a16d0d | 31 | i = 0; |
xinlei | 96:5dfdc8568e9f | 32 | while (*ptr && i<DEVICE_CONFIGURATION_SIZE) { |
vwochnik | 68:0dc778a16d0d | 33 | if (((ptr2 = strchr(ptr, '=')) == NULL) || |
vwochnik | 68:0dc778a16d0d | 34 | ((ptr3 = strchr(ptr2+1, ';')) == NULL)) |
vwochnik | 68:0dc778a16d0d | 35 | goto failure; |
vwochnik | 68:0dc778a16d0d | 36 | |
vwochnik | 68:0dc778a16d0d | 37 | len1 = ptr2-ptr; |
vwochnik | 68:0dc778a16d0d | 38 | len2 = ptr3-ptr2 - 1; |
vwochnik | 68:0dc778a16d0d | 39 | |
vwochnik | 68:0dc778a16d0d | 40 | if ((memchr(ptr, ';', len1) != NULL) || |
vwochnik | 68:0dc778a16d0d | 41 | (memchr(ptr2+1, '=', len2) != NULL)) |
vwochnik | 68:0dc778a16d0d | 42 | goto failure; |
vwochnik | 68:0dc778a16d0d | 43 | |
xinlei | 96:5dfdc8568e9f | 44 | for (size_t j = 0; j < DEVICE_CONFIGURATION_SIZE; j++) { |
vwochnik | 68:0dc778a16d0d | 45 | if ((items[j].key != NULL) && (strlen(items[j].key) == len1) && (strncmp(items[j].key, ptr, len1) == 0)) |
vwochnik | 68:0dc778a16d0d | 46 | goto failure; |
vwochnik | 68:0dc778a16d0d | 47 | } |
vwochnik | 68:0dc778a16d0d | 48 | |
vwochnik | 68:0dc778a16d0d | 49 | if ((items[i].key = (char*)malloc(len1+1)) == NULL) |
vwochnik | 68:0dc778a16d0d | 50 | goto failure; |
vwochnik | 68:0dc778a16d0d | 51 | if ((items[i].value = (char*)malloc(len2+1)) == NULL) { |
vwochnik | 68:0dc778a16d0d | 52 | free(items[i].key); |
vwochnik | 68:0dc778a16d0d | 53 | items[i].key = NULL; |
vwochnik | 68:0dc778a16d0d | 54 | goto failure; |
vwochnik | 68:0dc778a16d0d | 55 | } |
vwochnik | 68:0dc778a16d0d | 56 | |
vwochnik | 68:0dc778a16d0d | 57 | strncpy(items[i].key, ptr, len1); |
vwochnik | 68:0dc778a16d0d | 58 | strncpy(items[i].value, ptr2+1, len2); |
vwochnik | 68:0dc778a16d0d | 59 | items[i].key[len1] = '\0'; |
vwochnik | 68:0dc778a16d0d | 60 | items[i].value[len2] = '\0'; |
vwochnik | 68:0dc778a16d0d | 61 | |
vwochnik | 68:0dc778a16d0d | 62 | i++; |
vwochnik | 68:0dc778a16d0d | 63 | ptr = ptr3+1; |
vwochnik | 68:0dc778a16d0d | 64 | } |
vwochnik | 68:0dc778a16d0d | 65 | |
vwochnik | 68:0dc778a16d0d | 66 | if (*ptr != '\0') |
vwochnik | 68:0dc778a16d0d | 67 | goto failure; |
vwochnik | 68:0dc778a16d0d | 68 | |
vwochnik | 68:0dc778a16d0d | 69 | clear(); |
vwochnik | 68:0dc778a16d0d | 70 | memcpy(_items, items, sizeof(DeviceConfiguration::KeyValue)*DEVICE_CONFIGURATION_SIZE); |
vwochnik | 68:0dc778a16d0d | 71 | return true; |
vwochnik | 68:0dc778a16d0d | 72 | |
vwochnik | 68:0dc778a16d0d | 73 | failure: |
vwochnik | 68:0dc778a16d0d | 74 | for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { |
vwochnik | 68:0dc778a16d0d | 75 | if (items[i].key != NULL) { |
vwochnik | 68:0dc778a16d0d | 76 | free(items[i].key); |
vwochnik | 68:0dc778a16d0d | 77 | free(items[i].value); |
vwochnik | 68:0dc778a16d0d | 78 | } |
vwochnik | 68:0dc778a16d0d | 79 | } |
vwochnik | 68:0dc778a16d0d | 80 | return false; |
vwochnik | 68:0dc778a16d0d | 81 | } |
vwochnik | 68:0dc778a16d0d | 82 | |
vwochnik | 68:0dc778a16d0d | 83 | bool DeviceConfiguration::write(char *buf, size_t len) |
vwochnik | 68:0dc778a16d0d | 84 | { |
xinlei | 96:5dfdc8568e9f | 85 | char *ptr= buf; |
xinlei | 96:5dfdc8568e9f | 86 | int ln; |
vwochnik | 68:0dc778a16d0d | 87 | |
xinlei | 96:5dfdc8568e9f | 88 | for (size_t i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { |
xinlei | 96:5dfdc8568e9f | 89 | if (_items[i].key) { |
xinlei | 96:5dfdc8568e9f | 90 | snprintf(ptr, len, "%s=%s;%n", _items[i].key, _items[i].value, &ln); |
xinlei | 96:5dfdc8568e9f | 91 | ptr += ln; |
xinlei | 96:5dfdc8568e9f | 92 | len -= ln; |
xinlei | 96:5dfdc8568e9f | 93 | } |
vwochnik | 68:0dc778a16d0d | 94 | } |
vwochnik | 68:0dc778a16d0d | 95 | return true; |
vwochnik | 68:0dc778a16d0d | 96 | } |
vwochnik | 68:0dc778a16d0d | 97 | |
vwochnik | 68:0dc778a16d0d | 98 | bool DeviceConfiguration::set(const char *key, const char *value) |
vwochnik | 68:0dc778a16d0d | 99 | { |
xinlei | 96:5dfdc8568e9f | 100 | KeyValue *item = search(key); |
vwochnik | 68:0dc778a16d0d | 101 | |
xinlei | 96:5dfdc8568e9f | 102 | if (item == NULL) { |
xinlei | 96:5dfdc8568e9f | 103 | for (size_t i = 0; (i < DEVICE_CONFIGURATION_SIZE) && (item == NULL); i++) { |
vwochnik | 68:0dc778a16d0d | 104 | if (_items[i].key == NULL) |
vwochnik | 68:0dc778a16d0d | 105 | item = &_items[i]; |
vwochnik | 68:0dc778a16d0d | 106 | } |
vwochnik | 68:0dc778a16d0d | 107 | } |
vwochnik | 68:0dc778a16d0d | 108 | |
vwochnik | 68:0dc778a16d0d | 109 | if (item == NULL) |
vwochnik | 68:0dc778a16d0d | 110 | return false; |
vwochnik | 68:0dc778a16d0d | 111 | |
vwochnik | 68:0dc778a16d0d | 112 | if ((item->key = (char*)malloc(strlen(key)+1)) == NULL) |
vwochnik | 68:0dc778a16d0d | 113 | return false; |
vwochnik | 68:0dc778a16d0d | 114 | if ((item->value = (char*)malloc(strlen(value)+1)) == NULL) { |
vwochnik | 68:0dc778a16d0d | 115 | free(item->key); |
vwochnik | 68:0dc778a16d0d | 116 | item->key = NULL; |
vwochnik | 68:0dc778a16d0d | 117 | return false; |
vwochnik | 68:0dc778a16d0d | 118 | } |
vwochnik | 68:0dc778a16d0d | 119 | |
vwochnik | 68:0dc778a16d0d | 120 | strcpy(item->key, key); |
vwochnik | 68:0dc778a16d0d | 121 | strcpy(item->value, value); |
vwochnik | 68:0dc778a16d0d | 122 | return true; |
vwochnik | 68:0dc778a16d0d | 123 | } |
vwochnik | 68:0dc778a16d0d | 124 | |
vwochnik | 68:0dc778a16d0d | 125 | const char * DeviceConfiguration::get(const char *key) |
vwochnik | 68:0dc778a16d0d | 126 | { |
xinlei | 96:5dfdc8568e9f | 127 | KeyValue *item = search(key); |
vwochnik | 68:0dc778a16d0d | 128 | |
xinlei | 96:5dfdc8568e9f | 129 | if (item) |
xinlei | 96:5dfdc8568e9f | 130 | return item->value; |
xinlei | 96:5dfdc8568e9f | 131 | else |
vwochnik | 68:0dc778a16d0d | 132 | return NULL; |
vwochnik | 68:0dc778a16d0d | 133 | } |
vwochnik | 68:0dc778a16d0d | 134 | |
vwochnik | 68:0dc778a16d0d | 135 | bool DeviceConfiguration::unset(const char *key) |
vwochnik | 68:0dc778a16d0d | 136 | { |
xinlei | 96:5dfdc8568e9f | 137 | KeyValue *item = search(key); |
vwochnik | 68:0dc778a16d0d | 138 | |
xinlei | 96:5dfdc8568e9f | 139 | if (item) { |
xinlei | 96:5dfdc8568e9f | 140 | free(item->key); |
xinlei | 96:5dfdc8568e9f | 141 | free(item->value); |
xinlei | 96:5dfdc8568e9f | 142 | item->key = NULL; |
xinlei | 96:5dfdc8568e9f | 143 | item->value = NULL; |
xinlei | 96:5dfdc8568e9f | 144 | return true; |
xinlei | 96:5dfdc8568e9f | 145 | } else |
xinlei | 96:5dfdc8568e9f | 146 | return false; |
vwochnik | 68:0dc778a16d0d | 147 | } |
vwochnik | 68:0dc778a16d0d | 148 | |
vwochnik | 68:0dc778a16d0d | 149 | bool DeviceConfiguration::has(const char *key) |
vwochnik | 68:0dc778a16d0d | 150 | { |
vwochnik | 68:0dc778a16d0d | 151 | return (search(key) != NULL); |
vwochnik | 68:0dc778a16d0d | 152 | } |
vwochnik | 68:0dc778a16d0d | 153 | |
vwochnik | 68:0dc778a16d0d | 154 | void DeviceConfiguration::clear() |
vwochnik | 68:0dc778a16d0d | 155 | { |
xinlei | 96:5dfdc8568e9f | 156 | for (size_t i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { |
xinlei | 96:5dfdc8568e9f | 157 | if (_items[i].key) { |
vwochnik | 68:0dc778a16d0d | 158 | free(_items[i].key); |
vwochnik | 68:0dc778a16d0d | 159 | free(_items[i].value); |
vwochnik | 68:0dc778a16d0d | 160 | } |
vwochnik | 68:0dc778a16d0d | 161 | } |
vwochnik | 68:0dc778a16d0d | 162 | } |
vwochnik | 68:0dc778a16d0d | 163 | |
vwochnik | 68:0dc778a16d0d | 164 | DeviceConfiguration::KeyValue * DeviceConfiguration::search(const char *key) |
vwochnik | 68:0dc778a16d0d | 165 | { |
xinlei | 96:5dfdc8568e9f | 166 | for (size_t i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { |
vwochnik | 68:0dc778a16d0d | 167 | if (strcmp(key, _items[i].key) == 0) |
vwochnik | 68:0dc778a16d0d | 168 | return &_items[i]; |
xinlei | 96:5dfdc8568e9f | 169 | } |
vwochnik | 68:0dc778a16d0d | 170 | return NULL; |
vwochnik | 68:0dc778a16d0d | 171 | } |