From 5f794074e4aba1d43889c230dcdded00fde1bd16 Mon Sep 17 00:00:00 2001
From: Rahix <rahix@rahix.de>
Date: Wed, 14 Aug 2019 22:14:09 +0200
Subject: [PATCH] chore(epicardium): Move dispatcher into own module

Also add a mutex around API calls in preparation for future changes.

Signed-off-by: Rahix <rahix@rahix.de>
---
 epicardium/main.c               | 15 ---------------
 epicardium/modules/dispatcher.c | 34 +++++++++++++++++++++++++++++++++
 epicardium/modules/meson.build  |  1 +
 epicardium/modules/modules.h    |  9 ++++++++-
 4 files changed, 43 insertions(+), 16 deletions(-)
 create mode 100644 epicardium/modules/dispatcher.c

diff --git a/epicardium/main.c b/epicardium/main.c
index 84abf8d9..cd989f4c 100644
--- a/epicardium/main.c
+++ b/epicardium/main.c
@@ -31,21 +31,6 @@ TaskHandle_t dispatcher_task_id;
 
 void vBleTask(void *pvParameters);
 
-/*
- * API dispatcher task.  This task will sleep until an API call is issued and
- * then wake up to dispatch it.
- */
-void vApiDispatcher(void *pvParameters)
-{
-	LOG_DEBUG("dispatcher", "Ready.");
-	while (1) {
-		if (api_dispatcher_poll()) {
-			api_dispatcher_exec();
-		}
-		ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
-	}
-}
-
 int main(void)
 {
 	LOG_INFO("startup", "Epicardium startup ...");
diff --git a/epicardium/modules/dispatcher.c b/epicardium/modules/dispatcher.c
new file mode 100644
index 00000000..60f1c1f8
--- /dev/null
+++ b/epicardium/modules/dispatcher.c
@@ -0,0 +1,34 @@
+#include "modules/log.h"
+
+#include "api/dispatcher.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+#include "semphr.h"
+
+#define TIMEOUT pdMS_TO_TICKS(2000)
+
+static StaticSemaphore_t api_mutex_data;
+SemaphoreHandle_t api_mutex = NULL;
+
+/*
+ * API dispatcher task.  This task will sleep until an API call is issued and
+ * then wake up to dispatch it.
+ */
+void vApiDispatcher(void *pvParameters)
+{
+	api_mutex = xSemaphoreCreateMutexStatic(&api_mutex_data);
+
+	LOG_DEBUG("dispatcher", "Ready.");
+	while (1) {
+		if (api_dispatcher_poll()) {
+			if (xSemaphoreTake(api_mutex, TIMEOUT) != pdTRUE) {
+				LOG_ERR("dispatcher", "API mutex blocked");
+				continue;
+			}
+			api_dispatcher_exec();
+			xSemaphoreGive(api_mutex);
+		}
+		ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
+	}
+}
diff --git a/epicardium/modules/meson.build b/epicardium/modules/meson.build
index b3cf4eb2..9a70957d 100644
--- a/epicardium/modules/meson.build
+++ b/epicardium/modules/meson.build
@@ -1,4 +1,5 @@
 module_sources = files(
+  'dispatcher.c',
   'display.c',
   'fileops.c',
   'leds.c',
diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h
index 4a7bc255..ea2a313f 100644
--- a/epicardium/modules/modules.h
+++ b/epicardium/modules/modules.h
@@ -1,12 +1,19 @@
 #ifndef MODULES_H
 #define MODULES_H
 
+#include "FreeRTOS.h"
+#include "semphr.h"
+
 #include <stdint.h>
 
+/* ---------- Dispatcher --------------------------------------------------- */
+void vApiDispatcher(void *pvParameters);
+extern SemaphoreHandle_t api_mutex;
+extern TaskHandle_t dispatcher_task_id;
+
 /* ---------- Serial ------------------------------------------------------- */
 #define SERIAL_READ_BUFFER_SIZE 128
 void vSerialTask(void *pvParameters);
-
 void serial_enqueue_char(char chr);
 
 /* ---------- PMIC --------------------------------------------------------- */
-- 
GitLab