From 3c602102fa8cebc470aab41fa3aba0397989e900 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Fri, 13 Oct 2023 20:51:22 +0200 Subject: [PATCH] sending aprsis login string and status --- include/aprsis.h | 2 + include/rte_main.h | 4 ++ include/software_version.h | 2 +- src/aprsis.c | 98 +++++++++++++++++++++++++++++- src/main.c | 23 ++++--- src/packet_tx_handler.c | 83 ++++++++++++++----------- src/rte_main.c | 5 ++ system/include/gsm/sim800c_tcpip.h | 2 + system/src/gsm/sim800c_tcpip.c | 7 +++ 9 files changed, 177 insertions(+), 49 deletions(-) diff --git a/include/aprsis.h b/include/aprsis.h index e147dda..c6f2907 100644 --- a/include/aprsis.h +++ b/include/aprsis.h @@ -70,6 +70,8 @@ void aprsis_send_beacon(uint8_t async, char symbol_s, const config_data_basic_t * config_data_basic); void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid); +void aprsis_send_server_conn_status(const char * callsign_with_ssid); +void aprsis_send_loginstring(const char * callsign_with_ssid); char * aprsis_get_tx_buffer(void); uint8_t aprsis_get_aprsis_logged(void); diff --git a/include/rte_main.h b/include/rte_main.h index a3f2770..3bc0e60 100644 --- a/include/rte_main.h +++ b/include/rte_main.h @@ -14,6 +14,10 @@ //!< Set after everything was reinitialized from #define RTE_MAIN_WOKEN_UP_EXITED 4u +extern uint8_t rte_main_trigger_gsm_status_packet; + +extern uint8_t rte_main_trigger_gsm_loginstring_packet; + //!< Trigger some reinitialization after waking up from deep sleep extern uint8_t rte_main_woken_up; diff --git a/include/software_version.h b/include/software_version.h index b26b71b..63f1128 100644 --- a/include/software_version.h +++ b/include/software_version.h @@ -9,7 +9,7 @@ #define SOFTWARE_VERSION_H_ #define SW_VER "EB00" -#define SW_DATE "07102023" +#define SW_DATE "13102023" #define SW_KISS_PROTO "B" extern const char software_version_str[5]; diff --git a/src/aprsis.c b/src/aprsis.c index 1f998de..1545aae 100644 --- a/src/aprsis.c +++ b/src/aprsis.c @@ -110,6 +110,32 @@ uint32_t aprsis_last_keepalive_ts = 0; */ uint32_t aprsis_reset_on_timeout = 0; +/** + * Number of RF packets igated to APRS-IS system + */ +uint16_t aprsis_igated_counter = 0; + +/** + * Counter of all packets originated from the station transmitted to APRS-IS server. + * This doesn't include igated packets! + */ +uint16_t aprsis_tx_counter = 0; + +/** + * Amount of keepalive packet received from the server. It is reset to zero + * every connect event + */ +uint16_t aprsis_keepalive_received_counter = 0; + +/** + * Amount of packets which are not keepalive + */ +uint16_t aprsis_another_received_counter = 0; + +#define APRSIS_LOGIN_STRING_RECEIVED_LN 64 + +char aprsis_login_string_reveived[APRSIS_LOGIN_STRING_RECEIVED_LN]; + #define APRSIS_TIMEOUT_MS 123000//123000 /** @@ -181,8 +207,18 @@ aprsis_return_t aprsis_connect_and_login(const char * address, uint8_t address_l int offset = 0; + aprsis_tx_counter = 0; + + aprsis_keepalive_received_counter = 0; + + aprsis_another_received_counter = 0; + + aprsis_igated_counter = 0; + memset(port_str, 0x00, 0x6); + memset(aprsis_login_string_reveived, 0x00, APRSIS_LOGIN_STRING_RECEIVED_LN); + snprintf(port_str, 6, "%d", port); // result of a disconnecting from APRS-IS server @@ -208,6 +244,9 @@ aprsis_return_t aprsis_connect_and_login(const char * address, uint8_t address_l // send long string to server gsm_sim800_tcpip_write((uint8_t *)aprsis_login_string, strlen(aprsis_login_string), aprsis_serial_port, aprsis_gsm_modem_state); + // store received login string (with an information about which server is connected now) + strncpy(aprsis_login_string_reveived, receive_buff + offset, APRSIS_LOGIN_STRING_RECEIVED_LN); + // wait for server response retval = gsm_sim800_tcpip_receive(0, 0, aprsis_serial_port, aprsis_gsm_modem_state, 0, 2000); @@ -231,6 +270,9 @@ aprsis_return_t aprsis_connect_and_login(const char * address, uint8_t address_l aprsis_send_beacon(0, aprsis_callsign_with_ssid, main_string_latitude, main_symbol_f, main_string_longitude, main_symbol_s, main_config_data_basic); } + // trigger GSM status packet + rte_main_trigger_gsm_loginstring_packet = 1; + // set timeout for aprs-is server srl_switch_timeout(aprsis_serial_port, 1, APRSIS_TIMEOUT_MS); @@ -318,9 +360,13 @@ void aprsis_receive_callback(srl_context_t* srl_context) { if (*(srl_get_rx_buffer(srl_context)) == '#') { aprsis_last_keepalive_ts = main_get_master_time(); + aprsis_keepalive_received_counter++; + gsm_sim800_tcpip_async_receive(aprsis_serial_port, aprsis_gsm_modem_state, 0, 61000, aprsis_receive_callback); } else { + aprsis_another_received_counter++; + gsm_sim800_tcpip_async_receive(aprsis_serial_port, aprsis_gsm_modem_state, 0, 61000, aprsis_receive_callback); } @@ -390,6 +436,8 @@ void aprsis_send_wx_frame( return; } + aprsis_tx_counter++; + float max_wind_speed = 0.0f, temp = 0.0f; uint8_t wind_speed_mph = 0, wind_gusts_mph = 0; uint32_t pressure = 0; @@ -420,8 +468,9 @@ void aprsis_send_wx_frame( memset(aprsis_packet_tx_buffer, 0x00, sizeof(aprsis_packet_tx_buffer)); // main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "=%s%c%c%s%c%c %s", main_string_latitude, main_config_data_basic->n_or_s, main_symbol_f, main_string_longitude, main_config_data_basic->e_or_w, main_symbol_s, main_config_data_basic->comment); - aprsis_packet_tx_message_size = sprintf( + aprsis_packet_tx_message_size = snprintf( aprsis_packet_tx_buffer, + APRSIS_TX_BUFFER_LN, "%s>AKLPRZ,qAR,%s:!%s%c%c%s%c%c%03d/%03dg%03dt%03dr...p...P...b%05ldh%02d\r\n", callsign_with_ssid, callsign_with_ssid, @@ -461,8 +510,11 @@ void aprsis_send_beacon( return; } - aprsis_packet_tx_message_size = sprintf( + aprsis_tx_counter++; + + aprsis_packet_tx_message_size = snprintf( aprsis_packet_tx_buffer, + APRSIS_TX_BUFFER_LN, "%s>AKLPRZ,qAR,%s:=%s%c%c%s%c%c %s\r\n", callsign_with_ssid, callsign_with_ssid, @@ -498,6 +550,8 @@ void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid) { return; } + aprsis_igated_counter++; + // prepare buffer for message memset(aprsis_packet_tx_buffer, 0x00, APRSIS_TX_BUFFER_LN); @@ -571,6 +625,46 @@ void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid) { } +void aprsis_send_server_conn_status(const char * callsign_with_ssid) { + + if (aprsis_logged == 0) { + return; + } + + memset (aprsis_packet_tx_buffer, 0x00, APRSIS_TX_BUFFER_LN); + + aprsis_tx_counter++; + + aprsis_packet_tx_message_size = snprintf( + aprsis_packet_tx_buffer, + APRSIS_TX_BUFFER_LN - 1, + "%s>AKLPRZ,qAR,%s:>[aprsis][igated: %d][transmited: %d][keepalive: %d][another: %d]\r\n", + callsign_with_ssid, + callsign_with_ssid, + aprsis_igated_counter, + aprsis_tx_counter, + aprsis_keepalive_received_counter, + aprsis_another_received_counter); + + gsm_sim800_tcpip_async_write((uint8_t *)aprsis_packet_tx_buffer, aprsis_packet_tx_message_size, aprsis_serial_port, aprsis_gsm_modem_state); +} + +void aprsis_send_loginstring(const char * callsign_with_ssid) { + + if (aprsis_logged == 0) { + return; + } + + memset (aprsis_packet_tx_buffer, 0x00, APRSIS_TX_BUFFER_LN); + + aprsis_tx_counter++; + + aprsis_packet_tx_message_size = snprintf(aprsis_packet_tx_buffer, APRSIS_TX_BUFFER_LN - 1, "%s>AKLPRZ,qAR,%s:>[aprsis][]%s\r\n", callsign_with_ssid, callsign_with_ssid, aprsis_login_string_reveived); + + gsm_sim800_tcpip_async_write((uint8_t *)aprsis_packet_tx_buffer, aprsis_packet_tx_message_size, aprsis_serial_port, aprsis_gsm_modem_state); + +} + char * aprsis_get_tx_buffer(void) { return aprsis_packet_tx_buffer; } diff --git a/src/main.c b/src/main.c index b266358..b800452 100644 --- a/src/main.c +++ b/src/main.c @@ -1188,7 +1188,7 @@ int main(int argc, char* argv[]){ rte_main_rx_total++; // if aprsis is logged - if (aprsis_connected == 1) { + if (aprsis_connected == 1 && gsm_sim800_tcpip_tx_busy() == 0) { aprsis_igate_to_aprsis(&ax25_rxed_frame, (const char *)&main_callsign_with_ssid); } @@ -1212,6 +1212,18 @@ int main(int argc, char* argv[]){ gsm_sim800_tx_done_event_handler(main_gsm_srl_ctx_ptr, &main_gsm_state); } + if (rte_main_trigger_gsm_status_packet == 1 && gsm_sim800_tcpip_tx_busy() == 0) { + rte_main_trigger_gsm_status_packet = 0; + + aprsis_send_server_conn_status((const char *)&main_callsign_with_ssid); + } + + if (rte_main_trigger_gsm_loginstring_packet == 1 && gsm_sim800_tcpip_tx_busy() == 0) { + rte_main_trigger_gsm_loginstring_packet = 0; + + aprsis_send_loginstring((const char *)&main_callsign_with_ssid); + } + } #endif @@ -1410,15 +1422,6 @@ int main(int argc, char* argv[]){ NVIC_SystemReset(); } - //aprsis_connect_and_login_default(1); - -// if (gsm_sim800_gprs_ready == 1) { -// -// //api_send_json_status(); -// api_send_json_measuremenets(); -// // retval = http_client_async_get("http://pogoda.cc:8080/meteo_backend/status", strlen("http://pogoda.cc:8080/meteo_backend/status"), 0xFFF0, 0x1, 0); -// } - } #endif diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index 0297b71..13c6439 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -57,8 +57,12 @@ uint8_t packet_tx_modbus_status = (uint8_t)(_TELEM_DESCR_INTERVAL - _WX_INTERVAL uint8_t packet_tx_more_than_one = 0; -#ifdef STM32L471xx +#ifdef PARAMETEO uint8_t packet_tx_trigger_tcp = 0; + +uint8_t packet_tx_meteo_gsm_interval = 2; +uint8_t packet_tx_meteo_gsm_counter = 0; + #define API_TRIGGER_STATUS (1 << 1) #define API_TRIGGER_METEO (1 << 2) #define APRSIS_TRIGGER_METEO (1 << 3) @@ -120,10 +124,27 @@ void packet_tx_tcp_handler(void) { if ((packet_tx_trigger_tcp & APRSIS_TRIGGER_METEO) != 0) { // TODO: fixme - if (aprsis_connected == 0) { - aprsis_result = aprsis_connect_and_login_default(0); + if (gsm_sim800_tcpip_tx_busy() == 0) { - if (aprsis_result == APRSIS_OK) { + 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, + main_callsign_with_ssid, + main_string_latitude, + main_string_longitude, + main_config_data_basic); + } + } + else { // send APRS-IS frame, if APRS-IS is not connected this function will return immediately aprsis_send_wx_frame( rte_wx_average_windspeed, @@ -137,26 +158,10 @@ void packet_tx_tcp_handler(void) { main_string_longitude, main_config_data_basic); } + // TODO: fixme + // clear the bit + packet_tx_trigger_tcp ^= APRSIS_TRIGGER_METEO; } - 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, - main_callsign_with_ssid, - main_string_latitude, - main_string_longitude, - main_config_data_basic); - } - // TODO: fixme - - - // clear the bit - packet_tx_trigger_tcp ^= APRSIS_TRIGGER_METEO; } else if ((packet_tx_trigger_tcp & API_TRIGGER_STATUS) != 0) { @@ -231,6 +236,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con // increase these counters only when WX is enabled packet_tx_meteo_counter++; packet_tx_meteo_kiss_counter++; + packet_tx_meteo_gsm_counter++; } // check if there is a time to send own beacon @@ -290,19 +296,6 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con // service external watchdog while sending weather frame io_ext_watchdog_service(); -#ifdef STM32L471xx - if (main_config_data_gsm->aprsis_enable == 0 && main_config_data_gsm->api_enable == 1) { - // and trigger API wx packet transmission - packet_tx_trigger_tcp |= API_TRIGGER_METEO; - } - else if (main_config_data_gsm->aprsis_enable == 1 && main_config_data_gsm->api_enable == 0) { - packet_tx_trigger_tcp |= APRSIS_TRIGGER_METEO; - } - else { - packet_tx_trigger_tcp = 0; - } -#endif - // check if user want's to send two wx packets one after another if (main_config_data_basic->wx_double_transmit == 1) { rte_main_trigger_wx_packet = 1; @@ -341,6 +334,23 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con } #endif +#ifdef PARAMETEO + if (packet_tx_meteo_gsm_counter >= packet_tx_meteo_gsm_interval) { + if (main_config_data_gsm->aprsis_enable == 0 && main_config_data_gsm->api_enable == 1) { + // and trigger API wx packet transmission + packet_tx_trigger_tcp |= API_TRIGGER_METEO; + } + else if (main_config_data_gsm->aprsis_enable == 1 && main_config_data_gsm->api_enable == 0) { + packet_tx_trigger_tcp |= APRSIS_TRIGGER_METEO; + } + else { + packet_tx_trigger_tcp = 0; + } + + packet_tx_meteo_gsm_counter = 0; + } +#endif + // send wx frame to KISS host once every two minutes if (packet_tx_meteo_kiss_counter >= packet_tx_meteo_kiss_interval && main_kiss_enabled == 1) { @@ -497,6 +507,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con if (packet_tx_telemetry_descr_counter >= packet_tx_telemetry_descr_interval) { #ifdef PARAMETEO + rte_main_trigger_gsm_status_packet = 1; status_send_powersave_registers(REGISTER_LAST_SLEEP, REGISTER_LAST_WKUP, REGISTER_COUNTERS, REGISTER_MONITOR, REGISTER_LAST_SLTIM); #endif diff --git a/src/rte_main.c b/src/rte_main.c index 9f6c1a7..efa2dc9 100644 --- a/src/rte_main.c +++ b/src/rte_main.c @@ -19,6 +19,11 @@ uint8_t rte_main_trigger_modbus_status = 0; uint8_t rte_main_trigger_wx_packet = 0; #ifdef PARAMETEO +uint8_t rte_main_trigger_gsm_status_packet = 0; + +//!< Trigger sending status packet with received APRS is login string +uint8_t rte_main_trigger_gsm_loginstring_packet = 0; + //!< Trigger some reinitialization after waking up from deep sleep uint8_t rte_main_woken_up = 0; diff --git a/system/include/gsm/sim800c_tcpip.h b/system/include/gsm/sim800c_tcpip.h index e6b81c2..c715be1 100644 --- a/system/include/gsm/sim800c_tcpip.h +++ b/system/include/gsm/sim800c_tcpip.h @@ -34,6 +34,8 @@ sim800_return_t gsm_sim800_tcpip_close(srl_context_t * srl_context, gsm_sim800_s void gsm_sim800_tcpip_rx_done_callback(srl_context_t * srl_context, gsm_sim800_state_t * state); void gsm_sim800_tcpip_tx_done_callback(srl_context_t * srl_context, gsm_sim800_state_t * state); +uint8_t gsm_sim800_tcpip_tx_busy(void); + uint8_t gsm_sim800_newline_terminating_callback(uint8_t current_data, const uint8_t * const rx_buffer, uint16_t rx_bytes_counter); void gsm_sim800_tcpip_reset(void); diff --git a/system/src/gsm/sim800c_tcpip.c b/system/src/gsm/sim800c_tcpip.c index d0a6922..44cf302 100644 --- a/system/src/gsm/sim800c_tcpip.c +++ b/system/src/gsm/sim800c_tcpip.c @@ -44,6 +44,9 @@ uint8_t gsm_sim800_tcpip_connection_died = 0; */ uint8_t gsm_sim800_tcpip_receiving = 0; +/** + * If modem is busy with transmitting something + */ uint8_t gsm_sim800_tcpip_transmitting = 0; /** @@ -411,6 +414,10 @@ void gsm_sim800_tcpip_tx_done_callback(srl_context_t * srl_context, gsm_sim800_s gsm_sim800_tcpip_transmitting = 0; } +uint8_t gsm_sim800_tcpip_tx_busy(void) { + return gsm_sim800_tcpip_transmitting; +} + uint8_t gsm_sim800_newline_terminating_callback(uint8_t current_data, const uint8_t * const rx_buffer, uint16_t rx_bytes_counter) { sim800_return_t out = SIM800_OK;