critical bugfix in stm32l4 serial driver - to narrow type srl_rx_lenght_param_addres, improved callback for tcpip connecting

tatry_variant
Mateusz Lubecki 2022-08-04 23:23:30 +02:00
rodzic 7002cd6f60
commit a8f783ac38
2 zmienionych plików z 35 dodań i 3 usunięć

Wyświetl plik

@ -484,7 +484,7 @@ uint8_t srl_receive_data_with_callback(srl_context_t *ctx, srl_rx_termination_ca
ctx->srl_rx_bytes_counter = 0;
ctx->srl_rx_lenght_param_addres = ctx->srl_rx_buf_ln - 1;
ctx->srl_rx_lenght_param_addres = 0xFF;
ctx->srl_rx_lenght_param_modifier = 0;
ctx->srl_triggered_start = 0;

Wyświetl plik

@ -18,6 +18,7 @@ const static char * CLOSE_TCP = "AT+CIPCLOSE\r\0";
static const char * ESCAPE = "+++\0";
#define CONNECT_LN 13
static const char * CONNECT = "OK\r\n\r\nCONNECT\0";
static const char * OK = "OK\0";
#define DISCONNECTED_LN 6
@ -52,6 +53,11 @@ static char gsm_sim800_previous = ' ';
gsm_sim800_tcpip_receive_callback_t gsm_sim800_tcpip_async_receive_cbk = 0;
/**
* Index at which 'CONNECT' or 'ERROR' response ends. Set by @link{gsm_sim800_connecting_terminating_callback}
*/
uint16_t gsm_sim800_connect_response_idx = 0;
static uint8_t gsm_sim800_escape_terminating_callback(uint8_t current_data, const uint8_t * const rx_buffer, uint16_t rx_bytes_counter) {
if (gsm_sim800_previous == 'O') {
if ((char)current_data == 'K') {
@ -66,6 +72,32 @@ static uint8_t gsm_sim800_escape_terminating_callback(uint8_t current_data, cons
return 0;
}
static uint8_t gsm_sim800_connecting_terminating_callback(uint8_t current_data, const uint8_t * const rx_buffer, uint16_t rx_bytes_counter) {
if (gsm_sim800_previous == 'C') {
if ((char)current_data == 'T') {
gsm_sim800_previous = ' ';
gsm_sim800_connect_response_idx = rx_bytes_counter;
return 1;
}
}
if (gsm_sim800_previous == 'O') {
if ((char)current_data == 'R') {
gsm_sim800_previous = ' ';
gsm_sim800_connect_response_idx = rx_bytes_counter;
return 1;
}
}
gsm_sim800_previous = (char) current_data;
return 0;
}
sim800_return_t gsm_sim800_tcpip_connect(char * ip_or_dns_address, uint8_t address_ln, char * port, uint8_t port_ln, srl_context_t * srl_context, gsm_sim800_state_t * state) {
// this function has blocking io
@ -106,7 +138,7 @@ sim800_return_t gsm_sim800_tcpip_connect(char * ip_or_dns_address, uint8_t addre
srl_switch_timeout(srl_context, 1, 2000);
// trigger reception
srl_receive_data_with_callback(srl_context, gsm_sim800_rx_terminating_callback);
srl_receive_data_with_callback(srl_context, gsm_sim800_connecting_terminating_callback);
gsm_at_command_sent_last = TCP3;
// start timeout calculation
@ -118,7 +150,7 @@ sim800_return_t gsm_sim800_tcpip_connect(char * ip_or_dns_address, uint8_t addre
// if response from the modem has been received
if (receive_result == SRL_OK) {
// check if 'OK and 'CONNECT' has been received which means that connection has been established
comparision_result = strncmp(OK, (const char *)(srl_context->srl_rx_buf_pointer + gsm_sim800_get_response_start_idx()), 2);
comparision_result = strncmp(CONNECT, (const char *)(srl_context->srl_rx_buf_pointer + gsm_sim800_connect_response_idx - CONNECT_LN + 1), CONNECT_LN);
if (comparision_result == 0) {
*state = SIM800_TCP_CONNECTED;