diff options
Diffstat (limited to 'code/esp32/components/eos/cell_modem.c')
-rw-r--r-- | code/esp32/components/eos/cell_modem.c | 78 |
1 files changed, 65 insertions, 13 deletions
diff --git a/code/esp32/components/eos/cell_modem.c b/code/esp32/components/eos/cell_modem.c index 7e3131f..26748a1 100644 --- a/code/esp32/components/eos/cell_modem.c +++ b/code/esp32/components/eos/cell_modem.c @@ -8,19 +8,33 @@ #include <driver/gpio.h> #include <esp_log.h> - #include "eos.h" +#include "net.h" +#include "cell.h" + +#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) +#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) + +#define UART_BUF_SIZE 1024 -#define BUF_SIZE 1024 +#define UART_GPIO_TXD 16 +#define UART_GPIO_RXD 17 #define UART_GPIO_DTR 32 +#define UART_GPIO_RI 35 + + +#define UART_EVENT_MODE_NONE 0 +#define UART_EVENT_MODE_PPP 1 +#define UART_EVENT_MODE_RELAY 2 + static QueueHandle_t uart_queue; +// static uint8_t *uart_data[UART_BUF_SIZE]; static void uart_event_task(void *pvParameters) { + char mode = 0; uart_event_t event; size_t len; - - // Reserve a buffer and process incoming data - uint8_t *data = (uint8_t *) malloc(BUF_SIZE); + unsigned char *buf; while (1) { /* Waiting for UART event. @@ -30,22 +44,51 @@ static void uart_event_task(void *pvParameters) { case UART_DATA: /* Event of UART receiving data */ - len = 0; - uart_get_buffered_data_len(UART_NUM_2, &len); - if (len) { - len = uart_read_bytes(UART_NUM_2, data, len, 100 / portTICK_RATE_MS); - // eos_net_send(EOS_FE310_CMD_MODEM_DATA, data, len); + switch (mode) { + case UART_EVENT_MODE_PPP: + break; + + case UART_EVENT_MODE_RELAY: + buf = eos_net_alloc(); + buf[0] = EOS_CELL_MTYPE_DATA; + len = uart_read_bytes(UART_NUM_2, buf+1, MIN(event.size, EOS_NET_SIZE_BUF-1), 100 / portTICK_RATE_MS); + eos_net_send(EOS_NET_MTYPE_CELL, buf, len, 0); + break; + + default: + break; } + + case UART_EVENT_MAX: + /* Mode change + */ + mode = (char)event.size; break; + default: break; } } } - free(data); vTaskDelete(NULL); } +static void modem_handler(unsigned char _mtype, unsigned char *buffer, uint16_t size) { + uint8_t mtype = buffer[0]; + + switch (mtype) { + case EOS_CELL_MTYPE_DATA: + eos_modem_write(buffer+1, size-1); + break; + case EOS_CELL_MTYPE_DATA_START: + eos_modem_set_mode(UART_EVENT_MODE_RELAY); + break; + case EOS_CELL_MTYPE_DATA_STOP: + eos_modem_set_mode(0); + break; + } +} + void eos_modem_init(void) { /* Configure parameters of an UART driver, * communication pins and install the driver */ @@ -57,8 +100,8 @@ void eos_modem_init(void) { .flow_ctrl = UART_HW_FLOWCTRL_DISABLE }; uart_param_config(UART_NUM_2, &uart_config); - uart_set_pin(UART_NUM_2, 17, 16, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); - uart_driver_install(UART_NUM_2, BUF_SIZE, BUF_SIZE, 10, &uart_queue, 0); + uart_set_pin(UART_NUM_2, UART_GPIO_TXD, UART_GPIO_RXD, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); + uart_driver_install(UART_NUM_2, UART_BUF_SIZE, UART_BUF_SIZE, 10, &uart_queue, 0); // Configuration for the DTR/RI lines gpio_config_t io_conf; @@ -71,8 +114,17 @@ void eos_modem_init(void) { // Create a task to handle uart event from ISR xTaskCreate(uart_event_task, "uart_event_task", 2048, NULL, EOS_IRQ_PRIORITY_UART, NULL); + + eos_net_set_handler(EOS_NET_MTYPE_CELL, modem_handler); } ssize_t eos_modem_write(void *data, size_t size) { return uart_write_bytes(UART_NUM_2, (const char *)data, size); } + +void eos_modem_set_mode(char mode) { + uart_event_t evt; + evt.type = UART_EVENT_MAX; /* my type */ + evt.size = mode; + xQueueSend(&uart_queue, (void *)&evt, portMAX_DELAY); +} |