rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
Public Member Functions | Data Fields | Protected Member Functions | Private Member Functions | Private Attributes
TriggerDecoderBase Class Reference

#include <trigger_decoder.h>

Inheritance diagram for TriggerDecoderBase:
Inheritance graph
[legend]
Collaboration diagram for TriggerDecoderBase:
Collaboration graph
[legend]

Public Member Functions

 TriggerDecoderBase (const char *name)
 
void printGaps (const char *prefix, const TriggerConfiguration &triggerConfiguration, const TriggerWaveform &triggerShape)
 
int getCurrentIndex () const
 
int getSynchronizationCounter () const
 
void incrementShaftSynchronizationCounter ()
 
int64_t getTotalEventCounter () const
 
expected< TriggerDecodeResultdecodeTriggerEvent (const char *msg, const TriggerWaveform &triggerShape, TriggerStateListener *triggerStateListener, const TriggerConfiguration &triggerConfiguration, const trigger_event_e signal, const efitick_t nowNt)
 Trigger decoding happens here VR falls are filtered out and some VR noise detection happens prior to invoking this method, for Hall this method is invoked every time we have a fall or rise on one of the trigger sensors. This method changes the state of trigger_state_s data structure according to the trigger event.
 
void onShaftSynchronization (bool wasSynchronized, const efitick_t nowNt, const TriggerWaveform &triggerShape)
 
bool isValidIndex (const TriggerWaveform &triggerShape) const
 
virtual void resetState ()
 
void setShaftSynchronized (bool value)
 
bool getShaftSynchronized () const
 
uint32_t findTriggerZeroEventIndex (TriggerWaveform &shape, const TriggerConfiguration &triggerConfiguration)
 
bool someSortOfTriggerError () const
 

Data Fields

float gapRatio [PWM_PHASE_MAX_COUNT *6]
 
bool shaft_is_synchronized = false
 
efitick_t mostRecentSyncTime
 
Timer previousEventTimer
 
uint32_t toothDurations [GAP_TRACKING_LENGTH+1]
 
efitick_t toothed_previous_time
 
current_cycle_state_s currentCycle
 
const char *const name
 
uint32_t totalTriggerErrorCounter
 
uint32_t orderingErrorCounter
 
efitick_t startOfCycleNt
 
- Data Fields inherited from trigger_state_s
uint32_t synchronizationCounter = (uint32_t)0
 
uint32_t vvtToothDurations0 = (uint32_t)0
 
float vvtCurrentPosition = (float)0
 
float vvtToothPosition [4] = {}
 
float triggerSyncGapRatio = (float)0
 
uint8_t triggerStateIndex = (uint8_t)0
 
int8_t triggerCountersError = (int8_t)0
 
uint8_t alignmentFill_at_34 [2] = {}
 

Protected Member Functions

virtual void onTriggerError ()
 
virtual void onNotEnoughTeeth (int, int)
 
virtual void onTooManyTeeth (int, int)
 

Private Member Functions

void setTriggerErrorState (int errorIncrement=1)
 
void resetCurrentCycleState ()
 
bool isSyncPoint (const TriggerWaveform &triggerShape, trigger_type_e triggerType) const
 
int getEventCountersError (const TriggerWaveform &triggerShape) const
 

Private Attributes

trigger_event_e prevSignal
 
int64_t totalEventCountBase
 
bool isFirstEvent
 
Timer m_timeSinceDecodeError
 

Detailed Description

See also
TriggerWaveform for trigger wheel shape definition

Definition at line 85 of file trigger_decoder.h.

Constructor & Destructor Documentation

◆ TriggerDecoderBase()

TriggerDecoderBase::TriggerDecoderBase ( const char name)

Definition at line 40 of file trigger_decoder.cpp.

41 : name(p_name)
42{
44}
virtual void resetState()
const char *const name
Here is the call graph for this function:

Member Function Documentation

◆ decodeTriggerEvent()

expected< TriggerDecodeResult > TriggerDecoderBase::decodeTriggerEvent ( const char msg,
const TriggerWaveform triggerShape,
TriggerStateListener triggerStateListener,
const TriggerConfiguration triggerConfiguration,
const trigger_event_e  signal,
const efitick_t  nowNt 
)

