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 #if SETTINGS_CONF_SUPPORT_LARGE_VALUES
85 return settings_iter_is_valid(SETTINGS_TOP_ADDR) ? SETTINGS_TOP_ADDR : 0;
98 ret = settings_iter_get_value_addr(ret);
99 return settings_iter_is_valid(ret) ? ret : 0;
106 settings_iter_is_valid(settings_iter_t iter)
108 item_header_t header = { 0 };
110 if(iter == EEPROM_NULL) {
114 if(iter < SETTINGS_BOTTOM_ADDR +
sizeof(header)) {
118 eeprom_read(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header));
120 if((uint8_t) header.size_check != (uint8_t) ~ header.size_low) {
124 if(iter < SETTINGS_BOTTOM_ADDR +
sizeof(header) + settings_iter_get_value_length(iter)) {
133 settings_iter_get_key(settings_iter_t iter)
135 item_header_t header;
137 eeprom_read(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header));
139 if((uint8_t) header.size_check != (uint8_t)~header.size_low) {
148 settings_iter_get_value_length(settings_iter_t iter)
150 item_header_t header;
152 settings_length_t ret = 0;
154 eeprom_read(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header) );
156 if((uint8_t)header.size_check == (uint8_t)~header.size_low) {
157 ret = header.size_low;
159 #if SETTINGS_CONF_SUPPORT_LARGE_VALUES
161 ret = ((ret & ~(1 << 7)) << 7) | header.size_extra;
171 settings_iter_get_value_addr(settings_iter_t iter)
173 settings_length_t len = settings_iter_get_value_length(iter);
174 #if SETTINGS_CONF_SUPPORT_LARGE_VALUES
177 return iter -
sizeof(item_header_t) - len;
182 settings_iter_get_value_bytes(settings_iter_t iter,
void *bytes,
183 settings_length_t max_length)
185 max_length = MIN(max_length, settings_iter_get_value_length(iter));
187 eeprom_read(settings_iter_get_value_addr(iter), bytes, max_length);
194 settings_iter_delete(settings_iter_t iter)
196 settings_status_t ret = SETTINGS_STATUS_FAILURE;
204 item_header_t header;
206 memset(&header, 0xFF,
sizeof(header));
208 eeprom_write(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header));
210 ret = SETTINGS_STATUS_OK;
216 ret = SETTINGS_STATUS_UNIMPLEMENTED;
231 settings_iter_t iter;
234 if(settings_iter_get_key(iter) == key) {
249 settings_get(settings_key_t key, uint8_t index, uint8_t *value,
250 settings_length_t * value_size)
252 settings_status_t ret = SETTINGS_STATUS_NOT_FOUND;
254 settings_iter_t iter;
257 if(settings_iter_get_key(iter) == key) {
260 *value_size = settings_iter_get_value_bytes(iter,
263 ret = SETTINGS_STATUS_OK;
278 settings_length_t value_size)
280 settings_status_t ret = SETTINGS_STATUS_FAILURE;
282 settings_iter_t iter;
284 item_header_t header;
294 iter = settings_iter_get_value_addr(iter);
297 iter = SETTINGS_TOP_ADDR;
300 if(iter < SETTINGS_BOTTOM_ADDR + value_size +
sizeof(header)) {
302 ret = SETTINGS_STATUS_OUT_OF_SPACE;
308 if(value_size < 0x80) {
313 header.size_low = value_size;
315 #if SETTINGS_CONF_SUPPORT_LARGE_VALUES
316 else if(value_size <= SETTINGS_MAX_VALUE_SIZE) {
324 header.size_low = (value_size >> 7) | 0x80;
325 header.size_extra = value_size & ~0x80;
330 ret = SETTINGS_STATUS_VALUE_TOO_BIG;
334 header.size_check = ~header.size_low;
337 eeprom_write(iter -
sizeof(header), (uint8_t *)&header,
sizeof(header));
340 if(settings_iter_get_value_length(iter) != value_size) {
345 eeprom_write(settings_iter_get_value_addr(iter), (uint8_t *)value, value_size);
351 memset(&header, 0xFF,
sizeof(header));
353 eeprom_write(iter -
sizeof(header),(uint8_t *)&header,
sizeof(header));
356 ret = SETTINGS_STATUS_OK;
365 settings_length_t value_size)
367 settings_status_t ret = SETTINGS_STATUS_FAILURE;
369 settings_iter_t iter;
372 if(settings_iter_get_key(iter) == key) {
377 if((iter == EEPROM_NULL) || !settings_iter_is_valid(iter)) {
382 if(value_size != settings_iter_get_value_length(iter)) {
384 ret = SETTINGS_STATUS_UNIMPLEMENTED;
390 (uint8_t *)value, value_size);
392 ret = SETTINGS_STATUS_OK;
402 settings_status_t ret = SETTINGS_STATUS_NOT_FOUND;
404 settings_iter_t iter;
407 if(settings_iter_get_key(iter) == key) {
410 ret = settings_iter_delete(iter);
429 const uint32_t x = 0xFFFFFF;
431 eeprom_write(SETTINGS_TOP_ADDR -
sizeof(x), (uint8_t *)&x,
sizeof(x));
442 settings_debug_dump(
void)
444 settings_iter_t iter;
448 settings_length_t len = settings_iter_get_value_length(iter);
449 eeprom_addr_t
addr = settings_iter_get_value_addr(iter);
457 u.key = settings_iter_get_key(iter);
459 printf(
"\t\"%c%c\" = <", u.bytes[0], u.bytes[1]);
461 for(; len; len--, addr++) {
463 printf(
"%02X", byte);
#define SETTINGS_INVALID_KEY
Returned when key is invalid.
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_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.
static uip_ds6_addr_t * addr
Pointer to a router list entry.
void eeprom_read(eeprom_addr_t addr, unsigned char *buf, int size)
Read data from the EEPROM.
settings_iter_t settings_iter_begin(void)
Will return SETTINGS_INVALID_ITER if the settings store is empty.
settings_iter_t settings_iter_next(settings_iter_t iter)
Will return SETTINGS_INVALID_ITER if at the end of settings list.
settings_status_t settings_delete(settings_key_t key, uint8_t index)
Removes the given key (at the given index) from the settings store.
void settings_wipe(void)
Reinitializes all of the EEPROM used by settings.
void eeprom_write(eeprom_addr_t addr, unsigned char *buf, int size)
Write a buffer into EEPROM.
uint8_t settings_check(settings_key_t key, uint8_t index)
Checks to see if the given key exists.
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.
#define SETTINGS_INVALID_ITER
Returned if no (further) element was found.