diff options
-rw-r--r-- | fw/app/CMakeLists.txt | 7 | ||||
-rw-r--r-- | fw/app/boards/nucleo_f767zi.conf | 1 | ||||
-rw-r--r-- | fw/app/meson.build | 14 | ||||
-rw-r--r-- | fw/app/src/http.c | 16 | ||||
-rw-r--r-- | fw/app/src/index.html | 17 | ||||
l--------- | fw/app/src/simple.css | 1 | ||||
-rw-r--r-- | fw/btl/meson.build | 14 | ||||
-rw-r--r-- | fw/meson.build | 11 | ||||
-rwxr-xr-x | tools/deploy.py | 58 | ||||
-rw-r--r-- | web/index.html | 26 |
10 files changed, 147 insertions, 18 deletions
diff --git a/fw/app/CMakeLists.txt b/fw/app/CMakeLists.txt index 1a9d1cf..1a63b77 100644 --- a/fw/app/CMakeLists.txt +++ b/fw/app/CMakeLists.txt @@ -42,6 +42,13 @@ generate_inc_file_for_target( generate_inc_file_for_target( app + src/simple.css + ${ZEPHYR_BINARY_DIR}/include/generated/simple.css.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/app/boards/nucleo_f767zi.conf b/fw/app/boards/nucleo_f767zi.conf index 7f92421..ca69a03 100644 --- a/fw/app/boards/nucleo_f767zi.conf +++ b/fw/app/boards/nucleo_f767zi.conf @@ -3,6 +3,7 @@ # obtain one at https://mozilla.org/MPL/2.0/. CONFIG_IOT_CONTACT_REMOTE_UPDATE=y +CONFIG_IOT_CONTACT_NETWORK_HACK=y CONFIG_BOOTLOADER_MCUBOOT=y diff --git a/fw/app/meson.build b/fw/app/meson.build index 8d84209..ddd5aa6 100644 --- a/fw/app/meson.build +++ b/fw/app/meson.build @@ -43,3 +43,17 @@ application_signed = custom_target( install: true, install_dir: '/', ) + +flash_application = custom_target( + build_always_stale: true, + build_by_default: false, + command: [ + 'st-flash', + '--connect-under-reset', + 'write', + meson.current_build_dir() / 'application.signed.bin', + '0x8040000', + ], + depends: application_signed, + output: ['flash'], +) diff --git a/fw/app/src/http.c b/fw/app/src/http.c index e206f86..08b59c1 100644 --- a/fw/app/src/http.c +++ b/fw/app/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 css_gz[] = { + #include "simple.css.gz.inc" +}; + +struct http_resource_detail_static css_resource_detail = { + .common = { + .type = HTTP_RESOURCE_TYPE_STATIC, + .bitmask_of_supported_http_methods = BIT(HTTP_GET), + .content_encoding = "gzip", + .content_type = "text/css", + }, + .static_data = css_gz, + .static_data_len = sizeof(css_gz), +}; + static const uint8_t js_html_gz[] = { #include "iot-contact.js.gz.inc" }; @@ -95,6 +110,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(css_resource, http_service, "/simple.css", &css_resource_detail); HTTP_RESOURCE_DEFINE(js_resource, http_service, "/iot-contact.js", &js_resource_detail); int init_http_server(void) { diff --git a/fw/app/src/index.html b/fw/app/src/index.html index 5817818..d4ccd45 100644 --- a/fw/app/src/index.html +++ b/fw/app/src/index.html @@ -8,14 +8,19 @@ <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>iot-contact</title> + <title>IoT contact</title> + <link rel="stylesheet" type="text/css" href="simple.css"> <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> + <header> + <h1>IoT contact</h1> + </header> + <main> + <p class="notice"> + <label for="heartbeat">Heartbeat</label> + <meter id="heartbeat" min="0" max="1" value="0"></meter> + </p> + </main> </body> </html> diff --git a/fw/app/src/simple.css b/fw/app/src/simple.css new file mode 120000 index 0000000..5483eb1 --- /dev/null +++ b/fw/app/src/simple.css @@ -0,0 +1 @@ +../../../simple.css/simple.css
\ No newline at end of file diff --git a/fw/btl/meson.build b/fw/btl/meson.build index c22ba3c..8ca1eb3 100644 --- a/fw/btl/meson.build +++ b/fw/btl/meson.build @@ -26,3 +26,17 @@ bootloader = custom_target('bootloader', install: true, install_dir: '/', ) + +flash_bootloader = custom_target( + build_always_stale: true, + build_by_default: false, + command: [ + 'st-flash', + '--connect-under-reset', + 'write', + meson.current_build_dir() / 'bootloader.bin', + '0x8000000', + ], + depends: bootloader, + output: ['flash'], +) diff --git a/fw/meson.build b/fw/meson.build index 8194827..f61058c 100644 --- a/fw/meson.build +++ b/fw/meson.build @@ -7,3 +7,14 @@ subdir('rtos') subdir('app') subdir('btl') subdir('sim') + +erase = custom_target( + build_always_stale: true, + build_by_default: false, + command: [ + 'st-flash', + '--connect-under-reset', + 'erase', + ], + output: ['erase'], +) diff --git a/tools/deploy.py b/tools/deploy.py new file mode 100755 index 0000000..26048e8 --- /dev/null +++ b/tools/deploy.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + + +import argparse +import subprocess +import pathlib + + +SCRIPT = pathlib.Path(__file__) +SOURCE_ROOT = SCRIPT.parent.parent.resolve() +ARTIFACTS_DEFAULT = SOURCE_ROOT / "build" / "artifacts" + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Use OpenSSH and rsync to deploy artifacts", + ) + + parser.add_argument( + "-a", + "--artifacts", + default=ARTIFACTS_DEFAULT, + help="local path to artifacts folder", + ) + parser.add_argument( + "-H", "--host", default="cloud", help="target `Host` name from ~/.ssh/config" + ) + parser.add_argument( + "-p", + "--path", + default="/srv/http/deploy.xengineering.eu/public/git/iot-contact/main/", + help="remote path to destination folder on server", + ) + parser.add_argument( + "-d", + "--dry-run", + action="store_true", + help="do not execute command and instead print it", + ) + + args = parser.parse_args() + + command = [ + "rsync", + "-av", + "--delete", + f"{str(pathlib.Path(args.artifacts).resolve())}/", + f"{args.host}:{args.path}", + ] + + if args.dry_run: + print(command) + else: + subprocess.run(command, shell=False, check=True) + + +if __name__ == "__main__": + main() diff --git a/web/index.html b/web/index.html index db5ee03..1f23096 100644 --- a/web/index.html +++ b/web/index.html @@ -7,19 +7,21 @@ <title>IoT contact</title> </head> <body> - <h1>IoT contact</h1> + <main> + <h1>IoT contact</h1> - <h4>Printed circuit board</h4> - <ul> - <li><a href="schematic.pdf">schematic.pdf</a></li> - <li><a href="bill-of-materials.csv">bill-of-materials.csv</a></li> - </ul> + <h4>Printed circuit board</h4> + <ul> + <li><a href="schematic.pdf">schematic.pdf</a></li> + <li><a href="bill-of-materials.csv">bill-of-materials.csv</a></li> + </ul> - <h4>Firmware</h4> - <ul> - <li><a href="application.signed.bin">application.signed.bin</a></li> - <li><a href="bootloader.bin">bootloader.bin</a></li> - <li><a href="simulation-linux-amd64.exe">simulation-linux-amd64.exe</a></li> - </ul> + <h4>Firmware</h4> + <ul> + <li><a href="application.signed.bin">application.signed.bin</a></li> + <li><a href="bootloader.bin">bootloader.bin</a></li> + <li><a href="simulation-linux-amd64.exe">simulation-linux-amd64.exe</a></li> + </ul> + </main> </body> </html> |