33 #ifdef SETTINGS_CONF_SKIP_CONVENIENCE_FUNCS
34 #undef SETTINGS_CONF_SKIP_CONVENIENCE_FUNCS
37 #define SETTINGS_CONF_SKIP_CONVENIENCE_FUNCS 1
43 #if CONTIKI_CONF_SETTINGS_MANAGER
46 #error CONTIKI_CONF_SETTINGS_MANAGER has been set, but EEPROM_CONF_SIZE hasnt!
49 #ifndef EEPROM_END_ADDR
50 #define EEPROM_END_ADDR (EEPROM_CONF_SIZE - 1)
53 #ifndef SETTINGS_MAX_SIZE
55 #define SETTINGS_MAX_SIZE (127)
58 #ifndef SETTINGS_TOP_ADDR
60 #define SETTINGS_TOP_ADDR (settings_iter_t)(EEPROM_END_ADDR)
63 #ifndef SETTINGS_BOTTOM_ADDR
65 #define SETTINGS_BOTTOM_ADDR (SETTINGS_TOP_ADDR + 1 - SETTINGS_MAX_SIZE)
69 #define MIN(a,b) ((a)<(b)?a:b)
73 #if SETTINGS_CONF_SUPPORT_LARGE_VALUES
89 return settings_iter_is_valid(SETTINGS_TOP_ADDR) ? SETTINGS_TOP_ADDR : 0;
102 ret = settings_iter_get_value_addr(ret);
103 return settings_iter_is_valid(ret) ? ret : 0;
110 settings_iter_is_valid(settings_iter_t iter)
112 item_header_t header = { 0 };
114 if(iter == EEPROM_NULL) {
118 if(iter < SETTINGS_BOTTOM_ADDR +
sizeof(header)) {
122 eeprom_read(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header));
124 if((uint8_t) header.size_check != (uint8_t) ~ header.size_low) {
128 if(iter < SETTINGS_BOTTOM_ADDR +
sizeof(header) + settings_iter_get_value_length(iter)) {
137 settings_iter_get_key(settings_iter_t iter)
139 item_header_t header;
141 eeprom_read(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header));
143 if((uint8_t) header.size_check != (uint8_t)~header.size_low) {
152 settings_iter_get_value_length(settings_iter_t iter)
154 item_header_t header;
156 settings_length_t ret = 0;
158 eeprom_read(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header) );
160 if((uint8_t)header.size_check == (uint8_t)~header.size_low) {
161 ret = header.size_low;
163 #if SETTINGS_CONF_SUPPORT_LARGE_VALUES
165 ret = ((ret & ~(1 << 7)) << 7) | header.size_extra;
175 settings_iter_get_value_addr(settings_iter_t iter)
177 settings_length_t len = settings_iter_get_value_length(iter);
178 #if SETTINGS_CONF_SUPPORT_LARGE_VALUES
181 return iter -
sizeof(item_header_t) - len;
186 settings_iter_get_value_bytes(settings_iter_t iter,
void *bytes,
187 settings_length_t max_length)
189 max_length = MIN(max_length, settings_iter_get_value_length(iter));
191 eeprom_read(settings_iter_get_value_addr(iter), bytes, max_length);
198 settings_iter_delete(settings_iter_t iter)
200 settings_status_t ret = SETTINGS_STATUS_FAILURE;
208 item_header_t header;
210 memset(&header, 0xFF,
sizeof(header));
212 eeprom_write(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header));
214 ret = SETTINGS_STATUS_OK;
220 ret = SETTINGS_STATUS_UNIMPLEMENTED;
235 settings_iter_t iter;
238 if(settings_iter_get_key(iter) == key) {
253 settings_get(settings_key_t key, uint8_t index, uint8_t *value,
254 settings_length_t * value_size)
256 settings_status_t ret = SETTINGS_STATUS_NOT_FOUND;
258 settings_iter_t iter;
261 if(settings_iter_get_key(iter) == key) {
264 *value_size = settings_iter_get_value_bytes(iter,
267 ret = SETTINGS_STATUS_OK;
282 settings_length_t value_size)
284 settings_status_t ret = SETTINGS_STATUS_FAILURE;
286 settings_iter_t iter;
288 item_header_t header;
298 iter = settings_iter_get_value_addr(iter);
301 iter = SETTINGS_TOP_ADDR;
304 if(iter < SETTINGS_BOTTOM_ADDR + value_size +
sizeof(header)) {
306 ret = SETTINGS_STATUS_OUT_OF_SPACE;
312 if(value_size < 0x80) {
317 header.size_low = value_size;
319 #if SETTINGS_CONF_SUPPORT_LARGE_VALUES
320 else if(value_size <= SETTINGS_MAX_VALUE_SIZE) {
328 header.size_low = (value_size >> 7) | 0x80;
329 header.size_extra = value_size & ~0x80;
334 ret = SETTINGS_STATUS_VALUE_TOO_BIG;
338 header.size_check = ~header.size_low;
341 eeprom_write(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header));
344 if(settings_iter_get_value_length(iter) != value_size) {
349 eeprom_write(settings_iter_get_value_addr(iter), (uint8_t *)value, value_size);
355 memset(&header, 0xFF,
sizeof(header));
357 eeprom_write(iter -
sizeof(header),(uint8_t *)&header,
sizeof(header));
360 ret = SETTINGS_STATUS_OK;
369 settings_length_t value_size)
371 settings_status_t ret = SETTINGS_STATUS_FAILURE;
373 settings_iter_t iter;
376 if(settings_iter_get_key(iter) == key) {
381 if((iter == EEPROM_NULL) || !settings_iter_is_valid(iter)) {
386 if(value_size != settings_iter_get_value_length(iter)) {
388 ret = SETTINGS_STATUS_UNIMPLEMENTED;
394 (uint8_t *)value, value_size);
396 ret = SETTINGS_STATUS_OK;
406 settings_status_t ret = SETTINGS_STATUS_NOT_FOUND;
408 settings_iter_t iter;
411 if(settings_iter_get_key(iter) == key) {
414 ret = settings_iter_delete(iter);
433 const uint32_t x = 0xFFFFFF;
435 eeprom_write(SETTINGS_TOP_ADDR -
sizeof(x), (uint8_t *)&x,
sizeof(x));
446 settings_debug_dump(
void)
448 settings_iter_t iter;
452 settings_length_t len = settings_iter_get_value_length(iter);
453 eeprom_addr_t addr = settings_iter_get_value_addr(iter);
461 u.key = settings_iter_get_key(iter);
463 printf(
"\t\"%c%c\" = <", u.bytes[0], u.bytes[1]);
465 for(; len; len--, addr++) {
467 printf(
"%02X", byte);
void eeprom_read(eeprom_addr_t addr, unsigned char *buf, int size)
Read data from the EEPROM.
settings_status_t settings_get(settings_key_t key, uint8_t index, uint8_t *value, settings_length_t *value_size)
Fetches the value associated with the given key.
settings_status_t settings_delete(settings_key_t key, uint8_t index)
Removes the given key (at the given index) from the settings store.
settings_status_t settings_set(settings_key_t key, const uint8_t *value, settings_length_t value_size)
Sets the value for the given key.
uint8_t settings_check(settings_key_t key, uint8_t index)
Checks to see if the given key exists.
#define SETTINGS_INVALID_ITER
Returned if no (further) element was found.
void eeprom_write(eeprom_addr_t addr, unsigned char *buf, int size)
Write a buffer into EEPROM.
settings_iter_t settings_iter_next(settings_iter_t iter)
Will return SETTINGS_INVALID_ITER if at the end of settings list.
void settings_wipe(void)
Reinitializes all of the EEPROM used by settings.
#define SETTINGS_INVALID_KEY
Returned when key is invalid.
settings_status_t settings_add(settings_key_t key, const uint8_t *value, settings_length_t value_size)
Adds the given key-value pair to the end of the settings store.
settings_iter_t settings_iter_begin()
Will return SETTINGS_INVALID_ITER if the settings store is empty.