summaryrefslogtreecommitdiff
path: root/fw
diff options
context:
space:
mode:
Diffstat (limited to 'fw')
-rw-r--r--fw/esp32/components/eos/cell.c64
-rw-r--r--fw/esp32/components/eos/include/eos.h2
2 files changed, 65 insertions, 1 deletions
diff --git a/fw/esp32/components/eos/cell.c b/fw/esp32/components/eos/cell.c
index c2e03e1..11a96e8 100644
--- a/fw/esp32/components/eos/cell.c
+++ b/fw/esp32/components/eos/cell.c
@@ -1,15 +1,31 @@
#include <stdlib.h>
#include <stdint.h>
+#include <string.h>
+#include <freertos/FreeRTOS.h>
+#include <freertos/semphr.h>
+#include <freertos/task.h>
+#include <freertos/queue.h>
#include <esp_log.h>
#include "eos.h"
+#include "msgq.h"
#include "net.h"
#include "cell.h"
+#define CELL_SIZE_QUEUE 2
+
+static const char *TAG = "EOS CELL";
+
static uint8_t cell_mode;
-static void cell_handler(unsigned char _mtype, unsigned char *buffer, uint16_t size) {
+static EOSBufQ cell_buf_q;
+static unsigned char *cell_bufq_array[CELL_SIZE_QUEUE];
+
+static SemaphoreHandle_t mutex;
+static QueueHandle_t cell_queue;
+
+static void _cell_handler(unsigned char _mtype, unsigned char *buffer, uint16_t size) {
uint8_t mtype;
if (size < 1) return;
@@ -62,7 +78,53 @@ static void cell_handler(unsigned char _mtype, unsigned char *buffer, uint16_t s
}
}
+static void cell_handler_task(void *pvParameters) {
+ EOSMsgItem mi;
+
+ while (1) {
+ if (xQueueReceive(cell_queue, &mi, portMAX_DELAY)) {
+ _cell_handler(mi.type, mi.buffer, mi.len);
+ xSemaphoreTake(mutex, portMAX_DELAY);
+ eos_bufq_push(&cell_buf_q, mi.buffer);
+ xSemaphoreGive(mutex);
+ }
+ }
+ vTaskDelete(NULL);
+}
+
+static void cell_handler(unsigned char type, unsigned char *buffer, uint16_t len) {
+ EOSMsgItem mi;
+ unsigned char *buf;
+
+ xSemaphoreTake(mutex, portMAX_DELAY);
+ buf = eos_bufq_pop(&cell_buf_q);
+ xSemaphoreGive(mutex);
+
+ if (buf == NULL) {
+ ESP_LOGE(TAG, "Cell message NOT handled: %2x", type);
+ return;
+ }
+
+ memcpy(buf, buffer, len);
+ mi.type = type;
+ mi.buffer = buf;
+ mi.len = len;
+ xQueueSend(cell_queue, &mi, portMAX_DELAY);
+}
+
void eos_cell_init(void) {
+ int i;
+
+ eos_bufq_init(&cell_buf_q, cell_bufq_array, CELL_SIZE_QUEUE);
+ for (i=0; i<CELL_SIZE_QUEUE; i++) {
+ eos_bufq_push(&cell_buf_q, malloc(EOS_NET_SIZE_BUF));
+ }
+
+ mutex = xSemaphoreCreateBinary();
+ xSemaphoreGive(mutex);
+ cell_queue = xQueueCreate(CELL_SIZE_QUEUE, sizeof(EOSMsgItem));
+ xTaskCreate(cell_handler_task, "cell_handler", EOS_TASK_SSIZE_CELL, NULL, EOS_TASK_PRIORITY_CELL, NULL);
+
eos_net_set_handler(EOS_NET_MTYPE_CELL, cell_handler);
}
diff --git a/fw/esp32/components/eos/include/eos.h b/fw/esp32/components/eos/include/eos.h
index 0e660fb..7240c83 100644
--- a/fw/esp32/components/eos/include/eos.h
+++ b/fw/esp32/components/eos/include/eos.h
@@ -13,6 +13,7 @@
#define EOS_TASK_PRIORITY_NET_XCHG 1
#define EOS_TASK_PRIORITY_UDP_RCVR 1
#define EOS_TASK_PRIORITY_PWR 1
+#define EOS_TASK_PRIORITY_CELL 1
#define EOS_TASK_SSIZE_UART 4096
#define EOS_TASK_SSIZE_MODEM 4096
@@ -20,4 +21,5 @@
#define EOS_TASK_SSIZE_NET_XCHG 8192
#define EOS_TASK_SSIZE_UDP_RCVR 4096
#define EOS_TASK_SSIZE_PWR 4096
+#define EOS_TASK_SSIZE_CELL 4096