diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 29e0b705b5..ef9263d0d6 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -672,7 +672,7 @@ class LcdController : public PeriodicController { public: LcdController() : PeriodicController("LCD") { } private: - void PeriodicTask(efitime_t nowNt) override { + void PeriodicTask(efitick_t nowNt) override { UNUSED(nowNt); setPeriod(NOT_TOO_OFTEN(10 /* ms */, engineConfiguration->lcdThreadPeriodMs)); if (engineConfiguration->useLcdScreen) { diff --git a/firmware/controllers/algo/engine.cpp b/firmware/controllers/algo/engine.cpp index c745096a17..d00b4697d8 100644 --- a/firmware/controllers/algo/engine.cpp +++ b/firmware/controllers/algo/engine.cpp @@ -355,7 +355,7 @@ bool Engine::isInShutdownMode() const { if (stopEngineRequestTimeNt == 0) // the shutdown procedure is not started return false; - const efitime_t engineStopWaitTimeoutNt = 5LL * 1000000LL; + const efitick_t engineStopWaitTimeoutNt = 5LL * 1000000LL; // The engine is still spinning! Give it some time to stop (but wait no more than 5 secs) if (isSpinning && (getTimeNowNt() - stopEngineRequestTimeNt) < US2NT(engineStopWaitTimeoutNt)) return true; diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index dea2551c28..dc91cbf19b 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -141,16 +141,11 @@ public: bool isCltBroken = false; bool slowCallBackWasInvoked = false; - -// floatms_t callToPitEndTime; - /** * remote telemetry: if not zero, time to stop flashing 'CALL FROM PIT STOP' light + * todo: looks like there is a bug here? 64 bit storage an 32 bit time logic? anyway this feature is mostly a dream at this point */ - efitime_t callFromPitStopEndTime = 0; - - // timestamp of most recent time RPM hard limit was triggered - efitime_t rpmHardLimitTimestamp = 0; + efitimems64_t callFromPitStopEndTime = 0; /** * This flag indicated a big enough problem that engine control would be @@ -242,6 +237,7 @@ public: * some areas */ bool isTestMode = false; + void resetEngineSnifferIfInTestMode(); /** diff --git a/firmware/controllers/algo/rusefi_types.h b/firmware/controllers/algo/rusefi_types.h index 41c23f8693..fa02d9f7b1 100644 --- a/firmware/controllers/algo/rusefi_types.h +++ b/firmware/controllers/algo/rusefi_types.h @@ -30,7 +30,7 @@ typedef unsigned int time_t; typedef time_t efitimesec_t; /** - * integer time in milliseconds + * integer time in milliseconds (1/1_000 of a second) * 32 bit 4B / 1000 = 4M seconds = 1111.11 hours = 46 days. * Please restart your ECU every 46 days? :) * See getTimeNowUs() @@ -51,10 +51,16 @@ typedef int pid_dt; typedef int64_t efitime_t; /** - * 64 bit time in microseconds, since boot + * 64 bit time in microseconds (1/1_000_000 of a second), since boot */ typedef efitime_t efitimeus_t; +/** + * 64 bit time in milliseconds (1/1_000 of a second), since boot + */ +typedef efitime_t efitimems64_t; + + /** * platform-dependent tick since boot * in case of stm32f4 that's a CPU tick diff --git a/firmware/controllers/engine_cycle/rpm_calculator.cpp b/firmware/controllers/engine_cycle/rpm_calculator.cpp index f4bec44fbc..f31785e882 100644 --- a/firmware/controllers/engine_cycle/rpm_calculator.cpp +++ b/firmware/controllers/engine_cycle/rpm_calculator.cpp @@ -96,7 +96,7 @@ RpmCalculator::RpmCalculator() { // which we cannot provide inside this parameter-less constructor. need a solution for this minor mess // we need this initial to have not_running at first invocation - lastRpmEventTimeNt = (efitime_t) -10 * US2NT(US_PER_SECOND_LL); + lastRpmEventTimeNt = (efitick_t) -10 * US2NT(US_PER_SECOND_LL); } /** @@ -200,7 +200,7 @@ void RpmCalculator::setStopSpinning(DECLARE_ENGINE_PARAMETER_SIGNATURE) { setStopped(PASS_ENGINE_PARAMETER_SIGNATURE); } -void RpmCalculator::setSpinningUp(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { +void RpmCalculator::setSpinningUp(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { if (!CONFIG(isFasterEngineSpinUpEnabled)) return; // Only a completely stopped and non-spinning engine can enter the spinning-up state. @@ -239,7 +239,7 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, bool hadRpmRecently = rpmState->checkIfSpinning(nowNt PASS_ENGINE_PARAMETER_SUFFIX); if (hadRpmRecently) { - efitime_t diffNt = nowNt - rpmState->lastRpmEventTimeNt; + efitick_t diffNt = nowNt - rpmState->lastRpmEventTimeNt; /** * Four stroke cycle is two crankshaft revolutions * @@ -329,8 +329,8 @@ static void tdcMarkCallback(trigger_event_e ckpSignalType, /** * @return Current crankshaft angle, 0 to 720 for four-stroke */ -float getCrankshaftAngleNt(efitime_t timeNt DECLARE_ENGINE_PARAMETER_SUFFIX) { - efitime_t timeSinceZeroAngleNt = timeNt +float getCrankshaftAngleNt(efitick_t timeNt DECLARE_ENGINE_PARAMETER_SUFFIX) { + efitick_t timeSinceZeroAngleNt = timeNt - engine->rpmCalculator.lastRpmEventTimeNt; /** diff --git a/firmware/controllers/engine_cycle/rpm_calculator.h b/firmware/controllers/engine_cycle/rpm_calculator.h index e7be215c06..589cef6cc6 100644 --- a/firmware/controllers/engine_cycle/rpm_calculator.h +++ b/firmware/controllers/engine_cycle/rpm_calculator.h @@ -74,7 +74,7 @@ public: /** * Should be called on every trigger event when the engine is just starting to spin up. */ - void setSpinningUp(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); + void setSpinningUp(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); /** * Called if the synchronization is lost due to a trigger timeout. */ @@ -116,7 +116,7 @@ public: * NaN while engine is not spinning */ volatile floatus_t oneDegreeUs = NAN; - volatile efitime_t lastRpmEventTimeNt = 0; + volatile efitick_t lastRpmEventTimeNt = 0; private: /** * Should be called once we've realized engine is not spinning any more. @@ -156,7 +156,7 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, uint32_t index DECL */ void initRpmCalculator(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX); -float getCrankshaftAngleNt(efitime_t timeNt DECLARE_ENGINE_PARAMETER_SUFFIX); +float getCrankshaftAngleNt(efitick_t timeNt DECLARE_ENGINE_PARAMETER_SUFFIX); #define getRevolutionCounter() ENGINE(rpmCalculator.getRevolutionCounterM()) diff --git a/firmware/controllers/gauges/malfunction_indicator.cpp b/firmware/controllers/gauges/malfunction_indicator.cpp index b05baa2ff8..3b33ac3f8b 100644 --- a/firmware/controllers/gauges/malfunction_indicator.cpp +++ b/firmware/controllers/gauges/malfunction_indicator.cpp @@ -84,7 +84,7 @@ class MILController : public PeriodicController { public: MILController() : PeriodicController("MFIndicator") { } private: - void PeriodicTask(efitime_t nowNt) override { + void PeriodicTask(efitick_t nowNt) override { UNUSED(nowNt); if (nowNt - engine->triggerCentral.triggerState.mostRecentSyncTime < US2NT(MS2US(500))) { diff --git a/firmware/controllers/injector_central.cpp b/firmware/controllers/injector_central.cpp index 83e081e0ac..30af1cff42 100644 --- a/firmware/controllers/injector_central.cpp +++ b/firmware/controllers/injector_central.cpp @@ -236,7 +236,7 @@ class BenchController : public PeriodicController { public: BenchController() : PeriodicController("BenchThread") { } private: - void PeriodicTask(efitime_t nowNt) override { + void PeriodicTask(efitick_t nowNt) override { UNUSED(nowNt); setPeriod(50 /* ms */); diff --git a/firmware/controllers/system/periodic_thread_controller.h b/firmware/controllers/system/periodic_thread_controller.h index d9981a848b..13e7e44d47 100644 --- a/firmware/controllers/system/periodic_thread_controller.h +++ b/firmware/controllers/system/periodic_thread_controller.h @@ -53,7 +53,7 @@ protected: /** * @brief Called periodically. Override this method to do work for your controller. */ - virtual void PeriodicTask(efitime_t nowNt) = 0; + virtual void PeriodicTask(efitick_t nowNt) = 0; private: void ThreadTask() override final @@ -63,7 +63,7 @@ private: while(true) { systime_t before = chVTGetSystemTime(); - efitime_t nowNt = getTimeNowNt(); + efitick_t nowNt = getTimeNowNt(); { ScopePerf perf(PE::PeriodicControllerPeriodicTask); diff --git a/firmware/controllers/system/timer/pwm_generator_logic.cpp b/firmware/controllers/system/timer/pwm_generator_logic.cpp index c56e38d566..2a30ac0d7a 100644 --- a/firmware/controllers/system/timer/pwm_generator_logic.cpp +++ b/firmware/controllers/system/timer/pwm_generator_logic.cpp @@ -112,7 +112,7 @@ static efitimeus_t getNextSwitchTimeUs(PwmConfig *state) { * Once 'iteration' gets relatively high, we might lose calculation precision here. * This is addressed by ITERATION_LIMIT */ - efitime_t timeToSwitchNt = (efitime_t) ((iteration + switchTime) * periodNt); + efitick_t timeToSwitchNt = (efitick_t) ((iteration + switchTime) * periodNt); #if DEBUG_PWM scheduleMsg(&logger, "start=%d timeToSwitch=%d", state->safe.start, timeToSwitch); diff --git a/firmware/controllers/system/timer/single_timer_executor.cpp b/firmware/controllers/system/timer/single_timer_executor.cpp index 3aafa3a1cc..0bebb2a226 100644 --- a/firmware/controllers/system/timer/single_timer_executor.cpp +++ b/firmware/controllers/system/timer/single_timer_executor.cpp @@ -37,8 +37,6 @@ EXTERN_ENGINE; extern schfunc_t globalTimerCallback; -//static int timerIsLate = 0; -//static efitime_t callbackTime = 0; /** * these fields are global in order to facilitate debugging */ diff --git a/firmware/controllers/trigger/trigger_central.h b/firmware/controllers/trigger/trigger_central.h index 792feb997c..c441e090f5 100644 --- a/firmware/controllers/trigger/trigger_central.h +++ b/firmware/controllers/trigger/trigger_central.h @@ -46,7 +46,7 @@ public: efitick_t previousVvtCamTime = 0; efitick_t previousVvtCamDuration = 0; - volatile efitime_t previousShaftEventTimeNt; + volatile efitick_t previousShaftEventTimeNt; private: IntListenerArray<15> triggerListeneres; @@ -57,7 +57,6 @@ private: }; void triggerInfo(void); -efitime_t getCrankEventCounter(DECLARE_ENGINE_PARAMETER_SIGNATURE); void hwHandleShaftSignal(trigger_event_e signal); void hwHandleVvtCamSignal(trigger_value_e front DECLARE_ENGINE_PARAMETER_SUFFIX); diff --git a/firmware/controllers/trigger/trigger_decoder.cpp b/firmware/controllers/trigger/trigger_decoder.cpp index 966a86750b..a080f841c3 100644 --- a/firmware/controllers/trigger/trigger_decoder.cpp +++ b/firmware/controllers/trigger/trigger_decoder.cpp @@ -172,7 +172,7 @@ void calculateTriggerSynchPoint(TriggerWaveform *shape, TriggerState *state DECL } } -efitime_t TriggerState::getTotalEventCounter() const { +int64_t TriggerState::getTotalEventCounter() const { return totalEventCountBase + currentCycle.current_index; } @@ -188,7 +188,7 @@ void TriggerStateWithRunningStatistics::movePreSynchTimestamps(DECLARE_ENGINE_PA } } -float TriggerStateWithRunningStatistics::calculateInstantRpm(int *prevIndexOut, efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { +float TriggerStateWithRunningStatistics::calculateInstantRpm(int *prevIndexOut, efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { int current_index = currentCycle.current_index; // local copy so that noone changes the value on us timeOfLastEvent[current_index] = nowNt; /** @@ -236,7 +236,7 @@ float TriggerStateWithRunningStatistics::calculateInstantRpm(int *prevIndexOut, return instantRpm; } -void TriggerStateWithRunningStatistics::setLastEventTimeForInstantRpm(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { +void TriggerStateWithRunningStatistics::setLastEventTimeForInstantRpm(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { if (shaft_is_synchronized) { return; } @@ -250,7 +250,7 @@ void TriggerStateWithRunningStatistics::setLastEventTimeForInstantRpm(efitime_t spinningEvents[spinningEventIndex++] = nowNt; } -void TriggerStateWithRunningStatistics::runtimeStatistics(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { +void TriggerStateWithRunningStatistics::runtimeStatistics(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { if (engineConfiguration->debugMode == DBG_INSTANT_RPM) { instantRpm = calculateInstantRpm(NULL, nowNt PASS_ENGINE_PARAMETER_SUFFIX); } @@ -385,7 +385,7 @@ void TriggerState::handleTriggerError(DECLARE_ENGINE_PARAMETER_SIGNATURE) { } void TriggerState::onShaftSynchronization(const TriggerStateCallback triggerCycleCallback, - efitime_t nowNt, trigger_wheel_e triggerWheel DECLARE_ENGINE_PARAMETER_SUFFIX) { + efitick_t nowNt, trigger_wheel_e triggerWheel DECLARE_ENGINE_PARAMETER_SUFFIX) { setShaftSynchronized(true); // this call would update duty cycle values nextTriggerEvent() @@ -418,7 +418,7 @@ void TriggerState::onShaftSynchronization(const TriggerStateCallback triggerCycl */ void TriggerState::decodeTriggerEvent(const TriggerStateCallback triggerCycleCallback, TriggerStateListener * triggerStateListener, - trigger_event_e const signal, efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { + trigger_event_e const signal, efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { ScopePerf perf(PE::DecodeTriggerEvent, static_cast(signal)); bool useOnlyRisingEdgeForTrigger = CONFIG(useOnlyRisingEdgeForTrigger); @@ -441,7 +441,7 @@ void TriggerState::decodeTriggerEvent(const TriggerStateCallback triggerCycleCal efiAssertVoid(CUSTOM_OBD_93, toothed_previous_time <= nowNt, "toothed_previous_time after nowNt"); - efitime_t currentDurationLong = getCurrentGapDuration(nowNt); + efitick_t currentDurationLong = getCurrentGapDuration(nowNt); /** * For performance reasons, we want to work with 32 bit values. If there has been more then @@ -760,7 +760,7 @@ void initTriggerDecoderLogger(Logging *sharedLogger) { logger = sharedLogger; } -void TriggerState::runtimeStatistics(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { +void TriggerState::runtimeStatistics(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) { UNUSED(nowNt); // empty base implementation } diff --git a/firmware/controllers/trigger/trigger_decoder.h b/firmware/controllers/trigger/trigger_decoder.h index 53b1a8dc04..a07c60490f 100644 --- a/firmware/controllers/trigger/trigger_decoder.h +++ b/firmware/controllers/trigger/trigger_decoder.h @@ -72,7 +72,7 @@ public: bool validateEventCounters(DECLARE_ENGINE_PARAMETER_SIGNATURE) const; void handleTriggerError(DECLARE_ENGINE_PARAMETER_SIGNATURE); void onShaftSynchronization(const TriggerStateCallback triggerCycleCallback, - efitime_t nowNt, trigger_wheel_e triggerWheel DECLARE_ENGINE_PARAMETER_SUFFIX); + efitick_t nowNt, trigger_wheel_e triggerWheel DECLARE_ENGINE_PARAMETER_SUFFIX); /** * Resets synchronization flag and alerts rpm_calculator to reset engine spinning flag. */ @@ -85,7 +85,7 @@ public: * TRUE if we know where we are */ bool shaft_is_synchronized; - efitime_t mostRecentSyncTime; + efitick_t mostRecentSyncTime; efitick_t lastDecodingErrorTime; // the boolean flag is a performance optimization so that complex comparison is avoided if no error @@ -96,7 +96,7 @@ public: */ uint32_t toothDurations[GAP_TRACKING_LENGTH + 1]; - efitime_t toothed_previous_time; + efitick_t toothed_previous_time; current_cycle_state_s currentCycle; @@ -112,7 +112,7 @@ public: void setShaftSynchronized(bool value); #if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT - virtual void runtimeStatistics(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); + virtual void runtimeStatistics(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); #endif /** @@ -125,7 +125,7 @@ private: trigger_event_e curSignal; trigger_event_e prevSignal; - efitime_t totalEventCountBase; + int64_t totalEventCountBase; uint32_t totalRevolutionCounter; bool isFirstEvent; }; @@ -158,15 +158,15 @@ public: */ float prevInstantRpmValue = 0; void movePreSynchTimestamps(DECLARE_ENGINE_PARAMETER_SIGNATURE); - float calculateInstantRpm(int *prevIndex, efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); + float calculateInstantRpm(int *prevIndex, efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); #if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT - void runtimeStatistics(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) override; + void runtimeStatistics(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) override; #endif /** * Update timeOfLastEvent[] on every trigger event - even without synchronization * Needed for early spin-up RPM detection. */ - void setLastEventTimeForInstantRpm(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); + void setLastEventTimeForInstantRpm(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); }; angle_t getEngineCycle(operation_mode_e operationMode); diff --git a/firmware/development/engine_sniffer.cpp b/firmware/development/engine_sniffer.cpp index 39b27c0000..e6cf1d3276 100644 --- a/firmware/development/engine_sniffer.cpp +++ b/firmware/development/engine_sniffer.cpp @@ -113,7 +113,7 @@ bool WaveChart::isStartedTooLongAgo() const { * engineChartSize/20 is the longest meaningful chart. * */ - efitime_t chartDurationNt = getTimeNowNt() - startTimeNt; + efitick_t chartDurationNt = getTimeNowNt() - startTimeNt; return startTimeNt != 0 && NT2US(chartDurationNt) > engineConfiguration->engineChartSize * 1000000 / 20; } diff --git a/firmware/development/engine_sniffer.h b/firmware/development/engine_sniffer.h index cbf1c9f05d..33d0cdfdf6 100644 --- a/firmware/development/engine_sniffer.h +++ b/firmware/development/engine_sniffer.h @@ -37,7 +37,7 @@ private: * https://github.com/rusefi/rusefi/issues/780 */ bool collectingData = false; - efitime_t startTimeNt = 0; + efitick_t startTimeNt = 0; volatile int isInitialized = false; }; diff --git a/firmware/development/logic_analyzer.cpp b/firmware/development/logic_analyzer.cpp index 20b1283c0e..cc48f30c44 100644 --- a/firmware/development/logic_analyzer.cpp +++ b/firmware/development/logic_analyzer.cpp @@ -43,7 +43,7 @@ extern bool hasFirmwareErrorFlag; * Difference between current 1st trigger event and previous 1st trigger event. */ static volatile uint32_t engineCycleDurationUs; -static volatile efitime_t previousEngineCycleTimeUs = 0; +static volatile efitimeus_t previousEngineCycleTimeUs = 0; static int waveReaderCount = 0; static WaveReader readers[MAX_ICU_COUNT]; @@ -133,7 +133,7 @@ static void waTriggerEventListener(trigger_event_e ckpSignalType, uint32_t index if (index != 0) { return; } - efitick_t nowUs = getTimeNowUs(); + efitimeus_t nowUs = getTimeNowUs(); engineCycleDurationUs = nowUs - previousEngineCycleTimeUs; previousEngineCycleTimeUs = nowUs; } diff --git a/firmware/hw_layer/adc_inputs.cpp b/firmware/hw_layer/adc_inputs.cpp index b317e65ca5..d3952dcc93 100644 --- a/firmware/hw_layer/adc_inputs.cpp +++ b/firmware/hw_layer/adc_inputs.cpp @@ -421,7 +421,7 @@ public: { } - void PeriodicTask(efitime_t nowNt) override { + void PeriodicTask(efitick_t nowNt) override { { ScopePerf perf(PE::AdcConversionSlow); diff --git a/firmware/hw_layer/microsecond_timer.cpp b/firmware/hw_layer/microsecond_timer.cpp index f5e70acf4d..9887834c28 100644 --- a/firmware/hw_layer/microsecond_timer.cpp +++ b/firmware/hw_layer/microsecond_timer.cpp @@ -130,7 +130,7 @@ static void hwTimerCallback(GPTDriver *gptp) { class MicrosecondTimerWatchdogController : public PeriodicTimerController { void PeriodicTask() override { - efitime_t nowNt = getTimeNowNt(); + efitick_t nowNt = getTimeNowNt(); if (nowNt >= lastSetTimerTimeNt + 2 * CORE_CLOCK) { strcpy(buff, "no_event"); itoa10(&buff[8], lastSetTimerValue); diff --git a/firmware/hw_layer/sensors/accelerometer.cpp b/firmware/hw_layer/sensors/accelerometer.cpp index 51ef8c834c..f4c1bac5de 100644 --- a/firmware/hw_layer/sensors/accelerometer.cpp +++ b/firmware/hw_layer/sensors/accelerometer.cpp @@ -61,7 +61,7 @@ class AccelController : public PeriodicController { public: AccelController() : PeriodicController("Acc SPI") { } private: - void PeriodicTask(efitime_t nowNt) override { + void PeriodicTask(efitick_t nowNt) override { // has to be a thread since we want to use blocking method - blocking method only available in threads, not in interrupt handler // todo: migrate to async SPI API? engine->sensors.accelerometer.x = (int8_t)lis302dlReadRegister(driver, LIS302DL_OUTX); diff --git a/java_console/ui/src/com/rusefi/ui/RecentCommands.java b/java_console/ui/src/com/rusefi/ui/RecentCommands.java index f3079c5801..42abd8eeee 100644 --- a/java_console/ui/src/com/rusefi/ui/RecentCommands.java +++ b/java_console/ui/src/com/rusefi/ui/RecentCommands.java @@ -2,7 +2,6 @@ package com.rusefi.ui; import com.rusefi.AverageAnglesUtil; import com.rusefi.FileLog; -import com.rusefi.IoUtil; import com.rusefi.config.generated.Fields; import com.rusefi.core.MessagesCentral; import com.rusefi.io.CommandQueue;