diff options
author | xengineering <me@xengineering.eu> | 2025-04-16 21:58:20 +0200 |
---|---|---|
committer | xengineering <me@xengineering.eu> | 2025-04-16 21:58:20 +0200 |
commit | 04b2fd43f67cd191e5b38c93ec6f20b06b7946e1 (patch) | |
tree | 986a3bef59a2aefbc5d5314c96691b8117ccac1c /fw/app/src/settings.c | |
parent | f4faa103108356bcf53fb7c8829e95f012b21a4a (diff) | |
download | iot-contact-04b2fd43f67cd191e5b38c93ec6f20b06b7946e1.tar iot-contact-04b2fd43f67cd191e5b38c93ec6f20b06b7946e1.tar.zst iot-contact-04b2fd43f67cd191e5b38c93ec6f20b06b7946e1.zip |
WIP: fw: app: Encode settings with JSON lib
TODO: SEGFAULT in json_escape_internal (grrrrr)
Diffstat (limited to 'fw/app/src/settings.c')
-rw-r--r-- | fw/app/src/settings.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/fw/app/src/settings.c b/fw/app/src/settings.c index 89f2f88..72cea12 100644 --- a/fw/app/src/settings.c +++ b/fw/app/src/settings.c @@ -5,8 +5,7 @@ */ -#include <stdio.h> - +#include <zephyr/data/json.h> #include <zephyr/init.h> #include <zephyr/logging/log.h> #include <zephyr/settings/settings.h> @@ -36,27 +35,41 @@ int init_settings(void) { } SYS_INIT(init_settings, APPLICATION, 50); +static const struct json_obj_descr settings_syslog_target_descr[] = { + JSON_OBJ_DESCR_PRIM(struct settings_syslog_target, ip, JSON_TOK_STRING), +}; + +static const struct json_obj_descr settings_syslog_descr[] = { + JSON_OBJ_DESCR_OBJECT(struct settings_syslog, target, settings_syslog_target_descr), +}; + +static const struct json_obj_descr settings_descr[] = { + JSON_OBJ_DESCR_OBJECT(struct settings, syslog, settings_syslog_descr), +}; + int settings_to_json(void *buffer, size_t len) { - static const char format[] = "{\"syslog\":{\"target\":{\"ip\":\"%s\"}}}\n"; + struct settings settings = {0,}; - char ip[100]; - int ret = settings_runtime_get("syslog/target/ip", ip, sizeof(ip)); + int ret = settings_runtime_get("syslog/target/ip", + settings.syslog.target.ip, + sizeof(settings.syslog.target.ip)); if (ret < 0) { LOG_ERR("Failed to get runtime setting syslog/target/ip (%d)", ret); return ret; } - ret = snprintf(buffer, len, format, ip); - - if (ret >= len) { - LOG_ERR("Buffer too small to serialize settings as JSON"); - return -ENOMEM; - } - + ret = json_obj_encode_buf( + settings_syslog_target_descr, + ARRAY_SIZE(settings_syslog_target_descr), + &(settings.syslog.target), + buffer, + len + ); if (ret < 0) { LOG_ERR("Failed to serialize settings as JSON"); + return ret; } - return ret; + return 0; } |