Car interface: custom safety params (#659)

* init

* do it for hyundai

* Bump submodules

* no complaints

* use latest opendbc pr ref

* don't need this for leaf for now

* bump opendbc

* gotta set the sp safety flags in test models and safety replay!

* actually fetch CP_SP

* set safety param for lda button availability (lol forgot)

* use GET_FLAG

* Add TODO-SP

* bump submodules
This commit is contained in:
Jason Wen
2025-03-15 17:55:41 -04:00
parent 4879e2f5ec
commit db0ce99c01
8 changed files with 27 additions and 17 deletions

View File

@@ -136,7 +136,8 @@ struct OnroadEventSP @0xda96579883444c35 {
}
struct CarParamsSP @0x80ae746ee2596b11 {
flags @0 :UInt32; # flags for car specific quirks in sunnypilot
flags @0 :UInt32; # flags for car specific quirks in sunnypilot
safetyParam @1 : Int16; # flags for sunnypilot's custom safety flags
}
struct CarControlSP @0xa5cd762cd951a455 {

2
panda

Submodule panda updated: 5479e1572a...ccb9581b1c

View File

@@ -172,6 +172,9 @@ class TestCarModelBase(unittest.TestCase):
# TODO: check safetyModel is in release panda build
self.safety = libsafety_py.libsafety
safety_param_sp = self.CP_SP.safetyParam
self.safety.set_current_safety_param_sp(safety_param_sp)
cfg = self.CP.safetyConfigs[-1]
set_status = self.safety.set_safety_hooks(cfg.safetyModel.raw, cfg.safetyParam)
self.assertEqual(0, set_status, f"failed to set safetyModel {cfg}")

View File

@@ -62,8 +62,8 @@ void Panda::set_safety_model(cereal::CarParams::SafetyModel safety_model, uint16
handle->control_write(0xdc, (uint16_t)safety_model, safety_param);
}
void Panda::set_alternative_experience(uint16_t alternative_experience) {
handle->control_write(0xdf, alternative_experience, 0);
void Panda::set_alternative_experience(uint16_t alternative_experience, uint16_t safety_param_sp) {
handle->control_write(0xdf, alternative_experience, safety_param_sp);
}
cereal::PandaState::PandaType Panda::get_hw_type() {

View File

@@ -63,7 +63,7 @@ public:
// Panda functionality
cereal::PandaState::PandaType get_hw_type();
void set_safety_model(cereal::CarParams::SafetyModel safety_model, uint16_t safety_param=0U);
void set_alternative_experience(uint16_t alternative_experience);
void set_alternative_experience(uint16_t alternative_experience, uint16_t safety_param_sp=0U);
void set_fan_speed(uint16_t fan_speed);
uint16_t get_fan_speed();
void set_ir_pwr(uint16_t ir_pwr);

View File

@@ -10,7 +10,8 @@ void PandaSafety::configureSafetyMode() {
auto car_params = fetchCarParams();
if (!car_params.empty()) {
LOGW("got %lu bytes CarParams", car_params.size());
LOGW("got %lu bytes CarParams", car_params[0].size());
LOGW("got %lu bytes CarParamsSP", car_params[1].size());
setSafetyMode(car_params);
safety_configured_ = true;
}
@@ -43,7 +44,8 @@ void PandaSafety::updateMultiplexingMode() {
}
}
std::string PandaSafety::fetchCarParams() {
// TODO-SP: Use structs instead of vector
std::vector<std::string> PandaSafety::fetchCarParams() {
if (!params_.getBool("FirmwareQueryDone")) {
return {};
}
@@ -56,16 +58,21 @@ std::string PandaSafety::fetchCarParams() {
if (!params_.getBool("ControlsReady")) {
return {};
}
return params_.get("CarParams");
return {params_.get("CarParams"), params_.get("CarParamsSP")};
}
void PandaSafety::setSafetyMode(const std::string &params_string) {
// TODO-SP: Use structs instead of vector
void PandaSafety::setSafetyMode(const std::vector<std::string> &params_string) {
AlignedBuffer aligned_buf;
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(params_string.data(), params_string.size()));
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(params_string[0].data(), params_string[0].size()));
cereal::CarParams::Reader car_params = cmsg.getRoot<cereal::CarParams>();
capnp::FlatArrayMessageReader cmsg_sp(aligned_buf.align(params_string[1].data(), params_string[1].size()));
cereal::CarParamsSP::Reader car_params_sp = cmsg_sp.getRoot<cereal::CarParamsSP>();
auto safety_configs = car_params.getSafetyConfigs();
uint16_t alternative_experience = car_params.getAlternativeExperience();
uint16_t safety_param_sp = car_params_sp.getSafetyParam();
for (int i = 0; i < pandas_.size(); ++i) {
// Default to SILENT safety model if not specified
@@ -76,8 +83,8 @@ void PandaSafety::setSafetyMode(const std::string &params_string) {
safety_param = safety_configs[i].getSafetyParam();
}
LOGW("Panda %d: setting safety model: %d, param: %d, alternative experience: %d", i, (int)safety_model, safety_param, alternative_experience);
pandas_[i]->set_alternative_experience(alternative_experience);
LOGW("Panda %d: setting safety model: %d, param: %d, alternative experience: %d, param_sp: %d", i, (int)safety_model, safety_param, alternative_experience, safety_param_sp);
pandas_[i]->set_alternative_experience(alternative_experience, safety_param_sp);
pandas_[i]->set_safety_model(safety_model, safety_param);
}
}

View File

@@ -16,8 +16,8 @@ public:
private:
void updateMultiplexingMode();
std::string fetchCarParams();
void setSafetyMode(const std::string &params_string);
std::vector<std::string> fetchCarParams();
void setSafetyMode(const std::vector<std::string> &params_string);
bool initialized_ = false;
bool log_once_ = false;

View File

@@ -27,8 +27,7 @@ Last updated: July 29, 2024
from openpilot.common.params import Params
from opendbc.safety import ALTERNATIVE_EXPERIENCE
from opendbc.car.hyundai.values import HyundaiSafetyFlags
from opendbc.sunnypilot.car.hyundai.values import HyundaiFlagsSP
from opendbc.sunnypilot.car.hyundai.values import HyundaiFlagsSP, HyundaiSafetyFlagsSP
class MadsParams:
@@ -55,7 +54,7 @@ class MadsParams:
hyundai_cruise_main_toggleable = True
if hyundai_cruise_main_toggleable:
CP_SP.flags |= HyundaiFlagsSP.LONGITUDINAL_MAIN_CRUISE_TOGGLEABLE.value
CP.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FLAG_HYUNDAI_LONG_MAIN_CRUISE_TOGGLEABLE.value
CP_SP.safetyParam |= HyundaiSafetyFlagsSP.LONG_MAIN_CRUISE_TOGGLEABLE
# MADS is currently not supported in Tesla due to lack of consistent states to engage controls
# TODO-SP: To enable MADS for Tesla, identify consistent signals for MADS toggling