auto-sync

This commit is contained in:
rusEfi 2014-09-12 09:06:12 -05:00
parent 649383b538
commit 025f9c9a35
1 changed files with 13 additions and 29 deletions

View File

@ -38,7 +38,6 @@ extern WaveChart waveChart;
#define TOP_DEAD_CENTER_MESSAGE "r"
/**
* @return -1 in case of isNoisySignal(), current RPM otherwise
*/
@ -87,21 +86,6 @@ bool isCranking(void) {
}
#endif
/**
* Checks for noise on the trigger input line. Noise is detected by an unexpectedly small time gap between
* current and previous trigger input events.
*
* @return TRUE if noise is detected
*/
static int isNoisySignal(RpmCalculator * rpmState, uint64_t nowUs) {
uint64_t diff = nowUs - rpmState->lastRpmEventTimeUs;
/**
* 60/2 wheel at 8000 rpm
* 60000000us / 8000 / 120 = 62us
*/
return diff < 40; // that's 40us
}
/**
* @brief Shaft position callback used by RPM calculation logic.
*
@ -125,18 +109,17 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, int index, RpmCalcu
bool hadRpmRecently = rpmState->isRunning();
if (hadRpmRecently) {
if (isNoisySignal(rpmState, nowUs)) {
// unexpected state. Noise?
uint64_t diff = nowUs - rpmState->lastRpmEventTimeUs;
/**
* Four stroke cycle is two crankshaft revolutions
*
* We always do '* 2' because the event signal is already adjusted to 'per engine cycle'
* and each revolution of crankshaft consists of two engine cycles revolutions
*
*/
if (diff == 0) {
rpmState->rpmValue = NOISY_RPM;
} else {
uint64_t diff = nowUs - rpmState->lastRpmEventTimeUs;
// 60000 because per minute
// * 2 because each revolution of crankshaft consists of two camshaft revolutions
// need to measure time from the previous non-skipped event
/**
* Four stroke cycle is two crankshaft revolutions
*/
int rpm = (int) (60 * US_PER_SECOND * 2 / diff);
rpmState->rpmValue = rpm > UNREALISTIC_RPM ? NOISY_RPM : rpm;
}
@ -170,7 +153,8 @@ static void tdcMarkCallback(trigger_event_e ckpSignalType, int index0, void *arg
if (isTriggerSynchronizationPoint) {
int revIndex2 = getRevolutionCounter() % 2;
// todo: use event-based scheduling, not just time-based scheduling
scheduleByAngle(&tdcScheduler[revIndex2], engineConfiguration->globalTriggerAngleOffset, (schfunc_t) onTdcCallback, NULL);
scheduleByAngle(&tdcScheduler[revIndex2], engineConfiguration->globalTriggerAngleOffset,
(schfunc_t) onTdcCallback, NULL);
}
}
#endif
@ -206,7 +190,7 @@ void initRpmCalculator(void) {
addTriggerEventListener(&tdcMarkCallback, "chart TDC mark", NULL);
#endif
addTriggerEventListener((ShaftPositionListener)&rpmShaftPositionCallback, "rpm reporter", &rpmState);
addTriggerEventListener((ShaftPositionListener) &rpmShaftPositionCallback, "rpm reporter", &rpmState);
}
#if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__)
@ -227,7 +211,7 @@ void scheduleByAngle(scheduling_s *timer, float angle, schfunc_t callback, void
firmwareError("NaN delay?");
return;
}
scheduleTask("by angle", timer, (int)MS2US(delayMs), callback, param);
scheduleTask("by angle", timer, (int) MS2US(delayMs), callback, param);
}
#endif