diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp index f3aea4b747..11bd272814 100644 --- a/firmware/controllers/algo/engine_configuration.cpp +++ b/firmware/controllers/algo/engine_configuration.cpp @@ -458,6 +458,7 @@ void setDefaultConfiguration(engine_configuration_s *engineConfiguration, board_ boardConfiguration->logicAnalyzerPins[2] = GPIO_UNASSIGNED; boardConfiguration->logicAnalyzerPins[3] = GPIO_UNASSIGNED; engineConfiguration->vehicleSpeedSensorInputPin = GPIO_UNASSIGNED; + engineConfiguration->vehicleSpeedCoef = 100; boardConfiguration->logicAnalyzerMode[0] = false; boardConfiguration->logicAnalyzerMode[1] = false; diff --git a/firmware/controllers/algo/engine_configuration.h b/firmware/controllers/algo/engine_configuration.h index 7ccf30d591..c1da74981d 100644 --- a/firmware/controllers/algo/engine_configuration.h +++ b/firmware/controllers/algo/engine_configuration.h @@ -409,7 +409,12 @@ typedef struct { brain_pin_e vehicleSpeedSensorInputPin; - int unused964; + /** + * This coefficient translates vehicle speed input frequency (in Hz) into vehicle speed + * (in km/h) + * offset 964 + */ + float vehicleSpeedCoef; // offset 968 can_nbc_e canNbcType; // offset 972 diff --git a/firmware/emulation/wave_analyzer.cpp b/firmware/emulation/wave_analyzer.cpp index 350cc6e4ce..e3aaddc8b8 100644 --- a/firmware/emulation/wave_analyzer.cpp +++ b/firmware/emulation/wave_analyzer.cpp @@ -114,10 +114,6 @@ static void setWaveModeSilent(int index, int mode) { static void initWave(const char *name, int index) { brain_pin_e brainPin = boardConfiguration->logicAnalyzerPins[index]; - ioportid_t port = getHwPort(brainPin); - ioportmask_t pin = getHwPin(brainPin); - ICUDriver *driver = getInputCaptureDriver(brainPin); - bool mode = boardConfiguration->logicAnalyzerMode[index]; waveReaderCount++; @@ -131,7 +127,7 @@ static void initWave(const char *name, int index) { registerCallback(&hw->periodListeners, (IntListener) waIcuPeriodCallback, (void*) reader); - initWaveAnalyzerDriver(hw, driver, port, pin); + initWaveAnalyzerDriver(hw, brainPin); print("wave%d input on %s%d\r\n", index, portname(reader->hw.port), reader->hw.pin); setWaveReaderMode(hw, mode); diff --git a/firmware/hw_layer/trigger_input.cpp b/firmware/hw_layer/trigger_input.cpp index 52ae2506fa..7fab8a1f90 100644 --- a/firmware/hw_layer/trigger_input.cpp +++ b/firmware/hw_layer/trigger_input.cpp @@ -25,14 +25,6 @@ extern engine_configuration_s *engineConfiguration; extern engine_configuration2_s *engineConfiguration2; extern board_configuration_s *boardConfiguration; -static inline ICUDriver *getPrimaryInputCaptureDriver(void) { - return getInputCaptureDriver(boardConfiguration->triggerInputPins[0]); -} - -static inline ICUDriver *getSecondaryInputCaptureDriver(void) { - return getInputCaptureDriver(boardConfiguration->triggerInputPins[1]); -} - /** * that's hardware timer input capture IRQ entry point * 'width' events happens before the 'period' event @@ -40,7 +32,7 @@ static inline ICUDriver *getSecondaryInputCaptureDriver(void) { 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 == getPrimaryInputCaptureDriver(); + int isPrimary = icup == primaryCrankInput.driver; if (!isPrimary && !engineConfiguration->needSecondTriggerInput) { return; } @@ -52,7 +44,7 @@ static void shaft_icu_width_callback(ICUDriver *icup) { } static void shaft_icu_period_callback(ICUDriver *icup) { - int isPrimary = icup == getPrimaryInputCaptureDriver(); + int isPrimary = icup == primaryCrankInput.driver; if (!isPrimary && !engineConfiguration->needSecondTriggerInput) { return; } @@ -77,14 +69,14 @@ void initShaftPositionInputCapture(void) { // todo: extract method! // initialize primary Input Capture Unit pin - initWaveAnalyzerDriver(&primaryCrankInput, driver, getHwPort(boardConfiguration->triggerInputPins[0]), - getHwPin(boardConfiguration->triggerInputPins[0])); + initWaveAnalyzerDriver(&primaryCrankInput, boardConfiguration->triggerInputPins[0]); /** * Start primary Input Capture Unit using given configuration * @see shaft_icucfg for callback entry points */ shaft_icucfg.channel = ICU_CHANNEL_1; print("initShaftPositionInputCapture 1 %s\r\n", hwPortname(boardConfiguration->triggerInputPins[0])); + // todo: reuse 'setWaveReaderMode' method here? if (driver != NULL) { icuStart(driver, &shaft_icucfg); icuEnable(driver); @@ -92,8 +84,7 @@ void initShaftPositionInputCapture(void) { driver = getInputCaptureDriver(boardConfiguration->triggerInputPins[1]); // initialize secondary Input Capture Unit pin - initWaveAnalyzerDriver(&secondaryCrankInput, getSecondaryInputCaptureDriver(), - getHwPort(boardConfiguration->triggerInputPins[1]), getHwPin(boardConfiguration->triggerInputPins[1])); + initWaveAnalyzerDriver(&secondaryCrankInput, boardConfiguration->triggerInputPins[1]); shaft_icucfg.channel = ICU_CHANNEL_1; print("initShaftPositionInputCapture 2 %s\r\n", hwPortname(boardConfiguration->triggerInputPins[1])); if (driver != NULL) { diff --git a/firmware/hw_layer/wave_analyzer_hw.c b/firmware/hw_layer/wave_analyzer_hw.c index 6654ec0d2e..9e5dcbdd54 100644 --- a/firmware/hw_layer/wave_analyzer_hw.c +++ b/firmware/hw_layer/wave_analyzer_hw.c @@ -139,7 +139,12 @@ ICUDriver * getInputCaptureDriver(brain_pin_e hwPin) { return (ICUDriver *) NULL; } -void initWaveAnalyzerDriver(WaveReaderHw *hw, ICUDriver *driver, ioportid_t port, ioportmask_t pin) { +void initWaveAnalyzerDriver(WaveReaderHw *hw, brain_pin_e brainPin) { + ioportid_t port = getHwPort(brainPin); + ioportmask_t pin = getHwPin(brainPin); + + ICUDriver *driver = getInputCaptureDriver(brainPin); + hw->driver = driver; hw->port = port; hw->pin = pin; @@ -170,7 +175,7 @@ void setWaveReaderMode(WaveReaderHw *hw, bool mode) { icuStart(driver, &wave_icucfg); icuEnable(driver); } - hw->started = TRUE; + hw->started = true; } #endif diff --git a/firmware/hw_layer/wave_analyzer_hw.h b/firmware/hw_layer/wave_analyzer_hw.h index 7614ecb740..c8b3d5aaf1 100644 --- a/firmware/hw_layer/wave_analyzer_hw.h +++ b/firmware/hw_layer/wave_analyzer_hw.h @@ -21,6 +21,8 @@ typedef struct { int activeMode; // 0 for ICU_INPUT_ACTIVE_LOW, 1 for ICU_INPUT_ACTIVE_HIGH volatile int started; + // todo: make this a template & reduce number of listeners? + // todo: would one listener be enough? IntListenerArray widthListeners; IntListenerArray periodListeners; } WaveReaderHw; @@ -30,8 +32,7 @@ extern "C" { #endif /* __cplusplus */ -void initWaveAnalyzerDriver(WaveReaderHw *hw, ICUDriver *driver, - ioportid_t port, ioportmask_t pin); +void initWaveAnalyzerDriver(WaveReaderHw *hw, brain_pin_e brainPin); void setWaveReaderMode(WaveReaderHw *hw, bool mode); ICUDriver * getInputCaptureDriver(brain_pin_e hwPin);