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:
68:0dc778a16d0d
LCDDisplay now is singleton

Who changed what in which revision?

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