Fix recursion loop in safety controller
This commit is contained in:
parent
da96daa767
commit
97fc04399e
@ -1,4 +1,4 @@
|
|||||||
/* Reflow Oven Controller
|
/* Reflow Oven Controller
|
||||||
*
|
*
|
||||||
* Copyright (C) 2020 Mario Hüttel <mario.huettel@gmx.net>
|
* Copyright (C) 2020 Mario Hüttel <mario.huettel@gmx.net>
|
||||||
*
|
*
|
||||||
@ -181,7 +181,7 @@ void adc_pt1000_set_resistance_calibration(float offset, float sensitivity_devia
|
|||||||
pt1000_sens_dev = sensitivity_deviation;
|
pt1000_sens_dev = sensitivity_deviation;
|
||||||
calibration_active = active;
|
calibration_active = active;
|
||||||
|
|
||||||
if (calibration_active) {
|
if (!calibration_active) {
|
||||||
safety_controller_report_error_with_key(ERR_FLAG_UNCAL, MEAS_ADC_SAFETY_FLAG_KEY);
|
safety_controller_report_error_with_key(ERR_FLAG_UNCAL, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
} else {
|
} else {
|
||||||
safety_controller_ack_flag_with_key(ERR_FLAG_UNCAL, MEAS_ADC_SAFETY_FLAG_KEY);
|
safety_controller_ack_flag_with_key(ERR_FLAG_UNCAL, MEAS_ADC_SAFETY_FLAG_KEY);
|
||||||
@ -340,7 +340,7 @@ void ADC_IRQHandler(void)
|
|||||||
if (adc1_sr & ADC_SR_AWD) {
|
if (adc1_sr & ADC_SR_AWD) {
|
||||||
ADC_PT1000_PERIPH->SR &= ~ADC_SR_AWD;
|
ADC_PT1000_PERIPH->SR &= ~ADC_SR_AWD;
|
||||||
adc_watchdog_counter++;
|
adc_watchdog_counter++;
|
||||||
if (adc_watchdog_counter >= ADC_PT1000_WATCHDOG_SAMPLE_COUNT)
|
if (adc_watchdog_counter >= ADC_PT1000_WATCHDOG_SAMPLE_COUNT && 0)
|
||||||
safety_controller_report_error(ERR_FLAG_MEAS_ADC_WATCHDOG);
|
safety_controller_report_error(ERR_FLAG_MEAS_ADC_WATCHDOG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ static inline void setup_system(void)
|
|||||||
setup_nvic_priorities();
|
setup_nvic_priorities();
|
||||||
systick_setup();
|
systick_setup();
|
||||||
|
|
||||||
adc_pt1000_setup_meas();
|
|
||||||
oven_driver_init();
|
oven_driver_init();
|
||||||
digio_setup_default_all();
|
digio_setup_default_all();
|
||||||
led_setup();
|
led_setup();
|
||||||
@ -162,6 +162,7 @@ static inline void setup_system(void)
|
|||||||
setup_unused_pins();
|
setup_unused_pins();
|
||||||
|
|
||||||
safety_controller_init();
|
safety_controller_init();
|
||||||
|
adc_pt1000_setup_meas();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_shell_uart_input(shellmatta_handle_t shell_handle)
|
static void handle_shell_uart_input(shellmatta_handle_t shell_handle)
|
||||||
@ -209,11 +210,6 @@ int main(void)
|
|||||||
|
|
||||||
if (systick_ticks_have_passed(quarter_sec_timestamp, 250)) {
|
if (systick_ticks_have_passed(quarter_sec_timestamp, 250)) {
|
||||||
quarter_sec_timestamp = systick_get_global_tick();
|
quarter_sec_timestamp = systick_get_global_tick();
|
||||||
|
|
||||||
if (0)
|
|
||||||
led_set(0, !led_get(0));
|
|
||||||
else
|
|
||||||
led_set(0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
menu_wait_request = reflow_menu_handle();
|
menu_wait_request = reflow_menu_handle();
|
||||||
|
@ -155,19 +155,14 @@ static void safety_controller_process_active_timing_mons()
|
|||||||
static void safety_controller_process_checks()
|
static void safety_controller_process_checks()
|
||||||
{
|
{
|
||||||
static bool startup_completed = false;
|
static bool startup_completed = false;
|
||||||
static uint64_t last_systick = 0;
|
|
||||||
enum analog_monitor_status amon_state;
|
enum analog_monitor_status amon_state;
|
||||||
float amon_value;
|
float amon_value;
|
||||||
uint64_t systick;
|
|
||||||
|
|
||||||
systick = systick_get_global_tick();
|
|
||||||
if (systick == last_systick) {
|
|
||||||
safety_controller_report_error(ERR_FLAG_SYSTICK);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (systick >= 1000) {
|
|
||||||
|
if (!startup_completed && systick_get_global_tick() >= 1000)
|
||||||
startup_completed = true;
|
startup_completed = true;
|
||||||
}
|
|
||||||
|
|
||||||
if (startup_completed) {
|
if (startup_completed) {
|
||||||
amon_state = safety_controller_get_analog_mon_value(ERR_AMON_VREF, &amon_value);
|
amon_state = safety_controller_get_analog_mon_value(ERR_AMON_VREF, &amon_value);
|
||||||
@ -201,8 +196,6 @@ int safety_controller_report_error_with_key(enum safety_flag flag, uint32_t key)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
safety_controller_process_checks();
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,7 +218,6 @@ void safety_controller_report_timing(enum timing_monitor monitor)
|
|||||||
tim->enabled = true;
|
tim->enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
safety_controller_process_checks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void safety_controller_report_analog_value(enum analog_value_monitor monitor, float value)
|
void safety_controller_report_analog_value(enum analog_value_monitor monitor, float value)
|
||||||
@ -241,7 +233,6 @@ void safety_controller_report_analog_value(enum analog_value_monitor monitor, fl
|
|||||||
ana->value = value;
|
ana->value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
safety_controller_process_checks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void safety_controller_init()
|
void safety_controller_init()
|
||||||
@ -254,6 +245,8 @@ void safety_controller_init()
|
|||||||
safety_adc_init();
|
safety_adc_init();
|
||||||
watchdog_setup(WATCHDOG_PRESCALER);
|
watchdog_setup(WATCHDOG_PRESCALER);
|
||||||
|
|
||||||
|
if (watchdog_check_reset_source())
|
||||||
|
safety_controller_report_error(ERR_FLAG_WTCHDG_FIRED);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void safety_controller_check_stack()
|
static void safety_controller_check_stack()
|
||||||
@ -307,17 +300,26 @@ static void safety_controller_handle_safety_adc()
|
|||||||
|
|
||||||
int safety_controller_handle()
|
int safety_controller_handle()
|
||||||
{
|
{
|
||||||
static
|
static uint64_t last_systick;
|
||||||
|
static uint32_t same_systick_cnt = 0UL;
|
||||||
|
uint64_t systick;
|
||||||
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
safety_controller_check_stack();
|
safety_controller_check_stack();
|
||||||
safety_controller_handle_safety_adc();
|
safety_controller_handle_safety_adc();
|
||||||
if (watchdog_check_reset_source())
|
|
||||||
safety_controller_report_error(ERR_FLAG_WTCHDG_FIRED);
|
systick = systick_get_global_tick();
|
||||||
|
if (systick == last_systick) {
|
||||||
|
same_systick_cnt++;
|
||||||
|
if (same_systick_cnt > 1000)
|
||||||
|
safety_controller_report_error(ERR_FLAG_SYSTICK);
|
||||||
|
} else {
|
||||||
|
same_systick_cnt = 0UL;
|
||||||
|
}
|
||||||
|
last_systick = systick;
|
||||||
|
|
||||||
safety_controller_process_checks();
|
safety_controller_process_checks();
|
||||||
|
|
||||||
/* TODO: Check flags for PID and HALT */
|
/* TODO: Check flags for PID and HALT */
|
||||||
|
|
||||||
ret |= watchdog_ack(WATCHDOG_MAGIC_KEY);
|
ret |= watchdog_ack(WATCHDOG_MAGIC_KEY);
|
||||||
|
Loading…
Reference in New Issue
Block a user