void TriggerEmulatorHelper::handleEmulatorCallback(PwmConfig *state, int stateIndex) { int prevIndex = (stateIndex + state->phaseCount - 1) % state->phaseCount; bool primaryWheelState = state->multiWave.getChannelState(/* channelIndex*/ 0, /*phaseIndex*/prevIndex); int newPrimaryWheelState = state->multiWave.getChannelState(/* channelIndex*/ 0, /*phaseIndex*/stateIndex); bool secondaryWheelState = state->multiWave.getChannelState(/* channelIndex*/ 1, /*phaseIndex*/prevIndex); int newSecondaryWheelState = state->multiWave.getChannelState(/* channelIndex*/ 1, /*phaseIndex*/stateIndex); bool thirdWheelState = state->multiWave.getChannelState(/* channelIndex*/ 2, /*phaseIndex*/prevIndex); int new3rdWheelState = state->multiWave.getChannelState(/* channelIndex*/ 2, /*phaseIndex*/stateIndex); // todo: code duplication with TriggerStimulatorHelper::feedSimulatedEvent? if (primaryWheelState != newPrimaryWheelState) { primaryWheelState = newPrimaryWheelState; hwHandleShaftSignal(primaryWheelState ? SHAFT_PRIMARY_RISING : SHAFT_PRIMARY_FALLING); } if (secondaryWheelState != newSecondaryWheelState) { secondaryWheelState = newSecondaryWheelState; hwHandleShaftSignal(secondaryWheelState ? SHAFT_SECONDARY_RISING : SHAFT_SECONDARY_FALLING); } if (thirdWheelState != new3rdWheelState) { thirdWheelState = new3rdWheelState; hwHandleShaftSignal(thirdWheelState ? SHAFT_3RD_RISING : SHAFT_3RD_FALLING); } // print("hello %d\r\n", chTimeNow()); }
static void shaft_icu_period_callback(ICUDriver *icup) { int isPrimary = icup == primaryCrankDriver; if (!isPrimary && !engine->triggerShape.needSecondTriggerInput) { return; } // todo: add support for 3rd channel // icucnt_t last_period = icuGetPeriod(icup); so far we are fine with system time trigger_event_e signal = isPrimary ? SHAFT_PRIMARY_DOWN : SHAFT_SECONDARY_DOWN; if (isLessImportant(signal) && CONFIG(useOnlyFrontForTrigger)) return; hwHandleShaftSignal(signal); }
/** * that's hardware timer input capture IRQ entry point * 'width' events happens before the 'period' event */ static void shaft_icu_width_callback(ICUDriver *icup) { // todo: support for 3rd trigger input channel // todo: start using real event time from HW event, not just software timer? int isPrimary = icup == primaryCrankDriver; if (!isPrimary && !engine->triggerShape.needSecondTriggerInput) { return; } // icucnt_t last_width = icuGetWidth(icup); so far we are fine with system time // todo: add support for 3rd channel trigger_event_e signal = isPrimary ? SHAFT_PRIMARY_UP : SHAFT_SECONDARY_UP; if (isLessImportant(signal) && CONFIG(useOnlyFrontForTrigger)) return; hwHandleShaftSignal(signal); }
static void fireShaftSignal(trigger_event_e signal) { if (!engineConfiguration->useOnlyFrontForTrigger || isUpEvent[(int) signal]) hwHandleShaftSignal(signal); }