#!/usr/bin/env python3 from openpilot.selfdrive.selfdrived.events import ET, EVENT_NAME, FROGPILOT_EVENT_NAME, EventName, FrogPilotEventName, Events from openpilot.frogpilot.common.frogpilot_variables import NON_DRIVING_GEARS class FrogPilotEvents: def __init__(self, FrogPilotPlanner, error_log): self.frogpilot_planner = FrogPilotPlanner self.events = Events(frogpilot=True) self.startup_seen = False self.stopped_for_light = False self.max_acceleration = 0 self.tracked_lead_distance = 0 self.played_events = set() self.error_log = error_log def update(self, v_cruise, sm, frogpilot_toggles): current_alert = sm["selfdriveState"].alertType current_frogpilot_alert = sm["selfdriveState"].alertType alerts_empty = all(sm[state].alertText1 == "" and sm[state].alertText2 == "" for state in ["selfdriveState", "frogpilotSelfdriveState"]) self.events.clear() acceleration = sm["carState"].aEgo if not sm["carState"].gasPressed: self.max_acceleration = max(acceleration, self.max_acceleration) else: self.max_acceleration = 0 if self.frogpilot_planner.frogpilot_vcruise.forcing_stop: self.events.add(FrogPilotEventName.forcingStop) if not self.frogpilot_planner.tracking_lead and sm["carState"].standstill and sm["carState"].gearShifter not in NON_DRIVING_GEARS: if not self.frogpilot_planner.model_stopped and self.stopped_for_light and frogpilot_toggles.green_light_alert: self.events.add(FrogPilotEventName.greenLight) self.stopped_for_light = self.frogpilot_planner.frogpilot_cem.stop_light_detected else: self.stopped_for_light = False if "holidayActive" not in self.played_events and self.startup_seen and alerts_empty and len(self.events) == 0 and frogpilot_toggles.current_holiday_theme != "stock": self.events.add(FrogPilotEventName.holidayActive) if self.frogpilot_planner.tracking_lead and sm["carState"].standstill and sm["carState"].gearShifter not in NON_DRIVING_GEARS: if self.tracked_lead_distance == 0: self.tracked_lead_distance = self.frogpilot_planner.lead_one.dRel lead_departing = self.frogpilot_planner.lead_one.dRel - self.tracked_lead_distance >= 1 lead_departing &= self.frogpilot_planner.lead_one.vLead >= 1 if lead_departing and frogpilot_toggles.lead_departing_alert: self.events.add(FrogPilotEventName.leadDeparting) else: self.tracked_lead_distance = 0 if "nnffLoaded" not in self.played_events and self.startup_seen and alerts_empty and len(self.events) == 0 and self.frogpilot_planner.params.get("NNFFModelName") is not None and frogpilot_toggles.nnff: self.events.add(FrogPilotEventName.nnffLoaded) if self.error_log.is_file(): self.events.add(FrogPilotEventName.openpilotCrashed) self.startup_seen |= sm["frogpilotSelfdriveState"].alertText1 == frogpilot_toggles.startup_alert_top and sm["frogpilotSelfdriveState"].alertText2 == frogpilot_toggles.startup_alert_bottom self.played_events.update(FROGPILOT_EVENT_NAME[event] for event in self.events.names)