summaryrefslogtreecommitdiff
path: root/fw/app
diff options
context:
space:
mode:
Diffstat (limited to 'fw/app')
-rw-r--r--fw/app/prj.conf2
-rw-r--r--fw/app/src/http.c15
-rw-r--r--fw/app/src/settings.c41
-rw-r--r--fw/app/src/settings.h21
-rw-r--r--fw/app/src/syslog.c3
5 files changed, 66 insertions, 16 deletions
diff --git a/fw/app/prj.conf b/fw/app/prj.conf
index 4981bea..6589ec0 100644
--- a/fw/app/prj.conf
+++ b/fw/app/prj.conf
@@ -57,3 +57,5 @@ CONFIG_SETTINGS_NVS=y
CONFIG_SETTINGS_SHELL=y
CONFIG_GNU_C_EXTENSIONS=y
+
+CONFIG_JSON_LIBRARY=y
diff --git a/fw/app/src/http.c b/fw/app/src/http.c
index 83a3568..1c24490 100644
--- a/fw/app/src/http.c
+++ b/fw/app/src/http.c
@@ -5,6 +5,7 @@
*/
+#include <errno.h>
#include <stdint.h>
#include <zephyr/init.h>
@@ -101,14 +102,24 @@ static int settings_handler(
) {
static char buffer[100];
- int ret = settings_to_json(buffer, sizeof(buffer));
+ int ret = settings_to_json(buffer, sizeof(buffer) - 1);
if (ret < 0) {
LOG_ERR("Could not serialize payload for settings request");
return ret;
}
+ size_t len = strnlen(buffer, sizeof(buffer));
+ if (len + 2 > sizeof(buffer)) {
+ LOG_ERR("Settings JSON requires %d octets but buffer has only %d",
+ len + 2, sizeof(buffer));
+ return -ENOMEM;
+ }
+
+ buffer[len] = '\n';
+ buffer[len + 1] = '\0';
+
response_ctx->body = (const uint8_t *)buffer;
- response_ctx->body_len = ret;
+ response_ctx->body_len = len + 1;
response_ctx->final_chunk = true;
response_ctx->status = HTTP_200_OK;
diff --git a/fw/app/src/settings.c b/fw/app/src/settings.c
index 89f2f88..4b2c248 100644
--- a/fw/app/src/settings.c
+++ b/fw/app/src/settings.c
@@ -4,9 +4,9 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
+#include <string.h>
-#include <stdio.h>
-
+#include <zephyr/data/json.h>
#include <zephyr/init.h>
#include <zephyr/logging/log.h>
#include <zephyr/settings/settings.h>
@@ -36,27 +36,42 @@ 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,};
+ settings.syslog.target.ip = (char *)settings.syslog.target.ip_array;
- 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_array,
+ sizeof(settings.syslog.target.ip_array));
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_descr,
+ ARRAY_SIZE(settings_descr),
+ &settings,
+ buffer,
+ len
+ );
if (ret < 0) {
LOG_ERR("Failed to serialize settings as JSON");
+ return ret;
}
- return ret;
+ return 0;
}
diff --git a/fw/app/src/settings.h b/fw/app/src/settings.h
index a5cf2ac..290d1ff 100644
--- a/fw/app/src/settings.h
+++ b/fw/app/src/settings.h
@@ -4,8 +4,29 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
+#ifndef SRC_SETTINGS_H
+#define SRC_SETTINGS_H
#include <stddef.h>
+#include <zephyr/data/json.h>
+
+#define IPV6_STRLEN_MAX 39 // excluding '\0'
+
+
+struct settings_syslog_target {
+ char ip_array[IPV6_STRLEN_MAX];
+ char *ip; /* Zephyr's JSON lib does not work with arrays directly */
+};
+
+struct settings_syslog {
+ struct settings_syslog_target target;
+};
+
+struct settings {
+ struct settings_syslog syslog;
+};
int settings_to_json(void *buffer, size_t data);
+
+#endif // !SRC_SETTINGS_H
diff --git a/fw/app/src/syslog.c b/fw/app/src/syslog.c
index 700547b..22aa034 100644
--- a/fw/app/src/syslog.c
+++ b/fw/app/src/syslog.c
@@ -25,11 +25,12 @@
#include <zephyr/sys/reboot.h>
#endif // CONFIG_IOT_CONTACT_NETWORK_HACK
+#include "settings.h"
+
LOG_MODULE_REGISTER(syslog);
#define NETWORK_BUG_DELAY K_MSEC(4000)
#define L4_EVENT_MASK (NET_EVENT_L4_CONNECTED | NET_EVENT_L4_DISCONNECTED)
-#define IPV6_STRLEN_MAX 39 // excluding '\0'
#define SYSLOG_TARGET_PORT 514
struct net_mgmt_event_callback l4_cb;