| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | /* | |||
| 2 | * @file cdm_ion_sense.cpp | |||
| 3 | * | |||
| 4 | * Saab Ion Sensing Module integration | |||
| 5 | * | |||
| 6 | * See https://github.com/rusefi/rusefi/wiki/Saab_Trionic_8_Combustion-Detection-Module_on_Mazda_Miata_running_rusEfi | |||
| 7 | * | |||
| 8 | * Created on: Dec 31, 2018 | |||
| 9 | * @author Andrey Belomutskiy, (c) 2012-2020 | |||
| 10 | */ | |||
| 11 | ||||
| 12 | #include "pch.h" | |||
| 13 | ||||
| 14 | #include "cdm_ion_sense.h" | |||
| 15 | ||||
| 16 | 1 | CdmState::CdmState() { | ||
| 17 | 1 | accumilatingAtRevolution = 0; | ||
| 18 | 1 | currentValue = 0; | ||
| 19 | 1 | accumulatingCurrentValue = 0; | ||
| 20 | 1 | } | ||
| 21 | ||||
| 22 | 6 | int CdmState::getValue(int currentRevolution) { | ||
| 23 | 6 | applyAccumulatedData(currentRevolution); | ||
| 24 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
|
2/2✓ Decision 'true' taken 4 times.
✓ Decision 'false' taken 2 times.
|
6 | if (currentRevolution == currentValueAtIndex + 1) { |
| 25 | // returning total result of previous engine cycle | |||
| 26 | 4 | return currentValue; | ||
| 27 | } | |||
| 28 | // we are here if previous engine cycle had no knock events | |||
| 29 | 2 | return 0; | ||
| 30 | } | |||
| 31 | ||||
| 32 | 8 | void CdmState::applyAccumulatedData(int currentRevolution) { | ||
| 33 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
|
2/2✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 3 times.
|
8 | if (currentRevolution > accumilatingAtRevolution) { |
| 34 | 5 | currentValue = accumulatingCurrentValue; | ||
| 35 | 5 | currentValueAtIndex = accumilatingAtRevolution; | ||
| 36 | } | |||
| 37 | 8 | } | ||
| 38 | ||||
| 39 | 4 | void CdmState::onNewSignal(int currentRevolution) { | ||
| 40 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
2/2✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 2 times.
|
4 | if (this->accumilatingAtRevolution == currentRevolution) { |
| 41 | 2 | accumulatingCurrentValue++; | ||
| 42 | } else { | |||
| 43 | 2 | applyAccumulatedData(currentRevolution); | ||
| 44 | // start new accumulation | |||
| 45 | 2 | accumilatingAtRevolution = currentRevolution; | ||
| 46 | 2 | accumulatingCurrentValue = 1; | ||
| 47 | } | |||
| 48 | 4 | } | ||
| 49 | ||||
| 50 | // above logic compiles unconditionally so that unit tests are happy, but without an instance linker would have nothing to link | |||
| 51 | #if EFI_CDM_INTEGRATION | |||
| 52 | ||||
| 53 | #include "digital_input_exti.h" | |||
| 54 | ||||
| 55 | static CdmState instance; | |||
| 56 | ||||
| 57 | int getCurrentCdmValue(int currentRevolution) { | |||
| 58 | return instance.getValue(currentRevolution); | |||
| 59 | } | |||
| 60 | ||||
| 61 | #if EFI_TUNER_STUDIO | |||
| 62 | void ionPostState(TunerStudioOutputChannels *tsOutputChannels) { | |||
| 63 | tsOutputChannels->debugIntField1 = instance.totalCdmEvents; | |||
| 64 | } | |||
| 65 | #endif /* EFI_TUNER_STUDIO */ | |||
| 66 | ||||
| 67 | static void extIonCallback(void *arg) { | |||
| 68 | UNUSED(arg); | |||
| 69 | instance.totalCdmEvents++; | |||
| 70 | ||||
| 71 | int currentRevolution = engine->triggerCentral.triggerState.getSynchronizationCounter(); | |||
| 72 | instance.onNewSignal(currentRevolution); | |||
| 73 | } | |||
| 74 | ||||
| 75 | void cdmIonInit(void) { | |||
| 76 | if (!isBrainPinValid(engineConfiguration->cdmInputPin)) { | |||
| 77 | return; | |||
| 78 | } | |||
| 79 | ||||
| 80 | efiExtiEnablePin("ion", engineConfiguration->cdmInputPin, PAL_EVENT_MODE_RISING_EDGE, extIonCallback, NULL); | |||
| 81 | } | |||
| 82 | ||||
| 83 | #endif /* EFI_CDM_INTEGRATION */ | |||
| 84 |