Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
[submodule "panda"]
path = panda
url = ../../commaai/panda.git
branch = body-v1-update
[submodule "opendbc"]
path = opendbc_repo
url = ../../commaai/opendbc.git
branch = body-v1-update
[submodule "msgq"]
path = msgq_repo
url = ../../commaai/msgq.git
Expand Down
2 changes: 1 addition & 1 deletion panda
34 changes: 32 additions & 2 deletions selfdrive/pandad/pandad.cc
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,29 @@ void fill_panda_can_state(cereal::PandaState::PandaCanState::Builder &cs, const
cs.setCanCoreResetCnt(can_health.can_core_reset_cnt);
}

static bool is_body_platform(const std::string &params_string) {
if (params_string.empty()) {
return false;
}

try {
AlignedBuffer aligned_buf;
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(params_string.data(), params_string.size()));
cereal::CarParams::Reader car_params = cmsg.getRoot<cereal::CarParams>();
return car_params.getBrand() == "body";
} catch (...) {
LOGE("Failed to parse CarParams while checking body init state");
}
return false;
}

static bool should_keep_body_ignition_high(Params &params, bool is_onroad) {
if (!is_onroad || !params.getBool("FirmwareQueryDone") || params.getBool("ControlsReady")) {
return false;
}
return is_body_platform(params.get("CarParams"));
}

std::optional<bool> send_panda_states(PubMaster *pm, Panda *panda, bool is_onroad, bool spoofing_started) {
// build msg
MessageBuilder msg;
Expand All @@ -187,6 +210,13 @@ std::optional<bool> send_panda_states(PubMaster *pm, Panda *panda, bool is_onroa
health.ignition_line_pkt = 1;
}

static Params params;
if (should_keep_body_ignition_high(params, is_onroad)) {
health.ignition_line_pkt = 1;
health.safety_mode_pkt = (uint8_t)(cereal::CarParams::SafetyModel::BODY);
panda->set_safety_model(cereal::CarParams::SafetyModel::BODY);
}

bool ignition_local = ((health.ignition_line_pkt != 0) || (health.ignition_can_pkt != 0));

// Make sure CAN buses are live: safety_setter_thread does not work if Panda CAN are silent and there is only one other CAN node
Expand Down Expand Up @@ -341,9 +371,9 @@ void process_peripheral_state(Panda *panda, PubMaster *pm, bool no_fan_control)
}

if (ir_pwr != prev_ir_pwr || sm.frame % 100 == 0) {
int16_t ir_panda = util::map_val(ir_pwr, 0, 100, 0, MAX_IR_PANDA_VAL);
int16_t ir_panda = util::map_val(ir_pwr, 0, 100, 0, MAX_IR_PANDA_VAL);
panda->set_ir_pwr(ir_panda);
Hardware::set_ir_power(ir_pwr);
Hardware::set_ir_power(ir_pwr);
prev_ir_pwr = ir_pwr;
}
}
Expand Down
Loading