Add harness connection as requirement for powerdown (#21087)

* add harness connection as requirement for powerdown

* fix unittests
pull/21092/head
robbederks 2021-05-31 13:32:26 +02:00 committed by GitHub
parent 0cd316fb29
commit 4a24d389c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 2 deletions

2
cereal

@ -1 +1 @@
Subproject commit d87e7e56d931413d0625fb765c3142ed6106c47b
Subproject commit 1681cdbaf0e3f78f0e2643187809cefb693483ac

View File

@ -377,6 +377,7 @@ void panda_state_thread(bool spoofing_started) {
ps.setFanSpeedRpm(fan_speed_rpm);
ps.setFaultStatus(cereal::PandaState::FaultStatus(pandaState.fault_status));
ps.setPowerSaveEnabled((bool)(pandaState.power_save_enabled));
ps.setHarnessStatus(cereal::PandaState::HarnessStatus(pandaState.car_harness_status));
// Convert faults bitset to capnp list
std::bitset<sizeof(pandaState.faults) * 8> fault_bits(pandaState.faults);

View File

@ -169,6 +169,7 @@ class PowerMonitoring:
disable_charging |= (self.car_battery_capacity_uWh <= 0)
disable_charging &= (not pandaState.pandaState.ignitionLine and not pandaState.pandaState.ignitionCan)
disable_charging &= (not self.params.get_bool("DisablePowerDown"))
disable_charging &= (pandaState.pandaState.harnessStatus != log.PandaState.HarnessStatus.notConnected)
disable_charging |= self.params.get_bool("ForcePowerDown")
return disable_charging

View File

@ -37,12 +37,13 @@ class TestPowerMonitoring(unittest.TestCase):
params.delete("CarBatteryCapacity")
params.delete("DisablePowerDown")
def mock_pandaState(self, ignition, hw_type, car_voltage=12):
def mock_pandaState(self, ignition, hw_type, car_voltage=12, harness_status=log.PandaState.HarnessStatus.normal):
pandaState = messaging.new_message('pandaState')
pandaState.pandaState.pandaType = hw_type
pandaState.pandaState.voltage = car_voltage * 1e3
pandaState.pandaState.ignitionLine = ignition
pandaState.pandaState.ignitionCan = False
pandaState.pandaState.harnessStatus = harness_status
return pandaState
# Test to see that it doesn't do anything when pandaState is None
@ -203,5 +204,23 @@ class TestPowerMonitoring(unittest.TestCase):
self.assertFalse(pm.should_disable_charging(pandaState, ssb))
self.assertFalse(pm.should_disable_charging(pandaState, ssb))
# Test to check policy of not stopping charging when harness is not connected
def test_harness_connection(self):
global ssb
BATT_VOLTAGE = 4
BATT_CURRENT = 0 # To stop shutting down for other reasons
TEST_TIME = 100
with pm_patch("HARDWARE.get_battery_voltage", BATT_VOLTAGE * 1e6), pm_patch("HARDWARE.get_battery_current", BATT_CURRENT * 1e6), \
pm_patch("HARDWARE.get_battery_status", "Discharging"), pm_patch("HARDWARE.get_current_power_draw", None):
pm = PowerMonitoring()
pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh
pandaState = self.mock_pandaState(False, log.PandaState.PandaType.uno, car_voltage=(VBATT_PAUSE_CHARGING - 1),
harness_status=log.PandaState.HarnessStatus.notConnected)
for i in range(TEST_TIME):
pm.calculate(pandaState)
if i % 10 == 0:
self.assertFalse(pm.should_disable_charging(pandaState, ssb))
self.assertFalse(pm.should_disable_charging(pandaState, ssb))
if __name__ == "__main__":
unittest.main()