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;
}
}