#define FAULT_STATUS_NONE 0U #define FAULT_STATUS_TEMPORARY 1U #define FAULT_STATUS_PERMANENT 2U // Fault types, matches cereal.log.PandaState.FaultType #define FAULT_RELAY_MALFUNCTION (1UL << 0) #define FAULT_UNUSED_INTERRUPT_HANDLED (1UL << 1) #define FAULT_INTERRUPT_RATE_CAN_1 (1UL << 2) #define FAULT_INTERRUPT_RATE_CAN_2 (1UL << 3) #define FAULT_INTERRUPT_RATE_CAN_3 (1UL << 4) #define FAULT_INTERRUPT_RATE_TACH (1UL << 5) #define FAULT_INTERRUPT_RATE_GMLAN (1UL << 6) // deprecated #define FAULT_INTERRUPT_RATE_INTERRUPTS (1UL << 7) #define FAULT_INTERRUPT_RATE_SPI_DMA (1UL << 8) #define FAULT_INTERRUPT_RATE_SPI_CS (1UL << 9) #define FAULT_INTERRUPT_RATE_UART_1 (1UL << 10) #define FAULT_INTERRUPT_RATE_UART_2 (1UL << 11) #define FAULT_INTERRUPT_RATE_UART_3 (1UL << 12) #define FAULT_INTERRUPT_RATE_UART_5 (1UL << 13) #define FAULT_INTERRUPT_RATE_UART_DMA (1UL << 14) #define FAULT_INTERRUPT_RATE_USB (1UL << 15) #define FAULT_INTERRUPT_RATE_TIM1 (1UL << 16) #define FAULT_INTERRUPT_RATE_TIM3 (1UL << 17) #define FAULT_REGISTER_DIVERGENT (1UL << 18) #define FAULT_INTERRUPT_RATE_KLINE_INIT (1UL << 19) #define FAULT_INTERRUPT_RATE_CLOCK_SOURCE (1UL << 20) #define FAULT_INTERRUPT_RATE_TICK (1UL << 21) #define FAULT_INTERRUPT_RATE_EXTI (1UL << 22) #define FAULT_INTERRUPT_RATE_SPI (1UL << 23) #define FAULT_INTERRUPT_RATE_UART_7 (1UL << 24) #define FAULT_SIREN_MALFUNCTION (1UL << 25) #define FAULT_HEARTBEAT_LOOP_WATCHDOG (1UL << 26) // Permanent faults #define PERMANENT_FAULTS 0U uint8_t fault_status = FAULT_STATUS_NONE; uint32_t faults = 0U; void fault_occurred(uint32_t fault) { if ((faults & fault) == 0U) { if ((PERMANENT_FAULTS & fault) != 0U) { print("Permanent fault occurred: 0x"); puth(fault); print("\n"); fault_status = FAULT_STATUS_PERMANENT; } else { print("Temporary fault occurred: 0x"); puth(fault); print("\n"); fault_status = FAULT_STATUS_TEMPORARY; } } faults |= fault; } void fault_recovered(uint32_t fault) { if ((PERMANENT_FAULTS & fault) == 0U) { faults &= ~fault; } else { print("Cannot recover from a permanent fault!\n"); } }