summaryrefslogtreecommitdiff
path: root/code/esp32/components/eos/at_urc.c
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2020-05-06 11:38:29 +0200
committerUros Majstorovic <majstor@majstor.org>2020-05-06 11:38:29 +0200
commit2b73dd935359e57ca32f87e3afd2435d5991685e (patch)
treee18a35cb41f018f1ad37ba2a20b4be2dc7e9b45a /code/esp32/components/eos/at_urc.c
parent03925afaa3117243a7b29fa4327ea378c3e6eee6 (diff)
at cmd processing; pppos driver
Diffstat (limited to 'code/esp32/components/eos/at_urc.c')
-rw-r--r--code/esp32/components/eos/at_urc.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/code/esp32/components/eos/at_urc.c b/code/esp32/components/eos/at_urc.c
new file mode 100644
index 0000000..b362d6f
--- /dev/null
+++ b/code/esp32/components/eos/at_urc.c
@@ -0,0 +1,109 @@
+#include <stdlib.h>
+#include <string.h>
+
+#include <freertos/FreeRTOS.h>
+#include <freertos/semphr.h>
+
+#include "eos.h"
+#include "at_urc.h"
+
+typedef struct ATURCItem {
+ regex_t re;
+ at_urc_cb_t cb;
+ char pattern[AT_SIZE_PATTERN];
+} ATURCItem;
+
+typedef struct ATURCList {
+ ATURCItem item[AT_SIZE_URC_LIST];
+ int len;
+} ATURCList;
+
+static ATURCList urc_list;
+static ATURCItem *urc_curr;
+static SemaphoreHandle_t mutex;
+
+int at_urc_process(char *urc) {
+ regmatch_t match[AT_SIZE_NMATCH];
+ at_urc_cb_t cb = NULL;
+ regmatch_t *m = NULL;
+
+ xSemaphoreTake(mutex, portMAX_DELAY);
+
+ if (urc_curr == NULL) {
+ int i;
+
+ for (i=0; i<urc_list.len; i++) {
+ if (regexec(&urc_list.item[i].re, urc, AT_SIZE_NMATCH, match, 0) == 0) {
+ urc_curr = &urc_list.item[i];
+ m = match;
+ break;
+ }
+ }
+ }
+ if (urc_curr) cb = urc_curr->cb;
+
+ xSemaphoreGive(mutex);
+
+ if (cb) {
+ int r = cb(urc, m);
+
+ if (r != AT_URC_MORE) {
+ xSemaphoreTake(mutex, portMAX_DELAY);
+ urc_curr = NULL;
+ xSemaphoreGive(mutex);
+ }
+ return 1;
+ }
+ return 0;
+}
+
+int at_urc_insert(char *pattern, at_urc_cb_t cb, int flags) {
+ int r = EOS_OK;
+
+ if (strlen(pattern) >= AT_SIZE_PATTERN) return EOS_ERR;
+
+ r = regcomp(&urc_list.item[urc_list.len].re, pattern, flags);
+ if (r) return EOS_ERR;
+
+ xSemaphoreTake(mutex, portMAX_DELAY);
+
+ if (urc_list.len == AT_SIZE_URC_LIST) r = EOS_ERR_FULL;
+
+ if (!r) {
+ strcpy(urc_list.item[urc_list.len].pattern, pattern);
+ urc_list.item[urc_list.len].cb = cb;
+ urc_list.len++;
+ }
+
+ xSemaphoreGive(mutex);
+
+ return r;
+}
+
+int at_urc_delete(char *pattern) {
+ int i;
+ int r = EOS_ERR_NOTFOUND;
+
+ xSemaphoreTake(mutex, portMAX_DELAY);
+
+ for (i=0; i<urc_list.len; i++) {
+ if ((strcmp(pattern, urc_list.item[i].pattern) == 0)) {
+ if (i != urc_list.len - 1) memmove(&urc_list.item[i], &urc_list.item[i + 1], (urc_list.len - i - 1) * sizeof(ATURCItem));
+ urc_list.len--;
+ if (urc_curr) {
+ if (urc_curr == &urc_list.item[i]) {
+ urc_curr = NULL;
+ } else if (urc_curr > &urc_list.item[i]) {
+ urc_curr--;
+ }
+ }
+
+ r = EOS_OK;
+ break;
+ }
+ }
+
+ xSemaphoreGive(mutex);
+
+ return r;
+}