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();