/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #pragma once #include #include #include "audio_fsm.hpp" #include "freertos/FreeRTOS.h" #include "freertos/portmacro.h" #include "freertos/queue.h" #include "tinyfsm.hpp" #include "ui_fsm.hpp" namespace events { typedef std::function WorkItem; /* * Handles communication of events between the system's state machines. Each * event will be dispatched separately to each FSM, on the correct task for * that FSM. */ class EventQueue { public: static EventQueue& GetInstance() { static EventQueue instance; return instance; } template auto Dispatch(const Event& ev) -> void { WorkItem* item = new WorkItem( [=]() { tinyfsm::FsmList::template dispatch(ev); }); if (std::is_same()) { xQueueSend(ui_handle_, &item, portMAX_DELAY); } else if (std::is_same()) { xQueueSend(audio_handle_, &item, portMAX_DELAY); } else { xQueueSend(system_handle_, &item, portMAX_DELAY); } Dispatch(ev); } template auto Dispatch(const Event& ev) -> void {} auto ServiceSystem(TickType_t max_wait_time) -> bool; auto ServiceUi(TickType_t max_wait_time) -> bool; auto ServiceAudio(TickType_t max_wait_time) -> bool; EventQueue(EventQueue const&) = delete; void operator=(EventQueue const&) = delete; private: EventQueue(); QueueHandle_t system_handle_; QueueHandle_t ui_handle_; QueueHandle_t audio_handle_; }; template auto Dispatch(const Event& ev) -> void { EventQueue& queue = EventQueue::GetInstance(); queue.Dispatch(ev); } } // namespace events