From 7474f65aaa4839dd3adc8ff97b1ed19a4f5edc81 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Sun, 12 Oct 2025 20:37:30 +0200 Subject: [PATCH] fix hanging --- .../include/cardboy/backend/esp_backend.hpp | 2 ++ Firmware/components/backend-esp/src/esp_backend.cpp | 7 +++++++ Firmware/sdk/backend_interface/CMakeLists.txt | 1 + .../include/cardboy/sdk/loop_hooks.hpp | 11 +++++++++++ .../include/cardboy/sdk/services.hpp | 2 ++ Firmware/sdk/backends/desktop/src/desktop_backend.cpp | 1 + .../sdk/core/include/cardboy/sdk/app_framework.hpp | 1 + Firmware/sdk/core/src/app_system.cpp | 3 +++ 8 files changed, 28 insertions(+) create mode 100644 Firmware/sdk/backend_interface/include/cardboy/sdk/loop_hooks.hpp diff --git a/Firmware/components/backend-esp/include/cardboy/backend/esp_backend.hpp b/Firmware/components/backend-esp/include/cardboy/backend/esp_backend.hpp index 3071d85..1f90c30 100644 --- a/Firmware/components/backend-esp/include/cardboy/backend/esp_backend.hpp +++ b/Firmware/components/backend-esp/include/cardboy/backend/esp_backend.hpp @@ -61,6 +61,7 @@ private: class HighResClockService; class PowerService; class FilesystemService; + class LoopHooksService; std::unique_ptr buzzerService; std::unique_ptr batteryService; @@ -70,6 +71,7 @@ private: std::unique_ptr powerService; std::unique_ptr filesystemService; std::unique_ptr eventBus; + std::unique_ptr loopHooksService; cardboy::sdk::Services services{}; }; diff --git a/Firmware/components/backend-esp/src/esp_backend.cpp b/Firmware/components/backend-esp/src/esp_backend.cpp index 60d4d13..2281ddd 100644 --- a/Firmware/components/backend-esp/src/esp_backend.cpp +++ b/Firmware/components/backend-esp/src/esp_backend.cpp @@ -128,6 +128,11 @@ public: } }; +class EspRuntime::LoopHooksService final : public cardboy::sdk::ILoopHooks { +public: + void onLoopIteration() override { vTaskDelay(1); } +}; + EspRuntime::EspRuntime() : framebuffer(), input(), clock() { initializeHardware(); @@ -139,6 +144,7 @@ EspRuntime::EspRuntime() : framebuffer(), input(), clock() { powerService = std::make_unique(); filesystemService = std::make_unique(); eventBus = std::make_unique(); + loopHooksService = std::make_unique(); services.buzzer = buzzerService.get(); services.battery = batteryService.get(); @@ -148,6 +154,7 @@ EspRuntime::EspRuntime() : framebuffer(), input(), clock() { services.powerManager = powerService.get(); services.filesystem = filesystemService.get(); services.eventBus = eventBus.get(); + services.loopHooks = loopHooksService.get(); Buttons::get().setEventBus(eventBus.get()); } diff --git a/Firmware/sdk/backend_interface/CMakeLists.txt b/Firmware/sdk/backend_interface/CMakeLists.txt index b226b3e..56a5260 100644 --- a/Firmware/sdk/backend_interface/CMakeLists.txt +++ b/Firmware/sdk/backend_interface/CMakeLists.txt @@ -17,6 +17,7 @@ target_sources(cardboy_backend_interface ${CMAKE_CURRENT_SOURCE_DIR}/include/cardboy/sdk/backend.hpp ${CMAKE_CURRENT_SOURCE_DIR}/include/cardboy/sdk/display_spec.hpp ${CMAKE_CURRENT_SOURCE_DIR}/include/cardboy/sdk/event_bus.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/include/cardboy/sdk/loop_hooks.hpp ${CMAKE_CURRENT_SOURCE_DIR}/include/cardboy/sdk/input_state.hpp ${CMAKE_CURRENT_SOURCE_DIR}/include/cardboy/sdk/platform.hpp ${CMAKE_CURRENT_SOURCE_DIR}/include/cardboy/sdk/services.hpp diff --git a/Firmware/sdk/backend_interface/include/cardboy/sdk/loop_hooks.hpp b/Firmware/sdk/backend_interface/include/cardboy/sdk/loop_hooks.hpp new file mode 100644 index 0000000..f677136 --- /dev/null +++ b/Firmware/sdk/backend_interface/include/cardboy/sdk/loop_hooks.hpp @@ -0,0 +1,11 @@ +#pragma once + +namespace cardboy::sdk { + +class ILoopHooks { +public: + virtual ~ILoopHooks() = default; + virtual void onLoopIteration() = 0; +}; + +} // namespace cardboy::sdk diff --git a/Firmware/sdk/backend_interface/include/cardboy/sdk/services.hpp b/Firmware/sdk/backend_interface/include/cardboy/sdk/services.hpp index c03d546..4333f62 100644 --- a/Firmware/sdk/backend_interface/include/cardboy/sdk/services.hpp +++ b/Firmware/sdk/backend_interface/include/cardboy/sdk/services.hpp @@ -1,6 +1,7 @@ #pragma once #include "cardboy/sdk/event_bus.hpp" +#include "cardboy/sdk/loop_hooks.hpp" #include #include @@ -85,6 +86,7 @@ struct Services { IPowerManager* powerManager = nullptr; IFilesystem* filesystem = nullptr; IEventBus* eventBus = nullptr; + ILoopHooks* loopHooks = nullptr; }; } // namespace cardboy::sdk diff --git a/Firmware/sdk/backends/desktop/src/desktop_backend.cpp b/Firmware/sdk/backends/desktop/src/desktop_backend.cpp index d0918ef..5fe1ab7 100644 --- a/Firmware/sdk/backends/desktop/src/desktop_backend.cpp +++ b/Firmware/sdk/backends/desktop/src/desktop_backend.cpp @@ -244,6 +244,7 @@ DesktopRuntime::DesktopRuntime() : services.powerManager = &powerService; services.filesystem = &filesystemService; services.eventBus = &eventBusService; + services.loopHooks = nullptr; } cardboy::sdk::Services& DesktopRuntime::serviceRegistry() { return services; } diff --git a/Firmware/sdk/core/include/cardboy/sdk/app_framework.hpp b/Firmware/sdk/core/include/cardboy/sdk/app_framework.hpp index 4b21338..3b8d5cc 100644 --- a/Firmware/sdk/core/include/cardboy/sdk/app_framework.hpp +++ b/Firmware/sdk/core/include/cardboy/sdk/app_framework.hpp @@ -64,6 +64,7 @@ struct AppContext { [[nodiscard]] IPowerManager* powerManager() const { return services ? services->powerManager : nullptr; } [[nodiscard]] IFilesystem* filesystem() const { return services ? services->filesystem : nullptr; } [[nodiscard]] IEventBus* eventBus() const { return services ? services->eventBus : nullptr; } + [[nodiscard]] ILoopHooks* loopHooks() const { return services ? services->loopHooks : nullptr; } void requestAppSwitchByIndex(std::size_t index) { pendingAppIndex = index; diff --git a/Firmware/sdk/core/src/app_system.cpp b/Firmware/sdk/core/src/app_system.cpp index 4f7a3dd..c1ff268 100644 --- a/Firmware/sdk/core/src/app_system.cpp +++ b/Firmware/sdk/core/src/app_system.cpp @@ -138,6 +138,9 @@ void AppSystem::run() { eventBus->scheduleTimerSignal(waitMs); eventBus->wait(mask, IEventBus::kWaitForever); } + + if (auto* hooks = context.loopHooks()) + hooks->onLoopIteration(); } }