/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #pragma once #include #include "freertos/FreeRTOS.h" #include "freertos/portmacro.h" #include "freertos/queue.h" #include "tinyfsm.hpp" namespace events { typedef std::function WorkItem; 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); }); xQueueSend(handle_, &item, portMAX_DELAY); } auto Service(TickType_t max_wait_time) -> bool; EventQueue(EventQueue const&) = delete; void operator=(EventQueue const&) = delete; private: EventQueue(); QueueHandle_t handle_; }; template auto Dispatch(const Event& ev) -> void { EventQueue& queue = EventQueue::GetInstance(); queue.Dispatch(ev); } } // namespace events