diff options
Diffstat (limited to 'fw/esp32/components/eos/cell.c')
| -rw-r--r-- | fw/esp32/components/eos/cell.c | 63 |
1 files changed, 34 insertions, 29 deletions
diff --git a/fw/esp32/components/eos/cell.c b/fw/esp32/components/eos/cell.c index 8665616..7dc4a32 100644 --- a/fw/esp32/components/eos/cell.c +++ b/fw/esp32/components/eos/cell.c @@ -23,24 +23,29 @@ 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 buf_len) { - uint8_t mtype; +static void _cell_handler(unsigned char _mtype, EOSMessage *msg, uint16_t len) { + unsigned char mtype; + unsigned char *buffer = msg->buffer; + int rv; + + if (len < 1) return; mtype = buffer[0]; switch (mtype & EOS_CELL_MTYPE_MASK) { case EOS_CELL_MTYPE_DEV: { switch (mtype & ~EOS_CELL_MTYPE_MASK) { case EOS_CELL_MTYPE_STATUS: { - size_t rv; + size_t _rv; + + if (!(eos_msg_flags(msg) & EOS_MSG_FLAG_RPLY_REQ)) break; + if (msg->size < 3) break; - rv = eos_modem_get_status(buffer + 1); - eos_net_reply(EOS_NET_MTYPE_CELL, buffer, rv + 1); + _rv = eos_modem_get_status(buffer + 1); + eos_net_reply(EOS_NET_MTYPE_CELL, msg, _rv + 1); break; } case EOS_CELL_MTYPE_RESET: { - int rv; - rv = eos_modem_take(1000); if (rv) { ESP_LOGE(TAG, "Reset modem failed: %d", rv); @@ -52,8 +57,6 @@ static void _cell_handler(unsigned char _mtype, unsigned char *buffer, uint16_t } case EOS_CELL_MTYPE_UART_TAKE: { - int rv; - if (eos_modem_get_mode() == EOS_CELL_UART_MODE_ATCMD) { rv = eos_modem_set_mode(EOS_CELL_UART_MODE_RELAY); if (rv) ESP_LOGE(TAG, "Set RELAY mode failed: %d", rv); @@ -62,8 +65,6 @@ static void _cell_handler(unsigned char _mtype, unsigned char *buffer, uint16_t } case EOS_CELL_MTYPE_UART_GIVE: { - int rv; - if (eos_modem_get_mode() == EOS_CELL_UART_MODE_RELAY) { rv = eos_modem_take(1000); if (!rv) { @@ -78,7 +79,7 @@ static void _cell_handler(unsigned char _mtype, unsigned char *buffer, uint16_t case EOS_CELL_MTYPE_UART_DATA: { if (eos_modem_get_mode() == EOS_CELL_UART_MODE_RELAY) { - eos_modem_write(buffer + 1, buf_len - 1); + eos_modem_write(buffer + 1, len - 1); } break; } @@ -87,33 +88,35 @@ static void _cell_handler(unsigned char _mtype, unsigned char *buffer, uint16_t } case EOS_CELL_MTYPE_VOICE: { - eos_cell_voice_handler(mtype & ~EOS_CELL_MTYPE_MASK, buffer, buf_len); + eos_cell_voice_handler(_mtype, msg, len); break; } case EOS_CELL_MTYPE_SMS: { - eos_cell_sms_handler(mtype & ~EOS_CELL_MTYPE_MASK, buffer, buf_len); + eos_cell_sms_handler(_mtype, msg, len); break; } case EOS_CELL_MTYPE_USSD: { - eos_cell_ussd_handler(mtype & ~EOS_CELL_MTYPE_MASK, buffer, buf_len); + eos_cell_ussd_handler(_mtype, msg, len); break; } case EOS_CELL_MTYPE_PDP: { - eos_cell_pdp_handler(mtype & ~EOS_CELL_MTYPE_MASK, buffer, buf_len); + eos_cell_pdp_handler(_mtype, msg, len); break; } } } static void cell_handler_task(void *pvParameters) { + EOSMessage msg; EOSMsgItem mi; while (1) { if (xQueueReceive(cell_queue, &mi, portMAX_DELAY)) { - _cell_handler(mi.type, mi.buffer, mi.len); + eos_msg_init(&msg, mi.buffer, mi.size); + _cell_handler(mi.type, &msg, mi.len); xSemaphoreTake(mutex, portMAX_DELAY); eos_bufq_push(&cell_buf_q, mi.buffer); xSemaphoreGive(mutex); @@ -122,30 +125,32 @@ static void cell_handler_task(void *pvParameters) { vTaskDelete(NULL); } -static void cell_handler(unsigned char type, unsigned char *buffer, uint16_t buf_len) { +static void cell_handler(unsigned char type, EOSMessage *msg, uint16_t len) { EOSMsgItem mi; - unsigned char *_buffer; + unsigned char *buffer; - if (buf_len < 1) return; + if (len < 1) return; + if (len > EOS_CELL_MTU) return; - if (type & EOS_NET_MTYPE_FLAG_REPL) { - _cell_handler(type, buffer, buf_len); + if (eos_msg_flags(msg) & EOS_MSG_FLAG_RPLY_REQ) { + _cell_handler(type, msg, len); return; } xSemaphoreTake(mutex, portMAX_DELAY); - _buffer = eos_bufq_pop(&cell_buf_q); + buffer = eos_bufq_pop(&cell_buf_q); xSemaphoreGive(mutex); - if (_buffer == NULL) { - ESP_LOGE(TAG, "Cell message NOT handled: %2x", buffer[0]); + if (buffer == NULL) { + ESP_LOGE(TAG, "CELL MESSAGE NOT HANDLED: %2x", msg->buffer[0]); return; } - memcpy(_buffer, buffer, buf_len); mi.type = type; - mi.buffer = _buffer; - mi.len = buf_len; + mi.buffer = buffer; + mi.size = EOS_CELL_MTU; + memcpy(mi.buffer, msg->buffer, len); + mi.len = len; xQueueSend(cell_queue, &mi, portMAX_DELAY); } @@ -156,7 +161,7 @@ void eos_cell_init(void) { for (i=0; i<CELL_SIZE_QUEUE; i++) { unsigned char *buffer; - buffer = malloc(EOS_NET_SIZE_BUF); + buffer = malloc(EOS_CELL_MTU); assert(buffer != NULL); eos_bufq_push(&cell_buf_q, buffer); } |
