From 6769ffeb207ac9742d9aa42769b0140b144aeef7 Mon Sep 17 00:00:00 2001 From: Rune Harlyk Date: Tue, 8 Jul 2025 21:47:06 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Moving=20project=20to=20use=20ev?= =?UTF-8?q?ent=20bus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/package.json | 4 +- app/pnpm-lock.yaml | 123 ++++++--- app/src/lib/stores/socket.ts | 246 +++++++++--------- esp32/.gitignore | 2 +- esp32/include/adapters/bluetooth.hpp | 21 +- esp32/include/adapters/comm_base.hpp | 15 ++ esp32/include/adapters/websocket.hpp | 42 +++ .../ESP32-sveltekit => include}/ap_service.h | 0 esp32/include/event_bus.hpp | 4 +- .../ESP32-sveltekit => include}/features.h | 0 .../ESP32-sveltekit => include}/filesystem.h | 0 .../firmware_download_service.h | 2 +- .../firmware_upload_service.h | 2 +- .../gait/bezier_state.h | 0 .../gait/crawl_state.h | 0 .../gait/four_phase_trot_state.h | 0 .../gait/idle_state.h | 0 .../gait/phase_state_base.h | 0 .../gait/rest_state.h | 0 .../gait/stand_state.h | 0 .../ESP32-sveltekit => include}/gait/state.h | 0 .../{lib/ESP32-sveltekit => include}/global.h | 0 .../ESP32-sveltekit => include}/kinematics.h | 0 .../mdns_service.h | 0 .../{lib/ESP32-sveltekit => include}/motion.h | 112 ++++---- .../peripherals/barometer.h | 0 .../peripherals/camera_pins.h | 0 .../peripherals/camera_service.h | 0 .../peripherals/imu.h | 0 .../peripherals/led_service.h | 0 .../peripherals/magnetometer.h | 0 .../peripherals/peripherals.h | 22 +- .../peripherals/servo_controller.h | 18 +- .../settings/ap_settings.h | 0 .../settings/camera_settings.h | 0 .../settings/mdns_settings.h | 0 .../settings/ntp_settings.h | 0 .../settings/peripherals_settings.h | 0 .../settings/servo_settings.h | 0 .../settings/wifi_settings.h | 0 esp32/include/spot.h | 6 +- .../system_service.h | 2 +- .../task_manager.h | 0 .../template/state_result.h | 0 .../template/stateful_endpoint.h | 0 .../template/stateful_persistence.h | 0 .../template/stateful_service.h | 0 .../template/stateful_socket.h | 12 +- .../utils/ip_utils.h | 0 .../utils/json_utils.h | 0 .../utils/math_utils.h | 0 .../utils/string_utils.h | 0 .../utils/timing.h | 0 .../wifi_service.h | 0 esp32/lib/ESP32-sveltekit/event_socket.cpp | 178 ------------- esp32/lib/ESP32-sveltekit/event_socket.h | 47 ---- esp32/scripts/build_app.py | 2 +- esp32/src/adapters/bluetooth.cpp | 10 +- esp32/src/adapters/websocket.cpp | 101 +++++++ .../ESP32-sveltekit => src}/ap_service.cpp | 0 .../{lib/ESP32-sveltekit => src}/features.cpp | 0 .../ESP32-sveltekit => src}/filesystem.cpp | 0 .../firmware_download_service.cpp | 12 +- .../firmware_upload_service.cpp | 6 +- .../ESP32-sveltekit => src}/mdns_service.cpp | 0 .../peripherals/camera_service.cpp | 0 .../system_service.cpp | 4 +- .../ESP32-sveltekit => src}/task_manager.cpp | 0 .../ESP32-sveltekit => src}/wifi_service.cpp | 0 69 files changed, 497 insertions(+), 496 deletions(-) create mode 100644 esp32/include/adapters/websocket.hpp rename esp32/{lib/ESP32-sveltekit => include}/ap_service.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/features.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/filesystem.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/firmware_download_service.h (94%) rename esp32/{lib/ESP32-sveltekit => include}/firmware_upload_service.h (96%) rename esp32/{lib/ESP32-sveltekit => include}/gait/bezier_state.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/gait/crawl_state.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/gait/four_phase_trot_state.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/gait/idle_state.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/gait/phase_state_base.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/gait/rest_state.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/gait/stand_state.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/gait/state.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/global.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/kinematics.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/mdns_service.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/motion.h (61%) rename esp32/{lib/ESP32-sveltekit => include}/peripherals/barometer.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/peripherals/camera_pins.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/peripherals/camera_service.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/peripherals/imu.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/peripherals/led_service.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/peripherals/magnetometer.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/peripherals/peripherals.h (92%) rename esp32/{lib/ESP32-sveltekit => include}/peripherals/servo_controller.h (87%) rename esp32/{lib/ESP32-sveltekit => include}/settings/ap_settings.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/settings/camera_settings.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/settings/mdns_settings.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/settings/ntp_settings.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/settings/peripherals_settings.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/settings/servo_settings.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/settings/wifi_settings.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/system_service.h (96%) rename esp32/{lib/ESP32-sveltekit => include}/task_manager.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/template/state_result.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/template/stateful_endpoint.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/template/stateful_persistence.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/template/stateful_service.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/template/stateful_socket.h (74%) rename esp32/{lib/ESP32-sveltekit => include}/utils/ip_utils.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/utils/json_utils.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/utils/math_utils.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/utils/string_utils.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/utils/timing.h (100%) rename esp32/{lib/ESP32-sveltekit => include}/wifi_service.h (100%) delete mode 100644 esp32/lib/ESP32-sveltekit/event_socket.cpp delete mode 100644 esp32/lib/ESP32-sveltekit/event_socket.h create mode 100644 esp32/src/adapters/websocket.cpp rename esp32/{lib/ESP32-sveltekit => src}/ap_service.cpp (100%) rename esp32/{lib/ESP32-sveltekit => src}/features.cpp (100%) rename esp32/{lib/ESP32-sveltekit => src}/filesystem.cpp (100%) rename esp32/{lib/ESP32-sveltekit => src}/firmware_download_service.cpp (90%) rename esp32/{lib/ESP32-sveltekit => src}/firmware_upload_service.cpp (96%) rename esp32/{lib/ESP32-sveltekit => src}/mdns_service.cpp (100%) rename esp32/{lib/ESP32-sveltekit => src}/peripherals/camera_service.cpp (100%) rename esp32/{lib/ESP32-sveltekit => src}/system_service.cpp (98%) rename esp32/{lib/ESP32-sveltekit => src}/task_manager.cpp (100%) rename esp32/{lib/ESP32-sveltekit => src}/wifi_service.cpp (100%) diff --git a/app/package.json b/app/package.json index 0986b1a..75b09c7 100644 --- a/app/package.json +++ b/app/package.json @@ -59,7 +59,9 @@ "three": "^0.162.0", "urdf-loader": "^0.12.1", "uzip": "^0.20201231.0", - "xacro-parser": "^0.3.9" + "xacro-parser": "^0.3.9", + "@types/msgpack-lite": "^0.1.11", + "msgpack-lite": "^0.1.26" }, "packageManager": "pnpm@9.3.0" } diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index 5b8d5f8..f305457 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -13,10 +13,13 @@ importers: version: 1.1.2 '@sveltejs/adapter-auto': specifier: ^4.0.0 - version: 4.0.0(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))) + version: 4.0.0(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))) '@tailwindcss/vite': specifier: ^4.0.12 - version: 4.0.12(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + version: 4.0.12(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + '@types/msgpack-lite': + specifier: ^0.1.11 + version: 0.1.11 chart.js: specifier: ^4.4.2 version: 4.4.2 @@ -32,6 +35,9 @@ importers: jwt-decode: specifier: ^4.0.0 version: 4.0.0 + msgpack-lite: + specifier: ^0.1.26 + version: 0.1.26 nipplejs: specifier: ^0.10.1 version: 0.10.1 @@ -65,13 +71,13 @@ importers: version: 1.49.1 '@sveltejs/adapter-static': specifier: ^3.0.1 - version: 3.0.1(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))) + version: 3.0.1(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))) '@sveltejs/kit': specifier: ^2.5.27 - version: 2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + version: 2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + version: 5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) '@types/eslint': specifier: ^8.56.0 version: 8.56.0 @@ -128,10 +134,10 @@ importers: version: 0.18.5 vite: specifier: ^6.2.1 - version: 6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) + version: 6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) vitest: specifier: ^1.2.0 - version: 1.2.0(jsdom@24.0.0)(lightningcss@1.29.2) + version: 1.2.0(@types/node@24.0.10)(jsdom@24.0.0)(lightningcss@1.29.2) packages: @@ -760,6 +766,12 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/msgpack-lite@0.1.11': + resolution: {integrity: sha512-cdCZS/gw+jIN22I4SUZUFf1ZZfVv5JM1//Br/MuZcI373sxiy3eSSoiyLu0oz+BPatTbGGGBO5jrcvd0siCdTQ==} + + '@types/node@24.0.10': + resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} + '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -1190,6 +1202,9 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-lite@0.1.3: + resolution: {integrity: sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1335,6 +1350,9 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -1356,6 +1374,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + int64-buffer@0.1.10: + resolution: {integrity: sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1394,6 +1415,9 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1592,6 +1616,10 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msgpack-lite@0.1.26: + resolution: {integrity: sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==} + hasBin: true + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2019,6 +2047,9 @@ packages: ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} @@ -2613,18 +2644,18 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sveltejs/adapter-auto@4.0.0(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))': + '@sveltejs/adapter-auto@4.0.0(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))': dependencies: - '@sveltejs/kit': 2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + '@sveltejs/kit': 2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) import-meta-resolve: 4.1.0 - '@sveltejs/adapter-static@3.0.1(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))': + '@sveltejs/adapter-static@3.0.1(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))': dependencies: - '@sveltejs/kit': 2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + '@sveltejs/kit': 2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) - '@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': + '@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -2637,27 +2668,27 @@ snapshots: set-cookie-parser: 2.6.0 sirv: 3.0.1 svelte: 5.20.4 - vite: 6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) + vite: 6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) debug: 4.4.0 svelte: 5.20.4 - vite: 6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) + vite: 6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)))(svelte@5.20.4)(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.20.4 - vite: 6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) - vitefu: 1.0.6(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + vite: 6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) + vitefu: 1.0.6(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) transitivePeerDependencies: - supports-color @@ -2714,13 +2745,13 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.0.12 '@tailwindcss/oxide-win32-x64-msvc': 4.0.12 - '@tailwindcss/vite@4.0.12(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': + '@tailwindcss/vite@4.0.12(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': dependencies: '@tailwindcss/node': 4.0.12 '@tailwindcss/oxide': 4.0.12 lightningcss: 1.29.2 tailwindcss: 4.0.12 - vite: 6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) + vite: 6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) '@tweenjs/tween.js@23.1.2': {} @@ -2737,6 +2768,14 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/msgpack-lite@0.1.11': + dependencies: + '@types/node': 24.0.10 + + '@types/node@24.0.10': + dependencies: + undici-types: 7.8.0 + '@types/semver@7.5.8': {} '@types/stats.js@0.17.3': {} @@ -3259,6 +3298,8 @@ snapshots: esutils@2.0.3: {} + event-lite@0.1.3: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -3414,6 +3455,8 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore@5.3.1: {} import-fresh@3.3.0: @@ -3432,6 +3475,8 @@ snapshots: inherits@2.0.4: {} + int64-buffer@0.1.10: {} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -3458,6 +3503,8 @@ snapshots: is-stream@3.0.0: {} + isarray@1.0.0: {} + isexe@2.0.0: {} jiti@2.4.2: {} @@ -3635,6 +3682,13 @@ snapshots: ms@2.1.3: {} + msgpack-lite@0.1.26: + dependencies: + event-lite: 0.1.3 + ieee754: 1.2.1 + int64-buffer: 0.1.10 + isarray: 1.0.0 + nanoid@3.3.7: {} nanoid@3.3.8: {} @@ -4010,6 +4064,8 @@ snapshots: ufo@1.5.3: {} + undici-types@7.8.0: {} + universalify@0.2.0: {} unplugin-icons@0.18.5: @@ -4054,13 +4110,13 @@ snapshots: uzip@0.20201231.0: {} - vite-node@1.2.0(lightningcss@1.29.2): + vite-node@1.2.0(@types/node@24.0.10)(lightningcss@1.29.2): dependencies: cac: 6.7.14 debug: 4.4.0 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.4.14(lightningcss@1.29.2) + vite: 5.4.14(@types/node@24.0.10)(lightningcss@1.29.2) transitivePeerDependencies: - '@types/node' - less @@ -4072,31 +4128,33 @@ snapshots: - supports-color - terser - vite@5.4.14(lightningcss@1.29.2): + vite@5.4.14(@types/node@24.0.10)(lightningcss@1.29.2): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: + '@types/node': 24.0.10 fsevents: 2.3.3 lightningcss: 1.29.2 - vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2): + vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2): dependencies: esbuild: 0.25.0 postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: + '@types/node': 24.0.10 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.2 yaml: 2.4.2 - vitefu@1.0.6(vite@6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)): + vitefu@1.0.6(vite@6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)): optionalDependencies: - vite: 6.2.1(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) + vite: 6.2.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) - vitest@1.2.0(jsdom@24.0.0)(lightningcss@1.29.2): + vitest@1.2.0(@types/node@24.0.10)(jsdom@24.0.0)(lightningcss@1.29.2): dependencies: '@vitest/expect': 1.2.0 '@vitest/runner': 1.2.0 @@ -4116,10 +4174,11 @@ snapshots: strip-literal: 1.3.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.4.14(lightningcss@1.29.2) - vite-node: 1.2.0(lightningcss@1.29.2) + vite: 5.4.14(@types/node@24.0.10)(lightningcss@1.29.2) + vite-node: 1.2.0(@types/node@24.0.10)(lightningcss@1.29.2) why-is-node-running: 2.2.2 optionalDependencies: + '@types/node': 24.0.10 jsdom: 24.0.0 transitivePeerDependencies: - less diff --git a/app/src/lib/stores/socket.ts b/app/src/lib/stores/socket.ts index acf07ba..42f6b5c 100644 --- a/app/src/lib/stores/socket.ts +++ b/app/src/lib/stores/socket.ts @@ -1,122 +1,132 @@ -import { writable } from 'svelte/store'; +import { writable } from 'svelte/store' -const socketEvents = ['open', 'close', 'error', 'message', 'unresponsive'] as const; -type SocketEvent = (typeof socketEvents)[number]; +const socketEvents = ['open', 'close', 'error', 'message', 'unresponsive'] as const +type SocketEvent = (typeof socketEvents)[number] -function createWebSocket() { - let listeners = new Map void>>(); - const { subscribe, set } = writable(false); - const reconnectTimeoutTime = 5000; - let unresponsiveTimeoutId: number; - let reconnectTimeoutId: number; - let ws: WebSocket; - let socketUrl: string | URL; - - function init(url: string | URL) { - socketUrl = url; - connect(); - } - - function disconnect(reason: SocketEvent, event?: Event) { - ws.close(); - set(false); - clearTimeout(unresponsiveTimeoutId); - clearTimeout(reconnectTimeoutId); - listeners.get(reason)?.forEach((listener) => listener(event)); - reconnectTimeoutId = setTimeout(connect, reconnectTimeoutTime); - } - - function connect() { - ws = new WebSocket(socketUrl); - ws.onopen = (ev) => { - set(true); - clearTimeout(reconnectTimeoutId); - listeners.get('open')?.forEach((listener) => listener(ev)); - for (const event of listeners.keys()) { - if (socketEvents.includes(event as SocketEvent)) continue; - subscribeToEvent(event); - } - }; - ws.onmessage = (message) => { - resetUnresponsiveCheck(); - let data = message.data; - if (data instanceof ArrayBuffer) { - listeners.get('binary')?.forEach((listener) => listener(data)); - return; - } - data = data.substring(1); - - if (!data) return; - - let event = data.substring(data.indexOf('/') + 1, data.indexOf('[')); - let payload = data.substring(data.indexOf('[') + 1, data.lastIndexOf(']')); - - try { - payload = JSON.parse(payload); - } catch (error) {} - if (event) listeners.get(event)?.forEach((listener) => listener(payload)); - }; - ws.onerror = (ev) => disconnect('error', ev); - ws.onclose = (ev) => disconnect('close', ev); - } - - function unsubscribe(event: string, listener?: (data: any) => void) { - let eventListeners = listeners.get(event); - if (!eventListeners) return; - - if (!eventListeners.size) { - unsubscribeToEvent(event); - } - if (listener) { - eventListeners?.delete(listener); - } else { - listeners.delete(event); - } - } - - function resetUnresponsiveCheck() { - clearTimeout(unresponsiveTimeoutId); - unresponsiveTimeoutId = setTimeout(() => disconnect('unresponsive'), reconnectTimeoutTime); - } - - function sendEvent(event: string, data: unknown) { - if (!ws || ws.readyState !== WebSocket.OPEN) return; - ws.send(`2/${event}[${JSON.stringify(data)}]`); - } - - function unsubscribeToEvent(event: string) { - if (!ws || ws.readyState !== WebSocket.OPEN) return; - ws.send('1/' + event); - } - - function subscribeToEvent(event: string) { - if (!ws || ws.readyState !== WebSocket.OPEN) return; - ws.send('0/' + event); - } - - return { - subscribe, - sendEvent, - init, - on: (event: string, listener: (data: T) => void): (() => void) => { - let eventListeners = listeners.get(event); - if (!eventListeners) { - if (!socketEvents.includes(event as SocketEvent)) { - subscribeToEvent(event); - } - eventListeners = new Set(); - listeners.set(event, eventListeners); - } - eventListeners.add(listener as (data: any) => void); - - return () => { - unsubscribe(event, listener); - }; - }, - off: (event: string, listener?: (data: any) => void) => { - unsubscribe(event, listener); - } - }; +export enum Topics { + imu = 0, + mode = 1, + command = 2, + servo = 3, + input = 4, + angles = 5, + position = 6 } -export const socket = createWebSocket(); \ No newline at end of file +function createWebSocket() { + let listeners = new Map void>>() + const { subscribe, set } = writable(false) + const reconnectTimeoutTime = 5000 + let unresponsiveTimeoutId: number + let reconnectTimeoutId: number + let ws: WebSocket + let socketUrl: string | URL + + function init(url: string | URL) { + socketUrl = url + connect() + } + + function disconnect(reason: SocketEvent, event?: Event) { + ws.close() + set(false) + clearTimeout(unresponsiveTimeoutId) + clearTimeout(reconnectTimeoutId) + listeners.get(reason)?.forEach(listener => listener(event)) + reconnectTimeoutId = setTimeout(connect, reconnectTimeoutTime) + } + + function connect() { + ws = new WebSocket(socketUrl) + ws.onopen = ev => { + set(true) + clearTimeout(reconnectTimeoutId) + listeners.get('open')?.forEach(listener => listener(ev)) + for (const event of listeners.keys()) { + if (socketEvents.includes(event as SocketEvent)) continue + subscribeToEvent(event as unknown as Topics) + } + } + ws.onmessage = message => { + resetUnresponsiveCheck() + let data = message.data + if (data instanceof ArrayBuffer) { + listeners.get('binary')?.forEach(listener => listener(data)) + return + } + data = data.substring(1) + + if (!data) return + + let event = data.substring(data.indexOf('/') + 1, data.indexOf('[')) + let payload = data.substring(data.indexOf('[') + 1, data.lastIndexOf(']')) + + try { + payload = JSON.parse(payload) + } catch (error) {} + if (event) listeners.get(event)?.forEach(listener => listener(payload)) + } + ws.onerror = ev => disconnect('error', ev) + ws.onclose = ev => disconnect('close', ev) + } + + function unsubscribe(event: Topics, listener?: (data: any) => void) { + let eventListeners = listeners.get(event) + if (!eventListeners) return + + if (!eventListeners.size) { + unsubscribeToEvent(event) + } + if (listener) { + eventListeners?.delete(listener) + } else { + listeners.delete(event) + } + } + + function resetUnresponsiveCheck() { + clearTimeout(unresponsiveTimeoutId) + unresponsiveTimeoutId = setTimeout(() => disconnect('unresponsive'), reconnectTimeoutTime) + } + + function sendEvent(event: Topics, data: unknown) { + if (!ws || ws.readyState !== WebSocket.OPEN) return + ws.send(JSON.stringify([2, event, data])) + } + + function unsubscribeToEvent(event: Topics) { + if (!ws || ws.readyState !== WebSocket.OPEN) return + ws.send(`[1,${event}]`) + } + + function subscribeToEvent(event: Topics) { + if (!ws || ws.readyState !== WebSocket.OPEN) return + ws.send(`[0,${event}]`) + } + + return { + subscribe, + sendEvent, + init, + on: (event: Topics | SocketEvent, listener: (data: T) => void): (() => void) => { + let eventListeners = listeners.get(event) + if (!eventListeners) { + if (!socketEvents.includes(event)) { + subscribeToEvent(event) + } + eventListeners = new Set() + listeners.set(event, eventListeners) + } + eventListeners.add(listener as (data: any) => void) + + return () => { + unsubscribe(event, listener) + } + }, + off: (event: Topics, listener?: (data: any) => void) => { + unsubscribe(event, listener) + } + } +} + +export const socket = createWebSocket() diff --git a/esp32/.gitignore b/esp32/.gitignore index a75197b..8a90638 100644 --- a/esp32/.gitignore +++ b/esp32/.gitignore @@ -2,6 +2,6 @@ data/ www/ build/ -lib/ESP32-sveltekit/WWWData.h +include/WWWData.h **/.vscode/c_cpp_properties.json **/.vscode/launch.json \ No newline at end of file diff --git a/esp32/include/adapters/bluetooth.hpp b/esp32/include/adapters/bluetooth.hpp index 57e61c6..ff61e49 100644 --- a/esp32/include/adapters/bluetooth.hpp +++ b/esp32/include/adapters/bluetooth.hpp @@ -14,21 +14,8 @@ class BluetoothService : public CommBase<> { BLECharacteristic* rxCharacteristic {nullptr}; bool connected {false}; - protected: - template - using EventBusHandle = typename EventBus::Handle; - - template - EventBusHandle& getHandle(Topic topic) { - return *static_cast*>(subscriptionHandle[static_cast(topic)]); - } - - template - void setHandle(Topic topic, EventBusHandle&& handle) { - subscriptionHandle[static_cast(topic)] = new EventBusHandle(std::move(handle)); - } - - std::array(Topic::COUNT)> subscriptionHandle {}; + public: + void begin(const char* name); private: void handleReceive(const std::string& data); @@ -53,8 +40,4 @@ class BluetoothService : public CommBase<> { if (!v.empty()) svc->handleReceive(v); } }; - - public: - void begin(const char* name); - void loop() {} }; \ No newline at end of file diff --git a/esp32/include/adapters/comm_base.hpp b/esp32/include/adapters/comm_base.hpp index 5f04028..8b8a026 100644 --- a/esp32/include/adapters/comm_base.hpp +++ b/esp32/include/adapters/comm_base.hpp @@ -1,4 +1,5 @@ #pragma once +#include "event_bus.hpp" #include #include #include @@ -17,6 +18,8 @@ class CommBase { std::array subs_; portMUX_TYPE mux_ portMUX_INITIALIZER_UNLOCKED; + std::array(Topic::COUNT)> subscriptionHandle {}; + static constexpr size_t idx(Topic t) { return static_cast(t); } template @@ -30,6 +33,18 @@ class CommBase { protected: virtual void send(size_t cid, const char* data, size_t len) = 0; + template + auto& getHandle(Topic topic) { + using H = typename EventBus::Handle; + return *static_cast(subscriptionHandle[static_cast(topic)]); + } + + template + void setHandle(Topic topic, typename EventBus::Handle&& h) { + using H = typename EventBus::Handle; + subscriptionHandle[static_cast(topic)] = new H(std::move(h)); + } + public: void subscribe(Topic t, size_t cid) { portENTER_CRITICAL(&mux_); diff --git a/esp32/include/adapters/websocket.hpp b/esp32/include/adapters/websocket.hpp new file mode 100644 index 0000000..56061b6 --- /dev/null +++ b/esp32/include/adapters/websocket.hpp @@ -0,0 +1,42 @@ +#ifndef Socket_h +#define Socket_h + +#include +#include +#include +#include +#include + +#include "event_bus.hpp" +#include "adapters/comm_base.hpp" +#include "topic.hpp" +// #include "msgs/motion_input_msg.hpp" +// #include "msgs/motion_angles_msg.hpp" +// #include "msgs/motion_position_msg.hpp" +// #include "msgs/motion_mode_msg.hpp" + +// typedef std::function EventCallback; + +class EventSocket : public CommBase<> { + PsychicWebSocketHandler _socket; + + public: + EventSocket(); + PsychicWebSocketHandler *getHandler() { return &_socket; } + + private: + void send(size_t clientId, const char *data, size_t len) override; + + void handleReceive(const std::string &data); + // void handleTypedMessage(const std::string &data); + // void handleLegacyMessage(const std::string &data, int originId); + // void handleEventCallbacks(String event, JsonObject &jsonObject, int originId); + + void onWSOpen(PsychicWebSocketClient *client); + void onWSClose(PsychicWebSocketClient *client); + esp_err_t onFrame(PsychicWebSocketRequest *request, httpd_ws_frame *frame); +}; + +extern EventSocket socket; + +#endif diff --git a/esp32/lib/ESP32-sveltekit/ap_service.h b/esp32/include/ap_service.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/ap_service.h rename to esp32/include/ap_service.h diff --git a/esp32/include/event_bus.hpp b/esp32/include/event_bus.hpp index 6565ce1..d790644 100644 --- a/esp32/include/event_bus.hpp +++ b/esp32/include/event_bus.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -102,11 +103,12 @@ class EventBus { public: class Handle { - size_t index; + size_t index {MaxSubs}; friend class EventBus; explicit Handle(size_t i) : index(i) {} public: + Handle() = default; Handle(const Handle&) = delete; Handle& operator=(const Handle&) = delete; Handle(Handle&& h) noexcept : index(h.index) { h.index = MaxSubs; } diff --git a/esp32/lib/ESP32-sveltekit/features.h b/esp32/include/features.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/features.h rename to esp32/include/features.h diff --git a/esp32/lib/ESP32-sveltekit/filesystem.h b/esp32/include/filesystem.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/filesystem.h rename to esp32/include/filesystem.h diff --git a/esp32/lib/ESP32-sveltekit/firmware_download_service.h b/esp32/include/firmware_download_service.h similarity index 94% rename from esp32/lib/ESP32-sveltekit/firmware_download_service.h rename to esp32/include/firmware_download_service.h index 879fa67..37af111 100644 --- a/esp32/lib/ESP32-sveltekit/firmware_download_service.h +++ b/esp32/include/firmware_download_service.h @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include diff --git a/esp32/lib/ESP32-sveltekit/firmware_upload_service.h b/esp32/include/firmware_upload_service.h similarity index 96% rename from esp32/lib/ESP32-sveltekit/firmware_upload_service.h rename to esp32/include/firmware_upload_service.h index c0622b9..962488a 100644 --- a/esp32/lib/ESP32-sveltekit/firmware_upload_service.h +++ b/esp32/include/firmware_upload_service.h @@ -8,7 +8,7 @@ #include #include -#include +#include enum FileType { ft_none = 0, ft_firmware = 1, ft_md5 = 2 }; diff --git a/esp32/lib/ESP32-sveltekit/gait/bezier_state.h b/esp32/include/gait/bezier_state.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/gait/bezier_state.h rename to esp32/include/gait/bezier_state.h diff --git a/esp32/lib/ESP32-sveltekit/gait/crawl_state.h b/esp32/include/gait/crawl_state.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/gait/crawl_state.h rename to esp32/include/gait/crawl_state.h diff --git a/esp32/lib/ESP32-sveltekit/gait/four_phase_trot_state.h b/esp32/include/gait/four_phase_trot_state.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/gait/four_phase_trot_state.h rename to esp32/include/gait/four_phase_trot_state.h diff --git a/esp32/lib/ESP32-sveltekit/gait/idle_state.h b/esp32/include/gait/idle_state.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/gait/idle_state.h rename to esp32/include/gait/idle_state.h diff --git a/esp32/lib/ESP32-sveltekit/gait/phase_state_base.h b/esp32/include/gait/phase_state_base.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/gait/phase_state_base.h rename to esp32/include/gait/phase_state_base.h diff --git a/esp32/lib/ESP32-sveltekit/gait/rest_state.h b/esp32/include/gait/rest_state.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/gait/rest_state.h rename to esp32/include/gait/rest_state.h diff --git a/esp32/lib/ESP32-sveltekit/gait/stand_state.h b/esp32/include/gait/stand_state.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/gait/stand_state.h rename to esp32/include/gait/stand_state.h diff --git a/esp32/lib/ESP32-sveltekit/gait/state.h b/esp32/include/gait/state.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/gait/state.h rename to esp32/include/gait/state.h diff --git a/esp32/lib/ESP32-sveltekit/global.h b/esp32/include/global.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/global.h rename to esp32/include/global.h diff --git a/esp32/lib/ESP32-sveltekit/kinematics.h b/esp32/include/kinematics.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/kinematics.h rename to esp32/include/kinematics.h diff --git a/esp32/lib/ESP32-sveltekit/mdns_service.h b/esp32/include/mdns_service.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/mdns_service.h rename to esp32/include/mdns_service.h diff --git a/esp32/lib/ESP32-sveltekit/motion.h b/esp32/include/motion.h similarity index 61% rename from esp32/lib/ESP32-sveltekit/motion.h rename to esp32/include/motion.h index ed38265..8365771 100644 --- a/esp32/lib/ESP32-sveltekit/motion.h +++ b/esp32/include/motion.h @@ -1,7 +1,8 @@ #ifndef MotionService_h #define MotionService_h -#include +#include +#include #include #include #include @@ -21,51 +22,37 @@ enum class MOTION_STATE { DEACTIVATED, IDLE, CALIBRATION, REST, STAND, CRAWL, WA class MotionService { public: - MotionService(ServoController *servoController) : _servoController(servoController) {} + MotionService(ServoController* servoController) : _servoController(servoController) {} void begin() { - socket.onEvent(INPUT_EVENT, [&](JsonObject &root, int originId) { handleInput(root, originId); }); - - socket.onEvent(MODE_EVENT, [&](JsonObject &root, int originId) { handleMode(root, originId); }); - - socket.onEvent(ANGLES_EVENT, [&](JsonObject &root, int originId) { anglesEvent(root, originId); }); - - socket.onEvent(POSITION_EVENT, [&](JsonObject &root, int originId) { positionEvent(root, originId); }); - - socket.onSubscribe(ANGLES_EVENT, - std::bind(&MotionService::syncAngles, this, std::placeholders::_1, std::placeholders::_2)); - + setupEventBusSubscriptions(); body_state.updateFeet(kinematics.default_feet_positions); } - void anglesEvent(JsonObject &root, int originId) { - JsonArray array = root["data"].as(); + void anglesEvent(const MotionAnglesMsg& msg) { for (int i = 0; i < 12; i++) { - angles[i] = array[i]; + angles[i] = msg.angles[i]; } - syncAngles(String(originId)); + syncAngles(); } - void positionEvent(JsonObject &root, int originId) { - JsonArray array = root["data"].as(); - body_state.omega = array[0]; - body_state.phi = array[1]; - body_state.psi = array[2]; - body_state.xm = array[3]; - body_state.ym = array[4]; - body_state.zm = array[5]; + void positionEvent(const MotionPositionMsg& msg) { + body_state.omega = msg.omega; + body_state.phi = msg.phi; + body_state.psi = msg.psi; + body_state.xm = msg.xm; + body_state.ym = msg.ym; + body_state.zm = msg.zm; } - void handleInput(JsonObject &root, int originId) { - JsonArray array = root["data"].as(); - command.lx = array[1]; - command.lx = array[1]; - command.ly = array[2]; - command.rx = array[3]; - command.ry = array[4]; - command.h = array[5]; - command.s = array[6]; - command.s1 = array[7]; + void handleInput(const MotionInputMsg& msg) { + command.lx = msg.lx; + command.ly = msg.ly; + command.rx = msg.rx; + command.ry = msg.ry; + command.h = msg.h; + command.s = msg.s; + command.s1 = msg.s1; body_state.ym = (command.h + 127.f) * 0.35f / 100; @@ -81,25 +68,27 @@ class MotionService { } } - void handleMode(JsonObject &root, int originId) { - motionState = (MOTION_STATE)root["data"].as(); + void handleMode(const MotionModeMsg& msg) { + motionState = (MOTION_STATE)msg.mode; ESP_LOGV("MotionService", "Mode %d", motionState); - char output[2]; - itoa((int)motionState, output, 10); + motionState == MOTION_STATE::DEACTIVATED ? _servoController->deactivate() : _servoController->activate(); - socket.emit(MODE_EVENT, output, String(originId).c_str()); + + MotionModeMsg response; + response.mode = msg.mode; + EventBus::publishAsync(response, _modeHandle); } - void emitAngles(const String &originId = "", bool sync = false) { - char output[100]; - snprintf(output, sizeof(output), "[%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f]", angles[0], - angles[1], angles[2], angles[3], angles[4], angles[5], angles[6], angles[7], angles[8], angles[9], - angles[10], angles[11]); - socket.emit(ANGLES_EVENT, output, originId.c_str()); + void emitAngles() { + MotionAnglesMsg anglesMsg; + for (int i = 0; i < 12; i++) { + anglesMsg.angles[i] = angles[i]; + } + EventBus::publishAsync(anglesMsg, _anglesHandle); } - void syncAngles(const String &originId = "", bool sync = false) { - emitAngles(originId, sync); + void syncAngles() { + emitAngles(); _servoController->setAngles(angles); } @@ -134,10 +123,33 @@ class MotionService { return updated; } - float *getAngles() { return angles; } + float* getAngles() { return angles; } private: - ServoController *_servoController; + void setupEventBusSubscriptions() { + _inputHandle = EventBus::subscribe([this](const MotionInputMsg* msg, size_t n) { + if (n > 0) handleInput(msg[0]); + }); + + _modeHandle = EventBus::subscribe([this](const MotionModeMsg* msg, size_t n) { + if (n > 0) handleMode(msg[0]); + }); + + _anglesHandle = EventBus::subscribe([this](const MotionAnglesMsg* msg, size_t n) { + if (n > 0) anglesEvent(msg[0]); + }); + + _positionHandle = EventBus::subscribe([this](const MotionPositionMsg* msg, size_t n) { + if (n > 0) positionEvent(msg[0]); + }); + } + + EventBus::Handle _inputHandle; + EventBus::Handle _modeHandle; + EventBus::Handle _anglesHandle; + EventBus::Handle _positionHandle; + + ServoController* _servoController; Kinematics kinematics; ControllerCommand command = {0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/esp32/lib/ESP32-sveltekit/peripherals/barometer.h b/esp32/include/peripherals/barometer.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/peripherals/barometer.h rename to esp32/include/peripherals/barometer.h diff --git a/esp32/lib/ESP32-sveltekit/peripherals/camera_pins.h b/esp32/include/peripherals/camera_pins.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/peripherals/camera_pins.h rename to esp32/include/peripherals/camera_pins.h diff --git a/esp32/lib/ESP32-sveltekit/peripherals/camera_service.h b/esp32/include/peripherals/camera_service.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/peripherals/camera_service.h rename to esp32/include/peripherals/camera_service.h diff --git a/esp32/lib/ESP32-sveltekit/peripherals/imu.h b/esp32/include/peripherals/imu.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/peripherals/imu.h rename to esp32/include/peripherals/imu.h diff --git a/esp32/lib/ESP32-sveltekit/peripherals/led_service.h b/esp32/include/peripherals/led_service.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/peripherals/led_service.h rename to esp32/include/peripherals/led_service.h diff --git a/esp32/lib/ESP32-sveltekit/peripherals/magnetometer.h b/esp32/include/peripherals/magnetometer.h similarity index 100% rename from esp32/lib/ESP32-sveltekit/peripherals/magnetometer.h rename to esp32/include/peripherals/magnetometer.h diff --git a/esp32/lib/ESP32-sveltekit/peripherals/peripherals.h b/esp32/include/peripherals/peripherals.h similarity index 92% rename from esp32/lib/ESP32-sveltekit/peripherals/peripherals.h rename to esp32/include/peripherals/peripherals.h index 671fae0..8e04ffc 100644 --- a/esp32/lib/ESP32-sveltekit/peripherals/peripherals.h +++ b/esp32/include/peripherals/peripherals.h @@ -55,15 +55,15 @@ class Peripherals : public StatefulService { _eventEndpoint.begin(); _persistence.readFromFS(); - socket.onEvent(EVENT_I2C_SCAN, [&](JsonObject &root, int originId) { - scanI2C(); - emitI2C(); - }); + // socket.onEvent(EVENT_I2C_SCAN, [&](JsonObject &root, int originId) { + // scanI2C(); + // emitI2C(); + // }); - socket.onSubscribe(EVENT_I2C_SCAN, [&](const String &originId, bool sync) { - scanI2C(); - emitI2C(originId, sync); - }); + // socket.onSubscribe(EVENT_I2C_SCAN, [&](const String &originId, bool sync) { + // scanI2C(); + // emitI2C(originId, sync); + // }); updatePins(); @@ -115,7 +115,7 @@ class Peripherals : public StatefulService { } serializeJson(root, output); ESP_LOGI("Peripherals", "Emitting I2C scan results, %s %d", originId.c_str(), sync); - socket.emit(EVENT_I2C_SCAN, output, originId.c_str(), sync); + // socket.emit(EVENT_I2C_SCAN, output, originId.c_str(), sync); } void scanI2C(uint8_t lower = 1, uint8_t higher = 127) { @@ -191,14 +191,14 @@ class Peripherals : public StatefulService { _bmp.readBarometer(root); #endif serializeJson(doc, message); - socket.emit(EVENT_IMU, message); + // socket.emit(EVENT_IMU, message); } void emitSonar() { #if FT_ENABLED(USE_USS) char output[16]; snprintf(output, sizeof(output), "[%.1f,%.1f]", _left_distance, _right_distance); - socket.emit("sonar", output); + // socket.emit("sonar", output); #endif } diff --git a/esp32/lib/ESP32-sveltekit/peripherals/servo_controller.h b/esp32/include/peripherals/servo_controller.h similarity index 87% rename from esp32/lib/ESP32-sveltekit/peripherals/servo_controller.h rename to esp32/include/peripherals/servo_controller.h index 88ad13a..d203958 100644 --- a/esp32/lib/ESP32-sveltekit/peripherals/servo_controller.h +++ b/esp32/include/peripherals/servo_controller.h @@ -2,7 +2,7 @@ #define ServoController_h #include -#include +#include #include