| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | /** | |||
| 2 | * @file trigger_structure.cpp | |||
| 3 | * | |||
| 4 | * @date Jan 20, 2014 | |||
| 5 | * @author Andrey Belomutskiy, (c) 2012-2020 | |||
| 6 | * | |||
| 7 | * This file is part of rusEfi - see http://rusefi.com | |||
| 8 | * | |||
| 9 | * rusEfi is free software; you can redistribute it and/or modify it under the terms of | |||
| 10 | * the GNU General Public License as published by the Free Software Foundation; either | |||
| 11 | * version 3 of the License, or (at your option) any later version. | |||
| 12 | * | |||
| 13 | * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without | |||
| 14 | * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| 15 | * GNU General Public License for more details. | |||
| 16 | * | |||
| 17 | * You should have received a copy of the GNU General Public License along with this program. | |||
| 18 | * If not, see <http://www.gnu.org/licenses/>. | |||
| 19 | */ | |||
| 20 | ||||
| 21 | #include "pch.h" | |||
| 22 | ||||
| 23 | #include "trigger_chrysler.h" | |||
| 24 | #include "trigger_ford.h" | |||
| 25 | #include "trigger_gm.h" | |||
| 26 | #include "trigger_nissan.h" | |||
| 27 | #include "trigger_mazda.h" | |||
| 28 | #include "trigger_misc.h" | |||
| 29 | #include "trigger_mitsubishi.h" | |||
| 30 | #include "trigger_renault.h" | |||
| 31 | #include "trigger_subaru.h" | |||
| 32 | #include "trigger_suzuki.h" | |||
| 33 | #include "trigger_structure.h" | |||
| 34 | #include "trigger_toyota.h" | |||
| 35 | #include "trigger_renix.h" | |||
| 36 | #include "trigger_rover.h" | |||
| 37 | #include "trigger_honda.h" | |||
| 38 | #include "trigger_vw.h" | |||
| 39 | #include "trigger_universal.h" | |||
| 40 | #include "trigger_mercedes.h" | |||
| 41 | #include "engine_state.h" | |||
| 42 | ||||
| 43 | 276526 | void wrapAngle(angle_t& angle, const char* msg, ObdCode code) { | ||
| 44 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 276526 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 276526 times.
|
276526 | if (std::isnan(angle)) { |
| 45 | ✗ | firmwareError(ObdCode::CUSTOM_ERR_ANGLE, "a NaN %s", msg); | ||
| 46 | ✗ | angle = 0; | ||
| 47 | } | |||
| 48 | ||||
| 49 |
2/4✓ Branch 0 taken 276526 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 276526 times.
|
276526 | assertAngleRange(angle, msg, code); | |
| 50 | 276526 | float engineCycle = getEngineState()->engineCycle; | ||
| 51 | ||||
| 52 |
2/2✓ Branch 0 taken 32821 times.
✓ Branch 1 taken 276526 times.
|
2/2✓ Decision 'true' taken 32821 times.
✓ Decision 'false' taken 276526 times.
|
309347 | while (angle < 0) { |
| 53 | 32821 | angle += engineCycle; | ||
| 54 | } | |||
| 55 | ||||
| 56 |
2/2✓ Branch 0 taken 5976 times.
✓ Branch 1 taken 276526 times.
|
2/2✓ Decision 'true' taken 5976 times.
✓ Decision 'false' taken 276526 times.
|
282502 | while (angle >= engineCycle) { |
| 57 | 5976 | angle -= engineCycle; | ||
| 58 | } | |||
| 59 | 276526 | } | ||
| 60 | ||||
| 61 | 2047 | TriggerWaveform::TriggerWaveform() { | ||
| 62 | 2047 | initialize(OM_NONE, SyncEdge::Rise); | ||
| 63 | 2047 | } | ||
| 64 | ||||
| 65 | 3051 | void TriggerWaveform::initialize(operation_mode_e p_operationMode, SyncEdge p_syncEdge) { | ||
| 66 | 3051 | operationMode = p_operationMode; | ||
| 67 | 3051 | syncEdge = p_syncEdge; | ||
| 68 | ||||
| 69 | 3051 | isSynchronizationNeeded = true; // that's default value | ||
| 70 | 3051 | isSecondWheelCam = false; | ||
| 71 | 3051 | needSecondTriggerInput = false; | ||
| 72 | 3051 | shapeWithoutTdc = false; | ||
| 73 | ||||
| 74 | // If RiseOnly, ignore falling edges completely. | |||
| 75 | 3051 | useOnlyRisingEdges = syncEdge == SyncEdge::RiseOnly; | ||
| 76 | ||||
| 77 | 3051 | setTriggerSynchronizationGap(2); | ||
| 78 |
2/2✓ Branch 0 taken 51867 times.
✓ Branch 1 taken 3051 times.
|
2/2✓ Decision 'true' taken 51867 times.
✓ Decision 'false' taken 3051 times.
|
54918 | for (int gapIndex = 1; gapIndex < GAP_TRACKING_LENGTH ; gapIndex++) { |
| 79 | // NaN means do not use this gap ratio | |||
| 80 | 51867 | setTriggerSynchronizationGap3(gapIndex, NAN, 100000); | ||
| 81 | } | |||
| 82 | 3051 | gapTrackingLength = 1; | ||
| 83 | ||||
| 84 | 3051 | tdcPosition = 0; | ||
| 85 | 3051 | shapeDefinitionError = false; | ||
| 86 | 3051 | useOnlyPrimaryForSync = false; | ||
| 87 | ||||
| 88 | 3051 | triggerShapeSynchPointIndex = 0; | ||
| 89 | 3051 | setArrayValues(expectedEventCount, 0); | ||
| 90 | 3051 | wave.reset(); | ||
| 91 | 3051 | wave.waveCount = TRIGGER_INPUT_PIN_COUNT; | ||
| 92 | 3051 | wave.phaseCount = 0; | ||
| 93 | 3051 | previousAngle = 0; | ||
| 94 | 3051 | setArrayValues(isRiseEvent, 0); | ||
| 95 | #if EFI_UNIT_TEST | |||
| 96 | 3051 | memset(triggerSignalIndeces, 0, sizeof(triggerSignalIndeces)); | ||
| 97 | 3051 | memset(&triggerSignalStates, 0, sizeof(triggerSignalStates)); | ||
| 98 | 3051 | knownOperationMode = true; | ||
| 99 | #endif // EFI_UNIT_TEST | |||
| 100 | 3051 | } | ||
| 101 | ||||
| 102 | 1470128 | size_t TriggerWaveform::getSize() const { | ||
| 103 | 1470128 | return wave.phaseCount; | ||
| 104 | } | |||
| 105 | ||||
| 106 | 5170 | int TriggerWaveform::getTriggerWaveformSynchPointIndex() const { | ||
| 107 | 5170 | return triggerShapeSynchPointIndex; | ||
| 108 | } | |||
| 109 | ||||
| 110 | /** | |||
| 111 | * physical primary trigger duration | |||
| 112 | * @see getEngineCycle | |||
| 113 | * @see getCrankDivider | |||
| 114 | */ | |||
| 115 | 179277 | angle_t TriggerWaveform::getCycleDuration() const { | ||
| 116 |
6/7✓ Branch 0 taken 9220 times.
✓ Branch 1 taken 10014 times.
✓ Branch 2 taken 86 times.
✓ Branch 3 taken 782 times.
✓ Branch 4 taken 91943 times.
✓ Branch 5 taken 67232 times.
✗ Branch 6 not taken.
|
179277 | switch (operationMode) { | |
| 117 |
1/1✓ Decision 'true' taken 9220 times.
|
9220 | case FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR: | |
| 118 | 9220 | return FOUR_STROKE_CYCLE_DURATION / SYMMETRICAL_CRANK_SENSOR_DIVIDER; | ||
| 119 |
1/1✓ Decision 'true' taken 10014 times.
|
10014 | case FOUR_STROKE_THREE_TIMES_CRANK_SENSOR: | |
| 120 | 10014 | return FOUR_STROKE_CYCLE_DURATION / SYMMETRICAL_THREE_TIMES_CRANK_SENSOR_DIVIDER; | ||
| 121 |
1/1✓ Decision 'true' taken 86 times.
|
86 | case FOUR_STROKE_SIX_TIMES_CRANK_SENSOR: | |
| 122 | 86 | return FOUR_STROKE_CYCLE_DURATION / SYMMETRICAL_SIX_TIMES_CRANK_SENSOR_DIVIDER; | ||
| 123 |
1/1✓ Decision 'true' taken 782 times.
|
782 | case FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR: | |
| 124 | 782 | return FOUR_STROKE_CYCLE_DURATION / SYMMETRICAL_TWELVE_TIMES_CRANK_SENSOR_DIVIDER; | ||
| 125 |
1/1✓ Decision 'true' taken 91943 times.
|
91943 | case FOUR_STROKE_CRANK_SENSOR: | |
| 126 | case TWO_STROKE: | |||
| 127 |
1/1✓ Decision 'true' taken 91943 times.
|
91943 | return TWO_STROKE_CYCLE_DURATION; | |
| 128 |
1/1✓ Decision 'true' taken 67232 times.
|
67232 | case OM_NONE: | |
| 129 | case FOUR_STROKE_CAM_SENSOR: | |||
| 130 |
1/1✓ Decision 'true' taken 67232 times.
|
67232 | return FOUR_STROKE_CYCLE_DURATION; | |
| 131 | } | |||
| 132 | ✗ | criticalError("unreachable getCycleDuration"); | ||
| 133 | ✗ | return 0; | ||
| 134 | } | |||
| 135 | ||||
| 136 | 910 | bool TriggerWaveform::needsDisambiguation() const { | ||
| 137 |
2/3✓ Branch 1 taken 165 times.
✓ Branch 2 taken 745 times.
✗ Branch 3 not taken.
|
910 | switch (getWheelOperationMode()) { | |
| 138 |
1/1✓ Decision 'true' taken 165 times.
|
165 | case FOUR_STROKE_CRANK_SENSOR: | |
| 139 | case FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR: | |||
| 140 | case FOUR_STROKE_THREE_TIMES_CRANK_SENSOR: | |||
| 141 | case FOUR_STROKE_SIX_TIMES_CRANK_SENSOR: | |||
| 142 | case FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR: | |||
| 143 |
1/1✓ Decision 'true' taken 165 times.
|
165 | return true; | |
| 144 |
1/1✓ Decision 'true' taken 745 times.
|
745 | case FOUR_STROKE_CAM_SENSOR: | |
| 145 | case TWO_STROKE: | |||
| 146 | case OM_NONE: | |||
| 147 |
1/1✓ Decision 'true' taken 745 times.
|
745 | return false; | |
| 148 | /* let's NOT handle default in order to benefit from -Werror=switch */ | |||
| 149 | } | |||
| 150 | ✗ | criticalError("unreachable needsDisambiguation"); | ||
| 151 | ✗ | return true; | ||
| 152 | } | |||
| 153 | ||||
| 154 | /** | |||
| 155 | * Trigger event count equals engine cycle event count if we have a cam sensor. | |||
| 156 | * Two trigger cycles make one engine cycle in case of a four stroke engine If we only have a cranksensor. | |||
| 157 | * | |||
| 158 | * 'engine->engineCycleEventCount' hold a pre-calculated copy of this value as a performance optimization | |||
| 159 | */ | |||
| 160 |
1/1✓ Decision 'true' taken 120338 times.
|
120338 | size_t TriggerWaveform::getLength() const { | |
| 161 | /** | |||
| 162 | * 24 for FOUR_STROKE_TWELVE_TIMES_CRANK_SENSOR | |||
| 163 | * 6 for FOUR_STROKE_THREE_TIMES_CRANK_SENSOR | |||
| 164 | * 4 for FOUR_STROKE_SYMMETRICAL_CRANK_SENSOR | |||
| 165 | * 2 for FOUR_STROKE_CRANK_SENSOR | |||
| 166 | * 1 otherwise | |||
| 167 | */ | |||
| 168 | 120338 | int multiplier = getEngineCycle(operationMode) / getCycleDuration(); | ||
| 169 | 120338 | return multiplier * getSize(); | ||
| 170 | } | |||
| 171 | ||||
| 172 | 28358 | angle_t TriggerWaveform::getAngle(int index) const { | ||
| 173 | /** | |||
| 174 | * FOUR_STROKE_CRANK_SENSOR magic: | |||
| 175 | * We have two crank shaft revolutions for each engine cycle | |||
| 176 | * See also trigger_central.cpp | |||
| 177 | * See also getEngineCycleEventCount() | |||
| 178 | */ | |||
| 179 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 28358 times.
|
28358 | efiAssert(ObdCode::CUSTOM_ERR_ASSERT, wave.phaseCount != 0, "shapeSize=0", NAN); | |
| 180 | 28358 | int crankCycle = index / wave.phaseCount; | ||
| 181 | 28358 | int remainder = index % wave.phaseCount; | ||
| 182 | ||||
| 183 | 28358 | auto cycleStartAngle = getCycleDuration() * crankCycle; | ||
| 184 | 28358 | auto positionWithinCycle = getSwitchAngle(remainder); | ||
| 185 | ||||
| 186 | 28358 | return cycleStartAngle + positionWithinCycle; | ||
| 187 | } | |||
| 188 | ||||
| 189 | 9832 | void TriggerWaveform::addEventClamped(angle_t angle, TriggerValue const stateParam, TriggerWheel const channelIndex, float filterLeft, float filterRight) { | ||
| 190 |
4/4✓ Branch 0 taken 9619 times.
✓ Branch 1 taken 213 times.
✓ Branch 2 taken 8843 times.
✓ Branch 3 taken 776 times.
|
2/2✓ Decision 'true' taken 8843 times.
✓ Decision 'false' taken 989 times.
|
9832 | if (angle > filterLeft && angle < filterRight) { |
| 191 | #if EFI_UNIT_TEST | |||
| 192 | // printf("addEventClamped %f %s\r\n", angle, getTrigger_value_e(stateParam)); | |||
| 193 | #endif /* EFI_UNIT_TEST */ | |||
| 194 | 8843 | addEvent(angle / getEngineCycle(operationMode), stateParam, channelIndex); | ||
| 195 | } | |||
| 196 | 9832 | } | ||
| 197 | ||||
| 198 | /** | |||
| 199 | * See also Engine#getOperationMode which accounts for additional settings which are | |||
| 200 | * needed to resolve precise mode for vague wheels | |||
| 201 | */ | |||
| 202 | 1535272 | operation_mode_e TriggerWaveform::getWheelOperationMode() const { | ||
| 203 | 1535272 | return operationMode; | ||
| 204 | } | |||
| 205 | ||||
| 206 | #if EFI_UNIT_TEST | |||
| 207 | extern bool printTriggerDebug; | |||
| 208 | #endif | |||
| 209 | ||||
| 210 | 29924 | size_t TriggerWaveform::getExpectedEventCount(TriggerWheel channelIndex) const { | ||
| 211 | 29924 | return expectedEventCount[(int)channelIndex]; | ||
| 212 | } | |||
| 213 | ||||
| 214 | 996 | void TriggerWaveform::calculateExpectedEventCounts() { | ||
| 215 |
2/2✓ Branch 0 taken 709 times.
✓ Branch 1 taken 287 times.
|
2/2✓ Decision 'true' taken 709 times.
✓ Decision 'false' taken 287 times.
|
996 | if (!useOnlyRisingEdges) { |
| 216 |
2/2✓ Branch 1 taken 1418 times.
✓ Branch 2 taken 709 times.
|
2/2✓ Decision 'true' taken 1418 times.
✓ Decision 'false' taken 709 times.
|
2127 | for (size_t i = 0; i < efi::size(expectedEventCount); i++) { |
| 217 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1418 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 1418 times.
|
1418 | if (getExpectedEventCount((TriggerWheel)i) % 2 != 0) { |
| 218 | ✗ | firmwareError(ObdCode::ERROR_TRIGGER_DRAMA, "Trigger: should be even number of events index=%d count=%d", i, getExpectedEventCount((TriggerWheel)i)); | ||
| 219 | } | |||
| 220 | } | |||
| 221 | } | |||
| 222 | ||||
| 223 |
2/2✓ Branch 0 taken 287 times.
✓ Branch 1 taken 709 times.
|
996 | bool isSingleToothOnPrimaryChannel = useOnlyRisingEdges ? getExpectedEventCount(TriggerWheel::T_PRIMARY) == 1 : getExpectedEventCount(TriggerWheel::T_PRIMARY) == 2; | |
| 224 | // todo: next step would be to set 'isSynchronizationNeeded' automatically based on the logic we have here | |||
| 225 |
3/4✓ Branch 0 taken 952 times.
✓ Branch 1 taken 44 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 952 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 996 times.
|
996 | if (!shapeWithoutTdc && isSingleToothOnPrimaryChannel != !isSynchronizationNeeded) { |
| 226 | ✗ | firmwareError(ObdCode::ERROR_TRIGGER_DRAMA, "shapeWithoutTdc isSynchronizationNeeded isSingleToothOnPrimaryChannel constraint violation"); | ||
| 227 | } | |||
| 228 |
2/2✓ Branch 0 taken 676 times.
✓ Branch 1 taken 320 times.
|
2/2✓ Decision 'true' taken 676 times.
✓ Decision 'false' taken 320 times.
|
996 | if (isSingleToothOnPrimaryChannel) { |
| 229 | 676 | useOnlyPrimaryForSync = true; | ||
| 230 | } else { | |||
| 231 |
4/6✓ Branch 1 taken 303 times.
✓ Branch 2 taken 17 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 303 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 320 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 320 times.
|
320 | if (getExpectedEventCount(TriggerWheel::T_SECONDARY) == 0 && useOnlyPrimaryForSync) { |
| 232 | ✗ | firmwareError(ObdCode::ERROR_TRIGGER_DRAMA, "why would you set useOnlyPrimaryForSync with only one trigger wheel?"); | ||
| 233 | } | |||
| 234 | } | |||
| 235 | ||||
| 236 | // todo: move the following logic from below here | |||
| 237 | // if (!useOnlyRisingEdgeForTrigger || stateParam == TriggerValue::RISE) { | |||
| 238 | // expectedEventCount[channelIndex]++; | |||
| 239 | // } | |||
| 240 | ||||
| 241 | 996 | } | ||
| 242 | ||||
| 243 | /** | |||
| 244 | * See header for documentation | |||
| 245 | */ | |||
| 246 | 982 | void TriggerWaveform::addEvent720(angle_t angle, TriggerValue const state, TriggerWheel const channelIndex) { | ||
| 247 | 982 | addEvent(angle / FOUR_STROKE_CYCLE_DURATION, state, channelIndex); | ||
| 248 | 982 | } | ||
| 249 | ||||
| 250 | 4070 | void TriggerWaveform::addEvent360(angle_t angle, TriggerValue const state, TriggerWheel const channelIndex) { | ||
| 251 |
3/4✓ Branch 0 taken 1210 times.
✓ Branch 1 taken 2860 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1210 times.
|
0/1? Decision couldn't be analyzed.
|
4070 | efiAssertVoid(ObdCode::CUSTOM_OMODE_UNDEF, operationMode == FOUR_STROKE_CAM_SENSOR || operationMode == FOUR_STROKE_CRANK_SENSOR, "Not a mode for 360"); |
| 252 | #define CRANK_MODE_MULTIPLIER 2.0f | |||
| 253 | 4070 | addEvent(CRANK_MODE_MULTIPLIER * angle / FOUR_STROKE_CYCLE_DURATION, state, channelIndex); | ||
| 254 | } | |||
| 255 | ||||
| 256 | 400 | void TriggerWaveform::addToothRiseFall(angle_t angle, angle_t width, TriggerWheel const channelIndex) { | ||
| 257 | 400 | addEvent360(angle - width, TriggerValue::RISE, channelIndex); | ||
| 258 | 400 | addEvent360(angle, TriggerValue::FALL, channelIndex); | ||
| 259 | 400 | } | ||
| 260 | ||||
| 261 | 306 | void TriggerWaveform::addToothFallRise(angle_t angle, angle_t width, TriggerWheel const channelIndex) { | ||
| 262 | 306 | addEvent360(angle - width, TriggerValue::FALL, channelIndex); | ||
| 263 | 306 | addEvent360(angle, TriggerValue::RISE, channelIndex); | ||
| 264 | 306 | } | ||
| 265 | ||||
| 266 | 966 | void TriggerWaveform::addEventAngle(angle_t angle, TriggerValue const state, TriggerWheel const channelIndex) { | ||
| 267 | 966 | addEvent(angle / getCycleDuration(), state, channelIndex); | ||
| 268 | 966 | } | ||
| 269 | ||||
| 270 | 14862 | void TriggerWaveform::addEvent(angle_t angle, TriggerValue const state, TriggerWheel const channelIndex) { | ||
| 271 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 14862 times.
|
14862 | efiAssertVoid(ObdCode::CUSTOM_OMODE_UNDEF, operationMode != OM_NONE, "operationMode not set"); | |
| 272 | ||||
| 273 |
2/2✓ Branch 0 taken 2172 times.
✓ Branch 1 taken 12690 times.
|
2/2✓ Decision 'true' taken 2172 times.
✓ Decision 'false' taken 12690 times.
|
14862 | if (channelIndex == TriggerWheel::T_SECONDARY) { |
| 274 | 2172 | needSecondTriggerInput = true; | ||
| 275 | } | |||
| 276 | ||||
| 277 | #if EFI_UNIT_TEST | |||
| 278 |
2/2✓ Branch 0 taken 11322 times.
✓ Branch 1 taken 3540 times.
|
2/2✓ Decision 'true' taken 11322 times.
✓ Decision 'false' taken 3540 times.
|
14862 | if (printTriggerDebug) { |
| 279 | 11322 | printf("addEvent2 %.2f i=%d front=%d\r\n", angle, channelIndex, state); | ||
| 280 | } | |||
| 281 | #endif | |||
| 282 | ||||
| 283 | #if EFI_UNIT_TEST | |||
| 284 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 14862 times.
|
14862 | assertIsInBounds(wave.phaseCount, triggerSignalIndeces, "trigger shape overflow"); | |
| 285 | 14862 | triggerSignalIndeces[wave.phaseCount] = channelIndex; | ||
| 286 | 14862 | triggerSignalStates[wave.phaseCount] = state; | ||
| 287 | #endif // EFI_UNIT_TEST | |||
| 288 | ||||
| 289 | ||||
| 290 | // todo: the whole 'useOnlyRisingEdgeForTrigger' parameter and logic should not be here | |||
| 291 | // todo: see calculateExpectedEventCounts | |||
| 292 | // related calculation should be done once trigger is initialized outside of trigger shape scope | |||
| 293 |
4/4✓ Branch 0 taken 11142 times.
✓ Branch 1 taken 3720 times.
✓ Branch 2 taken 5571 times.
✓ Branch 3 taken 5571 times.
|
2/2✓ Decision 'true' taken 9291 times.
✓ Decision 'false' taken 5571 times.
|
14862 | if (!useOnlyRisingEdges || state == TriggerValue::RISE) { |
| 294 | 9291 | expectedEventCount[(int)channelIndex]++; | ||
| 295 | } | |||
| 296 | ||||
| 297 |
2/4✓ Branch 0 taken 14862 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 14862 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 14862 times.
|
14862 | if (angle <= 0 || angle > 1) { |
| 298 | ✗ | firmwareError(ObdCode::CUSTOM_ERR_6599, "angle should be positive not above 1: index=%d angle %f", (int)channelIndex, angle); | ||
| 299 | ✗ | return; | ||
| 300 | } | |||
| 301 |
2/2✓ Branch 0 taken 13858 times.
✓ Branch 1 taken 1004 times.
|
2/2✓ Decision 'true' taken 13858 times.
✓ Decision 'false' taken 1004 times.
|
14862 | if (wave.phaseCount > 0) { |
| 302 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13858 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 13858 times.
|
13858 | if (angle <= previousAngle) { |
| 303 | ✗ | warning(ObdCode::CUSTOM_ERR_TRG_ANGLE_ORDER, "invalid angle order %s %s: new=%.2f/%f and prev=%.2f/%f, size=%d", | ||
| 304 | getTriggerWheel(channelIndex), | |||
| 305 | getTrigger_value_e(state), | |||
| 306 | ✗ | angle, angle * getCycleDuration(), | ||
| 307 | ✗ | previousAngle, previousAngle * getCycleDuration(), | ||
| 308 | ✗ | wave.phaseCount); | ||
| 309 | ✗ | setShapeDefinitionError(true); | ||
| 310 | ✗ | return; | ||
| 311 | } | |||
| 312 | } | |||
| 313 | 14862 | previousAngle = angle; | ||
| 314 |
2/2✓ Branch 0 taken 1004 times.
✓ Branch 1 taken 13858 times.
|
2/2✓ Decision 'true' taken 1004 times.
✓ Decision 'false' taken 13858 times.
|
14862 | if (wave.phaseCount == 0) { |
| 315 | 1004 | wave.phaseCount = 1; | ||
| 316 |
2/2✓ Branch 0 taken 2008 times.
✓ Branch 1 taken 1004 times.
|
2/2✓ Decision 'true' taken 2008 times.
✓ Decision 'false' taken 1004 times.
|
3012 | for (int i = 0; i < PWM_PHASE_MAX_WAVE_PER_PWM; i++) { |
| 317 | 2008 | wave.setChannelState(i, /* switchIndex */ 0, TriggerValue::FALL); | ||
| 318 | } | |||
| 319 | ||||
| 320 | 1004 | isRiseEvent[0] = TriggerValue::RISE == state; | ||
| 321 | 1004 | wave.setSwitchTime(0, angle); | ||
| 322 | 1004 | wave.setChannelState((int)channelIndex, /* channelIndex */ 0, /* value */ state); | ||
| 323 | 1004 | return; | ||
| 324 | } | |||
| 325 | ||||
| 326 |
2/3✓ Branch 2 taken 13858 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 13858 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 13858 times.
|
13858 | if (wave.findAngleMatch(angle)) { |
| 327 | ✗ | warning(ObdCode::CUSTOM_ERR_SAME_ANGLE, "same angle: not supported"); | ||
| 328 | ✗ | setShapeDefinitionError(true); | ||
| 329 | ✗ | return; | ||
| 330 | } | |||
| 331 | ||||
| 332 | 13858 | int index = wave.findInsertionAngle(angle); | ||
| 333 | ||||
| 334 | /** | |||
| 335 | * todo: it would be nice to be able to provide trigger angles without sorting them externally | |||
| 336 | * The idea here is to shift existing data - including handling high vs low state of the signals | |||
| 337 | */ | |||
| 338 | // todo: does this logic actually work? I think it does not! due to broken state handling | |||
| 339 | /* | |||
| 340 | for (int i = size - 1; i >= index; i--) { | |||
| 341 | for (int j = 0; j < PWM_PHASE_MAX_WAVE_PER_PWM; j++) { | |||
| 342 | wave.waves[j].pinStates[i + 1] = wave.getChannelState(j, index); | |||
| 343 | } | |||
| 344 | wave.setSwitchTime(i + 1, wave.getSwitchTime(i)); | |||
| 345 | } | |||
| 346 | */ | |||
| 347 | 13858 | isRiseEvent[index] = TriggerValue::RISE == state; | ||
| 348 | ||||
| 349 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13858 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 13858 times.
|
13858 | if ((unsigned)index != wave.phaseCount) { |
| 350 | ✗ | firmwareError(ObdCode::ERROR_TRIGGER_DRAMA, "are we ever here?"); | ||
| 351 | } | |||
| 352 | ||||
| 353 | 13858 | wave.phaseCount++; | ||
| 354 | ||||
| 355 |
2/2✓ Branch 0 taken 27716 times.
✓ Branch 1 taken 13858 times.
|
2/2✓ Decision 'true' taken 27716 times.
✓ Decision 'false' taken 13858 times.
|
41574 | for (int i = 0; i < PWM_PHASE_MAX_WAVE_PER_PWM; i++) { |
| 356 | 27716 | pin_state_t value = wave.getChannelState(/* channelIndex */i, index - 1); | ||
| 357 | 27716 | wave.setChannelState(i, index, value); | ||
| 358 | } | |||
| 359 | 13858 | wave.setSwitchTime(index, angle); | ||
| 360 | 13858 | wave.setChannelState((int)channelIndex, index, state); | ||
| 361 | } | |||
| 362 | ||||
| 363 | 28502 | angle_t TriggerWaveform::getSwitchAngle(int index) const { | ||
| 364 | 28502 | return getCycleDuration() * wave.getSwitchTime(index); | ||
| 365 | } | |||
| 366 | ||||
| 367 | 73 | void TriggerWaveform::setTriggerSynchronizationGap2(float syncRatioFrom, float syncRatioTo) { | ||
| 368 | 73 | setTriggerSynchronizationGap3(/*gapIndex*/0, syncRatioFrom, syncRatioTo); | ||
| 369 | 73 | } | ||
| 370 | ||||
| 371 | 56420 | void TriggerWaveform::setTriggerSynchronizationGap3(int gapIndex, float syncRatioFrom, float syncRatioTo) { | ||
| 372 | 56420 | isSynchronizationNeeded = true; | ||
| 373 |
2/4✓ Branch 0 taken 56420 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 56420 times.
|
56420 | criticalAssertVoid(gapIndex >= 0 && gapIndex < GAP_TRACKING_LENGTH, "gapIndex out of range"); | |
| 374 | 56420 | synchronizationRatioFrom[gapIndex] = syncRatioFrom; | ||
| 375 | 56420 | synchronizationRatioTo[gapIndex] = syncRatioTo; | ||
| 376 |
2/2✓ Branch 0 taken 3677 times.
✓ Branch 1 taken 52743 times.
|
2/2✓ Decision 'true' taken 3677 times.
✓ Decision 'false' taken 52743 times.
|
56420 | if (gapIndex == 0) { |
| 377 | // we have a special case here - only sync with one gap has this feature | |||
| 378 | 3677 | this->syncRatioAvg = (int)efiRound((syncRatioFrom + syncRatioTo) * 0.5f, 1.0f); | ||
| 379 | } | |||
| 380 | 56420 | gapTrackingLength = maxI(1 + gapIndex, gapTrackingLength); | ||
| 381 | ||||
| 382 | #if EFI_UNIT_TEST | |||
| 383 |
2/2✓ Branch 0 taken 47351 times.
✓ Branch 1 taken 9069 times.
|
2/2✓ Decision 'true' taken 47351 times.
✓ Decision 'false' taken 9069 times.
|
56420 | if (printTriggerDebug) { |
| 384 | 47351 | printf("setTriggerSynchronizationGap3 %d %.2f %.2f\r\n", gapIndex, syncRatioFrom, syncRatioTo); | ||
| 385 | } | |||
| 386 | #endif /* EFI_UNIT_TEST */ | |||
| 387 | ||||
| 388 | } | |||
| 389 | ||||
| 390 | 33848 | uint16_t TriggerWaveform::findAngleIndex(TriggerFormDetails *details, angle_t targetAngle) const { | ||
| 391 | 33848 | size_t engineCycleEventCount = getLength(); | ||
| 392 | ||||
| 393 |
2/4✓ Branch 0 taken 33848 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 33848 times.
|
33848 | efiAssert(ObdCode::CUSTOM_ERR_ASSERT, engineCycleEventCount != 0 && engineCycleEventCount <= 0xFFFF, | |
| 394 | "engineCycleEventCount", 0); | |||
| 395 | ||||
| 396 | 33848 | uint32_t left = 0; | ||
| 397 | 33848 | uint32_t right = engineCycleEventCount - 1; | ||
| 398 | ||||
| 399 | /** | |||
| 400 | * Let's find the last trigger angle which is less or equal to the desired angle | |||
| 401 | * todo: extract binary search as template method? | |||
| 402 | */ | |||
| 403 | do { | |||
| 404 | 204376 | uint32_t middle = (left + right) / 2; | ||
| 405 | ||||
| 406 |
2/2✓ Branch 0 taken 112558 times.
✓ Branch 1 taken 91818 times.
|
2/2✓ Decision 'true' taken 112558 times.
✓ Decision 'false' taken 91818 times.
|
204376 | if (details->eventAngles[middle] <= targetAngle) { |
| 407 | 112558 | left = middle + 1; | ||
| 408 | } else { | |||
| 409 | 91818 | right = middle - 1; | ||
| 410 | } | |||
| 411 |
2/2✓ Branch 0 taken 170528 times.
✓ Branch 1 taken 33848 times.
|
2/2✓ Decision 'true' taken 170528 times.
✓ Decision 'false' taken 33848 times.
|
204376 | } while (left <= right); |
| 412 | 33848 | left -= 1; | ||
| 413 |
2/2✓ Branch 0 taken 28753 times.
✓ Branch 1 taken 5095 times.
|
2/2✓ Decision 'true' taken 28753 times.
✓ Decision 'false' taken 5095 times.
|
33848 | if (useOnlyRisingEdges) { |
| 414 | 28753 | left &= ~1U; | ||
| 415 | } | |||
| 416 | 33848 | return left; | ||
| 417 | } | |||
| 418 | ||||
| 419 | 216 | void TriggerWaveform::setShapeDefinitionError(bool value) { | ||
| 420 | 216 | shapeDefinitionError = value; | ||
| 421 | 216 | } | ||
| 422 | ||||
| 423 | 3353 | void TriggerWaveform::setTriggerSynchronizationGap(float syncRatio) { | ||
| 424 | 3353 | setTriggerSynchronizationGap4(/*gapIndex*/0, syncRatio); | ||
| 425 | 3353 | } | ||
| 426 | ||||
| 427 | 140 | void TriggerWaveform::setSecondTriggerSynchronizationGap(float syncRatio) { | ||
| 428 | 140 | setTriggerSynchronizationGap4(/*gapIndex*/1, syncRatio); | ||
| 429 | 140 | } | ||
| 430 | ||||
| 431 | 49 | void TriggerWaveform::setSecondTriggerSynchronizationGap2(float syncRatioFrom, float syncRatioTo) { | ||
| 432 | 49 | setTriggerSynchronizationGap3(/*gapIndex*/1, syncRatioFrom, syncRatioTo); | ||
| 433 | 49 | } | ||
| 434 | ||||
| 435 | 35 | void TriggerWaveform::setThirdTriggerSynchronizationGap(float syncRatio) { | ||
| 436 | 35 | setTriggerSynchronizationGap4(/*gapIndex*/2, syncRatio); | ||
| 437 | 35 | } | ||
| 438 | ||||
| 439 | 2 | PUBLIC_API_WEAK void customTrigger(operation_mode_e triggerOperationMode, TriggerWaveform *s, trigger_type_e type) { | ||
| 440 |
3/4✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
|
1/2✓ Decision 'true' taken 2 times.
✗ Decision 'false' not taken.
|
2 | if (type == trigger_type_e::TT_CUSTOM_1 || type == trigger_type_e::TT_CUSTOM_2) { |
| 441 | 2 | initializeSkippedToothTrigger(s, 1, 0, triggerOperationMode, SyncEdge::Rise); | ||
| 442 | 2 | return; | ||
| 443 | } | |||
| 444 | ✗ | s->setShapeDefinitionError(true); | ||
| 445 | ✗ | warning(ObdCode::CUSTOM_ERR_NO_SHAPE, "initializeTriggerWaveform() not implemented: %d", type); | ||
| 446 | } | |||
| 447 | ||||
| 448 | /** | |||
| 449 | * External logger is needed because at this point our logger is not yet initialized | |||
| 450 | */ | |||
| 451 | 996 | void TriggerWaveform::initializeTriggerWaveform(operation_mode_e triggerOperationMode, const trigger_config_s &triggerType, bool isCrankWheel) { | ||
| 452 | ||||
| 453 | #if EFI_PROD_CODE | |||
| 454 | efiAssertVoid(ObdCode::CUSTOM_ERR_6641, hasLotsOfRemainingStack(), "init t"); | |||
| 455 | efiPrintf("initializeTriggerWaveform(%s/%d)", getTrigger_type_e(triggerType.type), (int)triggerType.type); | |||
| 456 | #endif | |||
| 457 | ||||
| 458 | 996 | shapeDefinitionError = false; | ||
| 459 | ||||
| 460 |
91/91✓ Branch 0 taken 59 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 11 times.
✓ Branch 8 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 10 taken 9 times.
✓ Branch 11 taken 6 times.
✓ Branch 12 taken 1 time.
✓ Branch 13 taken 4 times.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 9 times.
✓ Branch 16 taken 4 times.
✓ Branch 17 taken 11 times.
✓ Branch 18 taken 4 times.
✓ Branch 19 taken 1 time.
✓ Branch 20 taken 1 time.
✓ Branch 21 taken 1 time.
✓ Branch 22 taken 1 time.
✓ Branch 23 taken 4 times.
✓ Branch 24 taken 1 time.
✓ Branch 25 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 27 taken 1 time.
✓ Branch 28 taken 1 time.
✓ Branch 29 taken 1 time.
✓ Branch 30 taken 3 times.
✓ Branch 31 taken 521 times.
✓ Branch 32 taken 1 time.
✓ Branch 33 taken 1 time.
✓ Branch 34 taken 107 times.
✓ Branch 35 taken 1 time.
✓ Branch 36 taken 1 time.
✓ Branch 37 taken 1 time.
✓ Branch 38 taken 1 time.
✓ Branch 39 taken 14 times.
✓ Branch 40 taken 2 times.
✓ Branch 41 taken 5 times.
✓ Branch 42 taken 21 times.
✓ Branch 43 taken 30 times.
✓ Branch 44 taken 2 times.
✓ Branch 45 taken 5 times.
✓ Branch 46 taken 1 time.
✓ Branch 47 taken 16 times.
✓ Branch 48 taken 1 time.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 6 times.
✓ Branch 51 taken 1 time.
✓ Branch 52 taken 1 time.
✓ Branch 53 taken 1 time.
✓ Branch 54 taken 1 time.
✓ Branch 55 taken 1 time.
✓ Branch 56 taken 3 times.
✓ Branch 57 taken 8 times.
✓ Branch 58 taken 1 time.
✓ Branch 59 taken 1 time.
✓ Branch 60 taken 1 time.
✓ Branch 61 taken 5 times.
✓ Branch 62 taken 2 times.
✓ Branch 63 taken 1 time.
✓ Branch 64 taken 1 time.
✓ Branch 65 taken 3 times.
✓ Branch 66 taken 2 times.
✓ Branch 67 taken 1 time.
✓ Branch 68 taken 1 time.
✓ Branch 69 taken 5 times.
✓ Branch 70 taken 1 time.
✓ Branch 71 taken 1 time.
✓ Branch 72 taken 11 times.
✓ Branch 73 taken 1 time.
✓ Branch 74 taken 3 times.
✓ Branch 75 taken 3 times.
✓ Branch 76 taken 3 times.
✓ Branch 77 taken 7 times.
✓ Branch 78 taken 5 times.
✓ Branch 79 taken 1 time.
✓ Branch 80 taken 1 time.
✓ Branch 81 taken 1 time.
✓ Branch 82 taken 3 times.
✓ Branch 83 taken 1 time.
✓ Branch 84 taken 9 times.
✓ Branch 85 taken 1 time.
✓ Branch 86 taken 1 time.
✓ Branch 87 taken 1 time.
✓ Branch 88 taken 1 time.
✓ Branch 89 taken 7 times.
✓ Branch 90 taken 2 times.
|
996 | switch (triggerType.type) { | |
| 461 |
1/1✓ Decision 'true' taken 59 times.
|
59 | case trigger_type_e::TT_TOOTHED_WHEEL: | |
| 462 | 59 | initializeSkippedToothTrigger(this, triggerType.customTotalToothCount, | ||
| 463 | 59 | triggerType.customSkippedToothCount, triggerOperationMode, SyncEdge::RiseOnly); | ||
| 464 | 59 | break; | ||
| 465 | ||||
| 466 |
1/1✓ Decision 'true' taken 10 times.
|
10 | case trigger_type_e::TT_MAZDA_MIATA_NA: | |
| 467 | 10 | initializeMazdaMiataNaShape(this); | ||
| 468 | 10 | break; | ||
| 469 | ||||
| 470 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_MAZDA_MIATA_VVT_TEST: | |
| 471 | 1 | initializeMazdaMiataVVtTestShape(this); | ||
| 472 | 1 | break; | ||
| 473 | ||||
| 474 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_SUZUKI_K6A: | |
| 475 | 1 | initializeSuzukiK6A(this); | ||
| 476 | 1 | break; | ||
| 477 | ||||
| 478 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_SUZUKI_G13B: | |
| 479 | 1 | initializeSuzukiG13B(this); | ||
| 480 | 1 | break; | ||
| 481 | ||||
| 482 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_FORD_TFI_PIP: | |
| 483 | 1 | configureFordPip(this); | ||
| 484 | 1 | break; | ||
| 485 | ||||
| 486 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_FORD_ST170: | |
| 487 | 1 | configureFordST170(this); | ||
| 488 | 1 | break; | ||
| 489 | ||||
| 490 |
1/1✓ Decision 'true' taken 11 times.
|
11 | case trigger_type_e::TT_VVT_MIATA_NB: | |
| 491 | 11 | initializeMazdaMiataVVtCamShape(this); | ||
| 492 | 11 | break; | ||
| 493 | ||||
| 494 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_RENIX_66_2_2_2: | |
| 495 | 1 | initializeRenix66_2_2(this); | ||
| 496 | 1 | break; | ||
| 497 | ||||
| 498 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_RENIX_44_2_2: | |
| 499 | 1 | initializeRenix44_2_2(this); | ||
| 500 | 1 | break; | ||
| 501 | ||||
| 502 |
1/1✓ Decision 'true' taken 9 times.
|
9 | case trigger_type_e::TT_MIATA_VVT: | |
| 503 | 9 | initializeMazdaMiataNb2Crank(this); | ||
| 504 | 9 | break; | ||
| 505 | ||||
| 506 |
1/1✓ Decision 'true' taken 6 times.
|
6 | case trigger_type_e::TT_DODGE_NEON_1995: | |
| 507 | case trigger_type_e::TT_DODGE_NEON_1995_ONLY_CRANK: | |||
| 508 |
1/1✓ Decision 'true' taken 6 times.
|
6 | configureNeon1995TriggerWaveformOnlyCrank(this); | |
| 509 | 6 | break; | ||
| 510 | ||||
| 511 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_DODGE_STRATUS: | |
| 512 | 1 | configureDodgeStratusTriggerWaveform(this); | ||
| 513 | 1 | break; | ||
| 514 | ||||
| 515 |
1/1✓ Decision 'true' taken 4 times.
|
4 | case trigger_type_e::TT_DODGE_NEON_2003_CAM: | |
| 516 | 4 | configureNeon2003TriggerWaveformCam(this); | ||
| 517 | 4 | break; | ||
| 518 | ||||
| 519 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_DODGE_NEON_2003_CRANK: | |
| 520 | 1 | configureNeon2003TriggerWaveformCam(this); | ||
| 521 | // configureNeon2003TriggerWaveformCrank(triggerShape); | |||
| 522 | 1 | break; | ||
| 523 | ||||
| 524 |
1/1✓ Decision 'true' taken 9 times.
|
9 | case trigger_type_e::TT_FORD_ASPIRE: | |
| 525 | 9 | configureFordAspireTriggerWaveform(this); | ||
| 526 | 9 | break; | ||
| 527 | ||||
| 528 |
1/1✓ Decision 'true' taken 4 times.
|
4 | case trigger_type_e::TT_VVT_NISSAN_VQ35: | |
| 529 | 4 | initializeNissanVQvvt(this); | ||
| 530 | 4 | break; | ||
| 531 | ||||
| 532 |
1/1✓ Decision 'true' taken 11 times.
|
11 | case trigger_type_e::TT_VVT_MITSU_6G72: | |
| 533 | 11 | initializeVvt6G72(this); | ||
| 534 | 11 | break; | ||
| 535 | ||||
| 536 |
1/1✓ Decision 'true' taken 4 times.
|
4 | case trigger_type_e::TT_VVT_MITSUBISHI_3A92: | |
| 537 | 4 | initializeVvt3A92(this); | ||
| 538 | 4 | break; | ||
| 539 | ||||
| 540 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_TOYOTA_3_TOOTH_UZ: | |
| 541 | 1 | initializeUzCam(this); | ||
| 542 | 1 | break; | ||
| 543 | ||||
| 544 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_VVT_TOYOTA_4_1: | |
| 545 | 1 | initializeSkippedToothTrigger(this, 4, 1, triggerOperationMode, SyncEdge::RiseOnly); | ||
| 546 | 1 | setTriggerSynchronizationGap3(/*gapIndex*/0, /*from*/1.60, 2.40); | ||
| 547 | 1 | setTriggerSynchronizationGap3(/*gapIndex*/1, /*from*/0.75, 1.25); | ||
| 548 | 1 | break; | ||
| 549 | ||||
| 550 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_NISSAN_QR25: | |
| 551 | 1 | initializeNissanQR25crank(this); | ||
| 552 | 1 | break; | ||
| 553 | ||||
| 554 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_NISSAN_VQ30: | |
| 555 | 1 | initializeNissanVQ30cam(this); | ||
| 556 | 1 | break; | ||
| 557 | ||||
| 558 |
1/1✓ Decision 'true' taken 4 times.
|
4 | case trigger_type_e::TT_NISSAN_VQ35: | |
| 559 | 4 | initializeNissanVQ35crank(this); | ||
| 560 | 4 | break; | ||
| 561 | ||||
| 562 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_NISSAN_MR18_CRANK: | |
| 563 | 1 | initializeNissanMR18crank(this); | ||
| 564 | 1 | break; | ||
| 565 | ||||
| 566 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_NISSAN_MR18_CAM_VVT: | |
| 567 | 1 | initializeNissanMRvvt(this); | ||
| 568 | 1 | break; | ||
| 569 | ||||
| 570 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_KAWA_KX450F: | |
| 571 | 1 | configureKawaKX450F(this); | ||
| 572 | 1 | break; | ||
| 573 | ||||
| 574 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_SKODA_FAVORIT: | |
| 575 | 1 | setSkodaFavorit(this); | ||
| 576 | 1 | break; | ||
| 577 | ||||
| 578 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_GM_60_2_2_2: | |
| 579 | 1 | configureGm60_2_2_2(this); | ||
| 580 | 1 | break; | ||
| 581 | ||||
| 582 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_GM_7X: | |
| 583 | 1 | configureGmTriggerWaveform(this); | ||
| 584 | 1 | break; | ||
| 585 | ||||
| 586 |
1/1✓ Decision 'true' taken 3 times.
|
3 | case trigger_type_e::TT_MAZDA_DOHC_1_4: | |
| 587 | 3 | configureMazdaProtegeLx(this); | ||
| 588 | 3 | break; | ||
| 589 | ||||
| 590 |
1/1✓ Decision 'true' taken 521 times.
|
521 | case trigger_type_e::TT_ONE_PLUS_ONE: | |
| 591 | 521 | configureOnePlusOne(this); | ||
| 592 | 521 | break; | ||
| 593 | ||||
| 594 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_3_1_CAM: | |
| 595 | 1 | configure3_1_cam(this); | ||
| 596 | 1 | break; | ||
| 597 | ||||
| 598 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_MERCEDES_2_SEGMENT: | |
| 599 | 1 | setMercedesTwoSegment(this); | ||
| 600 | 1 | break; | ||
| 601 | ||||
| 602 |
1/1✓ Decision 'true' taken 107 times.
|
107 | case trigger_type_e::TT_HALF_MOON: | |
| 603 | /** @note TT_HALF_MOON setup events as 180 and 360 degrees. It uses SyncEdge::Rise | |||
| 604 | * for additional phase align on falling edge and will not work with non- | |||
| 605 | * symmetrical blind type where open and closed sections are not equal */ | |||
| 606 | 107 | initializeSkippedToothTrigger(this, 1, 0, triggerOperationMode, SyncEdge::Rise); | ||
| 607 | 107 | break; | ||
| 608 | ||||
| 609 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_NARROW_SINGLE_TOOTH: | |
| 610 | /** different from TT_HALF_MOON */ | |||
| 611 | 1 | initializeSkippedToothTrigger(this, 1, 0, triggerOperationMode, SyncEdge::RiseOnly); | ||
| 612 | 1 | break; | ||
| 613 | ||||
| 614 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_MAZDA_SOHC_4: | |
| 615 | 1 | configureMazdaProtegeSOHC(this); | ||
| 616 | 1 | break; | ||
| 617 | ||||
| 618 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_DAIHATSU_3_CYL: | |
| 619 | 1 | configureDaihatsu3cyl(this); | ||
| 620 | 1 | break; | ||
| 621 | ||||
| 622 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_DAIHATSU_4_CYL: | |
| 623 | 1 | configureDaihatsu4cyl(this); | ||
| 624 | 1 | break; | ||
| 625 | ||||
| 626 |
1/1✓ Decision 'true' taken 14 times.
|
14 | case trigger_type_e::TT_VVT_TOYOTA_3_TOOTH: | |
| 627 | 14 | initializeSkippedToothTrigger(this, 3, 0, triggerOperationMode, SyncEdge::RiseOnly); | ||
| 628 | 14 | break; | ||
| 629 | ||||
| 630 |
1/1✓ Decision 'true' taken 2 times.
|
2 | case trigger_type_e::TT_36_2_1_1: | |
| 631 | 2 | initialize36_2_1_1(this); | ||
| 632 | 2 | break; | ||
| 633 | ||||
| 634 |
1/1✓ Decision 'true' taken 5 times.
|
5 | case trigger_type_e::TT_36_2_1: | |
| 635 | 5 | initialize36_2_1(this); | ||
| 636 | 5 | break; | ||
| 637 | ||||
| 638 |
1/1✓ Decision 'true' taken 21 times.
|
21 | case trigger_type_e::TT_TOOTHED_WHEEL_32_2: | |
| 639 | 21 | initializeSkippedToothTrigger(this, 32, 2, triggerOperationMode, SyncEdge::RiseOnly); | ||
| 640 | // todo: why is this 32/2 asking for third gap while 60/2 is happy with just two gaps? | |||
| 641 | // method above sets second gap, here we add third | |||
| 642 | // this third gap is not required to sync on perfect signal but is needed to handle to reject cranking transition noise | |||
| 643 | 21 | setThirdTriggerSynchronizationGap(1); | ||
| 644 | 21 | break; | ||
| 645 | ||||
| 646 |
1/1✓ Decision 'true' taken 30 times.
|
30 | case trigger_type_e::TT_TOOTHED_WHEEL_60_2: | |
| 647 | 30 | initializeSkippedToothTrigger(this, 60, 2, triggerOperationMode, SyncEdge::RiseOnly); | ||
| 648 | 30 | break; | ||
| 649 | ||||
| 650 |
1/1✓ Decision 'true' taken 2 times.
|
2 | case trigger_type_e::TT_TOOTHED_WHEEL_36_2: | |
| 651 | 2 | initializeSkippedToothTrigger(this, 36, 2, triggerOperationMode, SyncEdge::RiseOnly); | ||
| 652 | 2 | setTriggerSynchronizationGap3(/*gapIndex*/0, /*from*/1.6, 3.5); | ||
| 653 | 2 | setTriggerSynchronizationGap3(/*gapIndex*/1, /*from*/0.7, 1.3); // second gap is not required to synch on perfect signal but is needed to handle to reject cranking transition noise | ||
| 654 | 2 | break; | ||
| 655 | ||||
| 656 |
1/1✓ Decision 'true' taken 5 times.
|
5 | case trigger_type_e::TT_60_2_WRONG_POLARITY: | |
| 657 | 5 | setVwConfiguration(this); | ||
| 658 | 5 | break; | ||
| 659 | ||||
| 660 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_TOOTHED_WHEEL_36_1: | |
| 661 | 1 | initializeSkippedToothTrigger(this, 36, 1, triggerOperationMode, SyncEdge::RiseOnly); | ||
| 662 | 1 | break; | ||
| 663 | ||||
| 664 |
1/1✓ Decision 'true' taken 16 times.
|
16 | case trigger_type_e::TT_VVT_BOSCH_QUICK_START: | |
| 665 | 16 | configureQuickStartSenderWheel(this); | ||
| 666 | 16 | break; | ||
| 667 | ||||
| 668 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_VVT_BARRA_3_PLUS_1: | |
| 669 | 1 | configureBarra3plus1cam(this); | ||
| 670 | 1 | break; | ||
| 671 | ||||
| 672 |
1/1✓ Decision 'true' taken 2 times.
|
2 | case trigger_type_e::TT_HONDA_K_CAM_4_1: | |
| 673 | 2 | configureHondaK_4_1(this); | ||
| 674 | 2 | break; | ||
| 675 | ||||
| 676 |
1/1✓ Decision 'true' taken 6 times.
|
6 | case trigger_type_e::TT_HONDA_K_CRANK_12_1: | |
| 677 | 6 | configureHondaK_12_1(this); | ||
| 678 | 6 | break; | ||
| 679 | ||||
| 680 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_HONDA_J30A2_24_1_1: | |
| 681 | 1 | configureHondaJ30A2_24_1_1(this); | ||
| 682 | 1 | break; | ||
| 683 | ||||
| 684 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_SUBARU_EZ30: | |
| 685 | 1 | initializeSubaruEZ30(this); | ||
| 686 | 1 | break; | ||
| 687 | ||||
| 688 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_VVT_MAZDA_SKYACTIV: | |
| 689 | 1 | initializeMazdaSkyactivCam(this); | ||
| 690 | 1 | break; | ||
| 691 | ||||
| 692 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_VVT_MAZDA_L: | |
| 693 | 1 | initializeMazdaLCam(this); | ||
| 694 | 1 | break; | ||
| 695 | ||||
| 696 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_BENELLI_TRE: | |
| 697 | 1 | configureBenelli(this); | ||
| 698 | 1 | break; | ||
| 699 | ||||
| 700 |
1/1✓ Decision 'true' taken 3 times.
|
3 | case trigger_type_e::TT_MITSU_4G63_CRANK: | |
| 701 | 3 | initializeMitsubishi4gSymmetricalCrank(this); | ||
| 702 | 3 | break; | ||
| 703 |
1/1✓ Decision 'true' taken 8 times.
|
8 | case trigger_type_e::TT_DEV: | |
| 704 | case trigger_type_e::TT_VVT_FORD_COYOTE: | |||
| 705 |
1/1✓ Decision 'true' taken 8 times.
|
8 | configureFordCoyote(this); | |
| 706 | 8 | break; | ||
| 707 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_60DEG_TOOTH: | |
| 708 | /** @note | |||
| 709 | * Have a something like TT_ONE_PHASED trigger with | |||
| 710 | * externally setuped blind width will be a good | |||
| 711 | * approach to utilize ::Rise(and::Both in future) | |||
| 712 | * with both edges phase-sync, but to stay simple I suggest | |||
| 713 | * just to use another enum for each trigger type. */ | |||
| 714 | 1 | configure60degSingleTooth(this); | ||
| 715 | 1 | break; | ||
| 716 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_60_2_2_F3R: | |
| 717 | 1 | initialize60_2_2_Renault_F(this); | ||
| 718 | 1 | break; | ||
| 719 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_VVT_MITSUBISHI_4G69: | |
| 720 | 1 | initializeMitsubishi4G69Cam(this); | ||
| 721 | 1 | break; | ||
| 722 |
1/1✓ Decision 'true' taken 5 times.
|
5 | case trigger_type_e::TT_MITSU_4G63_CAM: | |
| 723 | 5 | initializeMitsubishi4g63Cam(this); | ||
| 724 | 5 | break; | ||
| 725 | ||||
| 726 |
1/1✓ Decision 'true' taken 2 times.
|
2 | case trigger_type_e::TT_UNUSED29: | |
| 727 | case trigger_type_e::TT_HONDA_CBR_600: | |||
| 728 |
1/1✓ Decision 'true' taken 2 times.
|
2 | configureHondaCbr600(this); | |
| 729 | 2 | break; | ||
| 730 | ||||
| 731 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_CHRYSLER_PHASER: | |
| 732 | 1 | configureChryslerVtt15(this); | ||
| 733 | 1 | break; | ||
| 734 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_CHRYSLER_NGC_36_2_2: | |
| 735 | 1 | configureChryslerNGC_36_2_2(this); | ||
| 736 | 1 | break; | ||
| 737 | ||||
| 738 |
1/1✓ Decision 'true' taken 3 times.
|
3 | case trigger_type_e::TT_JEEP_EVD_36_2_2: | |
| 739 | 3 | configureJeepEVD_36_2_2(this); | ||
| 740 | 3 | break; | ||
| 741 | ||||
| 742 |
1/1✓ Decision 'true' taken 2 times.
|
2 | case trigger_type_e::TT_DODGE_RAM: | |
| 743 | 2 | initDodgeRam(this); | ||
| 744 | 2 | break; | ||
| 745 | ||||
| 746 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_JEEP_4_CYL: | |
| 747 | 1 | initJeep_XJ_4cyl_2500(this); | ||
| 748 | 1 | break; | ||
| 749 | ||||
| 750 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_JEEP_18_2_2_2: | |
| 751 | 1 | initJeep18_2_2_2(this); | ||
| 752 | 1 | break; | ||
| 753 | ||||
| 754 |
1/1✓ Decision 'true' taken 5 times.
|
5 | case trigger_type_e::TT_SUBARU_7_6: | |
| 755 | 5 | initializeSubaru7_6(this); | ||
| 756 | 5 | break; | ||
| 757 | ||||
| 758 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_36_2_2_2: | |
| 759 | 1 | initialize36_2_2_2(this); | ||
| 760 | 1 | break; | ||
| 761 | ||||
| 762 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_2JZ_3_34_SIMULATION_ONLY: | |
| 763 | 1 | initialize2jzGE3_34_simulation_shape(this); | ||
| 764 | 1 | break; | ||
| 765 | ||||
| 766 |
1/1✓ Decision 'true' taken 11 times.
|
11 | case trigger_type_e::TT_3_TOOTH_CRANK: | |
| 767 | 11 | configure3ToothCrank(this); | ||
| 768 | 11 | break; | ||
| 769 | ||||
| 770 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_6_TOOTH_CRANK: | |
| 771 | 1 | configure6ToothCrank(this); | ||
| 772 | 1 | break; | ||
| 773 | ||||
| 774 |
1/1✓ Decision 'true' taken 3 times.
|
3 | case trigger_type_e::TT_12_TOOTH_CRANK: | |
| 775 | 3 | configure12ToothCrank(this); | ||
| 776 | 3 | break; | ||
| 777 | ||||
| 778 |
1/1✓ Decision 'true' taken 3 times.
|
3 | case trigger_type_e::TT_ARCTIC_CAT: | |
| 779 | 3 | configureArcticCat(this); | ||
| 780 | 3 | break; | ||
| 781 | ||||
| 782 |
1/1✓ Decision 'true' taken 3 times.
|
3 | case trigger_type_e::TT_NISSAN_HR_CAM_IN: | |
| 783 | 3 | initializeNissanHRvvtIn(this); | ||
| 784 | 3 | break; | ||
| 785 |
1/1✓ Decision 'true' taken 7 times.
|
7 | case trigger_type_e::TT_NISSAN_HR: | |
| 786 | 7 | initializeNissanHRcrank(this); | ||
| 787 | 7 | break; | ||
| 788 |
1/1✓ Decision 'true' taken 5 times.
|
5 | case trigger_type_e::TT_NISSAN_SR20VE: | |
| 789 | 5 | initializeNissanSR20VE_4(this); | ||
| 790 | 5 | break; | ||
| 791 | ||||
| 792 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_ROVER_K: | |
| 793 | 1 | initializeRoverK(this); | ||
| 794 | 1 | break; | ||
| 795 | ||||
| 796 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_FIAT_IAW_P8: | |
| 797 | 1 | configureFiatIAQ_P8(this); | ||
| 798 | 1 | break; | ||
| 799 | ||||
| 800 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_TRI_TACH: | |
| 801 | 1 | configureTriTach(this); | ||
| 802 | 1 | break; | ||
| 803 | ||||
| 804 |
1/1✓ Decision 'true' taken 3 times.
|
3 | case trigger_type_e::TT_GM_24x_5: | |
| 805 | 3 | initGmLS24_5deg(this); | ||
| 806 | 3 | break; | ||
| 807 | ||||
| 808 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_GM_24x_3: | |
| 809 | 1 | initGmLS24_3deg(this); | ||
| 810 | 1 | break; | ||
| 811 | ||||
| 812 |
1/1✓ Decision 'true' taken 9 times.
|
9 | case trigger_type_e::TT_VVT_SUBARU_7_WITHOUT_6: | |
| 813 | 9 | initializeSubaruOnly7(this); | ||
| 814 | 9 | break; | ||
| 815 | ||||
| 816 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_SUBARU_SVX: | |
| 817 | 1 | initializeSubaru_SVX(this); | ||
| 818 | 1 | break; | ||
| 819 | ||||
| 820 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_SUBARU_SVX_CRANK_1: | |
| 821 | 1 | initializeSubaru_SVX(this); | ||
| 822 | 1 | break; | ||
| 823 | ||||
| 824 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_SUBARU_SVX_CAM_VVT: | |
| 825 | 1 | initializeSubaru_SVX(this); | ||
| 826 | 1 | break; | ||
| 827 | ||||
| 828 |
1/1✓ Decision 'true' taken 1 time.
|
1 | case trigger_type_e::TT_JEEPRENIX_66_2_2_2: | |
| 829 | 1 | initializeJeepRenix66_2_2(this); | ||
| 830 | 1 | break; | ||
| 831 | ||||
| 832 |
1/1✓ Decision 'true' taken 7 times.
|
7 | case trigger_type_e::TT_SUBARU_7_6_CRANK: | |
| 833 | 7 | initializeSubaru7_6_crankOnly(this); | ||
| 834 | 7 | break; | ||
| 835 | ||||
| 836 | ||||
| 837 |
1/1✓ Decision 'true' taken 2 times.
|
2 | default: | |
| 838 | 2 | customTrigger(triggerOperationMode, this, triggerType.type); | ||
| 839 | } | |||
| 840 | ||||
| 841 |
4/4✓ Branch 0 taken 914 times.
✓ Branch 1 taken 82 times.
✓ Branch 2 taken 354 times.
✓ Branch 3 taken 560 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 996 times.
|
996 | if (isCrankWheel && !needSecondTriggerInput && |
| 842 | #if EFI_UNIT_TEST | |||
| 843 |
2/2✓ Branch 0 taken 348 times.
✓ Branch 1 taken 6 times.
|
354 | engineConfiguration != nullptr && | |
| 844 | #endif | |||
| 845 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 348 times.
|
348 | engineConfiguration->triggerInputPins[1] != Gpio::Unassigned) { | |
| 846 | // todo: technical debt: HW CI should not require special treatment | |||
| 847 | #ifndef HARDWARE_CI | |||
| 848 | ✗ | criticalError("Single-channel trigger %s selected while two inputs were configured", getTrigger_type_e(triggerType.type)); | ||
| 849 | #endif | |||
| 850 | } | |||
| 851 | ||||
| 852 | /** | |||
| 853 | * Feb 2019 suggestion: it would be an improvement to remove 'expectedEventCount' logic from 'addEvent' | |||
| 854 | * and move it here, after all events were added. | |||
| 855 | */ | |||
| 856 | 996 | calculateExpectedEventCounts(); | ||
| 857 | 996 | version++; | ||
| 858 | ||||
| 859 |
1/2✓ Branch 0 taken 996 times.
✗ Branch 1 not taken.
|
1/2✓ Decision 'true' taken 996 times.
✗ Decision 'false' not taken.
|
996 | if (!shapeDefinitionError) { |
| 860 | 996 | wave.checkSwitchTimes(getCycleDuration()); | ||
| 861 | } | |||
| 862 | 996 | } | ||
| 863 |