kopia lustrzana https://github.com/SP8EBC/ParaTNC
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
rodzic
6648c8cc54
commit
28b65cc9f7
|
@ -58,6 +58,6 @@
|
|||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="org.eclipse.embedcdt.debug.gdbjtag.core.PERIPHERALS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peripherals> <peripheral name="IWDG"/> <peripheral name="DBGMCU"/> <peripheral name="GPIOC"/> </peripherals> "/>
|
||||
<stringAttribute key="org.eclipse.embedcdt.debug.gdbjtag.core.PERIPHERALS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peripherals> <peripheral name="IWDG"/> <peripheral name="DBGMCU"/> <peripheral name="USART3"/> </peripherals> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
</launchConfiguration>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue