daily, a lot of reworking. tcp disconnecto doesn't work

sr9wxz_new_configuration_for_ZZ06
Mateusz Lubecki 2022-05-09 22:46:50 +02:00
rodzic 433050d2ed
commit 47564c69f2
12 zmienionych plików z 87 dodań i 27 usunięć

Wyświetl plik

@ -57,6 +57,6 @@
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/> <listEntry value="4"/>
</listAttribute> </listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#10;"/> <stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;&gt;&#10; &lt;memoryBlockExpression address=&quot;536876652&quot; label=&quot;api_buffer&quot;/&gt;&#10;&lt;/memoryBlockExpressionList&gt;&#10;"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 104 KiB

Wyświetl plik

@ -18,7 +18,7 @@
#define ENTRIES_STRING(ENTRY) \ #define ENTRIES_STRING(ENTRY) \
ENTRY(main_config_data_basic->callsign, callsign) \ ENTRY(main_config_data_basic->callsign, callsign) \
ENTRY(SW_VER, sw_ver) \ ENTRY(SW_VER, sw_ver) \
ENTRY(SW_DATE, sw_data) \ ENTRY(SW_DATE, sw_date) \
#define ENTRIES_32INT_STATUS(ENTRY) \ #define ENTRIES_32INT_STATUS(ENTRY) \
ENTRY(master_time, master_time) \ ENTRY(master_time, master_time) \

Wyświetl plik

@ -17,14 +17,15 @@ typedef enum aprsis_return {
APRSIS_OK = 0, APRSIS_OK = 0,
APRSIS_NOT_CONFIGURED = 1, APRSIS_NOT_CONFIGURED = 1,
APRSIS_WRONG_STATE = 2, APRSIS_WRONG_STATE = 2,
APRSIS_ALREADY_CONNECTED = 3 APRSIS_ALREADY_CONNECTED = 3,
APRSIS_UNKNOWN = -1
}aprsis_return_t; }aprsis_return_t;
extern uint8_t aprsis_connected; 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); 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(char * address, uint8_t address_ln, uint16_t port, uint8_t auto_send_beacon);
aprsis_return_t aprsis_connect_and_login_default(void); aprsis_return_t aprsis_connect_and_login_default(uint8_t auto_send_beacon);
void aprsis_disconnect(void); void aprsis_disconnect(void);
void aprsis_receive_callback(srl_context_t* srl_context); void aprsis_receive_callback(srl_context_t* srl_context);
void aprsis_check_alive(void); void aprsis_check_alive(void);

Wyświetl plik

@ -0,0 +1 @@
#define HTTP_CLIENT_DEFAULT_TIMEOUT_MSEC 9000

Wyświetl plik

@ -8,7 +8,7 @@
#include "config_data.h" #include "config_data.h"
#define SW_VER "EA05" #define SW_VER "EA05"
#define SW_DATE "04052022" #define SW_DATE "09052022"
#define SYSTICK_TICKS_PER_SECONDS 100 #define SYSTICK_TICKS_PER_SECONDS 100
#define SYSTICK_TICKS_PERIOD 10 #define SYSTICK_TICKS_PERIOD 10

Wyświetl plik

@ -69,10 +69,10 @@ static void api_construct_url_status(api_endpoint_t endpoint) {
switch (endpoint) { switch (endpoint) {
case PARAMETEO_STATUS: 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; break;
case PARAMETEO_WX: 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; break;
} }
} }

Wyświetl plik

