- Refactored `TouchDevice`: it can now start/stop LVGL separately, and it has an optional `TouchDriver` interface - Refactored `DisplayDevice`: it can now start/stop LVGL separately, and it has an optional `DisplayDriver` interface - Updated all boards and drivers for above changes - LVGL can now be stopped and (re)started on the fly - Fixed issues with restarting Gui and Statusbar services - Refactored `Gui` service to be class and renamed `Gui` to `GuiService` - Fixed `Statusbar` service: forgot to deregister one of the icons - Updated `esp_lcd_st7701` to v1.1.3 - `lv_textarea_create()` now automatically registers the hardware keyboard hooks (by wrapping the function) - Fixed and updated `tactility.py` - Cleanup of a lot of code - `BootInitLvglBegin` and `BootInitLvglEnd` are replaced by `LvglStarted` and `LvglStopped`. - Introduced `tt::service::State` which is accessible via `tt::service::getState()` (and internally via `ServiceInstance`) - Started replacing `#define TAG` with `constexpr auto TAG = "..";`
99 lines
2.6 KiB
C++
99 lines
2.6 KiB
C++
#include "Tactility/kernel/SystemEvents.h"
|
|
|
|
#include <Tactility/Mutex.h>
|
|
#include <Tactility/CoreExtraDefines.h>
|
|
|
|
#include <list>
|
|
|
|
#define TAG "system_event"
|
|
|
|
namespace tt::kernel {
|
|
|
|
struct SubscriptionData {
|
|
SystemEventSubscription id;
|
|
SystemEvent event;
|
|
OnSystemEvent handler;
|
|
};
|
|
|
|
static Mutex mutex;
|
|
static SystemEventSubscription subscriptionCounter = 0;
|
|
static std::list<SubscriptionData> subscriptions;
|
|
|
|
static const char* getEventName(SystemEvent event) {
|
|
switch (event) {
|
|
using enum SystemEvent;
|
|
case BootInitHalBegin:
|
|
return TT_STRINGIFY(BootInitHalBegin);
|
|
case BootInitHalEnd:
|
|
return TT_STRINGIFY(BootInitHalEnd);
|
|
case BootInitI2cBegin:
|
|
return TT_STRINGIFY(BootInitI2cBegin);
|
|
case BootInitI2cEnd:
|
|
return TT_STRINGIFY(BootInitI2cEnd);
|
|
case BootInitSpiBegin:
|
|
return TT_STRINGIFY(BootInitSpiBegin);
|
|
case BootInitSpiEnd:
|
|
return TT_STRINGIFY(BootInitSpiEnd);
|
|
case BootInitUartBegin:
|
|
return TT_STRINGIFY(BootInitUartBegin);
|
|
case BootInitUartEnd:
|
|
return TT_STRINGIFY(BootInitUartEnd);
|
|
case BootSplash:
|
|
return TT_STRINGIFY(BootSplash);
|
|
case NetworkConnected:
|
|
return TT_STRINGIFY(NetworkConnected);
|
|
case NetworkDisconnected:
|
|
return TT_STRINGIFY(NetworkDisconnected);
|
|
case LvglStarted:
|
|
return TT_STRINGIFY(LvglStarted);
|
|
case LvglStopped:
|
|
return TT_STRINGIFY(LvglStopped);
|
|
case Time:
|
|
return TT_STRINGIFY(Time);
|
|
}
|
|
|
|
tt_crash(); // Missing case above
|
|
}
|
|
|
|
void publishSystemEvent(SystemEvent event) {
|
|
TT_LOG_I(TAG, "%s", getEventName(event));
|
|
|
|
if (mutex.lock(portMAX_DELAY)) {
|
|
for (auto& subscription : subscriptions) {
|
|
if (subscription.event == event) {
|
|
subscription.handler(event);
|
|
}
|
|
}
|
|
|
|
mutex.unlock();
|
|
}
|
|
}
|
|
|
|
SystemEventSubscription subscribeSystemEvent(SystemEvent event, OnSystemEvent handler) {
|
|
if (mutex.lock(portMAX_DELAY)) {
|
|
auto id = ++subscriptionCounter;
|
|
|
|
subscriptions.push_back({
|
|
.id = id,
|
|
.event = event,
|
|
.handler = handler
|
|
});
|
|
|
|
mutex.unlock();
|
|
return id;
|
|
} else {
|
|
tt_crash();
|
|
}
|
|
}
|
|
|
|
void unsubscribeSystemEvent(SystemEventSubscription subscription) {
|
|
if (mutex.lock(portMAX_DELAY)) {
|
|
std::erase_if(subscriptions, [subscription](auto& item) {
|
|
return (item.id == subscription);
|
|
});
|
|
mutex.unlock();
|
|
}
|
|
}
|
|
|
|
}
|