psu-ng: De-glitch all faults
Use DEGLITCH_LIMIT to determine all the faults. If a fault bit is on, do
not consider that a fault until it is seen at least DEGLITCH_LIMIT
times. With DEGLITCH_LIMIT set to 3, the monitor would need to see a
fault bit on 3 times in a row before indicating that the power supply
has that fault.
This was done earlier for the PGOOD fault detection.
Change-Id: I918c2fcdd1d90ae253ab268bd04aa7a0da0208b8
Signed-off-by: Brandon Wyman <bjwyman@gmail.com>
diff --git a/phosphor-power-supply/test/power_supply_tests.cpp b/phosphor-power-supply/test/power_supply_tests.cpp
index 1eec2a0..22c15e2 100644
--- a/phosphor-power-supply/test/power_supply_tests.cpp
+++ b/phosphor-power-supply/test/power_supply_tests.cpp
@@ -284,28 +284,36 @@
// STATUS_INPUT fault bits ... on.
expectations.statusWordValue = (status_word::INPUT_FAULT_WARN);
expectations.statusInputValue = 0x38;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("207000"));
- psu2.analyze();
- EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), true);
- EXPECT_EQ(psu2.hasInputFault(), true);
- EXPECT_EQ(psu2.hasMFRFault(), false);
- EXPECT_EQ(psu2.hasVINUVFault(), false);
- EXPECT_EQ(psu2.hasCommFault(), false);
- EXPECT_EQ(psu2.hasVoutOVFault(), false);
- EXPECT_EQ(psu2.hasIoutOCFault(), false);
- EXPECT_EQ(psu2.hasVoutUVFault(), false);
- EXPECT_EQ(psu2.hasFanFault(), false);
- EXPECT_EQ(psu2.hasTempFault(), false);
- EXPECT_EQ(psu2.hasPgoodFault(), false);
- EXPECT_EQ(psu2.hasPSKillFault(), false);
- EXPECT_EQ(psu2.hasPS12VcsFault(), false);
- EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("207000"));
+ psu2.analyze();
+ EXPECT_EQ(psu2.isPresent(), true);
+ // Should not be faulted until it reaches the deglitch limit.
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasInputFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasMFRFault(), false);
+ EXPECT_EQ(psu2.hasVINUVFault(), false);
+ EXPECT_EQ(psu2.hasCommFault(), false);
+ EXPECT_EQ(psu2.hasVoutOVFault(), false);
+ EXPECT_EQ(psu2.hasIoutOCFault(), false);
+ EXPECT_EQ(psu2.hasVoutUVFault(), false);
+ EXPECT_EQ(psu2.hasFanFault(), false);
+ EXPECT_EQ(psu2.hasTempFault(), false);
+ EXPECT_EQ(psu2.hasPgoodFault(), false);
+ EXPECT_EQ(psu2.hasPSKillFault(), false);
+ EXPECT_EQ(psu2.hasPS12VcsFault(), false);
+ EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ }
}
+ EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+ psu2.clearFaults();
+
// STATUS_WORD INPUT/UV fault.
{
// First need it to return good status, then the fault
@@ -315,33 +323,38 @@
.Times(1)
.WillOnce(Return("208000"));
psu2.analyze();
+ EXPECT_EQ(psu2.isFaulted(), false);
+ EXPECT_EQ(psu2.hasInputFault(), false);
// Now set fault bits in STATUS_WORD
expectations.statusWordValue =
(status_word::INPUT_FAULT_WARN | status_word::VIN_UV_FAULT);
// STATUS_INPUT fault bits ... on.
expectations.statusInputValue = 0x38;
- setPMBusExpectations(mockPMBus, expectations);
- // Input/UV fault, so voltage should read back low.
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("19123"));
- psu2.analyze();
- EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), true);
- EXPECT_EQ(psu2.hasInputFault(), true);
- EXPECT_EQ(psu2.hasMFRFault(), false);
- EXPECT_EQ(psu2.hasVINUVFault(), true);
- EXPECT_EQ(psu2.hasCommFault(), false);
- EXPECT_EQ(psu2.hasVoutOVFault(), false);
- EXPECT_EQ(psu2.hasIoutOCFault(), false);
- EXPECT_EQ(psu2.hasVoutUVFault(), false);
- EXPECT_EQ(psu2.hasFanFault(), false);
- EXPECT_EQ(psu2.hasTempFault(), false);
- EXPECT_EQ(psu2.hasPgoodFault(), false);
- EXPECT_EQ(psu2.hasPSKillFault(), false);
- EXPECT_EQ(psu2.hasPS12VcsFault(), false);
- EXPECT_EQ(psu2.hasPSCS12VFault(), false);
-
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ // Input/UV fault, so voltage should read back low.
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("19123"));
+ psu2.analyze();
+ EXPECT_EQ(psu2.isPresent(), true);
+ // Only faulted if hit deglitch limit
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasInputFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasVINUVFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasMFRFault(), false);
+ EXPECT_EQ(psu2.hasCommFault(), false);
+ EXPECT_EQ(psu2.hasVoutOVFault(), false);
+ EXPECT_EQ(psu2.hasIoutOCFault(), false);
+ EXPECT_EQ(psu2.hasVoutUVFault(), false);
+ EXPECT_EQ(psu2.hasFanFault(), false);
+ EXPECT_EQ(psu2.hasTempFault(), false);
+ EXPECT_EQ(psu2.hasPgoodFault(), false);
+ EXPECT_EQ(psu2.hasPSKillFault(), false);
+ EXPECT_EQ(psu2.hasPS12VcsFault(), false);
+ EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ }
// Turning VIN_UV fault off causes clearing of faults, causing read of
// in1_input as an attempt to get CLEAR_FAULTS called.
expectations.statusWordValue = 0;
@@ -361,6 +374,9 @@
EXPECT_EQ(psu2.hasVINUVFault(), false);
}
+ EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+ psu2.clearFaults();
+
// STATUS_WORD MFR fault.
{
// First need it to return good status, then the fault
@@ -374,28 +390,34 @@
expectations.statusWordValue = (status_word::MFR_SPECIFIC_FAULT);
// STATUS_MFR bits on.
expectations.statusMFRValue = 0xFF;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("211000"));
- psu2.analyze();
- EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), true);
- EXPECT_EQ(psu2.hasInputFault(), false);
- EXPECT_EQ(psu2.hasMFRFault(), true);
- EXPECT_EQ(psu2.hasVINUVFault(), false);
- EXPECT_EQ(psu2.hasCommFault(), false);
- EXPECT_EQ(psu2.hasVoutOVFault(), false);
- EXPECT_EQ(psu2.hasIoutOCFault(), false);
- EXPECT_EQ(psu2.hasVoutUVFault(), false);
- EXPECT_EQ(psu2.hasFanFault(), false);
- EXPECT_EQ(psu2.hasTempFault(), false);
- EXPECT_EQ(psu2.hasPgoodFault(), false);
- EXPECT_EQ(psu2.hasPSKillFault(), true);
- EXPECT_EQ(psu2.hasPS12VcsFault(), true);
- EXPECT_EQ(psu2.hasPSCS12VFault(), true);
+
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("211000"));
+ psu2.analyze();
+ EXPECT_EQ(psu2.isPresent(), true);
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasInputFault(), false);
+ EXPECT_EQ(psu2.hasMFRFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasPSKillFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasPS12VcsFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasPSCS12VFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasVINUVFault(), false);
+ EXPECT_EQ(psu2.hasCommFault(), false);
+ EXPECT_EQ(psu2.hasVoutOVFault(), false);
+ EXPECT_EQ(psu2.hasIoutOCFault(), false);
+ EXPECT_EQ(psu2.hasVoutUVFault(), false);
+ EXPECT_EQ(psu2.hasFanFault(), false);
+ EXPECT_EQ(psu2.hasTempFault(), false);
+ EXPECT_EQ(psu2.hasPgoodFault(), false);
+ }
}
+ EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+ psu2.clearFaults();
// Temperature fault.
{
// First STATUS_WORD with no bits set, then with temperature fault.
@@ -409,28 +431,33 @@
expectations.statusWordValue = (status_word::TEMPERATURE_FAULT_WARN);
// STATUS_TEMPERATURE with fault bit(s) on.
expectations.statusTempValue = 0x10;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("213000"));
- psu2.analyze();
- EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), true);
- EXPECT_EQ(psu2.hasInputFault(), false);
- EXPECT_EQ(psu2.hasMFRFault(), false);
- EXPECT_EQ(psu2.hasVINUVFault(), false);
- EXPECT_EQ(psu2.hasCommFault(), false);
- EXPECT_EQ(psu2.hasVoutOVFault(), false);
- EXPECT_EQ(psu2.hasIoutOCFault(), false);
- EXPECT_EQ(psu2.hasVoutUVFault(), false);
- EXPECT_EQ(psu2.hasFanFault(), false);
- EXPECT_EQ(psu2.hasTempFault(), true);
- EXPECT_EQ(psu2.hasPgoodFault(), false);
- EXPECT_EQ(psu2.hasPSKillFault(), false);
- EXPECT_EQ(psu2.hasPS12VcsFault(), false);
- EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("213000"));
+ psu2.analyze();
+ EXPECT_EQ(psu2.isPresent(), true);
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasInputFault(), false);
+ EXPECT_EQ(psu2.hasMFRFault(), false);
+ EXPECT_EQ(psu2.hasVINUVFault(), false);
+ EXPECT_EQ(psu2.hasCommFault(), false);
+ EXPECT_EQ(psu2.hasVoutOVFault(), false);
+ EXPECT_EQ(psu2.hasIoutOCFault(), false);
+ EXPECT_EQ(psu2.hasVoutUVFault(), false);
+ EXPECT_EQ(psu2.hasFanFault(), false);
+ EXPECT_EQ(psu2.hasTempFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasPgoodFault(), false);
+ EXPECT_EQ(psu2.hasPSKillFault(), false);
+ EXPECT_EQ(psu2.hasPS12VcsFault(), false);
+ EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ }
}
+ EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+ psu2.clearFaults();
// CML fault
{
// First STATUS_WORD wit no bits set, then with CML fault.
@@ -444,28 +471,33 @@
expectations.statusWordValue = (status_word::CML_FAULT);
// Turn on STATUS_CML fault bit(s)
expectations.statusCMLValue = 0xFF;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("215000"));
- psu2.analyze();
- EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), true);
- EXPECT_EQ(psu2.hasInputFault(), false);
- EXPECT_EQ(psu2.hasMFRFault(), false);
- EXPECT_EQ(psu2.hasVINUVFault(), false);
- EXPECT_EQ(psu2.hasCommFault(), true);
- EXPECT_EQ(psu2.hasVoutOVFault(), false);
- EXPECT_EQ(psu2.hasIoutOCFault(), false);
- EXPECT_EQ(psu2.hasVoutUVFault(), false);
- EXPECT_EQ(psu2.hasFanFault(), false);
- EXPECT_EQ(psu2.hasTempFault(), false);
- EXPECT_EQ(psu2.hasPgoodFault(), false);
- EXPECT_EQ(psu2.hasPSKillFault(), false);
- EXPECT_EQ(psu2.hasPS12VcsFault(), false);
- EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("215000"));
+ psu2.analyze();
+ EXPECT_EQ(psu2.isPresent(), true);
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasCommFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasInputFault(), false);
+ EXPECT_EQ(psu2.hasMFRFault(), false);
+ EXPECT_EQ(psu2.hasVINUVFault(), false);
+ EXPECT_EQ(psu2.hasVoutOVFault(), false);
+ EXPECT_EQ(psu2.hasIoutOCFault(), false);
+ EXPECT_EQ(psu2.hasVoutUVFault(), false);
+ EXPECT_EQ(psu2.hasFanFault(), false);
+ EXPECT_EQ(psu2.hasTempFault(), false);
+ EXPECT_EQ(psu2.hasPgoodFault(), false);
+ EXPECT_EQ(psu2.hasPSKillFault(), false);
+ EXPECT_EQ(psu2.hasPS12VcsFault(), false);
+ EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ }
}
+ EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+ psu2.clearFaults();
// VOUT_OV_FAULT fault
{
// First STATUS_WORD with no bits set, then with VOUT/VOUT_OV fault.
@@ -480,27 +512,30 @@
((status_word::VOUT_FAULT) | (status_word::VOUT_OV_FAULT));
// Turn on STATUS_VOUT fault bit(s)
expectations.statusVOUTValue = 0xA0;
- // STATUS_TEMPERATURE don't care (default)
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("217000"));
- psu2.analyze();
- EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), true);
- EXPECT_EQ(psu2.hasInputFault(), false);
- EXPECT_EQ(psu2.hasMFRFault(), false);
- EXPECT_EQ(psu2.hasVINUVFault(), false);
- EXPECT_EQ(psu2.hasCommFault(), false);
- EXPECT_EQ(psu2.hasVoutOVFault(), true);
- EXPECT_EQ(psu2.hasVoutUVFault(), false);
- EXPECT_EQ(psu2.hasIoutOCFault(), false);
- EXPECT_EQ(psu2.hasFanFault(), false);
- EXPECT_EQ(psu2.hasTempFault(), false);
- EXPECT_EQ(psu2.hasPgoodFault(), false);
- EXPECT_EQ(psu2.hasPSKillFault(), false);
- EXPECT_EQ(psu2.hasPS12VcsFault(), false);
- EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ // STATUS_TEMPERATURE don't care (default)
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("217000"));
+ psu2.analyze();
+ EXPECT_EQ(psu2.isPresent(), true);
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasInputFault(), false);
+ EXPECT_EQ(psu2.hasMFRFault(), false);
+ EXPECT_EQ(psu2.hasVINUVFault(), false);
+ EXPECT_EQ(psu2.hasCommFault(), false);
+ EXPECT_EQ(psu2.hasVoutOVFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasVoutUVFault(), false);
+ EXPECT_EQ(psu2.hasIoutOCFault(), false);
+ EXPECT_EQ(psu2.hasFanFault(), false);
+ EXPECT_EQ(psu2.hasTempFault(), false);
+ EXPECT_EQ(psu2.hasPgoodFault(), false);
+ EXPECT_EQ(psu2.hasPSKillFault(), false);
+ EXPECT_EQ(psu2.hasPS12VcsFault(), false);
+ EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ }
}
// IOUT_OC_FAULT fault
@@ -516,26 +551,29 @@
expectations.statusWordValue = status_word::IOUT_OC_FAULT;
// Turn on STATUS_IOUT fault bit(s)
expectations.statusIOUTValue = 0x88;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("219000"));
- psu2.analyze();
- EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), true);
- EXPECT_EQ(psu2.hasInputFault(), false);
- EXPECT_EQ(psu2.hasMFRFault(), false);
- EXPECT_EQ(psu2.hasVINUVFault(), false);
- EXPECT_EQ(psu2.hasCommFault(), false);
- EXPECT_EQ(psu2.hasVoutOVFault(), false);
- EXPECT_EQ(psu2.hasIoutOCFault(), true);
- EXPECT_EQ(psu2.hasVoutUVFault(), false);
- EXPECT_EQ(psu2.hasFanFault(), false);
- EXPECT_EQ(psu2.hasTempFault(), false);
- EXPECT_EQ(psu2.hasPgoodFault(), false);
- EXPECT_EQ(psu2.hasPSKillFault(), false);
- EXPECT_EQ(psu2.hasPS12VcsFault(), false);
- EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("219000"));
+ psu2.analyze();
+ EXPECT_EQ(psu2.isPresent(), true);
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasInputFault(), false);
+ EXPECT_EQ(psu2.hasMFRFault(), false);
+ EXPECT_EQ(psu2.hasVINUVFault(), false);
+ EXPECT_EQ(psu2.hasCommFault(), false);
+ EXPECT_EQ(psu2.hasVoutOVFault(), false);
+ EXPECT_EQ(psu2.hasIoutOCFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasVoutUVFault(), false);
+ EXPECT_EQ(psu2.hasFanFault(), false);
+ EXPECT_EQ(psu2.hasTempFault(), false);
+ EXPECT_EQ(psu2.hasPgoodFault(), false);
+ EXPECT_EQ(psu2.hasPSKillFault(), false);
+ EXPECT_EQ(psu2.hasPS12VcsFault(), false);
+ EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ }
}
// VOUT_UV_FAULT
@@ -551,26 +589,29 @@
expectations.statusWordValue = (status_word::VOUT_FAULT);
// Turn on STATUS_VOUT fault bit(s)
expectations.statusVOUTValue = 0x30;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("221000"));
- psu2.analyze();
- EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), true);
- EXPECT_EQ(psu2.hasInputFault(), false);
- EXPECT_EQ(psu2.hasMFRFault(), false);
- EXPECT_EQ(psu2.hasVINUVFault(), false);
- EXPECT_EQ(psu2.hasCommFault(), false);
- EXPECT_EQ(psu2.hasVoutOVFault(), false);
- EXPECT_EQ(psu2.hasIoutOCFault(), false);
- EXPECT_EQ(psu2.hasVoutUVFault(), true);
- EXPECT_EQ(psu2.hasFanFault(), false);
- EXPECT_EQ(psu2.hasTempFault(), false);
- EXPECT_EQ(psu2.hasPgoodFault(), false);
- EXPECT_EQ(psu2.hasPSKillFault(), false);
- EXPECT_EQ(psu2.hasPS12VcsFault(), false);
- EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("221000"));
+ psu2.analyze();
+ EXPECT_EQ(psu2.isPresent(), true);
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasInputFault(), false);
+ EXPECT_EQ(psu2.hasMFRFault(), false);
+ EXPECT_EQ(psu2.hasVINUVFault(), false);
+ EXPECT_EQ(psu2.hasCommFault(), false);
+ EXPECT_EQ(psu2.hasVoutOVFault(), false);
+ EXPECT_EQ(psu2.hasIoutOCFault(), false);
+ EXPECT_EQ(psu2.hasVoutUVFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasFanFault(), false);
+ EXPECT_EQ(psu2.hasTempFault(), false);
+ EXPECT_EQ(psu2.hasPgoodFault(), false);
+ EXPECT_EQ(psu2.hasPSKillFault(), false);
+ EXPECT_EQ(psu2.hasPS12VcsFault(), false);
+ EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ }
}
// Fan fault
@@ -585,26 +626,30 @@
expectations.statusWordValue = (status_word::FAN_FAULT);
// STATUS_FANS_1_2 with fan 1 warning & fault bits on.
expectations.statusFans12Value = 0xA0;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("223000"));
- psu2.analyze();
- EXPECT_EQ(psu2.isPresent(), true);
- EXPECT_EQ(psu2.isFaulted(), true);
- EXPECT_EQ(psu2.hasInputFault(), false);
- EXPECT_EQ(psu2.hasMFRFault(), false);
- EXPECT_EQ(psu2.hasVINUVFault(), false);
- EXPECT_EQ(psu2.hasCommFault(), false);
- EXPECT_EQ(psu2.hasVoutOVFault(), false);
- EXPECT_EQ(psu2.hasIoutOCFault(), false);
- EXPECT_EQ(psu2.hasVoutUVFault(), false);
- EXPECT_EQ(psu2.hasFanFault(), true);
- EXPECT_EQ(psu2.hasTempFault(), false);
- EXPECT_EQ(psu2.hasPgoodFault(), false);
- EXPECT_EQ(psu2.hasPSKillFault(), false);
- EXPECT_EQ(psu2.hasPS12VcsFault(), false);
- EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("223000"));
+ psu2.analyze();
+ EXPECT_EQ(psu2.isPresent(), true);
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasFanFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu2.hasInputFault(), false);
+ EXPECT_EQ(psu2.hasMFRFault(), false);
+ EXPECT_EQ(psu2.hasVINUVFault(), false);
+ EXPECT_EQ(psu2.hasCommFault(), false);
+ EXPECT_EQ(psu2.hasVoutOVFault(), false);
+ EXPECT_EQ(psu2.hasIoutOCFault(), false);
+ EXPECT_EQ(psu2.hasVoutUVFault(), false);
+ EXPECT_EQ(psu2.hasTempFault(), false);
+ EXPECT_EQ(psu2.hasPgoodFault(), false);
+ EXPECT_EQ(psu2.hasPSKillFault(), false);
+ EXPECT_EQ(psu2.hasPS12VcsFault(), false);
+ EXPECT_EQ(psu2.hasPSCS12VFault(), false);
+ }
}
// PGOOD/OFF fault. Deglitched, needs to reach DEGLITCH_LIMIT.
@@ -630,14 +675,7 @@
.WillOnce(Return("124000"));
psu2.analyze();
EXPECT_EQ(psu2.isPresent(), true);
- if (x < DEGLITCH_LIMIT)
- {
- EXPECT_EQ(psu2.isFaulted(), false);
- }
- else
- {
- EXPECT_EQ(psu2.isFaulted(), true);
- }
+ EXPECT_EQ(psu2.isFaulted(), x >= DEGLITCH_LIMIT);
EXPECT_EQ(psu2.hasInputFault(), false);
EXPECT_EQ(psu2.hasMFRFault(), false);
EXPECT_EQ(psu2.hasVINUVFault(), false);
@@ -764,44 +802,35 @@
expectations.statusFans12Value = 0xFF;
// STATUS_TEMPERATURE with bits on.
expectations.statusTempValue = 0xFF;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("0"));
- psu.analyze();
- EXPECT_EQ(psu.isPresent(), true);
- EXPECT_EQ(psu.isFaulted(), true);
- EXPECT_EQ(psu.hasInputFault(), true);
- EXPECT_EQ(psu.hasMFRFault(), true);
- EXPECT_EQ(psu.hasVINUVFault(), true);
- EXPECT_EQ(psu.hasCommFault(), true);
- EXPECT_EQ(psu.hasVoutOVFault(), true);
- EXPECT_EQ(psu.hasIoutOCFault(), true);
- // Cannot have VOUT_OV_FAULT and VOUT_UV_FAULT.
- // Rely on HasVoutUVFault() to verify this sets and clears.
- EXPECT_EQ(psu.hasVoutUVFault(), false);
- EXPECT_EQ(psu.hasFanFault(), true);
- EXPECT_EQ(psu.hasTempFault(), true);
- // pgoodFault is deglitched up to DEGLITCH_LIMIT
- EXPECT_EQ(psu.hasPgoodFault(), false);
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("0"));
- psu.analyze();
- EXPECT_EQ(psu.hasPgoodFault(), false);
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("0"));
- psu.analyze();
- // DEGLITCH_LIMIT reached for pgoodFault
- EXPECT_EQ(psu.hasPgoodFault(), true);
- EXPECT_EQ(psu.hasPSKillFault(), true);
- EXPECT_EQ(psu.hasPS12VcsFault(), true);
- EXPECT_EQ(psu.hasPSCS12VFault(), true);
- // This is the CLEAR_FAULTS read that does not check the return value.
- EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(3));
+
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("0"));
+ psu.analyze();
+ EXPECT_EQ(psu.isPresent(), true);
+ // Cannot have VOUT_OV_FAULT and VOUT_UV_FAULT.
+ // Rely on HasVoutUVFault() to verify this sets and clears.
+ EXPECT_EQ(psu.hasVoutUVFault(), false);
+ // All faults are deglitched up to DEGLITCH_LIMIT
+ EXPECT_EQ(psu.isFaulted(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasInputFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasMFRFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasVINUVFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasCommFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasVoutOVFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasIoutOCFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasFanFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasTempFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasPgoodFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasPSKillFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasPS12VcsFault(), x >= DEGLITCH_LIMIT);
+ EXPECT_EQ(psu.hasPSCS12VFault(), x >= DEGLITCH_LIMIT);
+ }
+
+ EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(207000));
psu.clearFaults();
EXPECT_EQ(psu.isPresent(), true);
EXPECT_EQ(psu.isFaulted(), false);
@@ -836,12 +865,17 @@
expectations.statusFans12Value = 0xFF;
// STATUS_TEMPERATURE with bits on.
expectations.statusTempValue = 0xFF;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(0));
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("0"));
- psu.analyze();
+
+ // All faults degltiched now. Check for false before limit above.
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("0"));
+ psu.analyze();
+ }
+
EXPECT_EQ(psu.isPresent(), true);
EXPECT_EQ(psu.isFaulted(), true);
EXPECT_EQ(psu.hasInputFault(), true);
@@ -856,8 +890,7 @@
EXPECT_EQ(psu.hasVoutUVFault(), false);
EXPECT_EQ(psu.hasFanFault(), true);
EXPECT_EQ(psu.hasTempFault(), true);
- // PGOOD fault is deglitched before hasPgoodFault() returns true.
- EXPECT_EQ(psu.hasPgoodFault(), false);
+ EXPECT_EQ(psu.hasPgoodFault(), true);
EXPECT_EQ(psu.hasPSKillFault(), true);
EXPECT_EQ(psu.hasPS12VcsFault(), true);
EXPECT_EQ(psu.hasPSCS12VFault(), true);
@@ -871,6 +904,7 @@
EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
.Times(1)
.WillOnce(Return("206000"));
+ EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(0));
psu.analyze();
EXPECT_EQ(psu.isPresent(), true);
EXPECT_EQ(psu.isFaulted(), false);
@@ -1011,13 +1045,16 @@
expectations.statusFans12Value = 0xFF;
// STATUS_TEMPERATURE with fault bits on.
expectations.statusTempValue = 0xFF;
- setPMBusExpectations(mockPMBus, expectations);
- // Also get another read of READ_VIN.
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("125790"));
- psu.analyze();
- EXPECT_EQ(psu.isFaulted(), true);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ // Also get another read of READ_VIN.
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("125790"));
+ psu.analyze();
+ EXPECT_EQ(psu.isFaulted(), x >= DEGLITCH_LIMIT);
+ }
}
TEST_F(PowerSupplyTests, HasInputFault)
@@ -1044,13 +1081,16 @@
expectations.statusWordValue = (status_word::INPUT_FAULT_WARN);
// STATUS_INPUT with an input fault bit on.
expectations.statusInputValue = 0x80;
- setPMBusExpectations(mockPMBus, expectations);
- // Analyze call will also need good READ_VIN value to check.
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("201200"));
- psu.analyze();
- EXPECT_EQ(psu.hasInputFault(), true);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ // Analyze call will also need good READ_VIN value to check.
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("201200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasInputFault(), x >= DEGLITCH_LIMIT);
+ }
// STATUS_WORD with no bits on.
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1087,12 +1127,15 @@
expectations.statusWordValue = (status_word::MFR_SPECIFIC_FAULT);
// STATUS_MFR_SPEFIC with bit(s) on.
expectations.statusMFRValue = 0xFF;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("202200"));
- psu.analyze();
- EXPECT_EQ(psu.hasMFRFault(), true);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("202200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasMFRFault(), x >= DEGLITCH_LIMIT);
+ }
// Back to no bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1136,13 +1179,16 @@
// Curious disagreement between PMBus Spec. Part II Figure 16 and 33. Go by
// Figure 16, and assume bits on in STATUS_INPUT.
expectations.statusInputValue = 0x18;
- setPMBusExpectations(mockPMBus, expectations);
- // If there is a VIN_UV fault, fake reading voltage of less than 20V
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("19876"));
- psu.analyze();
- EXPECT_EQ(psu.hasVINUVFault(), true);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ // If there is a VIN_UV fault, fake reading voltage of less than 20V
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("19876"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasVINUVFault(), x >= DEGLITCH_LIMIT);
+ }
// Back to no fault bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1182,13 +1228,15 @@
expectations.statusWordValue = (status_word::VOUT_OV_FAULT);
// STATUS_VOUT fault bit(s)
expectations.statusVOUTValue = 0x80;
- // STATUS_TEMPERATURE default.
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("202200"));
- psu.analyze();
- EXPECT_EQ(psu.hasVoutOVFault(), true);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("202200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasVoutOVFault(), x >= DEGLITCH_LIMIT);
+ }
// Back to no fault bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1224,12 +1272,15 @@
expectations.statusWordValue = status_word::IOUT_OC_FAULT;
// STATUS_IOUT fault bit(s)
expectations.statusIOUTValue = 0x88;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("203200"));
- psu.analyze();
- EXPECT_EQ(psu.hasIoutOCFault(), true);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("203200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasIoutOCFault(), x >= DEGLITCH_LIMIT);
+ }
// Back to no fault bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1265,12 +1316,15 @@
expectations.statusWordValue = (status_word::VOUT_FAULT);
// STATUS_VOUT fault bit(s)
expectations.statusVOUTValue = 0x30;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("204200"));
- psu.analyze();
- EXPECT_EQ(psu.hasVoutUVFault(), true);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("204200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasVoutUVFault(), x >= DEGLITCH_LIMIT);
+ }
// Back to no fault bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1306,13 +1360,16 @@
expectations.statusWordValue = (status_word::FAN_FAULT);
// STATUS_FANS_1_2 fault bit on (Fan 1 Fault)
expectations.statusFans12Value = 0x80;
- setPMBusExpectations(mockPMBus, expectations);
- // Call to analyze will trigger read of "in1_input" to check voltage.
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("205200"));
- psu.analyze();
- EXPECT_EQ(psu.hasFanFault(), true);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ // Call to analyze will trigger read of "in1_input" to check voltage.
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("205200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasFanFault(), x >= DEGLITCH_LIMIT);
+ }
// Back to no fault bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1349,13 +1406,16 @@
expectations.statusWordValue = (status_word::TEMPERATURE_FAULT_WARN);
// STATUS_TEMPERATURE fault bit on (OT Fault)
expectations.statusTempValue = 0x80;
- setPMBusExpectations(mockPMBus, expectations);
- // Call to analyze will trigger read of "in1_input" to check voltage.
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("206200"));
- psu.analyze();
- EXPECT_EQ(psu.hasTempFault(), true);
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ // Call to analyze will trigger read of "in1_input" to check voltage.
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("206200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasTempFault(), x >= DEGLITCH_LIMIT);
+ }
// Back to no fault bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1494,13 +1554,19 @@
expectations.statusWordValue = (status_word::MFR_SPECIFIC_FAULT);
// STATUS_MFR_SPEFIC with bit(s) on.
expectations.statusMFRValue = 0xFF;
- setPMBusExpectations(mockPMBus, expectations);
- // Call to analyze will trigger read of "in1_input" to check voltage.
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("208200"));
- psu.analyze();
- EXPECT_EQ(psu.hasPSKillFault(), true);
+
+ // Deglitching faults, false until read the fault bits on up to the limit.
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ // Call to analyze will trigger read of "in1_input" to check voltage.
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("208200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasPSKillFault(), x >= DEGLITCH_LIMIT);
+ }
+
// Back to no bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1514,13 +1580,18 @@
expectations.statusWordValue = (status_word::MFR_SPECIFIC_FAULT);
// STATUS_MFR_SPEFIC with bit 4 on.
expectations.statusMFRValue = 0x10;
- setPMBusExpectations(mockPMBus, expectations);
- // Call to analyze will trigger read of "in1_input" to check voltage.
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("208400"));
- psu.analyze();
- EXPECT_EQ(psu.hasPSKillFault(), true);
+
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ // Call to analyze will trigger read of "in1_input" to check voltage.
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("208400"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasPSKillFault(), x >= DEGLITCH_LIMIT);
+ }
+
// Back to no bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1555,12 +1626,17 @@
expectations.statusWordValue = (status_word::MFR_SPECIFIC_FAULT);
// STATUS_MFR_SPEFIC with bit(s) on.
expectations.statusMFRValue = 0xFF;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("209200"));
- psu.analyze();
- EXPECT_EQ(psu.hasPS12VcsFault(), true);
+
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("209200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasPS12VcsFault(), x >= DEGLITCH_LIMIT);
+ }
+
// Back to no bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1573,12 +1649,17 @@
expectations.statusWordValue = (status_word::MFR_SPECIFIC_FAULT);
// STATUS_MFR_SPEFIC with bit 6 on.
expectations.statusMFRValue = 0x40;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("209400"));
- psu.analyze();
- EXPECT_EQ(psu.hasPS12VcsFault(), true);
+
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("209400"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasPS12VcsFault(), x >= DEGLITCH_LIMIT);
+ }
+
// Back to no bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1611,12 +1692,17 @@
expectations.statusWordValue = (status_word::MFR_SPECIFIC_FAULT);
// STATUS_MFR_SPEFIC with bit(s) on.
expectations.statusMFRValue = 0xFF;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("209200"));
- psu.analyze();
- EXPECT_EQ(psu.hasPSCS12VFault(), true);
+
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("209200"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasPSCS12VFault(), x >= DEGLITCH_LIMIT);
+ }
+
// Back to no bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);
@@ -1629,12 +1715,17 @@
expectations.statusWordValue = (status_word::MFR_SPECIFIC_FAULT);
// STATUS_MFR_SPEFIC with bit 7 on.
expectations.statusMFRValue = 0x80;
- setPMBusExpectations(mockPMBus, expectations);
- EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
- .Times(1)
- .WillOnce(Return("209400"));
- psu.analyze();
- EXPECT_EQ(psu.hasPSCS12VFault(), true);
+
+ for (auto x = 1; x <= DEGLITCH_LIMIT; x++)
+ {
+ setPMBusExpectations(mockPMBus, expectations);
+ EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
+ .Times(1)
+ .WillOnce(Return("209400"));
+ psu.analyze();
+ EXPECT_EQ(psu.hasPSCS12VFault(), x >= DEGLITCH_LIMIT);
+ }
+
// Back to no bits on in STATUS_WORD
expectations.statusWordValue = 0;
setPMBusExpectations(mockPMBus, expectations);