aprsis telemetry: battery voltage fix, serial port driver: disable TX interrupts while there is an interrupt in TX_IDLE state, powersaving: few changes and deinitializing GSM uart before go to deep sleep

master
Mateusz Lubecki 2023-10-30 20:02:45 +01:00
rodzic 6648c8cc54
commit 28b65cc9f7
10 zmienionych plików z 75 dodań i 54 usunięć

Wyświetl plik

@ -58,6 +58,6 @@
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#10;"/>
<stringAttribute key="org.eclipse.embedcdt.debug.gdbjtag.core.PERIPHERALS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;peripherals&gt;&#10; &lt;peripheral name=&quot;IWDG&quot;/&gt;&#10; &lt;peripheral name=&quot;DBGMCU&quot;/&gt;&#10; &lt;peripheral name=&quot;GPIOC&quot;/&gt;&#10;&lt;/peripherals&gt;&#10;"/>
<stringAttribute key="org.eclipse.embedcdt.debug.gdbjtag.core.PERIPHERALS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;peripherals&gt;&#10; &lt;peripheral name=&quot;IWDG&quot;/&gt;&#10; &lt;peripheral name=&quot;DBGMCU&quot;/&gt;&#10; &lt;peripheral name=&quot;USART3&quot;/&gt;&#10;&lt;/peripherals&gt;&#10;"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration>

Wyświetl plik

@ -97,7 +97,7 @@ telemetry_description_t aprsis_send_description_telemetry(uint8_t async,
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);
void aprsis_send_loginstring(const char * callsign_with_ssid, uint8_t rtc_ok);
void aprsis_send_gpsstatus(const char * callsign_with_ssid);
char * aprsis_get_tx_buffer(void);

Wyświetl plik

@ -94,8 +94,8 @@
* | DIGI + WX + GSM | PWSAVE_AGGRESV | C2 --- (1 minute before WX frame)---> C0 -> C2 ; no matter WX_INTERVAL |
* | WX + GSM | PWSAVE_NONE | C0 |
* | WX + GSM | PWSAVE_NORMAL | M4 --- (1 minute before WX frame)---> C0 -> M4 |
* | WX + GSM (only) | PWSAVE_AGGRESV | L6 --- (1 minute before WX frame)---> C0 -> L6 ; if WX_INTERVAL < 5 minutes |
* | WX + GSM (only) | PWSAVE_AGGRESV | L7 --- (1 minute before WX frame)---> M4 --- (30 sec before)---> C0 -> L7 |
* | WX + GSM (only) | PWSAVE_AGGRESV | L6 --- (2 minute before WX frame)---> C0 -> L6 ; if WX_INTERVAL < 5 minutes |
* | WX + GSM (only) | PWSAVE_AGGRESV | L7 --- (2 minute before WX frame)---> M4 --- (30 sec before)---> C0 -> L7 |
* | WX | PWSAVE_NONE | M4 --- (2 minute before WX frame)---> C1 -> M4 |
* | WX | PWSAVE_NORMAL | L7 --- (2 minute before WX frame)---> C1 -> L7 |
* | WX | PWSAVE_AGGRESV | L7 --- (1 minute before WX frame)---> M4 --- (30 sec before)---> C1 -> L7 |

Wyświetl plik

