Skip to content

Commit a4bda39

Browse files
committed
Fixed hysteresis test
1 parent cd07ac7 commit a4bda39

1 file changed

Lines changed: 31 additions & 27 deletions

File tree

test/tests/test_heater.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,37 +7,36 @@
77
namespace
88
{
99

10-
constexpr float kHeaterPreheatTime = 5.0f;
11-
constexpr float kHeaterWarmupTimeout = 10.0f;
10+
constexpr float kHeaterPreheatTime = 5.0f;
11+
constexpr float kHeaterWarmupTimeout = 10.0f;
1212

13-
constexpr float kTargetTempC = 780.0f;
14-
constexpr float kTargetEsr = 300.0f;
13+
constexpr float kTargetTempC = 780.0f;
14+
constexpr float kTargetEsr = 300.0f;
1515

16-
constexpr float kOverTempC = kTargetTempC + 300.0f;
17-
constexpr float kUnderTempC = kTargetTempC - 200.0f;
16+
constexpr float kOverTempC = over(kTargetTempC + 100.0f);
17+
constexpr float kUnderTempC = under(kTargetTempC - 100.0f);
1818

19-
constexpr float kGoodVoltage = 12.0f;
19+
constexpr float kGoodVoltage = 12.0f;
2020

21-
constexpr float kOffVoltage = 6.0f;
22-
constexpr float kOnVoltage = 11.0f;
21+
constexpr float kOffVoltage = 8.0f;
22+
constexpr float kOnVoltage = 9.5f;
2323

24-
constexpr float kVoltageStabDelaySec = 0.5f;
25-
constexpr float kOverUnderheatFaultDelaySec = 0.5f;
26-
constexpr float kClosedLoopStabDelaySec = 0.5f;
24+
constexpr float kVoltageStabDelaySec = 0.5f;
25+
constexpr float kOverUnderheatFaultDelaySec = 0.5f;
26+
constexpr float kClosedLoopStabDelaySec = 0.5f;
2727

28-
struct MockHeater : public HeaterControllerBase
29-
{
30-
MockHeater() : HeaterControllerBase(0, kHeaterPreheatTime, kHeaterWarmupTimeout) { }
31-
32-
MOCK_METHOD(void, SetDuty, (float), (const, override));
33-
};
28+
struct MockHeater : public HeaterControllerBase
29+
{
30+
MockHeater() : HeaterControllerBase(0, kHeaterPreheatTime, kHeaterWarmupTimeout) { }
3431

35-
void configureDut(MockHeater& dut)
36-
{
37-
Timer::setMockTime(0);
38-
dut.Configure(kTargetTempC, kTargetEsr);
39-
}
32+
MOCK_METHOD(void, SetDuty, (float), (const, override));
33+
};
4034

35+
void configureDut(MockHeater& dut)
36+
{
37+
Timer::setMockTime(0);
38+
dut.Configure(kTargetTempC, kTargetEsr);
39+
}
4140

4241
}
4342

@@ -344,19 +343,24 @@ TEST(HeaterStateMachine, Warmup_IfNoExitCondition_AndUnknown)
344343
Timer::setMockTime(toUs(over(kVoltageStabDelaySec)));
345344
EXPECT_EQ(HeaterState::WarmupRamp, dut.GetNextState(HeaterState::WarmupRamp, HeaterAllow::Unknown, over(kOnVoltage), kUnderTempC));
346345

347-
// issue: Voltage momentarily drops below OffVoltage because heater turned on
346+
// issue: Voltage momentarily drops below OnVoltage because heater turned on
348347
// this resets the stability timer and drops us back to the preheat state, even though it is a transient spike
349348
// while it may be the indication of weak wiring or bad connection, we at least should report the condition
350349
// especially since this is only in the Unknown state. Allowed state does not check for that at all.
351-
EXPECT_EQ(HeaterState::Preheat, dut.GetNextState(HeaterState::WarmupRamp, HeaterAllow::Unknown, under(kOffVoltage), kUnderTempC));
350+
// There should be two modifications to fix this issue:
351+
// 1. Introduce hysteresis by checking OffVoltage for dropping back to preheat, and OnVoltage for transitioning to warmup ramp
352+
// 2. Use a timer not only for transitioning from preheat to warmup ramp, but also for dropping back to preheat
353+
EXPECT_EQ(HeaterState::Preheat, dut.GetNextState(HeaterState::WarmupRamp, HeaterAllow::Unknown, under(kOnVoltage), kUnderTempC));
354+
355+
// Also check ClosedLoop state
356+
EXPECT_EQ(HeaterState::Preheat, dut.GetNextState(HeaterState::ClosedLoop, HeaterAllow::Unknown, under(kOnVoltage), kUnderTempC));
352357
}
353358

354359

355360
// ====================
356361
// State: ClosedLoop
357362
// ====================
358363

359-
360364
TEST(HeaterStateMachine, ClosedLoop_WhenAllowed)
361365
{
362366
MockHeater dut;
@@ -469,7 +473,6 @@ TEST(HeaterStateMachine, ClosedLoop_NoUnderheatFaultBeforeStabilization)
469473
EXPECT_EQ(HeaterState::Stopped, dut.GetNextState(HeaterState::ClosedLoop, HeaterAllow::Allowed, kGoodVoltage, kUnderTempC));
470474
}
471475

472-
473476
TEST(HeaterStateMachine, ClosedLoop_NoOverheatFaultBeforeStabilization)
474477
{
475478
MockHeater dut;
@@ -504,6 +507,7 @@ TEST(HeaterStateMachine, ClosedLoop_RecoveryToNormalTempResetsFaultTimers)
504507
EXPECT_EQ(HeaterState::ClosedLoop, dut.GetNextState(HeaterState::ClosedLoop, HeaterAllow::Allowed, kGoodVoltage, kOverTempC));
505508
}
506509

510+
507511
// ====================
508512
// State: Stopped
509513
// ====================

0 commit comments

Comments
 (0)