diff --git a/panda/board/obj/gitversion.h b/panda/board/obj/gitversion.h index 3f1e55cae..5bfbc23d2 100644 --- a/panda/board/obj/gitversion.h +++ b/panda/board/obj/gitversion.h @@ -1,2 +1,2 @@ extern const uint8_t gitversion[19]; -const uint8_t gitversion[19] = "DEV-357d7e54-DEBUG"; +const uint8_t gitversion[19] = "DEV-5e0a1bbe-DEBUG"; diff --git a/panda/board/obj/version b/panda/board/obj/version index 9f84892ea..ab8e74529 100644 --- a/panda/board/obj/version +++ b/panda/board/obj/version @@ -1 +1 @@ -DEV-357d7e54-DEBUG \ No newline at end of file +DEV-5e0a1bbe-DEBUG \ No newline at end of file diff --git a/selfdrive/pandad/pandad b/selfdrive/pandad/pandad index ce99870b4..bcbe70be3 100755 Binary files a/selfdrive/pandad/pandad and b/selfdrive/pandad/pandad differ diff --git a/selfdrive/pandad/pandad.cc b/selfdrive/pandad/pandad.cc index 96f2587b1..bcb430747 100644 --- a/selfdrive/pandad/pandad.cc +++ b/selfdrive/pandad/pandad.cc @@ -45,6 +45,22 @@ ExitHandler do_exit; static uint64_t last_door_lock_command_time = 0; +static bool is_tesla_preap(Params ¶ms) { + const std::string car_params = params.get("CarParams"); + if (car_params.empty()) { + return false; + } + + try { + AlignedBuffer aligned_buf; + capnp::FlatArrayMessageReader cmsg(aligned_buf.align(car_params.data(), car_params.size())); + cereal::CarParams::Reader cp = cmsg.getRoot(); + return cp.getCarFingerprint() == "TESLA_MODEL_S_PREAP"; + } catch (...) { + return false; + } +} + bool check_all_connected(const std::vector &pandas) { for (const auto& panda : pandas) { if (!panda->connected()) { @@ -453,7 +469,7 @@ void pandad_run(std::vector &pandas) { Params params; RateKeeper rk("pandad", 100); - SubMaster sm({"selfdriveState"}); + SubMaster sm({"selfdriveState", "starpilotCarState"}); PubMaster pm({"can", "pandaStates", "peripheralState"}); PandaSafety panda_safety(pandas); Panda *peripheral_panda = pandas[0]; @@ -472,7 +488,11 @@ void pandad_run(std::vector &pandas) { // Process panda state at 10 Hz if (rk.frame() % 10 == 0) { sm.update(0); - engaged = sm.allAliveAndValid({"selfdriveState"}) && sm["selfdriveState"].getSelfdriveState().getEnabled(); + const bool preap_aol_engaged = is_tesla_preap(params) && + sm["starpilotCarState"].getStarpilotCarState().getAlwaysOnLateralEnabled(); + engaged = sm.allAliveAndValid({"selfdriveState", "starpilotCarState"}) && ( + sm["selfdriveState"].getSelfdriveState().getEnabled() || preap_aol_engaged + ); is_onroad = params.getBool("IsOnroad"); process_panda_state(pandas, &pm, engaged, is_onroad, spoofing_started); panda_safety.configureSafetyMode(is_onroad);