SystemReset if no GPS-FIX in main thread

pull/65/head
Wolfgang Hallmann 2023-10-16 15:15:05 +02:00
rodzic 9676921399
commit 4bcf503593
4 zmienionych plików z 97 dodań i 20 usunięć

Wyświetl plik

@ -50,7 +50,7 @@
#define RADIO_SI5351_ENABLE false #define RADIO_SI5351_ENABLE false
// Number of character pairs to include in locator // Number of character pairs to include in locator
#define LOCATOR_PAIR_COUNT_FULL 6 // max. 6 (12 characters WWL) #define LOCATOR_PAIR_COUNT_FULL 12 // max. 6 (12 characters WWL)
// Delay after transmission for modes that do not use time synchronization. Zero delay allows continuous transmit mode for Horus V1 and V2. // Delay after transmission for modes that do not use time synchronization. Zero delay allows continuous transmit mode for Horus V1 and V2.
#define RADIO_POST_TRANSMIT_DELAY_MS 1000 #define RADIO_POST_TRANSMIT_DELAY_MS 1000
@ -65,6 +65,13 @@
// Enable this setting to require 3D fix (altitude required, enable for airborne use), otherwise 2D fix is enough // Enable this setting to require 3D fix (altitude required, enable for airborne use), otherwise 2D fix is enough
#define GPS_REQUIRE_3D_FIX true #define GPS_REQUIRE_3D_FIX true
// Enable this setting to make a cold start on the CPU if GPS-Fix missing longer then GPS_REBOOT_MISSING_GPS_FIX_SECONDS
#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
// Enable power-saving features of the GPS chip to save power. // Enable power-saving features of the GPS chip to save power.
// This option should be safe to enable, as it enters a selective power saving mode. // This option should be safe to enable, as it enters a selective power saving mode.
// If the GPS chip loses fix, it will enter a higher power state automatically. // If the GPS chip loses fix, it will enter a higher power state automatically.
@ -73,7 +80,7 @@
// Based on measurements Mark VK5QI, enabling this reduces power consumption by about 30-40 mA (~50%) to around 30-50 mA, // Based on measurements Mark VK5QI, enabling this reduces power consumption by about 30-40 mA (~50%) to around 30-50 mA,
// where the consumption is 70-90 mA when power saving is not enabled and any radio transmitters are idle. // where the consumption is 70-90 mA when power saving is not enabled and any radio transmitters are idle.
// See the README for details about power consumption. // See the README for details about power consumption.
#define GPS_POWER_SAVING_ENABLE false #define GPS_POWER_SAVING_ENABLE true
// Enable NMEA output from GPS via external serial port. This disables use of I²C bus (Si5351 and sensors) because the pins are shared. // Enable NMEA output from GPS via external serial port. This disables use of I²C bus (Si5351 and sensors) because the pins are shared.
#define GPS_NMEA_OUTPUT_VIA_SERIAL_PORT_ENABLE false #define GPS_NMEA_OUTPUT_VIA_SERIAL_PORT_ENABLE false
@ -124,14 +131,14 @@
// The COUNT settings define the number of times that each type of transmission is repeated // The COUNT settings define the number of times that each type of transmission is repeated
#define RADIO_SI4032_TX_CW false #define RADIO_SI4032_TX_CW false
#define RADIO_SI4032_TX_CW_COUNT 1 #define RADIO_SI4032_TX_CW_COUNT 1
#define RADIO_SI4032_TX_PIP false #define RADIO_SI4032_TX_PIP true
#define RADIO_SI4032_TX_PIP_COUNT 6 #define RADIO_SI4032_TX_PIP_COUNT 1
#define RADIO_SI4032_TX_APRS true #define RADIO_SI4032_TX_APRS false
#define RADIO_SI4032_TX_APRS_COUNT 2 #define RADIO_SI4032_TX_APRS_COUNT 2
#define RADIO_SI4032_TX_HORUS_V1 false #define RADIO_SI4032_TX_HORUS_V1 false
#define RADIO_SI4032_TX_HORUS_V1_COUNT 1 #define RADIO_SI4032_TX_HORUS_V1_COUNT 1
#define RADIO_SI4032_TX_HORUS_V2 true #define RADIO_SI4032_TX_HORUS_V2 true
#define RADIO_SI4032_TX_HORUS_V2_COUNT 6 #define RADIO_SI4032_TX_HORUS_V2_COUNT 1
// Continuous transmit mode can be enabled for *either* Horus V1 or V2, but not both. This disables all other transmission modes. // Continuous transmit mode can be enabled for *either* Horus V1 or V2, but not both. This disables all other transmission modes.
// The continuous mode transmits Horus 4FSK preamble between transmissions // The continuous mode transmits Horus 4FSK preamble between transmissions
@ -141,11 +148,11 @@
// Transmit frequencies for the Si4032 transmitter modes // Transmit frequencies for the Si4032 transmitter modes
#define RADIO_SI4032_TX_FREQUENCY_CW 432500000 #define RADIO_SI4032_TX_FREQUENCY_CW 432500000
#define RADIO_SI4032_TX_FREQUENCY_PIP 432500000 #define RADIO_SI4032_TX_FREQUENCY_PIP 434713000
#define RADIO_SI4032_TX_FREQUENCY_APRS_1200 432500000 #define RADIO_SI4032_TX_FREQUENCY_APRS_1200 432500000
// Use a frequency offset to place FSK tones slightly above the defined frequency for SSB reception // Use a frequency offset to place FSK tones slightly above the defined frequency for SSB reception
#define RADIO_SI4032_TX_FREQUENCY_HORUS_V1 432501000 #define RADIO_SI4032_TX_FREQUENCY_HORUS_V1 432501000
#define RADIO_SI4032_TX_FREQUENCY_HORUS_V2 432501000 #define RADIO_SI4032_TX_FREQUENCY_HORUS_V2 434713000
// Use a rotating alternate 2nd frequency for HORUS_V2 (not continously) // Use a rotating alternate 2nd frequency for HORUS_V2 (not continously)
#define RADIO_SI4032_TX_FREQUENCY2_HORUS_V2_ACTIV false #define RADIO_SI4032_TX_FREQUENCY2_HORUS_V2_ACTIV false
#define RADIO_SI4032_TX_FREQUENCY2_HORUS_V2 437600000 #define RADIO_SI4032_TX_FREQUENCY2_HORUS_V2 437600000
@ -266,7 +273,7 @@
// NOTE: Payload ID 256 (4FSKTEST-V2) is for testing purposes only, and should not be used on an actual flight. // NOTE: Payload ID 256 (4FSKTEST-V2) is for testing purposes only, and should not be used on an actual flight.
// Please request a new payload ID in GitHub according to the instructions at: https://github.com/projecthorus/horusdemodlib/wiki#how-do-i-transmit-it // Please request a new payload ID in GitHub according to the instructions at: https://github.com/projecthorus/horusdemodlib/wiki#how-do-i-transmit-it
#define HORUS_V2_PAYLOAD_ID 256 #define HORUS_V2_PAYLOAD_ID 373
#define HORUS_V2_BAUD_RATE_SI4032 100 #define HORUS_V2_BAUD_RATE_SI4032 100
#define HORUS_V2_BAUD_RATE_SI5351 50 #define HORUS_V2_BAUD_RATE_SI5351 50
#define HORUS_V2_PREAMBLE_LENGTH 16 #define HORUS_V2_PREAMBLE_LENGTH 16
@ -275,9 +282,9 @@
// Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync. // Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync.
// See the README file for more detailed documentation about time sync and its offset setting // See the README file for more detailed documentation about time sync and its offset setting
#define HORUS_V2_TIME_SYNC_SECONDS 0 #define HORUS_V2_TIME_SYNC_SECONDS 60
// Delay transmission for an N second offset, counting from the scheduled time set with TIME_SYNC_SECONDS. // Delay transmission for an N second offset, counting from the scheduled time set with TIME_SYNC_SECONDS.
#define HORUS_V2_TIME_SYNC_OFFSET_SECONDS 0 #define HORUS_V2_TIME_SYNC_OFFSET_SECONDS 1
/** /**
* CW settings * CW settings
@ -297,13 +304,13 @@
*/ */
// Pip speed is defined as CW WPM, range 5 - 40 // Pip speed is defined as CW WPM, range 5 - 40
#define PIP_SPEED_WPM 18 #define PIP_SPEED_WPM 10
// Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync. // Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync.
// See the README file for more detailed documentation about time sync and its offset setting // See the README file for more detailed documentation about time sync and its offset setting
#define PIP_TIME_SYNC_SECONDS 0 #define PIP_TIME_SYNC_SECONDS 60
// Delay transmission for an N second offset, counting from the scheduled time set with TIME_SYNC_SECONDS. // Delay transmission for an N second offset, counting from the scheduled time set with TIME_SYNC_SECONDS.
#define PIP_TIME_SYNC_OFFSET_SECONDS 0 #define PIP_TIME_SYNC_OFFSET_SECONDS 31
/** /**
* WSPR settings * WSPR settings

Wyświetl plik

@ -11,6 +11,7 @@
#include "system.h" #include "system.h"
#include "delay.h" #include "delay.h"
#include "log.h" #include "log.h"
#include "hal/cmsis/core_cm3.h" // for NVIC_SystemReset
#define BUTTON_PRESS_LONG_COUNT SYSTEM_SCHEDULER_TIMER_TICKS_PER_SECOND #define BUTTON_PRESS_LONG_COUNT SYSTEM_SCHEDULER_TIMER_TICKS_PER_SECOND
@ -33,6 +34,11 @@ static void nvic_init()
#endif #endif
} }
void nvic_cold_start()
{
NVIC_SystemReset();
}
// TODO: Find out how to configure watchdog! // TODO: Find out how to configure watchdog!
static void rcc_init() static void rcc_init()
@ -249,6 +255,18 @@ void system_enable_tick()
TIM_Cmd(TIM4, ENABLE); TIM_Cmd(TIM4, ENABLE);
} }
void system_flicker_green_led(uint8_t count)
{
uint8_t i;
system_set_green_led(false);
for(i=1;i<=count;i++) {
system_set_green_led(true);
delay_ms(50);
system_set_green_led(false);
delay_ms(100);
}
}
void system_set_green_led(bool enabled) void system_set_green_led(bool enabled)
{ {
if (enabled) { if (enabled) {
@ -258,6 +276,18 @@ void system_set_green_led(bool enabled)
} }
} }
void system_flicker_red_led(uint8_t count)
{
uint8_t i;
system_set_red_led(false);
for(i=1;i<=count;i++) {
system_set_red_led(true);
delay_ms(50);
system_set_red_led(false);
delay_ms(100);
}
}
void system_set_red_led(bool enabled) void system_set_red_led(bool enabled)
{ {
if (enabled) { if (enabled) {

Wyświetl plik

@ -15,10 +15,13 @@ void system_disable_tick();
void system_enable_tick(); void system_enable_tick();
void system_disable_irq(); void system_disable_irq();
void system_enable_irq(); void system_enable_irq();
void system_flicker_green_led(uint8_t count);
void system_set_green_led(bool enabled); void system_set_green_led(bool enabled);
void system_flicker_red_led(uint8_t count);
void system_set_red_led(bool enabled); void system_set_red_led(bool enabled);
uint16_t system_get_battery_voltage_millivolts(); uint16_t system_get_battery_voltage_millivolts();
uint16_t system_get_button_adc_value(); uint16_t system_get_button_adc_value();
void nvic_cold_start();
extern void (*system_handle_timer_tick)(); extern void (*system_handle_timer_tick)();

Wyświetl plik

@ -17,20 +17,46 @@
uint32_t counter = 0; uint32_t counter = 0;
bool led_state = true; bool led_state = true;
uint32_t noFixCounter = 0;
bool inuse_handle_timer_tick = false;
bool led_state2 = true;
gps_data current_gps_data; gps_data current_gps_data;
void handle_timer_tick() void handle_timer_tick()
{ {
if (inuse_handle_timer_tick) { return; }
else {
inuse_handle_timer_tick = true;
}
if (!system_initialized) { if (!system_initialized) {
inuse_handle_timer_tick = false;
return; return;
} }
radio_handle_timer_tick(); radio_handle_timer_tick();
counter = (counter + 1) % SYSTEM_SCHEDULER_TIMER_TICKS_PER_SECOND; counter = (counter + 1) % SYSTEM_SCHEDULER_TIMER_TICKS_PER_SECOND;
if (counter == 0) { if (counter == 0) {
ubxg6010_get_current_gps_data(&current_gps_data); ubxg6010_get_current_gps_data(&current_gps_data);
if (GPS_REBOOT_MISSING_GPS_FIX_ENABLE) {
if (!GPS_HAS_FIX(current_gps_data)) {
noFixCounter = noFixCounter + 1;
//led_state2 = !led_state2;
//set_red_led(!led_state2);
if (noFixCounter >= GPS_REBOOT_MISSING_GPS_FIX_SECONDS) {
noFixCounter = 0;
// unproofed: secure: stop interrupt calls
//system_handle_timer_tick = NULL;
//system_handle_data_timer_tick = NULL;
//usart_gps_handle_incoming_byte = NULL;
// request cold boot on the STM32 processor
inuse_handle_timer_tick = false;
nvic_cold_start();
return;
}
}
} else { noFixCounter = 0; }
} }
if (leds_enabled) { if (leds_enabled) {
@ -47,6 +73,7 @@ void handle_timer_tick()
} }
} }
} }
inuse_handle_timer_tick = false;
} }
void set_green_led(bool enabled) void set_green_led(bool enabled)
@ -70,6 +97,7 @@ void set_red_led(bool enabled)
int main(void) int main(void)
{ {
bool success; bool success;
system_initialized = false;
// Set up interrupt handlers // Set up interrupt handlers
system_handle_timer_tick = handle_timer_tick; system_handle_timer_tick = handle_timer_tick;
@ -78,9 +106,14 @@ int main(void)
log_info("System init\n"); log_info("System init\n");
system_init(); system_init();
set_red_led(false);
set_green_led(false); set_green_led(false);
set_red_led(true); system_flicker_green_led(5);
// delay_ms(100);
system_flicker_red_led(5);
//WOHA set_green_led(false);
//WOHA set_red_led(true);
if (gps_nmea_output_enabled) { if (gps_nmea_output_enabled) {
log_info("External USART init\n"); log_info("External USART init\n");
@ -148,9 +181,11 @@ int main(void)
log_info("System initialized!\n"); log_info("System initialized!\n");
set_green_led(false);
if (leds_enabled) { if (leds_enabled) {
set_green_led(true); //WOHA set_green_led(true);
set_red_led(false); //WOHA set_red_led(false);
} else { } else {
set_green_led(false); set_green_led(false);
set_red_led(false); set_red_led(false);
@ -158,7 +193,9 @@ int main(void)
system_initialized = true; system_initialized = true;
while (true) { while (true) {
// set_red_led(true); delay_ms(50);set_red_led(false);
radio_handle_main_loop(); radio_handle_main_loop();
//NVIC_SystemLPConfig(NVIC_LP_SEVONPEND, DISABLE); //NVIC_SystemLPConfig(NVIC_LP_SEVONPEND, DISABLE);
//__WFI(); //__WFI();