From d8fb993001e451b9cfbad7b0d7950fd841b95245 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Wed, 25 Oct 2023 22:29:39 +0200 Subject: [PATCH] sending telemetry to aprs-is --- include/aprsis.h | 19 +++++ include/rte_main.h | 2 + src/aprsis.c | 139 ++++++++++++++++++++++++++++++++ src/main.c | 10 +++ src/packet_tx_handler.c | 20 +++++ src/rte_main.c | 3 + system/include/aprs/telemetry.h | 11 +++ system/src/aprs/status.c | 24 +++--- system/src/aprs/telemetry.c | 139 +++++++++++++++++--------------- 9 files changed, 292 insertions(+), 75 deletions(-) diff --git a/include/aprsis.h b/include/aprsis.h index 58011f0..160d6e8 100644 --- a/include/aprsis.h +++ b/include/aprsis.h @@ -70,6 +70,25 @@ void aprsis_send_beacon(uint8_t async, const char * string_longitude, char symbol_s, const config_data_basic_t * config_data_basic); +void aprsis_prepare_telemetry( + uint16_t _telemetry_counter, + uint8_t _rx_pkts, + uint8_t _tx_pkts, + uint8_t _digi_pkts, + uint8_t _scaled_vbatt_voltage, + uint8_t _viscous_drop_pkts, + uint8_t _scaled_temperature, + char _telemetry_qf, + char _telemetry_degr, + char _telemetry_nav, + char _telemetry_pressure_qf_navaliable, + char _telemetry_humidity_qf_navaliable, + char _telemetry_anemometer_degradated, + char _telemetry_anemometer_navble, + char _telemetry_vbatt_low, + const config_data_mode_t * const _config_mode); +void aprsis_send_telemetry(uint8_t async, 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); void aprsis_send_loginstring(const char * callsign_with_ssid); diff --git a/include/rte_main.h b/include/rte_main.h index 3bc0e60..4670e0b 100644 --- a/include/rte_main.h +++ b/include/rte_main.h @@ -18,6 +18,8 @@ extern uint8_t rte_main_trigger_gsm_status_packet; extern uint8_t rte_main_trigger_gsm_loginstring_packet; +extern uint8_t rte_main_trigger_gsm_telemetry_values; + //!< Trigger some reinitialization after waking up from deep sleep extern uint8_t rte_main_woken_up; diff --git a/src/aprsis.c b/src/aprsis.c index 8624afa..26d67a4 100644 --- a/src/aprsis.c +++ b/src/aprsis.c @@ -36,6 +36,16 @@ gsm_sim800_state_t * aprsis_gsm_modem_state; */ char aprsis_packet_tx_buffer[APRSIS_TX_BUFFER_LN]; +/** + * Lenght of buffer + */ +#define APRSIS_TELEMETRY_BUFFER_LN 34 + +/** + * Buffer used to sent telemetry frames to APRS-IS + */ +char aprsis_packet_telemetry_buffer[APRSIS_TELEMETRY_BUFFER_LN]; + /** * */ @@ -614,6 +624,135 @@ void aprsis_send_beacon( aprsis_last_packet_transmit_ts = main_get_master_time(); } +/** + * Prepare telemetry packets to be sent later to the APRS-IS. Just store a string + * with all values, which will be then embedded into packet to be sent to APRS-IS + * @param _telemetry_counter + * @param _rx_pkts + * @param _tx_pkts + * @param _digi_pkts + * @param _scaled_vbatt_voltage + * @param _viscous_drop_pkts + * @param _scaled_temperature + * @param _telemetry_qf + * @param _telemetry_degr + * @param _telemetry_nav + * @param _telemetry_pressure_qf_navaliable + * @param _telemetry_humidity_qf_navaliable + * @param _telemetry_anemometer_degradated + * @param _telemetry_anemometer_navble + * @param _telemetry_vbatt_low + * @param _config_mode + */ +void aprsis_prepare_telemetry( + uint16_t _telemetry_counter, + uint8_t _rx_pkts, + uint8_t _tx_pkts, + uint8_t _digi_pkts, + uint8_t _scaled_vbatt_voltage, + uint8_t _viscous_drop_pkts, + uint8_t _scaled_temperature, + char _telemetry_qf, + char _telemetry_degr, + char _telemetry_nav, + char _telemetry_pressure_qf_navaliable, + char _telemetry_humidity_qf_navaliable, + char _telemetry_anemometer_degradated, + char _telemetry_anemometer_navble, + char _telemetry_vbatt_low, + const config_data_mode_t * const _config_mode) { + + // clear buffer before doin anything + memset(aprsis_packet_telemetry_buffer, 0x00, APRSIS_TELEMETRY_BUFFER_LN); + + // string lenght returned by snprintf + int snprintf_size = 0; + + if (_config_mode->digi_viscous == 0) { + 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", + _telemetry_counter, + _rx_pkts, + _tx_pkts, + _digi_pkts, + _scaled_vbatt_voltage, + _scaled_temperature, + _telemetry_qf, + _telemetry_degr, + _telemetry_nav, + _telemetry_pressure_qf_navaliable, + _telemetry_humidity_qf_navaliable, + _telemetry_anemometer_degradated, + _telemetry_anemometer_navble, + _telemetry_vbatt_low); + + } + else { + 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", + _telemetry_counter, + _rx_pkts, + _viscous_drop_pkts, + _digi_pkts, + _scaled_vbatt_voltage, + _scaled_temperature, + _telemetry_qf, + _telemetry_degr, + _telemetry_nav, + _telemetry_pressure_qf_navaliable, + _telemetry_humidity_qf_navaliable, + _telemetry_anemometer_degradated, + _telemetry_anemometer_navble, + _telemetry_vbatt_low); + } + + aprsis_packet_telemetry_buffer[snprintf_size] = 0; + +} + +/** + * Sends to APRS-IS prepared telemetry frame prepared in advance + */ +void aprsis_send_telemetry(uint8_t async, const char * callsign_with_ssid) { + + // exif if APRSIS is not logged + if (aprsis_logged == 0) { + return; + } + + // exit if message is empty + if (*aprsis_packet_telemetry_buffer == 0) { + return; + } + + 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, + aprsis_packet_telemetry_buffer); + 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); + } + + aprsis_last_packet_transmit_ts = main_get_master_time(); + + // clear buffer after it has been used + memset(aprsis_packet_telemetry_buffer, 0x00, APRSIS_TELEMETRY_BUFFER_LN); +} + void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid) { // iterator to move across tx buffer diff --git a/src/main.c b/src/main.c index d494e95..c29d003 100644 --- a/src/main.c +++ b/src/main.c @@ -1192,6 +1192,7 @@ int main(int argc, char* argv[]){ main_ax25.dcd = false; + // check this frame against other frame in visvous buffer waiting to be transmitted digi_check_with_viscous(&ax25_rxed_frame); // check if this packet needs to be repeated (digipeated) and do it if it is necessary @@ -1227,18 +1228,27 @@ int main(int argc, char* argv[]){ gsm_sim800_tx_done_event_handler(main_gsm_srl_ctx_ptr, &main_gsm_state); } + // if GSM status message is triggered and GSM module is not busy transmitting something else 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 loginstring packet (APRS status packet with loginstring received from a server) + // is triggered and GSM module is not busy 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); } + if (rte_main_trigger_gsm_telemetry_values == 1 && gsm_sim800_tcpip_tx_busy() == 0) { + rte_main_trigger_gsm_telemetry_values = 0; + + aprsis_send_telemetry(1u, (const char *)&main_callsign_with_ssid); + } + } #endif diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index 8bde47b..28376ee 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -511,6 +511,26 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con // service external watchdog while sending telemetry io_ext_watchdog_service(); +#ifdef PARAMETEO + aprsis_prepare_telemetry( + telemetry_get_counter(), + rx10m, + tx10m, + digi10m, + rte_main_average_battery_voltage, + digidrop10m, + telemetry_scaled_temperature, + telemetry_qf, + telemetry_degr, + telemetry_nav, + telemetry_pressure_qf_navaliable, + telemetry_humidity_qf_navaliable, + telemetry_anemometer_degradated, + telemetry_anemometer_navble, + telemetry_vbatt_low, + config_mode); +#endif + rx10m = 0, tx10m = 0, digi10m = 0, kiss10m = 0, digidrop10m = 0; } diff --git a/src/rte_main.c b/src/rte_main.c index efa2dc9..a0b738d 100644 --- a/src/rte_main.c +++ b/src/rte_main.c @@ -24,6 +24,9 @@ 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 packet with telemetry value AFTER it is prepared +uint8_t rte_main_trigger_gsm_telemetry_values = 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 8af2695..5c6ea2b 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; +extern char telemetry_qf; +extern char telemetry_degr; +extern char telemetry_nav; +extern char telemetry_pressure_qf_navaliable; +extern char telemetry_humidity_qf_navaliable; +extern char telemetry_anemometer_degradated; +extern char telemetry_anemometer_navble; +extern char telemetry_vbatt_low; +extern uint8_t telemetry_scaled_temperature; + void telemetry_init(void); #ifdef __cplusplus @@ -96,5 +106,6 @@ void telemetry_send_chns_description(const config_data_basic_t * const config_ba } #endif +uint16_t telemetry_get_counter(void); #endif /* INCLUDE_APRS_TELEMETRY_H_ */ diff --git a/system/src/aprs/status.c b/system/src/aprs/status.c index b9c4833..ce360bb 100644 --- a/system/src/aprs/status.c +++ b/system/src/aprs/status.c @@ -18,10 +18,10 @@ #ifdef PARAMETEO #include "pwr_save.h" -const char * telemetry_vbatt_normal = "VBATT_GOOD"; -const char * telemetry_vbatt_low = "VBATT_LOW"; -const char * telemetry_vbatt_cutoff = "VBATT_CUTOFF"; -const char * telemetry_vbatt_unknown = "VBATT_UNKNOWN"; +const char * status_vbatt_normal = "VBATT_GOOD"; +const char * status_vbatt_low = "VBATT_LOW"; +const char * status_vbatt_cutoff = "VBATT_CUTOFF"; +const char * status_vbatt_unknown = "VBATT_UNKNOWN"; #include "gsm/sim800c_gprs.h" #include "gsm/sim800c.h" @@ -62,29 +62,29 @@ void status_send_powersave_cutoff(uint16_t battery_voltage, int8_t previous_cuto // telemetry_vbatt_unknown if ((previous_cutoff & CURRENTLY_CUTOFF) != 0) { - p = telemetry_vbatt_cutoff; + p = status_vbatt_cutoff; } else if ((previous_cutoff & CURRENTLY_VBATT_LOW) != 0) { - p = telemetry_vbatt_low; + p = status_vbatt_low; } else if (((previous_cutoff & CURRENTLY_CUTOFF) == 0) && (previous_cutoff & CURRENTLY_VBATT_LOW) == 0){ - p = telemetry_vbatt_normal; + p = status_vbatt_normal; } else { - p = telemetry_vbatt_unknown; + p = status_vbatt_unknown; } if ((current_cutoff & CURRENTLY_CUTOFF) != 0) { - c = telemetry_vbatt_cutoff; + c = status_vbatt_cutoff; } else if ((current_cutoff & CURRENTLY_VBATT_LOW) != 0) { - c = telemetry_vbatt_low; + c = status_vbatt_low; } else if (((current_cutoff & CURRENTLY_CUTOFF) == 0) && (current_cutoff & CURRENTLY_VBATT_LOW) == 0){ - c = telemetry_vbatt_normal; + c = status_vbatt_normal; } else { - c = telemetry_vbatt_unknown; + c = status_vbatt_unknown; } main_wait_for_tx_complete(); diff --git a/system/src/aprs/telemetry.c b/system/src/aprs/telemetry.c index 8ab936e..d88b89a 100644 --- a/system/src/aprs/telemetry.c +++ b/system/src/aprs/telemetry.c @@ -18,7 +18,23 @@ #include #include -uint16_t telemetry_counter = 0; +static uint16_t telemetry_counter = 0; + +// variables with characters to be inserted to APRS telemetry frame +char telemetry_qf = '0'; +char telemetry_degr = '0'; +char telemetry_nav = '0'; +char telemetry_pressure_qf_navaliable = '0'; +char telemetry_humidity_qf_navaliable = '0'; +char telemetry_anemometer_degradated = '0'; +char telemetry_anemometer_navble = '0'; +char telemetry_vbatt_low = '0'; + +// temperature scaled to 0x00-0xFF range for fifth telemetry channel. +// if _METEO mode is enabled this channel sends the temperaure measure by +// internal MS5611 or BME280. If _METEO is not enabled this channel +// could send Dallas DS18B20 masurements if this is enabled in station_config.h +uint8_t telemetry_scaled_temperature = 0; void telemetry_init(void) { telemetry_counter = backup_reg_get_telemetry(); @@ -99,12 +115,12 @@ void telemetry_send_values_pv ( uint8_t rx_pkts, wind_qf_t anemometer_qf) { // local variables with characters to be inserted to APRS telemetry frame - char qf = '0', degr = '0', nav = '0'; - - char pressure_qf_navaliable = '0'; - char humidity_qf_navaliable = '0'; - char anemometer_degradated = '0'; - char anemometer_navble = '0'; +// char qf = '0', degr = '0', nav = '0'; +// +// char pressure_qf_navaliable = '0'; +// char humidity_qf_navaliable = '0'; +// char anemometer_degradated = '0'; +// char anemometer_navble = '0'; uint8_t scaled_battery_current = 0; uint8_t scaled_battery_voltage = 0; @@ -124,18 +140,18 @@ void telemetry_send_values_pv ( uint8_t rx_pkts, switch (dallas_qf) { case DALLAS_QF_FULL: - qf = '1', degr = '0', nav = '0'; + telemetry_qf = '1', telemetry_degr = '0', telemetry_nav = '0'; break; case DALLAS_QF_DEGRADATED: - qf = '0', degr = '1', nav = '0'; + telemetry_qf = '0', telemetry_degr = '1', telemetry_nav = '0'; break; case DALLAS_QF_NOT_AVALIABLE: - qf = '0', degr = '0', nav = '1'; + telemetry_qf = '0', telemetry_degr = '0', telemetry_nav = '1'; break; default: - qf = '0', degr = '0', nav = '0'; + telemetry_qf = '0', telemetry_degr = '0', telemetry_nav = '0'; break; } @@ -143,23 +159,38 @@ void telemetry_send_values_pv ( uint8_t rx_pkts, switch (press_qf) { case PRESSURE_QF_NOT_AVALIABLE: case PRESSURE_QF_UNKNOWN: - pressure_qf_navaliable = '1'; + telemetry_pressure_qf_navaliable = '1'; break; default: - pressure_qf_navaliable = '0'; + telemetry_pressure_qf_navaliable = '0'; break; } switch (humid_qf) { case HUMIDITY_QF_UNKNOWN: case HUMIDITY_QF_NOT_AVALIABLE: - humidity_qf_navaliable = '1'; + telemetry_humidity_qf_navaliable = '1'; break; default: - humidity_qf_navaliable = '0'; + telemetry_humidity_qf_navaliable = '0'; } - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, digi_pkts, scaled_battery_current, scaled_battery_voltage, scaled_pvcell_volage, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble); + main_own_aprs_msg_len = sprintf( + main_own_aprs_msg, + "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", + telemetry_counter++, + rx_pkts, + digi_pkts, + scaled_battery_current, + scaled_battery_voltage, + scaled_pvcell_volage, + telemetry_qf, + telemetry_degr, + telemetry_nav, + telemetry_pressure_qf_navaliable, + telemetry_humidity_qf_navaliable, + telemetry_anemometer_degradated, + telemetry_anemometer_navble); if (telemetry_counter > 999) @@ -384,61 +415,47 @@ void telemetry_send_values( uint8_t rx_pkts, const config_data_mode_t * const config_mode) { #endif - // local variables with characters to be inserted to APRS telemetry frame - char qf = '0', degr = '0', nav = '0'; - char pressure_qf_navaliable = '0'; - char humidity_qf_navaliable = '0'; - char anemometer_degradated = '0'; - char anemometer_navble = '0'; - char vbatt_low = '0'; - - // temperature scaled to 0x00-0xFF range for fifth telemetry channel. - // if _METEO mode is enabled this channel sends the temperaure measure by - // internal MS5611 or BME280. If _METEO is not enabled this channel - // could send Dallas DS18B20 masurements if this is enabled in station_config.h - uint8_t scaled_temperature = 0; - // get the quality factor for wind measurements if (anemometer_qf == WIND_QF_DEGRADATED) { - anemometer_degradated = '1'; - anemometer_navble = '0'; + telemetry_anemometer_degradated = '1'; + telemetry_anemometer_navble = '0'; } else if (anemometer_qf == WIND_QF_NOT_AVALIABLE) { - anemometer_degradated = '0'; - anemometer_navble = '1'; + telemetry_anemometer_degradated = '0'; + telemetry_anemometer_navble = '1'; } else if (anemometer_qf == WIND_QF_UNKNOWN) { - anemometer_degradated = '1'; - anemometer_navble = '1'; + telemetry_anemometer_degradated = '1'; + telemetry_anemometer_navble = '1'; } // scale the physical temperature and limit upper and lower boundary if // it is required if (temperature < -50.0f) { - scaled_temperature = (uint8_t)0; + telemetry_scaled_temperature = (uint8_t)0; } else if (temperature > 70.0f) { - scaled_temperature = (uint8_t)255; + telemetry_scaled_temperature = (uint8_t)255; } else { - scaled_temperature = (uint8_t)((temperature + 50.0f) * 2.0f); + telemetry_scaled_temperature = (uint8_t)((temperature + 50.0f) * 2.0f); } // set the quality factor for dallas DS18B20 switch (dallas_qf) { case DALLAS_QF_FULL: - qf = '1', degr = '0', nav = '0'; + telemetry_qf = '1', telemetry_degr = '0', telemetry_nav = '0'; break; case DALLAS_QF_DEGRADATED: - qf = '0', degr = '1', nav = '0'; + telemetry_qf = '0', telemetry_degr = '1', telemetry_nav = '0'; break; case DALLAS_QF_NOT_AVALIABLE: - qf = '0', degr = '0', nav = '1'; + telemetry_qf = '0', telemetry_degr = '0', telemetry_nav = '1'; break; default: - qf = '0', degr = '0', nav = '0'; + telemetry_qf = '0', telemetry_degr = '0', telemetry_nav = '0'; break; } @@ -446,26 +463,26 @@ void telemetry_send_values( uint8_t rx_pkts, switch (press_qf) { case PRESSURE_QF_NOT_AVALIABLE: case PRESSURE_QF_UNKNOWN: - pressure_qf_navaliable = '1'; + telemetry_pressure_qf_navaliable = '1'; break; default: - pressure_qf_navaliable = '0'; + telemetry_pressure_qf_navaliable = '0'; break; } switch (humid_qf) { case HUMIDITY_QF_UNKNOWN: case HUMIDITY_QF_NOT_AVALIABLE: - humidity_qf_navaliable = '1'; + telemetry_humidity_qf_navaliable = '1'; break; default: - humidity_qf_navaliable = '0'; + telemetry_humidity_qf_navaliable = '0'; } #ifdef PARAMETEO // telemetry won't be sent during cutoff anyway so this simplification is correct here if (cutoff_and_vbat_low > 0) { - vbatt_low = '1'; + telemetry_vbatt_low = '1'; } #endif @@ -475,39 +492,31 @@ void telemetry_send_values( uint8_t rx_pkts, #ifdef STM32L471xx if (config_mode->digi_viscous == 0) { // generate the telemetry frame from values - #ifdef _DALLAS_AS_TELEM - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, scaled_vbatt_voltage, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble, vbatt_low); - #else - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, scaled_vbatt_voltage, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble, vbatt_low); - #endif + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, scaled_vbatt_voltage, telemetry_scaled_temperature, telemetry_qf, telemetry_degr, telemetry_nav, telemetry_pressure_qf_navaliable, telemetry_humidity_qf_navaliable, telemetry_anemometer_degradated, telemetry_anemometer_navble, telemetry_vbatt_low); } else { - #ifdef _DALLAS_AS_TELEM - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c", telemetry_counter++, rx_pkts, viscous_drop_pkts, digi_pkts, scaled_vbatt_voltage, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble, vbatt_low); - #else - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c", telemetry_counter++, rx_pkts, viscous_drop_pkts, digi_pkts, scaled_vbatt_voltage, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble, vbatt_low); - #endif + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c%c", telemetry_counter++, rx_pkts, viscous_drop_pkts, digi_pkts, scaled_vbatt_voltage, telemetry_scaled_temperature, telemetry_qf, telemetry_degr, telemetry_nav, telemetry_pressure_qf_navaliable, telemetry_humidity_qf_navaliable, telemetry_anemometer_degradated, telemetry_anemometer_navble, telemetry_vbatt_low); } #else if (config_mode->digi_viscous == 0) { // generate the telemetry frame from values #ifdef _DALLAS_AS_TELEM - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, kiss_pkts, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble); + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, kiss_pkts, scaled_temperature, telemetry_qf, telemetry_degr, telemetry_nav, telemetry_pressure_qf_navaliable, telemetry_humidity_qf_navaliable, telemetry_anemometer_degradated, telemetry_anemometer_navble); #else - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, kiss_pkts, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble); + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, kiss_pkts, scaled_temperature, telemetry_qf, telemetry_degr, telemetry_nav, telemetry_pressure_qf_navaliable, telemetry_humidity_qf_navaliable, telemetry_anemometer_degradated, telemetry_anemometer_navble); #endif } else { #ifdef _DALLAS_AS_TELEM - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, viscous_drop_pkts, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble); + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, viscous_drop_pkts, scaled_temperature, telemetry_qf, telemetry_degr, telemetry_nav, telemetry_pressure_qf_navaliable, telemetry_humidity_qf_navaliable, telemetry_anemometer_degradated, telemetry_anemometer_navble); #else - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, viscous_drop_pkts, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble); + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, viscous_drop_pkts, scaled_temperature, telemetry_qf, telemetry_degr, telemetry_nav, telemetry_pressure_qf_navaliable, telemetry_humidity_qf_navaliable, telemetry_anemometer_degradated, telemetry_anemometer_navble); #endif } #endif // reset the frame counter if it overflowed - if (telemetry_counter > 255) { + if (telemetry_counter > 999) { telemetry_counter = 0; } @@ -533,3 +542,7 @@ void telemetry_send_values( uint8_t rx_pkts, afsk_txStart(&main_afsk); } + +uint16_t telemetry_get_counter(void) { + return telemetry_counter; +}