parent
917f57a709
commit
71275e841b
|
@ -318,7 +318,7 @@ static void handleFuel(const bool limitedFuel, uint32_t trgEventIndex, int rpm,
|
|||
uint32_t *cyccnt = (uint32_t*) &DWT->CYCCNT;
|
||||
#endif
|
||||
|
||||
static bool noFiringUntilVvtSync(vvt_mode_e vvtMode) {
|
||||
bool noFiringUntilVvtSync(vvt_mode_e vvtMode) {
|
||||
auto operationMode = engine->getOperationMode();
|
||||
|
||||
// V-Twin MAP phase sense needs to always wait for sync
|
||||
|
@ -339,15 +339,6 @@ static bool noFiringUntilVvtSync(vvt_mode_e vvtMode) {
|
|||
void mainTriggerCallback(uint32_t trgEventIndex, efitick_t edgeTimestamp) {
|
||||
ScopePerf perf(PE::MainTriggerCallback);
|
||||
|
||||
if (noFiringUntilVvtSync(engineConfiguration->vvtMode[0])
|
||||
&& !engine->triggerCentral.triggerState.hasSynchronizedSymmetrical()) {
|
||||
// Any engine that requires cam-assistance for a full crank sync (symmetrical crank) can't schedule until we have cam sync
|
||||
// examples:
|
||||
// NB2, Nissan VQ/MR: symmetrical crank wheel and we need to make sure no spark happens out of sync
|
||||
// VTwin Harley: uneven firing order, so we need "cam" MAP sync to make sure no spark happens out of sync
|
||||
return;
|
||||
}
|
||||
|
||||
#if ! HW_CHECK_MODE
|
||||
if (hasFirmwareError()) {
|
||||
/**
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
void initMainEventListener();
|
||||
|
||||
void mainTriggerCallback(uint32_t trgEventIndex, efitick_t edgeTimestamp);
|
||||
bool noFiringUntilVvtSync(vvt_mode_e vvtMode);
|
||||
|
||||
void startSimultaniousInjection(void* = nullptr);
|
||||
void endSimultaniousInjection(InjectionEvent *event);
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
#include "pch.h"
|
||||
|
||||
#include "limp_manager.h"
|
||||
|
||||
#include "fuel_math.h"
|
||||
#include "main_trigger_callback.h"
|
||||
|
||||
#define CLEANUP_MODE_TPS 90
|
||||
|
||||
|
@ -22,6 +22,16 @@ void LimpManager::updateState(int rpm, efitick_t nowNt) {
|
|||
}
|
||||
}
|
||||
|
||||
if (noFiringUntilVvtSync(engineConfiguration->vvtMode[0])
|
||||
&& !engine->triggerCentral.triggerState.hasSynchronizedSymmetrical()) {
|
||||
// Any engine that requires cam-assistance for a full crank sync (symmetrical crank) can't schedule until we have cam sync
|
||||
// examples:
|
||||
// NB2, Nissan VQ/MR: symmetrical crank wheel and we need to make sure no spark happens out of sync
|
||||
// VTwin Harley: uneven firing order, so we need "cam" MAP sync to make sure no spark happens out of sync
|
||||
allowFuel.clear(ClearReason::EnginePhase);
|
||||
allowSpark.clear(ClearReason::EnginePhase);
|
||||
}
|
||||
|
||||
// Force fuel limiting on the fault rev limit
|
||||
if (rpm > m_faultRevLimit) {
|
||||
allowFuel.clear(ClearReason::FaultRevLimit);
|
||||
|
|
|
@ -707,6 +707,13 @@ void TriggerCentral::handleShaftSignal(trigger_event_e signal, efitick_t timesta
|
|||
|
||||
hwHandleVvtCamSignal(TV_RISE, timestamp, /*index*/0);
|
||||
hwHandleVvtCamSignal(TV_FALL, timestamp, /*index*/0);
|
||||
#if EFI_UNIT_TEST
|
||||
// hack? feature? existing unit test relies on VVT phase available right away
|
||||
// but current implementation which is based on periodicFastCallback would only make result available on NEXT tooth
|
||||
int rpm = Sensor::getOrZero(SensorType::Rpm);
|
||||
efitick_t nowNt = getTimeNowNt();
|
||||
engine->limpManager.updateState(rpm, nowNt);
|
||||
#endif // EFI_UNIT_TEST
|
||||
}
|
||||
|
||||
engine->outputChannels.TEMPLOG_MAP_AT_SPECIAL_POINT = map;
|
||||
|
|
|
@ -11,6 +11,11 @@ TEST(trigger, map_cam_by_magic_point) {
|
|||
|
||||
engineConfiguration->camInputs[0] = GPIOA_0;
|
||||
engineConfiguration->vvtMode[0] = VVT_MAP_V_TWIN_ANOTHER;
|
||||
eth.engine.periodicFastCallback(); // trigger limp mode
|
||||
ASSERT_FALSE(eth.engine.limpManager.allowIgnition());
|
||||
ASSERT_FALSE(eth.engine.limpManager.allowInjection());
|
||||
ASSERT_EQ(ClearReason::EnginePhase, eth.engine.limpManager.allowIgnition().reason);
|
||||
ASSERT_EQ(ClearReason::EnginePhase, eth.engine.limpManager.allowInjection().reason);
|
||||
|
||||
engine->outputChannels.instantMAPValue = 100;
|
||||
|
||||
|
@ -23,7 +28,9 @@ TEST(trigger, map_cam_by_magic_point) {
|
|||
ASSERT_EQ(0, engine->outputChannels.vvtSyncCounter);
|
||||
|
||||
// Nothing should have been scheduled yet
|
||||
ASSERT_EQ(0, engine->executor.size());
|
||||
ASSERT_EQ(1, engine->executor.size());
|
||||
scheduling_s* next = engine->executor.getForUnitTest(0);
|
||||
eth.assertEvent5("spark down#0", 0, (void*)fireSparkAndPrepareNextSchedule, 188333);
|
||||
|
||||
engine->outputChannels.instantMAPValue = 120;
|
||||
eth.smartFireTriggerEvents2(/*count*/4, /*delayMs*/200);
|
||||
|
@ -32,6 +39,9 @@ TEST(trigger, map_cam_by_magic_point) {
|
|||
ASSERT_EQ(1, engine->outputChannels.vvtSyncCounter);
|
||||
ASSERT_EQ(10, engine->outputChannels.TEMPLOG_MAP_AT_CYCLE_COUNT);
|
||||
|
||||
ASSERT_EQ(ClearReason::None, eth.engine.limpManager.allowIgnition().reason);
|
||||
ASSERT_EQ(ClearReason::None, eth.engine.limpManager.allowInjection().reason);
|
||||
|
||||
// We have "VVT" sync, things should be scheduled!
|
||||
ASSERT_EQ(2, engine->executor.size());
|
||||
eth.assertEvent5("spark down#0", 0, (void*)turnSparkPinHigh, 185333);
|
||||
|
|
|
@ -28,9 +28,10 @@ TEST(realCrankingNB2, normalCranking) {
|
|||
|
||||
ASSERT_EQ(942, round(Sensor::getOrZero(SensorType::Rpm)));
|
||||
|
||||
ASSERT_EQ(2, eth.recentWarnings()->getCount());
|
||||
ASSERT_EQ(CUSTOM_SYNC_COUNT_MISMATCH, eth.recentWarnings()->get(0));
|
||||
ASSERT_EQ(CUSTOM_SYNC_ERROR, eth.recentWarnings()->get(1));
|
||||
ASSERT_EQ(3, eth.recentWarnings()->getCount());
|
||||
ASSERT_EQ(CUSTOM_OUT_OF_ORDER_COIL, eth.recentWarnings()->get(0));
|
||||
ASSERT_EQ(CUSTOM_SYNC_COUNT_MISMATCH, eth.recentWarnings()->get(1));
|
||||
ASSERT_EQ(CUSTOM_SYNC_ERROR, eth.recentWarnings()->get(2));
|
||||
}
|
||||
|
||||
TEST(realCrankingNB2, crankingMissingInjector) {
|
||||
|
@ -49,7 +50,8 @@ TEST(realCrankingNB2, crankingMissingInjector) {
|
|||
|
||||
ASSERT_EQ(668, round(Sensor::getOrZero(SensorType::Rpm)));
|
||||
|
||||
ASSERT_EQ(2, eth.recentWarnings()->getCount());
|
||||
ASSERT_EQ(CUSTOM_SYNC_COUNT_MISMATCH, eth.recentWarnings()->get(0));
|
||||
ASSERT_EQ(CUSTOM_SYNC_ERROR, eth.recentWarnings()->get(1));
|
||||
ASSERT_EQ(3, eth.recentWarnings()->getCount());
|
||||
ASSERT_EQ(CUSTOM_OUT_OF_ORDER_COIL, eth.recentWarnings()->get(0));
|
||||
ASSERT_EQ(CUSTOM_SYNC_COUNT_MISMATCH, eth.recentWarnings()->get(1));
|
||||
ASSERT_EQ(CUSTOM_SYNC_ERROR, eth.recentWarnings()->get(2));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue