diff --git a/source/shoh/.cproject b/source/shoh/.cproject index ff20bcd..9a99684 100644 --- a/source/shoh/.cproject +++ b/source/shoh/.cproject @@ -53,6 +53,7 @@ + @@ -255,6 +258,7 @@ + diff --git a/source/shoh/freertos/FreeRTOSConfig.h b/source/shoh/freertos/FreeRTOSConfig.h index ec2abf9..da1e190 100644 --- a/source/shoh/freertos/FreeRTOSConfig.h +++ b/source/shoh/freertos/FreeRTOSConfig.h @@ -91,7 +91,8 @@ #define configUSE_MALLOC_FAILED_HOOK 1 #define configUSE_APPLICATION_TASK_TAG 0 #define configUSE_COUNTING_SEMAPHORES 1 -#define configGENERATE_RUN_TIME_STATS 0 +#define configGENERATE_RUN_TIME_STATS 1 +#define configRECORD_STACK_HIGH_ADDRESS 1 #define configUSE_TICKLESS_IDLE 1 @@ -119,6 +120,16 @@ to exclude the API function. */ #define INCLUDE_vTaskDelay 1 #define INCLUDE_xTaskGetCurrentTaskHandle 1 +/* NOTE: we need to provide implementation of vConfigureTimerForRunTimeStats() + * It is called to set up high resolution timer that is needed for accurate runtime + * measurement. I assume that we use LPC_SCT1 in unified mode so this function + * must set up LPC_SCT1. + */ +void vConfigureTimerForRunTimeStats(void); +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats() +/* The value is read directly from the counter register for efficiency and low overhead. */ +#define portGET_RUN_TIME_COUNTER_VALUE() LPC_SCT1->COUNT_U + /* Cortex-M specific definitions. */ #ifdef __NVIC_PRIO_BITS /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ diff --git a/source/shoh/src/main.cpp b/source/shoh/src/main.cpp index 740e2b4..f054cb4 100644 --- a/source/shoh/src/main.cpp +++ b/source/shoh/src/main.cpp @@ -7,9 +7,8 @@ #include "ThreadCommon.h" #include "Master.h" -#include "Rotary.h" -#include "Manager.h" -#include "UserInterface.h" + + int main(void) { @@ -18,37 +17,28 @@ int main(void) retarget_init(); - printf("Hello there!\r\n"); - - ThreadCommon::ThreadManager* manager = new ThreadCommon::ThreadManager; - ThreadCommon::QueueManager* qmanager = new ThreadCommon::QueueManager; - //Creating queues - qmanager->createQueue(100, - sizeof(Event), - ThreadCommon::QueueManager::master_event_all); - qmanager->createQueue(20, - sizeof(Event), - ThreadCommon::QueueManager::manager_event_master); - qmanager->createQueue(20, - sizeof(UserInterface::InterfaceWithData), - ThreadCommon::QueueManager::ui_event_manager); - - //Creating tasks - manager->createTask(thread_master, "master", - configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, - static_cast(qmanager)); - manager->createTask(thread_manager, "manager", - configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, - static_cast(qmanager)); - manager->createTask(thread_rotary, "rotary", - configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, - static_cast(qmanager)); - manager->createTask(thread_user_interface, "user_interface", - configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, - static_cast(qmanager)); - - // Start the real time kernel with preemption. + ThreadCommon::ThreadManager *tm = new ThreadCommon::ThreadManager(); + ThreadCommon::QueueManager *qm = new ThreadCommon::QueueManager(); + ThreadCommon::CommonManagers *manager = new ThreadCommon::CommonManagers; + manager->tm = tm; + manager->qm = qm; + manager->tm->createTask(thread_master, "master", + configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, + static_cast(manager)); vTaskStartScheduler (); return 1; } + +extern "C" +{ + void + vConfigureTimerForRunTimeStats (void) + { + Chip_SCT_Init (LPC_SCT1); + LPC_SCT1->CONFIG = SCT_CONFIG_32BIT_COUNTER; + LPC_SCT1->CTRL_U = SCT_CTRL_PRE_L (255) + | SCT_CTRL_CLRCTR_L; // set prescaler to 256 (255 + + // 1), and start timer + } +} diff --git a/source/shoh/src/peripherals/DigitalIoPin.cpp b/source/shoh/src/peripherals/DigitalIoPin.cpp index 1028d3c..56f4d23 100644 --- a/source/shoh/src/peripherals/DigitalIoPin.cpp +++ b/source/shoh/src/peripherals/DigitalIoPin.cpp @@ -6,6 +6,7 @@ */ #include "DigitalIoPin.h" +#include "Log.h" DigitalIoPin::DigitalIoPin (int port, int pin, bool input, bool pullup, bool invert, bool isr, IRQn_Type isr_index) @@ -39,6 +40,8 @@ DigitalIoPin::~DigitalIoPin () void DigitalIoPin::setIoPin () { + LOG_DEBUG("P%d_%d set as %s", _io._port, _io._pin, + _io._input ? "input" : "output"); bool direction = true; if (_io._input) { @@ -62,6 +65,7 @@ DigitalIoPin::setIoPin () void DigitalIoPin::setIsr () { + LOG_DEBUG("P%d_%d set as ISR", _io._port, _io._pin); bool direction = true; if (_io._input) { diff --git a/source/shoh/src/peripherals/EEPROMio.cpp b/source/shoh/src/peripherals/EEPROMio.cpp index 26135a0..649809d 100644 --- a/source/shoh/src/peripherals/EEPROMio.cpp +++ b/source/shoh/src/peripherals/EEPROMio.cpp @@ -6,6 +6,7 @@ */ #include +#include "Log.h" static void e_memcpy (void *from, void *to, unsigned int n) @@ -57,6 +58,7 @@ EEPROMio::write_to (uint32_t addr, std::string str) { std::copy (str.begin (), str.end (), std::begin (buffer)); eeprom_use (buffer, addr, str.length (), WRITE); + LOG_DEBUG("%dB written to EEPROM", str.length ()); } void * @@ -64,6 +66,7 @@ EEPROMio::read_from (uint32_t addr, uint32_t amount) { eeprom_use (buffer, addr, amount, READ); void *data = (void *)buffer; + LOG_DEBUG("%dB read from EEPROM", amount); return data; } void @@ -72,5 +75,6 @@ EEPROMio::write_to (uint32_t addr, void *data, uint32_t size_of_data) assert (size_of_data < EEPROM_MAX_BUFER_SIZE); e_memcpy (data, buffer, size_of_data); eeprom_use (buffer, addr, size_of_data, WRITE); + LOG_DEBUG("%dB written to EEPROM", size_of_data); } diff --git a/source/shoh/src/peripherals/retarget_uart.cpp b/source/shoh/src/peripherals/retarget_uart.cpp index f30510d..7396211 100644 --- a/source/shoh/src/peripherals/retarget_uart.cpp +++ b/source/shoh/src/peripherals/retarget_uart.cpp @@ -11,7 +11,7 @@ static LpcDebugUart *dbgu; void retarget_init() { - LpcPinMap none = {-1, -1}; // unused pin has negative values in it + //LpcPinMap none = {-1, -1}; // unused pin has negative values in it //Sadly, it seems that only USART0 is redirected to USB. //It means that those are pins PIO0_18 and PIO0_19 LpcPinMap txpin = { 0, 19 }; // transmit pin that goes to debugger's UART->USB converter diff --git a/source/shoh/src/threads/common/QueueManager.cpp b/source/shoh/src/threads/common/QueueManager.cpp index 8f4c42a..9ca2293 100644 --- a/source/shoh/src/threads/common/QueueManager.cpp +++ b/source/shoh/src/threads/common/QueueManager.cpp @@ -6,6 +6,7 @@ */ #include "ThreadCommon.h" +#include "Log.h" ThreadCommon::QueueManager::QueueManager() {} diff --git a/source/shoh/src/threads/common/ThreadCommon.h b/source/shoh/src/threads/common/ThreadCommon.h index 2e6040b..0aa05c0 100644 --- a/source/shoh/src/threads/common/ThreadCommon.h +++ b/source/shoh/src/threads/common/ThreadCommon.h @@ -18,6 +18,7 @@ namespace ThreadCommon { + enum RotaryAction { Right, @@ -45,7 +46,8 @@ namespace ThreadCommon master_event_all, relay_event_master, manager_event_master, - ui_event_manager + ui_event_manager, + logging_message_all }; QueueManager(); ~QueueManager() = default; @@ -70,14 +72,11 @@ namespace ThreadCommon 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; - */ + typedef struct _CommonManagers + { + ThreadManager * tm; + QueueManager * qm; + } CommonManagers; } #endif /*__THREAD_COMMON_H_*/ diff --git a/source/shoh/src/threads/logging/Log.h b/source/shoh/src/threads/logging/Log.h new file mode 100644 index 0000000..9c64851 --- /dev/null +++ b/source/shoh/src/threads/logging/Log.h @@ -0,0 +1,88 @@ +#ifndef __THREAD_COMMON_LOG_H_ +#define __THREAD_COMMON_LOG_H_ + +#include "chip.h" +#include "board.h" +#include +#include +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +extern QueueHandle_t logging_queue; + +/* ================= Settings ================== */ +#define LOG_COLORED_OUTPUT +#define HIGH_PRIORITY_DEBUG +#define LOG_DEBUG_MESSAGES 1 +/* ================= Settings ================== */ + +// internal debug defines +#ifdef HIGH_PRIORITY_DEBUG +#include +#define INT_ASSERT(statement) assert(statement) +#else +#define INT_ASSERT(statement) +#endif + +#ifdef LOG_COLORED_OUTPUT +#define C_INFO "\x1b[34mINFO\x1b[0m" +#define C_DEBUG "\x1b[35mDEBUG\x1b[0m" +#define C_WARN "\x1b[33mWARNING\x1b[0m" +#define C_ERROR "\x1b[31mERROR\x1b[0m" +#else +#define C_INFO "INFO" +#define C_DEBUG "DEBUG" +#define C_WARN "WARNING" +#define C_ERROR "ERROR" +#endif + +#define LOG_BUFFER_MAX_CAP 256 +#define LOG_MESSAGE_MAX_CAP 150 + +#define _LOG_STREAMOUT(message, message_length) \ + INT_ASSERT(message_length > 0); \ + if (logging_queue) { \ + xQueueSend(logging_queue, (void*)message, portMAX_DELAY); \ + } + +static void create_log_line(const char * _status, + const char * _location, + const size_t _line, + const char * _fmt, ...) +{ + va_list args; + va_start(args, _fmt); + char message [LOG_BUFFER_MAX_CAP] = {0}; + int message_len = vsnprintf(message, LOG_BUFFER_MAX_CAP, _fmt, args); + va_end(args); + char buffer [LOG_BUFFER_MAX_CAP] = {0}; + int buffer_len = snprintf(buffer, LOG_BUFFER_MAX_CAP, + "[%s] [File: %s] [Line: %d] %.*s", + _status, + _location, + _line, + message_len, + message); + _LOG_STREAMOUT(buffer, buffer_len) + +} + +#define LOG_INFO(fmt, ...) \ + create_log_line(C_INFO, __FILE__, __LINE__, fmt, ##__VA_ARGS__); + +#define LOG_WARNING(fmt, ...) \ + create_log_line(C_WARN, __FILE__, __LINE__, fmt, ##__VA_ARGS__); + +#define LOG_ERROR(fmt, ...) \ + create_log_line(C_ERROR, __FILE__, __LINE__, fmt, ##__VA_ARGS__); + +#if LOG_DEBUG_MESSAGES +#define LOG_DEBUG(fmt, ...) \ + create_log_line(C_DEBUG, __FILE__, __LINE__, fmt, ##__VA_ARGS__); +#else +#define LOG_DEBUG(fmt, ...) +#endif + + +#endif /* __THREAD_COMMON_LOG_H_ */ diff --git a/source/shoh/src/threads/logging/Logging.cpp b/source/shoh/src/threads/logging/Logging.cpp new file mode 100644 index 0000000..731968e --- /dev/null +++ b/source/shoh/src/threads/logging/Logging.cpp @@ -0,0 +1,38 @@ +/* + * Logging.cpp + * + * Created on: 12 May 2023 + * Author: tylen + */ + +#include "Logging.h" +#include "ThreadCommon.h" +#include "Log.h" +#include "queue.h" + +Logging::Logging(ThreadCommon::QueueManager * qm) : _qm(qm) { + q = _qm->getQueue(ThreadCommon::QueueManager::logging_message_all); +} + +Logging::~Logging() { + // TODO Auto-generated destructor stub +} + +void Logging::taskFunction() +{ + for(;;) + { + char data[LOG_BUFFER_MAX_CAP] = {0}; + xQueueReceive(q, static_cast(data), portMAX_DELAY); + mutex.lock(); + printf("%s\n", data); + mutex.unlock(); + } +} + +void thread_logging(void* pvParams) +{ + ThreadCommon::CommonManagers * manager = static_cast(pvParams); + Logging log(manager->qm); + log.taskFunction(); +} diff --git a/source/shoh/src/threads/logging/Logging.h b/source/shoh/src/threads/logging/Logging.h new file mode 100644 index 0000000..4dd608c --- /dev/null +++ b/source/shoh/src/threads/logging/Logging.h @@ -0,0 +1,27 @@ +/* + * Logging.h + * + * Created on: 12 May 2023 + * Author: tylen + */ + +#ifndef THREADS_LOGGING_LOGGING_H_ +#define THREADS_LOGGING_LOGGING_H_ + +#include "Fmutex.h" +#include "ThreadCommon.h" + +class Logging { +public: + Logging(ThreadCommon::QueueManager * qm); + virtual ~Logging(); + void taskFunction(); +private: + ThreadCommon::QueueManager * _qm; + QueueHandle_t q; + Fmutex mutex; +}; + +void thread_logging(void* pvParams); + +#endif /* THREADS_LOGGING_LOGGING_H_ */ diff --git a/source/shoh/src/threads/manager/Manager.cpp b/source/shoh/src/threads/manager/Manager.cpp index 2f4e9ca..fafac81 100644 --- a/source/shoh/src/threads/manager/Manager.cpp +++ b/source/shoh/src/threads/manager/Manager.cpp @@ -7,15 +7,17 @@ #include "Manager.h" #include "ThreadCommon.h" +#include "Log.h" Manager::Manager(ThreadCommon::QueueManager* qm) : _qm(qm), _menu{qm} { + LOG_DEBUG("Creating Manager"); } Manager::~Manager() { - // TODO Auto-generated destructor stub + LOG_ERROR("Deleting Manager"); } Event::EventPair Manager::parseEvent(Event* e) @@ -32,6 +34,7 @@ Event::EventPair Manager::parseEvent(Event* e) return p; } } + LOG_WARNING("Event is empty"); return {ERROR_RETURN, Event::Null}; } @@ -49,6 +52,7 @@ void Manager::taskFunction() void thread_manager(void* pvParams) { - Manager m(static_cast(pvParams)); + ThreadCommon::CommonManagers * manager = static_cast(pvParams); + Manager m(manager->qm); m.taskFunction(); } diff --git a/source/shoh/src/threads/manager/Menu.cpp b/source/shoh/src/threads/manager/Menu.cpp index b7765f1..0415721 100644 --- a/source/shoh/src/threads/manager/Menu.cpp +++ b/source/shoh/src/threads/manager/Menu.cpp @@ -8,12 +8,14 @@ #include "Menu.h" #include #include "UserInterface.h" +#include "Log.h" Menu::Menu(ThreadCommon::QueueManager* qm): _qm(qm), current(&Menu::sInitView), ext_temp(-99, 99, 1), set_point(-99, 99, 1), main_text ("CURRENT %3d DESIRED %3d "), set_point_text("CURRENT %3d DESIRED[%3d] ") { + LOG_DEBUG("Creating Menu"); this->SetState(&Menu::sInitView); ext_temp.setCurrent(0); set_point.setCurrent(0); @@ -21,6 +23,7 @@ set_point_text("CURRENT %3d DESIRED[%3d] ") Menu::~Menu() { + LOG_DEBUG("Deleting Menu"); } void Menu::HandleEventPair (Event::EventPair *ep) @@ -71,10 +74,11 @@ void Menu::sInitView(const MenuObjEvent &e) switch (e.type) { case MenuObjEvent::eFocus: + LOG_DEBUG("enter sInitView"); this->NotifyAndRefreshUI("Loading..."); break; case MenuObjEvent::eUnFocus: - printf("NOTE: leave sInitView\n"); + LOG_DEBUG("leave sInitView"); this->NotifyAndRefreshUI(""); break; case MenuObjEvent::eRollClockWise: @@ -82,10 +86,11 @@ void Menu::sInitView(const MenuObjEvent &e) case MenuObjEvent::eRollCClockWise: break; case MenuObjEvent::eClick: + LOG_DEBUG("click sInitView"); this->SetState(&Menu::sMainView); break; case MenuObjEvent::eRefresh: - printf("NOTE: sInitView handled eRefresh.\n"); + LOG_DEBUG("refersh sInitView"); this->SetState(&Menu::sMainView); break; default: @@ -99,11 +104,13 @@ void Menu::sMainView(const MenuObjEvent &e) switch (e.type) { case MenuObjEvent::eFocus: + LOG_DEBUG("enter sMainView"); sprintf(screen_text, main_text, this->ext_temp.getCurrent(), this->set_point.getCurrent()); this->NotifyAndRefreshUI(screen_text); break; case MenuObjEvent::eUnFocus: + LOG_DEBUG("leave sMainView"); this->NotifyAndRefreshUI(""); break; case MenuObjEvent::eRollClockWise: @@ -111,11 +118,13 @@ void Menu::sMainView(const MenuObjEvent &e) case MenuObjEvent::eRollCClockWise: break; case MenuObjEvent::eClick: + LOG_DEBUG("click sMainView"); this->SetState(&Menu::sSetPointMod); break; case MenuObjEvent::eRefresh: sprintf(screen_text, main_text, this->ext_temp.getCurrent(), this->set_point.getCurrent()); + LOG_DEBUG("refresh sMainView"); this->NotifyAndRefreshUI(screen_text); break; default: @@ -129,11 +138,13 @@ void Menu::sSetPointMod(const MenuObjEvent &e) switch (e.type) { case MenuObjEvent::eFocus: + LOG_DEBUG("enter sSetPointMod"); sprintf(screen_text, set_point_text, this->ext_temp.getCurrent(), this->set_point.getCurrent()); this->NotifyAndRefreshUI(screen_text); break; case MenuObjEvent::eUnFocus: + LOG_DEBUG("leave sSetPointMod"); this->NotifyAndRefreshUI(""); break; case MenuObjEvent::eRollClockWise: @@ -149,9 +160,11 @@ void Menu::sSetPointMod(const MenuObjEvent &e) this->NotifyAndRefreshUI(screen_text); break; case MenuObjEvent::eClick: + LOG_DEBUG("click sSetPointMod"); this->SetState(&Menu::sMainView); break; case MenuObjEvent::eRefresh: + LOG_DEBUG("refresh sSetPointMod"); sprintf(screen_text, set_point_text, this->ext_temp.getCurrent(), this->set_point.getCurrent()); this->NotifyAndRefreshUI(screen_text); diff --git a/source/shoh/src/threads/master/Master.cpp b/source/shoh/src/threads/master/Master.cpp index 775771b..dbc1774 100644 --- a/source/shoh/src/threads/master/Master.cpp +++ b/source/shoh/src/threads/master/Master.cpp @@ -6,6 +6,14 @@ */ #include "Master.h" +#include "Log.h" +#include "ThreadCommon.h" +#include "Rotary.h" +#include "Manager.h" +#include "Logging.h" +#include "UserInterface.h" +#include "queue.h" +#include "Logging.h" static const char* rotary_direction[] = { @@ -15,9 +23,11 @@ static const char* rotary_direction[] = "Idle" }; +QueueHandle_t logging_queue; + Master::Master(ThreadCommon::QueueManager* qm) : _qm(qm) { - + LOG_DEBUG("Creating Master"); } void Master::HandleEventType(Event* e, Event::EventType type) @@ -29,6 +39,7 @@ void Master::HandleEventType(Event* e, Event::EventType type) case Event::Rotary: //Comes from rotary, goes to manager _qm->send(ThreadCommon::QueueManager::manager_event_master, e, 0); + LOG_DEBUG("Rotary: %s has been forwarded to manager", rotary_direction[e->getDataOf(type)]); break; case Event::InternalTemp: // TODO remove (deprecated) @@ -37,10 +48,12 @@ void Master::HandleEventType(Event* e, Event::EventType type) //Comes from sensors, goes to relay & manager _qm->send(ThreadCommon::QueueManager::relay_event_master, e, 0); _qm->send(ThreadCommon::QueueManager::manager_event_master, e, 0); + LOG_DEBUG("ExtTemp: %d has been forwarded to manager and relay", e->getDataOf(type)); break; case Event::SetPoint: //Comes from manager, goes to relay _qm->send(ThreadCommon::QueueManager::relay_event_master, e, 0); + LOG_DEBUG("SetPoint: %d has been forwarded to relay", e->getDataOf(type)); break; default: assert(0); @@ -71,6 +84,43 @@ void Master::taskFunction() { void thread_master(void* pvParams) { - Master m(static_cast(pvParams)); + ThreadCommon::CommonManagers * manager = static_cast(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 * 10,tskIDLE_PRIORITY + 1UL, + static_cast(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); + LOG_INFO("Master created queues"); + + + LOG_INFO("Master is creating tasks"); + manager->tm->createTask(thread_manager, "manager", + configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, + static_cast(manager)); + manager->tm->createTask(thread_rotary, "rotary", + configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, + static_cast(manager)); + manager->tm->createTask(thread_user_interface, "user_interface", + configMINIMAL_STACK_SIZE * 10,tskIDLE_PRIORITY + 1UL, + static_cast(manager)); + LOG_INFO("Master created tasks"); m.taskFunction(); } diff --git a/source/shoh/src/threads/master/Master.h b/source/shoh/src/threads/master/Master.h index b0ae831..14c44a0 100644 --- a/source/shoh/src/threads/master/Master.h +++ b/source/shoh/src/threads/master/Master.h @@ -10,6 +10,8 @@ #include "chip.h" #include "board.h" +#include "FreeRTOS.h" +#include "task.h" #include "ThreadCommon.h" #include "Event.h" #include "task.h" diff --git a/source/shoh/src/threads/rotary/Rotary.cpp b/source/shoh/src/threads/rotary/Rotary.cpp index eb9f19d..a161c5b 100644 --- a/source/shoh/src/threads/rotary/Rotary.cpp +++ b/source/shoh/src/threads/rotary/Rotary.cpp @@ -8,6 +8,7 @@ #include "Rotary.h" #include "board.h" #include "queue.h" +#include "Log.h" static QueueHandle_t * p_rotary_isr_q; @@ -20,6 +21,10 @@ extern "C" portBASE_TYPE xHigherPriorityWoken = pdFALSE; uint8_t data = ThreadCommon::RotaryAction::Right; xQueueSendFromISR (*p_rotary_isr_q, &data, &xHigherPriorityWoken); + if(!xHigherPriorityWoken) + { + LOG_WARNING("[PIN_INT0_IRQn] portEND_SWITCHING_ISR called with False value"); + } portEND_SWITCHING_ISR(xHigherPriorityWoken); } @@ -30,6 +35,10 @@ extern "C" portBASE_TYPE xHigherPriorityWoken = pdFALSE; uint8_t data = ThreadCommon::RotaryAction::Left; xQueueSendFromISR (*p_rotary_isr_q, &data, &xHigherPriorityWoken); + if(!xHigherPriorityWoken) + { + LOG_WARNING("[PIN_INT1_IRQn] portEND_SWITCHING_ISR called with False value"); + } portEND_SWITCHING_ISR(xHigherPriorityWoken); } @@ -40,16 +49,23 @@ extern "C" portBASE_TYPE xHigherPriorityWoken = pdFALSE; uint8_t data = ThreadCommon::RotaryAction::Press; xQueueSendFromISR (*p_rotary_isr_q, &data, &xHigherPriorityWoken); + if(!xHigherPriorityWoken) + { + LOG_WARNING("[PIN_INT2_IRQn] portEND_SWITCHING_ISR called with False value"); + } portEND_SWITCHING_ISR(xHigherPriorityWoken); } } Rotary::Rotary(ThreadCommon::QueueManager* qm) : _qm(qm) { - + LOG_DEBUG("Creating Rotary"); } -Rotary::~Rotary() {} +Rotary::~Rotary() +{ + LOG_ERROR("Deleting Rotary"); +} void Rotary::taskFunction() { @@ -70,6 +86,7 @@ void thread_rotary(void* pvParams) QueueHandle_t rotary_isr_q = xQueueCreate(15, sizeof(char)); p_rotary_isr_q = &rotary_isr_q; - Rotary r(static_cast(pvParams)); + ThreadCommon::CommonManagers * manager = static_cast(pvParams); + Rotary r(manager->qm); r.taskFunction(); } diff --git a/source/shoh/src/threads/user_interface/UserInterface.cpp b/source/shoh/src/threads/user_interface/UserInterface.cpp index bafd5d4..4ea61c0 100644 --- a/source/shoh/src/threads/user_interface/UserInterface.cpp +++ b/source/shoh/src/threads/user_interface/UserInterface.cpp @@ -5,16 +5,19 @@ */ #include "UserInterface.h" +#include "Log.h" #include UserInterface::UserInterface(ThreadCommon::QueueManager* qm) : _qm(qm), lcd1(nullptr) { + LOG_DEBUG("Creating UserInterface"); this->initLCD1(); } UserInterface::~UserInterface() { + LOG_ERROR("Deleting UserInterface"); delete this->lcd1; delete this->lcd1_rs; delete this->lcd1_en; @@ -45,7 +48,7 @@ void UserInterface::handleEvent(InterfaceWithData* ui_data) break; default: //Should never happen. - printf("WARNING: [UserInterface::handleEvent] executed default case.\n"); + LOG_ERROR("[UserInterface::handleEvent] executed default case"); break; } } @@ -57,13 +60,16 @@ void UserInterface::handleEvent(InterfaceWithData* ui_data) void UserInterface::handleLCD(LiquidCrystal *lcd, const char *str) { //Interpret empty string as clear. - if(!strlen(str)) + if(!strlen(str)){ lcd->clear(); + LOG_DEBUG("Clear up LCD"); //Print the text otherwise. + } else { lcd->setCursor(0, 0); lcd->print(str); + LOG_DEBUG("Printing [%s] on LCD", str); } } @@ -92,6 +98,7 @@ void UserInterface::initLCD1() void thread_user_interface(void* pvParams) { - UserInterface ui(static_cast(pvParams)); + ThreadCommon::CommonManagers * manager = static_cast(pvParams); + UserInterface ui(manager->qm); ui.taskFunction(); }