deep rabbit holes are the best ones!

refactoring: encapsulation
This commit is contained in:
Andrey 2022-09-14 01:53:17 -04:00
parent b439f27284
commit 579f3df7ad
9 changed files with 72 additions and 71 deletions

View File

@ -100,14 +100,6 @@ trigger_type_e getVvtTriggerType(vvt_mode_e vvtMode) {
} }
} }
static operation_mode_e lookupOperationMode() {
if (engineConfiguration->twoStroke) {
return TWO_STROKE;
} else {
return engineConfiguration->skippedWheelOnCam ? FOUR_STROKE_CAM_SENSOR : FOUR_STROKE_CRANK_SENSOR;
}
}
static void initVvtShape(TriggerWaveform& shape, const TriggerConfiguration& config, TriggerDecoderBase &initState) { static void initVvtShape(TriggerWaveform& shape, const TriggerConfiguration& config, TriggerDecoderBase &initState) {
shape.initializeTriggerWaveform(FOUR_STROKE_CAM_SENSOR, config); shape.initializeTriggerWaveform(FOUR_STROKE_CAM_SENSOR, config);
@ -118,16 +110,16 @@ void Engine::updateTriggerWaveform() {
static TriggerDecoderBase initState("init"); static TriggerDecoderBase initState("init");
// Re-read config in case it's changed // Re-read config in case it's changed
primaryTriggerConfiguration.update(); triggerCentral.primaryTriggerConfiguration.update();
for (int camIndex = 0;camIndex < CAMS_PER_BANK;camIndex++) { for (int camIndex = 0;camIndex < CAMS_PER_BANK;camIndex++) {
vvtTriggerConfiguration[camIndex].update(); triggerCentral.vvtTriggerConfiguration[camIndex].update();
} }
#if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT #if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT
// we have a confusing threading model so some synchronization would not hurt // we have a confusing threading model so some synchronization would not hurt
chibios_rt::CriticalSectionLocker csl; chibios_rt::CriticalSectionLocker csl;
TRIGGER_WAVEFORM(initializeTriggerWaveform(lookupOperationMode(), primaryTriggerConfiguration)); triggerCentral.triggerShape.initializeTriggerWaveform(lookupOperationMode(), triggerCentral.primaryTriggerConfiguration);
/** /**
* this is only useful while troubleshooting a new trigger shape in the field * this is only useful while troubleshooting a new trigger shape in the field
@ -166,7 +158,7 @@ void Engine::updateTriggerWaveform() {
if (engineConfiguration->vvtMode[camIndex] != VVT_INACTIVE) { if (engineConfiguration->vvtMode[camIndex] != VVT_INACTIVE) {
initVvtShape( initVvtShape(
triggerCentral.vvtShape[camIndex], triggerCentral.vvtShape[camIndex],
vvtTriggerConfiguration[camIndex], triggerCentral.vvtTriggerConfiguration[camIndex],
initState initState
); );
} }
@ -193,9 +185,9 @@ void Engine::periodicSlowCallback() {
ScopePerf perf(PE::EnginePeriodicSlowCallback); ScopePerf perf(PE::EnginePeriodicSlowCallback);
// Re-read config in case it's changed // Re-read config in case it's changed
primaryTriggerConfiguration.update(); triggerCentral.primaryTriggerConfiguration.update();
for (int camIndex = 0;camIndex < CAMS_PER_BANK;camIndex++) { for (int camIndex = 0;camIndex < CAMS_PER_BANK;camIndex++) {
vvtTriggerConfiguration[camIndex].update(); triggerCentral.vvtTriggerConfiguration[camIndex].update();
} }
efiWatchdog(); efiWatchdog();
@ -419,9 +411,9 @@ void Engine::OnTriggerSyncronization(bool wasSynchronized, bool isDecodingError)
#endif #endif
void Engine::injectEngineReferences() { void Engine::injectEngineReferences() {
primaryTriggerConfiguration.update(); triggerCentral.primaryTriggerConfiguration.update();
for (int camIndex = 0;camIndex < CAMS_PER_BANK;camIndex++) { for (int camIndex = 0;camIndex < CAMS_PER_BANK;camIndex++) {
vvtTriggerConfiguration[camIndex].update(); triggerCentral.vvtTriggerConfiguration[camIndex].update();
} }
} }
@ -568,23 +560,6 @@ injection_mode_e getCurrentInjectionMode() {
return getEngineRotationState()->isCranking() ? engineConfiguration->crankingInjectionMode : engineConfiguration->injectionMode; return getEngineRotationState()->isCranking() ? engineConfiguration->crankingInjectionMode : engineConfiguration->injectionMode;
} }
// see also in TunerStudio project '[doesTriggerImplyOperationMode] tag
// this is related to 'knownOperationMode' flag
static bool doesTriggerImplyOperationMode(trigger_type_e type) {
switch (type) {
case TT_TOOTHED_WHEEL:
case TT_ONE:
case TT_3_1_CAM:
case TT_36_2_2_2: // TODO: should this one be in this list?
case TT_TOOTHED_WHEEL_60_2:
case TT_TOOTHED_WHEEL_36_1:
// These modes could be either cam or crank speed
return false;
default:
return true;
}
}
/** /**
* The idea of this method is to execute all heavy calculations in a lower-priority thread, * The idea of this method is to execute all heavy calculations in a lower-priority thread,
* so that trigger event handler/IO scheduler tasks are faster. * so that trigger event handler/IO scheduler tasks are faster.

View File

@ -91,29 +91,6 @@ class IEtbController;
struct IIdleController; struct IIdleController;
class PrimaryTriggerConfiguration final : public TriggerConfiguration {
public:
PrimaryTriggerConfiguration() : TriggerConfiguration("TRG ") {}
protected:
bool isUseOnlyRisingEdgeForTrigger() const override;
bool isVerboseTriggerSynchDetails() const override;
trigger_config_s getType() const override;
};
class VvtTriggerConfiguration final : public TriggerConfiguration {
public:
const int index;
VvtTriggerConfiguration(const char * prefix, const int index) : TriggerConfiguration(prefix), index(index) {
}
protected:
bool isUseOnlyRisingEdgeForTrigger() const override;
bool isVerboseTriggerSynchDetails() const override;
trigger_config_s getType() const override;
};
class Engine final : public TriggerStateListener { class Engine final : public TriggerStateListener {
public: public:
Engine(); Engine();
@ -200,13 +177,6 @@ public:
FanControl1 fan1; FanControl1 fan1;
FanControl2 fan2; FanControl2 fan2;
PrimaryTriggerConfiguration primaryTriggerConfiguration;
#if CAMS_PER_BANK == 1
VvtTriggerConfiguration vvtTriggerConfiguration[CAMS_PER_BANK] = {{"VVT1 ", 0}};
#else
VvtTriggerConfiguration vvtTriggerConfiguration[CAMS_PER_BANK] = {{"VVT1 ", 0}, {"VVT2 ", 1}};
#endif
efitick_t startStopStateLastPushTime = 0; efitick_t startStopStateLastPushTime = 0;
#if EFI_SHAFT_POSITION_INPUT #if EFI_SHAFT_POSITION_INPUT

View File

@ -101,6 +101,31 @@ bool RpmCalculator::checkIfSpinning(efitick_t nowNt) const {
return true; return true;
} }
// see also in TunerStudio project '[doesTriggerImplyOperationMode] tag
// this is related to 'knownOperationMode' flag
static bool doesTriggerImplyOperationMode(trigger_type_e type) {
switch (type) {
case TT_TOOTHED_WHEEL:
case TT_ONE:
case TT_3_1_CAM:
case TT_36_2_2_2: // TODO: should this one be in this list?
case TT_TOOTHED_WHEEL_60_2:
case TT_TOOTHED_WHEEL_36_1:
// These modes could be either cam or crank speed
return false;
default:
return true;
}
}
operation_mode_e lookupOperationMode() {
if (engineConfiguration->twoStroke) {
return TWO_STROKE;
} else {
return engineConfiguration->skippedWheelOnCam ? FOUR_STROKE_CAM_SENSOR : FOUR_STROKE_CRANK_SENSOR;
}
}
// todo: move to triggerCentral/triggerShape since has nothing to do with rotation state! // todo: move to triggerCentral/triggerShape since has nothing to do with rotation state!
operation_mode_e RpmCalculator::getOperationMode() const { operation_mode_e RpmCalculator::getOperationMode() const {
// Ignore user-provided setting for well known triggers. // Ignore user-provided setting for well known triggers.

View File

@ -178,6 +178,7 @@ void tdcMarkCallback(
* @brief Initialize RPM calculator * @brief Initialize RPM calculator
*/ */
void initRpmCalculator(); void initRpmCalculator();
operation_mode_e lookupOperationMode();
#define getRevolutionCounter() (engine->rpmCalculator.getRevolutionCounterM()) #define getRevolutionCounter() (engine->rpmCalculator.getRevolutionCounterM())

View File

@ -209,7 +209,7 @@ static void logFront(bool isImportantFront, efitick_t nowNt, int index) {
#if EFI_PROD_CODE #if EFI_PROD_CODE
writePad("cam debug", engineConfiguration->camInputsDebug[index], 1); writePad("cam debug", engineConfiguration->camInputsDebug[index], 1);
#endif /* EFI_PROD_CODE */ #endif /* EFI_PROD_CODE */
engine->executor.scheduleByTimestampNt("dbg_on", &debugToggleScheduling, nowNt + DEBUG_PIN_DELAY, &turnOffAllDebugFields); getExecutorInterface()->scheduleByTimestampNt("dbg_on", &debugToggleScheduling, nowNt + DEBUG_PIN_DELAY, &turnOffAllDebugFields);
} }
if (engineConfiguration->displayLogicLevelsInEngineSniffer && isImportantFront) { if (engineConfiguration->displayLogicLevelsInEngineSniffer && isImportantFront) {
@ -301,7 +301,7 @@ void hwHandleVvtCamSignal(TriggerValue front, efitick_t nowNt, int index) {
"vvt", "vvt",
tc->vvtShape[camIndex], tc->vvtShape[camIndex],
nullptr, nullptr,
engine->vvtTriggerConfiguration[camIndex], engine->triggerCentral.vvtTriggerConfiguration[camIndex],
front == TriggerValue::RISE ? SHAFT_PRIMARY_RISING : SHAFT_PRIMARY_FALLING, nowNt); front == TriggerValue::RISE ? SHAFT_PRIMARY_RISING : SHAFT_PRIMARY_FALLING, nowNt);
// yes we log data from all VVT channels into same fields for now // yes we log data from all VVT channels into same fields for now
tc->triggerState.vvtSyncGapRatio = vvtDecoder.triggerSyncGapRatio; tc->triggerState.vvtSyncGapRatio = vvtDecoder.triggerSyncGapRatio;
@ -471,7 +471,7 @@ void handleShaftSignal(int signalIndex, bool isRising, efitick_t timestamp) {
// for effective noise filtering, we need both signal edges, // for effective noise filtering, we need both signal edges,
// so we pass them to handleShaftSignal() and defer this test // so we pass them to handleShaftSignal() and defer this test
if (!engineConfiguration->useNoiselessTriggerDecoder) { if (!engineConfiguration->useNoiselessTriggerDecoder) {
if (!isUsefulSignal(signal, engine->primaryTriggerConfiguration)) { if (!isUsefulSignal(signal, engine->triggerCentral.primaryTriggerConfiguration)) {
/** /**
* no need to process VR falls further * no need to process VR falls further
*/ */
@ -660,7 +660,7 @@ void TriggerCentral::handleShaftSignal(trigger_event_e signal, efitick_t timesta
if (!noiseFilter.noiseFilter(timestamp, &triggerState, signal)) { if (!noiseFilter.noiseFilter(timestamp, &triggerState, signal)) {
return; return;
} }
if (!isUsefulSignal(signal, engine->primaryTriggerConfiguration)) { if (!isUsefulSignal(signal, primaryTriggerConfiguration)) {
return; return;
} }
} }
@ -678,7 +678,7 @@ void TriggerCentral::handleShaftSignal(trigger_event_e signal, efitick_t timesta
"trigger", "trigger",
triggerShape, triggerShape,
engine, engine,
engine->primaryTriggerConfiguration, primaryTriggerConfiguration,
signal, timestamp); signal, timestamp);
// Don't propagate state if we don't know where we are // Don't propagate state if we don't know where we are

View File

@ -52,6 +52,13 @@ public:
void resetCounters(); void resetCounters();
void validateCamVvtCounters(); void validateCamVvtCounters();
PrimaryTriggerConfiguration primaryTriggerConfiguration;
#if CAMS_PER_BANK == 1
VvtTriggerConfiguration vvtTriggerConfiguration[CAMS_PER_BANK] = {{"VVT1 ", 0}};
#else
VvtTriggerConfiguration vvtTriggerConfiguration[CAMS_PER_BANK] = {{"VVT1 ", 0}, {"VVT2 ", 1}};
#endif
LocalVersionHolder triggerVersion; LocalVersionHolder triggerVersion;
angle_t mapCamPrevToothAngle = -1; angle_t mapCamPrevToothAngle = -1;

View File

@ -125,7 +125,7 @@ void calculateTriggerSynchPoint(
efiAssertVoid(CUSTOM_TRIGGER_STACK, getCurrentRemainingStack() > EXPECTED_REMAINING_STACK, "calc s"); efiAssertVoid(CUSTOM_TRIGGER_STACK, getCurrentRemainingStack() > EXPECTED_REMAINING_STACK, "calc s");
#endif #endif
engine->triggerErrorDetection.clear(); engine->triggerErrorDetection.clear();
shape.initializeSyncPoint(state, engine->primaryTriggerConfiguration); shape.initializeSyncPoint(state, engine->triggerCentral.primaryTriggerConfiguration);
int length = shape.getLength(); int length = shape.getLength();
engine->engineCycleEventCount = length; engine->engineCycleEventCount = length;

View File

@ -41,6 +41,29 @@ protected:
virtual trigger_config_s getType() const = 0; virtual trigger_config_s getType() const = 0;
}; };
class PrimaryTriggerConfiguration final : public TriggerConfiguration {
public:
PrimaryTriggerConfiguration() : TriggerConfiguration("TRG ") {}
protected:
bool isUseOnlyRisingEdgeForTrigger() const override;
bool isVerboseTriggerSynchDetails() const override;
trigger_config_s getType() const override;
};
class VvtTriggerConfiguration final : public TriggerConfiguration {
public:
const int index;
VvtTriggerConfiguration(const char * prefix, const int index) : TriggerConfiguration(prefix), index(index) {
}
protected:
bool isUseOnlyRisingEdgeForTrigger() const override;
bool isVerboseTriggerSynchDetails() const override;
trigger_config_s getType() const override;
};
typedef struct { typedef struct {
/** /**
* index within trigger revolution, from 0 to trigger event count * index within trigger revolution, from 0 to trigger event count

View File

@ -39,7 +39,7 @@ static int getTriggerZeroEventIndex(engine_type_e engineType) {
initDataStructures(); initDataStructures();
const auto& triggerConfiguration = engine->primaryTriggerConfiguration; const auto& triggerConfiguration = engine->triggerCentral.primaryTriggerConfiguration;
TriggerWaveform& shape = eth.engine.triggerCentral.triggerShape; TriggerWaveform& shape = eth.engine.triggerCentral.triggerShape;
return eth.engine.triggerCentral.triggerState.findTriggerZeroEventIndex(shape, triggerConfiguration); return eth.engine.triggerCentral.triggerState.findTriggerZeroEventIndex(shape, triggerConfiguration);
@ -114,7 +114,7 @@ TEST(trigger, testSomethingWeird) {
TriggerDecoderBase state_("test"); TriggerDecoderBase state_("test");
TriggerDecoderBase *sta = &state_; TriggerDecoderBase *sta = &state_;
const auto& triggerConfiguration = engine->primaryTriggerConfiguration; const auto& triggerConfiguration = engine->triggerCentral.primaryTriggerConfiguration;
ASSERT_FALSE(sta->shaft_is_synchronized) << "shaft_is_synchronized"; ASSERT_FALSE(sta->shaft_is_synchronized) << "shaft_is_synchronized";