diff --git a/firmware/hw_layer/trigger_input.cpp b/firmware/hw_layer/trigger_input.cpp index ec10a36a03..3bf42ff9e2 100644 --- a/firmware/hw_layer/trigger_input.cpp +++ b/firmware/hw_layer/trigger_input.cpp @@ -30,13 +30,13 @@ void startTriggerInputPins(void) { for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) { if (isConfigurationChanged(bc.triggerInputPins[i])) { const char * msg = (i == 0 ? "trigger#1" : (i == 1 ? "trigger#2" : "trigger#3")); - turnOnTriggerInputPin(msg, CONFIGB(triggerInputPins)[i], true); + turnOnTriggerInputPin(msg, i, true); } } for (int i = 0; i < CAM_INPUTS_COUNT; i++) { if (isConfigurationChanged(camInputs[i])) { - turnOnTriggerInputPin("cam", engineConfiguration->camInputs[i], false); + turnOnTriggerInputPin("cam", i, false); } } diff --git a/firmware/hw_layer/trigger_input.h b/firmware/hw_layer/trigger_input.h index cf7c44422c..c6094f61c7 100644 --- a/firmware/hw_layer/trigger_input.h +++ b/firmware/hw_layer/trigger_input.h @@ -22,6 +22,6 @@ void startTriggerInputPins(void); void stopTriggerInputPins(void); void setPrimaryChannel(brain_pin_e brainPin); void turnOffTriggerInputPin(brain_pin_e brainPin); -int turnOnTriggerInputPin(const char *msg, brain_pin_e brainPin, bool isVvtShaft); +void turnOnTriggerInputPin(const char *msg, int index, bool isTriggerShaft); #endif /* CRANK_INPUT_H_ */ diff --git a/firmware/hw_layer/trigger_input_icu.cpp b/firmware/hw_layer/trigger_input_icu.cpp index bfdf516bd5..7d4e216383 100644 --- a/firmware/hw_layer/trigger_input_icu.cpp +++ b/firmware/hw_layer/trigger_input_icu.cpp @@ -28,15 +28,13 @@ extern bool hasFirmwareErrorFlag; static Logging *logger; -static ICUDriver *primaryCrankDriver; - -static void cam_icu_width_callback(ICUDriver *icup) { - (void)icup; +static void vvtWidthCallback(void *arg) { + (void)arg; hwHandleVvtCamSignal(TV_RISE); } -static void cam_icu_period_callback(ICUDriver *icup) { - (void)icup; +static void vvtPeriodCallback(void *arg) { + (void)arg; hwHandleVvtCamSignal(TV_FALL); } @@ -44,7 +42,7 @@ static void cam_icu_period_callback(ICUDriver *icup) { * that's hardware timer input capture IRQ entry point * 'width' events happens before the 'period' event */ -static void shaft_icu_width_callback(ICUDriver *icup) { +static void shaftWidthCallback(bool isPrimary) { if (!engine->hwTriggerInputEnabled) { return; } @@ -53,7 +51,6 @@ static void shaft_icu_width_callback(ICUDriver *icup) { // todo: start using real event time from HW event, not just software timer? if (hasFirmwareErrorFlag) return; - int isPrimary = icup == primaryCrankDriver; if (!isPrimary && !TRIGGER_SHAPE(needSecondTriggerInput)) { return; } @@ -64,14 +61,13 @@ static void shaft_icu_width_callback(ICUDriver *icup) { hwHandleShaftSignal(signal); } -static void shaft_icu_period_callback(ICUDriver *icup) { +static void shaftPeriodCallback(bool isPrimary) { if (!engine->hwTriggerInputEnabled) { return; } icuWidthPeriodCounter++; if (hasFirmwareErrorFlag) return; - int isPrimary = icup == primaryCrankDriver; if (!isPrimary && !TRIGGER_SHAPE(needSecondTriggerInput)) { return; } @@ -83,83 +79,31 @@ static void shaft_icu_period_callback(ICUDriver *icup) { hwHandleShaftSignal(signal); } -/** - * the main purpose of this configuration structure is to specify the input interrupt callbacks - */ -static ICUConfig shaft_icucfg = { ICU_INPUT_ACTIVE_LOW, - 100000, /* 100kHz ICU clock frequency. */ - shaft_icu_width_callback, - shaft_icu_period_callback, - NULL, - ICU_CHANNEL_1, - 0}; - -/** - * this is about VTTi and stuff kind of cam sensor - */ -static ICUConfig cam_icucfg = { ICU_INPUT_ACTIVE_LOW, - 100000, /* 100kHz ICU clock frequency. */ - cam_icu_width_callback, - cam_icu_period_callback, - NULL, - ICU_CHANNEL_1, - 0}; - -int turnOnTriggerInputPin(const char *msg, brain_pin_e brainPin, bool isVvtShaft) { - ICUConfig *icucfg; +void turnOnTriggerInputPin(const char *msg, int index, bool isTriggerShaft) { + brain_pin_e brainPin = isTriggerShaft ? CONFIGB(triggerInputPins)[index] : engineConfiguration->camInputs[index]; if (brainPin == GPIO_UNASSIGNED) { - return -1; + return; } - if (isVvtShaft) { - icucfg = &shaft_icucfg; + digital_input_s* input = startDigitalCapture("trigger", brainPin, true); + if (isTriggerShaft) { + void * arg = (void*) (index == 0); + input->setWidthCallback((VoidInt)(void*)shaftWidthCallback, arg); + input->setPeriodCallback((VoidInt)(void*)shaftPeriodCallback, arg); } else { - icucfg = &cam_icucfg; + input->setWidthCallback((VoidInt)(void*)vvtWidthCallback, NULL); + input->setPeriodCallback((VoidInt)(void*)vvtPeriodCallback, NULL); } - - // configure pin - turnOnCapturePin(msg, brainPin); - icucfg->channel = getInputCaptureChannel(brainPin); - - ICUDriver *driver = getInputCaptureDriver(msg, brainPin); - scheduleMsg(logger, "turnOnTriggerInputPin %s", hwPortname(brainPin)); - // todo: reuse 'setWaveReaderMode' method here? - if (driver != NULL) { - // todo: once http://forum.chibios.org/phpbb/viewtopic.php?f=16&t=1757 is fixed -// bool needWidthCallback = !CONFIG(useOnlyRisingEdgeForTrigger) || TRIGGER_SHAPE(useRiseEdge); -// shaft_icucfg.width_cb = needWidthCallback ? shaft_icu_width_callback : NULL; - -// bool needPeriodCallback = !CONFIG(useOnlyRisingEdgeForTrigger) || !TRIGGER_SHAPE(useRiseEdge); -// shaft_icucfg.period_cb = needPeriodCallback ? shaft_icu_period_callback : NULL; - - efiIcuStart(msg, driver, icucfg); - if (driver->state == ICU_READY) { - efiAssert(CUSTOM_ERR_ASSERT, driver != NULL, "ti: driver is NULL", -1); - efiAssert(CUSTOM_ERR_ASSERT, driver->state == ICU_READY, "ti: driver not ready", -1); - icuStartCapture(driver); // this would change state from READY to WAITING - icuEnableNotifications(driver); - } else { - // we would be here for example if same pin is used for multiple input capture purposes - firmwareError(CUSTOM_ERR_ICU_STATE, "ICU unexpected state [%s]", hwPortname(brainPin)); - } - } - return 0; } void turnOffTriggerInputPin(brain_pin_e brainPin) { - ICUDriver *driver = getInputCaptureDriver("trigger_off", brainPin); - if (driver != NULL) { - icuDisableNotifications(driver); - icuStopCapture(driver); - icuStop(driver); - scheduleMsg(logger, "turnOffTriggerInputPin %s", hwPortname(brainPin)); - turnOffCapturePin(brainPin); - } + + stopDigitalCapture("trigger", brainPin); } void setPrimaryChannel(brain_pin_e brainPin) { - primaryCrankDriver = getInputCaptureDriver("primary", brainPin); + } /*==========================================================================*/