From c84fa2ec2e6ae01f6a7c148e98aa391fc252738b Mon Sep 17 00:00:00 2001 From: rusEfi Date: Tue, 7 Apr 2015 23:04:53 -0500 Subject: [PATCH] auto-sync --- firmware/hw_layer/hardware.cpp | 10 +++--- firmware/hw_layer/hardware.h | 1 + firmware/hw_layer/trigger_input.cpp | 50 ++++++++++++++++++++++++----- firmware/hw_layer/trigger_input.h | 6 ++-- firmware/rusefi.cpp | 14 +++++++- 5 files changed, 65 insertions(+), 16 deletions(-) diff --git a/firmware/hw_layer/hardware.cpp b/firmware/hw_layer/hardware.cpp index 248372ca70..7bebc9b25f 100644 --- a/firmware/hw_layer/hardware.cpp +++ b/firmware/hw_layer/hardware.cpp @@ -177,15 +177,15 @@ static void adcConfigListener(Engine *engine) { calcFastAdcIndexes(); } -void turnOnHardware(void) { +void turnOnHardware(Logging *sharedLogger) { #if EFI_SHAFT_POSITION_INPUT || defined(__DOXYGEN__) - turnOnTriggerInputPins(); + turnOnTriggerInputPins(sharedLogger); #endif /* EFI_SHAFT_POSITION_INPUT */ } -void turnOffHardware(void) { +void applyNewHardwareSettings(engine_configuration_s *oldConfiguration) { #if EFI_SHAFT_POSITION_INPUT || defined(__DOXYGEN__) - turnOffTriggerInputPins(); + applyNewTriggerInputPins(oldConfiguration); #endif /* EFI_SHAFT_POSITION_INPUT */ } @@ -291,7 +291,7 @@ void initHardware(Logging *l, Engine *engine) { initTriggerCentral(sharedLogger, engine); #endif /* EFI_SHAFT_POSITION_INPUT */ - turnOnHardware(); + turnOnHardware(sharedLogger); #if HAL_USE_SPI || defined(__DOXYGEN__) initSpiModules(boardConfiguration); diff --git a/firmware/hw_layer/hardware.h b/firmware/hw_layer/hardware.h index dfcaa027d9..ac7a644b23 100644 --- a/firmware/hw_layer/hardware.h +++ b/firmware/hw_layer/hardware.h @@ -44,6 +44,7 @@ void unlockSpi(void); #if EFI_PROD_CODE #include "engine.h" +void applyNewHardwareSettings(engine_configuration_s *oldConfiguration); void initHardware(Logging *logging, Engine *engine); #endif /* EFI_PROD_CODE */ diff --git a/firmware/hw_layer/trigger_input.cpp b/firmware/hw_layer/trigger_input.cpp index fab63216d8..bc9f5b0fdb 100644 --- a/firmware/hw_layer/trigger_input.cpp +++ b/firmware/hw_layer/trigger_input.cpp @@ -18,9 +18,13 @@ #include "engine_configuration.h" #include "wave_analyzer_hw.h" +#define TRIGGER_SUPPORTED_CHANNELS 2 + static ICUDriver *primaryCrankDriver; -EXTERN_ENGINE; +EXTERN_ENGINE +; +static Logging *logger; /** * that's hardware timer input capture IRQ entry point @@ -64,7 +68,7 @@ static ICUDriver *turnOnTriggerInputPin(brain_pin_e hwPin) { shaft_icucfg.channel = ICU_CHANNEL_1; ICUDriver *driver = getInputCaptureDriver(hwPin); - print("initShaftPositionInputCapture %s\r\n", hwPortname(hwPin)); + scheduleMsg(logger, "turnOnTriggerInputPin %s", hwPortname(hwPin)); // todo: reuse 'setWaveReaderMode' method here? if (driver != NULL) { efiIcuStart(driver, &shaft_icucfg); @@ -73,15 +77,45 @@ static ICUDriver *turnOnTriggerInputPin(brain_pin_e hwPin) { return driver; } -void turnOnTriggerInputPins(void) { - primaryCrankDriver = turnOnTriggerInputPin(boardConfiguration->triggerInputPins[0]); - turnOnTriggerInputPin(boardConfiguration->triggerInputPins[1]); - - print("crank input disabled\r\n"); +static void turnOffTriggerInputPin(brain_pin_e hwPin) { + ICUDriver *driver = getInputCaptureDriver(hwPin); + if (driver != NULL) { + icuDisable(driver); + icuStop(driver); + scheduleMsg(logger, "turnOffTriggerInputPin %s", hwPortname(hwPin)); + unmarkPin(hwPin); + } } -void turnOffTriggerInputPins(void) { +static void rememberPrimaryChannel(void) { + primaryCrankDriver = getInputCaptureDriver(boardConfiguration->triggerInputPins[0]); +} +void turnOnTriggerInputPins(Logging *sharedLogger) { + logger = sharedLogger; + for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) { + turnOnTriggerInputPin(boardConfiguration->triggerInputPins[i]); + } + + rememberPrimaryChannel(); +} + +void applyNewTriggerInputPins(engine_configuration_s *oldConfiguration) { + // first we will turn off all the changed pins + for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) { + if (boardConfiguration->triggerInputPins[i] != oldConfiguration->bc.triggerInputPins[i]) { + turnOffTriggerInputPin(oldConfiguration->bc.triggerInputPins[i]); + } + } + // then we will enable all the changed pins + for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) { + if (boardConfiguration->triggerInputPins[i] != oldConfiguration->bc.triggerInputPins[i]) { + turnOnTriggerInputPin(boardConfiguration->triggerInputPins[i]); + } + } + + turnOffTriggerInputPin(oldConfiguration->bc.triggerInputPins[1]); + rememberPrimaryChannel(); } #endif /* EFI_SHAFT_POSITION_INPUT */ diff --git a/firmware/hw_layer/trigger_input.h b/firmware/hw_layer/trigger_input.h index d6fa261d5c..3c77eb3a46 100644 --- a/firmware/hw_layer/trigger_input.h +++ b/firmware/hw_layer/trigger_input.h @@ -9,7 +9,9 @@ #ifndef CRANK_INPUT_H_ #define CRANK_INPUT_H_ -void turnOnTriggerInputPins(void); -void turnOffTriggerInputPins(void); +#include "engine.h" + +void turnOnTriggerInputPins(Logging *sharedLogger); +void applyNewTriggerInputPins(engine_configuration_s *oldConfiguration); #endif /* CRANK_INPUT_H_ */ diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index 3b66df45ba..3464eb797c 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -168,6 +168,16 @@ void swo_init() { // *((volatile unsigned *)(ITM_BASE + 0x40304)) = 0x00000100; // Formatter and Flush Control Register } +static engine_configuration_s activeConfiguration; + +static void rememberCurrentConfiguration(void) { + memcpy(&activeConfiguration, engineConfiguration, sizeof(engine_configuration_s)); +} + +void applyNewConfiguration() { + applyNewHardwareSettings(&activeConfiguration); +} + void runRusEfi(void) { msObjectInit(&firmwareErrorMessageStream, errorMessageBuffer, sizeof(errorMessageBuffer), 0); @@ -214,13 +224,15 @@ void runRusEfi(void) { #endif startStatusThreads(engine); + rememberCurrentConfiguration(); + print("Running main loop\r\n"); main_loop_started = true; /** * This loop is the closes we have to 'main loop' - but here we only publish the status. The main logic of engine * control is around main_trigger_callback */ - while (TRUE) { + while (true) { efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "stack#1"); #if (EFI_CLI_SUPPORT && !EFI_UART_ECHO_TEST_MODE) || defined(__DOXYGEN__)