bugfix in serial port driver regarding switching between internal and external tx buffer

pull/7/head
Mateusz Lubecki 2022-04-07 20:56:35 +02:00
rodzic 129b286e49
commit 16f147810e
10 zmienionych plików z 84 dodań i 34 usunięć

Wyświetl plik

@ -6,7 +6,7 @@
#include "config_data.h"
#define SW_VER "EA05"
#define SW_DATE "06042022"
#define SW_DATE "07042022"
#define SYSTICK_TICKS_PER_SECONDS 100
#define SYSTICK_TICKS_PERIOD 10

Wyświetl plik

@ -971,11 +971,15 @@ int main(int argc, char* argv[]){
// if new packet has been received from radio channel
if(ax25_new_msg_rx_flag == 1) {
memset(main_kiss_srl_ctx.srl_tx_buf_pointer, 0x00, main_kiss_srl_ctx.srl_tx_buf_ln);
if (main_kiss_enabled == 1) {
// convert message to kiss format and send it to host
srl_start_tx(main_kiss_srl_ctx_ptr, SendKISSToHost(ax25_rxed_frame.raw_data, (ax25_rxed_frame.raw_msg_len - 2), main_kiss_srl_ctx.srl_tx_buf_pointer, main_kiss_srl_ctx.srl_tx_buf_ln));
// if serial port is currently not busy on transmission
if (main_kiss_srl_ctx_ptr->srl_tx_state != SRL_TXING) {
memset(main_kiss_srl_ctx.srl_tx_buf_pointer, 0x00, main_kiss_srl_ctx.srl_tx_buf_ln);
if (main_kiss_enabled == 1) {
// convert message to kiss format and send it to host
srl_start_tx(main_kiss_srl_ctx_ptr, SendKISSToHost(ax25_rxed_frame.raw_data, (ax25_rxed_frame.raw_msg_len - 2), main_kiss_srl_ctx.srl_tx_buf_pointer, main_kiss_srl_ctx.srl_tx_buf_ln));
}
}
main_ax25.dcd = false;

Wyświetl plik

@ -85,12 +85,20 @@ typedef struct srl_context_t {
GPIO_TypeDef* te_port;
uint16_t te_pin;
// these pointers points to either internal buffer
// or external provided by caller, depends on 'uint8_t internal_external'
// parameter in send functions
uint8_t *srl_tx_buf_pointer;
uint8_t *srl_rx_buf_pointer;
// thatt pointer always points to internal buffer
uint8_t *srl_tx_internal_buf_pointer;
uint16_t srl_rx_buf_ln;
uint16_t srl_tx_buf_ln;
uint16_t srl_tx_internal_buf_ln;
uint16_t srl_rx_bytes_counter;
uint16_t srl_tx_bytes_counter;

Wyświetl plik

@ -45,16 +45,6 @@ extern uint16_t http_client_content_lenght;
*/
extern uint16_t http_client_max_content_ln;
/**
* Temporary buffer for processing
*/
extern char http_client_header_buffer[HEADER_BUFFER_LN];
/**
* Index used to walk through 'http_client_header_buffer'
*/
extern uint8_t http_client_header_index;
void http_client_init(gsm_sim800_state_t * state, srl_context_t * serial_context, uint8_t ignore_content_on_http_error);
uint8_t http_client_async_get(char * url, uint8_t url_ln, uint16_t response_ln_limit, uint8_t force_disconnect_on_busy);
uint8_t http_client_async_post(char * url, uint8_t url_ln, char * data_to_post, uint8_t data_ln, uint8_t force_disconnect_on_busy);

Wyświetl plik

@ -31,6 +31,7 @@ typedef enum http_client_method {
uint16_t http_client_headers_preamble(http_client_method_t method, char * url, uint8_t url_ln, char * output, uint16_t output_ln);
uint16_t http_client_headers_user_agent(char * output, uint16_t output_ln, uint16_t offset);
uint16_t http_client_headers_accept(char* output, uint16_t output_ln, uint16_t offset);
uint16_t http_client_headers_terminate(char* output, uint16_t output_ln, uint16_t offset);
#endif /* INCLUDE_HTTP_CLIENT_HTTP_CLIENT_HEADERS_H_ */

Wyświetl plik

@ -49,6 +49,9 @@ void srl_init(
ctx->srl_tx_buf_ln = rx_buffer_size;
#endif
ctx->srl_tx_internal_buf_pointer = tx_buffer;
ctx->srl_tx_internal_buf_ln = tx_buffer_size;
memset(ctx->srl_rx_buf_pointer, 0x00, ctx->srl_rx_buf_ln);
memset(ctx->srl_tx_buf_pointer, 0x00, ctx->srl_tx_buf_ln);
@ -187,12 +190,12 @@ uint8_t srl_send_data(srl_context_t *ctx, const uint8_t* data, uint8_t mode, uin
return SRL_DATA_TOO_LONG;
// setting a pointer to transmit buffer to the internal buffer inside the driver
ctx->srl_tx_buf_pointer = srl_usart1_tx_buffer;
ctx->srl_tx_buf_pointer = ctx->srl_tx_internal_buf_pointer;
ctx->srl_tx_buf_ln = TX_BUFFER_1_LN;
ctx->srl_tx_buf_ln = ctx->srl_tx_internal_buf_ln;
// cleaning the buffer from previous content
memset(ctx->srl_tx_buf_pointer, 0x00, TX_BUFFER_1_LN);
memset(ctx->srl_tx_buf_pointer, 0x00, ctx->srl_tx_buf_ln);
// copying the data from provided pointer to internal buffer
if (mode == 0) {
@ -663,6 +666,10 @@ void srl_irq_handler(srl_context_t *ctx) {
ctx->port->SR &= (0xFFFFFFFF ^ USART_SR_TC);
ctx->srl_tx_state = SRL_TX_IDLE;
// reset tx buffer pointer to internal one
ctx->srl_tx_buf_pointer = ctx->srl_tx_internal_buf_pointer;
ctx->srl_tx_buf_ln = ctx->srl_tx_internal_buf_ln;
if (ctx->te_port != 0)
GPIO_ResetBits(ctx->te_port, ctx->te_pin);
@ -677,6 +684,10 @@ void srl_irq_handler(srl_context_t *ctx) {
ctx->port->SR &= (0xFFFFFFFF ^ USART_SR_TC);
ctx->srl_tx_state = SRL_TX_IDLE;
// reset tx buffer pointer to internal one
ctx->srl_tx_buf_pointer = ctx->srl_tx_internal_buf_pointer;
ctx->srl_tx_buf_ln = ctx->srl_tx_internal_buf_ln;
if (ctx->te_port != 0)
GPIO_ResetBits(ctx->te_port, ctx->te_pin);
//GPIO_ResetBits(GPIOA, GPIO_Pin_7);

Wyświetl plik

@ -47,6 +47,7 @@ void srl_init(
if (ctx->srl_rx_state == SRL_RX_IDLE)
return;
// point to internal buffers by default
#ifdef SEPARATE_TX_BUFF
ctx->srl_tx_buf_pointer = tx_buffer;
ctx->srl_rx_buf_ln = tx_buffer_size;
@ -57,6 +58,9 @@ void srl_init(
ctx->srl_tx_buf_ln = rx_buffer_size;
#endif
ctx->srl_tx_internal_buf_pointer = tx_buffer;
ctx->srl_tx_internal_buf_ln = tx_buffer_size;
memset(ctx->srl_rx_buf_pointer, 0x00, ctx->srl_rx_buf_ln);
memset(ctx->srl_tx_buf_pointer, 0x00, ctx->srl_tx_buf_ln);
@ -208,12 +212,12 @@ uint8_t srl_send_data(srl_context_t *ctx, const uint8_t* data, uint8_t mode, uin
return SRL_DATA_TOO_LONG;
// setting a pointer to transmit buffer to the internal buffer inside the driver
ctx->srl_tx_buf_pointer = srl_usart1_tx_buffer;
ctx->srl_tx_buf_pointer = ctx->srl_tx_internal_buf_pointer;
ctx->srl_tx_buf_ln = TX_BUFFER_1_LN;
ctx->srl_tx_buf_ln = ctx->srl_tx_internal_buf_ln;
// cleaning the buffer from previous content
memset(ctx->srl_tx_buf_pointer, 0x00, TX_BUFFER_1_LN);
memset(ctx->srl_tx_buf_pointer, 0x00, ctx->srl_tx_buf_ln);
// copying the data from provided pointer to internal buffer
if (mode == 0) {
@ -688,6 +692,10 @@ void srl_irq_handler(srl_context_t *ctx) {
ctx->port->ISR &= (0xFFFFFFFF ^ USART_ISR_TC);
ctx->srl_tx_state = SRL_TX_IDLE;
// reset tx buffer pointer to internal one
ctx->srl_tx_buf_pointer = ctx->srl_tx_internal_buf_pointer;
ctx->srl_tx_buf_ln = ctx->srl_tx_internal_buf_ln;
if (ctx->te_port != 0) {
LL_GPIO_ResetOutputPin(ctx->te_port, ctx->te_pin);
}
@ -703,6 +711,10 @@ void srl_irq_handler(srl_context_t *ctx) {
ctx->port->ISR &= (0xFFFFFFFF ^ USART_ISR_TC);
ctx->srl_tx_state = SRL_TX_IDLE;
// reset tx buffer pointer to internal one
ctx->srl_tx_buf_pointer = ctx->srl_tx_internal_buf_pointer;
ctx->srl_tx_buf_ln = ctx->srl_tx_internal_buf_ln;
if (ctx->te_port != 0) {
LL_GPIO_ResetOutputPin(ctx->te_port, ctx->te_pin);
}

Wyświetl plik

@ -27,16 +27,6 @@ uint16_t http_client_content_lenght = 0;
*/
int16_t http_client_http_code = 0;
/**
* Temporary buffer for processing
*/
char http_client_header_buffer[HEADER_BUFFER_LN];
/**
* Index used to walk through 'http_client_header_buffer'
*/
uint8_t http_client_header_index = 0;
/**
* SIM800 state and serial context used to communication with gsm module.
*/
@ -90,7 +80,7 @@ static uint16_t http_client_split_hostname_and_path(char * input, uint16_t input
return out;
}
static void http_client_get_port_from_url(char * input, uint16_t input_ln, char * port, uint16_t port_ln) {
static uint16_t http_client_get_port_from_url(char * input, uint16_t input_ln, char * port, uint16_t port_ln) {
char temp[5] = {0, 0, 0, 0, 0};
@ -132,10 +122,11 @@ static void http_client_get_port_from_url(char * input, uint16_t input_ln, char
}
return split_point;
}
static void http_client_get_address_from_url(char * input, uint16_t input_ln, char * address, uint16_t address_ln) {
static uint16_t http_client_get_address_from_url(char * input, uint16_t input_ln, char * address, uint16_t address_ln) {
int first_index = 0, last_index = 0;
@ -170,6 +161,8 @@ static void http_client_get_address_from_url(char * input, uint16_t input_ln, ch
}
}
return split_point;
}
void http_client_init(gsm_sim800_state_t * state, srl_context_t * serial_context, uint8_t ignore_content_on_http_error) {
@ -216,6 +209,11 @@ uint8_t http_client_async_get(char * url, uint8_t url_ln, uint16_t response_ln_l
// set appropriate state
http_client_state = HTTP_CLIENT_CONNECTED_IDLE;
}
// clear a buffer to make a room for http request
memset(http_client_deticated_serial_context->srl_tx_buf_pointer, 0x00, http_client_deticated_serial_context->srl_tx_buf_ln);
//
}
else if (split_point == 0xFFFF) {
out = HTTP_CLIENT_RET_WRONG_URL;

Wyświetl plik

@ -58,7 +58,9 @@ uint16_t http_client_headers_user_agent(char *output, uint16_t output_ln,
uint16_t out = 0;
snprintf(output + offset, output_ln - offset, "User-Agent: %s");
snprintf(output + offset, output_ln - offset, "User-Agent: ParaMETEO %s-%s\r\n", SW_VER, SW_DATE);
out = strlen (output);
return out;
}
@ -68,5 +70,19 @@ uint16_t http_client_headers_accept(char *output, uint16_t output_ln,
uint16_t out = 0;
snprintf(output + offset, output_ln - offset, "Accept: application/json\r\n");
out = strlen (output);
return out;
}
uint16_t http_client_headers_terminate(char* output, uint16_t output_ln, uint16_t offset) {
uint16_t out = 0;
snprintf(output + offset, output_ln - offset, "\r\n\r\n");
out = strlen (output);
return out;
}

Wyświetl plik

@ -45,6 +45,16 @@ static uint8_t http_client_response_header_processing = 1;
// amount of bytes (octets) of a content of the HTTP response received so far
static uint16_t http_client_content_received_so_far = 0;
/**
* Temporary buffer for processing
*/
char http_client_header_buffer[HEADER_BUFFER_LN];
/**
* Index used to walk through 'http_client_header_buffer'
*/
uint8_t http_client_header_index = 0;
/**
* This function is responsible for checking what HTTP header has been received
*/