@ -932,7 +932,7 @@ void aprsis_send_server_conn_status(const char * callsign_with_ssid) {
gsm_sim800_tcpip_async_write((uint8_t *)aprsis_packet_tx_buffer, aprsis_packet_tx_message_size, aprsis_serial_port, aprsis_gsm_modem_state);
}
void aprsis_send_loginstring(const char * callsign_with_ssid) {
void aprsis_send_loginstring(const char * callsign_with_ssid, uint8_t rtc_ok) {
if (aprsis_logged == 0) {
return;
@ -945,9 +945,10 @@ void aprsis_send_loginstring(const char * callsign_with_ssid) {
aprsis_packet_tx_message_size = snprintf(
aprsis_packet_tx_buffer,
APRSIS_TX_BUFFER_LN - 1,
"%s>AKLPRZ,qAR,%s:>[aprsis][]%s\r\n",
"%s>AKLPRZ,qAR,%s:>[rtc_ok: %d][aprsis]%s\r\n",
callsign_with_ssid,
callsign_with_ssid,
rtc_ok,
aprsis_login_string_reveived);
gsm_sim800_tcpip_async_write((uint8_t *)aprsis_packet_tx_buffer, aprsis_packet_tx_message_size, aprsis_serial_port, aprsis_gsm_modem_state);

Wyświetl plik

@ -1258,7 +1258,7 @@ int main(int argc, char* argv[]){
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);
aprsis_send_loginstring((const char *)&main_callsign_with_ssid, system_is_rtc_ok());
}
if (rte_main_trigger_gsm_telemetry_values == 1 && gsm_sim800_tcpip_tx_busy() == 0) {

Wyświetl plik

@ -508,7 +508,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con
rx10m,
tx10m,
digi10m,
rte_main_average_battery_voltage,
telemetry_scaled_vbatt_voltage,
digidrop10m,
telemetry_scaled_temperature,
telemetry_qf,

Wyświetl plik

@ -24,6 +24,7 @@
#include "gsm/sim800c.h"
#include "aprsis.h"
#include "it_handlers.h"
#include "main.h"
#include "rte_main.h"
@ -41,6 +42,13 @@
#define MINIMUM_SENSEFUL_VBATT_VOLTAGE 678u
/**
* How long a controller should be woken up in aggressive powersaving mode
* before it will send a frame to APRS-IS and go sleep once again. This should
* be long enought to connect to APRS server and go sleep once again
*/
#define WAKEUP_PERIOD_BEFORE_WX_FRAME_IN_MINUTES 2
#if defined(STM32L471xx)
int8_t pwr_save_seconds_to_wx = 0;
@ -608,6 +616,8 @@ void pwr_save_switch_mode_to_l6(uint16_t sleep_time) {
// disconnect APRS-IS connection if it is established
aprsis_disconnect();
srl_close(main_gsm_srl_ctx_ptr);
// disable ADC used for vbat measurement
io_vbat_meas_disable();
@ -701,6 +711,8 @@ void pwr_save_switch_mode_to_l7(uint16_t sleep_time) {
// disconnect APRS-IS connection if it is established
aprsis_disconnect();
srl_close(main_gsm_srl_ctx_ptr);
// disable ADC used for vbat measurement
io_vbat_meas_disable();
@ -830,7 +842,7 @@ config_data_powersave_mode_t pwr_save_pooling_handler( const config_data_mode_t
int8_t reinit_sensors = 0;
int8_t reconnect_aprs = 0;
int8_t reinit_gprs = 0;
packet_tx_counter_values_t counters;
@ -1033,14 +1045,14 @@ config_data_powersave_mode_t pwr_save_pooling_handler( const config_data_mode_t
}
}
else { // WX
if (minutes_to_wx > 2) {
if (minutes_to_wx > WAKEUP_PERIOD_BEFORE_WX_FRAME_IN_MINUTES) {
backup_reg_set_monitor(17);
// if there is more than two minutes to send wx packet
pwr_save_switch_mode_to_l7((timers->wx_transmit_period * 60) - 120);
pwr_save_switch_mode_to_l7((timers->wx_transmit_period * 60) - (WAKEUP_PERIOD_BEFORE_WX_FRAME_IN_MINUTES * 60));
// GSM module is kept turned on, but the connection must be reastablished
reconnect_aprs = 1;
reinit_gprs = 1;
}
else {
// TODO: Workaround here for HW-RevB!!!
@ -1080,11 +1092,14 @@ config_data_powersave_mode_t pwr_save_pooling_handler( const config_data_mode_t
if (timers->wx_transmit_period >= 5) {
// if stations is configured to send wx packet less frequent than every 5 minutes
if (minutes_to_wx > 1) {
if (minutes_to_wx > WAKEUP_PERIOD_BEFORE_WX_FRAME_IN_MINUTES) {
backup_reg_set_monitor(17);
// if there is more than one minute to wx packet
pwr_save_switch_mode_to_l7((timers->wx_transmit_period * 60) - 60); // TODO: !!!
pwr_save_switch_mode_to_l7((timers->wx_transmit_period * 60) - (WAKEUP_PERIOD_BEFORE_WX_FRAME_IN_MINUTES * 60)); // TODO: !!!
reinit_gprs = 1;
}
else {
if (pwr_save_seconds_to_wx <= 50) {
@ -1105,10 +1120,12 @@ config_data_powersave_mode_t pwr_save_pooling_handler( const config_data_mode_t
else {
// if station is configured to sent wx packet in every 5 minutes or more often
if (minutes_to_wx > 1) {
if (minutes_to_wx > WAKEUP_PERIOD_BEFORE_WX_FRAME_IN_MINUTES) {
backup_reg_set_monitor(17);
pwr_save_switch_mode_to_l6((timers->wx_transmit_period * 60) - 60); // TODO: !!!
pwr_save_switch_mode_to_l6((timers->wx_transmit_period * 60) - (WAKEUP_PERIOD_BEFORE_WX_FRAME_IN_MINUTES * 60)); // TODO: !!!
reinit_gprs = 0;
}
else {
reinit_sensors = pwr_save_switch_mode_to_c0();
@ -1127,11 +1144,13 @@ config_data_powersave_mode_t pwr_save_pooling_handler( const config_data_mode_t
}
}
else { // WX
if (minutes_to_wx > 1) {
if (minutes_to_wx > WAKEUP_PERIOD_BEFORE_WX_FRAME_IN_MINUTES) {
backup_reg_set_monitor(17);
// if there is more than one minute to send wx packet
pwr_save_switch_mode_to_l7((timers->wx_transmit_period * 60) - 60);
pwr_save_switch_mode_to_l7((timers->wx_transmit_period * 60) - (WAKEUP_PERIOD_BEFORE_WX_FRAME_IN_MINUTES * 60));
reinit_gprs = 1;
}
else {
if (pwr_save_seconds_to_wx <= 30) {
@ -1168,13 +1187,15 @@ config_data_powersave_mode_t pwr_save_pooling_handler( const config_data_mode_t
backup_reg_set_monitor(13);
if (reinit_gprs != 0) {
// reset GSM modem, internally this also check if GSM modem is inhibited or not
rte_main_reset_gsm_modem = 1;
}
if (reinit_sensors != 0) {
// reinitialize all i2c sensors
wx_force_i2c_sensor_reset = 1;
// reset GSM modem, internally this also check if GSM modem is inhibited or not
rte_main_reset_gsm_modem = 1;
// reinitialize everything realted to anemometer
analog_anemometer_init(main_config_data_mode->wx_anemometer_pulses_constant, 38, 100, 1);
}

Wyświetl plik

@ -67,6 +67,7 @@ extern char telemetry_anemometer_degradated;
extern char telemetry_anemometer_navble;
extern char telemetry_vbatt_low;
extern uint8_t telemetry_scaled_temperature;
extern uint8_t telemetry_scaled_vbatt_voltage;
void telemetry_init(void);

Wyświetl plik

@ -38,6 +38,8 @@ char telemetry_vbatt_low = '0';
// could send Dallas DS18B20 masurements if this is enabled in station_config.h
uint8_t telemetry_scaled_temperature = 0;
uint8_t telemetry_scaled_vbatt_voltage = 0;
void telemetry_init(void) {
telemetry_counter = backup_reg_get_telemetry();
}
@ -54,22 +56,10 @@ int telemetry_create_description_string(const config_data_basic_t * const config
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: {
@ -115,20 +105,15 @@ int telemetry_create_description_string(const config_data_basic_t * const config
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,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;
break;
}
@ -418,15 +403,13 @@ void telemetry_send_values( uint8_t rx_pkts,
int8_t cutoff_and_vbat_low,
const config_data_mode_t * const config_mode) {
uint8_t scaled_vbatt_voltage = 0;
// this is B+ voltage, which is scaled * 100 what means that 1152 equals to 11.52V
if (vbatt_voltage < 1511 && vbatt_voltage > 1000) {
// mininum value will be 10.01V (0x0) and maximum 15.11V (0xFF), with the step of .02V
scaled_vbatt_voltage = (uint8_t)((vbatt_voltage - 1000u) / 2u);
telemetry_scaled_vbatt_voltage = (uint8_t)((vbatt_voltage - 1000u) / 2u);
}
else if (vbatt_voltage > 1510) {
scaled_vbatt_voltage = 0xFF;
telemetry_scaled_vbatt_voltage = 0xFF;
}
else {
;
@ -524,10 +507,10 @@ void telemetry_send_values( uint8_t rx_pkts,
#ifdef PARAMETEO
if (config_mode->digi_viscous == 0) {
// generate the telemetry frame from values
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);
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, telemetry_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 {
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);
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, telemetry_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) {

Wyświetl plik

@ -730,7 +730,22 @@ void srl_irq_handler(srl_context_t *ctx) {
}
break;
default: break;
case SRL_TX_IDLE:
ctx->port->CR1 &= (0xFFFFFFFF ^ USART_CR1_TE); //wyġṗczanie nadajnika portu szeregowego
ctx->port->CR1 &= (0xFFFFFFFF ^ USART_CR1_TXEIE);
ctx->port->CR1 &= (0xFFFFFFFF ^ USART_CR1_TCIE); // wyġṗczanie przerwañ od portu szeregowego
ctx->port->ISR &= (0xFFFFFFFF ^ USART_ISR_TC);
ctx->srl_tx_state = SRL_TX_IDLE;
// reset tx buffer pointer to internal one
ctx->srl_tx_buf_pointer = ctx->srl_tx_internal_buf_pointer;
ctx->srl_tx_buf_ln = ctx->srl_tx_internal_buf_ln;
if (ctx->te_port != 0) {
LL_GPIO_ResetOutputPin(ctx->te_port, ctx->te_pin);
}
break;
default: break;
}
}