From f082ac48b1094df86b70cda827fffc72bd670e80 Mon Sep 17 00:00:00 2001 From: rusefi Date: Mon, 11 Nov 2019 23:04:27 -0500 Subject: [PATCH] refactoring: time to unify digital pin API --- firmware/controllers/sensors/map.cpp | 3 +-- firmware/development/wave_analyzer.cpp | 17 ++--------------- firmware/hw_layer/digital_input.h | 23 +++++++++++++++++++++++ firmware/hw_layer/digital_input_exti.h | 9 ++------- firmware/hw_layer/digital_input_hw.cpp | 6 ++++++ firmware/hw_layer/digital_input_hw.h | 21 ++++++--------------- firmware/util/containers/listener_array.h | 2 +- 7 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 firmware/hw_layer/digital_input.h diff --git a/firmware/controllers/sensors/map.cpp b/firmware/controllers/sensors/map.cpp index 056bdebcdf..571264774d 100644 --- a/firmware/controllers/sensors/map.cpp +++ b/firmware/controllers/sensors/map.cpp @@ -268,8 +268,7 @@ void initMapDecoder(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) { if (engineConfiguration->hasFrequencyReportingMapSensor) { #if HAL_USE_ICU - digital_input_s* digitalMapInput = addWaveAnalyzerDriver("map freq", CONFIGB(frequencyReportingMapInputPin)); - startInputDriver("MAP", digitalMapInput, true); + digital_input_s* digitalMapInput = startDigitalCapture("MAP freq", CONFIGB(frequencyReportingMapInputPin), true); digitalMapInput->widthListeners.registerCallback((VoidInt) digitalMapWidthCallback, NULL); #else diff --git a/firmware/development/wave_analyzer.cpp b/firmware/development/wave_analyzer.cpp index 8466559da4..9a60491663 100644 --- a/firmware/development/wave_analyzer.cpp +++ b/firmware/development/wave_analyzer.cpp @@ -104,18 +104,6 @@ static void waIcuPeriodCallback(WaveReader *reader) { reader->onFallEvent(); } -static void setWaveModeSilent(int index, int mode) { - WaveReader *reader = &readers[index]; - - startInputDriver("wave", reader->hw, mode); -} - -//static int getEventCounter(int index) { -// WaveReader *reader = &readers[index]; -// ensureInitialized(reader); -// return reader->eventCounter; -//} - static void initWave(const char *name, int index) { brain_pin_e brainPin = CONFIGB(logicAnalyzerPins)[index]; @@ -129,7 +117,8 @@ static void initWave(const char *name, int index) { WaveReader *reader = &readers[index]; reader->name = name; - reader->hw = addWaveAnalyzerDriver("wave input", brainPin); + reader->hw = startDigitalCapture("wave input", brainPin, mode); + if (reader->hw != NULL) { reader->hw->widthListeners.registerCallback((VoidInt)(void*) waAnaWidthCallback, (void*) reader); @@ -137,7 +126,6 @@ static void initWave(const char *name, int index) { } print("wave%d input on %s\r\n", index, hwPortname(brainPin)); - startInputDriver("wave", reader->hw, mode); } #endif @@ -259,7 +247,6 @@ void initWaveAnalyzer(Logging *sharedLogger) { addConsoleAction("waveinfo", showWaveInfo); - addConsoleActionII("set_logic_input_mode", setWaveModeSilent); #else print("wave disabled\r\n"); #endif diff --git a/firmware/hw_layer/digital_input.h b/firmware/hw_layer/digital_input.h new file mode 100644 index 0000000000..3c3add5fb4 --- /dev/null +++ b/firmware/hw_layer/digital_input.h @@ -0,0 +1,23 @@ +/* + * @file digital_input.h + * + * @date Nov 11, 2019 + * @author Andrey Belomutskiy, (c) 2012-2019 + */ + +#pragma once + +#include "global.h" +#include "listener_array.h" + +typedef struct { +#if HAL_USE_ICU + ICUDriver *driver; +#endif /* HAL_USE_ICU */ + + bool isActiveHigh = false; + volatile bool started = false; + brain_pin_e brainPin = GPIO_UNASSIGNED; + IntListenerArray<1> widthListeners; + IntListenerArray<1> periodListeners; +} digital_input_s; diff --git a/firmware/hw_layer/digital_input_exti.h b/firmware/hw_layer/digital_input_exti.h index 230b24796d..8ad517d805 100644 --- a/firmware/hw_layer/digital_input_exti.h +++ b/firmware/hw_layer/digital_input_exti.h @@ -2,17 +2,12 @@ * digital_input_exti.h * * Created on: Dec 18, 2018 - * @author Andrey Belomutskiy, (c) 2012-2018 + * @author Andrey Belomutskiy, (c) 2012-2019 */ -#ifndef HW_LAYER_DIGITAL_INPUT_EXTI_H_ -#define HW_LAYER_DIGITAL_INPUT_EXTI_H_ - -#include "global.h" +#include "digital_input.h" #if HAL_USE_PAL int efiExtiEnablePin(const char *msg, brain_pin_e pin, uint32_t mode, palcallback_t cb, void *cb_data); void efiExtiDisablePin(brain_pin_e brainPin); #endif /* HAL_USE_PAL */ - -#endif /* HW_LAYER_DIGITAL_INPUT_EXTI_H_ */ diff --git a/firmware/hw_layer/digital_input_hw.cpp b/firmware/hw_layer/digital_input_hw.cpp index f0b9247a44..9d2e9c6b63 100644 --- a/firmware/hw_layer/digital_input_hw.cpp +++ b/firmware/hw_layer/digital_input_hw.cpp @@ -288,4 +288,10 @@ void startInputDriver(const char *msg, /*nullable*/digital_input_s *hw, bool isA hw->started = true; } +digital_input_s* startDigitalCapture(const char *msg, brain_pin_e brainPin, bool isActiveHigh) { + digital_input_s* input = addWaveAnalyzerDriver(msg, brainPin); + startInputDriver(msg, input, isActiveHigh); + return input; +} + #endif /* EFI_ICU_INPUTS */ diff --git a/firmware/hw_layer/digital_input_hw.h b/firmware/hw_layer/digital_input_hw.h index 9a386df440..7fe253c79f 100644 --- a/firmware/hw_layer/digital_input_hw.h +++ b/firmware/hw_layer/digital_input_hw.h @@ -2,32 +2,24 @@ * @file digital_input_hw.h * * @date Jun 23, 2013 - * @author Andrey Belomutskiy, (c) 2012-2017 + * @author Andrey Belomutskiy, (c) 2012-2019 */ -#ifndef DIGITAL_INPUT_HW_H_ -#define DIGITAL_INPUT_HW_H_ +#pragma once -#include "global.h" +#include "digital_input.h" #if HAL_USE_ICU -#include "listener_array.h" - -typedef struct { - ICUDriver *driver; - bool isActiveHigh; // false for ICU_INPUT_ACTIVE_LOW, true for ICU_INPUT_ACTIVE_HIGH - volatile bool started; - brain_pin_e brainPin; - IntListenerArray<1> widthListeners; - IntListenerArray<1> periodListeners; -} digital_input_s; +digital_input_s* startDigitalCapture(const char *msg, brain_pin_e brainPin, bool isActiveHigh); void turnOnCapturePin(const char *msg, brain_pin_e brainPin); void turnOffCapturePin(brain_pin_e brainPin); +// deprecated API digital_input_s *addWaveAnalyzerDriver(const char *msg, brain_pin_e brainPin); void startInputDriver(const char *msg, /*nullable*/digital_input_s *hw, bool isActiveHigh); + void removeWaveAnalyzerDriver(const char *msg, brain_pin_e brainPin); //Nullable @@ -37,4 +29,3 @@ icuchannel_t getInputCaptureChannel(brain_pin_e hwPin); #endif /* HAL_USE_ICU */ -#endif /* DIGITAL_INPUT_HW_H_ */ diff --git a/firmware/util/containers/listener_array.h b/firmware/util/containers/listener_array.h index 625095a0ce..6c3a625216 100644 --- a/firmware/util/containers/listener_array.h +++ b/firmware/util/containers/listener_array.h @@ -28,7 +28,7 @@ public: void registerCallback(VoidInt handler, void *arg); void registerCallback(Void listener); void invokeJustArgCallbacks() const; - int currentListenersCount; + int currentListenersCount = 0; VoidInt callbacks[MAX_INT_LISTENER_COUNT]; void * args[MAX_INT_LISTENER_COUNT]; };