From 129b286e49f57bdea409e0f17734da0fc0615ee1 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Wed, 6 Apr 2022 20:32:50 +0200 Subject: [PATCH] bugfix in low voltage cutoff, switching powersave mode on low battery voltage, eight bit in telemetry to send low battery warning --- .cproject | 36 ++++++----- .settings/language.settings.xml | 2 +- include/main.h | 2 +- include/pwr_save.h | 5 ++ include/pwr_save_configuration.h | 36 +++++++++++ src/packet_tx_handler.c | 5 +- src/pwr_save.c | 49 +++++++++++--- system/include/aprs/telemetry.h | 1 + .../include/http_client/http_client_headers.h | 16 ++++- system/src/aprs/telemetry.c | 45 +++++++------ system/src/http_client/http_client_headers.c | 64 +++++++++++++++++++ 11 files changed, 211 insertions(+), 50 deletions(-) create mode 100644 include/pwr_save_configuration.h diff --git a/.cproject b/.cproject index d8ad838..68b1f54 100644 --- a/.cproject +++ b/.cproject @@ -527,21 +527,6 @@ - - - - - - - - - - - - - - - @@ -553,4 +538,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 0bdbc65..28a0426 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -13,7 +13,7 @@ - + diff --git a/include/main.h b/include/main.h index 547ffd9..3e980ff 100644 --- a/include/main.h +++ b/include/main.h @@ -6,7 +6,7 @@ #include "config_data.h" #define SW_VER "EA05" -#define SW_DATE "05042022" +#define SW_DATE "06042022" #define SYSTICK_TICKS_PER_SECONDS 100 #define SYSTICK_TICKS_PERIOD 10 diff --git a/include/pwr_save.h b/include/pwr_save.h index f3f877f..118228b 100644 --- a/include/pwr_save.h +++ b/include/pwr_save.h @@ -102,8 +102,13 @@ #include "config_data.h" +#define CURRENTLY_CUTOFF 0x1 +#define CURRENTLY_VBATT_LOW 0x8 + #if defined(STM32L471xx) +extern int8_t pwr_save_currently_cutoff; + void pwr_save_init(config_data_powersave_mode_t mode); void pwr_save_enter_stop2(void); void pwr_save_exit_from_stop2(void); diff --git a/include/pwr_save_configuration.h b/include/pwr_save_configuration.h new file mode 100644 index 0000000..dd5ee29 --- /dev/null +++ b/include/pwr_save_configuration.h @@ -0,0 +1,36 @@ +/* + * pwr_save_configuration.h + * + * Created on: Apr 6, 2022 + * Author: mateusz + */ + +#ifndef INCLUDE_PWR_SAVE_CONFIGURATION_H_ +#define INCLUDE_PWR_SAVE_CONFIGURATION_H_ + + + +/** + * This is cutoff voltage at which the power saving subsystem will keep ParaMETEO constantly + * in L7 mode and wakeup once every 20 minutes to check B+ once again + */ +#define PWR_SAVE_CUTOFF_VOLTAGE_DEF 1120u // 11.2V + +/** + * This is the restore voltage a battery must be charged to for ParaMETEO to restore it's normal operation + */ +#define PWR_SAVE_STARTUP_RESTORE_VOLTAGE_DEF 1220u // 12.2V + +/** + * This is voltage above which controller will switch to PWSAVE_AGGRESV + */ +#define PWR_SAVE_AGGRESIVE_POWERSAVE_VOLTAGE (PWR_SAVE_CUTOFF_VOLTAGE_DEF + 50u) + +/** + * How long in minutes the controller will sleep in L7 state between checking + * if battery has been charged. + */ +#define PWR_SAVE_CUTOFF_SLEEP_TIME_IN_MINUTES 4 + + +#endif /* INCLUDE_PWR_SAVE_CONFIGURATION_H_ */ diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index 31dbb45..d6ba3a8 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -19,6 +19,7 @@ #ifdef STM32L471xx #include "aprsis.h" +#include "pwr_save.h" #endif #include "main.h" @@ -313,11 +314,11 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con // if _METEO will be enabled, but without _DALLAS_AS_TELEM the fifth channel will be used to transmit temperature from MS5611 // which may be treated then as 'rack/cabinet internal temperature'. Dallas DS12B10 will be used for ragular WX frames - telemetry_send_values(rx10m, tx10m, digi10m, rte_main_battery_voltage, digidrop10m, rte_wx_temperature_internal_valid, dallas_qf, pressure_qf, humidity_qf, wind_qf, config_mode); + telemetry_send_values(rx10m, tx10m, digi10m, rte_main_battery_voltage, digidrop10m, rte_wx_temperature_internal_valid, dallas_qf, pressure_qf, humidity_qf, wind_qf, pwr_save_currently_cutoff, config_mode); } else { // if user will disable both _METEO and _DALLAS_AS_TELEM value will be zeroed internally anyway - telemetry_send_values(rx10m, tx10m, digi10m, rte_main_battery_voltage, digidrop10m, 0.0f, dallas_qf, pressure_qf, humidity_qf, wind_qf, config_mode); + telemetry_send_values(rx10m, tx10m, digi10m, rte_main_battery_voltage, digidrop10m, 0.0f, dallas_qf, pressure_qf, humidity_qf, wind_qf, pwr_save_currently_cutoff, config_mode); } #else // if _DALLAS_AS_TELEM will be enabled the fifth channel will be set to temperature measured by DS12B20 diff --git a/src/pwr_save.c b/src/pwr_save.c index 0f4713f..b6c372e 100644 --- a/src/pwr_save.c +++ b/src/pwr_save.c @@ -6,6 +6,7 @@ */ #include "pwr_save.h" +#include "pwr_save_configuration.h" #include "stm32l4xx.h" #include "system_stm32l4xx.h" @@ -38,22 +39,34 @@ #define ALL_STATES_BITMASK (0xFF << 2) +#define MINIMUM_SENSEFUL_VBATT_VOLTAGE 512u + #if defined(STM32L471xx) int8_t pwr_save_seconds_to_wx = 0; int16_t pwr_save_sleep_time_in_seconds = -1; + +/** + * Variable stores cutoff state and to save RAM it also keeps a low battery voltage flag + */ int8_t pwr_save_currently_cutoff = 0; /** * This is cutoff voltage at which the power saving subsystem will keep ParaMETEO constantly * in L7 mode and wakeup once every 20 minutes to check B+ once again */ -const uint16_t PWR_SAVE_CUTOFF_VOLTAGE = 112; // 11.2V +const uint16_t pwr_save_cutoff_voltage = PWR_SAVE_CUTOFF_VOLTAGE_DEF; /** * This is the restore voltage a battery must be charged to for ParaMETEO to restore it's normal operation */ -const uint16_t PWR_SAVE_STARTUP_RESTORE_VOLTAGE = 122; // 12.2V +const uint16_t pwr_save_startup_restore_voltage = PWR_SAVE_STARTUP_RESTORE_VOLTAGE_DEF; + +/** + * Below this voltage (and above pwr_save_cutoff_voltage) software will switch powersaving + * mode to PWSAVE_AGGRESV + */ +const uint16_t pwr_save_aggressive_powersave_voltage = PWR_SAVE_AGGRESIVE_POWERSAVE_VOLTAGE; static void pwr_save_unclock_rtc_backup_regs(void) { // enable access to backup domain @@ -202,7 +215,7 @@ void pwr_save_exit_from_stop2(void) { timers.telemetry_counter += (pwr_save_sleep_time_in_seconds / 60); timers.telemetry_desc_counter += (pwr_save_sleep_time_in_seconds / 60); - if (pwr_save_currently_cutoff == 0) { + if ((pwr_save_currently_cutoff & CURRENTLY_CUTOFF) == 0) { // set counters back packet_tx_set_current_counters(&timers); } @@ -514,24 +527,40 @@ void pwr_save_pooling_handler(const config_data_mode_t * config, const config_da packet_tx_counter_values_t counters; - if (vbatt < 0xF) { + // by default use powersave mode from controller configuration + config_data_powersave_mode_t psave_mode = config->powersave; + + // check if battery voltage measurement is done and senseful + if (vbatt < MINIMUM_SENSEFUL_VBATT_VOLTAGE) { + // inhibit both cutoff and aggresive powersave if vbatt measurement is either not + // done at all or scaling factor are really screwed vbatt = 0xFFFFu; } - if (vbatt <= PWR_SAVE_CUTOFF_VOLTAGE && pwr_save_currently_cutoff == 0) { - pwr_save_currently_cutoff = 1; + if (vbatt <= pwr_save_aggressive_powersave_voltage) { + // if battery voltage is low swtich to aggressive powersave mode + pwr_save_currently_cutoff |= CURRENTLY_VBATT_LOW; - pwr_save_switch_mode_to_l7(60 * 20); + psave_mode = PWSAVE_AGGRESV; + } + else if (vbatt <= pwr_save_cutoff_voltage && (pwr_save_currently_cutoff & CURRENTLY_CUTOFF) == 0) { + // if the battery voltage is below cutoff level and the ParaMETEO controller is currently not cut off + pwr_save_currently_cutoff |= CURRENTLY_CUTOFF; + + // go sleep immediately and periodically check if battery has been charged above restore level + pwr_save_switch_mode_to_l7(60 * PWR_SAVE_CUTOFF_SLEEP_TIME_IN_MINUTES); return; } - else if (vbatt <= PWR_SAVE_STARTUP_RESTORE_VOLTAGE && pwr_save_currently_cutoff == 1) { - pwr_save_switch_mode_to_l7(60 * 20); + else if (vbatt <= pwr_save_startup_restore_voltage && (pwr_save_currently_cutoff & CURRENTLY_CUTOFF) != 0) { + // if the ParaMETEO is cutted off currently but battery hasn't been charged above restore voltage + pwr_save_switch_mode_to_l7(60 * PWR_SAVE_CUTOFF_SLEEP_TIME_IN_MINUTES); return; } else { + // if battery level is above restore voltage and aggressive powersave voltage pwr_save_currently_cutoff = 0; } @@ -554,7 +583,7 @@ void pwr_save_pooling_handler(const config_data_mode_t * config, const config_da } // handle depends on current powersave configuration - switch (config->powersave) { + switch (psave_mode) { /** * PWSAVE_NONE = 0, PWSAVE_NORMAL = 1, diff --git a/system/include/aprs/telemetry.h b/system/include/aprs/telemetry.h index a8dd1d5..60fdb9c 100644 --- a/system/include/aprs/telemetry.h +++ b/system/include/aprs/telemetry.h @@ -74,6 +74,7 @@ void telemetry_send_values( uint8_t rx_pkts, pressure_qf_t press_qf, humidity_qf_t humid_qf, wind_qf_t anemometer_qf, + int8_t cutoff_and_vbat_low, const config_data_mode_t * const config_mode); #else void telemetry_send_values( uint8_t rx_pkts, diff --git a/system/include/http_client/http_client_headers.h b/system/include/http_client/http_client_headers.h index 3d0fcfd..4d798b4 100644 --- a/system/include/http_client/http_client_headers.h +++ b/system/include/http_client/http_client_headers.h @@ -17,8 +17,20 @@ typedef enum http_client_method { HTTP_DELETE } http_client_method_t; -void http_client_headers_preamble(http_client_method_t method, char * url, uint8_t url_ln, char * output, uint8_t output_ln); -void http_client_headers_user_agent(char * output, uint8_t output_ln); +/** + * All these functions appends HTTP headers to output buffer. Every function (except preamble) receives three + * parameters: + * + * char * output - pointer to the output buffer + * uint16_t output_ln - lenght of output buffer + * uint16_t offset - an offset from which each function will print its header + * + * functions return an offset of one character after the last character of header. this value can be used + * afterwards as the value of 'offset' + */ +uint16_t http_client_headers_preamble(http_client_method_t method, char * url, uint8_t url_ln, char * output, uint16_t output_ln); +uint16_t http_client_headers_user_agent(char * output, uint16_t output_ln, uint16_t offset); +uint16_t http_client_headers_accept(char* output, uint16_t output_ln, uint16_t offset); #endif /* INCLUDE_HTTP_CLIENT_HTTP_CLIENT_HEADERS_H_ */ diff --git a/system/src/aprs/telemetry.c b/system/src/aprs/telemetry.c index d452272..57e5ace 100644 --- a/system/src/aprs/telemetry.c +++ b/system/src/aprs/telemetry.c @@ -208,22 +208,22 @@ void telemetry_send_chns_description(const config_data_basic_t * const config_ba 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", config_basic->callsign); + 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", message_prefix_buffer); + 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", message_prefix_buffer); + 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", config_basic->callsign); + 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", message_prefix_buffer); + 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", message_prefix_buffer); + 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; } @@ -231,11 +231,11 @@ void telemetry_send_chns_description(const config_data_basic_t * const config_ba 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", config_basic->callsign); + 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", message_prefix_buffer); + 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", message_prefix_buffer); + 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; } @@ -301,20 +301,20 @@ void telemetry_send_chns_description(const config_data_basic_t * const config_ba #ifdef STM32L471xx 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", config_basic->callsign); + 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", message_prefix_buffer); + 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", message_prefix_buffer); + 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", config_basic->callsign); + 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", message_prefix_buffer); + 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", message_prefix_buffer); + 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 @@ -346,6 +346,7 @@ void telemetry_send_values( uint8_t rx_pkts, pressure_qf_t press_qf, humidity_qf_t humid_qf, wind_qf_t anemometer_qf, + int8_t cutoff_and_vbat_low, const config_data_mode_t * const config_mode) { uint8_t scaled_vbatt_voltage = 0; @@ -383,6 +384,7 @@ void telemetry_send_values( uint8_t rx_pkts, 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 @@ -454,6 +456,11 @@ void telemetry_send_values( uint8_t rx_pkts, humidity_qf_navaliable = '0'; } + // telemetry won't be sent during cutoff anyway so this simplification is correct here + if (cutoff_and_vbat_low > 0) { + vbatt_low = '1'; + } + // reset the buffer where the frame will be contructed and stored for transmission memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg)); @@ -461,16 +468,16 @@ void telemetry_send_values( uint8_t rx_pkts, 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, scaled_vbatt_voltage, 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%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%c0", 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); + 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 } 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, viscous_drop_pkts, digi_pkts, scaled_vbatt_voltage, 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, 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%c0", 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); + 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, 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 } #else diff --git a/system/src/http_client/http_client_headers.c b/system/src/http_client/http_client_headers.c index 671c983..2ef6943 100644 --- a/system/src/http_client/http_client_headers.c +++ b/system/src/http_client/http_client_headers.c @@ -1,3 +1,4 @@ + /* * http_client_headers.c * @@ -5,4 +6,67 @@ * Author: mateusz */ +#include "http_client/http_client_headers.h" +#include +#include + +#include "main.h" // for sofrware version + +const char * const http_client_get = "GET"; +const char * const http_client_post = "POST"; +const char * const http_client_put = "PUT"; +const char * const http_client_delete = "DELETE"; + + +uint16_t http_client_headers_preamble(http_client_method_t method, char *url, + uint8_t url_ln, char *output, uint16_t output_ln) { + + // lenght of header + uint16_t out = 0; + + // pointer to string with method name + const char * method_string = 0; + + // choose correct + switch (method) { + case HTTP_POST: + method_string = http_client_post; + break; + case HTTP_PUT: + method_string = http_client_put; + break; + case HTTP_DELETE: + method_string = http_client_delete; + break; + case HTTP_GET: + default: + method_string = http_client_get; + break; + } + + snprintf(output, output_ln, "%s %s HTTP/1.1\r\n", method_string, url); + + out = strlen (output); + + return out; + +} + +uint16_t http_client_headers_user_agent(char *output, uint16_t output_ln, + uint16_t offset) { + + uint16_t out = 0; + + snprintf(output + offset, output_ln - offset, "User-Agent: %s"); + + return out; +} + +uint16_t http_client_headers_accept(char *output, uint16_t output_ln, + uint16_t offset) { + + uint16_t out = 0; + + return out; +}