From 785ffea80f9ef289fb13dd107394d347ffc7a56a Mon Sep 17 00:00:00 2001 From: Andrey B Date: Wed, 30 Apr 2014 11:03:21 -0500 Subject: [PATCH] manual sync --- firmware/chibios/os/kernel/src/chdebug.c | 2 +- firmware/config/engines/GY6_139QMB.c | 31 -- firmware/config/engines/audi_aan.c | 52 --- firmware/config/engines/dodge_neon.c | 112 ----- firmware/config/engines/ford_1995_inline_6.c | 100 ----- firmware/config/engines/ford_fiesta.c | 31 -- firmware/config/engines/honda_accord.c | 16 - firmware/config/engines/mazda_323.c | 22 - firmware/config/engines/mazda_miata_nb.c | 83 ---- firmware/config/engines/nissan_primera.c | 18 - firmware/config/engines/snow_blower.c | 14 - firmware/config/system/chconf.h | 2 +- firmware/console/status_loop.c | 408 ------------------ .../controllers/algo/accel_enrichmemnt.cpp | 28 -- firmware/controllers/algo/accel_enrichmemnt.h | 20 - firmware/controllers/algo/algo.c | 48 --- .../controllers/algo/engine_configuration.c | 370 ---------------- .../controllers/algo/engine_configuration.h | 2 +- firmware/controllers/algo/error_handling.h | 2 +- .../algo/signal_executor_single_timer_algo.c | 74 ---- .../algo/signal_executor_single_timer_algo.h | 18 - firmware/controllers/alternatorController.c | 62 --- firmware/controllers/electronic_throttle.c | 97 ----- firmware/controllers/flash_main.c | 114 ----- firmware/controllers/idle_thread.c | 137 ------ firmware/controllers/injector_central.c | 166 ------- firmware/controllers/sensors/thermistors.c | 167 ------- firmware/controllers/settings.cpp | 2 +- .../controllers/system/pwm_generator_logic.c | 131 ------ .../system/signal_executor_single_timer.c | 198 --------- .../system/signal_executor_single_timer.h | 17 - firmware/controllers/trigger/rpm_calculator.c | 181 -------- .../controllers/trigger/trigger_central.c | 115 ----- .../controllers/trigger/trigger_central.cpp | 2 +- .../controllers/trigger/trigger_central.h | 2 +- firmware/controllers/trigger/trigger_mazda.c | 104 ----- .../controllers/trigger/trigger_structure.c | 60 --- firmware/hw_layer/hardware.c | 171 -------- firmware/hw_layer/pwm_generator.c | 65 --- firmware/hw_layer/trigger_input.c | 85 ---- firmware/rusefi.cpp | 12 +- firmware/util/histogram.c | 2 +- firmware/util/histogram.h | 2 +- 43 files changed, 15 insertions(+), 3330 deletions(-) delete mode 100644 firmware/config/engines/GY6_139QMB.c delete mode 100644 firmware/config/engines/audi_aan.c delete mode 100644 firmware/config/engines/dodge_neon.c delete mode 100644 firmware/config/engines/ford_1995_inline_6.c delete mode 100644 firmware/config/engines/ford_fiesta.c delete mode 100644 firmware/config/engines/honda_accord.c delete mode 100644 firmware/config/engines/mazda_323.c delete mode 100644 firmware/config/engines/mazda_miata_nb.c delete mode 100644 firmware/config/engines/nissan_primera.c delete mode 100644 firmware/config/engines/snow_blower.c delete mode 100644 firmware/console/status_loop.c delete mode 100644 firmware/controllers/algo/accel_enrichmemnt.cpp delete mode 100644 firmware/controllers/algo/accel_enrichmemnt.h delete mode 100644 firmware/controllers/algo/algo.c delete mode 100644 firmware/controllers/algo/engine_configuration.c delete mode 100644 firmware/controllers/algo/signal_executor_single_timer_algo.c delete mode 100644 firmware/controllers/algo/signal_executor_single_timer_algo.h delete mode 100644 firmware/controllers/alternatorController.c delete mode 100644 firmware/controllers/electronic_throttle.c delete mode 100644 firmware/controllers/flash_main.c delete mode 100644 firmware/controllers/idle_thread.c delete mode 100644 firmware/controllers/injector_central.c delete mode 100644 firmware/controllers/sensors/thermistors.c delete mode 100644 firmware/controllers/system/pwm_generator_logic.c delete mode 100644 firmware/controllers/system/signal_executor_single_timer.c delete mode 100644 firmware/controllers/system/signal_executor_single_timer.h delete mode 100644 firmware/controllers/trigger/rpm_calculator.c delete mode 100644 firmware/controllers/trigger/trigger_central.c delete mode 100644 firmware/controllers/trigger/trigger_mazda.c delete mode 100644 firmware/controllers/trigger/trigger_structure.c delete mode 100644 firmware/hw_layer/hardware.c delete mode 100644 firmware/hw_layer/pwm_generator.c delete mode 100644 firmware/hw_layer/trigger_input.c diff --git a/firmware/chibios/os/kernel/src/chdebug.c b/firmware/chibios/os/kernel/src/chdebug.c index a04dec476a..f46aaab55f 100644 --- a/firmware/chibios/os/kernel/src/chdebug.c +++ b/firmware/chibios/os/kernel/src/chdebug.c @@ -269,7 +269,7 @@ const char *dbg_panic_msg; * @param[in] msg the pointer to the panic message string */ -void chDbgPanic3(const char *msg, char * file, int line); +void chDbgPanic3(const char *msg, const char * file, int line); void chDbgPanic(const char *msg) { chDbgPanic3(msg, __FILE__, __LINE__); diff --git a/firmware/config/engines/GY6_139QMB.c b/firmware/config/engines/GY6_139QMB.c deleted file mode 100644 index e365df891b..0000000000 --- a/firmware/config/engines/GY6_139QMB.c +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @file GY6_139QMB.c - * @brief 139qmb default engine configuration - * - * @date Feb 13, 2014 - * @author rus084 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "GY6_139QMB.h" - -void setGy6139qmbDefaultEngineConfiguration(engine_configuration_s *engineConfiguration) { - engineConfiguration->rpmHardLimit = 9000; - engineConfiguration->crankingSettings.crankingRpm = 800; - engineConfiguration->analogInputDividerCoefficient = 1.52; - engineConfiguration->engineLoadMode = LM_MAP; - engineConfiguration->globalTriggerAngleOffset = 15; - engineConfiguration->analogChartMode = AC_MAP; - engineConfiguration->cylindersCount = 1; - engineConfiguration->rpmMultiplier = 1; - - engineConfiguration->firingOrder = FO_ONE_CYLINDER; - - /** - * We treat the trigger as 1/0 toothed wheel - */ - engineConfiguration->triggerConfig.totalToothCount = 1; - engineConfiguration->triggerConfig.skippedToothCount = 0; - engineConfiguration->triggerConfig.isSynchronizationNeeded = FALSE; - engineConfiguration->needSecondTriggerInput = FALSE; -} diff --git a/firmware/config/engines/audi_aan.c b/firmware/config/engines/audi_aan.c deleted file mode 100644 index 339cae7170..0000000000 --- a/firmware/config/engines/audi_aan.c +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file audi_aan.c - * @brief Audo AAN default engine configuration - * - * @date Nov 24, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - * - */ - -#include "main.h" - -#if EFI_ENGINE_AUDI_AAN || defined(__DOXYGEN__) - -#include "engine_controller.h" - -extern engine_configuration2_s engineConfiguration2; - -void configureShaftPositionEmulatorShape(PwmConfig *state) { - /** - * One signal per cam shaft revolution - */ - int pinStates0[] = { 1, 0 }; - float switchTimes[] = { 0.8, 1 }; - - int *pinStates[2] = { pinStates0 }; - - weComplexInit("distributor", state, 0, 2, switchTimes, 1, pinStates); -} - -void configureEngineEventHandler(EventHandlerConfiguration *config) { - registerActuatorEvent(&config->ignitionEvents, 0, 1, 0); - registerActuatorEvent(&config->ignitionEvents, 0, 2, 90); -} - -void setDefaultEngineConfiguration(EngineConfiguration *engineConfiguration) { - engineConfiguration2.shaftPositionEventCount = 2; -} - -#endif /* EFI_ENGINE_AUDI_AAN */ diff --git a/firmware/config/engines/dodge_neon.c b/firmware/config/engines/dodge_neon.c deleted file mode 100644 index 10a3791c91..0000000000 --- a/firmware/config/engines/dodge_neon.c +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @file dodge_neon.c - * - * DODGE_NEON_1995 = 2 - * - * @date Dec 16, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "main.h" - -#if EFI_SUPPORT_DODGE_NEON || defined(__DOXYGEN__) - -#include "dodge_neon.h" -#include "engine_configuration.h" -#include "thermistors.h" -#include "engine_math.h" - -void setDodgeNeonEngineConfiguration(engine_configuration_s *engineConfiguration, - board_configuration_s *boardConfiguration) { - engineConfiguration->triggerConfig.triggerType = TT_DODGE_NEON; - - engineConfiguration->engineLoadMode = LM_TPS; - - // set_rpm_hard_limit 4000 - engineConfiguration->rpmHardLimit = 4000; // yes, 4k. let's play it safe for now - // set_cranking_rpm 550 - engineConfiguration->crankingSettings.crankingRpm = 550; - - // since CLT is not wired up yet let's just use same value for min and max - // set_cranking_fuel_max 6 40 - engineConfiguration->crankingSettings.coolantTempMaxC = 37.7; // 6ms at 37.7C - engineConfiguration->crankingSettings.fuelAtMaxTempMs = 6; - - // set_cranking_fuel_min 6 -40 - engineConfiguration->crankingSettings.coolantTempMinC = -40; // 6ms at -40C - engineConfiguration->crankingSettings.fuelAtMinTempMs = 6; - - // set_whole_fuel_map 3 - setWholeFuelMap(engineConfiguration, 3); - - engineConfiguration->triggerConfig.syncRatioFrom = 0.72 * 0.8; - engineConfiguration->triggerConfig.syncRatioTo = 0.72 * 1.3; - - engineConfiguration->triggerConfig.isSynchronizationNeeded = TRUE; - engineConfiguration->triggerConfig.useRiseEdge = FALSE; - engineConfiguration->needSecondTriggerInput = TRUE; - - // set_cranking_injection_mode 0 - engineConfiguration->crankingInjectionMode = IM_SIMULTANEOUS; - // set_injection_mode 1 - engineConfiguration->injectionMode = IM_SEQUENTIAL; - - // set_ignition_mode 2 - engineConfiguration->ignitionMode = IM_WASTED_SPARK; - // set_firing_order 2 - engineConfiguration->firingOrder = FO_1_THEN_3_THEN_4_THEN2; - - // set_global_trigger_offset_angle 497 - engineConfiguration->globalTriggerAngleOffset = 497; - // set_ignition_offset 350 - engineConfiguration->ignitionOffset = 350; - // set_injection_offset 510 - engineConfiguration->injectionOffset = 510; - - // set_cranking_charge_angle 70 - engineConfiguration->crankingChargeAngle = 7; - // set_cranking_timing_angle 0 - engineConfiguration->crankingTimingAngle = 0; - - // Frankenstein: low side - inj #1: PC14 - // Frankenstein: low side - inj #2: PC15 - // Frankenstein: low side - inj #3: PE6 - // Frankenstein: low side - inj #4: PC13 - // Frankenstein: low side - inj #5: PE4 - // Frankenstein: low side - inj #6: PE5 - // Frankenstein: low side - inj #7: PE2 - // Frankenstein: low side - inj #8: PE3 - // Frankenstein: low side - inj #9: PE0 - // Frankenstein: low side - inj #10: PE1 - // Frankenstein: low side - inj #11: PB8 - // Frankenstein: low side - inj #12: PB9 - - boardConfiguration->injectionPins[0] = GPIOB_9; // Frankenstein: low side - inj #12 - boardConfiguration->injectionPins[1] = GPIOB_8; // Frankenstein: low side - inj #11 - boardConfiguration->injectionPins[2] = GPIOE_3; // Frankenstein: low side - inj #8 - boardConfiguration->injectionPins[3] = GPIOE_5; // Frankenstein: low side - inj #6 - - boardConfiguration->fuelPumpPin = GPIOC_13; // Frankenstein: low side - inj #4 - boardConfiguration->fuelPumpPinMode = OM_DEFAULT; - - // set_injection_pin_mode 0 - boardConfiguration->injectionPinMode = OM_DEFAULT; - - // Frankenstein: high side #1: PE8 - // Frankenstein: high side #2: PE10 - - boardConfiguration->ignitionPins[0] = GPIOE_8; // Frankenstein: high side #1 - boardConfiguration->ignitionPins[1] = GPIO_NONE; - boardConfiguration->ignitionPins[2] = GPIOE_10; // // Frankenstein: high side #2 - - // set_ignition_pin_mode 0 - boardConfiguration->ignitionPinMode = OM_DEFAULT; - - setThermistorConfiguration(&engineConfiguration->cltThermistorConf, 0, 32500, 30, 7550, 100, 700); - engineConfiguration->cltThermistorConf.bias_resistor = 2700; - - engineConfiguration->analogChartFrequency = 7; -} - -#endif /* EFI_SUPPORT_DODGE_NEON */ - diff --git a/firmware/config/engines/ford_1995_inline_6.c b/firmware/config/engines/ford_1995_inline_6.c deleted file mode 100644 index bcdec4e731..0000000000 --- a/firmware/config/engines/ford_1995_inline_6.c +++ /dev/null @@ -1,100 +0,0 @@ -/** - * @file ford_1995_inline_6.c - * @brief Default engine configuration for a 1995 Ford inline 6 engine - * - * http://rusefi.com/forum/viewtopic.php?f=3&t=469 - * - * FORD_INLINE_6_1995 = 7 - * - * @date Feb 12, 2014 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "main.h" -#include "ford_1995_inline_6.h" -#include "engine_math.h" -#include "allsensors.h" - -#if EFI_SUPPORT_1995_FORD_INLINE_6 || defined(__DOXYGEN__) - -/** - * @brief Default values for persistent properties - */ -void setFordInline6(engine_configuration_s *engineConfiguration, board_configuration_s *boardConfiguration) { - engineConfiguration->cylindersCount = 6; - - /** - * 0.5 means primary position sensor is on a camshaft - */ - engineConfiguration->rpmMultiplier = 0.5; - - engineConfiguration->ignitionMode = IM_ONE_COIL; - engineConfiguration->firingOrder = FO_1_THEN_5_THEN_3_THEN_6_THEN_2_THEN_4; - engineConfiguration->crankingInjectionMode = IM_SIMULTANEOUS; - engineConfiguration->injectionMode = IM_BATCH; - - /** - * 0.5ms dweel time just to be sure it would fit within camshaft revolution, dwell is not controlled by us anyway - */ - setConstantDwell(engineConfiguration, 0.5); - - /** - * We treat the trigger as 6/0 toothed wheel - */ - engineConfiguration->triggerConfig.totalToothCount = 6; - engineConfiguration->triggerConfig.skippedToothCount = 0; - engineConfiguration->triggerConfig.isSynchronizationNeeded = FALSE; - engineConfiguration->triggerConfig.useRiseEdge = TRUE; - engineConfiguration->needSecondTriggerInput = FALSE; - - engineConfiguration->globalTriggerAngleOffset = 0; - engineConfiguration->ignitionOffset = 13; - - - setThermistorConfiguration(&engineConfiguration->cltThermistorConf, -10, 160310, 60, 7700, 120.00, 1180); - engineConfiguration->cltThermistorConf.bias_resistor = 2700; - - setThermistorConfiguration(&engineConfiguration->iatThermistorConf, -10, 160310, 60, 7700, 120.00, 1180); - engineConfiguration->iatThermistorConf.bias_resistor = 2700; - - // 12ch analog board pinout: - // input channel 3 is PA7, that's ADC7 - // input channel 5 is PA4, that's ADC4 - // input channel 6 is PA3, that's ADC3 - // input channel 7 is PA2, that's ADC2 - // input channel 8 is PA1, that's ADC1 - // input channel 9 is PA0, that's ADC0 - // input channel 10 is PC3, that's ADC13 - // input channel 12 is PC1, that's ADC11 - - engineConfiguration->tpsAdcChannel = 4; - engineConfiguration->iatAdcChannel = 2; - engineConfiguration->cltAdcChannel = 1; - engineConfiguration->afrSensor.afrAdcChannel = 11; - - // 6 channel output board - // output 1 is PB9 - // output 3 is PE3 - // output 5 is PC13 - // output 6 is PC15 - - boardConfiguration->fuelPumpPin = GPIOC_13; - boardConfiguration->injectionPins[0] = GPIOB_9; - boardConfiguration->injectionPins[1] = GPIOE_3; - boardConfiguration->ignitionPins[0] = GPIOC_15; - - boardConfiguration->injectionPins[2] = GPIO_NONE; - boardConfiguration->fanPin = GPIO_NONE; - - engineConfiguration->tpsMin = convertVoltageTo10bitADC(1.250); - engineConfiguration->tpsMax = convertVoltageTo10bitADC(4.538); - - engineConfiguration->map.config.mapType = MT_MPX4250; - engineConfiguration->map.channel = 2; // input channel 8 is ADC2 - - // engineConfiguration->vBattAdcChannel = 0; // -// engineConfiguration->mafAdcChannel = 1; - -} - -#endif /* EFI_SUPPORT_1995_FORD_INLINE_6 */ diff --git a/firmware/config/engines/ford_fiesta.c b/firmware/config/engines/ford_fiesta.c deleted file mode 100644 index e2b6c5230c..0000000000 --- a/firmware/config/engines/ford_fiesta.c +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @file ford_fiesta.c - * @brief European 1990 Ford Fiesta - * - * FORD_FIESTA = 4 - * - * @date Nov 22, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "main.h" - -#if EFI_SUPPORT_FORD_FIESTA || defined(__DOXYGEN__) - -#include "ford_fiesta.h" -#include "engine_configuration.h" -#include "engine_math.h" - -void setFordFiestaDefaultEngineConfiguration(engine_configuration_s *engineConfiguration) { - engineConfiguration->rpmHardLimit = 7000; - // only crankshaft sensor so far - engineConfiguration->rpmMultiplier = 1; - - engineConfiguration->triggerConfig.totalToothCount = 36; - engineConfiguration->triggerConfig.skippedToothCount = 1; - - engineConfiguration->ignitionMode = IM_WASTED_SPARK; - engineConfiguration->firingOrder = FO_1_THEN_3_THEN_4_THEN2; -} - -#endif /* EFI_SUPPORT_FORD_FIESTA */ diff --git a/firmware/config/engines/honda_accord.c b/firmware/config/engines/honda_accord.c deleted file mode 100644 index 8864f0ad92..0000000000 --- a/firmware/config/engines/honda_accord.c +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @file honda_accord.c - * - * @date Jan 12, 2014 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "main.h" -#include "engine_configuration.h" -#include "trigger_decoder.h" - -void setHondaAccordConfiguration(engine_configuration_s *engineConfiguration) { - engineConfiguration->triggerConfig.totalToothCount = 24; - engineConfiguration->triggerConfig.skippedToothCount = 2; -} - diff --git a/firmware/config/engines/mazda_323.c b/firmware/config/engines/mazda_323.c deleted file mode 100644 index c1baa66285..0000000000 --- a/firmware/config/engines/mazda_323.c +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @file mazda_323.c - * - * @date Mar 8, 2014 - * @author Andrey Belomutskiy, (c) 2012-2013 - */ - -#include "mazda_323.h" - -void setMazda323EngineConfiguration(engine_configuration_s *engineConfiguration) { - engineConfiguration->cylindersCount = 6; - - engineConfiguration->ignitionMode = IM_ONE_COIL; - - /** - * We treat the trigger as 4/0 toothed wheel - */ - engineConfiguration->triggerConfig.totalToothCount = 4; - engineConfiguration->triggerConfig.skippedToothCount = 0; - engineConfiguration->triggerConfig.isSynchronizationNeeded = FALSE; - -} diff --git a/firmware/config/engines/mazda_miata_nb.c b/firmware/config/engines/mazda_miata_nb.c deleted file mode 100644 index 3e3bc52707..0000000000 --- a/firmware/config/engines/mazda_miata_nb.c +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file mazda_miata_nb.c - * - * MAZDA_MIATA_NB = 9 - * - * @date Feb 18, 2014 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "mazda_miata_nb.h" -#include "thermistors.h" - -void setMazdaMiataNbEngineConfiguration(engine_configuration_s *engineConfiguration, - board_configuration_s *boardConfiguration) { - // set_rpm_hard_limit 3000 - engineConfiguration->rpmHardLimit = 3000; // yes, 3k. let's play it safe for now - - engineConfiguration->triggerConfig.triggerType = TT_MAZDA_MIATA_NB; - engineConfiguration->triggerConfig.isSynchronizationNeeded = TRUE; - - engineConfiguration->triggerConfig.syncRatioFrom = 0.11 * 0.7; - engineConfiguration->triggerConfig.syncRatioTo = 0.11 * 1.3; - engineConfiguration->triggerConfig.useRiseEdge = FALSE; - engineConfiguration->globalTriggerAngleOffset = 276; - - // set_cranking_injection_mode 0 - engineConfiguration->crankingInjectionMode = IM_SIMULTANEOUS; - // set_injection_mode 1 - engineConfiguration->injectionMode = IM_SEQUENTIAL; - // set_ignition_mode 2 - engineConfiguration->ignitionMode = IM_WASTED_SPARK; - // set_firing_order 2 - engineConfiguration->firingOrder = FO_1_THEN_3_THEN_4_THEN2; - - setThermistorConfiguration(&engineConfiguration->cltThermistorConf, 0, 32500, 30, 7550, 100, 700); - engineConfiguration->cltThermistorConf.bias_resistor = 2700; - - setThermistorConfiguration(&engineConfiguration->iatThermistorConf, -10, 160310, 60, 7700, 120.00, 1180); - engineConfiguration->iatThermistorConf.bias_resistor = 2700; - - engineConfiguration->tpsAdcChannel = 3; // 15 is the old value - engineConfiguration->vBattAdcChannel = 0; // 1 is the old value -// engineConfiguration->map.channel = 1; - engineConfiguration->mafAdcChannel = 1; - engineConfiguration->cltAdcChannel = 11; - engineConfiguration->iatAdcChannel = 13; - engineConfiguration->afrSensor.afrAdcChannel = 2; - - boardConfiguration->idleValvePin = GPIOE_0; - boardConfiguration->idleValvePinMode = OM_DEFAULT; - - boardConfiguration->fuelPumpPin = GPIOC_14; // Frankenstein: low side - inj #4 - boardConfiguration->fuelPumpPinMode = OM_DEFAULT; - - boardConfiguration->injectionPins[0] = GPIOB_9; // Frankenstein: low side - inj #12 - boardConfiguration->injectionPins[1] = GPIOB_8; // Frankenstein: low side - inj #11 - boardConfiguration->injectionPins[2] = GPIOE_3; // Frankenstein: low side - inj #8 - boardConfiguration->injectionPins[3] = GPIOE_5; // Frankenstein: low side - inj #6 - boardConfiguration->injectionPins[4] = GPIO_NONE; - boardConfiguration->injectionPins[5] = GPIO_NONE; - boardConfiguration->injectionPinMode = OM_DEFAULT; - - boardConfiguration->ignitionPins[0] = GPIOE_10; // Frankenstein: high side #1 - boardConfiguration->ignitionPins[1] = GPIO_NONE; - boardConfiguration->ignitionPins[2] = GPIOC_9; // // Frankenstein: high side #2 - boardConfiguration->ignitionPins[3] = GPIO_NONE; - boardConfiguration->ignitionPinMode = OM_INVERTED; - - boardConfiguration->malfunctionIndicatorPin = GPIOE_1; - boardConfiguration->malfunctionIndicatorPinMode = OM_DEFAULT; - - boardConfiguration->fanPin = GPIOE_6; - boardConfiguration->fanPinMode = OM_DEFAULT; - - boardConfiguration->electronicThrottlePin1 = GPIO_NONE; - boardConfiguration->idleSwitchPin = GPIO_NONE; - - // set_whole_fuel_map 3 - setWholeFuelMap(engineConfiguration, 3); - - -// 10 deg before TDC is default timing -} diff --git a/firmware/config/engines/nissan_primera.c b/firmware/config/engines/nissan_primera.c deleted file mode 100644 index 60defcf86a..0000000000 --- a/firmware/config/engines/nissan_primera.c +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @file nissan_primera.c - * - * @date Oct 14, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "main.h" - -#if EFI_SUPPORT_NISSAN_PRIMERA || defined(__DOXYGEN__) -#include "nissan_primera.h" - -void setNissanPrimeraEngineConfiguration(engine_configuration_s *engineConfiguration) { - engineConfiguration->triggerConfig.totalToothCount = 60; - engineConfiguration->triggerConfig.skippedToothCount = 2; -} - -#endif /* EFI_SUPPORT_NISSAN_PRIMERA */ diff --git a/firmware/config/engines/snow_blower.c b/firmware/config/engines/snow_blower.c deleted file mode 100644 index 572e302c6b..0000000000 --- a/firmware/config/engines/snow_blower.c +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @file snow_blower.c - * @brief Default configuration of a single-cylinder engine - * - * @date Sep 9, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "main.h" - -#if EFI_ENGINE_SNOW_BLOWER - - -#endif diff --git a/firmware/config/system/chconf.h b/firmware/config/system/chconf.h index 1bbb0d0f59..89ccd78a98 100644 --- a/firmware/config/system/chconf.h +++ b/firmware/config/system/chconf.h @@ -43,7 +43,7 @@ extern "C" { #endif -void chDbgPanic3(const char *msg, char * file, int line); +void chDbgPanic3(const char *msg, const char * file, int line); #ifdef __cplusplus } #endif diff --git a/firmware/console/status_loop.c b/firmware/console/status_loop.c deleted file mode 100644 index 85c52d5267..0000000000 --- a/firmware/console/status_loop.c +++ /dev/null @@ -1,408 +0,0 @@ -/** - * @file status_loop.c - * @brief Human-readable protocol status messages - * - * http://rusefi.com/forum/viewtopic.php?t=263 Dev console overview - * http://rusefi.com/forum/viewtopic.php?t=210 Commands overview - * - * - * @date Mar 15, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - * - */ - -#include "main.h" -#include "status_loop.h" - -#include "adc_inputs.h" -#if EFI_WAVE_ANALYZER -#include "wave_analyzer.h" -#endif - -#include "trigger_central.h" -#include "engine_state.h" -#include "io_pins.h" -#include "mmc_card.h" -#include "rusefi.h" -#include "console_io.h" - -#include "advance_map.h" -#if EFI_TUNER_STUDIO -#include "tunerstudio.h" -#endif /* EFI_TUNER_STUDIO */ - -#include "wave_math.h" - -#include "fuel_math.h" -#include "main_trigger_callback.h" -#include "engine_math.h" -#include "idle_thread.h" -#include "engine_configuration.h" -#include "rfiutil.h" -#include "svnversion.h" - -#if EFI_PROD_CODE -// todo: move this logic to algo folder! -#include "rtc_helper.h" -#include "lcd_HD44780.h" -#endif - -// this 'true' value is needed for simulator -static volatile int fullLog = TRUE; -int warningEnabled = TRUE; -//int warningEnabled = FALSE; - -extern engine_configuration_s * engineConfiguration; -extern engine_configuration2_s * engineConfiguration2; -#define FULL_LOGGING_KEY "fl" - -#if EFI_PROD_CODE || EFI_SIMULATOR -static Logging logger; - -static void setWarningEnabled(int value) { - warningEnabled = value; -} - -#endif /* EFI_PROD_CODE || EFI_SIMULATOR */ - -#if EFI_FILE_LOGGING -static Logging fileLogger; -#endif /* EFI_FILE_LOGGING */ - -static void reportSensorF(char *caption, float value, int precision) { -#if EFI_PROD_CODE || EFI_SIMULATOR - debugFloat(&logger, caption, value, precision); -#endif /* EFI_PROD_CODE || EFI_SIMULATOR */ - -#if EFI_FILE_LOGGING - debugFloat(&fileLogger, caption, value, precision); -#endif /* EFI_FILE_LOGGING */ -} - -static void reportSensorI(char *caption, int value) { -#if EFI_PROD_CODE || EFI_SIMULATOR - debugInt(&logger, caption, value); -#endif /* EFI_PROD_CODE || EFI_SIMULATOR */ -#if EFI_FILE_LOGGING - debugInt(&fileLogger, caption, value); -#endif /* EFI_FILE_LOGGING */ -} - -static char* boolean2string(int value) { - return value ? "YES" : "NO"; -} - -void finishStatusLine(void) { - printLine(&logger); -} - -void printSensors(void) { -#if EFI_FILE_LOGGING - resetLogging(&fileLogger); -#endif /* EFI_FILE_LOGGING */ - - // current time, in milliseconds - int nowMs = currentTimeMillis(); - float sec = ((float) nowMs) / 1000; - reportSensorF("time", sec, 3); - - reportSensorI("rpm", getRpm()); - reportSensorF("maf", getMaf(), 2); - - if (engineConfiguration2->hasMapSensor) { - reportSensorF(getCaption(LP_MAP), getMap(), 2); - } - - reportSensorF("afr", getAfr(), 2); - reportSensorF("vref", getVRef(), 2); - reportSensorF("vbatt", getVBatt(), 2); - - reportSensorF(getCaption(LP_THROTTLE), getTPS(), 2); - - if (engineConfiguration2->hasCltSensor) { - reportSensorF(getCaption(LP_ECT), getCoolantTemperature(), 2); - } - - reportSensorF(getCaption(LP_IAT), getIntakeAirTemperature(), 2); - -// debugFloat(&logger, "tch", getTCharge1(tps), 2); - -#if EFI_FILE_LOGGING - appendPrintf(&fileLogger, "\r\n"); - appendToLog(fileLogger.buffer); -#endif /* EFI_FILE_LOGGING */ -} - -void printState(int currentCkpEventCounter) { - printSensors(); - - int rpm = getRpm(); - debugInt(&logger, "ckp_c", currentCkpEventCounter); - debugInt(&logger, "fuel_lag", getRevolutionCounter()); - -// debugInt(&logger, "idl", getIdleSwitch()); - -// debugFloat(&logger, "table_spark", getAdvance(rpm, getMaf()), 2); - - float engineLoad = getEngineLoad(); - debugFloat(&logger, "fuel_base", getBaseFuel(rpm, engineLoad), 2); -// debugFloat(&logger, "fuel_iat", getIatCorrection(getIntakeAirTemperature()), 2); -// debugFloat(&logger, "fuel_clt", getCltCorrection(getCoolantTemperature()), 2); -// debugFloat(&logger, "fuel_lag", getInjectorLag(getVBatt()), 2); - debugFloat(&logger, "fuel", getRunningFuel(rpm, engineLoad), 2); - - debugFloat(&logger, "timing", getAdvance(rpm, engineLoad), 2); - -// float map = getMap(); -// float fuel = getDefaultFuel(rpm, map); -// debugFloat(&logger, "d_fuel", fuel, 2); - -} - -#define INITIAL_FULL_LOG TRUE -//#define INITIAL_FULL_LOG FALSE - -static char LOGGING_BUFFER[500]; - -#if EFI_PROD_CODE - -volatile int needToReportStatus = FALSE; -static int prevCkpEventCounter = -1; - -static Logging logger2; - -static void printStatus(void) { - needToReportStatus = TRUE; -} - -//float getTCharge1(float tps) { -// float cltK = tempCtoKelvin(getCoolantTemperature()); -// float iatK = tempCtoKelvin(getIntakeAirTemperature()); -// return getTCharge(getCurrentRpm(), tps, cltK, iatK); -//} - -#if EFI_CUSTOM_PANIC_METHOD -extern char *dbg_panic_file; -extern int dbg_panic_line; -#endif - -void onDbgPanic(void) { - setOutputPinValue(LED_ERROR, 1); -} - -int hasFatalError(void) { - return dbg_panic_msg != NULL; -} - -static void checkIfShouldHalt(void) { -#if CH_DBG_ENABLED - if (hasFatalError()) { - setOutputPinValue(LED_ERROR, 1); -#if EFI_CUSTOM_PANIC_METHOD - print("my FATAL [%s] at %s:%d\r\n", dbg_panic_msg, dbg_panic_file, dbg_panic_line); -#else - print("my FATAL [%s] at %s:%d\r\n", dbg_panic_msg); -#endif - chThdSleepSeconds(1); - // todo: figure out how we halt exactly - while (TRUE) { - } - chSysHalt(); - } -#endif -} - -/** - * Time when the firmware version was reported last time, in seconds - * TODO: implement a request/response instead of just constantly sending this out - */ -static systime_t timeOfPreviousPrintVersion = (systime_t) -1; - -static void printVersion(systime_t nowSeconds) { - if (overflowDiff(nowSeconds, timeOfPreviousPrintVersion) < 4) - return; - timeOfPreviousPrintVersion = nowSeconds; - appendPrintf(&logger, "rusEfiVersion%s%d@%d %s%s", DELIMETER, getRusEfiVersion(), SVN_VERSION, getConfigurationName(engineConfiguration), - DELIMETER); -} - -static systime_t timeOfPreviousReport = (systime_t) -1; - -extern bool hasFirmwareError; -extern char errorMessageBuffer[200]; - -/** - * @brief Sends all pending data to dev console - */ -void updateDevConsoleState(void) { - if (!is_serial_ready()) - return; - checkIfShouldHalt(); - printPending(); - - pokeAdcInputs(); - - if (hasFirmwareError) { - printMsg(&logger, "firmware error: %s", errorMessageBuffer); - return; - } - - if (!fullLog) - return; - - systime_t nowSeconds = getTimeNowSeconds(); - printVersion(nowSeconds); - - int currentCkpEventCounter = getCrankEventCounter(); - if (prevCkpEventCounter == currentCkpEventCounter && timeOfPreviousReport == nowSeconds) - return; - - timeOfPreviousReport = nowSeconds; - - - prevCkpEventCounter = currentCkpEventCounter; - - printState(currentCkpEventCounter); - - -#if EFI_WAVE_ANALYZER -// printWave(&logger); -#endif - - finishStatusLine(); -} - -/* - * command example: - * sfm 3500 400 - * that would be 'show fuel for rpm 3500 maf 4.0' - */ - -static void showFuelMap(int rpm, int key100) { - float engineLoad = key100 / 100.0; - - float baseFuel = getBaseFuel(rpm, engineLoad); - - float iatCorrection = getIatCorrection(getIntakeAirTemperature()); - float cltCorrection = getCltCorrection(getCoolantTemperature()); - float injectorLag = getInjectorLag(getVBatt()); - print("baseFuel=%f\r\n", baseFuel); - - print("iatCorrection=%f cltCorrection=%f injectorLag=%d\r\n", iatCorrection, cltCorrection, - (int) (100 * injectorLag)); - - float value = getRunningFuel(rpm, engineLoad); - - print("fuel map rpm=%d, key=%f: %d\r\n", rpm, engineLoad, (int) (100 * value)); - - scheduleMsg(&logger2, "fuel map value = %f", value); -} - -static char buffer[10]; -static char dateBuffer[30]; - -void updateHD44780lcd(void) { - - lcd_HD44780_set_position(0, 9); - lcd_HD44780_print_char('R'); - lcd_HD44780_set_position(0, 10); - - char * ptr = itoa10(buffer, getRpm()); - ptr[0] = 0; - int len = ptr - buffer; - for (int i = 0; i < 6 - len; i++) - lcd_HD44780_print_char(' '); - - lcd_HD44780_print_string(buffer); - - - lcd_HD44780_set_position(2, 0); - lcd_HD44780_print_char('C'); - - ftoa(buffer, getCoolantTemperature(), 100); - lcd_HD44780_print_string(buffer); - -#if EFI_PROD_CODE - dateToString(dateBuffer); - lcd_HD44780_set_position(1, 0); - lcd_HD44780_print_string(dateBuffer); -#endif /* EFI_PROD_CODE */ -} -#endif /* EFI_PROD_CODE */ - -static WORKING_AREA(lcdThreadStack, UTILITY_THREAD_STACK_SIZE); - -static void lcdThread(void *arg) { - chRegSetThreadName("lcd"); - while (true) { -#if EFI_HD44780_LCD - updateHD44780lcd(); -#endif - chThdSleepMilliseconds(50); - } -} - -static WORKING_AREA(tsThreadStack, UTILITY_THREAD_STACK_SIZE); - -static void tsStatusThread(void *arg) { - chRegSetThreadName("tuner s"); - while (true) { -#if EFI_TUNER_STUDIO - // sensor state for EFI Analytics Tuner Studio - updateTunerStudioState(); -#endif /* EFI_TUNER_STUDIO */ - chThdSleepMilliseconds(50); - } -} - -void initStatusLoop(void) { -#if EFI_PROD_CODE || EFI_SIMULATOR - initLoggingExt(&logger, "status loop", LOGGING_BUFFER, sizeof(LOGGING_BUFFER)); -#endif /* EFI_PROD_CODE || EFI_SIMULATOR */ - - setFullLog(INITIAL_FULL_LOG); - addConsoleActionI(FULL_LOGGING_KEY, setFullLog); - addConsoleActionI("warn", setWarningEnabled); - -#if EFI_PROD_CODE - initLogging(&logger2, "main event handler"); - - addConsoleActionII("sfm", showFuelMap); - - addConsoleAction("status", printStatus); -#endif /* EFI_PROD_CODE */ - -#if EFI_FILE_LOGGING - initLogging(&fileLogger, "file logger"); -#endif /* EFI_FILE_LOGGING */ - -} - -void startStatusThreads(void) { - // todo: refactoring needed, this file should probably be split into pieces - chThdCreateStatic(lcdThreadStack, sizeof(lcdThreadStack), NORMALPRIO, (tfunc_t) lcdThread, NULL); - chThdCreateStatic(tsThreadStack, sizeof(tsThreadStack), NORMALPRIO, (tfunc_t) tsStatusThread, NULL); -} - -void setFullLog(int value) { - print("Setting full logging: %s\r\n", boolean2string(value)); - printMsg(&logger, "%s%d", FULL_LOGGING_KEY, value); - fullLog = value; -} - -int getFullLog(void) { - return fullLog; -} diff --git a/firmware/controllers/algo/accel_enrichmemnt.cpp b/firmware/controllers/algo/accel_enrichmemnt.cpp deleted file mode 100644 index 7c3126c733..0000000000 --- a/firmware/controllers/algo/accel_enrichmemnt.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * @file accel_enrichmemnt.cpp - * @brief accel_enrichmemnt calculator - * - * @date Apr 21, 2014 - * @author Dmitry Sidin - * @author Andrey Belomutskiy (c) 2012-2014 - */ - -#include "accel_enrichmemnt.h" -#include "engine_configuration.h" - -extern engine_configuration_s *engineConfiguration; - -float AccelEnrichmemnt::getEnrichment(float engineLoad) { - - for (int i = 0; i == 4; i++) { - engineLoadD[i] = engineLoadD[i + 1]; - } - engineLoadD[0] = engineLoad; - float Dcurr = engineLoadD[1] - engineLoadD[0]; - float Dold = engineLoadD[3] - engineLoadD[2]; - float diffEnrichment = ((3 * Dcurr + Dold) / 4) - * (engineConfiguration->diffLoadEnrichmentCoef); - - return diffEnrichment; -} - diff --git a/firmware/controllers/algo/accel_enrichmemnt.h b/firmware/controllers/algo/accel_enrichmemnt.h deleted file mode 100644 index 91ff0250fb..0000000000 --- a/firmware/controllers/algo/accel_enrichmemnt.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * @file accel_enrichmemnt.h - * @brief accel_enrichmemnt calculator - * - * @date Apr 21, 2014 - * @author Dmitry Sidin - * @author Andrey Belomutskiy (c) 2012-2014 - */ - -#ifndef EVENTQUEUE_H_ -#define EVENTQUEUE_H_ - -class AccelEnrichmemnt { -public: - float getEnrichment(float engineLoad); -private: - float engineLoadD[5]; -}; - -#endif /* EVENTQUEUE_H_ */ diff --git a/firmware/controllers/algo/algo.c b/firmware/controllers/algo/algo.c deleted file mode 100644 index d8caef6a54..0000000000 --- a/firmware/controllers/algo/algo.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * @file algo.c - * - * @date Mar 2, 2014 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - */ - -#include "global.h" -#include "algo.h" -//#include "rpm_calculator.h" -#include "advance_map.h" -#include "fuel_math.h" -#include "wave_chart.h" -#include "settings.h" -#include "signal_executor.h" - -WaveChart waveChart; - -void initAlgo(void) { -#if EFI_PROD_CODE || EFI_SIMULATOR - initSettings(); - initSignalExecutor(); -#endif - -#if EFI_WAVE_CHART - initWaveChart(&waveChart); -#endif - - - prepareFuelMap(); - prepareTimingMap(); - - -} diff --git a/firmware/controllers/algo/engine_configuration.c b/firmware/controllers/algo/engine_configuration.c deleted file mode 100644 index a2637e2719..0000000000 --- a/firmware/controllers/algo/engine_configuration.c +++ /dev/null @@ -1,370 +0,0 @@ -/** - * @file engine_controller.c - * @brief Utility method related to the engine configuration data structure. - * - * @date Nov 22, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - * - */ - -#include "main.h" -#include "engine_configuration.h" -#include "allsensors.h" -#include "interpolation.h" -#include "trigger_decoder.h" -#include "engine_math.h" - -#if EFI_PROD_CODE -#include "tunerstudio.h" -#endif - -#include "audi_aan.h" -#include "dodge_neon.h" -#include "ford_aspire.h" -#include "ford_fiesta.h" -#include "ford_1995_inline_6.h" -#include "snow_blower.h" -#include "nissan_primera.h" -#include "honda_accord.h" -#include "GY6_139QMB.h" -#include "mazda_miata_nb.h" -#include "mazda_323.h" -#include "saturn_ion.h" -#include "MiniCooperR50.h" -#include "ford_escort_gt.h" -#include "citroenBerlingoTU3JP.h" - -#define ADC_CHANNEL_FAST_ADC 256 - -static volatile int globalConfigurationVersion = 0; - -int getGlobalConfigurationVersion(void) { - return globalConfigurationVersion; -} - -void incrementGlobalConfigurationVersion(void) { - globalConfigurationVersion++; -} - - -/** - * @brief Sets the same dwell time across the whole getRpm() range - */ -void setConstantDwell(engine_configuration_s *engineConfiguration, float dwellMs) { - for (int i = 0; i < DWELL_CURVE_SIZE; i++) { - engineConfiguration->sparkDwellBins[i] = 1000 * i; - engineConfiguration->sparkDwell[i] = dwellMs; - } -} - -void initBpsxD1Sensor(afr_sensor_s *sensor) { - /** - * This decodes BPSX D1 Wideband Controller analog signal - */ - sensor->v1 = 0; - sensor->value1 = 9; - sensor->v2 = 5; - sensor->value2 = 19; -} - -void setWholeFuelMap(engine_configuration_s *engineConfiguration, float value) { - for (int l = 0; l < FUEL_LOAD_COUNT; l++) { - for (int r = 0; r < FUEL_RPM_COUNT; r++) { - engineConfiguration->fuelTable[l][r] = value; - } - } -} - -/** - * @brief Global default engine configuration - * This method sets the default global engine configuration. These values are later overridden by engine-specific defaults - * and the settings saves in flash memory. - */ -void setDefaultConfiguration(engine_configuration_s *engineConfiguration, - board_configuration_s *boardConfiguration) { - memset(engineConfiguration, 0, sizeof(engine_configuration_s)); - memset(boardConfiguration, 0, sizeof(board_configuration_s)); - - engineConfiguration->injectorLag = 0.0; - - for (int i = 0; i < IAT_CURVE_SIZE; i++) { - engineConfiguration->iatFuelCorrBins[i] = -40 + i * 10; - engineConfiguration->iatFuelCorr[i] = 1; // this correction is a multiplier - } - - for (int i = 0; i < CLT_CURVE_SIZE; i++) { - engineConfiguration->cltFuelCorrBins[i] = -40 + i * 10; - engineConfiguration->cltFuelCorr[i] = 1; // this correction is a multiplier - } - -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, -40, 1.5); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, -30, 1.5); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, -20, 1.42); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, -10, 1.36); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, 0, 1.28); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, 10, 1.19); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, 20, 1.12); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, 30, 1.10); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, 40, 1.06); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, 50, 1.06); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, 60, 1.03); -// setTableValue(engineConfiguration->cltFuelCorrBins, engineConfiguration->cltFuelCorr, CLT_CURVE_SIZE, 70, 1.01); - - for (int i = 0; i < VBAT_INJECTOR_CURVE_SIZE; i++) { - engineConfiguration->battInjectorLagCorrBins[i] = 12 - VBAT_INJECTOR_CURVE_SIZE / 2 + i; - engineConfiguration->battInjectorLagCorr[i] = 0; // zero extra time by default - } - - setConstantDwell(engineConfiguration, 4); // 4ms is global default dwell - - setFuelLoadBin(engineConfiguration, 1.2, 4.4); - setFuelRpmBin(engineConfiguration, 800, 7000); - setTimingLoadBin(engineConfiguration, 1.2, 4.4); - setTimingRpmBin(engineConfiguration, 800, 7000); - - setTableBin(engineConfiguration->map.config.samplingAngleBins, MAP_ANGLE_SIZE, 800, 7000); - setTableBin(engineConfiguration->map.config.samplingWindowBins, MAP_ANGLE_SIZE, 800, 7000); - - // set_whole_timing_map 3 - setWholeFuelMap(engineConfiguration, 3); - - setThermistorConfiguration(&engineConfiguration->cltThermistorConf, 0, 9500, 23.8889, 2100, 48.8889, 1000); - engineConfiguration->cltThermistorConf.bias_resistor = 1500; - - setThermistorConfiguration(&engineConfiguration->iatThermistorConf, 32, 9500, 75, 2100, 120, 1000); -// todo: this value is way off! I am pretty sure temp coeffs are off also - engineConfiguration->iatThermistorConf.bias_resistor = 2700; - - engineConfiguration->rpmHardLimit = 7000; - engineConfiguration->crankingSettings.crankingRpm = 550; - - engineConfiguration->analogInputDividerCoefficient = 2; - - engineConfiguration->crankingChargeAngle = 70; - engineConfiguration->timingMode = TM_DYNAMIC; - engineConfiguration->fixedModeTiming = 50; - - engineConfiguration->analogChartMode = AC_TRIGGER; - - engineConfiguration->map.channel = ADC_CHANNEL_FAST_ADC; - - engineConfiguration->firingOrder = FO_1_THEN_3_THEN_4_THEN2; - engineConfiguration->crankingInjectionMode = IM_SIMULTANEOUS; - engineConfiguration->injectionMode = IM_SEQUENTIAL; - - engineConfiguration->ignitionMode = IM_ONE_COIL; - engineConfiguration->globalTriggerAngleOffset = 0; - engineConfiguration->injectionOffset = 0; - engineConfiguration->ignitionOffset = 0; - engineConfiguration->overrideCrankingIgnition = TRUE; - engineConfiguration->analogChartFrequency = 20; - - engineConfiguration->engineLoadMode = LM_MAF; - - engineConfiguration->vbattDividerCoeff = ((float)(15 + 65)) / 15; - - engineConfiguration->fanOnTemperature = 75; - engineConfiguration->fanOffTemperature = 70; - - engineConfiguration->tpsMin = convertVoltageTo10bitADC(1.250); - engineConfiguration->tpsMax = convertVoltageTo10bitADC(4.538); - - engineConfiguration->can_nbc_type = CAN_BUS_NBC_BMW; - engineConfiguration->can_sleep_period = 50; - engineConfiguration->canReadEnabled = TRUE; - engineConfiguration->canWriteEnabled = FALSE; - - /** - * 0.5 means primary position sensor is on a camshaft - */ - engineConfiguration->rpmMultiplier = 0.5; - engineConfiguration->cylindersCount = 4; - - - engineConfiguration->displayMode = DM_HD44780; - - engineConfiguration->logFormat = LF_NATIVE; - - engineConfiguration->triggerConfig.triggerType = TT_TOOTHED_WHEEL; - engineConfiguration->triggerConfig.syncRatioFrom = 1.5; - engineConfiguration->triggerConfig.syncRatioTo = 3; - engineConfiguration->triggerConfig.isSynchronizationNeeded = TRUE; - engineConfiguration->triggerConfig.useRiseEdge = TRUE; - - - engineConfiguration->HD44780width = 16; - engineConfiguration->HD44780height = 2; - - - engineConfiguration->tpsAdcChannel = 3; - engineConfiguration->vBattAdcChannel = 5; - engineConfiguration->cltAdcChannel = 6; - engineConfiguration->iatAdcChannel = 7; - engineConfiguration->mafAdcChannel = 0; - engineConfiguration->afrSensor.afrAdcChannel = 14; - - initBpsxD1Sensor(&engineConfiguration->afrSensor); - - engineConfiguration->globalFuelCorrection = 1; - - engineConfiguration->needSecondTriggerInput = TRUE; - - engineConfiguration->map.config.mapType = MT_CUSTOM; - engineConfiguration->map.config.Min = 0; - engineConfiguration->map.config.Max = 500; - - engineConfiguration->diffLoadEnrichmentCoef = 1; - - boardConfiguration->idleValvePin = GPIOE_2; - boardConfiguration->idleValvePinMode = OM_DEFAULT; - boardConfiguration->fuelPumpPin = GPIOC_13; - boardConfiguration->fuelPumpPinMode = OM_DEFAULT; - boardConfiguration->electronicThrottlePin1 = GPIOC_9; - - boardConfiguration->injectionPins[0] = GPIOB_9; - boardConfiguration->injectionPins[1] = GPIOB_8; - boardConfiguration->injectionPins[2] = GPIOE_3; - boardConfiguration->injectionPins[3] = GPIOE_5; - boardConfiguration->injectionPins[4] = GPIOE_6; - boardConfiguration->injectionPins[5] = GPIOC_12; - boardConfiguration->injectionPinMode = OM_DEFAULT; - - boardConfiguration->ignitionPins[0] = GPIOC_7; - boardConfiguration->ignitionPins[1] = GPIOE_4; // todo: update this value - boardConfiguration->ignitionPins[2] = GPIOE_0; // todo: update this value - boardConfiguration->ignitionPins[3] = GPIOE_1; // todo: update this value - boardConfiguration->ignitionPinMode = OM_DEFAULT; - - boardConfiguration->malfunctionIndicatorPin = GPIOC_9; - boardConfiguration->malfunctionIndicatorPinMode = OM_DEFAULT; - - boardConfiguration->fanPin = GPIOC_15; - boardConfiguration->fanPinMode = OM_DEFAULT; - - boardConfiguration->idleSwitchPin = GPIOC_8; - - boardConfiguration->triggerSimulatorPins[0] = GPIOD_1; - boardConfiguration->triggerSimulatorPins[1] = GPIOD_2; - - boardConfiguration->triggerSimulatorPinModes[0] = OM_DEFAULT; - boardConfiguration->triggerSimulatorPinModes[1] = OM_DEFAULT; - - boardConfiguration->HD44780_rs = GPIOE_9; - boardConfiguration->HD44780_e = GPIOE_11; - boardConfiguration->HD44780_db4 = GPIOE_13; - boardConfiguration->HD44780_db5 = GPIOE_15; - boardConfiguration->HD44780_db6 = GPIOB_11; - boardConfiguration->HD44780_db7 = GPIOB_13; -} - -void setDefaultNonPersistentConfiguration(engine_configuration2_s *engineConfiguration2) { - /** - * 720 is the range for four stroke - */ - engineConfiguration2->crankAngleRange = 720; - - engineConfiguration2->hasMapSensor = TRUE; - engineConfiguration2->hasCltSensor = TRUE; -} - -void resetConfigurationExt(engine_type_e engineType, - engine_configuration_s *engineConfiguration, - engine_configuration2_s *engineConfiguration2, - board_configuration_s *boardConfiguration) { - /** - * Let's apply global defaults first - */ - setDefaultConfiguration(engineConfiguration, boardConfiguration); - engineConfiguration->engineType = engineType; - /** - * And override them with engine-specific defaults - */ - switch (engineType) { -#if EFI_SUPPORT_DODGE_NEON || defined(__DOXYGEN__) - case DODGE_NEON_1995: - setDodgeNeonEngineConfiguration(engineConfiguration, boardConfiguration); - break; -#endif /* EFI_SUPPORT_DODGE_NEON */ -#if EFI_SUPPORT_FORD_ASPIRE || defined(__DOXYGEN__) - case FORD_ASPIRE_1996: - setFordAspireEngineConfiguration(engineConfiguration, boardConfiguration); - break; -#endif /* EFI_SUPPORT_FORD_ASPIRE */ -#if EFI_SUPPORT_FORD_FIESTA || defined(__DOXYGEN__) - case FORD_FIESTA: - setFordFiestaDefaultEngineConfiguration(engineConfiguration); - break; -#endif /* EFI_SUPPORT_FORD_FIESTA */ -#if EFI_SUPPORT_NISSAN_PRIMERA || defined(__DOXYGEN__) - case NISSAN_PRIMERA: - setNissanPrimeraEngineConfiguration(engineConfiguration); - break; -#endif - case HONDA_ACCORD: - setHondaAccordConfiguration(engineConfiguration); - break; -#if EFI_SUPPORT_1995_FORD_INLINE_6 || defined(__DOXYGEN__) - case FORD_INLINE_6_1995: - setFordInline6(engineConfiguration, boardConfiguration); - break; -#endif /* EFI_SUPPORT_1995_FORD_INLINE_6 */ - case GY6_139QMB: - setGy6139qmbDefaultEngineConfiguration(engineConfiguration); - break; - case MAZDA_MIATA_NB: - setMazdaMiataNbEngineConfiguration(engineConfiguration, boardConfiguration); - break; - case MAZDA_323: - setMazda323EngineConfiguration(engineConfiguration); - break; - case SATURN_ION_2004: - setSaturnIonEngineConfiguration(engineConfiguration); - break; - case MINI_COOPER_R50: - setMiniCooperR50(engineConfiguration, boardConfiguration); - break; - case FORD_ESCORT_GT: - setFordEscortGt(engineConfiguration, boardConfiguration); - break; - case CITROEN_TU3JP: - setCitroenBerlingoTU3JPConfiguration(engineConfiguration, boardConfiguration); - break; - default: - firmwareError("Unexpected engine type: %d", engineType); - - } - applyNonPersistentConfiguration(engineConfiguration, engineConfiguration2, engineType); - -#if EFI_TUNER_STUDIO - syncTunerStudioCopy(); -#endif -} - -void applyNonPersistentConfiguration(engine_configuration_s *engineConfiguration, engine_configuration2_s *engineConfiguration2, engine_type_e engineType) { -// todo: this would require 'initThermistors() to re-establish a reference, todo: fix -// memset(engineConfiguration2, 0, sizeof(engine_configuration2_s)); - - - engineConfiguration2->isInjectionEnabledFlag = TRUE; - - initializeTriggerShape(engineConfiguration, engineConfiguration2); - chDbgCheck(engineConfiguration2->triggerShape.size != 0, "size is zero"); - chDbgCheck(engineConfiguration2->triggerShape.shaftPositionEventCount, "shaftPositionEventCount is zero"); - - prepareOutputSignals(engineConfiguration, engineConfiguration2); - initializeIgnitionActions(0, engineConfiguration, engineConfiguration2); - -} diff --git a/firmware/controllers/algo/engine_configuration.h b/firmware/controllers/algo/engine_configuration.h index 2ea9703e82..e850d48c49 100644 --- a/firmware/controllers/algo/engine_configuration.h +++ b/firmware/controllers/algo/engine_configuration.h @@ -331,7 +331,7 @@ const char* getConfigurationName(engine_configuration_s *engineConfiguration); void setDefaultConfiguration(engine_configuration_s *engineConfiguration, board_configuration_s *boardConfiguration); void setWholeFuelMap(engine_configuration_s *engineConfiguration, float value); void setConstantDwell(engine_configuration_s *engineConfiguration, float dwellMs); -void printFloatArray(char *prefix, float array[], int size); +void printFloatArray(const char *prefix, float array[], int size); void incrementGlobalConfigurationVersion(void); diff --git a/firmware/controllers/algo/error_handling.h b/firmware/controllers/algo/error_handling.h index f3aea667f1..9b6976ba81 100644 --- a/firmware/controllers/algo/error_handling.h +++ b/firmware/controllers/algo/error_handling.h @@ -32,7 +32,7 @@ int hasFatalError(void); void fatal3(char *msg, char *file, int line); #define fatal(x) (fatal3(x, __FILE__, __LINE__)); -void chDbgPanic3(const char *msg, char * file, int line); +void chDbgPanic3(const char *msg, const char * file, int line); void initErrorHandling(void); diff --git a/firmware/controllers/algo/signal_executor_single_timer_algo.c b/firmware/controllers/algo/signal_executor_single_timer_algo.c deleted file mode 100644 index f18747c00c..0000000000 --- a/firmware/controllers/algo/signal_executor_single_timer_algo.c +++ /dev/null @@ -1,74 +0,0 @@ -/** - * @file signal_executor_single_timer_algo.c - * - * @date Nov 28, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - */ - -#include "signal_executor.h" -#include "signal_executor_single_timer_algo.h" -#include "main.h" -#include "utlist.h" -#include "io_pins.h" - -#if EFI_WAVE_ANALYZER -#include "wave_analyzer.h" -#include "wave_chart.h" -extern WaveChart waveChart; -#endif - -#if EFI_SIGNAL_EXECUTOR_SINGLE_TIMER -/** - * @brief Output list - * - * List of all active output signals - * This is actually the head of the list. - * When the list is empty (initial state) the head of the list should be NULL. - * This is by design. - */ -OutputSignal *st_output_list = NULL; - -inline void registerSignal(OutputSignal *signal) { - LL_APPEND(st_output_list, signal); -} - -void setOutputPinValue(io_pin_e pin, int value); - -/** - * @return time of next event within for this signal - * @todo Find better name. - */ -inline time_t toggleSignalIfNeeded(OutputSignal *out, time_t now) { -// chDbgCheck(out!=NULL, "out is NULL"); -// chDbgCheck(out->io_pin < IO_PIN_COUNT, "pin assertion"); - time_t last = out->last_scheduling_time; - //estimated = last + out->timing[out->status]; - time_t estimated = last + GET_DURATION(out); - if (now >= estimated) { - out->status ^= 1; /* toggle status */ - //setOutputPinValue(out->io_pin, out->status); /* Toggle output */ - palWritePad(GPIOE, 5, out->status); -#if EFI_WAVE_ANALYZER -// addWaveChartEvent(out->name, out->status ? "up" : "down", ""); -#endif /* EFI_WAVE_ANALYZER */ - -// out->last_scheduling_time = now; /* store last update */ - estimated = now + GET_DURATION(out); /* update estimation */ - } - return estimated - now; -} -#endif /* EFI_SIGNAL_EXECUTOR_SINGLE_TIMER */ diff --git a/firmware/controllers/algo/signal_executor_single_timer_algo.h b/firmware/controllers/algo/signal_executor_single_timer_algo.h deleted file mode 100644 index 405ca0bd8b..0000000000 --- a/firmware/controllers/algo/signal_executor_single_timer_algo.h +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @file signal_executor_single_timer_algo.h - * - * @date Nov 28, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#ifndef SIGNAL_EXECUTOR_SINGLE_TIMER_ALGO_H_ -#define SIGNAL_EXECUTOR_SINGLE_TIMER_ALGO_H_ - -#include "signal_executor.h" - -#define GET_DURATION(o) ((o)->status ? (o)->signalTimerDown.moment : (o)->signalTimerUp.moment) - -inline void registerSignal(OutputSignal *signal); -inline time_t toggleSignalIfNeeded(OutputSignal *out, time_t now); - -#endif /* SIGNAL_EXECUTOR_SINGLE_TIMER_ALGO_H_ */ diff --git a/firmware/controllers/alternatorController.c b/firmware/controllers/alternatorController.c deleted file mode 100644 index f15173afba..0000000000 --- a/firmware/controllers/alternatorController.c +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file alternatorController.c - * @brief alternator controller - * - * @date Apr 6, 2014 - * @author Dmitry Sidin - * @author Andrey Belomutskiy (c) 2012-2014 - */ - -#include "main.h" -#include "rpm_calculator.h" -#include "pwm_generator.h" -#include "wave_math.h" -#include "alternatorController.h" -#include "pin_repository.h" -#include "engine_configuration.h" -#include "voltage.h" - -#if 0 - -extern board_configuration_s *boardConfiguration; - -#define ALTERNATOR_VALVE_PWM_FREQUENCY 30000 - -static PwmConfig alternatorControl; - -static WORKING_AREA(ivThreadStack, UTILITY_THREAD_STACK_SIZE); - -static msg_t AltCtrlThread(int param) { - chRegSetThreadName("AlternatorController"); - int alternatorDutyCycle = 500; - while (TRUE) { - chThdSleepMilliseconds(10); - - if ( getVBatt() > 14.2 ) - alternatorDutyCycle = alternatorDutyCycle + 1 ; - else - alternatorDutyCycle = alternatorDutyCycle - 1; - - - if (alternatorDutyCycle < 150 ) - alternatorDutyCycle = 150; - if (alternatorDutyCycle > 950) - alternatorDutyCycle = 950; - setSimplePwmDutyCycle(&alternatorControl, 0.001 * alternatorDutyCycle); - } -#if defined __GNUC__ - return -1; -#endif -} - -void initAlternatorCtrl() { - startSimplePwm(&alternatorControl, "Alternator control", - boardConfiguration->alternatorControlPin, - 0.5, - ALTERNATOR_VALVE_PWM_FREQUENCY, - ALTERNATOR_SWITCH - ); - chThdCreateStatic(ivThreadStack, sizeof(ivThreadStack), LOWPRIO, (tfunc_t)AltCtrlThread, NULL); -} - -#endif diff --git a/firmware/controllers/electronic_throttle.c b/firmware/controllers/electronic_throttle.c deleted file mode 100644 index 170ed2b421..0000000000 --- a/firmware/controllers/electronic_throttle.c +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @file electronic_throttle.c - * @brief Electronic Throttle Module driver L298N - * - * todo: make this more universal if/when we get other hardware options - * - * @date Dec 7, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - */ - -#include "main.h" -#include "electronic_throttle.h" -#include "boards.h" -#include "pin_repository.h" -#include "idle_controller.h" -#include "tps.h" -#include "io_pins.h" -#include "engine_configuration.h" -#include "pwm_generator.h" -#include "pwm_generator_logic.h" - -#if EFI_ELECTRONIC_THROTTLE_BODY - -static Logging logger; -/** - * @brief Control Thread stack - */ -static WORKING_AREA(etbTreadStack, UTILITY_THREAD_STACK_SIZE); -/** - * @brief Pulse-Width Modulation state - */ -static PwmConfig etbPwm; - -static float prevTps; - -extern engine_configuration_s *engineConfiguration; -extern board_configuration_s *boardConfiguration; - -static msg_t etbThread(void *arg) { - while (TRUE) { - int tps = (int)getTPS(); - - if (tps != prevTps) { - prevTps = tps; - scheduleMsg(&logger, "tps=%d", (int) tps); - } - - // this thread is activated 10 times per second - chThdSleepMilliseconds(100); - } -#if defined __GNUC__ - return -1; -#endif -} - -static void setThrottleConsole(int level) { - scheduleMsg(&logger, "setting throttle=%d", level); - - etbPwm.multiWave.switchTimes[0] = 0.01 + (min(level, 98)) / 100.0; - print("st = %f\r\n", etbPwm.multiWave.switchTimes[0]); -} - -void initElectronicThrottle(void) { - initLogging(&logger, "Electronic Throttle"); - - engineConfiguration->tpsMin = 140; - engineConfiguration->tpsMax = 898; - - // these two lines are controlling direction -// outputPinRegister("etb1", ELECTRONIC_THROTTLE_CONTROL_1, ETB_CONTROL_LINE_1_PORT, ETB_CONTROL_LINE_1_PIN); -// outputPinRegister("etb2", ELECTRONIC_THROTTLE_CONTROL_2, ETB_CONTROL_LINE_2_PORT, ETB_CONTROL_LINE_2_PIN); - - // this line used for PWM - startSimplePwm(&etbPwm, "etb", - boardConfiguration->electronicThrottlePin1, - ELECTRONIC_THROTTLE_CONTROL_1, - 0.80, - 500); - - addConsoleActionI("e", setThrottleConsole); - chThdCreateStatic(etbTreadStack, sizeof(etbTreadStack), NORMALPRIO, (tfunc_t) etbThread, NULL); -} -#endif /* EFI_ELECTRONIC_THROTTLE_BODY */ - diff --git a/firmware/controllers/flash_main.c b/firmware/controllers/flash_main.c deleted file mode 100644 index 05842d11e3..0000000000 --- a/firmware/controllers/flash_main.c +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @file flash_main.c - * @brief Higher-level logic of saving data into internal flash memory - * - * - * @date Sep 19, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include -#include -#include -#include "flash_main.h" -#include "eficonsole.h" -#include "flash.h" -#include "rusefi.h" - -//#include "tunerstudio.h" -#include "engine_controller.h" - -#include "datalogging.h" - -#include "audi_aan.h" -#include "dodge_neon.h" -#include "ford_aspire.h" -#include "ford_fiesta.h" -#include "ford_1995_inline_6.h" -#include "snow_blower.h" -#include "nissan_primera.h" -#include "honda_accord.h" -#include "GY6_139QMB.h" - -static engine_type_e defaultEngineType = FORD_ASPIRE_1996; -//static engine_type_e defaultEngineType = DODGE_NEON_1995; - -static Logging logger; - -#if defined __GNUC__ -FlashState flashState __attribute__((section(".ccm"))); -#else -FlashState flashState; -#endif - -engine_configuration_s *engineConfiguration = &flashState.persistentConfiguration.engineConfiguration; -board_configuration_s *boardConfiguration = &flashState.persistentConfiguration.boardConfiguration; - -extern engine_configuration2_s * engineConfiguration2; - -#define FLASH_ADDR 0x08060000 - -#define FLASH_USAGE sizeof(FlashState) - -crc flashStateCrc(FlashState *state) { - return calc_crc((const crc*) &state->persistentConfiguration, sizeof(persistent_config_s)); -} - -void writeToFlash(void) { - flashState.version = FLASH_DATA_VERSION; - scheduleMsg(&logger, "FLASH_DATA_VERSION=%d", flashState.version); - crc result = flashStateCrc(&flashState); - flashState.value = result; - scheduleMsg(&logger, "Reseting flash=%d", FLASH_USAGE); - flashErase(FLASH_ADDR, FLASH_USAGE); - scheduleMsg(&logger, "Flashing with CRC=%d", result); - efitimems_t nowMs = currentTimeMillis(); - result = flashWrite(FLASH_ADDR, (const char *) &flashState, FLASH_USAGE); - scheduleMsg(&logger, "Flash programmed in (ms): %d", currentTimeMillis() - nowMs); - scheduleMsg(&logger, "Flashed: %d", result); -} - -static int isValidCrc(FlashState *state) { - if (state->version != FLASH_DATA_VERSION) { - scheduleMsg(&logger, "Unexpected flash version: %d", state->version); - return FALSE; - } - crc result = flashStateCrc(state); - int isValidCrc = result == state->value; - if (!isValidCrc) - scheduleMsg(&logger, "CRC got %d while %d expected", result, state->value); - return isValidCrc; -} - -static void doResetConfiguration(void) { - resetConfigurationExt(engineConfiguration->engineType, engineConfiguration, engineConfiguration2, boardConfiguration); -} - -static void readFromFlash(void) { - - flashRead(FLASH_ADDR, (char *) &flashState, FLASH_USAGE); - - setDefaultNonPersistentConfiguration(engineConfiguration2); - - if (!isValidCrc(&flashState)) { - scheduleMsg(&logger, "Need to reset flash to default"); - resetConfigurationExt(defaultEngineType, engineConfiguration, engineConfiguration2, boardConfiguration); - } else { - scheduleMsg(&logger, "Got valid configuration from flash!"); - applyNonPersistentConfiguration(engineConfiguration, engineConfiguration2, engineConfiguration->engineType); - } - // we can only change the state after the CRC check - engineConfiguration->firmwareVersion = getRusEfiVersion(); -} - -void initFlash(void) { - initLogging(&logger, "Flash memory"); - print("initFlash()\r\n"); - - - addConsoleAction("readconfig", readFromFlash); - addConsoleAction("writeconfig", writeToFlash); - addConsoleAction("resetconfig", doResetConfiguration); - - readFromFlash(); -} diff --git a/firmware/controllers/idle_thread.c b/firmware/controllers/idle_thread.c deleted file mode 100644 index c72c645b7c..0000000000 --- a/firmware/controllers/idle_thread.c +++ /dev/null @@ -1,137 +0,0 @@ -/** - * @file idle_thread.c - * @brief Idle Air Control valve thread. - * - * This thread looks at current RPM and decides if it should increase or decrease IAC duty cycle. - * This file is has the hardware & scheduling logic, desired idle level lives separately - * - * - * @date May 23, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - */ - -#include "main.h" -#include "idle_controller.h" -#include "rpm_calculator.h" -#include "pwm_generator.h" -#include "wave_math.h" -#include "idle_thread.h" -#include "pin_repository.h" -#include "engine_configuration.h" - -#define IDLE_AIR_CONTROL_VALVE_PWM_FREQUENCY 200 - -static WORKING_AREA(ivThreadStack, UTILITY_THREAD_STACK_SIZE); - -static volatile int isIdleControlActive = EFI_IDLE_CONTROL; -extern board_configuration_s *boardConfiguration; - -/** - * here we keep the value we got from IDLE SWITCH input - */ -static volatile int idleSwitchState; - -static Logging logger; - -static PwmConfig idleValve; - -/** - * Idle level calculation algorithm lives in idle_controller.c - */ -static IdleValveState idle; - -int getIdleSwitch() { - return idleSwitchState; -} - -void idleDebug(char *msg, int value) { - printMsg(&logger, "%s%d", msg, value); - scheduleLogging(&logger); -} - -static void setIdleControlEnabled(int value) { - isIdleControlActive = value; - scheduleMsg(&logger, "isIdleControlActive=%d", isIdleControlActive); -} - -static void setIdleValvePwm(int value) { - // todo: change parameter type, maybe change parameter validation? - if (value < 1 || value > 999) - return; - scheduleMsg(&logger, "setting idle valve PWM %d", value); - /** - * currently IDEL level is an integer per mil (0-1000 range), and PWM takes a fioat in the 0..1 range - * todo: unify? - */ - setSimplePwmDutyCycle(&idleValve, 0.001 * value); -} - -static msg_t ivThread(int param) { - chRegSetThreadName("IdleValve"); - - int currentIdleValve = -1; - while (TRUE) { - chThdSleepMilliseconds(100); - - // this value is not used yet - idleSwitchState = palReadPad(getHwPort(boardConfiguration->idleSwitchPin), getHwPin(boardConfiguration->idleSwitchPin)); - - if (!isIdleControlActive) - continue; - - int nowSec = getTimeNowSeconds(); - - int newValue = getIdle(&idle, getRpm(), nowSec); - - if (currentIdleValve != newValue) { - currentIdleValve = newValue; - - setIdleValvePwm(newValue); - } - } -#if defined __GNUC__ - return -1; -#endif -} - -static void setIdleRpmAction(int value) { - setIdleRpm(&idle, value); - scheduleMsg(&logger, "target idle RPM %d", value); -} - -void startIdleThread() { - initLogging(&logger, "Idle Valve Control"); - - startSimplePwm(&idleValve, "Idle Valve", - boardConfiguration->idleValvePin, - 0.5, - IDLE_AIR_CONTROL_VALVE_PWM_FREQUENCY, - IDLE_VALVE - ); - - idleInit(&idle); - scheduleMsg(&logger, "initial idle %d", idle.value); - - chThdCreateStatic(ivThreadStack, sizeof(ivThreadStack), NORMALPRIO, (tfunc_t)ivThread, NULL); - - // this is idle switch INPUT - sometimes there is a switch on the throttle pedal - // this switch is not used yet - mySetPadMode("idle switch", getHwPort(boardConfiguration->idleSwitchPin), getHwPin(boardConfiguration->idleSwitchPin), PAL_MODE_INPUT); - - addConsoleActionI("set_idle_rpm", setIdleRpmAction); - addConsoleActionI("set_idle_pwm", setIdleValvePwm); - addConsoleActionI("set_idle_enabled", setIdleControlEnabled); -} diff --git a/firmware/controllers/injector_central.c b/firmware/controllers/injector_central.c deleted file mode 100644 index ecc5cd477f..0000000000 --- a/firmware/controllers/injector_central.c +++ /dev/null @@ -1,166 +0,0 @@ -/** - * @file injector_central.c - * @brief Utility methods related to fuel injection. - * - * - * @date Sep 8, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - */ - -#include "injector_central.h" -#include "main.h" -#include "engines.h" -#include "io_pins.h" -#include "signal_executor.h" -#include "main_trigger_callback.h" -#include "engine_configuration.h" -#include "pin_repository.h" - -static Logging logger; - -extern engine_configuration_s *engineConfiguration; -extern engine_configuration2_s *engineConfiguration2; -extern board_configuration_s *boardConfiguration; - -static int is_injector_enabled[MAX_INJECTOR_COUNT]; - -int isInjectionEnabled(void) { - return engineConfiguration2->isInjectionEnabledFlag; -} - -void assertCylinderId(int cylinderId, char *msg) { - int isValid = cylinderId >= 1 && cylinderId <= engineConfiguration->cylindersCount; - if (!isValid) { - // we are here only in case of a fatal issue - at this point it is fine to make some blocking i-o - //scheduleSimpleMsg(&logger, "cid=", cylinderId); - print("ERROR [%s] cid=%d\r\n", msg, cylinderId); - chDbgAssert(TRUE, "Cylinder ID", null); - } -} - -///** -// * This method schedules asynchronous fuel squirt -// */ - -/** - * @param cylinderId - from 1 to NUMBER_OF_CYLINDERS - */ -int isInjectorEnabled(int cylinderId) { - assertCylinderId(cylinderId, "isInjectorEnabled"); - return is_injector_enabled[cylinderId - 1]; -} - -static void printStatus(void) { - for (int id = 1; id <= engineConfiguration->cylindersCount; id++) { - resetLogging(&logger); - - appendPrintf(&logger, "injector%d%s", id, DELIMETER); - appendPrintf(&logger, "%d", isInjectorEnabled(id)); - appendPrintf(&logger, DELIMETER); - scheduleLogging(&logger); - } -} - -static void setInjectorEnabled(int id, int value) { - chDbgCheck(id >= 0 && id < engineConfiguration->cylindersCount, "injector id"); - is_injector_enabled[id] = value; - printStatus(); -} - -void runBench(brain_pin_e brainPin, io_pin_e pin, float onTime, float offTime, int count) { - scheduleMsg(&logger, "Running bench: ON_TIME=%f ms OFF_TIME=%fms Counter=%d", onTime, offTime, count); - scheduleMsg(&logger, "output on %s", hwPortname(brainPin)); - - for (int i = 0; i < count; i++) { - setOutputPinValue(pin, TRUE); - chThdSleep((int) (onTime * CH_FREQUENCY / 1000)); - setOutputPinValue(pin, FALSE); - chThdSleep((int) (offTime * CH_FREQUENCY / 1000)); - } - scheduleMsg(&logger, "Done!"); -} - -static volatile int needToRunBench = FALSE; -float onTime; -float offTime; -int count; -brain_pin_e brainPin; -io_pin_e pin; - -static void fuelbench(char * onStr, char *offStr, char *countStr) { - onTime = atoff(onStr); - offTime = atoff(offStr); - count = atoi(countStr); - - brainPin = boardConfiguration->injectionPins[0]; - pin = INJECTOR_1_OUTPUT; - needToRunBench = TRUE; -} - -static void sparkbench(char * onStr, char *offStr, char *countStr) { - onTime = atoff(onStr); - offTime = atoff(offStr); - count = atoi(countStr); - - brainPin = boardConfiguration->ignitionPins[0]; - pin = SPARKOUT_1_OUTPUT; - needToRunBench = TRUE; -} - -static WORKING_AREA(benchThreadStack, UTILITY_THREAD_STACK_SIZE); - -static msg_t benchThread(int param) { - chRegSetThreadName("BenchThread"); - - while (TRUE) { - while (!needToRunBench) { - chThdSleepMilliseconds(50); - } - needToRunBench = FALSE; - runBench(brainPin, pin, onTime, offTime, count); - } - return 0; -} - -void initInjectorCentral(void) { - initLogging(&logger, "InjectorCentral"); - chThdCreateStatic(benchThreadStack, sizeof(benchThreadStack), NORMALPRIO, (tfunc_t) benchThread, NULL); - - for (int i = 0; i < engineConfiguration->cylindersCount; i++) - is_injector_enabled[i] = true; - printStatus(); - - // todo: should we move this code closer to the injection logic? - // todo: dynamic initialization - // todo: consider actual cylinders count - outputPinRegisterExt2("injector1", INJECTOR_1_OUTPUT, boardConfiguration->injectionPins[0], - &boardConfiguration->injectionPinMode); - outputPinRegisterExt2("injector2", INJECTOR_2_OUTPUT, boardConfiguration->injectionPins[1], - &boardConfiguration->injectionPinMode); - outputPinRegisterExt2("injector3", INJECTOR_3_OUTPUT, boardConfiguration->injectionPins[2], - &boardConfiguration->injectionPinMode); - outputPinRegisterExt2("injector4", INJECTOR_4_OUTPUT, boardConfiguration->injectionPins[3], - &boardConfiguration->injectionPinMode); - outputPinRegisterExt2("injector5", INJECTOR_5_OUTPUT, boardConfiguration->injectionPins[4], - &boardConfiguration->injectionPinMode); - outputPinRegisterExt2("injector5", INJECTOR_6_OUTPUT, boardConfiguration->injectionPins[5], - &boardConfiguration->injectionPinMode); - - addConsoleActionII("injector", setInjectorEnabled); - - addConsoleActionSSS("fuelbench", &fuelbench); - addConsoleActionSSS("sparkbench", &sparkbench); -} diff --git a/firmware/controllers/sensors/thermistors.c b/firmware/controllers/sensors/thermistors.c deleted file mode 100644 index f63a671914..0000000000 --- a/firmware/controllers/sensors/thermistors.c +++ /dev/null @@ -1,167 +0,0 @@ -/** - * @file thermistors.c - * - * @date Feb 17, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -/** - * http://en.wikipedia.org/wiki/Thermistor - * http://en.wikipedia.org/wiki/Steinhart%E2%80%93Hart_equation - */ - -#include "main.h" -#include "thermistors.h" -#include "adc_inputs.h" -#include "engine_configuration.h" -#include "engine_math.h" - -extern engine_configuration_s *engineConfiguration; -extern engine_configuration2_s *engineConfiguration2; - -static bool_t initialized = FALSE; - -/** - * http://en.wikipedia.org/wiki/Voltage_divider - */ -float getR1InVoltageDividor(float Vout, float Vin, float r2) { - return r2 * Vin / Vout - r2; -} - -float getR2InVoltageDividor(float Vout, float Vin, float r1) { - if (Vout == 0) - return NAN; - return r1 / (Vin / Vout - 1); -} - -float getVoutInVoltageDividor(float Vin, float r1, float r2) { - return r2 * Vin / (r1 + r2); -} - -float convertResistanceToKelvinTemperature(float resistance, ThermistorConf *thermistor) { - if (resistance <= 0) { - //warning("Invalid resistance in convertResistanceToKelvinTemperature=", resistance); - return 0; - } - float logR = log(resistance); - return 1 / (thermistor->s_h_a + thermistor->s_h_b * logR + thermistor->s_h_c * logR * logR * logR); -} - -float convertKelvinToC(float tempK) { - return tempK - KELV; -} - -float convertCelciustoKelvin(float tempC) { - return tempC + KELV; -} - -float convertCelciustoF(float tempC) { - return tempC * 9 / 5 + 32; -} - -float convertFtoCelcius(float tempF) { - return (tempF - 32) / 9 * 5; -} - -float convertKelvinToFahrenheit(float kelvin) { - float tempC = convertKelvinToC(kelvin); - return convertCelciustoF(tempC); -} - -float getKelvinTemperature(float resistance, ThermistorConf *thermistor) { - chDbgCheck(thermistor!=NULL, "thermistor pointer is NULL"); - - float kelvinTemperature = convertResistanceToKelvinTemperature(resistance, thermistor); - return kelvinTemperature; -} - -float getResistance(Thermistor *thermistor) { - float voltage = getVoltageDivided(thermistor->channel); - chDbgCheck(thermistor->config != NULL, "config is null"); - float resistance = getR2InVoltageDividor(voltage, _5_VOLTS, thermistor->config->bias_resistor); - return resistance; -} - -float getTemperatureC(Thermistor *thermistor) { - chDbgCheck(initialized, "initialized"); - float resistance = getResistance(thermistor); - - float kelvinTemperature = getKelvinTemperature(resistance, thermistor->config); - return convertKelvinToC(kelvinTemperature); -} - -int isValidCoolantTemperature(float temperature) { - // I hope magic constants are appropriate here - return !cisnan(temperature) && temperature > -50 && temperature < 250; -} - -int isValidIntakeAirTemperature(float temperature) { - // I hope magic constants are appropriate here - return !cisnan(temperature) && temperature > -50 && temperature < 100; -} - -/** - * @return coolant temperature, in Celcius - */ -float getCoolantTemperature(void) { - float temperature = getTemperatureC(&engineConfiguration2->clt); - if (!isValidCoolantTemperature(temperature)) - return NAN; - return temperature; -} - -void setThermistorConfiguration(ThermistorConf * tc, float tempC1, float r1, float tempC2, float r2, float tempC3, - float r3) { - tc->tempC_1 = tempC1; - tc->resistance_1 = r1; - - tc->tempC_2 = tempC2; - tc->resistance_2 = r2; - - tc->tempC_3 = tempC3; - tc->resistance_3 = r3; -} - -void prepareThermistorCurve(ThermistorConf * config) { - float T1 = config->tempC_1 + KELV; - float T2 = config->tempC_2 + KELV; - float T3 = config->tempC_3 + KELV; - - float L1 = log(config->resistance_1); - float L2 = log(config->resistance_2); - float L3 = log(config->resistance_3); - - float Y1 = 1 / T1; - float Y2 = 1 / T2; - float Y3 = 1 / T3; - - float U2 = (Y2 - Y1) / (L2 - L1); - float U3 = (Y3 - Y1) / (L3 - L1); - - config->s_h_c = (U3 - U2) / (L3 - L2) * pow(L1 + L2 + L3, -1); - config->s_h_b = U2 - config->s_h_c * (L1 * L1 + L1 * L2 + L2 * L2); - config->s_h_a = Y1 - (config->s_h_b + L1 * L1 * config->s_h_c) * L1; -} - -float getIntakeAirTemperature(void) { - float temperature = getTemperatureC(&engineConfiguration2->iat); - if (!isValidIntakeAirTemperature(temperature)) { - warning(OBD_PCM_Processor_Fault, "unrealistic intake temperature %f", temperature); - return NAN; - } - return temperature; -} - -static void initThermistorCurve(Thermistor * t, ThermistorConf *config, int channel) { - prepareThermistorCurve(config); - t->config = config; - t->channel = channel; -} - -void initThermistors(void) { - initThermistorCurve(&engineConfiguration2->clt, &engineConfiguration->cltThermistorConf, - engineConfiguration->cltAdcChannel); - initThermistorCurve(&engineConfiguration2->iat, &engineConfiguration->iatThermistorConf, - engineConfiguration->iatAdcChannel); - initialized = TRUE; -} diff --git a/firmware/controllers/settings.cpp b/firmware/controllers/settings.cpp index bb2808e1b9..e8a3948c30 100644 --- a/firmware/controllers/settings.cpp +++ b/firmware/controllers/settings.cpp @@ -43,7 +43,7 @@ static void printIntArray(int array[], int size) { print("\r\n"); } -void printFloatArray(char *prefix, float array[], int size) { +void printFloatArray(const char *prefix, float array[], int size) { appendMsgPrefix(&logger); appendPrintf(&logger, prefix); for (int j = 0; j < size; j++) diff --git a/firmware/controllers/system/pwm_generator_logic.c b/firmware/controllers/system/pwm_generator_logic.c deleted file mode 100644 index 72836aa403..0000000000 --- a/firmware/controllers/system/pwm_generator_logic.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * @file pwm_generator_logic.c - * - * @date Mar 2, 2014 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "pwm_generator_logic.h" -#include "engine_math.h" - -static uint64_t getNextSwitchTimeUs(PwmConfig *state) { - chDbgAssert(state->safe.phaseIndex < PWM_PHASE_MAX_COUNT, "phaseIndex range", NULL); - int iteration = state->safe.iteration; - float switchTime = state->multiWave.switchTimes[state->safe.phaseIndex]; - float periodMs = state->safe.periodMs; -#if DEBUG_PWM - scheduleMsg(&logger, "iteration=%d switchTime=%f period=%f", iteration, switchTime, period); -#endif - - uint64_t timeToSwitchUs = (iteration + switchTime) * periodMs * 1000; - -#if DEBUG_PWM - scheduleMsg(&logger, "start=%d timeToSwitch=%d", state->safe.start, timeToSwitch); -#endif - return state->safe.startUs + timeToSwitchUs; -} - -static uint64_t togglePwmState(PwmConfig *state) { -#if DEBUG_PWM - scheduleMsg(&logger, "togglePwmState phaseIndex=%d iteration=%d", state->safe.phaseIndex, state->safe.iteration); - scheduleMsg(&logger, "state->period=%f state->safe.period=%f", state->period, state->safe.period); -#endif - - if (state->safe.phaseIndex == 0) { - if (cisnan(state->periodMs)) { - /** - * zero period means PWM is paused - */ - return 1; - } - if (state->cycleCallback != NULL) - state->cycleCallback(state); - chDbgAssert(state->periodMs != 0, "period not initialized", NULL); - if (state->safe.periodMs != state->periodMs) { - /** - * period length has changed - we need to reset internal state - */ - state->safe.startUs = getTimeNowUs(); - state->safe.iteration = 0; - state->safe.periodMs = state->periodMs; -#if DEBUG_PWM - scheduleMsg(&logger, "state reset start=%d iteration=%d", state->safe.start, state->safe.iteration); -#endif - } - } - - state->stateChangeCallback(state, - state->safe.phaseIndex == 0 ? state->multiWave.phaseCount - 1 : state->safe.phaseIndex - 1); - - uint64_t nextSwitchTimeUs = getNextSwitchTimeUs(state); -#if DEBUG_PWM - scheduleMsg(&logger, "%s: nextSwitchTime %d", state->name, nextSwitchTime); -#endif - uint64_t timeToSwitch = nextSwitchTimeUs - getTimeNowUs(); - if (timeToSwitch < 1) { -//todo: introduce error and test this error handling warning(OBD_PCM_Processor_Fault, "PWM: negative switch time"); - timeToSwitch = 10; - } - - state->safe.phaseIndex++; - if (state->safe.phaseIndex == state->multiWave.phaseCount) { - state->safe.phaseIndex = 0; // restart - state->safe.iteration++; - } - return timeToSwitch; -} - -static void timerCallback(PwmConfig *state) { - time_t timeToSleepUs = togglePwmState(state); - // parameter here is still in systicks - scheduleTask(&state->scheduling, timeToSleepUs, (schfunc_t) timerCallback, state); -} - -/** - * Incoming parameters are potentially just values on current stack, so we have to copy - * into our own permanent storage, right? - */ -void copyPwmParameters(PwmConfig *state, int phaseCount, float *switchTimes, int waveCount, int **pinStates) { - state->multiWave.phaseCount = phaseCount; - - for (int phaseIndex = 0; phaseIndex < phaseCount; phaseIndex++) { - state->multiWave.switchTimes[phaseIndex] = switchTimes[phaseIndex]; - - for (int waveIndex = 0; waveIndex < waveCount; waveIndex++) { -// print("output switch time index (%d/%d) at %f to %d\r\n", phaseIndex,waveIndex, -// switchTimes[phaseIndex], pinStates[waveIndex][phaseIndex]); - state->multiWave.waves[waveIndex].pinStates[phaseIndex] = pinStates[waveIndex][phaseIndex]; - } - } -} - -void weComplexInit(char *msg, PwmConfig *state, int phaseCount, float *switchTimes, int waveCount, int **pinStates, - pwm_cycle_callback *cycleCallback, pwm_gen_callback *stateChangeCallback) { - - chDbgCheck(state->periodMs != 0, "period is not initialized"); - chDbgCheck(phaseCount > 1, "count is too small"); - if (phaseCount > PWM_PHASE_MAX_COUNT) { - firmwareError("too many phases in PWM"); - return; - } - if (switchTimes[phaseCount - 1] != 1) { - firmwareError("last switch time has to be 1"); - return; - } - chDbgCheck(waveCount > 0, "waveCount should be positive"); - checkSwitchTimes(phaseCount, switchTimes); - - state->multiWave.waveCount = waveCount; - - copyPwmParameters(state, phaseCount, switchTimes, waveCount, pinStates); - - state->cycleCallback = cycleCallback; - state->stateChangeCallback = stateChangeCallback; - - state->safe.phaseIndex = 0; - state->safe.periodMs = -1; - state->safe.iteration = -1; - state->name = msg; - - timerCallback(state); -} diff --git a/firmware/controllers/system/signal_executor_single_timer.c b/firmware/controllers/system/signal_executor_single_timer.c deleted file mode 100644 index 9ede5b017f..0000000000 --- a/firmware/controllers/system/signal_executor_single_timer.c +++ /dev/null @@ -1,198 +0,0 @@ -/** - * @file signal_executor_single_timer.c - * @brief Single timer based implementation of signal executor. - * - * All active outputs are stored in "output_list". - * Closest in time output event is loaded in timer TIM7. - * In TIM7 timer's interrupt next closest in time output event is found and so on. - * This algorithm should reduce jitter in output signal. - * - * @todo Add test code. - * - * @date Nov 27, 2013 - * @author Dobrin Georgiev - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include -#include "hal.h" -#include "utlist.h" -#include "signal_executor.h" -#include "signal_executor_single_timer_algo.h" - -#if EFI_WAVE_ANALYZER -#include -#include "wave_chart.h" -/** - * Signal executors feed digital events right into WaveChart used by Sniffer tab of Dev Console - */ -extern WaveChart waveChart; -#endif /* EFI_WAVE_ANALYZER */ - -#if EFI_SIGNAL_EXECUTOR_SINGLE_TIMER || defined(__DOXYGEN__) -static Mutex mtx; /* Mutex declaration */ - -/** - * @brief Output list - * - * List of all active output signals - * This is actually the head of the list. - * When the list is empty (initial state) the head of the list should be NULL. - * This is by design. - */ -static OutputSignal *output_list = NULL; -#if 0 -/** - * @brief Schedule output - * - * Set new parameters to output event. - * When to become active and how long to stay active. - * - * @param [in, out] signal Signal related to an output. - * @param [in] delay the number of ticks before the output signal immediate output if delay is zero. - * @param [in] dwell the number of ticks of output duration. - */ -void scheduleOutput(OutputSignal *signal, int delay, int duration) { - chDbgCheck(signal->initialized, "Signal not initialized"); - if(duration < 0) { - firmwareError("duration cannot be negative: %d", duration) - return; - } - - signal->duration = duration; - signal->offset = delay; - - /* generate an update event to reload timer's counter value, according to new set of output timings */ - TIM7->EGR |= TIM_EGR_UG; -} -#endif -void scheduleTask(scheduling_s *scheduling, int delay, schfunc_t callback, void *param) -{ -// return; - time_t now; - - chMtxLock(&mtx); -#if 0 - static bool val = 0; - - val ^= 1; - palWritePad(GPIOE, 5, val); -#endif -#if 1 - now = chTimeNow(); - scheduling->moment = now + delay; - - /* generate an update event to reload timer's counter value, according to new set of output timings */ - TIM7->EGR |= TIM_EGR_UG; -#endif - chMtxUnlock(); -} - -#define SOURCE_DIVIDER ((STM32_HCLK) / (STM32_PCLK1)) -//#pragma message VAR_NAME_VALUE(DIVIDER) -#define PRESCALLER (84) -/* Convert chSys tick to CPU tick */ -#define ST2CT(st) ((st) * ((STM32_SYSCLK) / (CH_FREQUENCY))) -//#pragma message VAR_NAME_VALUE(STM32_SYSCLK) -#define CT2TT(ct) ((ct) / (SOURCE_DIVIDER) / (PRESCALLER)) -#define MS2TT CT2TT(ST2CT(MS2ST(1))) -//#pragma message VAR_NAME_VALUE(MS2TT) -/** - * @brief Initialization of output scheduler. - * - * TIM7 timer initial settings. - */ -void initOutputScheduler(void) -{ - /** - * @brief TIM7 initialization. Timer should run at 42MHz and before any output event registered should generate ISR event each millisecond. - */ - uint32_t initial_interval = CT2TT(ST2CT(100))-7; /// in timer ticks - //uint32_t initial_interval = CT2TT(ST2CT(MS2ST(1))); /// in timer ticks - //uint32_t initial_interval = 42000-1; /// in timer ticks - //uint32_t initial_interval = (42000/PRESCALLER)-1; /// in timer ticks - //uint32_t initial_interval = (500)-1; /// in timer ticks -#if 0 -#pragma message VAR_NAME_VALUE(STM32_PCLK1)" <= "VAR_NAME_VALUE(STM32_PCLK1_MAX) -#pragma message VAR_NAME_VALUE(STM32_PPRE1) -#endif -#if 0 - TIM2->PSC = STM32_PCLK1*2 / ((1<<16) * RC_PWM_FREQ); //50Hz frequency - TIM2->CCMR1 |= TIM_CCMR1_CC1S_0;//channel 1 = input on T1 - TIM2->DIER |= TIM_DIER_CC1IE;//enable capture/compare interrupt - TIM2->CCER |= TIM_CCER_CC1E;//Capture/Compare output enable - nvicEnableVector(TIM2_IRQn, 12); - TIM2->CR1 |= TIM_CR1_CEN;//counter enable -#endif - RCC->APB1ENR |= RCC_APB1ENR_TIM7EN; - nvicEnableVector(TIM7_IRQn, CORTEX_PRIORITY_MASK(2)); - TIM7->ARR = initial_interval; /* Timer's period */ - TIM7->PSC = PRESCALLER; - TIM7->CR1 &= ~STM32_TIM_CR1_ARPE; /* ARR register is NOT buffered, allows to update timer's period on-fly. */ - TIM7->DIER |= STM32_TIM_DIER_UIE; /* Interrupt enable */ - TIM7->CR1 |= STM32_TIM_CR1_CEN; /* Counter enable */ - chMtxInit(&mtx); /* Mutex initialization before use */ -} - -/** - * @brief Timer7 IRQ handler - * - * This is the core of "Single Timer" signal executor. - * Each time closest in time output event is found and TIM7 is loaded to generate IRQ at exact moment. - * FAST IRQ handler is used to minimize the jitter in output signal, caused by RTOS switching threads and by busy threads. - * Timer7 is used as output scheduler (to drive all outputs - spark plugs and fuel injectors). - */ -CH_FAST_IRQ_HANDLER(STM32_TIM7_HANDLER) -{ -#define MIN(a, b) (((a) > (b)) ? (b) : (a)) -#define GET_DURATION(o) ((o)->status ? (o)->signalTimerDown.moment : (o)->signalTimerUp.moment) - - OutputSignal *out; - time_t next; /* Time to next output event */ - time_t now; -#if 1 - static bool val = 0; - static uint8_t cnt = 0; - - cnt++; - cnt %= 2; - if (0 == cnt) { - val ^= 1; - palWritePad(GPIOE, 5, val); - } -#else - now = chTimeNow(); - next = 0xFFFF; - LL_FOREACH(output_list, out) { - time_t n = toggleSignalIfNeeded(out, now); - /* Find closest output event in time */ - next = MIN(next, n); - } - if (0xFFFF != next) { - TIM7->ARR = CT2TT(ST2CT(next)); /* Update scheduler timing */ - } -#endif - TIM7->SR &= ~STM32_TIM_SR_UIF; /* Reset interrupt flag */ -} - -/** - * @brief Initialize output signal. - * - * @param [in] name Signal name. - * @param [in, out] signal Output signal. - * @param [in] led LED - * @param [in] xor Option to invert output signal. - */ -void initOutputSignal(OutputSignal *signal, io_pin_e ioPin) -{ - //initLogging(&signal->logging, name); - - signal->name = getPinName(ioPin); - signal->io_pin = ioPin; - signal->status = IDLE; -// signal->duration = 0; - signal->last_scheduling_time = 0; - registerSignal(signal); - signal->initialized = TRUE; -} -#endif /* EFI_SIGNAL_EXECUTOR_SINGLE_TIMER */ diff --git a/firmware/controllers/system/signal_executor_single_timer.h b/firmware/controllers/system/signal_executor_single_timer.h deleted file mode 100644 index b29c6591f3..0000000000 --- a/firmware/controllers/system/signal_executor_single_timer.h +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @file signal_executor_single_timer.h - * - * @author Dobrin Georgiev - * @author Andrey Belomutskiy, (c) 2012-2014 - * @date Nov 27, 2013 - */ - -#ifndef SIGNAL_EXECUTOR_SINGLE_TIMER_H_ -#define SIGNAL_EXECUTOR_SINGLE_TIMER_H_ - -#if EFI_SIGNAL_EXECUTOR_SINGLE_TIMER || defined(__DOXYGEN__) - -void initOutputScheduler(void); - -#endif /* EFI_SIGNAL_EXECUTOR_SINGLE_TIMER */ -#endif /* SIGNAL_EXECUTOR_SINGLE_TIMER_H_ */ diff --git a/firmware/controllers/trigger/rpm_calculator.c b/firmware/controllers/trigger/rpm_calculator.c deleted file mode 100644 index 64b866b9e3..0000000000 --- a/firmware/controllers/trigger/rpm_calculator.c +++ /dev/null @@ -1,181 +0,0 @@ -/** - * @file rpm_calculator.c - * @brief RPM calculator - * - * Here we listen to position sensor events in order to figure our if engine is currently running or not. - * Actual getRpm() is calculated once per crankshaft revolution, based on the amount of time passed - * since the start of previous shaft revolution. - * - * @date Jan 1, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "main.h" -#include "rpm_calculator.h" -#include "trigger_central.h" -#include "engine_configuration.h" -#include "engine_math.h" -#if EFI_PROD_CODE || EFI_SIMULATOR -#include "analog_chart.h" -#endif /* EFI_PROD_CODE */ - -#include "wave_chart.h" -#include "rfiutil.h" - -static rpm_s rpmState; - -#define UNREALISTIC_RPM 30000 - -#define TOP_DEAD_CENTER_MESSAGE "r" - -extern engine_configuration_s *engineConfiguration; -extern engine_configuration2_s *engineConfiguration2; -extern WaveChart waveChart; - -static Logging logger; - -/** - * @return true if there was a full shaft revolution within the last second - */ -int isRunning() { - uint64_t nowUs = getTimeNowUs(); - return nowUs - rpmState.lastRpmEventTimeUs < US_PER_SECOND; -} - -uint64_t getLastRpmEventTime(void) { - return rpmState.lastRpmEventTimeUs; -} - -int isCranking(void) { - int rpm = getRpm(); - return isCrankingR(rpm); -} - -/** - * @return -1 in case of isNoisySignal(), current RPM otherwise - */ -int getRpm() { - if (!isRunning()) - return 0; - return rpmState.rpm; -} - -/** - * @return Current crankshaft angle, 0 to 720 for four-stroke - */ -float getCrankshaftAngle(uint64_t timeUs) { - uint64_t timeSinceZeroAngle = timeUs - rpmState.lastRpmEventTimeUs; - - float cRevolutionTimeMs = getCrankshaftRevolutionTimeMs(rpmState.rpm); - - return 360.0 * timeSinceZeroAngle / cRevolutionTimeMs / 1000; -} - -int getRevolutionCounter(void) { - return rpmState.revolutionCounter; -} - -/** - * Checks for noise on the trigger input line. Noise is detected by an unexpectedly small time gap between - * current and previous trigger input events. - * - * @return TRUE if noise is detected - */ -static int isNoisySignal(rpm_s * rpmState, uint64_t nowUs) { - uint64_t diff = nowUs - rpmState->lastRpmEventTimeUs; - return diff < 1000; // that's 1ms -} - -static char shaft_signal_msg_index[15]; - -void addWaveChartEvent(char *name, char * msg, char *msg2) { - addWaveChartEvent3(&waveChart, name, msg, msg2); -} - - -/** - * @brief Shaft position callback used by RPM calculation logic. - * - * This callback is invoked on interrupt thread. - */ -static void shaftPositionCallback(ShaftEvents ckpSignalType, int index) { - itoa10(&shaft_signal_msg_index[1], index); - if (ckpSignalType == SHAFT_PRIMARY_UP) { - addWaveChartEvent("crank", "up", shaft_signal_msg_index); - } else if (ckpSignalType == SHAFT_PRIMARY_DOWN) { - addWaveChartEvent("crank", "down", shaft_signal_msg_index); - } else if (ckpSignalType == SHAFT_SECONDARY_UP) { - addWaveChartEvent("crank2", "up", shaft_signal_msg_index); - } else if (ckpSignalType == SHAFT_SECONDARY_DOWN) { - addWaveChartEvent("crank2", "down", shaft_signal_msg_index); - } - - - if (index != 0) { -#if EFI_PROD_CODE || EFI_SIMULATOR - if (engineConfiguration->analogChartMode == AC_TRIGGER) - acAddData(getCrankshaftAngle(getTimeNowUs()), 1000 * ckpSignalType + index); -#endif - return; - } - rpmState.revolutionCounter++; - - uint64_t nowUs = getTimeNowUs(); - - int hadRpmRecently = isRunning(); - - if (hadRpmRecently) { - if (isNoisySignal(&rpmState, nowUs)) { - // unexpected state. Noise? - rpmState.rpm = NOISY_RPM; - } else { - uint64_t diff = nowUs - rpmState.lastRpmEventTimeUs; - // 60000 because per minute - // * 2 because each revolution of crankshaft consists of two camshaft revolutions - // / 4 because each cylinder sends a signal - // need to measure time from the previous non-skipped event - - int rpm = (int)(60 * US_PER_SECOND / engineConfiguration->rpmMultiplier / diff); - rpmState.rpm = rpm > UNREALISTIC_RPM ? NOISY_RPM : rpm; - } - } - rpmState.lastRpmEventTimeUs = nowUs; -#if EFI_PROD_CODE || EFI_SIMULATOR - if (engineConfiguration->analogChartMode == AC_TRIGGER) - acAddData(getCrankshaftAngle(nowUs), index); -#endif -} - -static scheduling_s tdcScheduler; - -static char rpmBuffer[10]; - -static void onTdcCallback(void) { - itoa10(rpmBuffer, getRpm()); - addWaveChartEvent(TOP_DEAD_CENTER_MESSAGE, rpmBuffer, ""); -} - -static void tdcMarkCallback(ShaftEvents ckpSignalType, int index) { - if (index == 0) { - scheduleByAngle(&tdcScheduler, engineConfiguration->globalTriggerAngleOffset, (schfunc_t) onTdcCallback, NULL); - } -} - -void initRpmCalculator(void) { - initLogging(&logger, "rpm calc"); - - strcpy(shaft_signal_msg_index, "_"); - - rpmState.rpm = 0; - - // we need this initial to have not_running at first invocation - rpmState.lastRpmEventTimeUs = (uint64_t)-10 * US_PER_SECOND; - - registerShaftPositionListener(&shaftPositionCallback, "rpm reporter"); - registerShaftPositionListener(&tdcMarkCallback, "chart TDC mark"); -} - -void scheduleByAngle(scheduling_s *timer, float angle, schfunc_t callback, void *param) { - float delayMs = getOneDegreeTimeMs(getRpm()) * angle; - scheduleTask(timer, MS2US(delayMs), callback, param); -} diff --git a/firmware/controllers/trigger/trigger_central.c b/firmware/controllers/trigger/trigger_central.c deleted file mode 100644 index 2a53e21c35..0000000000 --- a/firmware/controllers/trigger/trigger_central.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * @file trigger_central.c - * - * @date Feb 23, 2014 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "main.h" -#include "trigger_central.h" -#include "trigger_decoder.h" -#include "main_trigger_callback.h" -#include "engine_configuration.h" -#include "histogram.h" -#include "rfiutil.h" -#include "listener_array.h" -#include "wave_math.h" -#include "data_buffer.h" - -#if defined __GNUC__ -static histogram_s triggerCallback __attribute__((section(".ccm"))); -#else -static histogram_s triggerCallback; -#endif - -extern engine_configuration_s *engineConfiguration; -extern engine_configuration2_s *engineConfiguration2; - -// we need this initial to have not_running at first invocation -static volatile uint64_t previousShaftEventTime = (efitimems_t) -10 * US_PER_SECOND; - -static IntListenerArray triggerListeneres; - -static Logging logging; - -static trigger_state_s triggerState; - -static volatile int shaftEventCounter; - -int getCrankEventCounter() { - return shaftEventCounter; -} - -void registerShaftPositionListener(ShaftPositionListener handler, char *msg) { - print("registerCkpListener: %s\r\n", msg); - registerCallback(&triggerListeneres, (IntListener) handler, NULL); -} - -#define HW_EVENT_TYPES 4 - -static int hwEventCounters[HW_EVENT_TYPES]; - -void hwHandleShaftSignal(ShaftEvents signal) { - chDbgCheck(engineConfiguration!=NULL, "engineConfiguration"); - chDbgCheck(engineConfiguration2!=NULL, "engineConfiguration2"); - - int beforeCallback = hal_lld_get_counter_value(); - int eventIndex = (int) signal; - chDbgCheck(eventIndex >= 0 && eventIndex < HW_EVENT_TYPES, "signal type"); - hwEventCounters[eventIndex]++; - - uint64_t nowUs = getTimeNowUs(); - - if (nowUs - previousShaftEventTime > US_PER_SECOND) { - /** - * We are here if there is a time gap between now and previous shaft event - that means the engine is not runnig. - * That means we have lost synchronization since the engine is not running :) - */ - triggerState.shaft_is_synchronized = FALSE; - } - previousShaftEventTime = nowUs; - // this is not atomic, but it's fine here - shaftEventCounter++; - - /** - * This invocation changes the state of - */ - processTriggerEvent(&triggerState, &engineConfiguration2->triggerShape, &engineConfiguration->triggerConfig, signal, - nowUs); - - if (!triggerState.shaft_is_synchronized) - return; // we should not propagate event if we do not know where we are - - if (triggerState.current_index >= engineConfiguration2->triggerShape.shaftPositionEventCount) { - int f = warning(OBD_PCM_Processor_Fault, "unexpected eventIndex=%d", triggerState.current_index); - if(!f) { - for (int i = 0; i < HW_EVENT_TYPES; i++) - scheduleMsg(&logging, "event type: %d count=%d", i, hwEventCounters[i]); - } - } else { - - /** - * Here we invoke all the listeners - the main engine control logic is inside these listeners - */ - invokeIntIntCallbacks(&triggerListeneres, signal, triggerState.current_index); - } - int afterCallback = hal_lld_get_counter_value(); - int diff = afterCallback - beforeCallback; - // this counter is only 32 bits so it overflows every minute, let's ignore the value in case of the overflow for simplicity - if (diff > 0) - hsAdd(&triggerCallback, diff); -} - -void printAllCallbacksHistogram(void) { - printHistogram(&logging, &triggerCallback); -} - -void initTriggerCentral(void) { - initLogging(&logging, "ShaftPosition"); - - memset(hwEventCounters, 0, sizeof(hwEventCounters)); - - initHistogram(&triggerCallback, "all callbacks"); - initTriggerDecoder(); - clearTriggerState(&triggerState); -} diff --git a/firmware/controllers/trigger/trigger_central.cpp b/firmware/controllers/trigger/trigger_central.cpp index 5fbb3677a5..f9093e2782 100644 --- a/firmware/controllers/trigger/trigger_central.cpp +++ b/firmware/controllers/trigger/trigger_central.cpp @@ -46,7 +46,7 @@ int getCrankEventCounter() { * Trigger event listener would be invoked on each trigger event. For example, for a 60/2 wheel * that would be 116 events: 58 SHAFT_PRIMARY_UP and 58 SHAFT_PRIMARY_DOWN events. */ -void addTriggerEventListener(ShaftPositionListener handler, char *name) { +void addTriggerEventListener(ShaftPositionListener handler, const char *name) { print("registerCkpListener: %s\r\n", name); registerCallback(&triggerListeneres, (IntListener) handler, NULL); } diff --git a/firmware/controllers/trigger/trigger_central.h b/firmware/controllers/trigger/trigger_central.h index 9265e20d13..9d55958acd 100644 --- a/firmware/controllers/trigger/trigger_central.h +++ b/firmware/controllers/trigger/trigger_central.h @@ -16,7 +16,7 @@ typedef void (*ShaftPositionListener)(ShaftEvents signal, int index); extern "C" { #endif /* __cplusplus */ -void addTriggerEventListener(ShaftPositionListener handler, char *name); +void addTriggerEventListener(ShaftPositionListener handler, const char *name); int getCrankEventCounter(void); int isSignalDecoderError(void); void hwHandleShaftSignal(ShaftEvents signal); diff --git a/firmware/controllers/trigger/trigger_mazda.c b/firmware/controllers/trigger/trigger_mazda.c deleted file mode 100644 index 905db2045b..0000000000 --- a/firmware/controllers/trigger/trigger_mazda.c +++ /dev/null @@ -1,104 +0,0 @@ -/** - * @file trigger_mazda.c - * - * @date Feb 18, 2014 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - */ - -#include "trigger_mazda.h" - -void initializeMazdaMiataNbShape(trigger_shape_s *s) { - triggerShapeInit(s); - - /** - * cam sensor is primary, crank sensor is secondary - */ - triggerAddEvent(s, 20, T_PRIMARY, 1); - - triggerAddEvent(s, 66, T_SECONDARY, TV_LOW); - triggerAddEvent(s, 70, T_SECONDARY, 1); - triggerAddEvent(s, 136, T_SECONDARY, TV_LOW); - triggerAddEvent(s, 140, T_SECONDARY, 1); - triggerAddEvent(s, 246, T_SECONDARY, TV_LOW); - triggerAddEvent(s, 250, T_SECONDARY, 1); - triggerAddEvent(s, 316, T_SECONDARY, TV_LOW); - triggerAddEvent(s, 320, T_SECONDARY, 1); - - triggerAddEvent(s, 340, T_PRIMARY, TV_LOW); - triggerAddEvent(s, 360, T_PRIMARY, 1); - - triggerAddEvent(s, 380, T_PRIMARY, TV_LOW); - triggerAddEvent(s, 400, T_PRIMARY, 1); - - triggerAddEvent(s, 426, T_SECONDARY, TV_LOW); - triggerAddEvent(s, 430, T_SECONDARY, 1); - triggerAddEvent(s, 496, T_SECONDARY, TV_LOW); - triggerAddEvent(s, 500, T_SECONDARY, 1); - triggerAddEvent(s, 606, T_SECONDARY, TV_LOW); - triggerAddEvent(s, 610, T_SECONDARY, 1); - triggerAddEvent(s, 676, T_SECONDARY, TV_LOW); - triggerAddEvent(s, 680, T_SECONDARY, 1); - - triggerAddEvent(s, 720, T_PRIMARY, TV_LOW); - - s->shaftPositionEventCount = 6 + 16; -} - -void configureMazdaProtegeLx(engine_configuration_s *engineConfiguration, - engine_configuration2_s *engineConfiguration2) { - - trigger_shape_s *s = &engineConfiguration2->triggerShape; - - triggerShapeInit(s); -// s->initialState[0] = 1; - - float w = 720 / 4 * 0.215; - float a = 5; -// triggerAddEvent(s, a, T_SECONDARY, TV_LOW); -// triggerAddEvent(s, a + w, T_SECONDARY, TV_HIGH); -// a += 180; -// triggerAddEvent(s, a, T_SECONDARY, TV_LOW); -// triggerAddEvent(s, a + w, T_SECONDARY, TV_HIGH); -// a += 180; -// triggerAddEvent(s, a, T_SECONDARY, TV_LOW); -// triggerAddEvent(s, a + w, T_SECONDARY, TV_HIGH); -// a += 180; -// triggerAddEvent(s, a, T_SECONDARY, TV_LOW); -// triggerAddEvent(s, a + w, T_SECONDARY, TV_HIGH); - - float z = 0.093; - - a = 180; - triggerAddEvent(s, a - z * 720, T_PRIMARY, TV_HIGH); - triggerAddEvent(s, a, T_PRIMARY, TV_LOW); - - a += 180; - triggerAddEvent(s, a - z * 720, T_PRIMARY, TV_HIGH); - triggerAddEvent(s, a, T_PRIMARY, TV_LOW); - - a += 180; - triggerAddEvent(s, a - z * 720, T_PRIMARY, TV_HIGH); - triggerAddEvent(s, a, T_PRIMARY, TV_LOW); - - a += 180; - triggerAddEvent(s, a - z * 720, T_PRIMARY, TV_HIGH); - triggerAddEvent(s, a, T_PRIMARY, TV_LOW); - - -// s->shaftPositionEventCount = 2 + 8; - s->shaftPositionEventCount = 8; - engineConfiguration->triggerConfig.isSynchronizationNeeded = FALSE; -} diff --git a/firmware/controllers/trigger/trigger_structure.c b/firmware/controllers/trigger/trigger_structure.c deleted file mode 100644 index a8c3e311f9..0000000000 --- a/firmware/controllers/trigger/trigger_structure.c +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file trigger_structure.c - * - * @date Jan 20, 2014 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - * This file is part of rusEfi - see http://rusefi.com - * - * rusEfi is free software; you can redistribute it and/or modify it under the terms of - * the GNU General Public License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - */ - -#include "main.h" -#include "trigger_structure.h" - -void clearTriggerState(trigger_state_s *state) { - state->shaft_is_synchronized = FALSE; - state->toothed_previous_time = 0; - state->toothed_previous_duration = 0; - state->current_index = 0; -} - -void triggerShapeInit(trigger_shape_s *trigger) { - memset(trigger, 0, sizeof(trigger_shape_s)); -} - -void triggerAddEvent(trigger_shape_s *trigger, float angle, trigger_wheel_e waveIndex, trigger_value_e state) { - angle /= 720; - if (trigger->size == 0) { - trigger->size = 1; - for (int i = 0; i < PWM_PHASE_MAX_WAVE_PER_PWM; i++) - trigger->wave.waves[i].pinStates[0] = trigger->initialState[i]; - - trigger->wave.switchTimes[0] = angle; - trigger->wave.waves[waveIndex].pinStates[0] = state; - return; - } - -// if(angle!=trigger->wave.switchTimes[trigger->currentIndex]) - - int index = trigger->size++; - - for (int i = 0; i < PWM_PHASE_MAX_WAVE_PER_PWM; i++) - trigger->wave.waves[i].pinStates[index] = trigger->wave.waves[i].pinStates[index - 1]; - trigger->wave.switchTimes[index] = angle; - trigger->wave.waves[waveIndex].pinStates[index] = state; -} - -void checkSwitchTimes(int size, float *switchTimes) { - for (int i = 0; i < size - 1; i++) - chDbgCheck(switchTimes[i] < switchTimes[i + 1], "invalid switchTimes"); -} diff --git a/firmware/hw_layer/hardware.c b/firmware/hw_layer/hardware.c deleted file mode 100644 index 563526bf03..0000000000 --- a/firmware/hw_layer/hardware.c +++ /dev/null @@ -1,171 +0,0 @@ -/** - * @file hardware.c - * @brief Hardware package entry point - * - * @date May 27, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "hardware.h" -#include "pin_repository.h" -#include "io_pins.h" -#include "rtc_helper.h" -#include "rfiutil.h" - -#include "adc_inputs.h" - -#include "trigger_input.h" -#include "eficonsole.h" -#include "board_test.h" - -#include "mcp3208.h" -#include "HIP9011.h" -#include "can_hw.h" -#include "histogram.h" -#include "mmc_card.h" -#include "neo6m.h" -#include "lcd_HD44780.h" -#include "eficonsole_logic.h" -#include "flash_main.h" -#include "trigger_central.h" -#include "svnversion.h" - -McpAdcState adcState; - -static void initSpiModule(SPIDriver *driver, ioportid_t sckPort, ioportmask_t sckPin, ioportid_t misoPort, - ioportmask_t misoPin, ioportid_t mosiPort, ioportmask_t mosiPin, int af) { - mySetPadMode("SPI clock", sckPort, sckPin, PAL_MODE_ALTERNATE(af)); - - mySetPadMode("SPI master out", mosiPort, mosiPin, PAL_MODE_ALTERNATE(af)); - mySetPadMode("SPI master in ", misoPort, misoPin, PAL_MODE_ALTERNATE(af)); -} - -void initSpiModules(void) { -#if STM32_SPI_USE_SPI2 -// scheduleMsg(&logging, "Turning on SPI2 pins"); - initSpiModule(&SPID2, - EFI_SPI2_SCK_PORT, EFI_SPI2_SCK_PIN, - EFI_SPI2_MISO_PORT, EFI_SPI2_MISO_PIN, - EFI_SPI2_MOSI_PORT, EFI_SPI2_MOSI_PIN, - EFI_SPI2_AF); -#endif -#if STM32_SPI_USE_SPI3 -// scheduleMsg(&logging, "Turning on SPI3 pins"); - initSpiModule(&SPID3, - EFI_SPI3_SCK_PORT, EFI_SPI3_SCK_PIN, - EFI_SPI3_MISO_PORT, EFI_SPI3_MISO_PIN, - EFI_SPI3_MOSI_PORT, EFI_SPI3_MOSI_PIN, - EFI_SPI3_AF); -#endif -} - -static I2CConfig i2cfg = { OPMODE_I2C, 100000, STD_DUTY_CYCLE, }; - -void initI2Cmodule(void) { - print("Starting I2C module\r\n"); - i2cInit(); - i2cStart(&I2CD1, &i2cfg); - - mySetPadMode("I2C clock", EFI_I2C_SCL_PORT, EFI_I2C_SCL_PIN, - PAL_MODE_ALTERNATE(EFI_I2C_AF) | PAL_STM32_OTYPE_OPENDRAIN); - mySetPadMode("I2C data", EFI_I2C_SDA_PORT, EFI_I2C_SDA_PIN, - PAL_MODE_ALTERNATE(EFI_I2C_AF) | PAL_STM32_OTYPE_OPENDRAIN); -} - -static char txbuf[1]; - -static void sendI2Cbyte(int addr, int data) { - i2cAcquireBus(&I2CD1); - txbuf[0] = data; - i2cMasterTransmit(&I2CD1, addr, txbuf, 1, NULL, 0); - i2cReleaseBus(&I2CD1); -} - -void initHardware() { - // todo: enable protection. it's disabled because it takes - // 10 extra seconds to re-flash the chip - //flashProtect(); - - /** - * histograms is a data structure for CPU monitor, it does not depend on configuration - */ - initHistogramsModule(); - - - - /** - * We need the LED_ERROR pin even before we read configuration - */ - initPrimaryPins(); - - /** - * this call reads configuration from flash memory or sets default configuration - * if flash state does not look right. - */ - initFlash(); - - initRtc(); - - initOutputPins(); - initAdcInputs(); - -#if EFI_HIP_9011 - initHip9011(); -#endif /* EFI_HIP_9011 */ - -#if EFI_CAN_SUPPORT - initCan(); -#endif /* EFI_CAN_SUPPORT */ - -// init_adc_mcp3208(&adcState, &SPID2); -// requestAdcValue(&adcState, 0); - - - // todo: figure out better startup logic - initTriggerCentral(); - initShaftPositionInputCapture(); - - initSpiModules(); - -#if EFI_FILE_LOGGING - initMmcCard(); -#endif /* EFI_FILE_LOGGING */ - -// initFixedLeds(); - - // initBooleanInputs(); - -#if EFI_UART_GPS - initGps(); -#endif - -#if ADC_SNIFFER - initAdcDriver(); -#endif - -#if EFI_HD44780_LCD -// initI2Cmodule(); - lcd_HD44780_init(); - - char buffer[16]; - itoa10(buffer, SVN_VERSION); - lcd_HD44780_print_string(buffer); - -#endif - - addConsoleActionII("i2c", sendI2Cbyte); - -// while (true) { -// for (int addr = 0x20; addr < 0x28; addr++) { -// sendI2Cbyte(addr, 0); -// int err = i2cGetErrors(&I2CD1); -// print("I2C: err=%x from %d\r\n", err, addr); -// chThdSleepMilliseconds(5); -// sendI2Cbyte(addr, 255); -// chThdSleepMilliseconds(5); -// } -// } - - initBoardTest(); - -} diff --git a/firmware/hw_layer/pwm_generator.c b/firmware/hw_layer/pwm_generator.c deleted file mode 100644 index cf8542158a..0000000000 --- a/firmware/hw_layer/pwm_generator.c +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @file pwm_generator.c - * @brief software PWM generator - * - * Software PWM implementation. Considering how low all frequencies are, we can totally afford a couple of float multiplications. - * By generating PWM programmatically we are saving the timers for better purposes. This implementation also supports generating - * synchronized waves as needed for example to emulate dual Hall-effect crankshaft position sensors. - * - * - * @date May 28, 2013 - * @author Andrey Belomutskiy, (c) 2012-2014 - * - */ - -#include "pwm_generator.h" - -#include "pin_repository.h" -#include "wave_math.h" -#include "datalogging.h" - -static Logging logger; - -/** - * This method controls the actual hardware pins - */ -void applyPinState(PwmConfig *state, int stateIndex) { - chDbgAssert(state->multiWave.waveCount <= PWM_PHASE_MAX_WAVE_PER_PWM, "invalid waveCount", NULL); - for (int waveIndex = 0; waveIndex < state->multiWave.waveCount; waveIndex++) { - io_pin_e ioPin = state->outputPins[waveIndex]; - chDbgAssert(stateIndex < PWM_PHASE_MAX_COUNT, "invalid stateIndex", NULL); - int value = state->multiWave.waves[waveIndex].pinStates[stateIndex]; - setOutputPinValue(ioPin, value); - } -} - -/** - * @param dutyCycle value between 0 and 1 - */ -void setSimplePwmDutyCycle(PwmConfig *state, float dutyCycle) { - state->multiWave.switchTimes[0] = dutyCycle; -} - -void startSimplePwm(PwmConfig *state, char *msg, brain_pin_e brainPin, io_pin_e ioPin, - float dutyCycle, float frequency) { - - GPIO_TypeDef * port = getHwPort(brainPin); - int pin = getHwPin(brainPin); - - float switchTimes[] = { dutyCycle, 1 }; - int pinStates0[] = { 0, 1 }; - - int *pinStates[1] = { pinStates0 }; - - state->outputPins[0] = ioPin; - - outputPinRegister(msg, state->outputPins[0], port, pin); - - state->periodMs = frequency2period(frequency); - weComplexInit(msg, state, 2, switchTimes, 1, pinStates, NULL, applyPinState); -} - -void initPwmGenerator(void) { - initLogging(&logger, "PWM gen"); -} - diff --git a/firmware/hw_layer/trigger_input.c b/firmware/hw_layer/trigger_input.c deleted file mode 100644 index b9f3d526a8..0000000000 --- a/firmware/hw_layer/trigger_input.c +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @file trigger_input.c - * @brief Position sensor hardware layer - * - * @date Dec 30, 2012 - * @author Andrey Belomutskiy, (c) 2012-2014 - */ - -#include "trigger_input.h" - -#include "wave_analyzer_hw.h" -#include "pin_repository.h" -#include "trigger_structure.h" -#include "trigger_central.h" -#include "engine_configuration.h" - -static WaveReaderHw primaryCrankInput; -static WaveReaderHw secondaryCrankInput; - -extern engine_configuration_s *engineConfiguration; - -#if EFI_SHAFT_POSITION_INPUT - -/** - * that's hardware timer input capture IRQ entry point - * 'width' events happens before the 'period' event - */ -static void shaft_icu_width_callback(ICUDriver *icup) { - int isPrimary = icup == &PRIMARY_SHAFT_POSITION_INPUT_DRIVER; - if (!isPrimary && !engineConfiguration->needSecondTriggerInput) - return; - // icucnt_t last_width = icuGetWidth(icup); so far we are fine with system time - ShaftEvents signal = isPrimary ? SHAFT_PRIMARY_UP : SHAFT_SECONDARY_UP; - - hwHandleShaftSignal(signal); -} - -static void shaft_icu_period_callback(ICUDriver *icup) { - int isPrimary = icup == &PRIMARY_SHAFT_POSITION_INPUT_DRIVER; - if (!isPrimary && !engineConfiguration->needSecondTriggerInput) - return; - - // icucnt_t last_period = icuGetPeriod(icup); so far we are fine with system time - ShaftEvents signal = isPrimary ? SHAFT_PRIMARY_DOWN : SHAFT_SECONDARY_DOWN; - 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 }; -#endif - -void initShaftPositionInputCapture(void) { - -#if EFI_SHAFT_POSITION_INPUT - - // initialize primary Input Capture Unit pin - initWaveAnalyzerDriver(&primaryCrankInput, &PRIMARY_SHAFT_POSITION_INPUT_DRIVER, PRIMARY_SHAFT_POSITION_INPUT_PORT, - PRIMARY_SHAFT_POSITION_INPUT_PIN); - /** - * Start primary Input Capture Unit using given configuration - * @see shaft_icucfg for callback entry points - */ - shaft_icucfg.channel = PRIMARY_SHAFT_POSITION_INPUT_CHANNEL; - print("initShaftPositionInputCapture 1 %s:%d\r\n", portname(PRIMARY_SHAFT_POSITION_INPUT_PORT), - PRIMARY_SHAFT_POSITION_INPUT_PIN); - icuStart(&PRIMARY_SHAFT_POSITION_INPUT_DRIVER, &shaft_icucfg); - icuEnable(&PRIMARY_SHAFT_POSITION_INPUT_DRIVER); - - // initialize secondary Input Capture Unit pin - initWaveAnalyzerDriver(&secondaryCrankInput, &SECONDARY_SHAFT_POSITION_INPUT_DRIVER, - SECONDARY_SHAFT_POSITION_INPUT_PORT, - SECONDARY_SHAFT_POSITION_INPUT_PIN); - shaft_icucfg.channel = SECONDARY_SHAFT_POSITION_INPUT_CHANNEL; - print("initShaftPositionInputCapture 2 %s:%d\r\n", portname(SECONDARY_SHAFT_POSITION_INPUT_PORT), - SECONDARY_SHAFT_POSITION_INPUT_PIN); - icuStart(&SECONDARY_SHAFT_POSITION_INPUT_DRIVER, &shaft_icucfg); - icuEnable(&SECONDARY_SHAFT_POSITION_INPUT_DRIVER); - -#else - print("crank input disabled\r\n"); -#endif -} diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index c2a0ae520a..bb1085779e 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -183,10 +183,10 @@ void scheduleReset(void) { } extern "C" { -void onFatalError(const char *msg, char * file, int line); +void onFatalError(const char *msg, const char * file, int line); } -void onFatalError(const char *msg, char * file, int line) { +void onFatalError(const char *msg, const char * file, int line) { onDbgPanic(); lcdShowFatalMessage((char *) msg); if (!main_loop_started) { @@ -235,14 +235,14 @@ int hasFatalError(void); void onFatalError(const char *msg, char * file, int line); -char *dbg_panic_file; +const char *dbg_panic_file; int dbg_panic_line; extern "C" { -void chDbgPanic3(const char *msg, char * file, int line); +void chDbgPanic3(const char *msg, const char * file, int line); } -void chDbgPanic3(const char *msg, char * file, int line) { +void chDbgPanic3(const char *msg, const char * file, int line) { if (hasFatalError()) return; dbg_panic_file = file; @@ -276,5 +276,5 @@ void firmwareError(const char *fmt, ...) { } int getRusEfiVersion(void) { - return 20140429; + return 20140430; } diff --git a/firmware/util/histogram.c b/firmware/util/histogram.c index f72c642fb1..22ef4887e8 100644 --- a/firmware/util/histogram.c +++ b/firmware/util/histogram.c @@ -79,7 +79,7 @@ int histogramGetIndex(int64_t value) { /** * @brief Reset histogram_s to orignal state */ -void initHistogram(histogram_s *h, char *name) { +void initHistogram(histogram_s *h, const char *name) { if(strlen(name) > sizeof(h->name) - 1) firmwareError("Histogram name [%s] too long", name); strcpy(h->name, name); diff --git a/firmware/util/histogram.h b/firmware/util/histogram.h index 7de0692680..2e832752c5 100644 --- a/firmware/util/histogram.h +++ b/firmware/util/histogram.h @@ -37,7 +37,7 @@ typedef struct { void initHistogramsModule(void); int histogramGetIndex(int64_t value); -void initHistogram(histogram_s *h, char *name); +void initHistogram(histogram_s *h, const char *name); void hsAdd(histogram_s *h, int64_t value); int hsReport(histogram_s *h, int* report);