2023-05-18 23:54:22 +03:00

142 lines
4.1 KiB
C++

/*
* Master.cpp
*
* Created on: 4 Apr 2023
* Author: tylen
*/
#include "Master.h"
#include "Log.h"
#include "ThreadCommon.h"
#include "Rotary.h"
#include "Relay.h"
#include "Manager.h"
#include "Logging.h"
#include "UserInterface.h"
#include "Temperature.h"
#include "queue.h"
static const char* rotary_direction[] =
{
"Right",
"Left",
"Press",
"Idle"
};
QueueHandle_t logging_queue;
Clock *global_clock = new Clock();
Master::Master(ThreadCommon::QueueManager* qm) : _qm(qm)
{
LOG_DEBUG("Creating Master");
}
Master::~Master()
{
LOG_ERROR("Master was deleted");
}
void Master::HandleEventType(Event* e)
{
EventRawData rd = e->getData();
bool send = false;
switch (e->getType())
{
case Event::Null:
LOG_ERROR("Master recieved Event::Null with data: %d", rd);
break;
case Event::Rotary:
//Comes from rotary, goes to manager
send = _qm->send<Event>(ThreadCommon::QueueManager::manager_event_master, e, 0);
//LOG_WARNING("Timestamp: %zus, Clock: %zu, Chip freq: %zu", LPC_SCT1->COUNT_U / Chip_Clock_GetMainClockRate(), LPC_SCT1->COUNT_U, Chip_Clock_GetMainClockRate());
if (send) LOG_DEBUG("Rotary: %s has been forwarded to manager", rotary_direction[rd]);
break;
case Event::InternalTemp:
// TODO remove (deprecated)
break;
case Event::ExternalTemp:
//Comes from sensors, goes to relay & manager
send = _qm->send<Event>(ThreadCommon::QueueManager::relay_event_master, e, 0);
send = _qm->send<Event>(ThreadCommon::QueueManager::manager_event_master, e, 0);
if (send) LOG_DEBUG("ExtTemp: %d has been forwarded to manager and relay", rd);
break;
case Event::SetPoint:
//Comes from manager, goes to relay
send = _qm->send<Event>(ThreadCommon::QueueManager::relay_event_master, e, 0);
if (send) LOG_DEBUG("SetPoint: %d has been forwarded to relay", rd);
break;
default:
LOG_ERROR("Unknown EventType");
assert(0);
break;
}
}
void Master::taskFunction() {
Event data(Event::Null, 0);
for (;;)
{
if(!_qm->receive<Event>(ThreadCommon::QueueManager::master_event_all, &data, 10000))
{
data.setEvent(Event::Rotary, ThreadCommon::RotaryAction::Idle);
}
HandleEventType(&data);
global_clock->updateClock();
}
}
void thread_master(void* pvParams) {
ThreadCommon::CommonManagers * manager = static_cast<ThreadCommon::CommonManagers*>(pvParams);
manager->qm->createQueue(5,
LOG_BUFFER_MAX_CAP,
ThreadCommon::QueueManager::logging_message_all);
logging_queue = manager->qm->getQueue(ThreadCommon::QueueManager::logging_message_all);
manager->tm->createTask(thread_logging, "logging",
configMINIMAL_STACK_SIZE * 9,tskIDLE_PRIORITY + 1UL,
static_cast<void*>(manager));
LOG_INFO("Logging Active");
LOG_INFO("Started the real time kernel with preemption");
LOG_INFO("Master Started");
Master m(manager->qm);
LOG_INFO("Master is creating queues");
manager->qm->createQueue(100,
sizeof(Event),
ThreadCommon::QueueManager::master_event_all);
manager->qm->createQueue(20,
sizeof(Event),
ThreadCommon::QueueManager::manager_event_master);
manager->qm->createQueue(20,
sizeof(UserInterface::InterfaceWithData),
ThreadCommon::QueueManager::ui_event_manager);
manager->qm->createQueue(10,
sizeof(Event),
ThreadCommon::QueueManager::relay_event_master);
LOG_INFO("Master created queues");
LOG_INFO("Master is creating tasks");
manager->tm->createTask(thread_manager, "manager",
configMINIMAL_STACK_SIZE * 13,tskIDLE_PRIORITY + 1UL,
static_cast<void*>(manager));
manager->tm->createTask(thread_rotary, "rotary",
configMINIMAL_STACK_SIZE * 8,tskIDLE_PRIORITY + 1UL,
static_cast<void*>(manager));
manager->tm->createTask(thread_user_interface, "user_interface",
configMINIMAL_STACK_SIZE * 8,tskIDLE_PRIORITY + 1UL,
static_cast<void*>(manager));
manager->tm->createTask(thread_relay, "relay",
configMINIMAL_STACK_SIZE * 8,tskIDLE_PRIORITY + 1UL,
static_cast<void*>(manager));
manager->tm->createTask(thread_temperature, "temperature",
configMINIMAL_STACK_SIZE * 8,tskIDLE_PRIORITY + 1UL,
static_cast<void*>(manager));
LOG_INFO("Master created tasks");
m.taskFunction();
}