#include #include #include #include #include #include #include "eos.h" #include "cell.h" #include "at_cmd.h" static const char *TAG = "EOS ATCMD"; 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 SemaphoreHandle_t mutex; static char at_buf[EOS_CELL_UART_SIZE_BUF]; void at_init(void) { memset(&urc_list, 0, sizeof(ATURCList)); mutex = xSemaphoreCreateBinary(); xSemaphoreGive(mutex); } int at_urc_process(char *urc) { regmatch_t match[AT_SIZE_NMATCH]; at_urc_cb_t cb = NULL; int i; if (urc[0] == '\0') return 0; xSemaphoreTake(mutex, portMAX_DELAY); for (i=0; i= AT_SIZE_PATTERN) return EOS_ERR; xSemaphoreTake(mutex, portMAX_DELAY); r = regcomp(&urc_list.item[urc_list.len].re, pattern, flags); if (r) rv = EOS_ERR; if (!rv && (urc_list.len == AT_SIZE_URC_LIST)) rv = EOS_ERR_FULL; if (!rv) { strcpy(urc_list.item[urc_list.len].pattern, pattern); urc_list.item[urc_list.len].cb = cb; urc_list.len++; } xSemaphoreGive(mutex); return rv; } int at_urc_delete(char *pattern) { int i; int rv = EOS_ERR_NOTFOUND; xSemaphoreTake(mutex, portMAX_DELAY); for (i=0; i timeout)) { if (str_ok) regfree(&re_ok); if (str_err) regfree(&re_err); return EOS_ERR_TIMEOUT; } } while (1); }