From 3f51027c609529db2feb65317374517c27e3d2b0 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Fri, 16 Jun 2023 22:30:20 +0200 Subject: [PATCH] fixes in aprsis igate code after ut --- include/aprsis.h | 37 ++++++++-- include/main.h | 3 +- src/aprsis.c | 152 +++++++++++++++++++++++++++++++--------- src/main.c | 12 +++- src/packet_tx_handler.c | 26 +++++-- 5 files changed, 184 insertions(+), 46 deletions(-) diff --git a/include/aprsis.h b/include/aprsis.h index 61f045e..75d57ed 100644 --- a/include/aprsis.h +++ b/include/aprsis.h @@ -10,7 +10,8 @@ #include "drivers/serial.h" #include "gsm/sim800c_tcpip.h" - +#include "ax25.h" +#include "config_data.h" typedef enum aprsis_return { @@ -35,15 +36,41 @@ extern uint8_t aprsis_connected; * @param reset_on_timeout Set to one to reset GSM module in case of APRS-IS * instead of only reconnecting */ -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, uint8_t reset_on_timeout); +void aprsis_init( + srl_context_t * context, + gsm_sim800_state_t * gsm_modem_state, + const char * callsign, + uint8_t ssid, + uint32_t passcode, + const char * default_server, + const uint16_t default_port, + uint8_t reset_on_timeout, + const char * callsign_with_ssid); aprsis_return_t aprsis_connect_and_login(const 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); -void aprsis_send_wx_frame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t humidity); -void aprsis_send_beacon(uint8_t async); -void aprsis_igate_to_aprsis(struct AX25Msg *msg); +void aprsis_send_wx_frame(uint16_t windspeed, + uint16_t windgusts, + uint16_t winddirection, + float temperatura, + float cisnienie, + uint8_t humidity, + const char * callsign_with_ssid, + const char * string_latitude, + const char * string_longitude, + const config_data_basic_t * config_data_basic); +void aprsis_send_beacon(uint8_t async, + const char * callsign_with_ssid, + const char * string_latitude, + char symbol_f, + const char * string_longitude, + char symbol_s, + const config_data_basic_t * config_data_basic); +void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid); + +char * aprsis_get_tx_buffer(void); #endif /* APRSIS_H_ */ diff --git a/include/main.h b/include/main.h index bb39689..36c77d8 100644 --- a/include/main.h +++ b/include/main.h @@ -11,7 +11,7 @@ #include "gsm/sim800_state_t.h" #define SW_VER "EA22" -#define SW_DATE "10062023" +#define SW_DATE "15062023" #define SW_KISS_PROTO "A" #define SYSTICK_TICKS_PER_SECONDS 100 @@ -76,6 +76,7 @@ extern char main_own_aprs_msg[OWN_APRS_MSG_LN]; extern char main_string_latitude[9]; extern char main_string_longitude[9]; +extern char main_callsign_with_ssid[10]; extern char main_symbol_f; extern char main_symbol_s; diff --git a/src/aprsis.c b/src/aprsis.c index af799d0..fabf524 100644 --- a/src/aprsis.c +++ b/src/aprsis.c @@ -18,11 +18,6 @@ srl_context_t * aprsis_serial_port; gsm_sim800_state_t * aprsis_gsm_modem_state; -/** - * Buffer to store string representation of callsign with SSID - */ -char aprsis_callsign_with_ssid[10]; - /** * Size of transmit buffer */ @@ -53,6 +48,8 @@ char aprsis_login_string[64]; */ const char * aprsis_default_server_address; +const char * aprsis_callsign_with_ssid; + uint16_t aprsis_default_server_address_ln = 0; uint16_t aprsis_default_server_port; @@ -78,25 +75,32 @@ uint32_t aprsis_reset_on_timeout = 0; #define APRSIS_TIMEOUT_MS 123000//123000 -#define MAXIMUM_CALL_SSID_LN 9 +/** + * Lenght of 6 letter callsign + two digit SSID + end character like '>' or "," + */ +#define MAXIMUM_CALL_SSID_DASH_LN 10 -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, uint8_t reset_on_timeout) { +void aprsis_init( + srl_context_t * context, + gsm_sim800_state_t * gsm_modem_state, + const char * callsign, + uint8_t ssid, + uint32_t passcode, + const char * default_server, + const uint16_t default_port, + uint8_t reset_on_timeout, + const char * callsign_with_ssid) { aprsis_serial_port = context; aprsis_gsm_modem_state = gsm_modem_state; aprsis_passcode = (int32_t)passcode; - if (ssid != 0) { - sprintf(aprsis_callsign_with_ssid, "%s-%d", callsign, ssid); - } - else { - sprintf(aprsis_callsign_with_ssid, "%s", callsign); - } + aprsis_callsign_with_ssid = callsign_with_ssid; memset(aprsis_login_string, 0x00, 0x40); - sprintf(aprsis_login_string, "user %s pass %ld vers ParaMETEO %s \r\n", aprsis_callsign_with_ssid, aprsis_passcode, SW_VER); + sprintf(aprsis_login_string, "user %s pass %ld vers ParaMETEO %s \r\n", callsign_with_ssid, aprsis_passcode, SW_VER); aprsis_logged = 0; @@ -187,7 +191,7 @@ aprsis_return_t aprsis_connect_and_login(const char * address, uint8_t address_l aprsis_last_keepalive_ts = master_time; if (auto_send_beacon != 0) { - aprsis_send_beacon(0); + aprsis_send_beacon(0, aprsis_callsign_with_ssid, main_string_latitude, main_symbol_f, main_string_longitude, main_symbol_s, main_config_data_basic); } // set timeout for aprs-is server @@ -286,7 +290,30 @@ void aprsis_check_alive(void) { } } -void aprsis_send_wx_frame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t humidity) { +/** + * + * @param windspeed + * @param windgusts + * @param winddirection + * @param temperatura + * @param cisnienie + * @param humidity + * @param callsign_with_ssid + * @param string_latitude + * @param string_longitude + * @param config_data_basic + */ +void aprsis_send_wx_frame( + uint16_t windspeed, + uint16_t windgusts, + uint16_t winddirection, + float temperatura, + float cisnienie, + uint8_t humidity, + const char * callsign_with_ssid, + const char * string_latitude, + const char * string_longitude, + const config_data_basic_t * config_data_basic) { if (aprsis_logged == 0) { return; @@ -322,7 +349,23 @@ void aprsis_send_wx_frame(uint16_t windspeed, uint16_t windgusts, uint16_t windd 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_buffer, "%s>AKLPRZ,qAR,%s:!%s%c%c%s%c%c%03d/%03dg%03dt%03dr...p...P...b%05ldh%02d\r\n", aprsis_callsign_with_ssid, aprsis_callsign_with_ssid, main_string_latitude, main_config_data_basic->n_or_s, '/', main_string_longitude, main_config_data_basic->e_or_w, '_', /* kierunek */direction, /* predkosc*/(int)wind_speed_mph, /* porywy */(short)(wind_gusts_mph), /*temperatura */(short)(temperatura*1.8+32), pressure, humidity); + aprsis_packet_tx_message_size = sprintf( + aprsis_packet_tx_buffer, + "%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, + string_latitude, + config_data_basic->n_or_s, + '/', + string_longitude, + config_data_basic->e_or_w, + '_', + /* kierunek */direction, + /* predkosc*/(int)wind_speed_mph, + /* porywy */(short)(wind_gusts_mph), + /*temperatura */(short)(temperatura*1.8+32), + pressure, + humidity); aprsis_packet_tx_buffer[aprsis_packet_tx_message_size] = 0; gsm_sim800_tcpip_async_write((uint8_t *)aprsis_packet_tx_buffer, aprsis_packet_tx_message_size, aprsis_serial_port, aprsis_gsm_modem_state); @@ -333,13 +376,32 @@ void aprsis_send_wx_frame(uint16_t windspeed, uint16_t windgusts, uint16_t windd * @param async zero for blocking io, which lock this function during transmission. * non zero for non blocking io, function will return immediately and sending will be done in background */ -void aprsis_send_beacon(uint8_t async) { +void aprsis_send_beacon( + uint8_t async, + const char * callsign_with_ssid, + const char * string_latitude, + char symbol_f, + const char * string_longitude, + char symbol_s, + const config_data_basic_t * config_data_basic + ) { if (aprsis_logged == 0) { return; } - aprsis_packet_tx_message_size = sprintf(aprsis_packet_tx_buffer, "%s>AKLPRZ,qAR,%s:=%s%c%c%s%c%c %s\r\n", aprsis_callsign_with_ssid, aprsis_callsign_with_ssid, 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_buffer, + "%s>AKLPRZ,qAR,%s:=%s%c%c%s%c%c %s\r\n", + callsign_with_ssid, + callsign_with_ssid, + string_latitude, + config_data_basic->n_or_s, + symbol_f, + string_longitude, + config_data_basic->e_or_w, + symbol_s, + config_data_basic->comment); aprsis_packet_tx_buffer[aprsis_packet_tx_message_size] = 0; if (async > 0) { @@ -350,10 +412,12 @@ void aprsis_send_beacon(uint8_t async) { } } -void aprsis_igate_to_aprsis(struct AX25Msg *msg) { +void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid) { // iterator to move across tx buffer - uint8_t tx_buffer_it = 0; + uint16_t tx_buffer_it = 0; + + uint16_t payload_ln = 0; // string lenght returned by snprintf int snprintf_size = 0; @@ -366,29 +430,23 @@ void aprsis_igate_to_aprsis(struct AX25Msg *msg) { // prepare buffer for message memset(aprsis_packet_tx_buffer, 0x00, APRSIS_TX_BUFFER_LN); - // lenght of a source call - const size_t source_call_ln = strlen(msg->src.call); - - // lenght of destination call - const size_t dest_call_ln = strlen(msg->dst.call); - // put callsign strncat(aprsis_packet_tx_buffer, msg->src.call, 6); // put source call - if ((msg->src.ssid & 0xF) == 0) { - snprintf_size = snprintf(aprsis_packet_tx_buffer, MAXIMUM_CALL_SSID_LN, "%.6s-%d>", msg->src.call, msg->src.ssid & 0xF); + if ((msg->src.ssid & 0xF) != 0) { + snprintf_size = snprintf(aprsis_packet_tx_buffer, MAXIMUM_CALL_SSID_DASH_LN, "%.6s-%d>", msg->src.call, msg->src.ssid & 0xF); } else { // callsign without SSID - snprintf_size = snprintf(aprsis_packet_tx_buffer, MAXIMUM_CALL_SSID_LN, "%.6s>", msg->src.call); + snprintf_size = snprintf(aprsis_packet_tx_buffer, MAXIMUM_CALL_SSID_DASH_LN, "%.6s>", msg->src.call); } // move iterator forward tx_buffer_it = (uint8_t) snprintf_size & 0xFFU; // put destination call - for sake of simplicity ignore SSID - snprintf_size = snprintf(aprsis_packet_tx_buffer + tx_buffer_it, MAXIMUM_CALL_SSID_LN, "%.6s,", msg->dst.call); + snprintf_size = snprintf(aprsis_packet_tx_buffer + tx_buffer_it, MAXIMUM_CALL_SSID_DASH_LN, "%.6s,", msg->dst.call); // move iterator tx_buffer_it += (uint8_t) snprintf_size & 0xFFU; @@ -397,15 +455,39 @@ void aprsis_igate_to_aprsis(struct AX25Msg *msg) { for (int i = 0; i < msg->rpt_cnt; i++) { if ((msg->rpt_lst[i].ssid & 0x0F) == 0) { if ((msg->rpt_lst[i].ssid & 0x40) == 0x40) - snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s*,", cIn->tDigi[i].call); + snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s*,", msg->rpt_lst[i].call); else - snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s,", cIn->tDigi[i].call); + snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s,", msg->rpt_lst[i].call); } else { if ((msg->rpt_lst[i].ssid & 0x40) == 0x40) - snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s-%d*," cIn->tDigi[i].call, (msg->rpt_lst[i].ssid & 0x0F)); + snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s-%d*,", msg->rpt_lst[i].call, (msg->rpt_lst[i].ssid & 0x0F)); else - snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s-%d", cIn->tDigi[i].call, (msg->rpt_lst[i].ssid & 0x0F)); + snprintf_size = sprintf(aprsis_packet_tx_buffer + tx_buffer_it, "%.6s-%d,", msg->rpt_lst[i].call, (msg->rpt_lst[i].ssid & 0x0F)); } + + // move iterator + tx_buffer_it += (uint8_t) snprintf_size & 0xFFU; } + + snprintf_size = snprintf(aprsis_packet_tx_buffer + tx_buffer_it, MAXIMUM_CALL_SSID_DASH_LN + 5, "qAR,%s:", callsign_with_ssid); + + // move iterator + tx_buffer_it += (uint8_t) snprintf_size & 0xFFU; + + // cut the data field if it is too long to fit in transmission buffer + if (msg->len + tx_buffer_it >= APRSIS_TX_BUFFER_LN) { + payload_ln = APRSIS_TX_BUFFER_LN - tx_buffer_it - 1; // keep one byte for null terminator + } + else { + payload_ln = msg->len; + } + + memcpy(aprsis_packet_tx_buffer + tx_buffer_it, msg->info, payload_ln); + + +} + +char * aprsis_get_tx_buffer(void) { + return aprsis_packet_tx_buffer; } diff --git a/src/main.c b/src/main.c index 85eb1c2..58ae018 100644 --- a/src/main.c +++ b/src/main.c @@ -253,6 +253,7 @@ char main_own_aprs_msg[OWN_APRS_MSG_LN]; char main_string_latitude[9]; char main_string_longitude[9]; +char main_callsign_with_ssid[10]; #define MAIN_SMALL_BUFFER_LN 20 uint8_t main_small_buffer[MAIN_SMALL_BUFFER_LN]; @@ -521,6 +522,14 @@ int main(int argc, char* argv[]){ memset(main_string_longitude, 0x00, sizeof(main_string_longitude)); float_to_string(main_config_data_basic->longitude, main_string_longitude, sizeof(main_string_longitude), 2, 5); + // make a string with callsign and ssid + if (main_config_data_basic->ssid != 0) { + sprintf(main_callsign_with_ssid, "%s-%d", main_config_data_basic->callsign, main_config_data_basic->ssid); + } + else { + sprintf(main_callsign_with_ssid, "%s", main_config_data_basic->callsign); + } + switch(main_config_data_basic->symbol) { case 0: // _SYMBOL_DIGI main_symbol_f = '/'; @@ -1068,7 +1077,8 @@ int main(int argc, char* argv[]){ main_config_data_gsm->aprsis_passcode, (const char *)main_config_data_gsm->aprsis_server_address, main_config_data_gsm->aprsis_server_port, - configuration_get_power_cycle_gsmradio_on_no_communications()); + configuration_get_power_cycle_gsmradio_on_no_communications(), + main_callsign_with_ssid); } } diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index 062ad7a..fa86b24 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -110,8 +110,6 @@ inline void packet_tx_multi_per_call_handler(void) { void packet_tx_tcp_handler(void) { #ifdef STM32L471xx - uint8_t result = 0; - aprsis_return_t aprsis_result = APRSIS_UNKNOWN; if ((packet_tx_trigger_tcp & APRSIS_TRIGGER_METEO) != 0) { @@ -121,12 +119,32 @@ void packet_tx_tcp_handler(void) { 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); + 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, 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, + main_callsign_with_ssid, + main_string_latitude, + main_string_longitude, + main_config_data_basic); } // TODO: fixme