Trigger decoding happens here VR falls are filtered out and some VR noise detection happens prior to invoking this method, for Hall this method is invoked every time we have a fall or rise on one of the trigger sensors. This method changes the state of trigger_state_s data structure according to the trigger event.

Parameters
signaltype of event which just happened
nowNtcurrent time

We are here if there is a time gap between now and previous shaft event - that means the engine is not running. That means we have lost synchronization since the engine is not running :)

For performance reasons, we want to work with 32 bit values. If there has been more then 10 seconds since previous trigger event we do not really care.

todo: technically we can afford detailed logging even with 60/2 as long as low RPM todo: figure out exact threshold as a function of RPM and tooth count? Open question what is 'triggerShape.getSize()' for 60/2 is it 58 or 58*2 or 58*4?

We are here in case of a wheel without synchronization - we just need to count events, synchronization point simply happens once we have the right number of events

in case of noise the counter could be above the expected number of events, that's why 'more or equals' and not just 'equals'

Definition at line 419 of file trigger_decoder.cpp.

425 {
427
428#if EFI_PROD_CODE
430#endif
431
432 if (previousEventTimer.getElapsedSecondsAndReset(nowNt) > 1) {
433 /**
434 * We are here if there is a time gap between now and previous shaft event - that means the engine is not running.
435 * That means we have lost synchronization since the engine is not running :)
436 */
438 if (triggerStateListener) {
439 triggerStateListener->OnTriggerSynchronizationLost();
440 }
441 }
442
443 bool useOnlyRisingEdgeForTrigger = triggerShape.useOnlyRisingEdges;
444
445 efiAssert(ObdCode::CUSTOM_TRIGGER_UNEXPECTED, signal <= SHAFT_SECONDARY_RISING, "unexpected signal", unexpected);
446
447 TriggerWheel triggerWheel = eventIndex[signal];
448 TriggerValue type = eventType[signal];
449
450 // Check that we didn't get the same edge twice in a row - that should be impossible
451 if (!useOnlyRisingEdgeForTrigger && prevSignal == signal) {
453 }
454
455 prevSignal = signal;
456
457 currentCycle.eventCount[(int)triggerWheel]++;
458
459 if (toothed_previous_time > nowNt) {
460 firmwareError(ObdCode::CUSTOM_OBD_93, "[%s] toothed_previous_time after nowNt prev=%lu now=%lu", msg, (uint32_t)toothed_previous_time, (uint32_t)nowNt);
461 }
462
463 efidur_t currentDurationLong = isFirstEvent ? 0 : (nowNt - toothed_previous_time);
464
465 /**
466 * For performance reasons, we want to work with 32 bit values. If there has been more then
467 * 10 seconds since previous trigger event we do not really care.
468 */
469 toothDurations[0] =
470 currentDurationLong > 10 * NT_PER_SECOND ? 10 * NT_PER_SECOND : currentDurationLong;
471
472 if (!shouldConsiderEdge(triggerShape, triggerWheel, type)) {
473#if EFI_UNIT_TEST
474 if (printTriggerTrace) {
475 printf("%s isLessImportant %s now=%d index=%d\r\n",
476 getTrigger_type_e(triggerConfiguration.TriggerType.type),
477 getTrigger_event_e(signal),
478 (int)nowNt,
480 }
481#endif /* EFI_UNIT_TEST */
482
483 // For less important events we simply increment the index.
484 nextTriggerEvent();
485 } else {
486#if !EFI_PROD_CODE
487 if (printTriggerTrace) {
488 printf("%s event %s %lld\r\n",
489 getTrigger_type_e(triggerConfiguration.TriggerType.type),
490 getTrigger_event_e(signal),
491 nowNt);
492 printf("decodeTriggerEvent ratio %.2f: current=%d previous=%d\r\n", 1.0 * toothDurations[0] / toothDurations[1],
494 }
495#endif
496
497 isFirstEvent = false;
498 bool isSynchronizationPoint;
499 bool wasSynchronized = getShaftSynchronized();
500
501 if (triggerShape.isSynchronizationNeeded) {
503
504 if (wasSynchronized && triggerSyncGapRatio > NOISE_RATIO_THRESHOLD) {
506 }
507
508 isSynchronizationPoint = isSyncPoint(triggerShape, triggerConfiguration.TriggerType.type);
509 if (isSynchronizationPoint) {
511 }
512
513 /**
514 * todo: technically we can afford detailed logging even with 60/2 as long as low RPM
515 * todo: figure out exact threshold as a function of RPM and tooth count?
516 * Open question what is 'triggerShape.getSize()' for 60/2 is it 58 or 58*2 or 58*4?
517 */
518 bool silentTriggerError = triggerShape.getSize() > 40 && engineConfiguration->silentTriggerError;
519
520#if EFI_PROD_CODE || EFI_SIMULATOR
521 bool verbose = getTriggerCentral()->isEngineSnifferEnabled && triggerConfiguration.VerboseTriggerSynchDetails;
522
523 if (verbose || (someSortOfTriggerError() && !silentTriggerError)) {
524 const char * prefix = verbose ? "[vrb]" : "[err]";
525 printGaps(prefix, triggerConfiguration, triggerShape);
526 }
527#else
528 if (printTriggerTrace) {
529 for (int i = 0;i<triggerShape.gapTrackingLength;i++) {
530 float gap = 1.0 * toothDurations[i] / toothDurations[i + 1];
531 printf("%sindex=%d: gap=%.2f expected from %.2f to %.2f error=%s\r\n",
532 triggerConfiguration.PrintPrefix,
533 i,
534 gap,
535 triggerShape.synchronizationRatioFrom[i],
536 triggerShape.synchronizationRatioTo[i],
538 }
539 }
540#endif /* EFI_PROD_CODE */
541 } else {
542 /**
543 * We are here in case of a wheel without synchronization - we just need to count events,
544 * synchronization point simply happens once we have the right number of events
545 *
546 * in case of noise the counter could be above the expected number of events, that's why 'more or equals' and not just 'equals'
547 */
548
549 unsigned int endOfCycleIndex = triggerShape.getSize() - (useOnlyRisingEdgeForTrigger ? 2 : 1);
550
551 isSynchronizationPoint = !getShaftSynchronized() || (currentCycle.current_index >= endOfCycleIndex);
552
553#if EFI_UNIT_TEST
554 if (printTriggerTrace) {
555 printf("decodeTriggerEvent sync=%d isSynchronizationPoint=%d index=%d size=%d\r\n",
557 isSynchronizationPoint,
559 triggerShape.getSize());
560 }
561#endif /* EFI_UNIT_TEST */
562 }
563#if EFI_UNIT_TEST
564 if (printTriggerTrace) {
565 printf("decodeTriggerEvent gap %s isSynchronizationPoint=%d index=%d %s\r\n",
566 getTrigger_type_e(triggerConfiguration.TriggerType.type),
567 isSynchronizationPoint, currentCycle.current_index,
568 getTrigger_event_e(signal));
569 }
570#endif /* EFI_UNIT_TEST */
571
572 if (isSynchronizationPoint) {
574 bool isDecodingError = isTriggerCounterError(triggerCountersError);
575
576 if (triggerStateListener) {
577 triggerStateListener->OnTriggerSynchronization(wasSynchronized, isDecodingError);
578 }
579
580 // If we got a sync point, but the wrong number of events since the last sync point
581 // One of two things has happened:
582 // - We missed a tooth, and this is the real sync point
583 // - Due to some mistake in timing, we found what looks like a sync point but actually isn't
584 // In either case, we should wait for another sync point before doing anything to try and run an engine,
585 // so we clear the synchronized flag.
586 if (wasSynchronized && isDecodingError) {
589
590 // Something wrong, no longer synchronized
592
593 // This is a decoding error
595 printGaps("newerr", triggerConfiguration, triggerShape);
596 } else {
597 // If this was the first sync point OR no decode error, we're synchronized!
599 }
600
601 // this call would update duty cycle values
602 nextTriggerEvent();
603
604 onShaftSynchronization(wasSynchronized, nowNt, triggerShape);
605 } else { /* if (!isSynchronizationPoint) */
606 nextTriggerEvent();
607 }
608
609 for (int i = triggerShape.gapTrackingLength; i > 0; i--) {
610 toothDurations[i] = toothDurations[i - 1];
611 }
612
613 toothed_previous_time = nowNt;
614
615#if EFI_UNIT_TEST
616 if (wasSynchronized) {
617 int uiGapIndex = (currentCycle.current_index) % triggerShape.getLength();
618 gapRatio[uiGapIndex] = triggerSyncGapRatio;
619 }
620#endif // EFI_UNIT_TEST
621 }
622
623 if (getShaftSynchronized() && !isValidIndex(triggerShape)) {
624 // We've had too many events since the last sync point, we should have seen a sync point by now.
625 // This is a trigger error.
626
627 // let's not show a warning if we are just starting to spin
631 }
632
634
636
637 return unexpected;
638 }
639
641
642 // Needed for early instant-RPM detection
643 TriggerStateListener * l = triggerStateListener;
644 while (l) {
646 l = l->nextListener();
647 }
648
649 if (getShaftSynchronized()) {
651 } else {
652 return unexpected;
653 }
654}
const char * getTrigger_type_e(trigger_type_e value)
OutputPin debugTriggerSync
Definition efi_gpio.h:110
void toggle()
Definition efi_gpio.cpp:571
static float getOrZero(SensorType type)
Definition sensor.h:83
const char *const PrintPrefix
trigger_config_s TriggerType
void printGaps(const char *prefix, const TriggerConfiguration &triggerConfiguration, const TriggerWaveform &triggerShape)
virtual void onTriggerError()
float gapRatio[PWM_PHASE_MAX_COUNT *6]
void onShaftSynchronization(bool wasSynchronized, const efitick_t nowNt, const TriggerWaveform &triggerShape)
virtual void onNotEnoughTeeth(int, int)
virtual void onTooManyTeeth(int, int)
efitick_t toothed_previous_time
int getEventCountersError(const TriggerWaveform &triggerShape) const
void setShaftSynchronized(bool value)
trigger_event_e prevSignal
bool isValidIndex(const TriggerWaveform &triggerShape) const
current_cycle_state_s currentCycle
bool someSortOfTriggerError() const
void setTriggerErrorState(int errorIncrement=1)
uint32_t toothDurations[GAP_TRACKING_LENGTH+1]
bool isSyncPoint(const TriggerWaveform &triggerShape, trigger_type_e triggerType) const
bool getShaftSynchronized() const
float synchronizationRatioFrom[GAP_TRACKING_LENGTH]
size_t getLength() const
float synchronizationRatioTo[GAP_TRACKING_LENGTH]
size_t getSize() const
EnginePins enginePins
Definition efi_gpio.cpp:24
const char * boolToString(bool value)
Definition efilib.cpp:19
TriggerCentral * getTriggerCentral()
Definition engine.cpp:590
static constexpr engine_configuration_s * engineConfiguration
void firmwareError(ObdCode code, const char *fmt,...)
@ CUSTOM_OBD_93
@ CUSTOM_TRIGGER_UNEXPECTED
@ DecodeTriggerEvent
TriggerWheel
efitick_t efidur_t
@ SHAFT_SECONDARY_RISING
TriggerValue
virtual void OnTriggerStateProperState(efitick_t nowNt, size_t triggerStateIndex)=0
virtual void OnTriggerSynchronization(bool wasSynchronized, bool isDecodingError)=0
virtual void OnTriggerSynchronizationLost()=0
virtual TriggerStateListener * nextListener()=0
size_t eventCount[PWM_PHASE_MAX_WAVE_PER_PWM]
static bool shouldConsiderEdge(const TriggerWaveform &triggerShape, TriggerWheel triggerWheel, TriggerValue edge)
PUBLIC_API_WEAK bool isTriggerCounterError(int8_t triggerCountersError)
static TriggerValue eventType[4]
bool printTriggerTrace
static TriggerWheel eventIndex[4]
const char * getTrigger_event_e(trigger_event_e value)
printf("\n")

Referenced by TriggerCentral::handleShaftSignal(), and handleVvtCamSignal().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ findTriggerZeroEventIndex()

uint32_t TriggerDecoderBase::findTriggerZeroEventIndex ( TriggerWaveform shape,
const TriggerConfiguration triggerConfiguration 
)

Trigger shape is defined in a way which is convenient for trigger shape definition On the other hand, trigger decoder indexing begins from synchronization event.

This function finds the index of synchronization event within TriggerWaveform

Definition at line 714 of file trigger_decoder.cpp.

716 {
717#if EFI_PROD_CODE
718 efiAssert(ObdCode::CUSTOM_ERR_ASSERT, hasLotsOfRemainingStack(), "findPos", -1);
719#endif
720
721
722 resetState();
723
724 if (shape.shapeDefinitionError) {
725 return 0;
726 }
727
728 expected<uint32_t> syncIndex = TriggerStimulatorHelper::findTriggerSyncPoint(shape,
729 triggerConfiguration,
730 *this);
731 if (!syncIndex) {
732 return EFI_ERROR_CODE;
733 }
734
735 // Assert that we found the sync point on the very first revolution
736 efiAssert(ObdCode::CUSTOM_ERR_ASSERT, getSynchronizationCounter() == 0, "findZero_revCounter", EFI_ERROR_CODE);
737
738#if EFI_UNIT_TEST
739 if (printTriggerDebug) {
740 printf("findTriggerZeroEventIndex: syncIndex located %lu!\r\n", syncIndex.Value);
741 }
742#endif /* EFI_UNIT_TEST */
743
745 syncIndex.Value, *this, shape);
746
747 return syncIndex.Value % shape.getSize();
748}
int getSynchronizationCounter() const
static expected< uint32_t > findTriggerSyncPoint(TriggerWaveform &shape, const TriggerConfiguration &triggerConfiguration, TriggerDecoderBase &state)
static void assertSyncPosition(const TriggerConfiguration &triggerConfiguration, const uint32_t index, TriggerDecoderBase &state, TriggerWaveform &shape)
@ CUSTOM_ERR_ASSERT
bool printTriggerDebug
Here is the call graph for this function:

◆ getCurrentIndex()

int TriggerDecoderBase::getCurrentIndex ( ) const

current trigger processing index, between zero and size

Definition at line 212 of file trigger_decoder.cpp.

212 {
214}

◆ getEventCountersError()

int TriggerDecoderBase::getEventCountersError ( const TriggerWaveform triggerShape) const
private

Definition at line 311 of file trigger_decoder.cpp.

311 {
312 // We can check if things are fine by comparing the number of events in a cycle with the expected number of event.
313 int countersError = 0;
314 for (int i = 0;i < PWM_PHASE_MAX_WAVE_PER_PWM;i++) {
315 countersError = currentCycle.eventCount[i] - triggerShape.getExpectedEventCount((TriggerWheel)i);
316 if (countersError != 0) {
317 break;
318 }
319 }
320
321#if EFI_DETAILED_LOGGING
322 printf("getEventCountersError: isDecodingError=%d\n", (countersError != 0));
323 if (countersError != 0) {
324 for (int i = 0;i < PWM_PHASE_MAX_WAVE_PER_PWM;i++) {
325 printf(" count: cur=%d exp=%d\n", currentCycle.eventCount[i], triggerShape.getExpectedEventCount((TriggerWheel)i));
326 }
327 }
328#endif /* EFI_UNIT_TEST */
329
330 return countersError;
331}
size_t getExpectedEventCount(TriggerWheel channelIndex) const

Referenced by decodeTriggerEvent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getShaftSynchronized()

bool TriggerDecoderBase::getShaftSynchronized ( ) const

Definition at line 46 of file trigger_decoder.cpp.

46 {
48}

Referenced by decodeTriggerEvent(), handleVvtCamSignal(), TriggerNoiseFilter::noiseFilter(), SetNextCompositeEntry(), and RpmCalculator::setSpinningUp().

Here is the caller graph for this function:

◆ getSynchronizationCounter()

int TriggerDecoderBase::getSynchronizationCounter ( ) const

◆ getTotalEventCounter()

int64_t TriggerDecoderBase::getTotalEventCounter ( ) const

Definition at line 175 of file trigger_decoder.cpp.

Referenced by updateDevConsoleState().

Here is the caller graph for this function:

◆ incrementShaftSynchronizationCounter()

void TriggerDecoderBase::incrementShaftSynchronizationCounter ( )

this is important for crank-based virtual trigger and VVT magic

Definition at line 241 of file trigger_decoder.cpp.

241 {
243}

Referenced by onShaftSynchronization(), and PrimaryTriggerDecoder::syncEnginePhase().

Here is the caller graph for this function:

◆ isSyncPoint()

bool TriggerDecoderBase::isSyncPoint ( const TriggerWaveform triggerShape,
trigger_type_e  triggerType 
) const
private

Definition at line 656 of file trigger_decoder.cpp.

656 {
657 // Miata NB needs a special decoder.
658 // The problem is that the crank wheel only has 4 teeth, also symmetrical, so the pattern
659 // is long-short-long-short for one crank rotation.
660 // A quick acceleration can result in two successive "short gaps", so we see
661 // long-short-short-short-long instead of the correct long-short-long-short-long
662 // This logic expands the lower bound on a "long" tooth, then compares the last
663 // tooth to the current one.
664
665 // Instead of detecting short/long, this logic first checks for "maybe short" and "maybe long",
666 // then simply tests longer vs. shorter instead of absolute value.
668 auto secondGap = (float)toothDurations[1] / toothDurations[2];
669
670 bool currentGapOk = isInRange(triggerShape.synchronizationRatioFrom[0], (float)triggerSyncGapRatio, triggerShape.synchronizationRatioTo[0]);
671 bool secondGapOk = isInRange(triggerShape.synchronizationRatioFrom[1], secondGap, triggerShape.synchronizationRatioTo[1]);
672
673 // One or both teeth was impossible range, this is not the sync point
674 if (!currentGapOk || !secondGapOk) {
675 return false;
676 }
677
678 // If both teeth are in the range of possibility, return whether this gap is
679 // shorter than the last or not. If it is, this is the sync point.
680 return triggerSyncGapRatio < secondGap;
681 }
682
683 for (int i = 0; i < triggerShape.gapTrackingLength; i++) {
684 auto from = triggerShape.synchronizationRatioFrom[i];
685 auto to = triggerShape.synchronizationRatioTo[i];
686
687 if (std::isnan(from)) {
688 // don't check this gap, skip it
689 continue;
690 }
691
692 // This is transformed to avoid a division and use a cheaper multiply instead
693 // toothDurations[i] / toothDurations[i+1] > from
694 // is an equivalent comparison to
695 // toothDurations[i] > toothDurations[i+1] * from
696 bool isGapCondition =
697 (toothDurations[i] > toothDurations[i + 1] * from
698 && toothDurations[i] < toothDurations[i + 1] * to);
699
700 if (!isGapCondition) {
701 return false;
702 }
703 }
704
705 return true;
706}
bool isInRange(T min, T val, T max)
Definition efilib.h:82
triggerType

