From 95712deddef7014b3dae7942c38176a5e39a70fe Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Fri, 27 Oct 2023 21:33:00 +0200 Subject: [PATCH] sending telemetry and telemetry description --- include/aprsis.h | 6 + include/backup_registers.h | 2 +- include/main.h | 2 +- include/rte_main.h | 2 + include/software_version.h | 2 +- src/aprsis.c | 59 ++++++- src/backup_registers.c | 10 +- src/main.c | 40 ++++- src/packet_tx_handler.c | 13 +- src/rte_main.c | 3 + system/include/aprs/telemetry.h | 12 ++ system/include/aprs/wx.h | 2 +- system/src/aprs/telemetry.c | 285 ++++++++++++++++---------------- system/src/aprs/wx.c | 2 +- 14 files changed, 271 insertions(+), 169 deletions(-) diff --git a/include/aprsis.h b/include/aprsis.h index 160d6e8..5ffd23f 100644 --- a/include/aprsis.h +++ b/include/aprsis.h @@ -12,6 +12,7 @@ #include "drivers/serial.h" #include "gsm/sim800c_tcpip.h" #include "ax25.h" +#include "telemetry.h" typedef enum aprsis_return { @@ -88,6 +89,11 @@ void aprsis_prepare_telemetry( char _telemetry_vbatt_low, const config_data_mode_t * const _config_mode); void aprsis_send_telemetry(uint8_t async, const char * callsign_with_ssid); +telemetry_description_t aprsis_send_description_telemetry(uint8_t async, + const telemetry_description_t what, + const config_data_basic_t * const config_basic, + const config_data_mode_t * const config_mode, + const char * callsign_with_ssid); void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid); void aprsis_send_server_conn_status(const char * callsign_with_ssid); diff --git a/include/backup_registers.h b/include/backup_registers.h index 94425e3..bd1524c 100644 --- a/include/backup_registers.h +++ b/include/backup_registers.h @@ -76,7 +76,7 @@ void backup_reg_set_last_sleep_duration(uint32_t); void backup_reg_reset_counters(void); uint8_t backup_reg_get_telemetry(void); -void backup_reg_set_telemetry(uint8_t); +void backup_reg_set_telemetry(uint16_t); void backup_reg_get_packet_counters(uint8_t * beacon_counter, uint8_t * meteo_counter, uint8_t * meteo_gsm_counter); void backup_reg_set_packet_counters(uint8_t beacon_counter, uint8_t meteo_counter, uint8_t meteo_gsm_counter); diff --git a/include/main.h b/include/main.h index 5b33eed..53e3187 100644 --- a/include/main.h +++ b/include/main.h @@ -20,7 +20,7 @@ #define PWR_SWITCH_BOTH -#define OWN_APRS_MSG_LN 256 +#define OWN_APRS_MSG_LN 256u typedef enum main_usart_mode_t { USART_MODE_UNDEF, diff --git a/include/rte_main.h b/include/rte_main.h index 4670e0b..14b7c76 100644 --- a/include/rte_main.h +++ b/include/rte_main.h @@ -20,6 +20,8 @@ extern uint8_t rte_main_trigger_gsm_loginstring_packet; extern uint8_t rte_main_trigger_gsm_telemetry_values; +extern uint8_t rte_main_trigger_gsm_telemetry_descriptions; + //!< 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 d47eae9..f52ee82 100644 --- a/include/software_version.h +++ b/include/software_version.h @@ -9,7 +9,7 @@ #define SOFTWARE_VERSION_H_ #define SW_VER "EB01" -#define SW_DATE "15102023" +#define SW_DATE "27102023" #define SW_KISS_PROTO "B" extern const char software_version_str[5]; diff --git a/src/aprsis.c b/src/aprsis.c index 26d67a4..26454ae 100644 --- a/src/aprsis.c +++ b/src/aprsis.c @@ -672,7 +672,7 @@ void aprsis_prepare_telemetry( snprintf_size = snprintf( aprsis_packet_telemetry_buffer, APRSIS_TELEMETRY_BUFFER_LN, - "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c", + "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c\r\n", _telemetry_counter, _rx_pkts, _tx_pkts, @@ -693,7 +693,7 @@ void aprsis_prepare_telemetry( snprintf_size = snprintf( aprsis_packet_telemetry_buffer, APRSIS_TELEMETRY_BUFFER_LN, - "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c", + "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c\r\n", _telemetry_counter, _rx_pkts, _viscous_drop_pkts, @@ -753,6 +753,61 @@ void aprsis_send_telemetry(uint8_t async, const char * callsign_with_ssid) { memset(aprsis_packet_telemetry_buffer, 0x00, APRSIS_TELEMETRY_BUFFER_LN); } +/** + * Sends + * @param async + * @param what kind of telemetry description packet should be sent now + * @param callsign_with_ssid + * @return what kind of telemetry description should be sent next + */ +telemetry_description_t aprsis_send_description_telemetry(uint8_t async, + const telemetry_description_t what, + const config_data_basic_t * const config_basic, + const config_data_mode_t * const config_mode, + const char * callsign_with_ssid) { + + telemetry_description_t next = TELEMETRY_NOTHING; + + // check what we want to send and what + switch (what) { + case TELEMETRY_PV_PARM: next = TELEMETRY_PV_EQNS; break; + case TELEMETRY_PV_EQNS: next = TELEMETRY_PV_UNIT; break; + case TELEMETRY_PV_UNIT: next = TELEMETRY_NOTHING; break; + case TELEMETRY_NORMAL_PARAM: next = TELEMETRY_NORMAL_EQNS; break; + case TELEMETRY_NORMAL_EQNS: next = TELEMETRY_NORMAL_UNIT; break; + case TELEMETRY_NORMAL_UNIT: next = TELEMETRY_NOTHING; break; + case TELEMETRY_NOTHING: + default: next = TELEMETRY_NOTHING; break; + } + + // exif if APRSIS is not logged + if (aprsis_logged == 0) { + return next; + } + + telemetry_create_description_string(config_basic, config_mode, what, main_own_aprs_msg, OWN_APRS_MSG_LN); + + aprsis_tx_counter++; + + aprsis_packet_tx_message_size = snprintf( + aprsis_packet_tx_buffer, + APRSIS_TX_BUFFER_LN, + "%s>AKLPRZ,qAR,%s:%s\r\n", + callsign_with_ssid, + callsign_with_ssid, + main_own_aprs_msg); + aprsis_packet_tx_buffer[aprsis_packet_tx_message_size] = 0; + + if (async > 0) { + gsm_sim800_tcpip_async_write((uint8_t *)aprsis_packet_tx_buffer, aprsis_packet_tx_message_size, aprsis_serial_port, aprsis_gsm_modem_state); + } + else { + gsm_sim800_tcpip_write((uint8_t *)aprsis_packet_tx_buffer, aprsis_packet_tx_message_size, aprsis_serial_port, aprsis_gsm_modem_state); + } + + return next; +} + void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid) { // iterator to move across tx buffer diff --git a/src/backup_registers.c b/src/backup_registers.c index d8642d3..8639970 100644 --- a/src/backup_registers.c +++ b/src/backup_registers.c @@ -479,9 +479,15 @@ uint8_t backup_reg_get_telemetry(void) { /** * */ -void backup_reg_set_telemetry(uint8_t in) { +void backup_reg_set_telemetry(uint16_t in) { backup_reg_unclock(); + if (in > 255) { + in = 0; + } + + const uint8_t narrowed_in = (uint8_t)(in & 0xFFu); + #ifdef PARAMETEO // get current value @@ -491,7 +497,7 @@ void backup_reg_set_telemetry(uint8_t in) { reg_value &= (0xFFFFFFFFu ^ 0xFFu); // store updated value - reg_value |= in; + reg_value |= narrowed_in; // recalculate checksum const uint8_t new_checksum = backup_reg_calculate_checksum(reg_value); diff --git a/src/main.c b/src/main.c index c29d003..0bd31a3 100644 --- a/src/main.c +++ b/src/main.c @@ -52,6 +52,7 @@ #include "io.h" #include "float_to_string.h" #include "pwr_save.h" +#include "button.h" #include #include "io_default_vbat_scaling.h" @@ -61,6 +62,7 @@ #include "aprs/telemetry.h" #include "aprs/dac.h" #include "aprs/beacon.h" +#include "aprs/status.h" #include "ve_direct_protocol/parser.h" @@ -148,11 +150,11 @@ // Sample pragmas to cope with warnings. Please note the related line at // the end of this function, used to pop the compiler diagnostics status. -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -#pragma GCC diagnostic ignored "-Wmissing-declarations" -#pragma GCC diagnostic ignored "-Wreturn-type" -#pragma GCC diagnostic ignored "-Wempty-body" +//#pragma GCC diagnostic push +//#pragma GCC diagnostic ignored "-Wunused-parameter" +//#pragma GCC diagnostic ignored "-Wmissing-declarations" +//#pragma GCC diagnostic ignored "-Wreturn-type" +//#pragma GCC diagnostic ignored "-Wempty-body" // used configuration structures const config_data_mode_t * main_config_data_mode = 0; @@ -286,6 +288,9 @@ volatile int i = 0; #if defined(PARAMETEO) //!< Triggers additional check if ADC has properly reinitialized and conversion is working uint8_t main_check_adc = 0; + +//!< Used to store an information which telemetry descritpion frame should be sent next +telemetry_description_t main_telemetry_description = TELEMETRY_NOTHING; #endif char after_tx_lock; @@ -1144,8 +1149,6 @@ int main(int argc, char* argv[]){ // restart ADCs io_vbat_meas_enable(); -// ADCStartConfig(); -// DACStartConfig(); rte_main_battery_voltage = io_vbat_meas_get(); rte_main_average_battery_voltage = io_vbat_meas_average(rte_main_battery_voltage); @@ -1249,6 +1252,29 @@ int main(int argc, char* argv[]){ aprsis_send_telemetry(1u, (const char *)&main_callsign_with_ssid); } + if (rte_main_trigger_gsm_telemetry_descriptions == 1 && gsm_sim800_tcpip_tx_busy() == 0) { + + // check if this ought to be first telemetry description in sequence + if (main_telemetry_description == TELEMETRY_NOTHING) { + // if yes check if victron telemetry is enabled + if (main_config_data_mode->victron != 0) { + // set the first packet accordingly + main_telemetry_description = TELEMETRY_PV_PARM; + } + else { + main_telemetry_description = TELEMETRY_NORMAL_PARAM; + } + } + + // assemble and sent a telemetry description packet + main_telemetry_description = aprsis_send_description_telemetry(1u, main_telemetry_description, main_config_data_basic, main_config_data_mode, (const char *)&main_callsign_with_ssid); + + // if there is nothing to send + if (main_telemetry_description == TELEMETRY_NOTHING) { + rte_main_trigger_gsm_telemetry_descriptions = 0; + } + } + } #endif diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index 28376ee..456c653 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -264,15 +264,6 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con // if WX is enabled if ((main_config_data_mode->wx & WX_ENABLED) == WX_ENABLED) { - #ifdef STM32L471xx - // send wx packet to APRSIS one minute before radio transmission - if (packet_tx_meteo_counter == packet_tx_meteo_interval - 1 && packet_tx_meteo_interval != 0) { - // TODO: fixme - //packet_tx_trigger_tcp |= APRSIS_TRIGGER_METEO; - - //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); - } - #endif // check if there is a time to send meteo packet through RF if (packet_tx_meteo_counter >= packet_tx_meteo_interval && packet_tx_meteo_interval != 0) { @@ -369,7 +360,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con srl_wait_for_tx_completion(main_kiss_srl_ctx_ptr); // create wx data packet into specified buffer - SendWXFrameToBuffer(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_kiss_srl_ctx_ptr->srl_tx_buf_pointer, main_kiss_srl_ctx_ptr->srl_tx_buf_ln, &ln); + SendWXFrameToKissBuffer(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_kiss_srl_ctx_ptr->srl_tx_buf_pointer, main_kiss_srl_ctx_ptr->srl_tx_buf_ln, &ln); srl_start_tx(main_kiss_srl_ctx_ptr, ln); @@ -538,7 +529,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; + rte_main_trigger_gsm_telemetry_descriptions = 1; status_send_powersave_registers(); #endif diff --git a/src/rte_main.c b/src/rte_main.c index a0b738d..4992ca2 100644 --- a/src/rte_main.c +++ b/src/rte_main.c @@ -27,6 +27,9 @@ uint8_t rte_main_trigger_gsm_loginstring_packet = 0; //!< Trigger packet with telemetry value AFTER it is prepared uint8_t rte_main_trigger_gsm_telemetry_values = 0; +//!< Trigger set of packets with telemetry description +uint8_t rte_main_trigger_gsm_telemetry_descriptions = 0; + //!< Trigger some reinitialization after waking up from deep sleep uint8_t rte_main_woken_up = 0; diff --git a/system/include/aprs/telemetry.h b/system/include/aprs/telemetry.h index 5c6ea2b..4a3dfb9 100644 --- a/system/include/aprs/telemetry.h +++ b/system/include/aprs/telemetry.h @@ -45,6 +45,16 @@ typedef enum wind_qf { WIND_QF_DEGRADATED = 3 }wind_qf_t; +typedef enum telemetry_descritpion_t { + TELEMETRY_PV_PARM, + TELEMETRY_PV_EQNS, + TELEMETRY_PV_UNIT, + TELEMETRY_NORMAL_PARAM, + TELEMETRY_NORMAL_EQNS, + TELEMETRY_NORMAL_UNIT, + TELEMETRY_NOTHING +}telemetry_description_t; + extern char telemetry_qf; extern char telemetry_degr; extern char telemetry_nav; @@ -57,6 +67,8 @@ extern uint8_t telemetry_scaled_temperature; void telemetry_init(void); +int telemetry_create_description_string(const config_data_basic_t * const config_basic, const config_data_mode_t * const config_mode, const telemetry_description_t what, char * out, uint16_t out_ln); + #ifdef __cplusplus extern "C" { diff --git a/system/include/aprs/wx.h b/system/include/aprs/wx.h index 6bde95b..4d8b5c1 100644 --- a/system/include/aprs/wx.h +++ b/system/include/aprs/wx.h @@ -13,6 +13,6 @@ void SendWXFrame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t humidity); -void SendWXFrameToBuffer(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t humidity, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln); +void SendWXFrameToKissBuffer(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t humidity, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln); #endif /* INCLUDE_APRS_WX_H_ */ diff --git a/system/src/aprs/telemetry.c b/system/src/aprs/telemetry.c index d88b89a..32aafc9 100644 --- a/system/src/aprs/telemetry.c +++ b/system/src/aprs/telemetry.c @@ -9,6 +9,7 @@ #include "main.h" #include "delay.h" #include "backup_registers.h" +#include "variant.h" #include "ve_direct_protocol/parser.h" @@ -40,6 +41,135 @@ void telemetry_init(void) { telemetry_counter = backup_reg_get_telemetry(); } +int telemetry_create_description_string(const config_data_basic_t * const config_basic, const config_data_mode_t * const config_mode, const telemetry_description_t what, char * out, uint16_t out_ln) { + + int out_size = 0; + + // a buffer to assembly the 'call-ssid' string at the begining of the frame + char message_prefix_buffer[9]; + + memset(message_prefix_buffer, 0x00, 0x09); + + sprintf(message_prefix_buffer, "%s-%d", config_basic->callsign, config_basic->ssid); + + int is_viscous = 1; + + if (variant_validate_is_within_ram((uint32_t)out) == 0) { + return out_size; + } + + if (variant_validate_is_within_ram((uint32_t)config_mode) == 0) { + is_viscous = 0; + } + else if (config_mode->digi_viscous == 0) { + is_viscous = 0; + } + else { + ; + } + + switch (what) { + case TELEMETRY_PV_PARM: { + + if (config_basic->ssid == 0) + out_size = snprintf(out, out_ln, ":%-6s :PARM.Rx10min,Digi10min,BatAmps,BatVolt,PvVolt,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", config_basic->callsign); + else if (config_basic->ssid > 0 && config_basic->ssid < 10) + out_size = snprintf(out, out_ln, ":%-9s:PARM.Rx10min,Digi10min,BatAmps,BatVolt,PvVolt,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", message_prefix_buffer); + else if (config_basic->ssid >= 10 && config_basic->ssid < 16) + out_size = snprintf(out, out_ln, ":%-9s:PARM.Rx10min,Digi10min,BatAmps,BatVolt,PvVolt,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", message_prefix_buffer); + else + return out_size; + + break; + } + case TELEMETRY_PV_EQNS: { + + if (config_basic->ssid == 0) + out_size = snprintf(out, out_ln, ":%-6s :EQNS.0,1,0,0,1,0,0,0.07,-8,0,0.07,4,0,0.07,4", config_basic->callsign); + else if (config_basic->ssid > 0 && config_basic->ssid < 10) + out_size = snprintf(out, out_ln, ":%-9s:EQNS.0,1,0,0,1,0,0,0.07,-8,0,0.07,4,0,0.07,4", message_prefix_buffer); + else if (config_basic->ssid >= 10 && config_basic->ssid < 16) + out_size = snprintf(out, out_ln, ":%-9s:EQNS.0,1,0,0,1,0,0,0.07,-8,0,0.07,4,0,0.07,4", message_prefix_buffer); + else + return out_size; + + break; + } + case TELEMETRY_PV_UNIT: { + + if (config_basic->ssid == 0) + out_size = snprintf(out, out_ln, ":%-6s :UNIT.Pkt,Pkt,A,V,V,Hi,Hi,Hi,Hi,Hi,Hi,Hi", config_basic->callsign); + else if (config_basic->ssid > 0 && config_basic->ssid < 10) + out_size = snprintf(out, out_ln, ":%-9s:UNIT.Pkt,Pkt,A,V,V,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); + else if (config_basic->ssid >= 10 && config_basic->ssid < 16) + out_size = snprintf(out, out_ln, ":%-9s:UNIT.Pkt,Pkt,A,V,V,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); + else + return out_size; + + break; + } + + case TELEMETRY_NORMAL_PARAM : { + + if (is_viscous == 0) { + // prepare a frame with channel names depending on SSID + if (config_basic->ssid == 0) + out_size = snprintf(out, out_ln, ":%-6s :PARM.Rx10min,Tx10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", config_basic->callsign); + else if (config_basic->ssid > 0 && config_basic->ssid < 10) + out_size = snprintf(out, out_ln, ":%-9s:PARM.Rx10min,Tx10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); + else if (config_basic->ssid >= 10 && config_basic->ssid < 16) + out_size = snprintf(out, out_ln, ":%-9s:PARM.Rx10min,Tx10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); + else + return out_size; + } + else { + // prepare a frame with channel names depending on SSID + if (config_basic->ssid == 0) + out_size = snprintf(out, out_ln, ":%-6s :PARM.Rx10min,Visc10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", config_basic->callsign); + else if (config_basic->ssid > 0 && config_basic->ssid < 10) + out_size = snprintf(out, out_ln, ":%-9s:PARM.Rx10min,Visc10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); + else if (config_basic->ssid >= 10 && config_basic->ssid < 16) + out_size = snprintf(out, out_ln, ":%-9s:PARM.Rx10min,Visc10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); + else + return out_size; + } + + break; + } + case TELEMETRY_NORMAL_EQNS : { + + if (config_basic->ssid == 0) + out_size = snprintf(out, out_ln, out_ln, ":%-6s :EQNS.0,1,0,0,1,0,0,1,0,0,0.02,10,0,0.5,-50", config_basic->callsign); + else if (config_basic->ssid > 0 && config_basic->ssid < 10) + out_size = snprintf(out, out_ln, out_ln, ":%-9s:EQNS.0,1,0,0,1,0,0,1,0,0,0.02,10,0,0.5,-50", message_prefix_buffer); + else if (config_basic->ssid >= 10 && config_basic->ssid < 16) + out_size = snprintf(out, out_ln, out_ln, ":%-9s:EQNS.0,1,0,0,1,0,0,1,0,0,0.02,10,0,0.5,-50", message_prefix_buffer); + else + return out_size; + + break; + } + case TELEMETRY_NORMAL_UNIT : { + + if (config_basic->ssid == 0) + out_size = snprintf(out, out_ln, ":%-6s :UNIT.Pkt,Pkt,Pkt,V,DegC,Hi,Hi,Hi,Hi,Hi,Hi,Hi,Hi", config_basic->callsign); + else if (config_basic->ssid > 0 && config_basic->ssid < 10) + out_size = snprintf(out, out_ln, ":%-9s:UNIT.Pkt,Pkt,Pkt,V,DegC,Hi,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); + else if (config_basic->ssid >= 10 && config_basic->ssid < 16) + out_size = snprintf(out, out_ln, ":%-9s:UNIT.Pkt,Pkt,Pkt,V,DegC,Hi,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); + else + return out_size; + + break; + } + } + + out[out_size] = 0; + + return out_size; + +} + void telemetry_send_chns_description_pv(const config_data_basic_t * const config_basic) { // a buffer to assembly the 'call-ssid' string at the begining of the frame @@ -51,52 +181,25 @@ void telemetry_send_chns_description_pv(const config_data_basic_t * const config while (main_afsk.sending == 1); - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :PARM.Rx10min,Digi10min,BatAmps,BatVolt,PvVolt,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Digi10min,BatAmps,BatVolt,PvVolt,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Digi10min,BatAmps,BatVolt,PvVolt,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", message_prefix_buffer); - else - return; - main_own_aprs_msg[main_own_aprs_msg_len] = 0; + main_own_aprs_msg_len = telemetry_create_description_string(config_basic, 0x00, TELEMETRY_PV_PARM, main_own_aprs_msg, OWN_APRS_MSG_LN); ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); after_tx_lock = 1; afsk_txStart(&main_afsk); while (main_afsk.sending == 1); - delay_fixed(1200); - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :EQNS.0,1,0,0,1,0,0,0.07,-8,0,0.07,4,0,0.07,4", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:EQNS.0,1,0,0,1,0,0,0.07,-8,0,0.07,4,0,0.07,4", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:EQNS.0,1,0,0,1,0,0,0.07,-8,0,0.07,4,0,0.07,4", message_prefix_buffer); - else - return; - main_own_aprs_msg[main_own_aprs_msg_len] = 0; + main_own_aprs_msg_len = telemetry_create_description_string(config_basic, 0x00, TELEMETRY_PV_EQNS, main_own_aprs_msg, OWN_APRS_MSG_LN); ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); after_tx_lock = 1; afsk_txStart(&main_afsk); while (main_afsk.sending == 1); - delay_fixed(1200); - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :UNIT.Pkt,Pkt,A,V,V,Hi,Hi,Hi,Hi,Hi,Hi,Hi", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:UNIT.Pkt,Pkt,A,V,V,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:UNIT.Pkt,Pkt,A,V,V,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); - else - return; - - main_own_aprs_msg[main_own_aprs_msg_len] = 0; + main_own_aprs_msg_len = telemetry_create_description_string(config_basic, 0x00, TELEMETRY_PV_UNIT, main_own_aprs_msg, OWN_APRS_MSG_LN); ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); after_tx_lock = 1; afsk_txStart(&main_afsk); @@ -241,132 +344,30 @@ void telemetry_send_chns_description(const config_data_basic_t * const config_ba // clear the output frame buffer memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg)); -#ifdef PARAMETEO - if (config_mode->digi_viscous == 0) { - // prepare a frame with channel names depending on SSID - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :PARM.Rx10min,Tx10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Tx10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Tx10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); - else - return; - } - else { - // prepare a frame with channel names depending on SSID - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :PARM.Rx10min,Visc10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Visc10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Visc10min,Digi10min,Vbatt,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); - else - return; - } -#else - if (config_mode->digi_viscous == 0) { - // prepare a frame with channel names depending on SSID - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :PARM.Rx10min,Tx10min,Digi10min,HostTx10m,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Tx10min,Digi10min,HostTx10m,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Tx10min,Digi10min,HostTx10m,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB,VBATT_LOW", message_prefix_buffer); - else - return; - } - else { - // prepare a frame with channel names depending on SSID - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :PARM.Rx10min,Tx10min,Digi10min,Visc10min,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Tx10min,Digi10min,Visc10min,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:PARM.Rx10min,Tx10min,Digi10min,Visc10min,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", message_prefix_buffer); - else - return; - } -#endif - - // place a null terminator at the end - main_own_aprs_msg[main_own_aprs_msg_len] = 0; - - // prepare transmission + main_own_aprs_msg_len = telemetry_create_description_string(config_basic, config_mode, TELEMETRY_NORMAL_PARAM, main_own_aprs_msg, OWN_APRS_MSG_LN); ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); after_tx_lock = 1; // key up the transmitter and afsk_txStart(&main_afsk); - main_wait_for_tx_complete(); - delay_fixed(1500); - WAIT_FOR_CHANNEL_FREE(); -#ifdef PARAMETEO - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :EQNS.0,1,0,0,1,0,0,1,0,0,0.02,10,0,0.5,-50", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:EQNS.0,1,0,0,1,0,0,1,0,0,0.02,10,0,0.5,-50", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:EQNS.0,1,0,0,1,0,0,1,0,0,0.02,10,0,0.5,-50", message_prefix_buffer); - else - return; -#else - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :EQNS.0,1,0,0,1,0,0,1,0,0,1,0,0,0.5,-50", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:EQNS.0,1,0,0,1,0,0,1,0,0,1,0,0,0.5,-50", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:EQNS.0,1,0,0,1,0,0,1,0,0,1,0,0,0.5,-50", message_prefix_buffer); - else - return; -#endif + main_own_aprs_msg_len = telemetry_create_description_string(config_basic, config_mode, TELEMETRY_NORMAL_EQNS, main_own_aprs_msg, OWN_APRS_MSG_LN); + ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); + after_tx_lock = 1; - main_own_aprs_msg[main_own_aprs_msg_len] = 0; + afsk_txStart(&main_afsk); + main_wait_for_tx_complete(); + delay_fixed(1500); + WAIT_FOR_CHANNEL_FREE(); + + main_own_aprs_msg_len = telemetry_create_description_string(config_basic, config_mode, TELEMETRY_NORMAL_UNIT, main_own_aprs_msg, OWN_APRS_MSG_LN); ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); after_tx_lock = 1; afsk_txStart(&main_afsk); - main_wait_for_tx_complete(); - - delay_fixed(1500); - - WAIT_FOR_CHANNEL_FREE(); - -#ifdef PARAMETEO - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :UNIT.Pkt,Pkt,Pkt,V,DegC,Hi,Hi,Hi,Hi,Hi,Hi,Hi,Hi", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:UNIT.Pkt,Pkt,Pkt,V,DegC,Hi,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:UNIT.Pkt,Pkt,Pkt,V,DegC,Hi,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); - else - return; -#else - if (config_basic->ssid == 0) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-6s :UNIT.Pkt,Pkt,Pkt,Pkt,DegC,Hi,Hi,Hi,Hi,Hi,Hi,Hi,Hi", config_basic->callsign); - else if (config_basic->ssid > 0 && config_basic->ssid < 10) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:UNIT.Pkt,Pkt,Pkt,Pkt,DegC,Hi,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); - else if (config_basic->ssid >= 10 && config_basic->ssid < 16) - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%-9s:UNIT.Pkt,Pkt,Pkt,Pkt,DegC,Hi,Hi,Hi,Hi,Hi,Hi,Hi,Hi", message_prefix_buffer); - else - return; -#endif - - main_own_aprs_msg[main_own_aprs_msg_len] = 0; - ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); - after_tx_lock = 1; - afsk_txStart(&main_afsk); -// -// main_wait_for_tx_complete(); -// -// delay_fixed(1500); -// -// while (main_ax25.dcd == 1); - } /** diff --git a/system/src/aprs/wx.c b/system/src/aprs/wx.c index 352a3f5..3004951 100644 --- a/system/src/aprs/wx.c +++ b/system/src/aprs/wx.c @@ -62,7 +62,7 @@ void SendWXFrame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, } -void SendWXFrameToBuffer(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t humidity, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln) { +void SendWXFrameToKissBuffer(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t humidity, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln) { uint16_t output_frame_ln = 0;