controlsd: verify unsafe mode consistency (#23563)

* add unsafe mode check to controlsd

bump submodules

forgot to add to health_t struct

bump

ahh forgot to set it!

bump

bump

clean up

clean up

bump

* fix ordering

* move to end

* unsigned

Co-authored-by: Willem Melching <willem.melching@gmail.com>
old-commit-hash: 31d147dca2
vw-mqb-aeb
Shane Smiskol 3 years ago committed by GitHub
parent 87735a44ba
commit 183715ccea
  1. 11
      selfdrive/boardd/boardd.cc
  2. 1
      selfdrive/boardd/panda.h
  3. 1
      selfdrive/car/interfaces.py
  4. 4
      selfdrive/controls/controlsd.py

@ -161,7 +161,8 @@ bool safety_setter_thread(std::vector<Panda *> pandas) {
int safety_param; int safety_param;
auto safety_configs = car_params.getSafetyConfigs(); auto safety_configs = car_params.getSafetyConfigs();
for (uint32_t i=0; i<pandas.size(); i++) { uint16_t unsafe_mode = car_params.getUnsafeMode();
for (uint32_t i = 0; i < pandas.size(); i++) {
auto panda = pandas[i]; auto panda = pandas[i];
if (safety_configs.size() > i) { if (safety_configs.size() > i) {
@ -173,9 +174,8 @@ bool safety_setter_thread(std::vector<Panda *> pandas) {
safety_param = 0; safety_param = 0;
} }
LOGW("panda %d: setting safety model: %d with param %d", i, (int)safety_model, safety_param); LOGW("panda %d: setting safety model: %d, param: %d, unsafe mode: %d", i, (int)safety_model, safety_param, unsafe_mode);
panda->set_unsafe_mode(unsafe_mode);
panda->set_unsafe_mode(0); // see safety_declarations.h for allowed values
panda->set_safety_model(safety_model, safety_param); panda->set_safety_model(safety_model, safety_param);
} }
@ -315,7 +315,7 @@ bool send_panda_states(PubMaster *pm, const std::vector<Panda *> &pandas, bool s
pandaStates.push_back(pandaState); pandaStates.push_back(pandaState);
} }
for (uint32_t i=0; i<pandas.size(); i++) { for (uint32_t i = 0; i < pandas.size(); i++) {
auto panda = pandas[i]; auto panda = pandas[i];
const auto &pandaState = pandaStates[i]; const auto &pandaState = pandaStates[i];
@ -356,6 +356,7 @@ bool send_panda_states(PubMaster *pm, const std::vector<Panda *> &pandas, bool s
ps.setFaultStatus(cereal::PandaState::FaultStatus(pandaState.fault_status)); ps.setFaultStatus(cereal::PandaState::FaultStatus(pandaState.fault_status));
ps.setPowerSaveEnabled((bool)(pandaState.power_save_enabled)); ps.setPowerSaveEnabled((bool)(pandaState.power_save_enabled));
ps.setHeartbeatLost((bool)(pandaState.heartbeat_lost)); ps.setHeartbeatLost((bool)(pandaState.heartbeat_lost));
ps.setUnsafeMode(pandaState.unsafe_mode);
ps.setHarnessStatus(cereal::PandaState::HarnessStatus(pandaState.car_harness_status)); ps.setHarnessStatus(cereal::PandaState::HarnessStatus(pandaState.car_harness_status));
// Convert faults bitset to capnp list // Convert faults bitset to capnp list

@ -45,6 +45,7 @@ struct __attribute__((packed)) health_t {
uint8_t fault_status; uint8_t fault_status;
uint8_t power_save_enabled; uint8_t power_save_enabled;
uint8_t heartbeat_lost; uint8_t heartbeat_lost;
uint16_t unsafe_mode;
}; };
struct __attribute__((packed)) can_header { struct __attribute__((packed)) can_header {

@ -72,6 +72,7 @@ class CarInterfaceBase(ABC):
def get_std_params(candidate, fingerprint): def get_std_params(candidate, fingerprint):
ret = car.CarParams.new_message() ret = car.CarParams.new_message()
ret.carFingerprint = candidate ret.carFingerprint = candidate
ret.unsafeMode = 0 # see safety_declarations.h for allowed values
# standard ALC params # standard ALC params
ret.steerControlType = car.CarParams.SteerControlType.torque ret.steerControlType = car.CarParams.SteerControlType.torque

@ -253,7 +253,9 @@ class Controls:
for i, pandaState in enumerate(self.sm['pandaStates']): for i, pandaState in enumerate(self.sm['pandaStates']):
# All pandas must match the list of safetyConfigs, and if outside this list, must be silent or noOutput # All pandas must match the list of safetyConfigs, and if outside this list, must be silent or noOutput
if i < len(self.CP.safetyConfigs): if i < len(self.CP.safetyConfigs):
safety_mismatch = pandaState.safetyModel != self.CP.safetyConfigs[i].safetyModel or pandaState.safetyParam != self.CP.safetyConfigs[i].safetyParam safety_mismatch = pandaState.safetyModel != self.CP.safetyConfigs[i].safetyModel or \
pandaState.safetyParam != self.CP.safetyConfigs[i].safetyParam or \
pandaState.unsafeMode != self.CP.unsafeMode
else: else:
safety_mismatch = pandaState.safetyModel not in IGNORED_SAFETY_MODES safety_mismatch = pandaState.safetyModel not in IGNORED_SAFETY_MODES

Loading…
Cancel
Save