@ -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 // this function has blocking io
uint8_t out = APRSIS_WRONG_STATE; 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) { if (retval == 0) {
aprsis_logged = 1; aprsis_logged = 1;
// set current timestamp as last
aprsis_last_keepalive_ts = master_time;
if (auto_send_beacon != 0) {
aprsis_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 // wait for consecutive data
gsm_sim800_tcpip_async_receive(aprsis_serial_port, aprsis_gsm_modem_state, 0, 61000, aprsis_receive_callback); 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) { void aprsis_disconnect(void) {

Wyświetl plik

@ -121,7 +121,7 @@
/** /**
* A foreword about '#define' mess. This software is indented to run on at least two * 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 * 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. * 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); 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) { // if (gsm_sim800_gprs_ready == 1) {
// //

Wyświetl plik

@ -106,9 +106,23 @@ void packet_tx_tcp_handler(void) {
uint8_t result = 0; uint8_t result = 0;
aprsis_return_t aprsis_result = APRSIS_UNKNOWN;
if ((packet_tx_trigger_tcp & APRSIS_TRIGGER_METEO) != 0) { if ((packet_tx_trigger_tcp & APRSIS_TRIGGER_METEO) != 0) {
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 // 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); 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 // clear the bit
packet_tx_trigger_tcp ^= APRSIS_TRIGGER_METEO; packet_tx_trigger_tcp ^= APRSIS_TRIGGER_METEO;
@ -149,7 +163,7 @@ void packet_tx_tcp_handler(void) {
packet_tx_trigger_tcp ^= API_TRIGGER_METEO; packet_tx_trigger_tcp ^= API_TRIGGER_METEO;
} }
else if ((packet_tx_trigger_tcp & RECONNECT_APRSIS) != 0) { 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) { if (result == APRSIS_OK) {
packet_tx_trigger_tcp ^= RECONNECT_APRSIS; packet_tx_trigger_tcp ^= RECONNECT_APRSIS;

Wyświetl plik

@ -3,6 +3,7 @@
#include "gsm/sim800c.h" #include "gsm/sim800c.h"
#include "main.h" #include "main.h"
#include "delay.h"
#include <string.h> #include <string.h>
@ -228,7 +229,14 @@ void gsm_sim800_tcpip_close(srl_context_t * srl_context, gsm_sim800_state_t * st
uint8_t receive_result = 0; uint8_t receive_result = 0;
volatile uint8_t escape_counter = 0;
if (*state == SIM800_TCP_CONNECTED || force == 1) { if (*state == SIM800_TCP_CONNECTED || force == 1) {
do {
// set default timeout of 1200msec
srl_switch_timeout(srl_context, SRL_TIMEOUT_ENABLE, 2222);
// send escape sequence to exit connection mode // send escape sequence to exit connection mode
srl_send_data(srl_context, (const uint8_t*) ESCAPE, SRL_MODE_ZERO, strlen(ESCAPE), SRL_INTERNAL); srl_send_data(srl_context, (const uint8_t*) ESCAPE, SRL_MODE_ZERO, strlen(ESCAPE), SRL_INTERNAL);
@ -236,14 +244,35 @@ void gsm_sim800_tcpip_close(srl_context_t * srl_context, gsm_sim800_state_t * st
srl_wait_for_tx_completion(srl_context); srl_wait_for_tx_completion(srl_context);
// wait for OK to be received // wait for OK to be received
srl_receive_data_with_callback(srl_context, gsm_sim800_escape_terminating_callback); srl_receive_data(srl_context, 4, SRL_NO_START_CHR, SRL_NO_STOP_CHR, SRL_ECHO_DISABLE, 0x7F, 0);
// start timeout calculation // start timeout calculation
srl_context->srl_rx_timeout_calc_started = 1; srl_switch_timeout_for_waiting(srl_context, SRL_TIMEOUT_ENABLE);
// wait for it to finish // wait for it to finish
srl_wait_for_rx_completion_or_timeout(srl_context, & receive_result); 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 // 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); srl_send_data(srl_context, (const uint8_t*) CLOSE_TCP, SRL_MODE_ZERO, strlen(CLOSE_TCP), SRL_INTERNAL);

Wyświetl plik

@ -1,6 +1,7 @@
#include "http_client/http_client.h" #include "http_client/http_client.h"
#include "http_client/http_client_rx_callback.h" #include "http_client/http_client_rx_callback.h"
#include "http_client/http_client_headers.h" #include "http_client/http_client_headers.h"
#include "http_client_configuration.h"
#include "gsm/sim800c_tcpip.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 // check if data has been sent succesfully
if (connect_result == 0) { 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 // reset callback to initial state
http_client_rx_done_callback_init(); 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 // check if data has been sent succesfully
if (connect_result == 0) { 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 // reset callback to initial state
http_client_rx_done_callback_init(); http_client_rx_done_callback_init();