| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | #include "pch.h" | |||
| 2 | ||||
| 3 | #include "redundant_ford_tps.h" | |||
| 4 | ||||
| 5 | 10 | RedundantFordTps::RedundantFordTps(SensorType outputType, SensorType first, SensorType second) | ||
| 6 | : Sensor(outputType) | |||
| 7 | 10 | , m_first(first) | ||
| 8 | 10 | , m_second(second) | ||
| 9 | { | |||
| 10 | 10 | } | ||
| 11 | ||||
| 12 | 11 | void RedundantFordTps::configure(float maxDifference, float secondaryMaximum) { | ||
| 13 | 11 | m_maxDifference = maxDifference; | ||
| 14 | 11 | m_secondaryMaximum = secondaryMaximum; | ||
| 15 | 11 | } | ||
| 16 | ||||
| 17 | 9 | SensorResult RedundantFordTps::get() const { | ||
| 18 | // Sensor 1 is "plain linear" and has the full range | |||
| 19 |
1/1✓ Branch 2 taken 9 times.
|
9 | auto tps1 = Sensor::get(m_first); | |
| 20 | ||||
| 21 | // Sensor 2 is compressed in to 0 -> 50% | |||
| 22 |
1/1✓ Branch 2 taken 9 times.
|
9 | auto tps2 = Sensor::get(m_second); | |
| 23 | ||||
| 24 | // If either result is invalid, return invalid. | |||
| 25 |
6/6✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 6 times.
|
2/2✓ Decision 'true' taken 3 times.
✓ Decision 'false' taken 6 times.
|
9 | if (!tps1 || !tps2) { |
| 26 | 3 | return UnexpectedCode::Inconsistent; | ||
| 27 | } | |||
| 28 | ||||
| 29 | // The "actual" position resolved by the second throttle - this tops out at m_secondaryMaximum instead of 100% | |||
| 30 | 6 | float tps2Actual = tps2.Value * m_secondaryMaximum / 100; | ||
| 31 | ||||
| 32 | // Switch modes slightly below the maximum of the secondary, to avoid misbehavior near 100% | |||
| 33 | 6 | float avgThreshold = m_secondaryMaximum * 0.9f; | ||
| 34 | ||||
| 35 | // Case 1: both sensors show low position, average result | |||
| 36 |
3/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
|
2/2✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 1 time.
|
6 | if (tps1.Value < avgThreshold && tps2Actual < avgThreshold) { |
| 37 | // Check that the resolved positions are close | |||
| 38 | 5 | float delta = absF(tps1.Value - tps2Actual); | ||
| 39 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
|
2/2✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 3 times.
|
5 | if (delta > m_maxDifference) { |
| 40 | 2 | return UnexpectedCode::Inconsistent; | ||
| 41 | } | |||
| 42 | ||||
| 43 | 3 | return (tps1.Value + tps2Actual) / 2; | ||
| 44 | } | |||
| 45 | ||||
| 46 | // Case 2: both sensors show high position, return "full scale" sensor's position | |||
| 47 |
2/4✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
|
1/2✓ Decision 'true' taken 1 time.
✗ Decision 'false' not taken.
|
1 | if (tps1.Value > avgThreshold && tps2Actual > (avgThreshold - 3)) { |
| 48 | 1 | return tps1; | ||
| 49 | } | |||
| 50 | ||||
| 51 | // Any other condition indicates an mismatch, and therefore an error | |||
| 52 | ✗ | return UnexpectedCode::Inconsistent; | ||
| 53 | } | |||
| 54 |