#include "timer.h" volatile static bool wait_sent = false; void onTimer(void *arg) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; timerStatus *params = (timerStatus *)(arg); TaskHandle_t task = params->main_task; const timerPins pins = params->pins; // increment state time params->state_time += params->clock_period_us; switch (params->state) { case S_12P: if (params->state_time == params->clock_period_us && !params->coil12p_high) { digitalWrite(pins.pin_trig_12p, HIGH); params->coil12p_high = true; wait_sent = false; } if (!params->soft_start) { if (params->state_time == params->spark_delay_us) { digitalWrite(pins.pin_spark_12, HIGH); } if (params->state_time == (params->spark_delay_us + params->spark_pulse_us)) { digitalWrite(pins.pin_spark_12, LOW); } } if (params->state_time >= params->coil_pulse_us && params->coil12p_high) { digitalWrite(pins.pin_trig_12p, LOW); params->coil12p_high = false; } if (params->state_time >= params->pause_short_us) { params->state = S_12N; params->state_time = 0; } break; case S_12N: if (params->state_time == params->clock_period_us && !params->coil12n_high) { digitalWrite(pins.pin_trig_12n, HIGH); params->coil12n_high = true; } if (params->soft_start) { if (params->state_time == params->spark_delay_us) { digitalWrite(pins.pin_spark_12, HIGH); } if (params->state_time == (params->spark_delay_us + params->spark_pulse_us)) { digitalWrite(pins.pin_spark_12, LOW); } } if (params->state_time >= params->coil_pulse_us && params->coil12n_high) { digitalWrite(pins.pin_trig_12n, LOW); params->coil12n_high = false; params->state = S_WAIT_10MS; params->state_time = 0; } break; case S_WAIT_10MS: if (!wait_sent) { wait_sent = true; } if (params->state_time >= params->pause_long_us) { params->state = S_34P; params->state_time = 0; } break; case S_34P: if (params->state_time == params->clock_period_us && !params->coil34p_high) { digitalWrite(pins.pin_trig_34p, HIGH); params->coil34p_high = true;; wait_sent = false; } if (!params->soft_start) { if (params->state_time == params->spark_delay_us) { digitalWrite(pins.pin_spark_34, HIGH); } if (params->state_time == params->spark_delay_us + params->spark_pulse_us) { digitalWrite(pins.pin_spark_34, LOW); } } if (params->state_time >= params->coil_pulse_us && params->coil34p_high) { digitalWrite(pins.pin_trig_34p, LOW); params->coil34p_high = false; } if (params->state_time >= params->pause_short_us) { params->state = S_34N; params->state_time = 0; } break; case S_34N: if (params->state_time == params->clock_period_us && !params->coil34n_high) { digitalWrite(pins.pin_trig_34n, HIGH); params->coil34n_high = true; } if (params->soft_start) { if (params->state_time == params->spark_delay_us) { digitalWrite(pins.pin_spark_34, HIGH); } if (params->state_time == params->spark_delay_us + params->spark_pulse_us) { digitalWrite(pins.pin_spark_34, LOW); } } if (params->state_time >= params->coil_pulse_us && params->coil34n_high) { digitalWrite(pins.pin_trig_34n, LOW); params->coil34n_high = false; params->state = S_WAIT_10MS_END; params->state_time = 0; } break; case S_WAIT_10MS_END: if (!wait_sent) { wait_sent = true; } if (params->state_time >= params->pause_long_us) { params->state = S_12P; params->state_time = 0; } break; } if (xHigherPriorityTaskWoken) portYIELD_FROM_ISR(); }