commit
cdcb13bc1f
@ -11,10 +11,25 @@ int main(void)
|
|||||||
{
|
{
|
||||||
SystemCoreClockUpdate();
|
SystemCoreClockUpdate();
|
||||||
Board_Init();
|
Board_Init();
|
||||||
ThreadCommon::ThreadManager manager;
|
ThreadCommon::ThreadManager* manager = new ThreadCommon::ThreadManager;
|
||||||
manager.createTask(master_thread, "master",
|
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,
|
configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL,
|
||||||
nullptr);
|
static_cast<void*>(qmanager));
|
||||||
|
|
||||||
|
//<Queue_test>
|
||||||
|
QueueHandle_t master_event_all_q = qmanager->getQueue(ThreadCommon::QueueManager::master_event_all);
|
||||||
|
ThreadCommon::Event* e = new ThreadCommon::Event(ThreadCommon::Rotary, 1);
|
||||||
|
|
||||||
|
qmanager->send<ThreadCommon::Event>(ThreadCommon::QueueManager::master_event_all, e, 1000);
|
||||||
|
//</Queue_test>
|
||||||
|
|
||||||
// Start the real time kernel with preemption.
|
// Start the real time kernel with preemption.
|
||||||
//FreeRTOS::Kernel::startScheduler();
|
//FreeRTOS::Kernel::startScheduler();
|
||||||
vTaskStartScheduler ();
|
vTaskStartScheduler ();
|
||||||
|
|||||||
32
source/shoh/src/threads/common/QueueManager.cpp
Normal file
32
source/shoh/src/threads/common/QueueManager.cpp
Normal file
@ -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);
|
||||||
|
}
|
||||||
@ -11,6 +11,7 @@
|
|||||||
#include "board.h"
|
#include "board.h"
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <map>
|
||||||
#include "queue.h"
|
#include "queue.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -19,6 +20,7 @@ namespace ThreadCommon
|
|||||||
{
|
{
|
||||||
typedef enum EventType
|
typedef enum EventType
|
||||||
{
|
{
|
||||||
|
Null,
|
||||||
Rotary,
|
Rotary,
|
||||||
Temperature,
|
Temperature,
|
||||||
Manager
|
Manager
|
||||||
@ -61,12 +63,46 @@ namespace ThreadCommon
|
|||||||
private:
|
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);
|
||||||
|
template<class T> bool send(Queue_id qid, T* data, TickType_t timeout){
|
||||||
|
QueueHandle_t q = this->getQueue(qid);
|
||||||
|
BaseType_t qCheck = xQueueSend(q,
|
||||||
|
static_cast<void*>(data),
|
||||||
|
timeout);
|
||||||
|
return (qCheck == pdTRUE);
|
||||||
|
}
|
||||||
|
template<class T> bool receive(Queue_id qid, T* data, TickType_t timeout){
|
||||||
|
QueueHandle_t q = this->getQueue(qid);
|
||||||
|
BaseType_t qCheck = xQueueReceive(q,
|
||||||
|
static_cast<void*>(data),
|
||||||
|
timeout);
|
||||||
|
return (qCheck == pdTRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::map <Queue_id, QueueHandle_t> queues;
|
||||||
|
};
|
||||||
|
|
||||||
/* global variables */
|
/* global variables */
|
||||||
/* 'receiver'_'what'_'sender'_q */
|
/* 'receiver'_'what'_'sender'_q */
|
||||||
|
/*
|
||||||
extern QueueHandle_t master_event_all_q;
|
extern QueueHandle_t master_event_all_q;
|
||||||
extern QueueHandle_t relay_event_master_q;
|
extern QueueHandle_t relay_event_master_q;
|
||||||
extern QueueHandle_t manager_event_master_q;
|
extern QueueHandle_t manager_event_master_q;
|
||||||
extern QueueHandle_t ui_event_manager_q;
|
extern QueueHandle_t ui_event_manager_q;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*__THREAD_COMMON_H_*/
|
#endif /*__THREAD_COMMON_H_*/
|
||||||
|
|||||||
@ -7,22 +7,25 @@
|
|||||||
|
|
||||||
#include "Master.h"
|
#include "Master.h"
|
||||||
|
|
||||||
|
Master::Master(ThreadCommon::QueueManager* qm) : _qm(qm)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void Master::taskFunction() {
|
void Master::taskFunction() {
|
||||||
|
ThreadCommon::Event data(ThreadCommon::Null, 0);
|
||||||
int led = 0;
|
int led = 0;
|
||||||
bool LedState = true;
|
bool LedState = true;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
_qm->receive<ThreadCommon::Event>(ThreadCommon::QueueManager::master_event_all, &data, portMAX_DELAY);
|
||||||
|
if(data.getData() == 1 && data.getType() == ThreadCommon::EventType::Rotary){
|
||||||
Board_LED_Set(led, LedState);
|
Board_LED_Set(led, LedState);
|
||||||
LedState = (bool) !LedState;
|
|
||||||
led++;
|
|
||||||
if(led > 2){
|
|
||||||
led = 0;
|
|
||||||
}
|
}
|
||||||
vTaskDelay(1000);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void master_thread(void* pvParams) {
|
void master_thread(void* pvParams) {
|
||||||
Master m;
|
Master m(static_cast<ThreadCommon::QueueManager*>(pvParams));
|
||||||
m.taskFunction();
|
m.taskFunction();
|
||||||
}
|
}
|
||||||
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
class Master {
|
class Master {
|
||||||
public:
|
public:
|
||||||
Master(){};
|
Master(ThreadCommon::QueueManager* qm);
|
||||||
virtual ~Master() = default;
|
virtual ~Master() = default;
|
||||||
void taskFunction();
|
void taskFunction();
|
||||||
|
|
||||||
@ -24,6 +24,7 @@ public:
|
|||||||
//Master& operator=(Master&&) noexcept = default;
|
//Master& operator=(Master&&) noexcept = default;
|
||||||
private:
|
private:
|
||||||
ThreadCommon::Event* message;
|
ThreadCommon::Event* message;
|
||||||
|
ThreadCommon::QueueManager* _qm;
|
||||||
};
|
};
|
||||||
|
|
||||||
void master_thread(void* pvParams);
|
void master_thread(void* pvParams);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user