Referenced by decodeTriggerEvent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ isValidIndex()

bool TriggerDecoderBase::isValidIndex ( const TriggerWaveform triggerShape) const

Definition at line 190 of file trigger_decoder.cpp.

190 {
191 return currentCycle.current_index < triggerShape.getSize();
192}

Referenced by decodeTriggerEvent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ onNotEnoughTeeth()

virtual void TriggerDecoderBase::onNotEnoughTeeth ( int  ,
int   
)
inlineprotectedvirtual

Reimplemented in PrimaryTriggerDecoder, and VvtTriggerDecoder.

Definition at line 177 of file trigger_decoder.h.

177{ }

Referenced by decodeTriggerEvent().

Here is the caller graph for this function:

◆ onShaftSynchronization()

void TriggerDecoderBase::onShaftSynchronization ( bool  wasSynchronized,
const efitick_t  nowNt,
const TriggerWaveform triggerShape 
)

Definition at line 333 of file trigger_decoder.cpp.

336 {
337 startOfCycleNt = nowNt;
339
340 if (wasSynchronized) {
342 } else {
343 // We have just synchronized, this is the zeroth revolution
345 }
346
347 totalEventCountBase += triggerShape.getSize();
348
349#if EFI_UNIT_TEST
350 if (printTriggerDebug) {
351 printf("onShaftSynchronization index=%d %d\r\n",
354 }
355#endif /* EFI_UNIT_TEST */
356}
void incrementShaftSynchronizationCounter()

Referenced by decodeTriggerEvent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ onTooManyTeeth()

virtual void TriggerDecoderBase::onTooManyTeeth ( int  ,
int   
)
inlineprotectedvirtual

Reimplemented in PrimaryTriggerDecoder, and VvtTriggerDecoder.

Definition at line 178 of file trigger_decoder.h.

178{ }

Referenced by decodeTriggerEvent().

Here is the caller graph for this function:

◆ onTriggerError()

virtual void TriggerDecoderBase::onTriggerError ( )
inlineprotectedvirtual

Reimplemented in PrimaryTriggerDecoder.

Definition at line 175 of file trigger_decoder.h.

175{ }

Referenced by decodeTriggerEvent().

Here is the caller graph for this function:

◆ printGaps()

void TriggerDecoderBase::printGaps ( const char prefix,
const TriggerConfiguration triggerConfiguration,
const TriggerWaveform triggerShape 
)

Definition at line 377 of file trigger_decoder.cpp.

379 {
380 for (int i = 0;i<triggerShape.gapTrackingLength;i++) {
381 float ratioFrom = triggerShape.synchronizationRatioFrom[i];
382 if (std::isnan(ratioFrom)) {
383 // we do not track gap at this depth
384 continue;
385 }
386
387 float gap = 1.0 * toothDurations[i] / toothDurations[i + 1];
388 if (std::isnan(gap)) {
389 efiPrintf("%s index=%d NaN gap, you have noise issues?", prefix, i);
390 } else {
391 float ratioTo = triggerShape.synchronizationRatioTo[i];
392
393 bool gapOk = isInRange(ratioFrom, gap, ratioTo);
394
395 efiPrintf("%s %srpm=%d time=%d eventIndex=%lu gapIndex=%d: %s gap=%.3f expected from %.3f to %.3f error=%s",
396 prefix,
397 triggerConfiguration.PrintPrefix,
399 /* cast is needed to make sure we do not put 64 bit value to stack*/ (int)getTimeNowS(),
401 i,
402 gapOk ? "Y" : "n",
403 gap,
404 ratioFrom,
405 ratioTo,
407 }
408 }
409}
efitimesec_t getTimeNowS()
Current system time in seconds (32 bits)
Definition efitime.cpp:42

Referenced by decodeTriggerEvent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ resetCurrentCycleState()

void TriggerDecoderBase::resetCurrentCycleState ( )
private

Definition at line 95 of file trigger_decoder.cpp.

95 {
98}
void setArrayValues(TValue(&array)[TSize], float value)

Referenced by onShaftSynchronization(), and resetState().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ resetState()

void TriggerDecoderBase::resetState ( )
virtual

Reimplemented in PrimaryTriggerDecoder.

Definition at line 69 of file trigger_decoder.cpp.

Referenced by findTriggerZeroEventIndex(), Engine::OnTriggerSynchronizationLost(), PrimaryTriggerDecoder::resetState(), and TriggerDecoderBase().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ setShaftSynchronized()

void TriggerDecoderBase::setShaftSynchronized ( bool  value)

Definition at line 50 of file trigger_decoder.cpp.

50 {
51#if EFI_UNIT_TEST
52 if (value != shaft_is_synchronized) {
54 }
55#endif
56
57 if (value) {
59 // just got synchronized
61 }
62 } else {
63 // sync loss
65 }
67}
efitick_t getTimeNowNt()
Definition efitime.cpp:19
void LogTriggerSync(bool isSync, efitick_t timestamp)

Referenced by decodeTriggerEvent(), and resetState().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ setTriggerErrorState()

void TriggerDecoderBase::setTriggerErrorState ( int  errorIncrement = 1)
private

Definition at line 89 of file trigger_decoder.cpp.

89 {
91 totalTriggerErrorCounter += errorIncrement;
93}
void onTransitionEvent(TransitionEvent event)

Referenced by decodeTriggerEvent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ someSortOfTriggerError()

bool TriggerDecoderBase::someSortOfTriggerError ( ) const
inline

Definition at line 166 of file trigger_decoder.h.

166 {
167 return !m_timeSinceDecodeError.hasElapsedSec(0.3);
168 }

Referenced by decodeTriggerEvent(), isTriggerErrorNow(), Engine::OnTriggerSynchronization(), and printGaps().

Here is the caller graph for this function:

Field Documentation

◆ currentCycle

current_cycle_state_s TriggerDecoderBase::currentCycle

◆ gapRatio

float TriggerDecoderBase::gapRatio[PWM_PHASE_MAX_COUNT *6]

used only for trigger export

Definition at line 107 of file trigger_decoder.h.

Referenced by decodeTriggerEvent().

◆ isFirstEvent

bool TriggerDecoderBase::isFirstEvent
private

Definition at line 190 of file trigger_decoder.h.

Referenced by decodeTriggerEvent(), and resetState().

◆ m_timeSinceDecodeError

Timer TriggerDecoderBase::m_timeSinceDecodeError
private

Definition at line 192 of file trigger_decoder.h.

Referenced by resetState(), setTriggerErrorState(), and someSortOfTriggerError().

◆ mostRecentSyncTime

efitick_t TriggerDecoderBase::mostRecentSyncTime

Definition at line 131 of file trigger_decoder.h.

Referenced by setShaftSynchronized().

◆ name

const char* const TriggerDecoderBase::name

◆ orderingErrorCounter

uint32_t TriggerDecoderBase::orderingErrorCounter

◆ previousEventTimer

Timer TriggerDecoderBase::previousEventTimer

Definition at line 133 of file trigger_decoder.h.

Referenced by decodeTriggerEvent().

◆ prevSignal

trigger_event_e TriggerDecoderBase::prevSignal
private

Definition at line 187 of file trigger_decoder.h.

Referenced by decodeTriggerEvent(), and resetState().

◆ shaft_is_synchronized

bool TriggerDecoderBase::shaft_is_synchronized = false

TRUE if we know where we are

Definition at line 130 of file trigger_decoder.h.

Referenced by getShaftSynchronized(), and setShaftSynchronized().

◆ startOfCycleNt

efitick_t TriggerDecoderBase::startOfCycleNt

this is start of real trigger cycle for virtual double trigger see timeAtVirtualZeroNt

Definition at line 159 of file trigger_decoder.h.

Referenced by onShaftSynchronization(), and resetState().

◆ toothDurations

uint32_t TriggerDecoderBase::toothDurations[GAP_TRACKING_LENGTH+1]

current duration at index zero and previous durations are following

Definition at line 138 of file trigger_decoder.h.

Referenced by decodeTriggerEvent(), handleVvtCamSignal(), isSyncPoint(), printGaps(), and resetState().

◆ toothed_previous_time

efitick_t TriggerDecoderBase::toothed_previous_time

Definition at line 140 of file trigger_decoder.h.

Referenced by decodeTriggerEvent(), and resetState().

◆ totalEventCountBase

int64_t TriggerDecoderBase::totalEventCountBase
private

Definition at line 188 of file trigger_decoder.h.

Referenced by getTotalEventCounter(), onShaftSynchronization(), and resetState().

◆ totalTriggerErrorCounter

uint32_t TriggerDecoderBase::totalTriggerErrorCounter

how many times since ECU reboot we had unexpected number of teeth in trigger cycle

Definition at line 148 of file trigger_decoder.h.

Referenced by canDashboardHaltech(), resetState(), setTriggerErrorState(), triggerInfo(), and updateTunerStudioState().


The documentation for this class was generated from the following files: