Files
AstroRotaxMonitor/RotaxMonitorTester/src/timer.cpp
2026-04-10 12:12:28 +02:00

172 lines
4.6 KiB
C++

#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();
}