VVT support for VAG trigger #883

This commit is contained in:
rusefi 2020-08-26 23:35:11 -04:00
parent f0ee20be2b
commit e46681f552
4 changed files with 54 additions and 15 deletions

View File

@ -42,8 +42,6 @@
#include "gpio/tle8888.h"
#endif
static TriggerState initState CCM_OPTIONAL;
LoggingWithStorage engineLogger("engine");
EXTERN_ENGINE;
@ -89,6 +87,8 @@ trigger_type_e getVvtTriggerType(vvt_mode_e vvtMode) {
}
void Engine::initializeTriggerWaveform(Logging *logger DECLARE_ENGINE_PARAMETER_SUFFIX) {
static TriggerState initState;
#if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT
// we have a confusing threading model so some synchronization would not hurt
bool alreadyLocked = lockAnyContext();
@ -97,15 +97,6 @@ void Engine::initializeTriggerWaveform(Logging *logger DECLARE_ENGINE_PARAMETER_
engineConfiguration->ambiguousOperationMode,
engineConfiguration->useOnlyRisingEdgeForTrigger, &engineConfiguration->trigger));
if (TRIGGER_WAVEFORM(bothFrontsRequired) && engineConfiguration->useOnlyRisingEdgeForTrigger) {
#if EFI_PROD_CODE || EFI_SIMULATOR
firmwareError(CUSTOM_ERR_BOTH_FRONTS_REQUIRED, "trigger: both fronts required");
#else
warning(CUSTOM_ERR_BOTH_FRONTS_REQUIRED, "trigger: both fronts required");
#endif
}
if (!TRIGGER_WAVEFORM(shapeDefinitionError)) {
/**
* 'initState' instance of TriggerState is used only to initialize 'this' TriggerWaveform instance
@ -130,10 +121,11 @@ void Engine::initializeTriggerWaveform(Logging *logger DECLARE_ENGINE_PARAMETER_
engineConfiguration->ambiguousOperationMode,
engineConfiguration->useOnlyRisingEdgeForTrigger, &config);
ENGINE(triggerCentral).vvtShape.initializeSyncPoint(&initState,
&engine->primaryTriggerConfiguration,
&config);
}
if (!alreadyLocked) {
unlockAnyContext();
}
@ -250,11 +242,11 @@ void Engine::onTriggerSignalEvent(efitick_t nowNt) {
lastTriggerToothEventTimeNt = nowNt;
}
Engine::Engine() : primaryTriggerConfiguration(this) {
Engine::Engine() : primaryTriggerConfiguration(this), vvtTriggerConfiguration(this) {
reset();
}
Engine::Engine(persistent_config_s *config) : primaryTriggerConfiguration(this) {
Engine::Engine(persistent_config_s *config) : primaryTriggerConfiguration(this), vvtTriggerConfiguration(this) {
setConfig(config);
reset();
}

View File

@ -69,6 +69,18 @@ private:
Engine *engine;
};
class VvtTriggerConfiguration : public TriggerConfiguration {
public:
VvtTriggerConfiguration(Engine *engine);
bool isUseOnlyRisingEdgeForTrigger() const;
bool isSilentTriggerError() const;
bool isVerboseTriggerSynchDetails() const;
debug_mode_e getDebugMode() const;
trigger_type_e getType() const;
private:
Engine *engine;
};
class Engine : public TriggerStateListener {
public:
explicit Engine(persistent_config_s *config);
@ -81,6 +93,7 @@ public:
cyclic_buffer<int> triggerErrorDetection;
PrimaryTriggerConfiguration primaryTriggerConfiguration;
VvtTriggerConfiguration vvtTriggerConfiguration;
TCU tcu;

View File

@ -305,3 +305,26 @@ bool PrimaryTriggerConfiguration::isVerboseTriggerSynchDetails() const {
return engine->engineConfigurationPtr->verboseTriggerSynchDetails;
}
VvtTriggerConfiguration::VvtTriggerConfiguration(Engine *engine) {
this->engine = engine;
}
bool VvtTriggerConfiguration::isUseOnlyRisingEdgeForTrigger() const {
return engine->engineConfigurationPtr->useOnlyRisingEdgeForTrigger;
}
debug_mode_e VvtTriggerConfiguration::getDebugMode() const {
return engine->engineConfigurationPtr->debugMode;
}
trigger_type_e VvtTriggerConfiguration::getType() const {
return engine->engineConfigurationPtr->trigger.type;
}
bool VvtTriggerConfiguration::isSilentTriggerError() const {
return engine->engineConfigurationPtr->silentTriggerError;
}
bool VvtTriggerConfiguration::isVerboseTriggerSynchDetails() const {
return engine->engineConfigurationPtr->verboseTriggerSynchDetails;
}

View File

@ -134,6 +134,8 @@ angle_t TriggerWaveform::getCycleDuration() const {
/**
* Trigger event count equals engine cycle event count if we have a cam sensor.
* Two trigger cycles make one engine cycle in case of a four stroke engine If we only have a cranksensor.
*
* 'engine->engineCycleEventCount' hold a pre-calculated copy of this value as a performance optimization
*/
size_t TriggerWaveform::getLength() const {
/**
@ -674,4 +676,13 @@ void TriggerWaveform::initializeTriggerWaveform(Logging *logger, operation_mode_
wave.checkSwitchTimes(getSize(), getCycleDuration());
}
if (bothFrontsRequired && useOnlyRisingEdgeForTrigger) {
#if EFI_PROD_CODE || EFI_SIMULATOR
firmwareError(CUSTOM_ERR_BOTH_FRONTS_REQUIRED, "trigger: both fronts required");
#else
warning(CUSTOM_ERR_BOTH_FRONTS_REQUIRED, "trigger: both fronts required");
#endif
}
}