forked from espressif/esp-idf
esp_modem: Fixed send data and wait for prompt fail from DCE
Closes https://github.com/espressif/esp-idf/issues/6428 Closes https://github.com/espressif/esp-idf/issues/6651
This commit is contained in:
@@ -77,6 +77,7 @@ struct modem_dce {
|
|||||||
char name[MODEM_MAX_NAME_LENGTH]; /*!< Module name */
|
char name[MODEM_MAX_NAME_LENGTH]; /*!< Module name */
|
||||||
char oper[MODEM_MAX_OPERATOR_LENGTH]; /*!< Operator name */
|
char oper[MODEM_MAX_OPERATOR_LENGTH]; /*!< Operator name */
|
||||||
uint8_t act; /*!< Access technology */
|
uint8_t act; /*!< Access technology */
|
||||||
|
const char *prompt; /*!< Modem prompt string */
|
||||||
modem_state_t state; /*!< Modem working state */
|
modem_state_t state; /*!< Modem working state */
|
||||||
modem_mode_t mode; /*!< Working mode */
|
modem_mode_t mode; /*!< Working mode */
|
||||||
modem_dte_t *dte; /*!< DTE which connect to DCE */
|
modem_dte_t *dte; /*!< DTE which connect to DCE */
|
||||||
|
@@ -329,6 +329,22 @@ err:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle response from send data and wait from prompt.
|
||||||
|
*/
|
||||||
|
static esp_err_t esp_modem_dte_send_wait_default_handler(modem_dce_t *dce, const char *line)
|
||||||
|
{
|
||||||
|
esp_err_t err = ESP_FAIL;
|
||||||
|
if (!strncmp(line, dce->prompt, strlen(dce->prompt))) {
|
||||||
|
dce->state = MODEM_STATE_SUCCESS;
|
||||||
|
err = dce->dte->process_cmd_done(dce->dte);
|
||||||
|
} else {
|
||||||
|
dce->state = MODEM_STATE_FAIL;
|
||||||
|
err = dce->dte->process_cmd_done(dce->dte);
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Send data and wait for prompt from DCE
|
* @brief Send data and wait for prompt from DCE
|
||||||
*
|
*
|
||||||
@@ -346,22 +362,20 @@ static esp_err_t esp_modem_dte_send_wait(modem_dte_t *dte, const char *data, uin
|
|||||||
{
|
{
|
||||||
MODEM_CHECK(data, "data is NULL", err_param);
|
MODEM_CHECK(data, "data is NULL", err_param);
|
||||||
MODEM_CHECK(prompt, "prompt is NULL", err_param);
|
MODEM_CHECK(prompt, "prompt is NULL", err_param);
|
||||||
|
modem_dce_t *dce = dte->dce;
|
||||||
|
MODEM_CHECK(dce, "DTE has not yet bind with DCE", err_param);
|
||||||
esp_modem_dte_t *esp_dte = __containerof(dte, esp_modem_dte_t, parent);
|
esp_modem_dte_t *esp_dte = __containerof(dte, esp_modem_dte_t, parent);
|
||||||
// We'd better disable pattern detection here for a moment in case prompt string contains the pattern character
|
// We'd better change pattern detection here for a moment in case prompt string contains the pattern character
|
||||||
uart_disable_pattern_det_intr(esp_dte->uart_port);
|
uart_enable_pattern_det_baud_intr(esp_dte->uart_port, ' ', 1, MIN_PATTERN_INTERVAL, MIN_POST_IDLE, MIN_PRE_IDLE);
|
||||||
// uart_disable_rx_intr(esp_dte->uart_port);
|
dce->prompt = prompt;
|
||||||
MODEM_CHECK(uart_write_bytes(esp_dte->uart_port, data, length) >= 0, "uart write bytes failed", err_write);
|
dce->handle_line = esp_modem_dte_send_wait_default_handler;
|
||||||
uint32_t len = strlen(prompt);
|
MODEM_CHECK(dte->send_cmd(dte, data, timeout) == ESP_OK, "wait for prompt timeout", err);
|
||||||
uint8_t *buffer = calloc(len + 1, sizeof(uint8_t));
|
MODEM_CHECK(dce->state == MODEM_STATE_SUCCESS, "wait for prompt failed", err);
|
||||||
int res = uart_read_bytes(esp_dte->uart_port, buffer, len, pdMS_TO_TICKS(timeout));
|
dce->prompt = NULL;
|
||||||
MODEM_CHECK(res >= len, "wait prompt [%s] timeout", err, prompt);
|
|
||||||
MODEM_CHECK(!strncmp(prompt, (const char *)buffer, len), "get wrong prompt: %s", err, buffer);
|
|
||||||
free(buffer);
|
|
||||||
uart_enable_pattern_det_baud_intr(esp_dte->uart_port, '\n', 1, MIN_PATTERN_INTERVAL, MIN_POST_IDLE, MIN_PRE_IDLE);
|
uart_enable_pattern_det_baud_intr(esp_dte->uart_port, '\n', 1, MIN_PATTERN_INTERVAL, MIN_POST_IDLE, MIN_PRE_IDLE);
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
err:
|
err:
|
||||||
free(buffer);
|
dce->prompt = NULL;
|
||||||
err_write:
|
|
||||||
uart_enable_pattern_det_baud_intr(esp_dte->uart_port, '\n', 1, MIN_PATTERN_INTERVAL, MIN_POST_IDLE, MIN_PRE_IDLE);
|
uart_enable_pattern_det_baud_intr(esp_dte->uart_port, '\n', 1, MIN_PATTERN_INTERVAL, MIN_POST_IDLE, MIN_PRE_IDLE);
|
||||||
err_param:
|
err_param:
|
||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
|
Reference in New Issue
Block a user