From 786c57647669edd382efd5ab23299c7aff09cb9c Mon Sep 17 00:00:00 2001 From: rusEfi Date: Tue, 25 Nov 2014 20:03:18 -0600 Subject: [PATCH] auto-sync --- firmware/config/engines/bmw_e34.cpp | 2 ++ .../controllers/algo/engine_configuration.h | 4 +++- firmware/controllers/flash_main.h | 2 +- firmware/controllers/math/engine_math.cpp | 19 ++++++++++++++----- .../trigger/main_trigger_callback.cpp | 5 +++++ firmware/rusefi.cpp | 2 +- unit_tests/test_fuel_map.cpp | 4 ++-- 7 files changed, 28 insertions(+), 10 deletions(-) diff --git a/firmware/config/engines/bmw_e34.cpp b/firmware/config/engines/bmw_e34.cpp index aebfd639f8..8a5f45faa1 100644 --- a/firmware/config/engines/bmw_e34.cpp +++ b/firmware/config/engines/bmw_e34.cpp @@ -24,6 +24,8 @@ void setBmwE34(engine_configuration_s *engineConfiguration) { engineConfiguration->injectionMode = IM_SIMULTANEOUS; engineConfiguration->ignitionMode = IM_WASTED_SPARK; + engineConfiguration->ignMathCalculateAtIndex = 15; + setConstantDwell(engineConfiguration, 3); // a bit shorter dwell engineConfiguration->useConstantDwellDuringCranking = true; engineConfiguration->ignitionDwellForCrankingMs = 5; diff --git a/firmware/controllers/algo/engine_configuration.h b/firmware/controllers/algo/engine_configuration.h index bd478e8dc4..cbc18dfdb5 100644 --- a/firmware/controllers/algo/engine_configuration.h +++ b/firmware/controllers/algo/engine_configuration.h @@ -509,7 +509,9 @@ typedef struct { */ adc_channel_e acSwitchAdc; - int unused3[91]; + int ignMathCalculateAtIndex; + + int unused3[90]; } engine_configuration_s; diff --git a/firmware/controllers/flash_main.h b/firmware/controllers/flash_main.h index d92c5a7b67..415be12a7d 100644 --- a/firmware/controllers/flash_main.h +++ b/firmware/controllers/flash_main.h @@ -12,7 +12,7 @@ #include "engine_configuration.h" #include "engine.h" -#define FLASH_DATA_VERSION 5484 +#define FLASH_DATA_VERSION 5590 void readFromFlash(void); void initFlash(Engine *engine); diff --git a/firmware/controllers/math/engine_math.cpp b/firmware/controllers/math/engine_math.cpp index a62d85d12c..263564b6ae 100644 --- a/firmware/controllers/math/engine_math.cpp +++ b/firmware/controllers/math/engine_math.cpp @@ -35,6 +35,12 @@ EXTERN_ENGINE extern OutputPin outputs[IO_PIN_COUNT]; +/** + * this cache allows us to find a close-enough (with one degree precision) trigger wheel index by + * given angle with fast constant speed + */ +static int triggerIndexByAngle[720]; + /* * default Volumetric Efficiency */ @@ -110,8 +116,7 @@ void initializeIgnitionActions(float advance, float dwellAngle, IgnitionEventLis event->io_pin = pin; event->advance = localAdvance; - findTriggerPosition(&event->dwellPosition, localAdvance - dwellAngle - PASS_ENGINE_PARAMETER); + findTriggerPosition(&event->dwellPosition, localAdvance - dwellAngle PASS_ENGINE_PARAMETER); } } @@ -252,7 +257,7 @@ void findTriggerPosition(event_trigger_position_s *position, float angleOffset D angleOffset += CONFIG(globalTriggerAngleOffset); fixAngle(angleOffset); - int index = findAngleIndex(angleOffset PASS_ENGINE_PARAMETER); + int index = triggerIndexByAngle[(int)angleOffset]; float eventAngle = TRIGGER_SHAPE(eventAngles[index]); if (angleOffset < eventAngle) { firmwareError("angle constraint violation in registerActuatorEventExt(): %f/%f", angleOffset, eventAngle); @@ -328,9 +333,13 @@ void prepareOutputSignals(DECLARE_ENGINE_PARAMETER_F) { } + for (int angle = 0; angle < CONFIG(engineCycle); angle++) { + triggerIndexByAngle[angle] = findAngleIndex(angle PASS_ENGINE_PARAMETER); + } + injectonSignals.clear(); - engineConfiguration2->crankingInjectionEvents.addFuelEvents(engineConfiguration->crankingInjectionMode - PASS_ENGINE_PARAMETER); + engineConfiguration2->crankingInjectionEvents.addFuelEvents( + engineConfiguration->crankingInjectionMode PASS_ENGINE_PARAMETER); engineConfiguration2->injectionEvents.addFuelEvents(engineConfiguration->injectionMode PASS_ENGINE_PARAMETER); } diff --git a/firmware/controllers/trigger/main_trigger_callback.cpp b/firmware/controllers/trigger/main_trigger_callback.cpp index 29c09d3742..dcfdaada6d 100644 --- a/firmware/controllers/trigger/main_trigger_callback.cpp +++ b/firmware/controllers/trigger/main_trigger_callback.cpp @@ -340,10 +340,15 @@ void mainTriggerCallback(trigger_event_e ckpSignalType, uint32_t eventIndex DECL if (eventIndex == 0) { if (localVersion.isOld()) prepareOutputSignals(PASS_ENGINE_PARAMETER_F); + } + if (eventIndex == engineConfiguration->ignMathCalculateAtIndex) { engine->beforeIgnitionMath = GET_TIMESTAMP(); doSomeCalc(rpm PASS_ENGINE_PARAMETER); engine->ignitionMathTime = GET_TIMESTAMP() - engine->beforeIgnitionMath; + } + + if (eventIndex == 0) { engine->beforeIgnitionSch = GET_TIMESTAMP(); /** diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index f205d62c8d..02af5fd3b3 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -256,7 +256,7 @@ void firmwareError(const char *fmt, ...) { } } -static char UNUSED_RAM_SIZE[10000]; +static char UNUSED_RAM_SIZE[7000]; static char UNUSED_CCM_SIZE[11000] CCM_OPTIONAL; diff --git a/unit_tests/test_fuel_map.cpp b/unit_tests/test_fuel_map.cpp index f30a0045c8..89012556b9 100644 --- a/unit_tests/test_fuel_map.cpp +++ b/unit_tests/test_fuel_map.cpp @@ -187,8 +187,8 @@ void testAngleResolver(void) { printf("*************************************************** testAngleResolver 2\r\n"); ae.resetEventList(); findTriggerPosition(&ae.getNextActuatorEvent()->position, 51 + 180 - 175 PASS_ENGINE_PARAMETER); - assertEquals(3, ae.events[0].position.eventIndex); - assertEquals(2.955, ae.events[0].position.angleOffset); + assertEquals(2, ae.events[0].position.eventIndex); + assertEquals(112.3495, ae.events[0].position.angleOffset); } void testPinHelper(void) {