diff --git a/firmware/controllers/trigger/decoders/trigger_structure.cpp b/firmware/controllers/trigger/decoders/trigger_structure.cpp index 5d9ea2610d..6ee1be2ba2 100644 --- a/firmware/controllers/trigger/decoders/trigger_structure.cpp +++ b/firmware/controllers/trigger/decoders/trigger_structure.cpp @@ -163,7 +163,11 @@ angle_t TriggerWaveform::getAngle(int index) const { return cycleStartAngle + positionWithinCycle; } -void TriggerWaveform::addEventClamped(angle_t angle, TriggerValue const stateParam, TriggerWheel const channelIndex, float filterLeft, float filterRight) { +void TriggerWaveform::addEventClamped(angle_t angle, TriggerValue const state, TriggerWheel const channelIndex, float filterLeft, float filterRight) { + addEventClamped(angle, state == TriggerValue::RISE, channelIndex, filterLeft, filterRight); +} + +void TriggerWaveform::addEventClamped(angle_t angle, bool stateParam, TriggerWheel const channelIndex, float filterLeft, float filterRight) { if (angle > filterLeft && angle < filterRight) { addEvent(angle / getEngineCycle(operationMode), stateParam, channelIndex); } @@ -232,6 +236,10 @@ void TriggerWaveform::addEvent360(angle_t angle, bool state, TriggerWheel const } void TriggerWaveform::addEventAngle(angle_t angle, TriggerValue const state, TriggerWheel const channelIndex) { + addEventAngle(angle, state == TriggerValue::RISE, channelIndex); +} + +void TriggerWaveform::addEventAngle(angle_t angle, bool state, TriggerWheel const channelIndex) { addEvent(angle / getCycleDuration(), state, channelIndex); } diff --git a/firmware/controllers/trigger/decoders/trigger_structure.h b/firmware/controllers/trigger/decoders/trigger_structure.h index 0b21338abf..03508dae4d 100644 --- a/firmware/controllers/trigger/decoders/trigger_structure.h +++ b/firmware/controllers/trigger/decoders/trigger_structure.h @@ -206,11 +206,13 @@ public: * @param angle (0..360] or (0..720] depending on configuration */ void addEventAngle(angle_t angle, TriggerValue const state, TriggerWheel const channelIndex = TriggerWheel::T_PRIMARY); + void addEventAngle(angle_t angle, bool state, TriggerWheel const channelIndex = TriggerWheel::T_PRIMARY); /* (0..720] angle range * Deprecated? */ void addEventClamped(angle_t angle, TriggerValue const state, TriggerWheel const channelIndex, float filterLeft, float filterRight); + void addEventClamped(angle_t angle, bool state, TriggerWheel const channelIndex, float filterLeft, float filterRight); operation_mode_e getWheelOperationMode() const; void initialize(operation_mode_e operationMode, SyncEdge syncEdge); diff --git a/firmware/controllers/trigger/decoders/trigger_universal.cpp b/firmware/controllers/trigger/decoders/trigger_universal.cpp index fc5e43840f..d074c3046c 100644 --- a/firmware/controllers/trigger/decoders/trigger_universal.cpp +++ b/firmware/controllers/trigger/decoders/trigger_universal.cpp @@ -24,14 +24,14 @@ void addSkippedToothTriggerEvents(TriggerWheel wheel, TriggerWaveform *s, int to for (int i = 0; i < totalTeethCount - skippedCount - 1; i++) { float angleDown = engineCycle / totalTeethCount * (i + (1 - toothWidth)); float angleUp = engineCycle / totalTeethCount * (i + 1); - s->addEventClamped(offset + angleDown, TriggerValue::RISE, wheel, filterLeft, filterRight); - s->addEventClamped(offset + angleUp, TriggerValue::FALL, wheel, filterLeft, filterRight); + s->addEventClamped(offset + angleDown, true, wheel, filterLeft, filterRight); + s->addEventClamped(offset + angleUp, false, wheel, filterLeft, filterRight); } float angleDown = engineCycle / totalTeethCount * (totalTeethCount - skippedCount - 1 + (1 - toothWidth)); - s->addEventClamped(offset + angleDown, TriggerValue::RISE, wheel, filterLeft, filterRight); + s->addEventClamped(offset + angleDown, true, wheel, filterLeft, filterRight); // custom handling of last event in order to avoid rounding error - s->addEventClamped(offset + engineCycle, TriggerValue::FALL, wheel, filterLeft, filterRight); + s->addEventClamped(offset + engineCycle, false, wheel, filterLeft, filterRight); } void initializeSkippedToothTrigger(TriggerWaveform *s, int totalTeethCount, int skippedCount, @@ -65,11 +65,11 @@ void initializeSkippedToothTrigger(TriggerWaveform *s, int totalTeethCount, int void configureOnePlusOne(TriggerWaveform *s) { s->initialize(FOUR_STROKE_CAM_SENSOR, SyncEdge::Rise); - s->addEvent360( 90, TriggerValue::RISE, TriggerWheel::T_PRIMARY); - s->addEvent360(180, TriggerValue::FALL, TriggerWheel::T_PRIMARY); + s->addEvent360( 90, true, TriggerWheel::T_PRIMARY); + s->addEvent360(180, false, TriggerWheel::T_PRIMARY); - s->addEvent360(270, TriggerValue::RISE, TriggerWheel::T_SECONDARY); - s->addEvent360(360, TriggerValue::FALL, TriggerWheel::T_SECONDARY); + s->addEvent360(270, true, TriggerWheel::T_SECONDARY); + s->addEvent360(360, false, TriggerWheel::T_SECONDARY); s->isSynchronizationNeeded = false; s->useOnlyPrimaryForSync = true; @@ -84,29 +84,29 @@ void configure3_1_cam(TriggerWaveform *s) { TriggerWheel crank = TriggerWheel::T_SECONDARY; - s->addEvent720(10, TriggerValue::RISE, TriggerWheel::T_PRIMARY); - s->addEvent720(50, TriggerValue::FALL, TriggerWheel::T_PRIMARY); + s->addEvent720(10, true, TriggerWheel::T_PRIMARY); + s->addEvent720(50, false, TriggerWheel::T_PRIMARY); float a = 2 * crankW; // #1/3 - s->addEvent720(a += crankW, TriggerValue::RISE, crank); - s->addEvent720(a += crankW, TriggerValue::FALL, crank); + s->addEvent720(a += crankW, true, crank); + s->addEvent720(a += crankW, false, crank); // #2/3 - s->addEvent720(a += crankW, TriggerValue::RISE, crank); - s->addEvent720(a += crankW, TriggerValue::FALL, crank); + s->addEvent720(a += crankW, true, crank); + s->addEvent720(a += crankW, false, crank); // #3/3 a += crankW; a += crankW; // 2nd #1/3 - s->addEvent720(a += crankW, TriggerValue::RISE, crank); - s->addEvent720(a += crankW, TriggerValue::FALL, crank); + s->addEvent720(a += crankW, true, crank); + s->addEvent720(a += crankW, false, crank); // 2nd #2/3 - s->addEvent720(a += crankW, TriggerValue::RISE, crank); - s->addEvent720(a += crankW, TriggerValue::FALL, crank); + s->addEvent720(a += crankW, true, crank); + s->addEvent720(a += crankW, false, crank); s->isSynchronizationNeeded = false; } @@ -125,8 +125,8 @@ void configureKawaKX450F(TriggerWaveform *s) { addSkippedToothTriggerEvents(TriggerWheel::T_PRIMARY, s, 18, 0, toothWidth, 0, engineCycle, NO_LEFT_FILTER, 720 - 39); - s->addEvent(0.97, TriggerValue::RISE, TriggerWheel::T_PRIMARY); - s->addEvent(1, TriggerValue::FALL, TriggerWheel::T_PRIMARY); + s->addEvent(0.97, true, TriggerWheel::T_PRIMARY); + s->addEvent(1, false, TriggerWheel::T_PRIMARY); } void configureQuickStartSenderWheel(TriggerWaveform *s) { @@ -138,17 +138,17 @@ void configureQuickStartSenderWheel(TriggerWaveform *s) { s->setTriggerSynchronizationGap(0.645); s->setSecondTriggerSynchronizationGap(1.556); - s->addEvent360(offset + 0, TriggerValue::RISE, TriggerWheel::T_PRIMARY); - s->addEvent360(offset + 70, TriggerValue::FALL, TriggerWheel::T_PRIMARY); + s->addEvent360(offset + 0, true, TriggerWheel::T_PRIMARY); + s->addEvent360(offset + 70, false, TriggerWheel::T_PRIMARY); - s->addEvent360(offset + 90, TriggerValue::RISE, TriggerWheel::T_PRIMARY); - s->addEvent360(offset + 110, TriggerValue::FALL, TriggerWheel::T_PRIMARY); + s->addEvent360(offset + 90, true, TriggerWheel::T_PRIMARY); + s->addEvent360(offset + 110, false, TriggerWheel::T_PRIMARY); - s->addEvent360(offset + 180, TriggerValue::RISE, TriggerWheel::T_PRIMARY); - s->addEvent360(offset + 200, TriggerValue::FALL, TriggerWheel::T_PRIMARY); + s->addEvent360(offset + 180, true, TriggerWheel::T_PRIMARY); + s->addEvent360(offset + 200, false, TriggerWheel::T_PRIMARY); - s->addEvent360(offset + 270, TriggerValue::RISE, TriggerWheel::T_PRIMARY); - s->addEvent360(offset + 340, TriggerValue::FALL, TriggerWheel::T_PRIMARY); + s->addEvent360(offset + 270, true, TriggerWheel::T_PRIMARY); + s->addEvent360(offset + 340, false, TriggerWheel::T_PRIMARY); } // Useful for: @@ -173,6 +173,6 @@ void configure12ToothCrank(TriggerWaveform* s) { float width = 360 / 12; // Just a single tooth with 50% duty cycle - s->addEventAngle(width / 2, TriggerValue::FALL, TriggerWheel::T_PRIMARY); - s->addEventAngle(width, TriggerValue::RISE, TriggerWheel::T_PRIMARY); + s->addEventAngle(width / 2, false, TriggerWheel::T_PRIMARY); + s->addEventAngle(width, true, TriggerWheel::T_PRIMARY); } diff --git a/unit_tests/tests/ignition_injection/test_fuel_map.cpp b/unit_tests/tests/ignition_injection/test_fuel_map.cpp index de0c638e2d..7b7d94a4a6 100644 --- a/unit_tests/tests/ignition_injection/test_fuel_map.cpp +++ b/unit_tests/tests/ignition_injection/test_fuel_map.cpp @@ -87,17 +87,17 @@ TEST(misc, testFuelMap) { static void configureFordAspireTriggerWaveform(TriggerWaveform * s) { s->initialize(FOUR_STROKE_CAM_SENSOR, SyncEdge::Rise); - s->addEvent720(53.747, TriggerValue::RISE, TriggerWheel::T_SECONDARY); - s->addEvent720(121.90, TriggerValue::FALL, TriggerWheel::T_SECONDARY); - s->addEvent720(232.76, TriggerValue::RISE, TriggerWheel::T_SECONDARY); - s->addEvent720(300.54, TriggerValue::FALL, TriggerWheel::T_SECONDARY); - s->addEvent720(360, TriggerValue::RISE, TriggerWheel::T_PRIMARY); + s->addEvent720(53.747, true, TriggerWheel::T_SECONDARY); + s->addEvent720(121.90, false, TriggerWheel::T_SECONDARY); + s->addEvent720(232.76, true, TriggerWheel::T_SECONDARY); + s->addEvent720(300.54, false, TriggerWheel::T_SECONDARY); + s->addEvent720(360, true, TriggerWheel::T_PRIMARY); - s->addEvent720(409.8412, TriggerValue::RISE, TriggerWheel::T_SECONDARY); - s->addEvent720(478.6505, TriggerValue::FALL, TriggerWheel::T_SECONDARY); - s->addEvent720(588.045, TriggerValue::RISE, TriggerWheel::T_SECONDARY); - s->addEvent720(657.03, TriggerValue::FALL, TriggerWheel::T_SECONDARY); - s->addEvent720(720, TriggerValue::FALL, TriggerWheel::T_PRIMARY); + s->addEvent720(409.8412, true, TriggerWheel::T_SECONDARY); + s->addEvent720(478.6505, false, TriggerWheel::T_SECONDARY); + s->addEvent720(588.045, true, TriggerWheel::T_SECONDARY); + s->addEvent720(657.03, false, TriggerWheel::T_SECONDARY); + s->addEvent720(720, false, TriggerWheel::T_PRIMARY); ASSERT_FLOAT_EQ(53.747 / 720, s->wave.getSwitchTime(0)); ASSERT_EQ(true, s->wave.getChannelState(1, 0)) << "@0";