From 024ed2a3db75673dbc343d6c36d301e64a55eb5e Mon Sep 17 00:00:00 2001 From: Wolfgang Hallmann Date: Fri, 20 Oct 2023 16:48:35 +0200 Subject: [PATCH] Coldstart on GPS_init if looped 10 times unsuccess --- src/config.h | 4 ++-- src/drivers/ubxg6010/ubxg6010.c | 2 +- src/main.c | 33 ++++++++++++++++++++++----------- src/radio.c | 15 +++++++++++++-- 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/config.h b/src/config.h index a7c8e8d..12dfd5e 100644 --- a/src/config.h +++ b/src/config.h @@ -56,7 +56,7 @@ #define RADIO_POST_TRANSMIT_DELAY_MS 1000 // Threshold for time-synchronized modes regarding how far from scheduled transmission time the transmission is still allowed -#define RADIO_TIME_SYNC_THRESHOLD_MS 2000 +#define RADIO_TIME_SYNC_THRESHOLD_MS 4001 // Number of leap seconds to add to the raw GPS time reported by the GPS chip (see https://timetoolsltd.com/gps/what-is-gps-time/ for more info) // This value is used by default, but if the received GPS data contains indication about leap seconds, that one is used instead. @@ -69,7 +69,7 @@ #define GPS_REBOOT_MISSING_GPS_FIX_ENABLE true // If enabled above, define threschold how long a missing GPS-Fix before cold start (dont hold it to short) -#define GPS_REBOOT_MISSING_GPS_FIX_SECONDS 80 +#define GPS_REBOOT_MISSING_GPS_FIX_SECONDS 201 // Enable power-saving features of the GPS chip to save power. diff --git a/src/drivers/ubxg6010/ubxg6010.c b/src/drivers/ubxg6010/ubxg6010.c index dca001e..678e959 100644 --- a/src/drivers/ubxg6010/ubxg6010.c +++ b/src/drivers/ubxg6010/ubxg6010.c @@ -505,7 +505,7 @@ bool ubxg6010_enable_power_save_mode() ubxg6010_send_packet(&packet); success = ubxg6010_wait_for_ack(); if (!success) { - log_error("GPS: Entering power-saving mode failed\n") + log_error("GPS: Entering power-saving mode failed\n"); } return success; diff --git a/src/main.c b/src/main.c index 9cb3153..55b2435 100644 --- a/src/main.c +++ b/src/main.c @@ -97,6 +97,8 @@ void set_red_led(bool enabled) int main(void) { bool success; + uint8_t gps_init_fail_counter = 0; + system_initialized = false; // Set up interrupt handlers @@ -106,14 +108,9 @@ int main(void) log_info("System init\n"); system_init(); - set_red_led(false); - set_green_led(false); - system_flicker_green_led(5); - // delay_ms(100); - system_flicker_red_led(5); - //WOHA set_green_led(false); - //WOHA set_red_led(true); + set_green_led(false); + set_red_led(true); if (gps_nmea_output_enabled) { log_info("External USART init\n"); @@ -129,12 +126,28 @@ int main(void) log_info("SPI init\n"); spi_init(); + // look for Voltage + // maybe interessting to check if reset only helpfull after mV climbed up > 1500 mV by solar panel source + uint16_t batteryV = system_get_battery_voltage_millivolts(); + float batteryVf = (float)batteryV / 5.0f; + uint8_t volts_scaled = (uint8_t)(255 * batteryVf); + // on debug with dongle the VCC is only 170 mV because board feed by dongle not on battery. + log_info("Startup Voltage: %d mV \n",volts_scaled); + gps_init: log_info("GPS init\n"); success = ubxg6010_init(); if (!success) { log_error("GPS initialization failed, retrying...\n"); delay_ms(1000); + system_flicker_red_led(2); + gps_init_fail_counter++; + if (gps_init_fail_counter >= 10) { + system_disable_irq(); + system_flicker_red_led(5); + nvic_cold_start(); + + } goto gps_init; } @@ -181,11 +194,9 @@ int main(void) log_info("System initialized!\n"); -set_green_led(false); - if (leds_enabled) { - //WOHA set_green_led(true); - //WOHA set_red_led(false); + set_green_led(true); + set_red_led(false); } else { set_green_led(false); set_red_led(false); diff --git a/src/radio.c b/src/radio.c index 2937550..4008c61 100644 --- a/src/radio.c +++ b/src/radio.c @@ -332,6 +332,8 @@ uint8_t radio_current_symbol_data[RADIO_SYMBOL_DATA_MAX_LENGTH]; static volatile uint32_t start_tick = 0, end_tick = 0; +bool led_state_radio = true; + telemetry_data current_telemetry_data; radio_module_state radio_shared_state = { @@ -422,6 +424,8 @@ static bool radio_start_transmit(radio_transmit_entry *entry) log_info("\n "); log_bytes(radio_current_payload_length, (char *) radio_current_payload); log_info("\n"); + log_info("Battery: %d mV\n", current_telemetry_data.battery_voltage_millivolts); + #endif // USART interrupts may interfere with transmission timing @@ -514,6 +518,8 @@ static bool radio_start_transmit(radio_transmit_entry *entry) if (!enable_gps_during_transmit) { ubxg6010_reset_parser(); } + // to be sure: + success = false; switch (entry->radio_type) { case RADIO_TYPE_SI4032: @@ -700,6 +706,7 @@ void radio_handle_timer_tick() } } +// Called by Interrupt TIM2_IRQ void radio_handle_data_timer_tick() { radio_handle_data_timer_si4032(); @@ -731,17 +738,22 @@ bool radio_handle_time_sync() if (time_millis == radio_previous_time_sync_scheduled) { // The GPS chip has not provided an updated time yet for some reason + // WOHA + // log_info("@ time_millis same as last\n"); return false; } uint32_t time_sync_offset_millis = radio_current_transmit_entry->time_sync_seconds_offset * 1000; + // Only at start of week, millis can be lower then offset :-) if (time_millis < time_sync_offset_millis) { + // WOHA + // log_info("@ Time millis: %lu lower %lu\n", time_millis, time_sync_offset_millis); return false; } uint32_t time_sync_millis = radio_current_transmit_entry->time_sync_seconds * 1000; - + uint32_t time_with_offset_millis = time_millis - time_sync_offset_millis; uint32_t time_sync_period_millis = time_with_offset_millis % time_sync_millis; @@ -779,7 +791,6 @@ void radio_handle_main_loop() delay_ms(100); return; } - radio_reset_transmit_delay_counter(); radio_start_transmit_entry = radio_current_transmit_entry; } else if (!radio_shared_state.radio_transmission_active && radio_post_transmit_delay_counter == 0) {