First draft of safety controller
This commit is contained in:
parent
a04e894518
commit
4f3016649d
@ -34,6 +34,7 @@ enum safety_flag {
|
|||||||
ERR_FLAG_STACK = (1<<8),
|
ERR_FLAG_STACK = (1<<8),
|
||||||
ERR_FLAG_SAFETY_ADC = (1<<9),
|
ERR_FLAG_SAFETY_ADC = (1<<9),
|
||||||
ERR_FLAG_SYSTICK = (1<<10),
|
ERR_FLAG_SYSTICK = (1<<10),
|
||||||
|
ERR_FLAG_WTCHDG_FIRED = (1<<11),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum timing_monitor {
|
enum timing_monitor {
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include <reflow-controller/safety/safety-config.h>
|
#include <reflow-controller/safety/safety-config.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
enum analog_monitor_status {ANALOG_MONITOR_OK = 0,
|
enum analog_monitor_status {ANALOG_MONITOR_OK = 0,
|
||||||
ANALOG_MONITOR_ERROR,
|
ANALOG_MONITOR_ERROR,
|
||||||
@ -66,6 +67,8 @@ int safety_controller_get_flag(enum safety_flag flag, bool *status, bool try_ack
|
|||||||
|
|
||||||
int safety_controller_ack_flag(enum safety_flag flag);
|
int safety_controller_ack_flag(enum safety_flag flag);
|
||||||
|
|
||||||
|
int safety_controller_ack_flag_with_key(enum safety_flag flag, uint32_t key);
|
||||||
|
|
||||||
#endif /* __SAFETY_CONTROLLER_H__ */
|
#endif /* __SAFETY_CONTROLLER_H__ */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include <reflow-controller/safety/safety-config.h>
|
#include <reflow-controller/safety/safety-config.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Setup the watchdog for the safety controller
|
* @brief Setup the watchdog for the safety controller
|
||||||
@ -39,5 +40,11 @@ int watchdog_setup(uint8_t prescaler);
|
|||||||
*/
|
*/
|
||||||
int watchdog_ack(uint32_t magic);
|
int watchdog_ack(uint32_t magic);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if reset was generated by the watchdog.
|
||||||
|
* @note This also clears the relevant flag, so the function will reutrn false when called a second time
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool watchdog_check_reset_source(void);
|
||||||
|
|
||||||
#endif /* __WATCHDOG_H__ */
|
#endif /* __WATCHDOG_H__ */
|
||||||
|
@ -64,5 +64,4 @@ int rcc_manager_enable_clock(volatile uint32_t *rcc_enable_register, uint8_t bit
|
|||||||
*/
|
*/
|
||||||
int rcc_manager_disable_clock(volatile uint32_t *rcc_enable_register, uint8_t bit_no);
|
int rcc_manager_disable_clock(volatile uint32_t *rcc_enable_register, uint8_t bit_no);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __CLOCK_ENABLE_MANAGER_H__ */
|
#endif /* __CLOCK_ENABLE_MANAGER_H__ */
|
||||||
|
@ -30,9 +30,6 @@
|
|||||||
#include <reflow-controller/stack-check.h>
|
#include <reflow-controller/stack-check.h>
|
||||||
#include <helper-macros/helper-macros.h>
|
#include <helper-macros/helper-macros.h>
|
||||||
#include <reflow-controller/systick.h>
|
#include <reflow-controller/systick.h>
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
struct error_flag {
|
struct error_flag {
|
||||||
@ -40,6 +37,7 @@ struct error_flag {
|
|||||||
enum safety_flag flag;
|
enum safety_flag flag;
|
||||||
bool error_state;
|
bool error_state;
|
||||||
bool persistent;
|
bool persistent;
|
||||||
|
uint32_t key;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct timing_mon {
|
struct timing_mon {
|
||||||
@ -68,7 +66,7 @@ struct analog_mon {
|
|||||||
|
|
||||||
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
|
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
|
||||||
|
|
||||||
#define ERR_FLAG_ENTRY(errflag, persistency) {.name=#errflag, .flag = (errflag), .error_state = false, .persistent = (persistency)}
|
#define ERR_FLAG_ENTRY(errflag, persistency) {.name=#errflag, .flag = (errflag), .error_state = false, .persistent = (persistency), .key = 0UL}
|
||||||
#define TIM_MON_ENTRY(mon, min, max, flag) {.name=#mon, .monitor = (mon), .associated_flag=(flag), .min_delta = (min), .max_delta = (max), .last = 0ULL, .enabled= false}
|
#define TIM_MON_ENTRY(mon, min, max, flag) {.name=#mon, .monitor = (mon), .associated_flag=(flag), .min_delta = (min), .max_delta = (max), .last = 0ULL, .enabled= false}
|
||||||
#define ANA_MON_ENTRY(mon, min_value, max_value, flag) {.name=#mon, .monitor = (mon), .associated_flag=(flag), .min = (min_value), .max = (max_value), .value = 0.0f, .valid = false}
|
#define ANA_MON_ENTRY(mon, min_value, max_value, flag) {.name=#mon, .monitor = (mon), .associated_flag=(flag), .min = (min_value), .max = (max_value), .value = 0.0f, .valid = false}
|
||||||
|
|
||||||
@ -84,6 +82,7 @@ static struct error_flag flags[] = {
|
|||||||
ERR_FLAG_ENTRY(ERR_FLAG_STACK, true),
|
ERR_FLAG_ENTRY(ERR_FLAG_STACK, true),
|
||||||
ERR_FLAG_ENTRY(ERR_FLAG_SAFETY_ADC, true),
|
ERR_FLAG_ENTRY(ERR_FLAG_SAFETY_ADC, true),
|
||||||
ERR_FLAG_ENTRY(ERR_FLAG_SYSTICK, true),
|
ERR_FLAG_ENTRY(ERR_FLAG_SYSTICK, true),
|
||||||
|
ERR_FLAG_ENTRY(ERR_FLAG_WTCHDG_FIRED, true),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct timing_mon timings[] = {
|
static struct timing_mon timings[] = {
|
||||||
@ -301,6 +300,8 @@ int safety_controller_handle()
|
|||||||
|
|
||||||
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);
|
||||||
|
|
||||||
safety_controller_process_checks();
|
safety_controller_process_checks();
|
||||||
|
|
||||||
@ -371,14 +372,24 @@ int safety_controller_get_flag(enum safety_flag flag, bool *status, bool try_ack
|
|||||||
found_flag = find_error_flag(flag);
|
found_flag = find_error_flag(flag);
|
||||||
if (found_flag) {
|
if (found_flag) {
|
||||||
*status = found_flag->error_state;
|
*status = found_flag->error_state;
|
||||||
if (try_ack && !found_flag->persistent)
|
if (try_ack && !found_flag->persistent) {
|
||||||
|
/* Flag is generally non persistent
|
||||||
|
* If key is set, this function cannot remove the flag
|
||||||
|
*/
|
||||||
|
if (found_flag->key == 0UL)
|
||||||
found_flag->error_state = false;
|
found_flag->error_state = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int safety_controller_ack_flag(enum safety_flag flag)
|
int safety_controller_ack_flag(enum safety_flag flag)
|
||||||
|
{
|
||||||
|
return safety_controller_ack_flag_with_key(flag, 0UL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int safety_controller_ack_flag_with_key(enum safety_flag flag, uint32_t key)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
struct error_flag *found_flag;
|
struct error_flag *found_flag;
|
||||||
@ -389,7 +400,7 @@ int safety_controller_ack_flag(enum safety_flag flag)
|
|||||||
|
|
||||||
found_flag = find_error_flag(flag);
|
found_flag = find_error_flag(flag);
|
||||||
if (found_flag) {
|
if (found_flag) {
|
||||||
if (!found_flag->persistent) {
|
if (!found_flag->persistent && found_flag->key == key) {
|
||||||
found_flag->error_state = false;
|
found_flag->error_state = false;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -105,4 +105,16 @@ int watchdog_ack(uint32_t magic)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool watchdog_check_reset_source(void)
|
||||||
|
{
|
||||||
|
bool ret;
|
||||||
|
|
||||||
|
ret = !!(RCC->CSR & RCC_CSR_WDGRSTF);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
RCC->CSR |= RCC_CSR_RMVF;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
Loading…
Reference in New Issue
Block a user