From a2ce84475fd0dd2f285d9e515808683c2835f4e9 Mon Sep 17 00:00:00 2001 From: rusEfi Date: Tue, 7 Apr 2015 20:10:24 -0500 Subject: [PATCH] auto-sync --- firmware/controllers/core/fl_stack.h | 13 ++++++- firmware/development/wave_analyzer.cpp | 24 +++++++------ firmware/development/wave_analyzer.h | 3 +- firmware/hw_layer/hardware.cpp | 16 +++++++-- firmware/hw_layer/trigger_input.cpp | 48 ++++++++++---------------- firmware/hw_layer/trigger_input.h | 12 ++----- firmware/hw_layer/vehicle_speed.cpp | 8 ++--- firmware/hw_layer/wave_analyzer_hw.cpp | 30 ++++++++-------- firmware/hw_layer/wave_analyzer_hw.h | 7 ++-- 9 files changed, 84 insertions(+), 77 deletions(-) diff --git a/firmware/controllers/core/fl_stack.h b/firmware/controllers/core/fl_stack.h index 5ebc436a87..cf6555704d 100644 --- a/firmware/controllers/core/fl_stack.h +++ b/firmware/controllers/core/fl_stack.h @@ -21,7 +21,8 @@ public: T pop(); T get(int index); bool_t remove(T value); - int size();bool isEmpty(); + int size(); + bool isEmpty(); private: int currentSize; T values[MAXSIZE]; @@ -30,6 +31,7 @@ private: template FLStack::FLStack() { reset(); + memset(values, 0, sizeof(values)); } template @@ -94,6 +96,7 @@ public: Type elements[Dimention]; void reset(void); Type *add(void); + void removeAt(int index); }; template @@ -102,6 +105,14 @@ ArrayList::ArrayList(void) { reset(); } +template +void ArrayList::removeAt(int index) { + efiAssertVoid(index < size, "index greater then size"); + memcpy(&elements[index], &elements[size - 1], sizeof(Type)); + memset(&elements[size - 1], 0, sizeof(Type)); + size--; +} + template void ArrayList::reset(void) { size = 0; diff --git a/firmware/development/wave_analyzer.cpp b/firmware/development/wave_analyzer.cpp index 1f546642f5..024d1a9b79 100644 --- a/firmware/development/wave_analyzer.cpp +++ b/firmware/development/wave_analyzer.cpp @@ -50,7 +50,7 @@ static THD_WORKING_AREA(waThreadStack, UTILITY_THREAD_STACK_SIZE); static Logging * logger; static void ensureInitialized(WaveReader *reader) { - efiAssertVoid(reader->hw.started, "wave analyzer NOT INITIALIZED"); + efiAssertVoid(reader->hw->started, "wave analyzer NOT INITIALIZED"); } #if EFI_WAVE_ANALYZER || defined(__DOXYGEN__) @@ -104,7 +104,7 @@ static void waIcuPeriodCallback(WaveReader *reader) { static void setWaveModeSilent(int index, int mode) { WaveReader *reader = &readers[index]; - startInputDriver(&reader->hw, mode); + startInputDriver(reader->hw, mode); } //static int getEventCounter(int index) { @@ -121,21 +121,25 @@ static void initWave(const char *name, int index) { waveReaderCount++; efiAssertVoid(index < MAX_ICU_COUNT, "too many ICUs"); WaveReader *reader = &readers[index]; - WaveReaderHw *hw = &reader->hw; - reader->name = name; - hw->widthListeners.registerCallback((VoidInt) waAnaWidthCallback, (void*) reader); + reader->hw = initWaveAnalyzerDriver(brainPin); - hw->periodListeners.registerCallback((VoidInt) waIcuPeriodCallback, (void*) reader); - initWaveAnalyzerDriver(hw, brainPin); + reader->hw->widthListeners.registerCallback((VoidInt) waAnaWidthCallback, (void*) reader); - print("wave%d input on %s%d\r\n", index, portname(reader->hw.port), reader->hw.pin); - startInputDriver(hw, mode); + reader->hw->periodListeners.registerCallback((VoidInt) waIcuPeriodCallback, (void*) reader); + + + print("wave%d input on %s\r\n", index, hwPortname(brainPin)); + startInputDriver(reader->hw, mode); } #endif +WaveReader::WaveReader() { + hw = NULL; +} + static void waTriggerEventListener(trigger_event_e ckpSignalType, uint32_t index DECLARE_ENGINE_PARAMETER_S) { (void)ckpSignalType; if (index != 0) { @@ -195,7 +199,7 @@ static float getSignalPeriodMs(int index) { //} static void reportWave(Logging *logging, int index) { - if (readers[index].hw.started) { + if (readers[index].hw->started) { // int counter = getEventCounter(index); // debugInt2(logging, "ev", index, counter); diff --git a/firmware/development/wave_analyzer.h b/firmware/development/wave_analyzer.h index f987b1f663..514d6ac279 100644 --- a/firmware/development/wave_analyzer.h +++ b/firmware/development/wave_analyzer.h @@ -25,9 +25,10 @@ class WaveReader { public: + WaveReader(); void onFallEvent(); - WaveReaderHw hw; + WaveReaderHw *hw; const char *name; volatile int eventCounter; diff --git a/firmware/hw_layer/hardware.cpp b/firmware/hw_layer/hardware.cpp index b322bafc4f..248372ca70 100644 --- a/firmware/hw_layer/hardware.cpp +++ b/firmware/hw_layer/hardware.cpp @@ -177,6 +177,18 @@ static void adcConfigListener(Engine *engine) { calcFastAdcIndexes(); } +void turnOnHardware(void) { +#if EFI_SHAFT_POSITION_INPUT || defined(__DOXYGEN__) + turnOnTriggerInputPins(); +#endif /* EFI_SHAFT_POSITION_INPUT */ +} + +void turnOffHardware(void) { +#if EFI_SHAFT_POSITION_INPUT || defined(__DOXYGEN__) + turnOffTriggerInputPins(); +#endif /* EFI_SHAFT_POSITION_INPUT */ +} + void initHardware(Logging *l, Engine *engine) { sharedLogger = l; engine_configuration_s *engineConfiguration = engine->engineConfiguration; @@ -277,10 +289,10 @@ void initHardware(Logging *l, Engine *engine) { #if EFI_SHAFT_POSITION_INPUT || defined(__DOXYGEN__) // todo: figure out better startup logic initTriggerCentral(sharedLogger, engine); - - initShaftPositionInputCapture(); #endif /* EFI_SHAFT_POSITION_INPUT */ + turnOnHardware(); + #if HAL_USE_SPI || defined(__DOXYGEN__) initSpiModules(boardConfiguration); #endif diff --git a/firmware/hw_layer/trigger_input.cpp b/firmware/hw_layer/trigger_input.cpp index 2888fe3abe..fab63216d8 100644 --- a/firmware/hw_layer/trigger_input.cpp +++ b/firmware/hw_layer/trigger_input.cpp @@ -18,13 +18,9 @@ #include "engine_configuration.h" #include "wave_analyzer_hw.h" -static WaveReaderHw primaryCrankInput; -static WaveReaderHw secondaryCrankInput; +static ICUDriver *primaryCrankDriver; EXTERN_ENGINE; -extern engine_configuration_s *engineConfiguration; -extern engine_configuration2_s *engineConfiguration2; -extern board_configuration_s *boardConfiguration; /** * that's hardware timer input capture IRQ entry point @@ -33,7 +29,7 @@ extern board_configuration_s *boardConfiguration; 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 == primaryCrankInput.driver; + int isPrimary = icup == primaryCrankDriver; if (!isPrimary && !engine->triggerShape.needSecondTriggerInput) { return; } @@ -45,7 +41,7 @@ static void shaft_icu_width_callback(ICUDriver *icup) { } static void shaft_icu_period_callback(ICUDriver *icup) { - int isPrimary = icup == primaryCrankInput.driver; + int isPrimary = icup == primaryCrankDriver; if (!isPrimary && !engine->triggerShape.needSecondTriggerInput) { return; } @@ -62,38 +58,30 @@ static void shaft_icu_period_callback(ICUDriver *icup) { static ICUConfig shaft_icucfg = { ICU_INPUT_ACTIVE_LOW, 100000, /* 100kHz ICU clock frequency. */ shaft_icu_width_callback, shaft_icu_period_callback }; -void initShaftPositionInputCapture(void) { - - ICUDriver *driver; - - driver = getInputCaptureDriver(boardConfiguration->triggerInputPins[0]); - - // todo: extract method! - // initialize primary Input Capture Unit pin - initWaveAnalyzerDriver(&primaryCrankInput, boardConfiguration->triggerInputPins[0]); - /** - * Start primary Input Capture Unit using given configuration - * @see shaft_icucfg for callback entry points - */ +static ICUDriver *turnOnTriggerInputPin(brain_pin_e hwPin) { + // configure pin + turnOnCapturePin(hwPin); shaft_icucfg.channel = ICU_CHANNEL_1; - print("initShaftPositionInputCapture 1 %s\r\n", hwPortname(boardConfiguration->triggerInputPins[0])); + + ICUDriver *driver = getInputCaptureDriver(hwPin); + print("initShaftPositionInputCapture %s\r\n", hwPortname(hwPin)); // todo: reuse 'setWaveReaderMode' method here? if (driver != NULL) { efiIcuStart(driver, &shaft_icucfg); icuEnable(driver); } + return driver; +} - driver = getInputCaptureDriver(boardConfiguration->triggerInputPins[1]); - // initialize secondary Input Capture Unit pin - initWaveAnalyzerDriver(&secondaryCrankInput, boardConfiguration->triggerInputPins[1]); - shaft_icucfg.channel = ICU_CHANNEL_1; - print("initShaftPositionInputCapture 2 %s\r\n", hwPortname(boardConfiguration->triggerInputPins[1])); - if (driver != NULL) { - efiIcuStart(driver, &shaft_icucfg); - icuEnable(driver); - } +void turnOnTriggerInputPins(void) { + primaryCrankDriver = turnOnTriggerInputPin(boardConfiguration->triggerInputPins[0]); + turnOnTriggerInputPin(boardConfiguration->triggerInputPins[1]); print("crank input disabled\r\n"); } +void turnOffTriggerInputPins(void) { + +} + #endif /* EFI_SHAFT_POSITION_INPUT */ diff --git a/firmware/hw_layer/trigger_input.h b/firmware/hw_layer/trigger_input.h index a1fa89afd9..d6fa261d5c 100644 --- a/firmware/hw_layer/trigger_input.h +++ b/firmware/hw_layer/trigger_input.h @@ -9,15 +9,7 @@ #ifndef CRANK_INPUT_H_ #define CRANK_INPUT_H_ -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -void initShaftPositionInputCapture(void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ +void turnOnTriggerInputPins(void); +void turnOffTriggerInputPins(void); #endif /* CRANK_INPUT_H_ */ diff --git a/firmware/hw_layer/vehicle_speed.cpp b/firmware/hw_layer/vehicle_speed.cpp index a0314df97d..c9850f60a8 100644 --- a/firmware/hw_layer/vehicle_speed.cpp +++ b/firmware/hw_layer/vehicle_speed.cpp @@ -18,8 +18,6 @@ EXTERN_ENGINE static Logging *logger; -static WaveReaderHw vehicleSpeedInput; - static uint64_t lastSignalTimeNt = 0; static uint64_t vssDiff = 0; static int vssCounter = 0; @@ -54,10 +52,10 @@ void initVehicleSpeed(Logging *l) { logger = l; if (boardConfiguration->vehicleSpeedSensorInputPin == GPIO_UNASSIGNED) return; - initWaveAnalyzerDriver(&vehicleSpeedInput, boardConfiguration->vehicleSpeedSensorInputPin); - startInputDriver(&vehicleSpeedInput, true); + WaveReaderHw* vehicleSpeedInput = initWaveAnalyzerDriver(boardConfiguration->vehicleSpeedSensorInputPin); + startInputDriver(vehicleSpeedInput, true); - vehicleSpeedInput.widthListeners.registerCallback((VoidInt) vsAnaWidthCallback, NULL); + vehicleSpeedInput->widthListeners.registerCallback((VoidInt) vsAnaWidthCallback, NULL); addConsoleAction("speedinfo", speedInfo); } diff --git a/firmware/hw_layer/wave_analyzer_hw.cpp b/firmware/hw_layer/wave_analyzer_hw.cpp index 10e3654925..bb2d3d762b 100644 --- a/firmware/hw_layer/wave_analyzer_hw.cpp +++ b/firmware/hw_layer/wave_analyzer_hw.cpp @@ -8,6 +8,7 @@ #include "wave_analyzer_hw.h" #include "mpu_util.h" +#include "fl_stack.h" #if EFI_WAVE_ANALYZER || defined(__DOXYGEN__) @@ -25,13 +26,12 @@ static void icuPeriordCallBack(ICUDriver *driver); static ICUConfig wave_icucfg = { ICU_INPUT_ACTIVE_LOW, CORE_CLOCK / 100, icuWidthCallback, icuPeriordCallBack, 0, ICU_CHANNEL_1, 0 }; -static int registeredIcuCount = 0; -static WaveReaderHw* registeredIcus[8]; +static ArrayList registeredIcus; static WaveReaderHw * findWaveReaderHw(ICUDriver *driver) { - for (int i = 0; i < registeredIcuCount; i++) { - if (registeredIcus[i]->driver == driver) { - return registeredIcus[i]; + for (int i = 0; i < registeredIcus.size; i++) { + if (registeredIcus.elements[i].driver == driver) { + return ®isteredIcus.elements[i]; } } firmwareError("reader not found"); @@ -140,25 +140,27 @@ ICUDriver * getInputCaptureDriver(brain_pin_e hwPin) { return (ICUDriver *) NULL; } -void initWaveAnalyzerDriver(WaveReaderHw *hw, brain_pin_e brainPin) { +void turnOnCapturePin(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; if (driver != NULL) { iomode_t mode = (iomode_t) PAL_MODE_ALTERNATE(getAlternateFunctions(driver)); mySetPadMode("wave input", port, pin, mode); - -// hw->widthListeners.currentListenersCount = 0; - - registeredIcus[registeredIcuCount++] = hw; } } +WaveReaderHw * initWaveAnalyzerDriver(brain_pin_e brainPin) { + ICUDriver *driver = getInputCaptureDriver(brainPin); + + WaveReaderHw *hw = registeredIcus.add(); + + hw->driver = driver; + turnOnCapturePin(brainPin); + return hw; +} + void startInputDriver(WaveReaderHw *hw, bool isActiveHigh) { hw->isActiveHigh = isActiveHigh; if (hw->isActiveHigh) { diff --git a/firmware/hw_layer/wave_analyzer_hw.h b/firmware/hw_layer/wave_analyzer_hw.h index 6a79ca0a7b..9c7cc2612a 100644 --- a/firmware/hw_layer/wave_analyzer_hw.h +++ b/firmware/hw_layer/wave_analyzer_hw.h @@ -16,10 +16,8 @@ typedef struct { ICUDriver *driver; - GPIO_TypeDef *port; - int pin; bool_t isActiveHigh; // false for ICU_INPUT_ACTIVE_LOW, true for ICU_INPUT_ACTIVE_HIGH - volatile int started; + volatile bool_t started; // todo: make this a template & reduce number of listeners? // todo: would one listener be enough? @@ -27,7 +25,8 @@ typedef struct { IntListenerArray periodListeners; } WaveReaderHw; -void initWaveAnalyzerDriver(WaveReaderHw *hw, brain_pin_e brainPin); +void turnOnCapturePin(brain_pin_e brainPin); +WaveReaderHw *initWaveAnalyzerDriver(brain_pin_e brainPin); void startInputDriver(WaveReaderHw *hw, bool isActiveHigh); ICUDriver * getInputCaptureDriver(brain_pin_e hwPin);