diff --git a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch index a62a50b..af82e71 100644 --- a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch +++ b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch @@ -58,6 +58,6 @@ - + diff --git a/include/aprsis.h b/include/aprsis.h index 396e2c6..6dbe92d 100644 --- a/include/aprsis.h +++ b/include/aprsis.h @@ -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); diff --git a/include/pwr_save.h b/include/pwr_save.h index 1709ad1..cc02e1f 100644 --- a/include/pwr_save.h +++ b/include/pwr_save.h @@ -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 | diff --git a/src/aprsis.c b/src/aprsis.c index 1e2018f..aead08e 100644 --- a/src/aprsis.c +++ b/src/aprsis.c @@ -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); diff --git a/src/main.c b/src/main.c index ee64dbd..a01261f 100644 --- a/src/main.c +++ b/src/main.c @@ -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) { diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index 456c653..4b1d73c 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -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, diff --git a/src/pwr_save.c b/src/pwr_save.c index ac79763..5921391 100644 --- a/src/pwr_save.c +++ b/src/pwr_save.c @@ -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); } diff --git a/system/include/aprs/telemetry.h b/system/include/aprs/telemetry.h index d94c77f..f734953 100644 --- a/system/include/aprs/telemetry.h +++ b/system/include/aprs/telemetry.h @@ -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); diff --git a/system/src/aprs/telemetry.c b/system/src/aprs/telemetry.c index c566c6a..e4e0539 100644 --- a/system/src/aprs/telemetry.c +++ b/system/src/aprs/telemetry.c @@ -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) { diff --git a/system/src/drivers/l4/serial_stm32l4x.c b/system/src/drivers/l4/serial_stm32l4x.c index 4d9182c..9e2796a 100644 --- a/system/src/drivers/l4/serial_stm32l4x.c +++ b/system/src/drivers/l4/serial_stm32l4x.c @@ -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; } }