Make pandaState and safetyMode a list (#22454)
* wip: move to pandaStates * bump cereal * wip: SafetyMode struct * move to safetyMode * fix typo * this can be None * fix potential empty pandaStates list * fix thermald * fix controlsd * rename safetyModes to safetyConfigs * update process_replay * fix test_models * bump cereal
This commit is contained in:
parent
c43d35a04d
commit
91987f38d4
2
cereal
2
cereal
|
@ -1 +1 @@
|
|||
Subproject commit 517fd56398c0d3ae4d0a142849b81e2f025d8572
|
||||
Subproject commit 5168470661703a64f99bbd9743f2236ebc2c24ab
|
|
@ -92,13 +92,22 @@ bool safety_setter_thread(Panda *panda) {
|
|||
AlignedBuffer aligned_buf;
|
||||
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(params.data(), params.size()));
|
||||
cereal::CarParams::Reader car_params = cmsg.getRoot<cereal::CarParams>();
|
||||
cereal::CarParams::SafetyModel safety_model = car_params.getSafetyModel();
|
||||
cereal::CarParams::SafetyModel safety_model;
|
||||
int safety_param;
|
||||
|
||||
auto safety_configs = car_params.getSafetyConfigs();
|
||||
if (safety_configs.size() > 0) {
|
||||
safety_model = safety_configs[0].getSafetyModel();
|
||||
safety_param = safety_configs[0].getSafetyParam();
|
||||
} else {
|
||||
// If no safety mode is set, default to silent
|
||||
safety_model = cereal::CarParams::SafetyModel::SILENT;
|
||||
safety_param = 0;
|
||||
}
|
||||
|
||||
panda->set_unsafe_mode(0); // see safety_declarations.h for allowed values
|
||||
|
||||
auto safety_param = car_params.getSafetyParam();
|
||||
LOGW("setting safety model: %d with param %d", (int)safety_model, safety_param);
|
||||
|
||||
panda->set_safety_model(safety_model, safety_param);
|
||||
return true;
|
||||
}
|
||||
|
@ -242,9 +251,9 @@ void send_empty_peripheral_state(PubMaster *pm) {
|
|||
|
||||
void send_empty_panda_state(PubMaster *pm) {
|
||||
MessageBuilder msg;
|
||||
auto pandaState = msg.initEvent().initPandaState();
|
||||
pandaState.setPandaType(cereal::PandaState::PandaType::UNKNOWN);
|
||||
pm->send("pandaState", msg);
|
||||
auto pandaStates = msg.initEvent().initPandaStates(1);
|
||||
pandaStates[0].setPandaType(cereal::PandaState::PandaType::UNKNOWN);
|
||||
pm->send("pandaStates", msg);
|
||||
}
|
||||
|
||||
bool send_panda_state(PubMaster *pm, Panda *panda, bool spoofing_started) {
|
||||
|
@ -278,27 +287,28 @@ bool send_panda_state(PubMaster *pm, Panda *panda, bool spoofing_started) {
|
|||
auto evt = msg.initEvent();
|
||||
evt.setValid(panda->comms_healthy);
|
||||
|
||||
auto ps = evt.initPandaState();
|
||||
ps.setUptime(pandaState.uptime);
|
||||
ps.setIgnitionLine(pandaState.ignition_line);
|
||||
ps.setIgnitionCan(pandaState.ignition_can);
|
||||
ps.setControlsAllowed(pandaState.controls_allowed);
|
||||
ps.setGasInterceptorDetected(pandaState.gas_interceptor_detected);
|
||||
ps.setCanRxErrs(pandaState.can_rx_errs);
|
||||
ps.setCanSendErrs(pandaState.can_send_errs);
|
||||
ps.setCanFwdErrs(pandaState.can_fwd_errs);
|
||||
ps.setGmlanSendErrs(pandaState.gmlan_send_errs);
|
||||
ps.setPandaType(panda->hw_type);
|
||||
ps.setSafetyModel(cereal::CarParams::SafetyModel(pandaState.safety_model));
|
||||
ps.setSafetyParam(pandaState.safety_param);
|
||||
ps.setFaultStatus(cereal::PandaState::FaultStatus(pandaState.fault_status));
|
||||
ps.setPowerSaveEnabled((bool)(pandaState.power_save_enabled));
|
||||
ps.setHeartbeatLost((bool)(pandaState.heartbeat_lost));
|
||||
ps.setHarnessStatus(cereal::PandaState::HarnessStatus(pandaState.car_harness_status));
|
||||
// TODO: this has to be adapted to merge in multipanda support
|
||||
auto ps = evt.initPandaStates(1);
|
||||
ps[0].setUptime(pandaState.uptime);
|
||||
ps[0].setIgnitionLine(pandaState.ignition_line);
|
||||
ps[0].setIgnitionCan(pandaState.ignition_can);
|
||||
ps[0].setControlsAllowed(pandaState.controls_allowed);
|
||||
ps[0].setGasInterceptorDetected(pandaState.gas_interceptor_detected);
|
||||
ps[0].setCanRxErrs(pandaState.can_rx_errs);
|
||||
ps[0].setCanSendErrs(pandaState.can_send_errs);
|
||||
ps[0].setCanFwdErrs(pandaState.can_fwd_errs);
|
||||
ps[0].setGmlanSendErrs(pandaState.gmlan_send_errs);
|
||||
ps[0].setPandaType(panda->hw_type);
|
||||
ps[0].setSafetyModel(cereal::CarParams::SafetyModel(pandaState.safety_model));
|
||||
ps[0].setSafetyParam(pandaState.safety_param);
|
||||
ps[0].setFaultStatus(cereal::PandaState::FaultStatus(pandaState.fault_status));
|
||||
ps[0].setPowerSaveEnabled((bool)(pandaState.power_save_enabled));
|
||||
ps[0].setHeartbeatLost((bool)(pandaState.heartbeat_lost));
|
||||
ps[0].setHarnessStatus(cereal::PandaState::HarnessStatus(pandaState.car_harness_status));
|
||||
|
||||
// Convert faults bitset to capnp list
|
||||
std::bitset<sizeof(pandaState.faults) * 8> fault_bits(pandaState.faults);
|
||||
auto faults = ps.initFaults(fault_bits.count());
|
||||
auto faults = ps[0].initFaults(fault_bits.count());
|
||||
|
||||
size_t i = 0;
|
||||
for (size_t f = size_t(cereal::PandaState::FaultType::RELAY_MALFUNCTION);
|
||||
|
@ -308,7 +318,7 @@ bool send_panda_state(PubMaster *pm, Panda *panda, bool spoofing_started) {
|
|||
i++;
|
||||
}
|
||||
}
|
||||
pm->send("pandaState", msg);
|
||||
pm->send("pandaStates", msg);
|
||||
|
||||
return ignition;
|
||||
}
|
||||
|
@ -558,7 +568,7 @@ int main() {
|
|||
LOG("set affinity returns %d", err);
|
||||
|
||||
LOGW("attempting to connect");
|
||||
PubMaster pm({"pandaState", "peripheralState"});
|
||||
PubMaster pm({"pandaStates", "peripheralState"});
|
||||
|
||||
while (!do_exit) {
|
||||
Panda *panda = usb_connect();
|
||||
|
|
|
@ -156,7 +156,7 @@ def boardd_loop(rate=100):
|
|||
|
||||
# *** publishes can and health
|
||||
logcan = messaging.pub_sock('can')
|
||||
health_sock = messaging.pub_sock('pandaState')
|
||||
health_sock = messaging.pub_sock('pandaStates')
|
||||
|
||||
# *** subscribes to can send
|
||||
sendcan = messaging.sub_sock('sendcan')
|
||||
|
@ -168,14 +168,14 @@ def boardd_loop(rate=100):
|
|||
# health packet @ 2hz
|
||||
if (rk.frame % (rate // 2)) == 0:
|
||||
health = can_health()
|
||||
msg = messaging.new_message('pandaState')
|
||||
msg = messaging.new_message('pandaStates', 1)
|
||||
|
||||
# store the health to be logged
|
||||
msg.pandaState.voltage = health['voltage']
|
||||
msg.pandaState.current = health['current']
|
||||
msg.pandaState.ignitionLine = health['ignition_line']
|
||||
msg.pandaState.ignitionCan = health['ignition_can']
|
||||
msg.pandaState.controlsAllowed = True
|
||||
msg.pandaState[0].voltage = health['voltage']
|
||||
msg.pandaState[0].current = health['current']
|
||||
msg.pandaState[0].ignitionLine = health['ignition_line']
|
||||
msg.pandaState[0].ignitionCan = health['ignition_can']
|
||||
msg.pandaState[0].controlsAllowed = True
|
||||
|
||||
health_sock.send(msg.to_bytes())
|
||||
|
||||
|
|
|
@ -40,13 +40,17 @@ def test_boardd_loopback():
|
|||
time.sleep(2)
|
||||
|
||||
with Timeout(60, "boardd didn't start"):
|
||||
sm = messaging.SubMaster(['pandaState'])
|
||||
while sm.rcv_frame['pandaState'] < 1:
|
||||
sm = messaging.SubMaster(['pandaStates'])
|
||||
while sm.rcv_frame['pandaStates'] < 1:
|
||||
sm.update(1000)
|
||||
|
||||
# boardd blocks on CarVin and CarParams
|
||||
cp = car.CarParams.new_message()
|
||||
cp.safetyModel = car.CarParams.SafetyModel.allOutput
|
||||
|
||||
safety_config = car.CarParams.SafetyConfig.new_message()
|
||||
safety_config.safetyModel = car.CarParams.SafetyModel.allOutput
|
||||
cp.safetyConfigs = [safety_config]
|
||||
|
||||
Params().put("CarVin", b"0"*17)
|
||||
Params().put_bool("ControlsReady", True)
|
||||
Params().put("CarParams", cp.to_bytes())
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
# functions common among cars
|
||||
from cereal import car
|
||||
from common.numpy_fast import clip
|
||||
|
||||
# kg of standard extra cargo to count for drive, gas, etc...
|
||||
|
@ -121,3 +122,11 @@ def create_gas_command(packer, gas_amount, idx):
|
|||
|
||||
def make_can_msg(addr, dat, bus):
|
||||
return [addr, 0, dat, bus]
|
||||
|
||||
|
||||
def get_safety_config(safety_model, safety_param = None):
|
||||
ret = car.CarParams.SafetyConfig.new_message()
|
||||
ret.safetyModel = safety_model
|
||||
if safety_param is not None:
|
||||
ret.safetyParam = safety_param
|
||||
return ret
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env python3
|
||||
from cereal import car
|
||||
from selfdrive.car.chrysler.values import CAR
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
|
||||
|
@ -10,7 +10,7 @@ class CarInterface(CarInterfaceBase):
|
|||
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
|
||||
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
|
||||
ret.carName = "chrysler"
|
||||
ret.safetyModel = car.CarParams.SafetyModel.chrysler
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.chrysler)]
|
||||
|
||||
# Speed conversion: 20, 45 mph
|
||||
ret.wheelbase = 3.089 # in meters for Pacifica Hybrid 2017
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
from cereal import car
|
||||
from selfdrive.config import Conversions as CV
|
||||
from selfdrive.car.ford.values import MAX_ANGLE
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
|
||||
|
@ -11,7 +11,7 @@ class CarInterface(CarInterfaceBase):
|
|||
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
|
||||
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
|
||||
ret.carName = "ford"
|
||||
ret.safetyModel = car.CarParams.SafetyModel.ford
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.ford)]
|
||||
ret.dashcamOnly = True
|
||||
|
||||
ret.wheelbase = 2.85
|
||||
|
|
|
@ -3,7 +3,7 @@ from cereal import car
|
|||
from selfdrive.config import Conversions as CV
|
||||
from selfdrive.car.gm.values import CAR, CruiseButtons, \
|
||||
AccState, CarControllerParams
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
ButtonType = car.CarState.ButtonEvent.Type
|
||||
|
@ -19,7 +19,7 @@ class CarInterface(CarInterfaceBase):
|
|||
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
|
||||
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
|
||||
ret.carName = "gm"
|
||||
ret.safetyModel = car.CarParams.SafetyModel.gm
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.gm)]
|
||||
ret.pcmCruise = False # stock cruise control is kept off
|
||||
|
||||
# Presence of a camera on the object bus is ok.
|
||||
|
|
|
@ -4,7 +4,7 @@ from panda import Panda
|
|||
from common.numpy_fast import interp
|
||||
from common.params import Params
|
||||
from selfdrive.car.honda.values import CarControllerParams, CruiseButtons, CAR, HONDA_BOSCH, HONDA_BOSCH_ALT_BRAKE_SIGNAL
|
||||
from selfdrive.car import STD_CARGO_KG, CivicParams, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, CivicParams, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
from selfdrive.car.disable_ecu import disable_ecu
|
||||
from selfdrive.config import Conversions as CV
|
||||
|
@ -33,7 +33,7 @@ class CarInterface(CarInterfaceBase):
|
|||
ret.carName = "honda"
|
||||
|
||||
if candidate in HONDA_BOSCH:
|
||||
ret.safetyModel = car.CarParams.SafetyModel.hondaBoschHarness
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hondaBoschHarness)]
|
||||
ret.radarOffCan = True
|
||||
|
||||
# Disable the radar and let openpilot control longitudinal
|
||||
|
@ -42,7 +42,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
ret.pcmCruise = not ret.openpilotLongitudinalControl
|
||||
else:
|
||||
ret.safetyModel = car.CarParams.SafetyModel.hondaNidec
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hondaNidec)]
|
||||
ret.enableGasInterceptor = 0x201 in fingerprint[0]
|
||||
ret.openpilotLongitudinalControl = True
|
||||
|
||||
|
@ -287,10 +287,10 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
# These cars use alternate user brake msg (0x1BE)
|
||||
if candidate in HONDA_BOSCH_ALT_BRAKE_SIGNAL:
|
||||
ret.safetyParam |= Panda.FLAG_HONDA_ALT_BRAKE
|
||||
ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_ALT_BRAKE
|
||||
|
||||
if ret.openpilotLongitudinalControl and candidate in HONDA_BOSCH:
|
||||
ret.safetyParam |= Panda.FLAG_HONDA_BOSCH_LONG
|
||||
ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_BOSCH_LONG
|
||||
|
||||
# min speed to enable ACC. if car can do stop and go, then set enabling speed
|
||||
# to a negative value, so it won't matter. Otherwise, add 0.5 mph margin to not
|
||||
|
|
|
@ -5,7 +5,7 @@ from common.params import Params
|
|||
from selfdrive.config import Conversions as CV
|
||||
from selfdrive.car.hyundai.values import CAR, EV_CAR, HYBRID_CAR, Buttons, CarControllerParams
|
||||
from selfdrive.car.hyundai.radar_interface import RADAR_START_ADDR
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
from selfdrive.car.disable_ecu import disable_ecu
|
||||
|
||||
|
@ -22,11 +22,10 @@ class CarInterface(CarInterfaceBase):
|
|||
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
|
||||
|
||||
ret.carName = "hyundai"
|
||||
ret.safetyModel = car.CarParams.SafetyModel.hyundai
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hyundai, 0)]
|
||||
ret.radarOffCan = RADAR_START_ADDR not in fingerprint[1]
|
||||
|
||||
ret.openpilotLongitudinalControl = Params().get_bool("DisableRadar") and candidate in [CAR.SONATA, CAR.SONATA_HYBRID, CAR.PALISADE, CAR.SANTA_FE]
|
||||
ret.safetyParam = 0
|
||||
|
||||
ret.pcmCruise = not ret.openpilotLongitudinalControl
|
||||
|
||||
|
@ -250,13 +249,13 @@ class CarInterface(CarInterfaceBase):
|
|||
if candidate in [CAR.HYUNDAI_GENESIS, CAR.IONIQ_EV_2020, CAR.IONIQ_EV_LTD, CAR.IONIQ_PHEV, CAR.IONIQ, CAR.KONA_EV, CAR.KIA_SORENTO,
|
||||
CAR.SONATA_LF, CAR.KIA_NIRO_EV, CAR.KIA_OPTIMA, CAR.VELOSTER, CAR.KIA_STINGER,
|
||||
CAR.GENESIS_G70, CAR.GENESIS_G80, CAR.KIA_CEED, CAR.ELANTRA]:
|
||||
ret.safetyModel = car.CarParams.SafetyModel.hyundaiLegacy
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hyundaiLegacy)]
|
||||
|
||||
# set appropriate safety param for gas signal
|
||||
if candidate in HYBRID_CAR:
|
||||
ret.safetyParam = 2
|
||||
ret.safetyConfigs[0].safetyParam = 2
|
||||
elif candidate in EV_CAR:
|
||||
ret.safetyParam = 1
|
||||
ret.safetyConfigs[0].safetyParam = 1
|
||||
|
||||
ret.centerToFront = ret.wheelbase * 0.4
|
||||
|
||||
|
@ -272,7 +271,7 @@ class CarInterface(CarInterfaceBase):
|
|||
ret.enableBsm = 0x58b in fingerprint[0]
|
||||
|
||||
if ret.openpilotLongitudinalControl:
|
||||
ret.safetyParam |= Panda.FLAG_HYUNDAI_LONG
|
||||
ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HYUNDAI_LONG
|
||||
|
||||
return ret
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
from cereal import car
|
||||
from selfdrive.config import Conversions as CV
|
||||
from selfdrive.car.mazda.values import CAR, LKAS_LIMITS
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
ButtonType = car.CarState.ButtonEvent.Type
|
||||
|
@ -19,7 +19,7 @@ class CarInterface(CarInterfaceBase):
|
|||
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
|
||||
|
||||
ret.carName = "mazda"
|
||||
ret.safetyModel = car.CarParams.SafetyModel.mazda
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.mazda)]
|
||||
ret.radarOffCan = True
|
||||
|
||||
ret.dashcamOnly = True
|
||||
|
|
|
@ -4,7 +4,7 @@ from cereal import car
|
|||
from selfdrive.config import Conversions as CV
|
||||
from selfdrive.swaglog import cloudlog
|
||||
import cereal.messaging as messaging
|
||||
from selfdrive.car import gen_empty_fingerprint
|
||||
from selfdrive.car import gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
# mocked car interface to work with chffrplus
|
||||
|
@ -37,7 +37,7 @@ class CarInterface(CarInterfaceBase):
|
|||
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
|
||||
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
|
||||
ret.carName = "mock"
|
||||
ret.safetyModel = car.CarParams.SafetyModel.noOutput
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.noOutput)]
|
||||
ret.mass = 1700.
|
||||
ret.rotationalInertia = 2500.
|
||||
ret.wheelbase = 2.70
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env python3
|
||||
from cereal import car
|
||||
from selfdrive.car.nissan.values import CAR
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
class CarInterface(CarInterfaceBase):
|
||||
|
@ -14,7 +14,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
|
||||
ret.carName = "nissan"
|
||||
ret.safetyModel = car.CarParams.SafetyModel.nissan
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.nissan)]
|
||||
|
||||
ret.steerLimitAlert = False
|
||||
ret.steerRateCost = 0.5
|
||||
|
@ -33,7 +33,7 @@ class CarInterface(CarInterfaceBase):
|
|||
ret.steerRatio = 17
|
||||
elif candidate == CAR.ALTIMA:
|
||||
# Altima has EPS on C-CAN unlike the others that have it on V-CAN
|
||||
ret.safetyParam = 1 # EPS is on alternate bus
|
||||
ret.safetyConfigs[0].safetyParam = 1 # EPS is on alternate bus
|
||||
ret.mass = 1492 + STD_CARGO_KG
|
||||
ret.wheelbase = 2.824
|
||||
ret.centerToFront = ret.wheelbase * 0.44
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env python3
|
||||
from cereal import car
|
||||
from selfdrive.car.subaru.values import CAR, PREGLOBAL_CARS
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
class CarInterface(CarInterfaceBase):
|
||||
|
@ -14,10 +14,10 @@ class CarInterface(CarInterfaceBase):
|
|||
ret.radarOffCan = True
|
||||
|
||||
if candidate in PREGLOBAL_CARS:
|
||||
ret.safetyModel = car.CarParams.SafetyModel.subaruLegacy
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.subaruLegacy)]
|
||||
ret.enableBsm = 0x25c in fingerprint[0]
|
||||
else:
|
||||
ret.safetyModel = car.CarParams.SafetyModel.subaru
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.subaru)]
|
||||
ret.enableBsm = 0x228 in fingerprint[0]
|
||||
|
||||
ret.dashcamOnly = candidate in PREGLOBAL_CARS
|
||||
|
@ -56,7 +56,7 @@ class CarInterface(CarInterfaceBase):
|
|||
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.01, 0.065, 0.2], [0.001, 0.015, 0.025]]
|
||||
|
||||
if candidate in [CAR.FORESTER_PREGLOBAL, CAR.OUTBACK_PREGLOBAL_2018]:
|
||||
ret.safetyParam = 1 # Outback 2018-2019 and Forester have reversed driver torque signal
|
||||
ret.safetyConfigs[0].safetyParam = 1 # Outback 2018-2019 and Forester have reversed driver torque signal
|
||||
ret.mass = 1568 + STD_CARGO_KG
|
||||
ret.wheelbase = 2.67
|
||||
ret.centerToFront = ret.wheelbase * 0.5
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env python3
|
||||
from cereal import car
|
||||
from selfdrive.car.tesla.values import CAR
|
||||
from selfdrive.car import STD_CARGO_KG, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness
|
||||
from selfdrive.car import STD_CARGO_KG, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
|
||||
|
@ -10,7 +10,7 @@ class CarInterface(CarInterfaceBase):
|
|||
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
|
||||
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
|
||||
ret.carName = "tesla"
|
||||
ret.safetyModel = car.CarParams.SafetyModel.tesla
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.tesla)]
|
||||
|
||||
# There is no safe way to do steer blending with user torque,
|
||||
# so the steering behaves like autopilot. This is not
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
from cereal import car
|
||||
from selfdrive.config import Conversions as CV
|
||||
from selfdrive.car.toyota.values import Ecu, CAR, TSS2_CAR, NO_DSU_CAR, MIN_ACC_SPEED, PEDAL_HYST_GAP, CarControllerParams
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
EventName = car.CarEvent.EventName
|
||||
|
@ -18,7 +18,7 @@ class CarInterface(CarInterfaceBase):
|
|||
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
|
||||
|
||||
ret.carName = "toyota"
|
||||
ret.safetyModel = car.CarParams.SafetyModel.toyota
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.toyota)]
|
||||
|
||||
ret.steerActuatorDelay = 0.12 # Default delay, Prius has larger delay
|
||||
ret.steerLimitTimer = 0.4
|
||||
|
@ -31,7 +31,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
if candidate == CAR.PRIUS:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 66 # see conversion factor for STEER_TORQUE_EPS in dbc file
|
||||
ret.safetyConfigs[0].safetyParam = 66 # see conversion factor for STEER_TORQUE_EPS in dbc file
|
||||
ret.wheelbase = 2.70
|
||||
ret.steerRatio = 15.74 # unknown end-to-end spec
|
||||
tire_stiffness_factor = 0.6371 # hand-tune
|
||||
|
@ -50,7 +50,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.RAV4, CAR.RAV4H]:
|
||||
stop_and_go = True if (candidate in CAR.RAV4H) else False
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.65
|
||||
ret.steerRatio = 16.88 # 14.5 is spec end-to-end
|
||||
tire_stiffness_factor = 0.5533
|
||||
|
@ -69,7 +69,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.COROLLA:
|
||||
stop_and_go = False
|
||||
ret.safetyParam = 88
|
||||
ret.safetyConfigs[0].safetyParam = 88
|
||||
ret.wheelbase = 2.70
|
||||
ret.steerRatio = 18.27
|
||||
tire_stiffness_factor = 0.444 # not optimized yet
|
||||
|
@ -79,7 +79,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.LEXUS_RX:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.79
|
||||
ret.steerRatio = 14.8
|
||||
tire_stiffness_factor = 0.5533
|
||||
|
@ -89,7 +89,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.LEXUS_RXH:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.79
|
||||
ret.steerRatio = 16. # 14.8 is spec end-to-end
|
||||
tire_stiffness_factor = 0.444 # not optimized yet
|
||||
|
@ -99,7 +99,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.LEXUS_RX_TSS2:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.79
|
||||
ret.steerRatio = 14.8
|
||||
tire_stiffness_factor = 0.5533 # not optimized yet
|
||||
|
@ -109,7 +109,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.LEXUS_RXH_TSS2:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.79
|
||||
ret.steerRatio = 16.0 # 14.8 is spec end-to-end
|
||||
tire_stiffness_factor = 0.444 # not optimized yet
|
||||
|
@ -119,7 +119,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.CHR, CAR.CHRH]:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.63906
|
||||
ret.steerRatio = 13.6
|
||||
tire_stiffness_factor = 0.7933
|
||||
|
@ -129,7 +129,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.CAMRY, CAR.CAMRYH, CAR.CAMRY_TSS2, CAR.CAMRYH_TSS2]:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.82448
|
||||
ret.steerRatio = 13.7
|
||||
tire_stiffness_factor = 0.7933
|
||||
|
@ -139,7 +139,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.HIGHLANDER_TSS2, CAR.HIGHLANDERH_TSS2]:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.84988 # 112.2 in = 2.84988 m
|
||||
ret.steerRatio = 16.0
|
||||
tire_stiffness_factor = 0.8
|
||||
|
@ -149,7 +149,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.HIGHLANDER, CAR.HIGHLANDERH]:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.78
|
||||
ret.steerRatio = 16.0
|
||||
tire_stiffness_factor = 0.8
|
||||
|
@ -159,7 +159,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.AVALON, CAR.AVALON_2019, CAR.AVALONH_2019]:
|
||||
stop_and_go = False
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.82
|
||||
ret.steerRatio = 14.8 # Found at https://pressroom.toyota.com/releases/2016+avalon+product+specs.download
|
||||
tire_stiffness_factor = 0.7983
|
||||
|
@ -169,7 +169,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.RAV4_TSS2, CAR.RAV4H_TSS2]:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.68986
|
||||
ret.steerRatio = 14.3
|
||||
tire_stiffness_factor = 0.7933
|
||||
|
@ -187,7 +187,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2]:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.67 # Average between 2.70 for sedan and 2.64 for hatchback
|
||||
ret.steerRatio = 13.9
|
||||
tire_stiffness_factor = 0.444 # not optimized yet
|
||||
|
@ -197,7 +197,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.LEXUS_ES_TSS2, CAR.LEXUS_ESH_TSS2]:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.8702
|
||||
ret.steerRatio = 16.0 # not optimized
|
||||
tire_stiffness_factor = 0.444 # not optimized yet
|
||||
|
@ -207,7 +207,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.LEXUS_ESH:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.8190
|
||||
ret.steerRatio = 16.06
|
||||
tire_stiffness_factor = 0.444 # not optimized yet
|
||||
|
@ -217,7 +217,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.SIENNA:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 3.03
|
||||
ret.steerRatio = 15.5
|
||||
tire_stiffness_factor = 0.444
|
||||
|
@ -227,7 +227,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.LEXUS_IS:
|
||||
stop_and_go = False
|
||||
ret.safetyParam = 77
|
||||
ret.safetyConfigs[0].safetyParam = 77
|
||||
ret.wheelbase = 2.79908
|
||||
ret.steerRatio = 13.3
|
||||
tire_stiffness_factor = 0.444
|
||||
|
@ -237,7 +237,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.LEXUS_CTH:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 100
|
||||
ret.safetyConfigs[0].safetyParam = 100
|
||||
ret.wheelbase = 2.60
|
||||
ret.steerRatio = 18.6
|
||||
tire_stiffness_factor = 0.517
|
||||
|
@ -247,7 +247,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate in [CAR.LEXUS_NXH, CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2]:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.66
|
||||
ret.steerRatio = 14.7
|
||||
tire_stiffness_factor = 0.444 # not optimized yet
|
||||
|
@ -257,7 +257,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.PRIUS_TSS2:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.70002 # from toyota online sepc.
|
||||
ret.steerRatio = 13.4 # True steerRation from older prius
|
||||
tire_stiffness_factor = 0.6371 # hand-tune
|
||||
|
@ -267,7 +267,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.MIRAI:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 2.91
|
||||
ret.steerRatio = 14.8
|
||||
tire_stiffness_factor = 0.8
|
||||
|
@ -277,7 +277,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
elif candidate == CAR.ALPHARD_TSS2:
|
||||
stop_and_go = True
|
||||
ret.safetyParam = 73
|
||||
ret.safetyConfigs[0].safetyParam = 73
|
||||
ret.wheelbase = 3.00
|
||||
ret.steerRatio = 14.2
|
||||
tire_stiffness_factor = 0.444
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from cereal import car
|
||||
from selfdrive.car.volkswagen.values import CAR, BUTTON_STATES, CANBUS, NetworkLocation, TransmissionType, GearShifter
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
|
||||
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
|
||||
from selfdrive.car.interfaces import CarInterfaceBase
|
||||
|
||||
EventName = car.CarEvent.EventName
|
||||
|
@ -28,7 +28,7 @@ class CarInterface(CarInterfaceBase):
|
|||
|
||||
if True: # pylint: disable=using-constant-test
|
||||
# Set global MQB parameters
|
||||
ret.safetyModel = car.CarParams.SafetyModel.volkswagen
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.volkswagen)]
|
||||
ret.enableBsm = 0x30F in fingerprint[0] # SWA_01
|
||||
|
||||
if 0xAD in fingerprint[0]: # Getriebe_11
|
||||
|
|
|
@ -49,6 +49,7 @@ LaneChangeState = log.LateralPlan.LaneChangeState
|
|||
LaneChangeDirection = log.LateralPlan.LaneChangeDirection
|
||||
EventName = car.CarEvent.EventName
|
||||
ButtonEvent = car.CarState.ButtonEvent
|
||||
SafetyModel = car.CarParams.SafetyModel
|
||||
|
||||
|
||||
class Controls:
|
||||
|
@ -72,7 +73,7 @@ class Controls:
|
|||
self.sm = sm
|
||||
if self.sm is None:
|
||||
ignore = ['driverCameraState', 'managerState'] if SIMULATION else None
|
||||
self.sm = messaging.SubMaster(['deviceState', 'pandaState', 'peripheralState', 'modelV2', 'liveCalibration',
|
||||
self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration',
|
||||
'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman',
|
||||
'managerState', 'liveParameters', 'radarState'] + self.camera_packets + joystick_packet,
|
||||
ignore_alive=ignore, ignore_avg_freq=['radarState', 'longitudinalPlan'])
|
||||
|
@ -110,7 +111,9 @@ class Controls:
|
|||
self.read_only = not car_recognized or not controller_available or \
|
||||
self.CP.dashcamOnly or community_feature_disallowed
|
||||
if self.read_only:
|
||||
self.CP.safetyModel = car.CarParams.SafetyModel.noOutput
|
||||
safety_config = car.CarParams.SafetyConfig.new_message()
|
||||
safety_config.safetyModel = car.CarParams.SafetyModel.noOutput
|
||||
self.CP.safetyConfigs = [safety_config]
|
||||
|
||||
# Write CarParams for radard
|
||||
cp_bytes = self.CP.to_bytes()
|
||||
|
@ -240,16 +243,21 @@ class Controls:
|
|||
if self.can_rcv_error or not CS.canValid:
|
||||
self.events.add(EventName.canError)
|
||||
|
||||
safety_mismatch = self.sm['pandaState'].safetyModel != self.CP.safetyModel or self.sm['pandaState'].safetyParam != self.CP.safetyParam
|
||||
if safety_mismatch or self.mismatch_counter >= 200:
|
||||
self.events.add(EventName.controlsMismatch)
|
||||
for i, pandaState in enumerate(self.sm['pandaStates']):
|
||||
# All pandas must match the list of safetyConfigs, and if outside this list, must be silent
|
||||
if i < len(self.CP.safetyConfigs):
|
||||
safety_mismatch = pandaState.safetyModel != self.CP.safetyConfigs[i].safetyModel or pandaState.safetyParam != self.CP.safetyConfigs[i].safetyParam
|
||||
else:
|
||||
safety_mismatch = pandaState.safetyModel != SafetyModel.silent
|
||||
if safety_mismatch or self.mismatch_counter >= 200:
|
||||
self.events.add(EventName.controlsMismatch)
|
||||
|
||||
if not self.sm['liveParameters'].valid:
|
||||
self.events.add(EventName.vehicleModelInvalid)
|
||||
|
||||
if len(self.sm['radarState'].radarErrors):
|
||||
self.events.add(EventName.radarFault)
|
||||
elif not self.sm.valid["pandaState"]:
|
||||
elif not self.sm.valid["pandaStates"]:
|
||||
self.events.add(EventName.usbError)
|
||||
elif not self.sm.all_alive_and_valid():
|
||||
self.events.add(EventName.commIssue)
|
||||
|
@ -270,8 +278,9 @@ class Controls:
|
|||
self.events.add(EventName.posenetInvalid)
|
||||
if not self.sm['liveLocationKalman'].deviceStable:
|
||||
self.events.add(EventName.deviceFalling)
|
||||
if log.PandaState.FaultType.relayMalfunction in self.sm['pandaState'].faults:
|
||||
self.events.add(EventName.relayMalfunction)
|
||||
for pandaState in self.sm['pandaStates']:
|
||||
if log.PandaState.FaultType.relayMalfunction in pandaState.faults:
|
||||
self.events.add(EventName.relayMalfunction)
|
||||
planner_fcw = self.sm['longitudinalPlan'].fcw and self.enabled
|
||||
model_fcw = self.sm['modelV2'].meta.hardBrakePredicted and not CS.brakePressed
|
||||
if planner_fcw or model_fcw:
|
||||
|
@ -355,8 +364,10 @@ class Controls:
|
|||
if not self.enabled:
|
||||
self.mismatch_counter = 0
|
||||
|
||||
if not self.sm['pandaState'].controlsAllowed and self.enabled:
|
||||
self.mismatch_counter += 1
|
||||
# All pandas not in silent mode must have controlsAllowed when openpilot is enabled
|
||||
for pandaState in self.sm['pandaStates']:
|
||||
if pandaState.safetyModel != SafetyModel.silent and not pandaState.controlsAllowed and self.enabled:
|
||||
self.mismatch_counter += 1
|
||||
|
||||
self.distance_traveled += CS.vEgo * DT_CTRL
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ class TestStartup(unittest.TestCase):
|
|||
|
||||
# TODO: this should be done without any real sockets
|
||||
controls_sock = messaging.sub_sock("controlsState")
|
||||
pm = messaging.PubMaster(['can', 'pandaState'])
|
||||
pm = messaging.PubMaster(['can', 'pandaStates'])
|
||||
|
||||
params = Params()
|
||||
params.clear_all()
|
||||
|
@ -98,9 +98,9 @@ class TestStartup(unittest.TestCase):
|
|||
|
||||
time.sleep(2) # wait for controlsd to be ready
|
||||
|
||||
msg = messaging.new_message('pandaState')
|
||||
msg.pandaState.pandaType = log.PandaState.PandaType.uno
|
||||
pm.send('pandaState', msg)
|
||||
msg = messaging.new_message('pandaStates', 1)
|
||||
msg.pandaStates[0].pandaType = log.PandaState.PandaType.uno
|
||||
pm.send('pandaStates', msg)
|
||||
|
||||
# fingerprint
|
||||
if (car_model is None) or (fw_versions is not None):
|
||||
|
|
|
@ -21,10 +21,10 @@ def cycle_alerts(duration=2000, is_metric=False):
|
|||
alerts = [EventName.preLaneChangeLeft, EventName.preLaneChangeRight]
|
||||
|
||||
CP = CarInterface.get_params("HONDA CIVIC 2016")
|
||||
sm = messaging.SubMaster(['deviceState', 'pandaState', 'roadCameraState', 'modelV2', 'liveCalibration',
|
||||
sm = messaging.SubMaster(['deviceState', 'pandaStates', 'roadCameraState', 'modelV2', 'liveCalibration',
|
||||
'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman'])
|
||||
|
||||
pm = messaging.PubMaster(['controlsState', 'pandaState', 'deviceState'])
|
||||
pm = messaging.PubMaster(['controlsState', 'pandaStates', 'deviceState'])
|
||||
|
||||
events = Events()
|
||||
AM = AlertManager()
|
||||
|
@ -61,10 +61,9 @@ def cycle_alerts(duration=2000, is_metric=False):
|
|||
dat.deviceState.started = True
|
||||
pm.send('deviceState', dat)
|
||||
|
||||
dat = messaging.new_message()
|
||||
dat.init('pandaState')
|
||||
dat.pandaState.ignitionLine = True
|
||||
pm.send('pandaState', dat)
|
||||
dat = messaging.new_message('pandaStates', 1)
|
||||
dat.pandaStates[0].ignitionLine = True
|
||||
pm.send('pandaStates', dat)
|
||||
|
||||
time.sleep(0.01)
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import cereal.messaging as messaging
|
|||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sm = messaging.SubMaster(['deviceState', 'pandaState', 'modelV2', 'liveCalibration', 'driverMonitoringState', 'longitudinalPlan', 'lateralPlan'])
|
||||
sm = messaging.SubMaster(['deviceState', 'pandaStates', 'modelV2', 'liveCalibration', 'driverMonitoringState', 'longitudinalPlan', 'lateralPlan'])
|
||||
|
||||
i = 0
|
||||
while True:
|
||||
|
|
|
@ -71,8 +71,8 @@ if __name__ == "__main__":
|
|||
dongles.append(dongle_id)
|
||||
|
||||
for msg in lr:
|
||||
if msg.which() == "pandaState":
|
||||
if msg.pandaState.pandaType not in ['uno', 'blackPanda', 'dos']:
|
||||
if msg.which() == "pandaStates":
|
||||
if msg.pandaStates[0].pandaType not in ['uno', 'blackPanda', 'dos']:
|
||||
break
|
||||
|
||||
elif msg.which() == "carParams":
|
||||
|
|
|
@ -4,19 +4,20 @@ import cereal.messaging as messaging
|
|||
from selfdrive.manager.process_config import managed_processes
|
||||
|
||||
if __name__ == "__main__":
|
||||
services = ['controlsState', 'deviceState', 'pandaState', 'carParams']
|
||||
procs = ['camerad', 'ui', 'modeld', 'calibrationd']
|
||||
|
||||
for p in procs:
|
||||
managed_processes[p].start()
|
||||
|
||||
pm = messaging.PubMaster(services)
|
||||
pm = messaging.PubMaster(['controlsState', 'deviceState', 'pandaStates', 'carParams'])
|
||||
|
||||
msgs = {s: messaging.new_message(s) for s in services}
|
||||
msgs = {s: messaging.new_message(s) for s in ['controlsState', 'deviceState', 'carParams']}
|
||||
msgs['deviceState'].deviceState.started = True
|
||||
msgs['pandaState'].pandaState.ignitionLine = True
|
||||
msgs['carParams'].carParams.openpilotLongitudinalControl = True
|
||||
|
||||
msgs['pandaStates'] = messaging.new_message('pandaStates', 1)
|
||||
msgs['pandaStates'].pandaStates[0].ignitionLine = True
|
||||
|
||||
try:
|
||||
while True:
|
||||
time.sleep(1 / 100) # continually send, rate doesn't matter
|
||||
|
|
|
@ -240,7 +240,7 @@ CONFIGS = [
|
|||
proc_name="controlsd",
|
||||
pub_sub={
|
||||
"can": ["controlsState", "carState", "carControl", "sendcan", "carEvents", "carParams"],
|
||||
"deviceState": [], "pandaState": [], "peripheralState": [], "liveCalibration": [], "driverMonitoringState": [], "longitudinalPlan": [], "lateralPlan": [], "liveLocationKalman": [], "liveParameters": [], "radarState": [],
|
||||
"deviceState": [], "pandaStates": [], "peripheralState": [], "liveCalibration": [], "driverMonitoringState": [], "longitudinalPlan": [], "lateralPlan": [], "liveLocationKalman": [], "liveParameters": [], "radarState": [],
|
||||
"modelV2": [], "driverCameraState": [], "roadCameraState": [], "ubloxRaw": [], "managerState": [],
|
||||
},
|
||||
ignore=["logMonoTime", "valid", "controlsState.startMonoTime", "controlsState.cumLagMs"],
|
||||
|
|
|
@ -1 +1 @@
|
|||
5ee94677282bcea512e0d929e55e71308f14d530
|
||||
22f78d143d7e17e9ac7d0be8e29d5d7b5477ecd3
|
|
@ -118,7 +118,7 @@ def regen_segment(lr, frs=None, outdir=FAKEDATA):
|
|||
],
|
||||
'pandad': [
|
||||
multiprocessing.Process(target=replay_service, args=('can', lr)),
|
||||
multiprocessing.Process(target=replay_service, args=('pandaState', lr)),
|
||||
multiprocessing.Process(target=replay_service, args=('pandaStates', lr)),
|
||||
],
|
||||
#'managerState': [
|
||||
# multiprocessing.Process(target=replay_service, args=('managerState', lr)),
|
||||
|
|
|
@ -15,6 +15,7 @@ original_segments = [
|
|||
("HYUNDAI", "02c45f73a2e5c6e9|2021-01-01--19-08-22--1"), # HYUNDAI.SONATA
|
||||
("TOYOTA", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.PRIUS (INDI)
|
||||
("TOYOTA2", "0982d79ebb0de295|2021-01-03--20-03-36--6"), # TOYOTA.RAV4 (LQR)
|
||||
("TOYOTA3", "f7d7e3538cda1a2a|2021-08-16--08-55-34--6"), # TOYOTA.COROLLA_TSS2
|
||||
("HONDA", "eb140f119469d9ab|2021-06-12--10-46-24--27"), # HONDA.CIVIC (NIDEC)
|
||||
("HONDA2", "7d2244f34d1bbcda|2021-06-25--12-25-37--26"), # HONDA.ACCORD (BOSCH)
|
||||
("CHRYSLER", "4deb27de11bee626|2021-02-20--11-28-55--8"), # CHRYSLER.PACIFICA
|
||||
|
@ -29,17 +30,17 @@ original_segments = [
|
|||
]
|
||||
|
||||
segments = [
|
||||
("HYUNDAI", "fakedata|2021-07-09--16-01-34--0"),
|
||||
("TOYOTA", "1d6dfff4b6098f01|2021-07-26--07-56-21--2"),
|
||||
("TOYOTA2", "fakedata|2021-07-09--16-03-56--0"),
|
||||
("TOYOTA3", "f7d7e3538cda1a2a|2021-08-16--08-55-34--6"), # TOYOTA.COROLLA_TSS2
|
||||
("HONDA", "fakedata|2021-07-09--16-05-07--0"),
|
||||
("HONDA2", "fakedata|2021-07-09--16-08-28--0"),
|
||||
("CHRYSLER", "fakedata|2021-07-09--16-09-39--0"),
|
||||
("SUBARU", "fakedata|2021-07-09--16-10-50--0"),
|
||||
("GM", "fakedata|2021-07-09--16-13-53--0"),
|
||||
("NISSAN", "fakedata|2021-07-09--16-17-35--0"),
|
||||
("VOLKSWAGEN", "fakedata|2021-07-09--16-29-13--0"),
|
||||
("HYUNDAI", "fakedata|2021-10-07--15-56-26--0"),
|
||||
("TOYOTA", "fakedata|2021-10-07--15-57-47--0"),
|
||||
("TOYOTA2", "fakedata|2021-10-07--15-59-03--0"),
|
||||
("TOYOTA3", "fakedata|2021-10-07--15-53-21--0"),
|
||||
("HONDA", "fakedata|2021-10-07--16-00-19--0"),
|
||||
("HONDA2", "fakedata|2021-10-07--16-01-35--0"),
|
||||
("CHRYSLER", "fakedata|2021-10-07--16-02-52--0"),
|
||||
("SUBARU", "fakedata|2021-10-07--16-04-09--0"),
|
||||
("GM", "fakedata|2021-10-07--16-05-26--0"),
|
||||
("NISSAN", "fakedata|2021-10-07--16-09-53--0"),
|
||||
("VOLKSWAGEN", "fakedata|2021-10-07--16-11-11--0"),
|
||||
]
|
||||
|
||||
# dashcamOnly makes don't need to be tested until a full port is done
|
||||
|
|
|
@ -94,8 +94,8 @@ class TestCarModel(unittest.TestCase):
|
|||
|
||||
# TODO: check safetyModel is in release panda build
|
||||
safety = libpandasafety_py.libpandasafety
|
||||
set_status = safety.set_safety_hooks(self.CP.safetyModel.raw, self.CP.safetyParam)
|
||||
self.assertEqual(0, set_status, f"failed to set safetyModel {self.CP.safetyModel}")
|
||||
set_status = safety.set_safety_hooks(self.CP.safetyConfigs[0].safetyModel.raw, self.CP.safetyConfigs[0].safetyParam)
|
||||
self.assertEqual(0, set_status, f"failed to set safetyModel {self.CP.safetyConfigs[0].safetyModel}")
|
||||
|
||||
def test_car_interface(self):
|
||||
# TODO: also check for checkusm and counter violations from can parser
|
||||
|
@ -130,7 +130,7 @@ class TestCarModel(unittest.TestCase):
|
|||
self.skipTest("no need to check panda safety for dashcamOnly")
|
||||
|
||||
safety = libpandasafety_py.libpandasafety
|
||||
set_status = safety.set_safety_hooks(self.CP.safetyModel.raw, self.CP.safetyParam)
|
||||
set_status = safety.set_safety_hooks(self.CP.safetyConfigs[0].safetyModel.raw, self.CP.safetyConfigs[0].safetyParam)
|
||||
self.assertEqual(0, set_status)
|
||||
|
||||
failed_addrs = Counter()
|
||||
|
@ -150,7 +150,7 @@ class TestCarModel(unittest.TestCase):
|
|||
self.skipTest("see comments in test_models.py")
|
||||
|
||||
safety = libpandasafety_py.libpandasafety
|
||||
set_status = safety.set_safety_hooks(self.CP.safetyModel.raw, self.CP.safetyParam)
|
||||
set_status = safety.set_safety_hooks(self.CP.safetyConfigs[0].safetyModel.raw, self.CP.safetyConfigs[0].safetyParam)
|
||||
self.assertEqual(0, set_status)
|
||||
|
||||
checks = defaultdict(lambda: 0)
|
||||
|
|
|
@ -65,7 +65,7 @@ if TICI:
|
|||
TIMINGS = {
|
||||
# rtols: max/min, rsd
|
||||
"can": [2.5, 0.35],
|
||||
"pandaState": [2.5, 0.35],
|
||||
"pandaStates": [2.5, 0.35],
|
||||
"peripheralState": [2.5, 0.35],
|
||||
"sendcan": [2.5, 0.35],
|
||||
"carState": [2.5, 0.35],
|
||||
|
|
|
@ -154,7 +154,7 @@ def thermald_thread():
|
|||
pm = messaging.PubMaster(['deviceState'])
|
||||
|
||||
pandaState_timeout = int(1000 * 2.5 * DT_TRML) # 2.5x the expected pandaState frequency
|
||||
pandaState_sock = messaging.sub_sock('pandaState', timeout=pandaState_timeout)
|
||||
pandaState_sock = messaging.sub_sock('pandaStates', timeout=pandaState_timeout)
|
||||
sm = messaging.SubMaster(["peripheralState", "gpsLocationExternal", "managerState"])
|
||||
|
||||
fan_speed = 0
|
||||
|
@ -203,15 +203,15 @@ def thermald_thread():
|
|||
params.put_bool("BootedOnroad", True)
|
||||
|
||||
while True:
|
||||
pandaState = messaging.recv_sock(pandaState_sock, wait=True)
|
||||
pandaStates = messaging.recv_sock(pandaState_sock, wait=True)
|
||||
|
||||
sm.update(0)
|
||||
peripheralState = sm['peripheralState']
|
||||
|
||||
msg = read_thermal(thermal_config)
|
||||
|
||||
if pandaState is not None:
|
||||
pandaState = pandaState.pandaState
|
||||
if pandaStates is not None and len(pandaStates.pandaStates) > 0:
|
||||
pandaState = pandaStates.pandaStates[0]
|
||||
|
||||
# If we lose connection to the panda, wait 5 seconds before going offroad
|
||||
if pandaState.pandaType == log.PandaState.PandaType.unknown:
|
||||
|
@ -446,7 +446,7 @@ def thermald_thread():
|
|||
|
||||
cloudlog.event("STATUS_PACKET",
|
||||
count=count,
|
||||
pandaState=(strip_deprecated_keys(pandaState.to_dict()) if pandaState else None),
|
||||
pandaStates=(strip_deprecated_keys(pandaStates.to_dict()) if pandaStates else None),
|
||||
peripheralState=strip_deprecated_keys(peripheralState.to_dict()),
|
||||
location=(strip_deprecated_keys(sm["gpsLocationExternal"].to_dict()) if sm.alive["gpsLocationExternal"] else None),
|
||||
deviceState=strip_deprecated_keys(msg.to_dict()))
|
||||
|
|
|
@ -134,14 +134,19 @@ static void update_state(UIState *s) {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (sm.updated("pandaState")) {
|
||||
auto pandaState = sm["pandaState"].getPandaState();
|
||||
scene.pandaType = pandaState.getPandaType();
|
||||
if (sm.updated("pandaStates")) {
|
||||
auto pandaStates = sm["pandaStates"].getPandaStates();
|
||||
if (pandaStates.size() > 0) {
|
||||
scene.pandaType = pandaStates[0].getPandaType();
|
||||
|
||||
if (scene.pandaType != cereal::PandaState::PandaType::UNKNOWN) {
|
||||
scene.ignition = pandaState.getIgnitionLine() || pandaState.getIgnitionCan();
|
||||
if (scene.pandaType != cereal::PandaState::PandaType::UNKNOWN) {
|
||||
scene.ignition = false;
|
||||
for (const auto& pandaState : pandaStates) {
|
||||
scene.ignition |= pandaState.getIgnitionLine() || pandaState.getIgnitionCan();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if ((s->sm->frame - s->sm->rcv_frame("pandaState")) > 5*UI_FREQ) {
|
||||
} else if ((s->sm->frame - s->sm->rcv_frame("pandaStates")) > 5*UI_FREQ) {
|
||||
scene.pandaType = cereal::PandaState::PandaType::UNKNOWN;
|
||||
}
|
||||
if (sm.updated("carParams")) {
|
||||
|
@ -220,7 +225,7 @@ static void update_status(UIState *s) {
|
|||
QUIState::QUIState(QObject *parent) : QObject(parent) {
|
||||
ui_state.sm = std::make_unique<SubMaster, const std::initializer_list<const char *>>({
|
||||
"modelV2", "controlsState", "liveCalibration", "deviceState", "roadCameraState",
|
||||
"pandaState", "carParams", "driverMonitoringState", "sensorEvents", "carState", "liveLocationKalman",
|
||||
"pandaStates", "carParams", "driverMonitoringState", "sensorEvents", "carState", "liveLocationKalman",
|
||||
});
|
||||
|
||||
ui_state.wide_camera = Hardware::TICI() ? Params().getBool("EnableWideCamera") : false;
|
||||
|
|
|
@ -84,17 +84,17 @@ def imu_callback(imu, vehicle_state):
|
|||
pm.send('sensorEvents', dat)
|
||||
|
||||
def panda_state_function(exit_event: threading.Event):
|
||||
pm = messaging.PubMaster(['pandaState'])
|
||||
pm = messaging.PubMaster(['pandaStates'])
|
||||
while not exit_event.is_set():
|
||||
dat = messaging.new_message('pandaState')
|
||||
dat = messaging.new_message('pandaStates', 1)
|
||||
dat.valid = True
|
||||
dat.pandaState = {
|
||||
dat.pandaStates[0] = {
|
||||
'ignitionLine': True,
|
||||
'pandaType': "blackPanda",
|
||||
'controlsAllowed': True,
|
||||
'safetyModel': 'hondaNidec'
|
||||
}
|
||||
pm.send('pandaState', dat)
|
||||
pm.send('pandaStates', dat)
|
||||
time.sleep(0.5)
|
||||
|
||||
def gps_callback(gps, vehicle_state):
|
||||
|
|
Loading…
Reference in a new issue