From 77f7ad454e062ae8592ae801229cedbac4b3c948 Mon Sep 17 00:00:00 2001 From: rusEfi Date: Sat, 30 Jan 2016 22:03:36 -0500 Subject: [PATCH] auto-sync --- firmware/config/engines/dodge_neon.cpp | 9 +++- firmware/config/engines/ford_aspire.cpp | 3 ++ firmware/config/engines/mazda_626.cpp | 1 - .../binary/tunerstudio_configuration.h | 15 ++++--- firmware/console/status_loop.cpp | 7 ++- firmware/controllers/algo/engine.cpp | 12 +++++- firmware/controllers/algo/engine.h | 15 ++++++- .../controllers/algo/engine_configuration.cpp | 3 ++ ...ngine_configuration_generated_structures.h | 16 ++++--- firmware/controllers/algo/rusefi_generated.h | 9 ++-- firmware/controllers/algo/signal_executor.cpp | 13 +++--- firmware/controllers/error_handling.cpp | 5 ++- firmware/controllers/flash_main.h | 2 +- firmware/controllers/map_averaging.cpp | 4 +- firmware/controllers/math/engine_math.cpp | 4 ++ firmware/controllers/settings.cpp | 2 +- .../trigger/main_trigger_callback.cpp | 18 +++++--- .../controllers/trigger/rpm_calculator.cpp | 11 +++-- firmware/controllers/trigger/rpm_calculator.h | 4 +- .../controllers/trigger/trigger_central.cpp | 4 +- .../controllers/trigger/trigger_decoder.cpp | 8 +++- .../trigger/trigger_emulator_algo.cpp | 2 +- firmware/development/engine_sniffer.cpp | 43 ++++++++----------- firmware/development/engine_sniffer.h | 10 ++--- firmware/development/wave_analyzer.cpp | 6 +-- firmware/hw_layer/adc_inputs.cpp | 12 ++++-- firmware/hw_layer/microsecond_timer.cpp | 12 +++++- firmware/integration/rusefi_config.txt | 7 +-- firmware/rusefi.cpp | 2 +- firmware/svnversion.h | 4 +- firmware/tunerstudio/rusefi.ini | 18 +++++--- .../models/src/com/rusefi/config/Fields.java | 16 ++++--- .../models/src/com/rusefi/core/Sensor.java | 15 ++++--- .../ui/src/com/rusefi/ui/FormulasPane.java | 8 ++-- .../ui/src/com/rusefi/ui/FuelTunePane.java | 2 +- unit_tests/test_trigger_decoder.cpp | 38 +++++++++++++++- .../simulator/rusEfiFunctionalTest.cpp | 2 +- 37 files changed, 242 insertions(+), 120 deletions(-) diff --git a/firmware/config/engines/dodge_neon.cpp b/firmware/config/engines/dodge_neon.cpp index d856e712d4..506e29940d 100644 --- a/firmware/config/engines/dodge_neon.cpp +++ b/firmware/config/engines/dodge_neon.cpp @@ -444,8 +444,9 @@ void setDodgeNeonNGCEngineConfiguration(DECLARE_ENGINE_PARAMETER_F) { setAlgorithm(LM_SPEED_DENSITY PASS_ENGINE_PARAMETER); boardConfiguration->alternatorControlPin = GPIOD_5; -// engineConfiguration->alternatorControl.pFactor = 22; - engineConfiguration->alternatorControl.pFactor = 55; // looks to work better, maybe time for some iFactor + engineConfiguration->targetVBatt = 14.5; + engineConfiguration->alternatorOffset = 20; + engineConfiguration->alternatorControl.pFactor = 20; // looks to work better, maybe time for some iFactor // enableFrankensoCan(); engineConfiguration->canWriteEnabled = true; @@ -463,6 +464,10 @@ void setDodgeNeonNGCEngineConfiguration(DECLARE_ENGINE_PARAMETER_F) { engineConfiguration->suckedOffCoef = 0.05; engineConfiguration->addedToWallCoef = 0.40; + engineConfiguration->tpsAccelEnrichmentMultiplier = 0; + engineConfiguration->suckedOffCoef = 0; + engineConfiguration->addedToWallCoef = 0; + boardConfiguration->isSdCardEnabled = false; boardConfiguration->manIdlePosition = 40; // set_idle_pwm 40 diff --git a/firmware/config/engines/ford_aspire.cpp b/firmware/config/engines/ford_aspire.cpp index 1a5f7a71ff..b13d98daed 100644 --- a/firmware/config/engines/ford_aspire.cpp +++ b/firmware/config/engines/ford_aspire.cpp @@ -148,6 +148,9 @@ void setFordAspireEngineConfiguration(DECLARE_ENGINE_PARAMETER_F) { // engineConfiguration->iat.adcChannel = engineConfiguration->map.sensor.type = MT_DENSO183; + + engineConfiguration->engineSnifferRpmThreshold = 13000; + engineConfiguration->sensorSnifferRpmThreshold = 13000; } #endif /* EFI_SUPPORT_FORD_ASPIRE */ diff --git a/firmware/config/engines/mazda_626.cpp b/firmware/config/engines/mazda_626.cpp index 72a8f71e6d..fd64c959c5 100644 --- a/firmware/config/engines/mazda_626.cpp +++ b/firmware/config/engines/mazda_626.cpp @@ -39,7 +39,6 @@ void setMazda626EngineConfiguration(DECLARE_ENGINE_PARAMETER_F) { // chartsize 600 engineConfiguration->engineChartSize = 600; - boardConfiguration->sensorChartMode = SC_TRIGGER; engineConfiguration->sensorChartFrequency = 2; engineConfiguration->injector.flow = 330; diff --git a/firmware/console/binary/tunerstudio_configuration.h b/firmware/console/binary/tunerstudio_configuration.h index 325be8b9d4..2ac3e30a22 100644 --- a/firmware/console/binary/tunerstudio_configuration.h +++ b/firmware/console/binary/tunerstudio_configuration.h @@ -92,6 +92,9 @@ typedef struct { */ float deltaTps; // offset 116 int triggerErrorsCounter; // offset 120 + /** + * Engine load delta + */ float engineLoadAccelDelta; // offset 124 float tpsAccelFuel; // offset 128 float baroCorrection; @@ -111,12 +114,12 @@ typedef struct { float runningFuel; // 188 int debugIntField1; // 192 float injectorLagMs; // 196 - float debugFloatField2; - float debugFloatField3; - float debugFloatField4; - float debugFloatField5; - int debugIntField2; - int debugIntField3; + float debugFloatField2; // 200 + float debugFloatField3; // 204 + float debugFloatField4; // 208 + float debugFloatField5; // 212 + int debugIntField2; // 216 + int debugIntField3; // 220 int unused3[13]; } TunerStudioOutputChannels; diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 1c6361fd51..200c716166 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -593,7 +593,6 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_ tsOutputChannels->manifoldAirPressure = getMap(); tsOutputChannels->engineLoad = engineLoad; tsOutputChannels->rpmAcceleration = engine->rpmCalculator.getRpmAcceleration(); - tsOutputChannels->deltaTps = engine->tpsAccelEnrichment.getDelta(); tsOutputChannels->triggerErrorsCounter = engine->triggerCentral.triggerState.totalTriggerErrorCounter; tsOutputChannels->baroCorrection = engine->engineState.baroCorrection; tsOutputChannels->pedalPosition = hasPedalPositionSensor(PASS_ENGINE_PARAMETER_F) ? getPedalPosition(PASS_ENGINE_PARAMETER_F) : 0; @@ -607,10 +606,14 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_ tsOutputChannels->injectorDutyCycle = getInjectorDutyCycle(rpm PASS_ENGINE_PARAMETER); tsOutputChannels->runningFuel = ENGINE(engineState.runningFuel); tsOutputChannels->injectorLagMs = ENGINE(injectorLagMs); + tsOutputChannels->wallFuelAmount = wallFuel.getWallFuel(0); tsOutputChannels->wallFuelCorrection = engine->wallFuelCorrection; - tsOutputChannels->engineLoadAccelDelta = engine->engineLoadAccelEnrichment.getEngineLoadEnrichment(PASS_ENGINE_PARAMETER_F) * 100 / getMap(); + // TPS acceleration + tsOutputChannels->deltaTps = engine->tpsAccelEnrichment.getDelta(); tsOutputChannels->tpsAccelFuel = engine->engineState.tpsAccelEnrich; + // engine load acceleration + tsOutputChannels->engineLoadAccelDelta = engine->engineLoadAccelEnrichment.getEngineLoadEnrichment(PASS_ENGINE_PARAMETER_F) * 100 / getMap(); tsOutputChannels->iatCorrection = ENGINE(engineState.iatFuelCorrection); tsOutputChannels->cltCorrection = ENGINE(engineState.cltFuelCorrection); diff --git a/firmware/controllers/algo/engine.cpp b/firmware/controllers/algo/engine.cpp index 1693d67444..7e0a1022e7 100644 --- a/firmware/controllers/algo/engine.cpp +++ b/firmware/controllers/algo/engine.cpp @@ -59,6 +59,10 @@ int MockAdcState::getMockAdcValue(int hwChannel) { * See also periodicFastCallback */ void Engine::updateSlowSensors(DECLARE_ENGINE_PARAMETER_F) { + int rpm = rpmCalculator.rpmValue; + isEngineChartEnabled = CONFIG(isEngineChartEnabled) && rpm < CONFIG(engineSnifferRpmThreshold); + sensorChartMode = rpm < CONFIG(sensorSnifferRpmThreshold) ? boardConfiguration->sensorChartMode : SC_OFF; + engineState.iat = getIntakeAirTemperature(PASS_ENGINE_PARAMETER_F); engineState.clt = getCoolantTemperature(PASS_ENGINE_PARAMETER_F); @@ -88,6 +92,8 @@ void Engine::addConfigurationListener(configuration_callback_t callback) { Engine::Engine(persistent_config_s *config) { init(config); + isEngineChartEnabled = false; + sensorChartMode = SC_OFF; /** * it's important for fixAngle() that engineCycle field never has zero */ @@ -327,7 +333,11 @@ void Engine::periodicFastCallback(DECLARE_ENGINE_PARAMETER_F) { engineState.periodicFastCallback(PASS_ENGINE_PARAMETER_F); -// prepareFuelSchedule(PASS_ENGINE_PARAMETER_F); + engine->m.beforeFuelCalc = GET_TIMESTAMP(); + ENGINE(fuelMs) = getFuelMs(rpm PASS_ENGINE_PARAMETER) * engineConfiguration->globalFuelCorrection; + engine->m.fuelCalcTime = GET_TIMESTAMP() - engine->m.beforeFuelCalc; + + prepareFuelSchedule(PASS_ENGINE_PARAMETER_F); } StartupFuelPumping::StartupFuelPumping() { diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index 858e6686c4..6b897015fc 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -162,6 +162,9 @@ public: */ floatms_t runningFuel; + /** + * TPS acceleration: extra fuel amount + */ floatms_t tpsAccelEnrich; angle_t injectionOffset; @@ -223,7 +226,14 @@ public: * That's the list of pending spark firing events */ IgnitionEvent *iHead; - + /** + * this is based on isEngineChartEnabled and engineSnifferRpmThreshold settings + */ + bool isEngineChartEnabled; + /** + * this is based on sensorChartMode and sensorSnifferRpmThreshold settings + */ + sensor_chart_e sensorChartMode; RpmCalculator rpmCalculator; persistent_config_s *config; @@ -235,6 +245,9 @@ public: */ efitick_t stopEngineRequestTimeNt; + /** + * always 360 or 720, never zero + */ angle_t engineCycle; AccelEnrichmemnt engineLoadAccelEnrichment; diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp index 9f6144e625..7945a80aa9 100644 --- a/firmware/controllers/algo/engine_configuration.cpp +++ b/firmware/controllers/algo/engine_configuration.cpp @@ -382,6 +382,9 @@ void setDefaultConfiguration(DECLARE_ENGINE_PARAMETER_F) { engineConfiguration->step1SparkCutEnable = false; engineConfiguration->step1RpmWindow = 500; + engineConfiguration->slowAdcAlpha = 1; + engineConfiguration->engineSnifferRpmThreshold = 2500; + engineConfiguration->sensorSnifferRpmThreshold = 2500; engineConfiguration->rpmHardLimit = 7000; engineConfiguration->cranking.rpm = 550; engineConfiguration->cutFuelOnHardLimit = true; diff --git a/firmware/controllers/algo/engine_configuration_generated_structures.h b/firmware/controllers/algo/engine_configuration_generated_structures.h index 202ade118a..fadde84ca4 100644 --- a/firmware/controllers/algo/engine_configuration_generated_structures.h +++ b/firmware/controllers/algo/engine_configuration_generated_structures.h @@ -1,4 +1,4 @@ -// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 22 21:25:54 EST 2016 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 29 20:39:58 EST 2016 // begin #ifndef ENGINE_CONFIGURATION_GENERATED_H_ #define ENGINE_CONFIGURATION_GENERATED_H_ @@ -753,9 +753,10 @@ typedef struct { */ engine_type_e engineType; /** + * Disable engine sniffer above this rpm * offset 4 */ - int unusedOffset4; + int engineSnifferRpmThreshold; /** * offset 8 */ @@ -854,9 +855,10 @@ typedef struct { */ float cylinderBore; /** + * Disable sensor sniffer above this rpm * offset 416 */ - int unused34234; + int sensorSnifferRpmThreshold; /** * offset 420 */ @@ -1461,7 +1463,11 @@ typedef struct { /** * offset 2240 */ - int unused[194]; + float slowAdcAlpha; + /** + * offset 2244 + */ + int unused[193]; /** total size 3016*/ } engine_configuration_s; @@ -1611,4 +1617,4 @@ typedef struct { #endif // end -// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 22 21:25:54 EST 2016 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 29 20:39:58 EST 2016 diff --git a/firmware/controllers/algo/rusefi_generated.h b/firmware/controllers/algo/rusefi_generated.h index 44cba49528..015eb498d3 100644 --- a/firmware/controllers/algo/rusefi_generated.h +++ b/firmware/controllers/algo/rusefi_generated.h @@ -27,8 +27,8 @@ #define engineConfiguration_offset_hex 0 #define engineType_offset 0 #define engineType_offset_hex 0 -#define unusedOffset4_offset 4 -#define unusedOffset4_offset_hex 4 +#define engineSnifferRpmThreshold_offset 4 +#define engineSnifferRpmThreshold_offset_hex 4 #define injector_offset 8 #define injector_offset_hex 8 #define injector_flow_offset 8 @@ -127,7 +127,7 @@ #define firingOrder_offset 408 #define firingOrder_offset_hex 198 #define cylinderBore_offset 412 -#define unused34234_offset 416 +#define sensorSnifferRpmThreshold_offset 416 #define rpmHardLimit_offset 420 #define algorithm_offset 424 #define crankingInjectionMode_offset 428 @@ -730,7 +730,8 @@ #define uartConsoleSerialSpeed_offset 2228 #define tpsDecelEnleanmentThreshold_offset 2232 #define tpsDecelEnleanmentMultiplier_offset 2236 -#define unused_offset 2240 +#define slowAdcAlpha_offset 2240 +#define unused_offset 2244 #define le_formulas1_offset 3016 #define le_formulas2_offset 3216 #define le_formulas3_offset 3416 diff --git a/firmware/controllers/algo/signal_executor.cpp b/firmware/controllers/algo/signal_executor.cpp index d847c3cbbf..9922f9bca3 100644 --- a/firmware/controllers/algo/signal_executor.cpp +++ b/firmware/controllers/algo/signal_executor.cpp @@ -73,12 +73,12 @@ void turnPinHigh(NamedOutputPin *output) { #endif #if EFI_ENGINE_SNIFFER || defined(__DOXYGEN__) // explicit check here is a performance optimization to speed up no-chart mode - if (CONFIG(isEngineChartEnabled)) { + if (ENGINE(isEngineChartEnabled)) { // this is a performance optimization - array index is cheaper then invoking a method with 'switch' const char *pinName = output->name; // dbgDurr = hal_lld_get_counter_value() - dbgStart; - addWaveChartEvent(pinName, WC_UP); + addEngineSniffferEvent(pinName, WC_UP); } #endif /* EFI_ENGINE_SNIFFER */ // dbgDurr = hal_lld_get_counter_value() - dbgStart; @@ -98,11 +98,11 @@ void turnPinLow(NamedOutputPin *output) { #endif /* EFI_DEFAILED_LOGGING */ #if EFI_ENGINE_SNIFFER || defined(__DOXYGEN__) - if (CONFIG(isEngineChartEnabled)) { + if (ENGINE(isEngineChartEnabled)) { // this is a performance optimization - array index is cheaper then invoking a method with 'switch' const char *pinName = output->name; - addWaveChartEvent(pinName, WC_DOWN); + addEngineSniffferEvent(pinName, WC_DOWN); } #endif /* EFI_ENGINE_SNIFFER */ } @@ -117,7 +117,7 @@ int getRevolutionCounter(void); * */ void scheduleOutput(OutputSignal *signal, efitimeus_t nowUs, float delayUs, float durationUs, NamedOutputPin *output) { -#if EFI_GPIO +#if EFI_GPIO || defined(__DOXYGEN__) if (durationUs < 0) { warning(OBD_PCM_Processor_Fault, "duration cannot be negative: %d", durationUs); return; @@ -131,6 +131,9 @@ void scheduleOutput(OutputSignal *signal, efitimeus_t nowUs, float delayUs, floa int index = getRevolutionCounter() % 2; scheduling_s * sUp = &signal->signalTimerUp[index]; scheduling_s * sDown = &signal->signalTimerDown[index]; +#if EFI_UNIT_TEST || defined(__DOXYGEN__) + printf("scheduling output %s\r\n", output->name); +#endif scheduleByTime("out up", sUp, nowUs + (int) delayUs, (schfunc_t) &turnPinHigh, output); scheduleByTime("out down", sDown, nowUs + (int) (delayUs + durationUs), (schfunc_t) &turnPinLow, output); diff --git a/firmware/controllers/error_handling.cpp b/firmware/controllers/error_handling.cpp index f6effe7849..a6336eefe1 100644 --- a/firmware/controllers/error_handling.cpp +++ b/firmware/controllers/error_handling.cpp @@ -51,19 +51,22 @@ void chDbgPanic3(const char *msg, const char * file, int line) { static char warningBuffer[WARNING_BUFFER_SIZE]; static MemoryStream warningStream; +static int warningCounter = 0; /** * OBD_PCM_Processor_Fault is the general error code for now * * @returns TRUE in case there are too many warnings */ int warning(obd_code_e code, const char *fmt, ...) { - UNUSED(code); + UNUSED(code); int now = getTimeNowSeconds(); if (absI(now - timeOfPreviousWarning) < 10 || !warningEnabled) return true; // we just had another warning, let's not spam timeOfPreviousWarning = now; + warningCounter++; + resetLogging(&logger); // todo: is 'reset' really needed here? appendMsgPrefix(&logger); diff --git a/firmware/controllers/flash_main.h b/firmware/controllers/flash_main.h index e5c2d07f85..b87ba52ae7 100644 --- a/firmware/controllers/flash_main.h +++ b/firmware/controllers/flash_main.h @@ -11,7 +11,7 @@ #include "engine.h" -#define FLASH_DATA_VERSION 9000 +#define FLASH_DATA_VERSION 9052 void readFromFlash(void); void initFlash(Logging *sharedLogger); diff --git a/firmware/controllers/map_averaging.cpp b/firmware/controllers/map_averaging.cpp index 16c0d47c01..648cd29fa4 100644 --- a/firmware/controllers/map_averaging.cpp +++ b/firmware/controllers/map_averaging.cpp @@ -108,7 +108,7 @@ static void startAveraging(void *arg) { * as fast as possible */ void mapAveragingCallback(adcsample_t adcValue) { - if (!isAveraging && boardConfiguration->sensorChartMode != SC_MAP) { + if (!isAveraging && ENGINE(sensorChartMode) != SC_MAP) { return; } @@ -117,7 +117,7 @@ void mapAveragingCallback(adcsample_t adcValue) { efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lowstck#9a"); #if (EFI_SENSOR_CHART && EFI_ANALOG_SENSORS) || defined(__DOXYGEN__) - if (boardConfiguration->sensorChartMode == SC_MAP) { + if (ENGINE(sensorChartMode) == SC_MAP) { if (measurementsPerRevolutionCounter % FAST_MAP_CHART_SKIP_FACTOR == 0) { float voltage = adcToVoltsDivided(adcValue); diff --git a/firmware/controllers/math/engine_math.cpp b/firmware/controllers/math/engine_math.cpp index dedcf51b98..a4d79a389b 100644 --- a/firmware/controllers/math/engine_math.cpp +++ b/firmware/controllers/math/engine_math.cpp @@ -156,6 +156,10 @@ void FuelSchedule::registerInjectionEvent(int injectorIndex, float angle, efiAssertVoid(TRIGGER_SHAPE(getSize()) > 0, "uninitialized TriggerShape"); findTriggerPosition(&ev->injectionStart, angle PASS_ENGINE_PARAMETER); +#if EFI_UNIT_TEST + printf("registerInjectionEvent angle=%f index=%d\r\n", angle, ev->injectionStart.eventIndex); +#endif + if (!hasEvents[ev->injectionStart.eventIndex]) { hasEvents[ev->injectionStart.eventIndex] = true; eventsCount++; diff --git a/firmware/controllers/settings.cpp b/firmware/controllers/settings.cpp index a7768a220b..48e05679f0 100644 --- a/firmware/controllers/settings.cpp +++ b/firmware/controllers/settings.cpp @@ -319,7 +319,7 @@ void setEngineType(int value) { resetConfigurationExt(&logger, (engine_type_e) value PASS_ENGINE_PARAMETER); #if EFI_ENGINE_SNIFFER || defined(__DOXYGEN__) if (engine->isTestMode) - waveChart.resetWaveChart(); + waveChart.reset(); #endif #if EFI_INTERNAL_FLASH diff --git a/firmware/controllers/trigger/main_trigger_callback.cpp b/firmware/controllers/trigger/main_trigger_callback.cpp index f64d394b5f..77ed36d24f 100644 --- a/firmware/controllers/trigger/main_trigger_callback.cpp +++ b/firmware/controllers/trigger/main_trigger_callback.cpp @@ -151,6 +151,10 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(int eventIndex, bool limitedF (schfunc_t) &endSimultaniousInjection, engine); } else { +#if EFI_UNIT_TEST || defined(__DOXYGEN__) + printf("scheduling injection angle=%f/delay=%f injectionDuration=%f\r\n", event->injectionStart.angleOffset, injectionStartDelayUs, injectionDuration); +#endif + scheduleOutput(signal, getTimeNowUs(), injectionStartDelayUs, MS2US(injectionDuration), event->output); } } @@ -221,6 +225,9 @@ static ALWAYS_INLINE void handleSparkEvent(bool limitedSpark, uint32_t eventInde * The start of charge is always within the current trigger event range, so just plain time-based scheduling */ if (!limitedSpark) { +#if EFI_UNIT_TEST || defined(__DOXYGEN__) + printf("spark charge delay=%f\r\n", chargeDelayUs); +#endif /** * Note how we do not check if spark is limited or not while scheduling 'spark down' * This way we make sure that coil dwell started while spark was enabled would fire and not burn @@ -241,7 +248,11 @@ static ALWAYS_INLINE void handleSparkEvent(bool limitedSpark, uint32_t eventInde */ float timeTillIgnitionUs = ENGINE(rpmCalculator.oneDegreeUs) * iEvent->sparkPosition.angleOffset; - scheduleTask("spark1 down", sDown, (int) timeTillIgnitionUs, (schfunc_t) &turnPinLow, iEvent->output); +#if EFI_UNIT_TEST || defined(__DOXYGEN__) + printf("spark delay=%f angle=%f\r\n", timeTillIgnitionUs, iEvent->sparkPosition.angleOffset); +#endif + + scheduleTask("spark1 down", sDown, (int) timeTillIgnitionUs, (schfunc_t) &turnPinLow, iEvent->output); } else { /** * Spark should be scheduled in relation to some future trigger event, this way we get better firing precision @@ -318,9 +329,6 @@ uint32_t *cyccnt = (uint32_t*) &DWT->CYCCNT; #endif static ALWAYS_INLINE void scheduleIgnitionAndFuelEvents(int rpm, int revolutionIndex DECLARE_ENGINE_PARAMETER_S) { - engine->m.beforeFuelCalc = GET_TIMESTAMP(); - ENGINE(fuelMs) = getFuelMs(rpm PASS_ENGINE_PARAMETER) * engineConfiguration->globalFuelCorrection; - engine->m.fuelCalcTime = GET_TIMESTAMP() - engine->m.beforeFuelCalc; engine->m.beforeIgnitionSch = GET_TIMESTAMP(); /** @@ -355,7 +363,7 @@ static ALWAYS_INLINE void scheduleIgnitionAndFuelEvents(int rpm, int revolutionI initializeIgnitionActions(ENGINE(engineState.timingAdvance), ENGINE(engineState.dwellAngle), list PASS_ENGINE_PARAMETER); engine->m.ignitionSchTime = GET_TIMESTAMP() - engine->m.beforeIgnitionSch; - engine->prepareFuelSchedule(PASS_ENGINE_PARAMETER_F); +// engine->prepareFuelSchedule(PASS_ENGINE_PARAMETER_F); } /** diff --git a/firmware/controllers/trigger/rpm_calculator.cpp b/firmware/controllers/trigger/rpm_calculator.cpp index c65b2d564d..105af26828 100644 --- a/firmware/controllers/trigger/rpm_calculator.cpp +++ b/firmware/controllers/trigger/rpm_calculator.cpp @@ -167,7 +167,7 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, #if EFI_SENSOR_CHART || defined(__DOXYGEN__) angle_t crankAngle = NAN; int signal = -1; - if (boardConfiguration->sensorChartMode == SC_TRIGGER) { + if (ENGINE(sensorChartMode) == SC_TRIGGER) { crankAngle = getCrankshaftAngleNt(nowNt PASS_ENGINE_PARAMETER); signal = 1000 * ckpSignalType + index; } @@ -175,7 +175,7 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, if (index != 0) { #if EFI_SENSOR_CHART || defined(__DOXYGEN__) - if (boardConfiguration->sensorChartMode == SC_TRIGGER) { + if (ENGINE(sensorChartMode) == SC_TRIGGER) { scAddData(crankAngle, signal); } #endif @@ -204,7 +204,7 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, rpmState->onNewEngineCycle(); rpmState->lastRpmEventTimeNt = nowNt; #if EFI_SENSOR_CHART || defined(__DOXYGEN__) - if (boardConfiguration->sensorChartMode == SC_TRIGGER) { + if (ENGINE(sensorChartMode) == SC_TRIGGER) { scAddData(crankAngle, signal); } #endif @@ -222,7 +222,7 @@ static char rpmBuffer[10]; */ static void onTdcCallback(void) { itoa10(rpmBuffer, getRpmE(engine)); - addWaveChartEvent(TOP_DEAD_CENTER_MESSAGE, (char* ) rpmBuffer); + addEngineSniffferEvent(TOP_DEAD_CENTER_MESSAGE, (char* ) rpmBuffer); } /** @@ -232,8 +232,7 @@ static void tdcMarkCallback(trigger_event_e ckpSignalType, uint32_t index0 DECLARE_ENGINE_PARAMETER_S) { (void) ckpSignalType; bool isTriggerSynchronizationPoint = index0 == 0; - if (isTriggerSynchronizationPoint - && engineConfiguration->isEngineChartEnabled) { + if (isTriggerSynchronizationPoint && ENGINE(isEngineChartEnabled)) { int revIndex2 = engine->rpmCalculator.getRevolutionCounter() % 2; int rpm = getRpmE(engine); // todo: use event-based scheduling, not just time-based scheduling diff --git a/firmware/controllers/trigger/rpm_calculator.h b/firmware/controllers/trigger/rpm_calculator.h index c7dae7d613..a3a50bdf00 100644 --- a/firmware/controllers/trigger/rpm_calculator.h +++ b/firmware/controllers/trigger/rpm_calculator.h @@ -96,9 +96,9 @@ bool isCranking(void); #define isValidRpm(rpm) ((rpm) > 0 && (rpm) < UNREALISTIC_RPM) #if EFI_ENGINE_SNIFFER -#define addWaveChartEvent(name, msg) waveChart.addWaveChartEvent3((name), (msg)) +#define addEngineSniffferEvent(name, msg) waveChart.addEvent3((name), (msg)) #else -#define addWaveChartEvent(n, msg) {} +#define addEngineSniffferEvent(n, msg) {} #endif /* EFI_ENGINE_SNIFFER */ void scheduleByAngle(int rpm, scheduling_s *timer, angle_t angle, schfunc_t callback, void *param, RpmCalculator *calc); diff --git a/firmware/controllers/trigger/trigger_central.cpp b/firmware/controllers/trigger/trigger_central.cpp index 7a442d7f04..1c874c2d81 100644 --- a/firmware/controllers/trigger/trigger_central.cpp +++ b/firmware/controllers/trigger/trigger_central.cpp @@ -118,11 +118,11 @@ static ALWAYS_INLINE void reportEventToWaveChart(trigger_event_e ckpSignalType, bool isUp = isUpEvent[(int) ckpSignalType]; shaft_signal_msg_index[0] = isUp ? 'u' : 'd'; - addWaveChartEvent(eventId[(int )ckpSignalType], (char* ) shaft_signal_msg_index); + addEngineSniffferEvent(eventId[(int )ckpSignalType], (char* ) shaft_signal_msg_index); if (engineConfiguration->useOnlyFrontForTrigger) { // let's add the opposite event right away shaft_signal_msg_index[0] = isUp ? 'd' : 'u'; - addWaveChartEvent(eventId[(int )ckpSignalType], (char* ) shaft_signal_msg_index); + addEngineSniffferEvent(eventId[(int )ckpSignalType], (char* ) shaft_signal_msg_index); } } diff --git a/firmware/controllers/trigger/trigger_decoder.cpp b/firmware/controllers/trigger/trigger_decoder.cpp index ef769c1054..d4ebb91184 100644 --- a/firmware/controllers/trigger/trigger_decoder.cpp +++ b/firmware/controllers/trigger/trigger_decoder.cpp @@ -217,7 +217,11 @@ void TriggerState::decodeTriggerEvent(trigger_event_e const signal, efitime_t no float prevGap = 1.0 * toothed_previous_duration / durationBeforePrevious; float gap3 = 1.0 * durationBeforePrevious / thirdPreviousDuration; #if EFI_PROD_CODE || defined(__DOXYGEN__) - scheduleMsg(logger, "gap=%f/%f/%f @ %d while expected %f/%f/%f and %f/%f error=%d", gap, prevGap, gap3, currentCycle.current_index, TRIGGER_SHAPE(syncRatioFrom), TRIGGER_SHAPE(syncRatioTo), TRIGGER_SHAPE(secondSyncRatioFrom), TRIGGER_SHAPE(secondSyncRatioTo), someSortOfTriggerError); + scheduleMsg(logger, "gap=%f/%f/%f @ %d while expected %f/%f and %f/%f error=%d", + gap, prevGap, gap3, + currentCycle.current_index, + TRIGGER_SHAPE(syncRatioFrom), TRIGGER_SHAPE(syncRatioTo), + TRIGGER_SHAPE(secondSyncRatioFrom), TRIGGER_SHAPE(secondSyncRatioTo), someSortOfTriggerError); #else actualSynchGap = gap; print("current gap %f/%f/%f c=%d prev=%d\r\n", gap, prevGap, gap3, currentDuration, toothed_previous_duration); @@ -303,7 +307,7 @@ void TriggerState::decodeTriggerEvent(trigger_event_e const signal, efitime_t no } } - if (boardConfiguration->sensorChartMode == SC_RPM_ACCEL || boardConfiguration->sensorChartMode == SC_DETAILED_RPM) { + if (ENGINE(sensorChartMode) == SC_RPM_ACCEL || ENGINE(sensorChartMode) == SC_DETAILED_RPM) { angle_t currentAngle = TRIGGER_SHAPE(eventAngles[currentCycle.current_index]); // todo: make this '90' depend on cylinder count? angle_t prevAngle = currentAngle - 90; diff --git a/firmware/controllers/trigger/trigger_emulator_algo.cpp b/firmware/controllers/trigger/trigger_emulator_algo.cpp index 0705a0b1c8..b21939bcad 100644 --- a/firmware/controllers/trigger/trigger_emulator_algo.cpp +++ b/firmware/controllers/trigger/trigger_emulator_algo.cpp @@ -116,7 +116,7 @@ void setTriggerEmulatorRPM(int rpm, Engine *engine) { } #if EFI_ENGINE_SNIFFER if (engine->isTestMode) - waveChart.resetWaveChart(); + waveChart.reset(); #endif /* EFI_ENGINE_SNIFFER */ scheduleMsg(logger, "Emulating position sensor(s). RPM=%d", rpm); diff --git a/firmware/development/engine_sniffer.cpp b/firmware/development/engine_sniffer.cpp index 7c2342aebc..f3cb670ad1 100644 --- a/firmware/development/engine_sniffer.cpp +++ b/firmware/development/engine_sniffer.cpp @@ -39,7 +39,7 @@ #if EFI_HISTOGRAMS || defined(__DOXYGEN__) #include "rfiutil.h" #include "histogram.h" -static histogram_s waveChartHisto; +static histogram_s engineSnifferHisto; #endif EXTERN_ENGINE @@ -73,13 +73,13 @@ static uint32_t skipUntilEngineCycle = 0; #if ! EFI_UNIT_TEST || defined(__DOXYGEN__) extern WaveChart waveChart; -static void resetWaveChartNow(void) { +static void resetNow(void) { skipUntilEngineCycle = engine->rpmCalculator.getRevolutionCounter() + 3; - waveChart.resetWaveChart(); + waveChart.reset(); } #endif -void WaveChart::resetWaveChart() { +void WaveChart::reset() { #if DEBUG_WAVE scheduleSimpleMsg(&debugLogging, "reset while at ", counter); #endif /* DEBUG_WAVE */ @@ -102,7 +102,7 @@ bool WaveChart::isStartedTooLongAgo() { return startTimeNt != 0 && NT2US(chartDurationNt) > engineConfiguration->engineChartSize * 1000000 / 20; } -bool WaveChart::isWaveChartFull() { +bool WaveChart::isFull() { return counter >= engineConfiguration->engineChartSize; } @@ -125,10 +125,10 @@ void setChartSize(int newSize) { printStatus(); } -void WaveChart::publishChartIfFull() { - if (isWaveChartFull() || isStartedTooLongAgo()) { - publishChart(); - resetWaveChart(); +void WaveChart::publishIfFull() { + if (isFull() || isStartedTooLongAgo()) { + publish(); + reset(); } } @@ -141,10 +141,10 @@ WaveChart::WaveChart() { void WaveChart::init() { initLoggingExt(&logging, "wave chart", WAVE_LOGGING_BUFFER, sizeof(WAVE_LOGGING_BUFFER)); isInitialized = true; - resetWaveChart(); + reset(); } -void WaveChart::publishChart() { +void WaveChart::publish() { appendPrintf(&logging, DELIMETER); waveChartUsedSize = loggingSize(&logging); #if DEBUG_WAVE @@ -152,7 +152,7 @@ void WaveChart::publishChart() { scheduleSimpleMsg(&debugLogging, "IT'S TIME", strlen(l->buffer)); #endif bool isFullLog = getFullLog(); - if (engineConfiguration->isEngineChartEnabled && isFullLog) { + if (ENGINE(isEngineChartEnabled) && isFullLog) { scheduleLogging(&logging); } } @@ -162,11 +162,11 @@ static char timeBuffer[10]; /** * @brief Register an event for digital sniffer */ -void WaveChart::addWaveChartEvent3(const char *name, const char * msg) { +void WaveChart::addEvent3(const char *name, const char * msg) { if (skipUntilEngineCycle != 0 && engine->rpmCalculator.getRevolutionCounter() < skipUntilEngineCycle) return; efiAssertVoid(name!=NULL, "WC: NULL name"); - if (!engineConfiguration->isEngineChartEnabled) { + if (!ENGINE(isEngineChartEnabled)) { return; } @@ -178,7 +178,7 @@ void WaveChart::addWaveChartEvent3(const char *name, const char * msg) { #if DEBUG_WAVE scheduleSimpleMsg(&debugLogging, "current", chart->counter); #endif - if (isWaveChartFull()) { + if (isFull()) { return; } @@ -229,7 +229,7 @@ void WaveChart::addWaveChartEvent3(const char *name, const char * msg) { #if EFI_HISTOGRAMS && EFI_PROD_CODE int64_t diff = hal_lld_get_counter_value() - beforeCallback; if (diff > 0) { - hsAdd(&waveChartHisto, diff); + hsAdd(&engineSnifferHisto, diff); } #endif /* EFI_HISTOGRAMS */ @@ -237,16 +237,11 @@ void WaveChart::addWaveChartEvent3(const char *name, const char * msg) { void showWaveChartHistogram(void) { #if (EFI_HISTOGRAMS && EFI_PROD_CODE) || defined(__DOXYGEN__) - printHistogram(&logger, &waveChartHisto); + printHistogram(&logger, &engineSnifferHisto); #endif } void initWaveChart(WaveChart *chart) { - - if (!engineConfiguration->isEngineChartEnabled) { - printMsg(&logger, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! chart disabled"); - } - /** * constructor does not work because we need specific initialization order */ @@ -259,13 +254,13 @@ void initWaveChart(WaveChart *chart) { #endif #if EFI_HISTOGRAMS || defined(__DOXYGEN__) - initHistogram(&waveChartHisto, "wave chart"); + initHistogram(&engineSnifferHisto, "wave chart"); #endif /* EFI_HISTOGRAMS */ addConsoleActionI("chartsize", setChartSize); addConsoleActionI("chart", setChartActive); #if ! EFI_UNIT_TEST || defined(__DOXYGEN__) - addConsoleAction("reset_engine_chart", resetWaveChartNow); + addConsoleAction("reset_engine_chart", resetNow); #endif } diff --git a/firmware/development/engine_sniffer.h b/firmware/development/engine_sniffer.h index 2678629ed7..326e864f75 100644 --- a/firmware/development/engine_sniffer.h +++ b/firmware/development/engine_sniffer.h @@ -21,12 +21,12 @@ class WaveChart { public: WaveChart(); void init(); - void publishChart(); - void resetWaveChart(); - bool isWaveChartFull(); + void addEvent3(const char *name, const char *msg); + void reset(); + void publishIfFull(); + void publish(); + bool isFull(); bool isStartedTooLongAgo(); - void publishChartIfFull(); - void addWaveChartEvent3(const char *name, const char *msg); private: Logging logging; uint32_t counter; diff --git a/firmware/development/wave_analyzer.cpp b/firmware/development/wave_analyzer.cpp index 975d14b9cd..cf087c0c9e 100644 --- a/firmware/development/wave_analyzer.cpp +++ b/firmware/development/wave_analyzer.cpp @@ -59,7 +59,7 @@ static void waAnaWidthCallback(WaveReader *reader) { efitick_t nowUs = getTimeNowUs(); reader->eventCounter++; reader->lastActivityTimeUs = nowUs; - addWaveChartEvent(reader->name, WC_UP); + addEngineSniffferEvent(reader->name, WC_UP); uint32_t width = nowUs - reader->periodEventTimeUs; reader->last_wave_low_widthUs = width; @@ -72,7 +72,7 @@ void WaveReader::onFallEvent() { efitick_t nowUs = getTimeNowUs(); eventCounter++; lastActivityTimeUs = nowUs; - addWaveChartEvent(name, WC_DOWN); + addEngineSniffferEvent(name, WC_DOWN); efitick_t width = nowUs - widthEventTimeUs; last_wave_high_widthUs = width; @@ -158,7 +158,7 @@ static THD_FUNCTION(waThread, arg) { while (TRUE) { chThdSleepSeconds(CHART_RESET_DELAY); - waveChart.publishChartIfFull(); + waveChart.publishIfFull(); } #endif /* EFI_ENGINE_SNIFFER */ } diff --git a/firmware/hw_layer/adc_inputs.cpp b/firmware/hw_layer/adc_inputs.cpp index 2b84fa2f40..808246ae43 100644 --- a/firmware/hw_layer/adc_inputs.cpp +++ b/firmware/hw_layer/adc_inputs.cpp @@ -3,7 +3,7 @@ * @brief Low level ADC code * * We are using two ADC devices here. - * Slow ADC group is used for IAT, CLT, AFR, VBATT etc - this one is currently sampled at 10Hz + * Slow ADC group is used for IAT, CLT, AFR, VBATT etc - this one is currently sampled at 20Hz * * Fast ADC group is used for TPS, MAP, MAF HIP * @@ -43,9 +43,9 @@ AdcDevice::AdcDevice(ADCConversionGroup* hwConfig) { // todo: migrate from hardware timer to software ADC conversion triggering // todo: I guess we would have to use ChibiOS timer and not our own timer because -// todo: adcStartConversionI requires OS lock. currently slow ADC is 10Hz +// todo: adcStartConversionI requires OS lock. currently slow ADC is 20Hz #define PWM_FREQ_SLOW 5000 /* PWM clock frequency. I wonder what does this setting mean? */ -#define PWM_PERIOD_SLOW 500 /* PWM period (in PWM ticks). */ +#define PWM_PERIOD_SLOW 250 /* PWM period (in PWM ticks). */ /** * 8000 RPM is 133Hz @@ -62,6 +62,7 @@ AdcDevice::AdcDevice(ADCConversionGroup* hwConfig) { // is there a reason to have this configurable? #define ADC_FAST_DEVICE ADCD2 +static int slowAdcCounter = 0; static char LOGGING_BUFFER[500]; static Logging logger("ADC", LOGGING_BUFFER, sizeof(LOGGING_BUFFER)); @@ -459,8 +460,11 @@ static void adc_callback_slow(ADCDriver *adcp, adcsample_t *buffer, size_t n) { /* Calculates the average values from the ADC samples.*/ for (int i = 0; i < slowAdc.size(); i++) { int value = getAvgAdcValue(i, slowAdc.samples, ADC_BUF_DEPTH_SLOW, slowAdc.size()); - slowAdc.values.adc_data[i] = value; + adcsample_t prev = slowAdc.values.adc_data[i]; + slowAdc.values.adc_data[i] = (slowAdcCounter == 0) ? value : + CONFIG(slowAdcAlpha) * value + (1 - CONFIG(slowAdcAlpha)) * prev; } + slowAdcCounter++; } } diff --git a/firmware/hw_layer/microsecond_timer.cpp b/firmware/hw_layer/microsecond_timer.cpp index d91ab01a5e..8d2abd8db0 100644 --- a/firmware/hw_layer/microsecond_timer.cpp +++ b/firmware/hw_layer/microsecond_timer.cpp @@ -37,6 +37,8 @@ static const char * msg; static char buff[32]; +static int timerFreezeCounter = 0; + extern bool hasFirmwareErrorFlag; /** @@ -44,7 +46,15 @@ extern bool hasFirmwareErrorFlag; * This function should be invoked under kernel lock which would disable interrupts. */ void setHardwareUsTimer(int32_t timeUs) { - if (timeUs == 1) + /** + * #259 BUG error: not positive timeUs + * Once in a while we night get an interrupt where we do not expect it + */ + if (timeUs <= 0) { + timerFreezeCounter++; + warning(OBD_PCM_Processor_Fault, "local freeze cnt=%d", timerFreezeCounter); + } + if (timeUs < 2) timeUs = 2; // for some reason '1' does not really work efiAssertVoid(timeUs > 0, "not positive timeUs"); efiAssertVoid(timeUs < 10 * US_PER_SECOND, "setHardwareUsTimer() too large"); diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 594f89c2e2..437721e7c7 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -133,7 +133,7 @@ end_struct custom engine_type_e 4 bits, S32, @OFFSET@, [0:2], "AUDI_AAN", "DODGE_NEON_1995", "FORD_ASPIRE_1996", "FORD_FIESTA", "NISSAN_PRIMERA", "HONDA_ACCORD", "FORD_INLINE_6_1995", "GY6_139QMB" engine_type_e engineType;http://rusefi.com/wiki/index.php?title=Manual:Engine_Type -int unusedOffset4; +int engineSnifferRpmThreshold;Disable engine sniffer above this rpm;"RPM", 1, 0, 0,30000, 0 struct injector_s float flow;cc/min, cubic centimeter per minute\nBy the way, g/s = 0.125997881 * (lb/hr)\ng/s = 0.125997881 * (cc/min)/10.5\ng/s = 0.0119997981 * cc/min;"cm3/min", 1, 0, 0, 1000, 2 @@ -188,7 +188,7 @@ end_struct specs_s specs float cylinderBore;Cylinder diameter, in mm. -int unused34234; +int sensorSnifferRpmThreshold;Disable sensor sniffer above this rpm;"RPM", 1, 0, 0,30000, 0 int rpmHardLimit;;"rpm", 1, 0, 0, 20000.0, 2 @@ -630,7 +630,8 @@ baro_corr_table_t baroCorrTable; uint32_t uartConsoleSerialSpeed;;"BPs", 1, 0, 0,1000000, 0 float tpsDecelEnleanmentThreshold;;"roc", 1, 0, 0, 200, 3 float tpsDecelEnleanmentMultiplier;;"coeff", 1, 0, 0, 200, 3 - int[194] unused; + float slowAdcAlpha;;"coeff", 1, 0, 0, 200, 3 + int[193] unused; end_struct diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index 922c659d0b..08e7d33f34 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -275,5 +275,5 @@ int getRusEfiVersion(void) { return 123; // this is here to make the compiler happy about the unused array if (UNUSED_CCM_SIZE[0] * 0 != 0) return 3211; // this is here to make the compiler happy about the unused array - return 20160125; + return 20160128; } diff --git a/firmware/svnversion.h b/firmware/svnversion.h index ab74bcb7ca..076b08779c 100644 --- a/firmware/svnversion.h +++ b/firmware/svnversion.h @@ -1,5 +1,5 @@ // This file was generated by Version2Header -// Fri Jan 22 16:36:27 EST 2016 +// Thu Jan 28 20:12:19 EST 2016 #ifndef VCS_VERSION -#define VCS_VERSION "9358" +#define VCS_VERSION "9438" #endif diff --git a/firmware/tunerstudio/rusefi.ini b/firmware/tunerstudio/rusefi.ini index 339bd0af4d..fc6eeb29df 100644 --- a/firmware/tunerstudio/rusefi.ini +++ b/firmware/tunerstudio/rusefi.ini @@ -41,12 +41,12 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 22 12:32:32 EST 2016 +; this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 29 20:39:58 EST 2016 pageSize = 16088 page = 1 engineType = bits, S32, 0, [0:2], "AUDI_AAN", "DODGE_NEON_1995", "FORD_ASPIRE_1996", "FORD_FIESTA", "NISSAN_PRIMERA", "HONDA_ACCORD", "FORD_INLINE_6_1995", "GY6_139QMB" -;skipping unusedOffset4 offset 4 + engineSnifferRpmThreshold = scalar, S32, 4, "RPM", 1, 0, 0,30000, 0 injector_flow = scalar, F32, 8, "cm3/min", 1, 0, 0, 1000, 2 injector_lag = scalar, F32, 12, "msec", 1, 0, -10, 25.50, 2 injector_battLagCorrBins = array, F32, 16, [8], "V", 1, 0, 0.0, 20.0, 2 @@ -96,7 +96,7 @@ page = 1 cylindersCount = bits, U32, 404, [0:3], "INVALID", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, "INVALID", "INVALID", "INVALID" firingOrder = bits, U32, 408, [0:3], "One Cylinder", "1-3-4-2", "1-2-4-3", "1-3-2-4", "1-5-3-6-2-4", "1-8-4-3-6-5-7-2", "1-5-3-6-2-4", "1-4-2-5-3-6", "1-2", "1_2_3_4_5_6", "1-2-3", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" ;skipping cylinderBore offset 412 -;skipping unused34234 offset 416 + sensorSnifferRpmThreshold = scalar, S32, 416, "RPM", 1, 0, 0,30000, 0 rpmHardLimit = scalar, S32, 420, "rpm", 1, 0, 0, 20000.0, 2 algorithm = bits, U32, 424, [0:1], "MAF", "Alpha-N/TPS", "MAP", "SPEED DENSITY" crankingInjectionMode = bits, U32, 428, [0:1], "Simultaneous", "Sequential", "Batch", "INVALID" @@ -518,7 +518,8 @@ page = 1 uartConsoleSerialSpeed = scalar, U32, 2228, "BPs", 1, 0, 0,1000000, 0 tpsDecelEnleanmentThreshold = scalar, F32, 2232, "roc", 1, 0, 0, 200, 3 tpsDecelEnleanmentMultiplier = scalar, F32, 2236, "coeff", 1, 0, 0, 200, 3 -;skipping unused offset 2240 + slowAdcAlpha = scalar, F32, 2240, "coeff", 1, 0, 0, 200, 3 +;skipping unused offset 2244 le_formulas1 = array, U08, 3016, [200],"char", 1, 0, 0.0, 3.0, 2 le_formulas2 = array, U08, 3216, [200],"char", 1, 0, 0.0, 3.0, 2 le_formulas3 = array, U08, 3416, [200],"char", 1, 0, 0.0, 3.0, 2 @@ -614,7 +615,7 @@ page = 1 [OutputChannels] ; see TS_FILE_VERSION in firmware code -fileVersion = { 20151201 } +fileVersion = { 20160122 } ochGetCommand = "O" @@ -1010,17 +1011,19 @@ fileVersion = { 20151201 } entry = pulseWidth, "injPulse", float, "%.3f" entry = baseFuel, "fuel: base", float, "%.2f" entry = veValue, "fuel: VE", float, "%.3f" - entry = engineLoadAccelDelta, "fuel: EL accel",float, "%.3f" + entry = engineLoadAccelDelta, "fuel: EL delta",float, "%.3f" + entry = deltaTps, "fuel: tps delta",float, "%.3f" entry = tpsAccelFuel, "fuel: tpsAccel", float, "%.3f" entry = iatCorrection, "fuel: IAT corr", float, "%.3f" entry = wallFuelCorrection,"fuel: wall corr ms", float, "%.3f" - entry = wallFuelAmount, "fuel: wall amout", float, "%.3f" + entry = wallFuelAmount, "fuel: wall amount", float, "%.3f" entry = baroCorrection, "baroCorrection",float,"%.3f" entry = debugFloatField, "debug f",float,"%.3f" entry = debugIntField, "debug i",int,"%d" + entry = tCharge, "tCharge",float,"%.3f" ; tpsADC = U16, "ADC", ; alignmet = U16, "al", @@ -1384,6 +1387,7 @@ fileVersion = { 20151201 } field = "MAF ADC input", mafAdcChannel field = "Baro ADC input", baroSensor_hwChannel field = "Analog divider", analogInputDividerCoefficient + field = "slow EXP Alpha", slowAdcAlpha dialog = tachSettings, "Analog tachometer output" field = "pin", tachOutputPin diff --git a/java_console/models/src/com/rusefi/config/Fields.java b/java_console/models/src/com/rusefi/config/Fields.java index 937c7175e3..b8d0449c3f 100644 --- a/java_console/models/src/com/rusefi/config/Fields.java +++ b/java_console/models/src/com/rusefi/config/Fields.java @@ -1,6 +1,6 @@ package com.rusefi.config; -// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 22 12:32:32 EST 2016 +// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Jan 29 20:39:58 EST 2016 public class Fields { public static final int LE_COMMAND_LENGTH = 200; public static final int TS_FILE_VERSION = 20160122; @@ -31,8 +31,8 @@ public class Fields { public static final int engineConfiguration_offset_hex = 0; public static final int engineType_offset = 0; public static final int engineType_offset_hex = 0; - public static final int unusedOffset4_offset = 4; - public static final int unusedOffset4_offset_hex = 4; + public static final int engineSnifferRpmThreshold_offset = 4; + public static final int engineSnifferRpmThreshold_offset_hex = 4; public static final int injector_offset = 8; public static final int injector_offset_hex = 8; public static final int injector_flow_offset = 8; @@ -131,7 +131,7 @@ public class Fields { public static final int firingOrder_offset = 408; public static final int firingOrder_offset_hex = 198; public static final int cylinderBore_offset = 412; - public static final int unused34234_offset = 416; + public static final int sensorSnifferRpmThreshold_offset = 416; public static final int rpmHardLimit_offset = 420; public static final int algorithm_offset = 424; public static final int crankingInjectionMode_offset = 428; @@ -734,7 +734,8 @@ public class Fields { public static final int uartConsoleSerialSpeed_offset = 2228; public static final int tpsDecelEnleanmentThreshold_offset = 2232; public static final int tpsDecelEnleanmentMultiplier_offset = 2236; - public static final int unused_offset = 2240; + public static final int slowAdcAlpha_offset = 2240; + public static final int unused_offset = 2244; public static final int le_formulas1_offset = 3016; public static final int le_formulas2_offset = 3216; public static final int le_formulas3_offset = 3416; @@ -800,7 +801,7 @@ public class Fields { public static final int afrRpmBins_offset = 16024; public static final int TOTAL_CONFIG_SIZE = 16088; public static final Field ENGINETYPE = Field.create("ENGINETYPE", 0, FieldType.INT); - public static final Field UNUSEDOFFSET4 = Field.create("UNUSEDOFFSET4", 4, FieldType.INT); + public static final Field ENGINESNIFFERRPMTHRESHOLD = Field.create("ENGINESNIFFERRPMTHRESHOLD", 4, FieldType.INT); public static final Field INJECTOR_FLOW = Field.create("INJECTOR_FLOW", 8, FieldType.FLOAT); public static final Field INJECTOR_LAG = Field.create("INJECTOR_LAG", 12, FieldType.FLOAT); public static final Field DIRECTSELFSTIMULATION = Field.create("DIRECTSELFSTIMULATION", 80, FieldType.BIT, 0); @@ -842,7 +843,7 @@ public class Fields { public static final Field CYLINDERSCOUNT = Field.create("CYLINDERSCOUNT", 404, FieldType.INT); public static final Field FIRINGORDER = Field.create("FIRINGORDER", 408, FieldType.INT); public static final Field CYLINDERBORE = Field.create("CYLINDERBORE", 412, FieldType.FLOAT); - public static final Field UNUSED34234 = Field.create("UNUSED34234", 416, FieldType.INT); + public static final Field SENSORSNIFFERRPMTHRESHOLD = Field.create("SENSORSNIFFERRPMTHRESHOLD", 416, FieldType.INT); public static final Field RPMHARDLIMIT = Field.create("RPMHARDLIMIT", 420, FieldType.INT); public static final String[] engine_load_mode_e = {"MAF", "Alpha-N/TPS", "MAP", "SPEED DENSITY"}; public static final Field ALGORITHM = Field.create("ALGORITHM", 424, FieldType.INT, engine_load_mode_e); @@ -1258,6 +1259,7 @@ public class Fields { public static final Field UARTCONSOLESERIALSPEED = Field.create("UARTCONSOLESERIALSPEED", 2228, FieldType.INT); public static final Field TPSDECELENLEANMENTTHRESHOLD = Field.create("TPSDECELENLEANMENTTHRESHOLD", 2232, FieldType.FLOAT); public static final Field TPSDECELENLEANMENTMULTIPLIER = Field.create("TPSDECELENLEANMENTMULTIPLIER", 2236, FieldType.FLOAT); + public static final Field SLOWADCALPHA = Field.create("SLOWADCALPHA", 2240, FieldType.FLOAT); public static final Field LE_FORMULAS1 = Field.create("LE_FORMULAS1", 3016, FieldType.INT); public static final Field LE_FORMULAS2 = Field.create("LE_FORMULAS2", 3216, FieldType.INT); public static final Field LE_FORMULAS3 = Field.create("LE_FORMULAS3", 3416, FieldType.INT); diff --git a/java_console/models/src/com/rusefi/core/Sensor.java b/java_console/models/src/com/rusefi/core/Sensor.java index ca5ba9bf85..be4ab495a0 100644 --- a/java_console/models/src/com/rusefi/core/Sensor.java +++ b/java_console/models/src/com/rusefi/core/Sensor.java @@ -90,13 +90,13 @@ public enum Sensor { DWELL(SensorCategory.OPERATIONS, FieldType.FLOAT, 60, BackgroundColor.MUD, 1, 10), CURRENT_VE(SensorCategory.FUEL, FieldType.FLOAT, 112, BackgroundColor.MUD), - TPS_DELTA(SensorCategory.FUEL, FieldType.FLOAT, 116, BackgroundColor.MUD), - ENGINE_LOAD_ACCEL_DELTA(SensorCategory.FUEL, FieldType.FLOAT, 124, BackgroundColor.MUD), - TPS_ACCEL_FUEL(SensorCategory.FUEL, FieldType.FLOAT, 128, BackgroundColor.MUD), + deltaTps(SensorCategory.FUEL, FieldType.FLOAT, 116, BackgroundColor.MUD), + engineLoadAccelDelta(SensorCategory.FUEL, FieldType.FLOAT, 124, BackgroundColor.MUD), + tpsAccelFuel(SensorCategory.FUEL, FieldType.FLOAT, 128, BackgroundColor.MUD), Injector_duty(SensorCategory.OPERATIONS, FieldType.FLOAT, 140, BackgroundColor.MUD), - WALL_FUEL_AMOUNT(SensorCategory.FUEL, FieldType.FLOAT, 160, BackgroundColor.MUD), + wallFuelAmount(SensorCategory.FUEL, FieldType.FLOAT, 160, BackgroundColor.MUD), iatCorrection(SensorCategory.FUEL, FieldType.FLOAT, 164, BackgroundColor.MUD, 0, 5), - WALL_FUEL_CORRECTION(SensorCategory.FUEL, FieldType.FLOAT, 168, BackgroundColor.MUD), + wallFuelCorrection(SensorCategory.FUEL, FieldType.FLOAT, 168, BackgroundColor.MUD), idlePosition(SensorCategory.OPERATIONS, FieldType.FLOAT, 172, BackgroundColor.MUD), TARGET_AFR(SensorCategory.OPERATIONS, FieldType.FLOAT, 176, BackgroundColor.MUD), CHARGE_AIR_MASS(SensorCategory.OPERATIONS, FieldType.FLOAT, 180, BackgroundColor.MUD), @@ -104,6 +104,11 @@ public enum Sensor { runningFuel(SensorCategory.OPERATIONS, FieldType.FLOAT, 188, BackgroundColor.MUD, 0, 15, "ms"), injectorLagMs(SensorCategory.FUEL, FieldType.FLOAT, 196, BackgroundColor.MUD, 0, 15, "ms"), + debugFloatField2(SensorCategory.OPERATIONS, FieldType.FLOAT, 200, BackgroundColor.MUD, 0, 5), + debugFloatField3(SensorCategory.OPERATIONS, FieldType.FLOAT, 204, BackgroundColor.MUD, 0, 5), + debugFloatField4(SensorCategory.OPERATIONS, FieldType.FLOAT, 208, BackgroundColor.MUD, 0, 5), + debugFloatField5(SensorCategory.OPERATIONS, FieldType.FLOAT, 212, BackgroundColor.MUD, 0, 5), + INJ_1_2_DELTA("inj 1-2 delta", SensorCategory.SNIFFING), INJ_3_4_DELTA("inj 3-4 delta", SensorCategory.SNIFFING), ; diff --git a/java_console/ui/src/com/rusefi/ui/FormulasPane.java b/java_console/ui/src/com/rusefi/ui/FormulasPane.java index 3301eaeff3..59ff2691d9 100644 --- a/java_console/ui/src/com/rusefi/ui/FormulasPane.java +++ b/java_console/ui/src/com/rusefi/ui/FormulasPane.java @@ -110,8 +110,8 @@ public class FormulasPane { @NotNull private String getAccelerationVariables(ConfigurationImage ci) { - String tpsDelta = oneDecimal(Sensor.TPS_DELTA); - String elDelta = oneDecimal(Sensor.ENGINE_LOAD_ACCEL_DELTA); + String tpsDelta = oneDecimal(Sensor.deltaTps); + String elDelta = oneDecimal(Sensor.engineLoadAccelDelta); int tpsEnrichLength = ConfigField.getIntValue(ci, Fields.TPSACCELLENGTH); int elEnrichLength = ConfigField.getIntValue(ci, Fields.ENGINELOADACCELLENGTH); @@ -121,7 +121,7 @@ public class FormulasPane { double tpsAccelThreshold = ConfigField.getFloatValue(ci, Fields.TPSACCELENRICHMENTTHRESHOLD); double tpsAccelMult = ConfigField.getFloatValue(ci, Fields.TPSACCELENRICHMENTMULTIPLIER); - String tpsAccelValue = oneDecimal(Sensor.TPS_ACCEL_FUEL); + String tpsAccelValue = oneDecimal(Sensor.tpsAccelFuel); double tpsDecelThreshold = ConfigField.getFloatValue(ci, Fields.TPSDECELENLEANMENTTHRESHOLD); double tpsDecelMult = ConfigField.getFloatValue(ci, Fields.TPSDECELENLEANMENTMULTIPLIER); @@ -179,7 +179,7 @@ public class FormulasPane { String IATcorr = oneDecimal(Sensor.iatCorrection); String CLTcorr = oneDecimal(Sensor.cltCorrection); - String tpsAccel = oneDecimal(Sensor.TPS_ACCEL_FUEL); + String tpsAccel = oneDecimal(Sensor.tpsAccelFuel); String runningFuel = oneDecimal(Sensor.runningFuel); diff --git a/java_console/ui/src/com/rusefi/ui/FuelTunePane.java b/java_console/ui/src/com/rusefi/ui/FuelTunePane.java index faec766f63..6d583cbb20 100644 --- a/java_console/ui/src/com/rusefi/ui/FuelTunePane.java +++ b/java_console/ui/src/com/rusefi/ui/FuelTunePane.java @@ -132,7 +132,7 @@ public class FuelTunePane { double engineLoad = sc.getValue(Sensor.MAP); double afr = sc.getValue(Sensor.AFR); // todo: add UI for pre-conditions - double deltaTps = sc.getValue(Sensor.TPS_DELTA); + double deltaTps = sc.getValue(Sensor.deltaTps); double clt = sc.getValue(Sensor.CLT); // if (clt < 80) // return; diff --git a/unit_tests/test_trigger_decoder.cpp b/unit_tests/test_trigger_decoder.cpp index 605a869ffe..1a0dcff13e 100644 --- a/unit_tests/test_trigger_decoder.cpp +++ b/unit_tests/test_trigger_decoder.cpp @@ -318,6 +318,9 @@ void testRpmCalculator(void) { timeNow = 0; assertEquals(0, eth.engine.rpmCalculator.getRpm(PASS_ENGINE_PARAMETER_F)); + assertEquals(4, engine->triggerShape.triggerIndexByAngle[240]); + assertEquals(4, engine->triggerShape.triggerIndexByAngle[241]); + eth.fireTriggerEvents(48); assertEqualsM("RPM", 1500, eth.engine.rpmCalculator.getRpm(PASS_ENGINE_PARAMETER_F)); @@ -341,10 +344,14 @@ void testRpmCalculator(void) { int st = timeNow; assertEqualsM("st value", 485000, st); + // todo: why is this required here? we already have one 'prepareOutputSignals' in constructor, what's wrong with it? + prepareOutputSignals(PASS_ENGINE_PARAMETER_F); + eth.engine.periodicFastCallback(PASS_ENGINE_PARAMETER_F); + assertEqualsM("fuel #1", 3.03, eth.engine.fuelMs); InjectionEvent *ie0 = ð.engine.engineConfiguration2->injectionEvents->injectionEvents.elements[0]; - assertEquals(0, ie0->injectionStart.angleOffset); + assertEqualsM("injection angle", 0, ie0->injectionStart.angleOffset); eth.engine.triggerCentral.handleShaftSignal(SHAFT_PRIMARY_UP PASS_ENGINE_PARAMETER); assertEquals(1500, eth.engine.rpmCalculator.rpmValue); @@ -358,6 +365,7 @@ void testRpmCalculator(void) { assertEqualsM("index #2", 0, eth.engine.triggerCentral.triggerState.getCurrentIndex()); assertEqualsM("queue size/6", 6, schedulingQueue.size()); + { scheduling_s *ev0 = schedulingQueue.getForUnitText(0); assertREquals((void*)ev0->callback, (void*)turnPinHigh); @@ -379,6 +387,7 @@ void testRpmCalculator(void) { scheduling_s *ev5 = schedulingQueue.getForUnitText(5); assertEqualsLM("o 5", (long)&enginePins.injectors[0], (long)ev5->param); + } schedulingQueue.clear(); @@ -396,15 +405,40 @@ void testRpmCalculator(void) { assertEqualsM("3/3", st + 14777, schedulingQueue.getForUnitText(3)->momentX); schedulingQueue.clear(); + assertEquals(5, engine->triggerShape.triggerIndexByAngle[240]); + assertEquals(5, engine->triggerShape.triggerIndexByAngle[241]); + timeNow += 5000; + assertEqualsM("Size 4.1", 6, engine->engineConfiguration2->injectionEvents->eventsCount); + assertFalseM("No squirts expected 4.1", engine->engineConfiguration2->injectionEvents->hasEvents[4]); eth.engine.triggerCentral.handleShaftSignal(SHAFT_PRIMARY_DOWN PASS_ENGINE_PARAMETER); + assertEqualsM("queue size 4.1", 0, schedulingQueue.size()); + timeNow += 5000; // 5ms eth.engine.triggerCentral.handleShaftSignal(SHAFT_PRIMARY_UP PASS_ENGINE_PARAMETER); + assertEqualsM("queue size 4.2", 6, schedulingQueue.size()); + timeNow += 5000; // 5ms eth.engine.triggerCentral.handleShaftSignal(SHAFT_PRIMARY_UP PASS_ENGINE_PARAMETER); + assertEqualsM("queue size 4.3", 6, schedulingQueue.size()); + + assertEqualsM("dwell", 4.5, eth.engine.engineState.dwellAngle); + assertEqualsM("fuel", 3.03, eth.engine.fuelMs); + assertEquals(1500, eth.engine.rpmCalculator.rpmValue); + { + scheduling_s *ev0 = schedulingQueue.getForUnitText(0); + + assertREquals((void*)ev0->callback, (void*)turnPinHigh); + assertEqualsM("ev 0/2", st + 26666, ev0->momentX); + assertEqualsLM("o 0/2", (long)&enginePins.injectors[2], (long)ev0->param); + + scheduling_s *ev1 = schedulingQueue.getForUnitText(1); + assertEqualsM("ev 1/2", st + 26666, ev1->momentX); + assertEqualsLM("o 1/2", (long)&enginePins.injectors[5], (long)ev1->param); + } + assertEqualsM("index #4", 6, eth.engine.triggerCentral.triggerState.getCurrentIndex()); assertEqualsM("queue size 4", 6, schedulingQueue.size()); - assertEqualsM("4/0", st + 26666, schedulingQueue.getForUnitText(0)->momentX); schedulingQueue.clear(); timeNow += 5000; diff --git a/win32_functional_tests/simulator/rusEfiFunctionalTest.cpp b/win32_functional_tests/simulator/rusEfiFunctionalTest.cpp index fc50d3ac72..e98e5b93bd 100644 --- a/win32_functional_tests/simulator/rusEfiFunctionalTest.cpp +++ b/win32_functional_tests/simulator/rusEfiFunctionalTest.cpp @@ -109,7 +109,7 @@ void rusEfiFunctionalTest(void) { void printPendingMessages(void) { updateDevConsoleState(engine); - waveChart.publishChartIfFull(); + waveChart.publishIfFull(); } int isSerialOverTcpReady;