#include #if TT_FEATURE_SCREENSHOT_ENABLED #include #include #include #include namespace tt::service::screenshot { constexpr auto* TAG = "ScreenshotService"; extern const ServiceManifest manifest; std::shared_ptr _Nullable optScreenshotService() { return service::findServiceById(manifest.id); } void ScreenshotService::startApps(const std::string& path) { auto lock = mutex.asScopedLock(); if (!lock.lock(50 / portTICK_PERIOD_MS)) { TT_LOG_W(TAG, LOG_MESSAGE_MUTEX_LOCK_FAILED); return; } if (task == nullptr || task->isFinished()) { task = std::make_unique(); mode = Mode::Apps; task->startApps(path); } else { TT_LOG_W(TAG, "Screenshot task already running"); } } void ScreenshotService::startTimed(const std::string& path, uint8_t delayInSeconds, uint8_t amount) { auto lock = mutex.asScopedLock(); if (!lock.lock(50 / portTICK_PERIOD_MS)) { TT_LOG_W(TAG, LOG_MESSAGE_MUTEX_LOCK_FAILED); return; } if (task == nullptr || task->isFinished()) { task = std::make_unique(); mode = Mode::Timed; task->startTimed(path, delayInSeconds, amount); } else { TT_LOG_W(TAG, "Screenshot task already running"); } } bool ScreenshotService::onStart(ServiceContext& serviceContext) { if (lv_screen_active() == nullptr) { TT_LOG_E(TAG, "No display found"); return false; } return true; } void ScreenshotService::stop() { auto lock = mutex.asScopedLock(); if (!lock.lock(50 / portTICK_PERIOD_MS)) { TT_LOG_W(TAG, LOG_MESSAGE_MUTEX_LOCK_FAILED); return; } if (task != nullptr) { task = nullptr; mode = Mode::None; } else { TT_LOG_W(TAG, "Screenshot task not running"); } } Mode ScreenshotService::getMode() const { auto lock = mutex.asScopedLock(); if (!lock.lock(50 / portTICK_PERIOD_MS)) { TT_LOG_W(TAG, LOG_MESSAGE_MUTEX_LOCK_FAILED); return Mode::None; } return mode; } bool ScreenshotService::isTaskStarted() { auto* current_task = task.get(); if (current_task == nullptr) { return false; } else { return !current_task->isFinished(); } } extern const ServiceManifest manifest = { .id = "Screenshot", .createService = create }; } // namespace #endif