diff options
Diffstat (limited to 'fw/app/src/http.c')
-rw-r--r-- | fw/app/src/http.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/fw/app/src/http.c b/fw/app/src/http.c index 08b59c1..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> @@ -13,6 +14,7 @@ #include <zephyr/net/http/service.h> #include <zephyr/net/http/status.h> +#include "settings.h" #include "ws.h" @@ -91,6 +93,48 @@ static struct http_resource_detail_dynamic favicon_resource_detail = { .user_data = NULL, }; +static int settings_handler( + struct http_client_ctx *client, + enum http_data_status status, + const struct http_request_ctx *request_ctx, + struct http_response_ctx *response_ctx, + void *user_data +) { + static char buffer[100]; + + 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 = len + 1; + response_ctx->final_chunk = true; + response_ctx->status = HTTP_200_OK; + + return 0; +} + +static struct http_resource_detail_dynamic settings_resource_detail = { + .common = { + .type = HTTP_RESOURCE_TYPE_DYNAMIC, + .bitmask_of_supported_http_methods = BIT(HTTP_GET), + }, + .cb = settings_handler, + .user_data = NULL, +}; + static uint8_t websocket_read_buffer[1024]; struct http_resource_detail_websocket websocket_resource_detail = { @@ -112,6 +156,7 @@ HTTP_RESOURCE_DEFINE(websocket_resource, http_service, "/", &websocket_resource_ HTTP_RESOURCE_DEFINE(favicon_resource, http_service, "/favicon.ico", &favicon_resource_detail); HTTP_RESOURCE_DEFINE(css_resource, http_service, "/simple.css", &css_resource_detail); HTTP_RESOURCE_DEFINE(js_resource, http_service, "/iot-contact.js", &js_resource_detail); +HTTP_RESOURCE_DEFINE(settings_resource, http_service, "/settings.json", &settings_resource_detail); int init_http_server(void) { LOG_DBG("Starting HTTP server"); |