From 98e9e11355a6d0deea730fb50d14f2f41da6ae1f Mon Sep 17 00:00:00 2001 From: RedHawk Date: Tue, 25 Apr 2023 23:57:18 +0300 Subject: [PATCH] QueueManager & Master: Base for queues. --- source/shoh/src/main.cpp | 17 +++++++++- .../shoh/src/threads/common/QueueManager.cpp | 32 +++++++++++++++++++ source/shoh/src/threads/common/ThreadCommon.h | 21 ++++++++++++ source/shoh/src/threads/master/Master.cpp | 12 +++++-- source/shoh/src/threads/master/Master.h | 3 +- 5 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 source/shoh/src/threads/common/QueueManager.cpp diff --git a/source/shoh/src/main.cpp b/source/shoh/src/main.cpp index 81ea5a8..c226edb 100644 --- a/source/shoh/src/main.cpp +++ b/source/shoh/src/main.cpp @@ -12,9 +12,24 @@ int main(void) SystemCoreClockUpdate(); Board_Init(); ThreadCommon::ThreadManager manager; + ThreadCommon::QueueManager* qmanager = new ThreadCommon::QueueManager; + //Creating queues + qmanager->createQueue(100, + sizeof(ThreadCommon::Event), + ThreadCommon::QueueManager::master_event_all); + + //Creating tasks manager.createTask(master_thread, "master", configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, - nullptr); + static_cast(qmanager)); + + // + QueueHandle_t master_event_all_q = qmanager->getQueue(ThreadCommon::QueueManager::master_event_all); + ThreadCommon::Event* e = new ThreadCommon::Event(ThreadCommon::Null, 0); + + xQueueSend(master_event_all_q, static_cast(e), 0); + // + // Start the real time kernel with preemption. //FreeRTOS::Kernel::startScheduler(); vTaskStartScheduler (); diff --git a/source/shoh/src/threads/common/QueueManager.cpp b/source/shoh/src/threads/common/QueueManager.cpp new file mode 100644 index 0000000..8f4c42a --- /dev/null +++ b/source/shoh/src/threads/common/QueueManager.cpp @@ -0,0 +1,32 @@ +/* + * QueueManager.cpp + * + * Created on: 24 Apr 2023 + * Author: tylen + */ + +#include "ThreadCommon.h" + +ThreadCommon::QueueManager::QueueManager() {} + +bool ThreadCommon::QueueManager::createQueue(size_t queue_length, size_t item_size, Queue_id qid) +{ + QueueHandle_t queue_to_create; + if ((queue_to_create = xQueueCreate(queue_length, item_size))) + { + queues.insert({qid, queue_to_create}); + return true; + } + return false; +} + +QueueHandle_t ThreadCommon::QueueManager::getQueue(Queue_id qid) +{ + const auto pos = queues.find(qid); + if (pos == queues.end()) + return nullptr; + + return pos->second; + + //return queues.at(qid); +} diff --git a/source/shoh/src/threads/common/ThreadCommon.h b/source/shoh/src/threads/common/ThreadCommon.h index d8fe51f..071e2ab 100644 --- a/source/shoh/src/threads/common/ThreadCommon.h +++ b/source/shoh/src/threads/common/ThreadCommon.h @@ -11,6 +11,7 @@ #include "board.h" #include "FreeRTOS.h" #include +#include #include "queue.h" #include "task.h" #include @@ -19,6 +20,7 @@ namespace ThreadCommon { typedef enum EventType { + Null, Rotary, Temperature, Manager @@ -61,12 +63,31 @@ namespace ThreadCommon private: }; + class QueueManager + { + public: + enum Queue_id { + master_event_all, + relay_event_master, + manager_event_master, + ui_event_manager + }; + QueueManager(); + ~QueueManager() = default; + bool createQueue(size_t queue_length, size_t item_size, Queue_id qid); + QueueHandle_t getQueue(Queue_id qid); + private: + std::map queues; + }; + /* global variables */ /* 'receiver'_'what'_'sender'_q */ + /* extern QueueHandle_t master_event_all_q; extern QueueHandle_t relay_event_master_q; extern QueueHandle_t manager_event_master_q; extern QueueHandle_t ui_event_manager_q; + */ } #endif /*__THREAD_COMMON_H_*/ diff --git a/source/shoh/src/threads/master/Master.cpp b/source/shoh/src/threads/master/Master.cpp index 1ef3bc0..5549398 100644 --- a/source/shoh/src/threads/master/Master.cpp +++ b/source/shoh/src/threads/master/Master.cpp @@ -7,10 +7,18 @@ #include "Master.h" +Master::Master(ThreadCommon::QueueManager* qm) : _qm(qm) +{ + +} + void Master::taskFunction() { + QueueHandle_t master_event_all_q = _qm->getQueue(ThreadCommon::QueueManager::master_event_all); + ThreadCommon::Event* data; int led = 0; bool LedState = true; for (;;) { + xQueueReceive(master_event_all_q, static_cast(data), portMAX_DELAY); Board_LED_Set(led, LedState); LedState = (bool) !LedState; led++; @@ -23,6 +31,6 @@ void Master::taskFunction() { void master_thread(void* pvParams) { - Master m; + Master m(static_cast(pvParams)); m.taskFunction(); -} \ No newline at end of file +} diff --git a/source/shoh/src/threads/master/Master.h b/source/shoh/src/threads/master/Master.h index bcc173d..303cf59 100644 --- a/source/shoh/src/threads/master/Master.h +++ b/source/shoh/src/threads/master/Master.h @@ -16,7 +16,7 @@ class Master { public: - Master(){}; + Master(ThreadCommon::QueueManager* qm); virtual ~Master() = default; void taskFunction(); @@ -24,6 +24,7 @@ public: //Master& operator=(Master&&) noexcept = default; private: ThreadCommon::Event* message; + ThreadCommon::QueueManager* _qm; }; void master_thread(void* pvParams);