IQ.Pilot Release Commit @ 661a2de

This commit is contained in:
IQ.Lvbs CI [bot]
2026-08-08 14:37:51 -05:00
parent a6c27ac169
commit a1ef7d6c80
211 changed files with 7332 additions and 2756 deletions

View File

@@ -117,6 +117,22 @@ static void __attribute__ ((noinline)) enable_fpu(void) {
#define HEARTBEAT_IGNITION_CNT_OFF 2U
// called at 8Hz
static volatile bool tick_sample_pending = false;
// All runtime ADC sampling runs here, in thread context. ADC conversions
// busy-wait for tens to hundreds of microseconds, and all interrupts share one
// NVIC priority: sampling in the 8Hz tick interrupt delayed the SPI slave's
// RX DMA re-arm long enough for the host to clock into an unarmed peripheral
// (checksum failures -> NACK retry storms -> multi-second CAN blackouts).
static void tick_sample_poll(void) {
if (tick_sample_pending) {
tick_sample_pending = false;
harness_tick();
voltage_mV = current_board->read_voltage_mV();
current_mA = current_board->read_current_mA();
}
}
static void tick_handler(void) {
static uint32_t siren_countdown = 0; // siren plays while countdown > 0
static uint32_t controls_allowed_countdown = 0;
@@ -131,7 +147,7 @@ static void tick_handler(void) {
// tick drivers at 8Hz
fan_tick();
harness_tick();
tick_sample_pending = true; // ADC sampling deferred to thread context (see tick_sample_poll)
simple_watchdog_kick();
sound_tick();
@@ -176,7 +192,11 @@ static void tick_handler(void) {
const bool recent_heartbeat = heartbeat_counter == 0U;
// tick drivers at 1Hz
bool started = harness_check_ignition() || ignition_can;
// MEB/MQBevo have no harness ignition line; the SBU pin can sit asserted on a
// sleeping car (held true for days on an ID.4, pinning the device onroad against
// a silent bus). CAN ignition (0x3C0 Klemmen_Status_01) is the only valid source
// on this branch.
bool started = ignition_can;
bootkick_tick(started, recent_heartbeat);
// increase heartbeat counter and cap it at the uint32 limit
@@ -304,6 +324,10 @@ int main(void) {
current_board->set_can_mode(CAN_MODE_NORMAL);
harness_init();
// seed the ADC caches before interrupts are live
voltage_mV = current_board->read_voltage_mV();
current_mA = current_board->read_current_mA();
// panda has an FPU, let's use it!
enable_fpu();
@@ -347,6 +371,7 @@ int main(void) {
// LED should keep on blinking all the time
while (true) {
tick_sample_poll();
if (power_save_status == POWER_SAVE_STATUS_DISABLED) {
#ifdef DEBUG_FAULTS
if (fault_status == FAULT_STATUS_NONE) {
@@ -357,6 +382,7 @@ int main(void) {
delay(fade >> 4);
led_set(LED_RED, false);
delay((MAX_LED_FADE - fade) >> 4);
tick_sample_poll();
}
for (uint32_t fade = MAX_LED_FADE; fade > 0U; fade -= 1U) {
@@ -364,6 +390,7 @@ int main(void) {
delay(fade >> 4);
led_set(LED_RED, false);
delay((MAX_LED_FADE - fade) >> 4);
tick_sample_poll();
}
#ifdef DEBUG_FAULTS