diff --git a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch index 57fdb44..3cbb4de 100644 --- a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch +++ b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch @@ -57,6 +57,6 @@ - + diff --git a/doc/eclipse_indexer_config.png b/doc/eclipse_indexer_config.png new file mode 100644 index 0000000..3786b8e Binary files /dev/null and b/doc/eclipse_indexer_config.png differ diff --git a/include/api/api_content.h b/include/api/api_content.h index 5ed59af..04bf6c7 100644 --- a/include/api/api_content.h +++ b/include/api/api_content.h @@ -18,7 +18,7 @@ #define ENTRIES_STRING(ENTRY) \ ENTRY(main_config_data_basic->callsign, callsign) \ ENTRY(SW_VER, sw_ver) \ - ENTRY(SW_DATE, sw_data) \ + ENTRY(SW_DATE, sw_date) \ #define ENTRIES_32INT_STATUS(ENTRY) \ ENTRY(master_time, master_time) \ diff --git a/include/aprsis.h b/include/aprsis.h index 613240d..d57d961 100644 --- a/include/aprsis.h +++ b/include/aprsis.h @@ -17,14 +17,15 @@ typedef enum aprsis_return { APRSIS_OK = 0, APRSIS_NOT_CONFIGURED = 1, APRSIS_WRONG_STATE = 2, - APRSIS_ALREADY_CONNECTED = 3 + APRSIS_ALREADY_CONNECTED = 3, + APRSIS_UNKNOWN = -1 }aprsis_return_t; extern uint8_t aprsis_connected; void aprsis_init(srl_context_t * context, gsm_sim800_state_t * gsm_modem_state, char * callsign, uint8_t ssid, uint32_t passcode, char * default_server, uint16_t default_port); -aprsis_return_t aprsis_connect_and_login(char * address, uint8_t address_ln, uint16_t port); -aprsis_return_t aprsis_connect_and_login_default(void); +aprsis_return_t aprsis_connect_and_login(char * address, uint8_t address_ln, uint16_t port, uint8_t auto_send_beacon); +aprsis_return_t aprsis_connect_and_login_default(uint8_t auto_send_beacon); void aprsis_disconnect(void); void aprsis_receive_callback(srl_context_t* srl_context); void aprsis_check_alive(void); diff --git a/include/etc/http_client_configuration.h b/include/etc/http_client_configuration.h new file mode 100644 index 0000000..65fb6cb --- /dev/null +++ b/include/etc/http_client_configuration.h @@ -0,0 +1 @@ +#define HTTP_CLIENT_DEFAULT_TIMEOUT_MSEC 9000 diff --git a/include/main.h b/include/main.h index 2ae1218..437ae5f 100644 --- a/include/main.h +++ b/include/main.h @@ -8,7 +8,7 @@ #include "config_data.h" #define SW_VER "EA05" -#define SW_DATE "04052022" +#define SW_DATE "09052022" #define SYSTICK_TICKS_PER_SECONDS 100 #define SYSTICK_TICKS_PERIOD 10 diff --git a/src/api.c b/src/api.c index b16f522..b35d237 100644 --- a/src/api.c +++ b/src/api.c @@ -69,10 +69,10 @@ static void api_construct_url_status(api_endpoint_t endpoint) { switch (endpoint) { case PARAMETEO_STATUS: - snprintf(api_url_buffer, URL_BUFFER_LN - 1, "%s/parameteo/%s/status", api_base_url, api_station_name); + snprintf(api_url_buffer, URL_BUFFER_LN - 1, "%s/parameteo/%s/status/v1", api_base_url, api_station_name); break; case PARAMETEO_WX: - snprintf(api_url_buffer, URL_BUFFER_LN - 1, "%s/parameteo/%s/measurements", api_base_url, api_station_name); + snprintf(api_url_buffer, URL_BUFFER_LN - 1, "%s/parameteo/%s/measurements/v1", api_base_url, api_station_name); break; } } diff --git a/src/aprsis.c b/src/aprsis.c index ce31b7c..bb57a69 100644 --- a/src/aprsis.c +++ b/src/aprsis.c @@ -96,7 +96,7 @@ void aprsis_init(srl_context_t * context, gsm_sim800_state_t * gsm_modem_state, } -aprsis_return_t aprsis_connect_and_login(char * address, uint8_t address_ln, uint16_t port) { +aprsis_return_t aprsis_connect_and_login(char * address, uint8_t address_ln, uint16_t port, uint8_t auto_send_beacon) { // this function has blocking io uint8_t out = APRSIS_WRONG_STATE; @@ -158,7 +158,15 @@ aprsis_return_t aprsis_connect_and_login(char * address, uint8_t address_ln, uin if (retval == 0) { aprsis_logged = 1; - aprsis_send_beacon(0); + // set current timestamp as last + aprsis_last_keepalive_ts = master_time; + + if (auto_send_beacon != 0) { + aprsis_send_beacon(0); + } + + // set timeout for aprs-is server + srl_switch_timeout(aprsis_serial_port, 1, APRSIS_TIMEOUT_MS); // wait for consecutive data gsm_sim800_tcpip_async_receive(aprsis_serial_port, aprsis_gsm_modem_state, 0, 61000, aprsis_receive_callback); @@ -186,9 +194,9 @@ aprsis_return_t aprsis_connect_and_login(char * address, uint8_t address_ln, uin } -aprsis_return_t aprsis_connect_and_login_default(void) { +aprsis_return_t aprsis_connect_and_login_default(uint8_t auto_send_beacon) { - return aprsis_connect_and_login(aprsis_default_server_address, aprsis_default_server_address_ln, aprsis_default_server_port); + return aprsis_connect_and_login(aprsis_default_server_address, aprsis_default_server_address_ln, aprsis_default_server_port, auto_send_beacon); } void aprsis_disconnect(void) { diff --git a/src/main.c b/src/main.c index 5896e3c..6cd6c2a 100644 --- a/src/main.c +++ b/src/main.c @@ -121,7 +121,7 @@ /** * A foreword about '#define' mess. This software is indented to run on at least two - * different hardware platform. First which is ParaTNC basing on STM32F100 and second + * different hardware platforms. First which is ParaTNC basing on STM32F100 and second * ParaMETEO using STM32L476. In future more platforms may appear. Like ParaTNC2 which * will be a ParaMETEO without battery charging and in form factor similar to ParaTNC. * @@ -1289,7 +1289,7 @@ int main(int argc, char* argv[]){ gsm_sim800_poolers_one_minute(main_gsm_srl_ctx_ptr, &main_gsm_state); - aprsis_connect_and_login_default(); + aprsis_connect_and_login_default(1); // if (gsm_sim800_gprs_ready == 1) { // diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index 9588bca..cd31a0c 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -106,9 +106,23 @@ void packet_tx_tcp_handler(void) { uint8_t result = 0; + aprsis_return_t aprsis_result = APRSIS_UNKNOWN; + if ((packet_tx_trigger_tcp & APRSIS_TRIGGER_METEO) != 0) { - // send APRS-IS frame, if APRS-IS is not connected this function will return immediately - aprsis_send_wx_frame(rte_wx_average_windspeed, rte_wx_max_windspeed, rte_wx_average_winddirection, rte_wx_temperature_average_external_valid, rte_wx_pressure_valid, rte_wx_humidity_valid); + + if (aprsis_connected == 0) { + aprsis_result = aprsis_connect_and_login_default(0); + + if (aprsis_result == APRSIS_OK) { + // send APRS-IS frame, if APRS-IS is not connected this function will return immediately + aprsis_send_wx_frame(rte_wx_average_windspeed, rte_wx_max_windspeed, rte_wx_average_winddirection, rte_wx_temperature_average_external_valid, rte_wx_pressure_valid, rte_wx_humidity_valid); + } + } + else { + // send APRS-IS frame, if APRS-IS is not connected this function will return immediately + aprsis_send_wx_frame(rte_wx_average_windspeed, rte_wx_max_windspeed, rte_wx_average_winddirection, rte_wx_temperature_average_external_valid, rte_wx_pressure_valid, rte_wx_humidity_valid); + } + // clear the bit packet_tx_trigger_tcp ^= APRSIS_TRIGGER_METEO; @@ -149,7 +163,7 @@ void packet_tx_tcp_handler(void) { packet_tx_trigger_tcp ^= API_TRIGGER_METEO; } else if ((packet_tx_trigger_tcp & RECONNECT_APRSIS) != 0) { - result = aprsis_connect_and_login_default(); + result = aprsis_connect_and_login_default(1); if (result == APRSIS_OK) { packet_tx_trigger_tcp ^= RECONNECT_APRSIS; diff --git a/system/src/gsm/sim800c_tcpip.c b/system/src/gsm/sim800c_tcpip.c index eee3d85..12f979f 100644 --- a/system/src/gsm/sim800c_tcpip.c +++ b/system/src/gsm/sim800c_tcpip.c @@ -3,6 +3,7 @@ #include "gsm/sim800c.h" #include "main.h" +#include "delay.h" #include @@ -228,21 +229,49 @@ void gsm_sim800_tcpip_close(srl_context_t * srl_context, gsm_sim800_state_t * st uint8_t receive_result = 0; + volatile uint8_t escape_counter = 0; + if (*state == SIM800_TCP_CONNECTED || force == 1) { - // send escape sequence to exit connection mode - srl_send_data(srl_context, (const uint8_t*) ESCAPE, SRL_MODE_ZERO, strlen(ESCAPE), SRL_INTERNAL); - // wait for transmission to finish - srl_wait_for_tx_completion(srl_context); + do { + // set default timeout of 1200msec + srl_switch_timeout(srl_context, SRL_TIMEOUT_ENABLE, 2222); - // wait for OK to be received - srl_receive_data_with_callback(srl_context, gsm_sim800_escape_terminating_callback); + // send escape sequence to exit connection mode + srl_send_data(srl_context, (const uint8_t*) ESCAPE, SRL_MODE_ZERO, strlen(ESCAPE), SRL_INTERNAL); - // start timeout calculation - srl_context->srl_rx_timeout_calc_started = 1; + // wait for transmission to finish + srl_wait_for_tx_completion(srl_context); - // wait for it to finish - srl_wait_for_rx_completion_or_timeout(srl_context, & receive_result); + // wait for OK to be received + srl_receive_data(srl_context, 4, SRL_NO_START_CHR, SRL_NO_STOP_CHR, SRL_ECHO_DISABLE, 0x7F, 0); + + // start timeout calculation + srl_switch_timeout_for_waiting(srl_context, SRL_TIMEOUT_ENABLE); + + // wait for it to finish + srl_wait_for_rx_completion_or_timeout(srl_context, & receive_result); + + // check if we escaped from data mode + if (strncmp((const char *) (srl_context->srl_rx_buf_pointer), NEWLINE, 1) == 0) { + break; + } + else if (strncmp((const char *) (srl_context->srl_rx_buf_pointer), OK, 2) == 0) { + break; + } + else if (strncmp((const char *) (srl_context->srl_rx_buf_pointer), ESCAPE, 3) == 0) { + // if module has already returned to command mode it will echo all input + break; + } + else { + if (receive_result == SRL_OK) { + delay_fixed(200); + + } + } + + + } while(escape_counter++ < 3); // send escape sequence to exit connection mode srl_send_data(srl_context, (const uint8_t*) CLOSE_TCP, SRL_MODE_ZERO, strlen(CLOSE_TCP), SRL_INTERNAL); diff --git a/system/src/http_client/http_client.c b/system/src/http_client/http_client.c index b7c2ebc..4079c77 100644 --- a/system/src/http_client/http_client.c +++ b/system/src/http_client/http_client.c @@ -1,6 +1,7 @@ #include "http_client/http_client.h" #include "http_client/http_client_rx_callback.h" #include "http_client/http_client_headers.h" +#include "http_client_configuration.h" #include "gsm/sim800c_tcpip.h" @@ -269,6 +270,9 @@ uint8_t http_client_async_get(char * url, uint8_t url_ln, uint16_t response_ln_l // check if data has been sent succesfully if (connect_result == 0) { + // configure timeout for reception + srl_switch_timeout(http_client_deticated_serial_context, 1, HTTP_CLIENT_DEFAULT_TIMEOUT_MSEC); + // reset callback to initial state http_client_rx_done_callback_init(); @@ -367,6 +371,9 @@ uint8_t http_client_async_post(char * url, uint8_t url_ln, char * data_to_post, // check if data has been sent succesfully if (connect_result == 0) { + // configure timeout for reception + srl_switch_timeout(http_client_deticated_serial_context, 1, HTTP_CLIENT_DEFAULT_TIMEOUT_MSEC); + // reset callback to initial state http_client_rx_done_callback_init();