// Copyright (C) 2026 Hector van der Aa // Copyright (C) 2026 Pierre Barbier // Copyright (C) 2026 Association Exergie // SPDX-License-Identifier: GPL-3.0-or-later #include "cmsis_os2.h" #include "macros.h" #include "main.h" #include "ring_buffer.h" #include "tasks.h" void crankHandler(void *argument) { for (;;) { osThreadFlagsWait(0x01, osFlagsWaitAny, osWaitForever); DEBUG_LOG("Crank pulse detected at: %lu\n\r", ringBufferRead(&state_g.crank_RB, 0)); // FILTER // INCREMENT SWITCH switch (state_g.crank_state) { case CYCLE_COMPRESSION: { if (state_g.cam_state != CAM_TRIGD) { DEBUG_LOG("Cam miss detected, sync dynamite incoming\n\r"); state_g.cam_miss_ctr++; if (state_g.cam_miss_ctr > MAX_CAM_MISS) { state_g.sync_state = SYNC_NOT_OK; state_g.crank_state = CYCLE_UNKNOWN; break; } } state_g.crank_state = CYCLE_COMBUSTION; DEBUG_LOG("Crank state incremented\n\r"); state_g.cam_state = CAM_IDLE; break; } case CYCLE_COMBUSTION: case CYCLE_EXHAUST: case CYCLE_INTAKE: { if (state_g.cam_state == CAM_TRIGD) { state_g.sync_state = SYNC_NOT_OK; state_g.crank_state = CYCLE_UNKNOWN; state_g.cam_state = CAM_IDLE; break; } state_g.crank_state++; DEBUG_LOG("Crank state incremented\n\r"); break; } case CYCLE_UNKNOWN: { if (state_g.sync_state == SYNC_PENDING && state_g.cam_state == CAM_TRIGD) { state_g.crank_state = CYCLE_COMBUSTION; state_g.cam_state = CAM_IDLE; } break; } } // SPARK SCHEDULE if (state_g.crank_state == CYCLE_COMPRESSION && state_g.sync_state == SYNC_OK) { DEBUG_LOG("Spark schedule reached, congrats\n\r"); // TODO: schedule spark } } }