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 @@
+
@@ -85,6 +86,7 @@
+
@@ -105,6 +107,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();
}