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;
|
uint32_t *cyccnt = (uint32_t*) &DWT->CYCCNT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool noFiringUntilVvtSync(vvt_mode_e vvtMode) {
|
bool noFiringUntilVvtSync(vvt_mode_e vvtMode) {
|
||||||
auto operationMode = engine->getOperationMode();
|
auto operationMode = engine->getOperationMode();
|
||||||
|
|
||||||
// V-Twin MAP phase sense needs to always wait for sync
|
// 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) {
|
void mainTriggerCallback(uint32_t trgEventIndex, efitick_t edgeTimestamp) {
|
||||||
ScopePerf perf(PE::MainTriggerCallback);
|
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 ! HW_CHECK_MODE
|
||||||
if (hasFirmwareError()) {
|
if (hasFirmwareError()) {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
void initMainEventListener();
|
void initMainEventListener();
|
||||||
|
|
||||||
void mainTriggerCallback(uint32_t trgEventIndex, efitick_t edgeTimestamp);
|
void mainTriggerCallback(uint32_t trgEventIndex, efitick_t edgeTimestamp);
|
||||||
|
bool noFiringUntilVvtSync(vvt_mode_e vvtMode);
|
||||||
|
|
||||||
void startSimultaniousInjection(void* = nullptr);
|
void startSimultaniousInjection(void* = nullptr);
|
||||||
void endSimultaniousInjection(InjectionEvent *event);
|
void endSimultaniousInjection(InjectionEvent *event);
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
|
|
||||||
#include "limp_manager.h"
|
#include "limp_manager.h"
|
||||||
|
|
||||||
#include "fuel_math.h"
|
#include "fuel_math.h"
|
||||||
|
#include "main_trigger_callback.h"
|
||||||
|
|
||||||
#define CLEANUP_MODE_TPS 90
|
#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
|
// Force fuel limiting on the fault rev limit
|
||||||
if (rpm > m_faultRevLimit) {
|
if (rpm > m_faultRevLimit) {
|
||||||
allowFuel.clear(ClearReason::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_RISE, timestamp, /*index*/0);
|
||||||
hwHandleVvtCamSignal(TV_FALL, 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;
|
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->camInputs[0] = GPIOA_0;
|
||||||
engineConfiguration->vvtMode[0] = VVT_MAP_V_TWIN_ANOTHER;
|
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;
|
engine->outputChannels.instantMAPValue = 100;
|
||||||
|
|
||||||
|
@ -23,7 +28,9 @@ TEST(trigger, map_cam_by_magic_point) {
|
||||||
ASSERT_EQ(0, engine->outputChannels.vvtSyncCounter);
|
ASSERT_EQ(0, engine->outputChannels.vvtSyncCounter);
|
||||||
|
|
||||||
// Nothing should have been scheduled yet
|
// 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;
|
engine->outputChannels.instantMAPValue = 120;
|
||||||
eth.smartFireTriggerEvents2(/*count*/4, /*delayMs*/200);
|
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(1, engine->outputChannels.vvtSyncCounter);
|
||||||
ASSERT_EQ(10, engine->outputChannels.TEMPLOG_MAP_AT_CYCLE_COUNT);
|
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!
|
// We have "VVT" sync, things should be scheduled!
|
||||||
ASSERT_EQ(2, engine->executor.size());
|
ASSERT_EQ(2, engine->executor.size());
|
||||||
eth.assertEvent5("spark down#0", 0, (void*)turnSparkPinHigh, 185333);
|
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(942, round(Sensor::getOrZero(SensorType::Rpm)));
|
||||||
|
|
||||||
ASSERT_EQ(2, eth.recentWarnings()->getCount());
|
ASSERT_EQ(3, eth.recentWarnings()->getCount());
|
||||||
ASSERT_EQ(CUSTOM_SYNC_COUNT_MISMATCH, eth.recentWarnings()->get(0));
|
ASSERT_EQ(CUSTOM_OUT_OF_ORDER_COIL, eth.recentWarnings()->get(0));
|
||||||
ASSERT_EQ(CUSTOM_SYNC_ERROR, eth.recentWarnings()->get(1));
|
ASSERT_EQ(CUSTOM_SYNC_COUNT_MISMATCH, eth.recentWarnings()->get(1));
|
||||||
|
ASSERT_EQ(CUSTOM_SYNC_ERROR, eth.recentWarnings()->get(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(realCrankingNB2, crankingMissingInjector) {
|
TEST(realCrankingNB2, crankingMissingInjector) {
|
||||||
|
@ -49,7 +50,8 @@ TEST(realCrankingNB2, crankingMissingInjector) {
|
||||||
|
|
||||||
ASSERT_EQ(668, round(Sensor::getOrZero(SensorType::Rpm)));
|
ASSERT_EQ(668, round(Sensor::getOrZero(SensorType::Rpm)));
|
||||||
|
|
||||||
ASSERT_EQ(2, eth.recentWarnings()->getCount());
|
ASSERT_EQ(3, eth.recentWarnings()->getCount());
|
||||||
ASSERT_EQ(CUSTOM_SYNC_COUNT_MISMATCH, eth.recentWarnings()->get(0));
|
ASSERT_EQ(CUSTOM_OUT_OF_ORDER_COIL, eth.recentWarnings()->get(0));
|
||||||
ASSERT_EQ(CUSTOM_SYNC_ERROR, eth.recentWarnings()->get(1));
|
ASSERT_EQ(CUSTOM_SYNC_COUNT_MISMATCH, eth.recentWarnings()->get(1));
|
||||||
|
ASSERT_EQ(CUSTOM_SYNC_ERROR, eth.recentWarnings()->get(2));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue