panda/board/power_saving.h

47 lines
1.3 KiB
C
Raw Normal View History

// WARNING: To stay in compliance with the SIL2 rules laid out in STM UM1840, we should never implement any of the available hardware low power modes.
// See rule: CoU_3
#define POWER_SAVE_STATUS_DISABLED 0
2019-05-22 08:05:14 +08:00
#define POWER_SAVE_STATUS_ENABLED 1
2019-05-22 08:05:14 +08:00
int power_save_status = POWER_SAVE_STATUS_DISABLED;
2019-06-27 09:24:21 +08:00
void set_power_save_state(int state) {
bool is_valid_state = (state == POWER_SAVE_STATUS_ENABLED) || (state == POWER_SAVE_STATUS_DISABLED);
if (is_valid_state && (state != power_save_status)) {
bool enable = false;
if (state == POWER_SAVE_STATUS_ENABLED) {
print("enable power savings\n");
2023-08-07 03:29:54 +08:00
// Disable CAN interrupts
if (harness.status == HARNESS_STATUS_FLIPPED) {
llcan_irq_disable(cans[0]);
} else {
llcan_irq_disable(cans[2]);
}
llcan_irq_disable(cans[1]);
2019-06-27 09:24:21 +08:00
} else {
print("disable power savings\n");
if (harness.status == HARNESS_STATUS_FLIPPED) {
llcan_irq_enable(cans[0]);
} else {
llcan_irq_enable(cans[2]);
}
llcan_irq_enable(cans[1]);
2019-06-27 09:24:21 +08:00
enable = true;
2019-06-27 06:52:34 +08:00
}
2020-09-28 22:19:09 +08:00
current_board->enable_can_transceivers(enable);
2019-06-27 06:52:34 +08:00
// Switch off IR when in power saving
if(!enable){
current_board->set_ir_power(0U);
}
2019-06-27 09:24:21 +08:00
power_save_status = state;
2019-06-27 06:52:34 +08:00
}
}