Tab5 camera + other stuff (#558)

* Tab5 camera + other stuff

Tab5 camera driver - SC2356
Custom SliderBox widget - slider with plus and minus buttons + value label and snapping
Rtc Time service + rtc api
Sdk release - only include drivers built for that specific target, eg: sc2356 driver is mipi / p4 only.
No more hardcoded manual sdk cmakelists
New function to find device by compatible string match. no more static cast bool wildness when trying to match a single device (like M5Stack PaperS3 for example)

* feedback + fixes

Fixed external app user data path.
fix(gui): block app teardown until onHide() completes, preventing ELF unload racing a still-running app
added camera device type and api

* drain the snake sssem

---------

Co-authored-by: Ken Van Hoeylandt <git@kenvanhoeylandt.net>
This commit is contained in:
Shadowtrance
2026-07-10 16:45:03 +10:00
committed by GitHub
parent 16a61a087c
commit 7a7f09be35
47 changed files with 1894 additions and 83 deletions
@@ -7,6 +7,8 @@
#include <Tactility/service/Service.h>
#include <Tactility/service/loader/Loader.h>
#include <Tactility/Semaphore.h>
#include <tactility/concurrent/dispatcher.h>
#include <cstdio>
@@ -30,6 +32,16 @@ class GuiService final : public Service {
RecursiveMutex mutex;
PubSub<loader::LoaderService::Event>::SubscriptionHandle loader_pubsub_subscription = nullptr;
// Signaled by hideApp() once App::onHide() has actually finished running on the GUI
// task. onLoaderEvent() blocks on this (still on the Loader thread, inside the
// synchronous pubsub publish() call) before returning from the ApplicationHiding
// branch, so LoaderService::transitionAppToState(Hiding) can't return - and therefore
// the immediately-following Destroyed transition (which unloads an ELF app's code via
// esp_elf_deinit) can't run - until onHide() has fully completed. Without this, the
// ELF's code/data can be unmapped while onHide() (and anything it spawned, like a
// camera capture task) is still executing it.
Semaphore hideDoneSem { 1, 0 };
// Layers and Canvas
lv_obj_t* appRootWidget = nullptr;
lv_obj_t* statusbarWidget = nullptr;