diff options
-rw-r--r-- | fw/CMakeLists.txt | 7 | ||||
-rw-r--r-- | fw/src/http.c | 16 | ||||
-rw-r--r-- | fw/src/index.html | 5 | ||||
-rw-r--r-- | fw/src/iot-contact.js | 48 |
4 files changed, 76 insertions, 0 deletions
diff --git a/fw/CMakeLists.txt b/fw/CMakeLists.txt index 5aaf319..5a8d6c4 100644 --- a/fw/CMakeLists.txt +++ b/fw/CMakeLists.txt @@ -39,3 +39,10 @@ generate_inc_file_for_target( ${ZEPHYR_BINARY_DIR}/include/generated/index.html.gz.inc --gzip ) + +generate_inc_file_for_target( + app + src/iot-contact.js + ${ZEPHYR_BINARY_DIR}/include/generated/iot-contact.js.gz.inc + --gzip +) diff --git a/fw/src/http.c b/fw/src/http.c index b9a76ba..e206f86 100644 --- a/fw/src/http.c +++ b/fw/src/http.c @@ -34,6 +34,21 @@ struct http_resource_detail_static index_resource_detail = { .static_data_len = sizeof(index_html_gz), }; +static const uint8_t js_html_gz[] = { + #include "iot-contact.js.gz.inc" +}; + +struct http_resource_detail_static js_resource_detail = { + .common = { + .type = HTTP_RESOURCE_TYPE_STATIC, + .bitmask_of_supported_http_methods = BIT(HTTP_GET), + .content_encoding = "gzip", + .content_type = "text/javascript", + }, + .static_data = js_html_gz, + .static_data_len = sizeof(js_html_gz), +}; + static int favicon_handler( struct http_client_ctx *client, enum http_data_status status, @@ -80,6 +95,7 @@ HTTP_SERVICE_DEFINE(http_service, NULL, &http_port, 1, 10, NULL, NULL); HTTP_RESOURCE_DEFINE(index_resource, http_service, "/", &index_resource_detail); HTTP_RESOURCE_DEFINE(websocket_resource, http_service, "/", &websocket_resource_detail); HTTP_RESOURCE_DEFINE(favicon_resource, http_service, "/favicon.ico", &favicon_resource_detail); +HTTP_RESOURCE_DEFINE(js_resource, http_service, "/iot-contact.js", &js_resource_detail); int init_http_server(void) { LOG_DBG("Starting HTTP server"); diff --git a/fw/src/index.html b/fw/src/index.html index 142a1b9..5817818 100644 --- a/fw/src/index.html +++ b/fw/src/index.html @@ -9,8 +9,13 @@ <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>iot-contact</title> + <script type="text/javascript" src="/iot-contact.js"></script> </head> <body> <h4>iot-contact</h4> + <p> + <label for="heartbeat">Heartbeat</label> + <meter id="heartbeat" min="0" max="1" value="0"></meter> + </p> </body> </html> diff --git a/fw/src/iot-contact.js b/fw/src/iot-contact.js new file mode 100644 index 0000000..e8e966f --- /dev/null +++ b/fw/src/iot-contact.js @@ -0,0 +1,48 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public License, + * v. 2.0. If a copy of the MPL was not distributed with this file, You can + * obtain one at https://mozilla.org/MPL/2.0/. + */ + +function blinkHeartbeat() { + const heartbeat = document.getElementById("heartbeat"); + heartbeat.value = 1; + setTimeout(() => heartbeat.value = 0, 300); +} + +window.addEventListener("DOMContentLoaded", (ev) => { + const ws = new WebSocket("/"); + console.log("WebSocket object created"); + + ws.onopen = (event) => { + console.log("WebSocket connection opened"); + }; + + ws.onmessage = (event) => { + try { + const data = JSON.parse(event.data); + console.log("Message received: ", data); + if (data.type === 0 && data.ttl_ms) { + blinkHeartbeat(); + } + } catch (error) { + console.error("Invalid message received:", event.data); + } + }; + + ws.onclose = (event) => { + console.log("WebSocket connection closed"); + }; + + ws.onerror = (event) => { + console.log("WebSocket error: ", event); + }; + + setInterval(() => { + if (ws.readyState === WebSocket.OPEN) { + const data = "{\"type\":0,\"ttl_ms\":1100}\n"; + ws.send(data); + console.log("Heartbeat sent: '", data, "'"); + } + }, 1000); +}) |