Fired the babysitter
Added toggles to disable driver monitoring, the "Door Open", "Seatbelt Unlatched", and "System Overheated" alerts and all logging.
This commit is contained in:
@@ -247,6 +247,7 @@ std::unordered_map<std::string, uint32_t> keys = {
|
|||||||
{"DisableOnroadUploads", PERSISTENT},
|
{"DisableOnroadUploads", PERSISTENT},
|
||||||
{"DriverCamera", PERSISTENT},
|
{"DriverCamera", PERSISTENT},
|
||||||
{"ExperimentalModeViaPress", PERSISTENT},
|
{"ExperimentalModeViaPress", PERSISTENT},
|
||||||
|
{"FireTheBabysitter", PERSISTENT},
|
||||||
{"FrogPilotTogglesUpdated", PERSISTENT},
|
{"FrogPilotTogglesUpdated", PERSISTENT},
|
||||||
{"GasRegenCmd", PERSISTENT},
|
{"GasRegenCmd", PERSISTENT},
|
||||||
{"GoatScream", PERSISTENT},
|
{"GoatScream", PERSISTENT},
|
||||||
@@ -255,6 +256,11 @@ std::unordered_map<std::string, uint32_t> keys = {
|
|||||||
{"LeadInfo", PERSISTENT},
|
{"LeadInfo", PERSISTENT},
|
||||||
{"LongitudinalTune", PERSISTENT},
|
{"LongitudinalTune", PERSISTENT},
|
||||||
{"ModelUI", PERSISTENT},
|
{"ModelUI", PERSISTENT},
|
||||||
|
{"MuteDM", PERSISTENT},
|
||||||
|
{"MuteDoor", PERSISTENT},
|
||||||
|
{"MuteOverheated", PERSISTENT},
|
||||||
|
{"MuteSeatbelt", PERSISTENT},
|
||||||
|
{"NoLogging", PERSISTENT},
|
||||||
{"OfflineMode", PERSISTENT},
|
{"OfflineMode", PERSISTENT},
|
||||||
{"PathEdgeWidth", PERSISTENT},
|
{"PathEdgeWidth", PERSISTENT},
|
||||||
{"PathWidth", PERSISTENT},
|
{"PathWidth", PERSISTENT},
|
||||||
|
|||||||
@@ -251,9 +251,9 @@ class CarInterfaceBase(ABC):
|
|||||||
enable_buttons=(ButtonType.accelCruise, ButtonType.decelCruise)):
|
enable_buttons=(ButtonType.accelCruise, ButtonType.decelCruise)):
|
||||||
events = Events()
|
events = Events()
|
||||||
|
|
||||||
if cs_out.doorOpen:
|
if cs_out.doorOpen and not self.mute_door:
|
||||||
events.add(EventName.doorOpen)
|
events.add(EventName.doorOpen)
|
||||||
if cs_out.seatbeltUnlatched:
|
if cs_out.seatbeltUnlatched and not self.mute_seatbelt:
|
||||||
events.add(EventName.seatbeltNotLatched)
|
events.add(EventName.seatbeltNotLatched)
|
||||||
if cs_out.gearShifter != GearShifter.drive and (extra_gears is None or
|
if cs_out.gearShifter != GearShifter.drive and (extra_gears is None or
|
||||||
cs_out.gearShifter not in extra_gears):
|
cs_out.gearShifter not in extra_gears):
|
||||||
@@ -324,6 +324,10 @@ class CarInterfaceBase(ABC):
|
|||||||
if hasattr(self.CC, 'update_frogpilot_variables'):
|
if hasattr(self.CC, 'update_frogpilot_variables'):
|
||||||
self.CC.update_frogpilot_variables(params)
|
self.CC.update_frogpilot_variables(params)
|
||||||
|
|
||||||
|
fire_the_babysitter = params.get_bool("FireTheBabysitter")
|
||||||
|
self.mute_door = fire_the_babysitter and params.get_bool("MuteDoor")
|
||||||
|
self.mute_seatbelt = fire_the_babysitter and params.get_bool("MuteSeatbelt")
|
||||||
|
|
||||||
class RadarInterfaceBase(ABC):
|
class RadarInterfaceBase(ABC):
|
||||||
def __init__(self, CP):
|
def __init__(self, CP):
|
||||||
self.rcp = None
|
self.rcp = None
|
||||||
|
|||||||
@@ -79,9 +79,15 @@ class Controls:
|
|||||||
self.params = Params()
|
self.params = Params()
|
||||||
self.params_memory = Params("/dev/shm/params")
|
self.params_memory = Params("/dev/shm/params")
|
||||||
|
|
||||||
|
fire_the_babysitter = self.params.get_bool("FireTheBabysitter")
|
||||||
|
mute_dm = fire_the_babysitter and self.params.get_bool("MuteDM")
|
||||||
|
|
||||||
ignore = self.sensor_packets + ['testJoystick']
|
ignore = self.sensor_packets + ['testJoystick']
|
||||||
if SIMULATION:
|
if SIMULATION:
|
||||||
ignore += ['driverCameraState', 'managerState']
|
ignore += ['driverCameraState', 'managerState']
|
||||||
|
if mute_dm:
|
||||||
|
ignore += ['driverMonitoringState']
|
||||||
|
self.params.put_bool("DmModelInitialized", True)
|
||||||
self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration',
|
self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration',
|
||||||
'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman',
|
'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman',
|
||||||
'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters',
|
'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters',
|
||||||
|
|||||||
BIN
selfdrive/frogpilot/assets/toggle_icons/icon_babysitter.png
Normal file
BIN
selfdrive/frogpilot/assets/toggle_icons/icon_babysitter.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
@@ -16,6 +16,13 @@ FrogPilotControlsPanel::FrogPilotControlsPanel(SettingsWindow *parent) : FrogPil
|
|||||||
{"DeviceShutdown", "Device Shutdown Timer", "Configure the timer for automatic device shutdown when offroad conserving energy and preventing battery drain.", "../frogpilot/assets/toggle_icons/icon_time.png"},
|
{"DeviceShutdown", "Device Shutdown Timer", "Configure the timer for automatic device shutdown when offroad conserving energy and preventing battery drain.", "../frogpilot/assets/toggle_icons/icon_time.png"},
|
||||||
{"ExperimentalModeViaPress", "Experimental Mode Via 'LKAS' Button / Screen", "Toggle Experimental Mode by double-clicking the 'Lane Departure'/'LKAS' button or double tapping screen.\n\nOverrides 'Conditional Experimental Mode'.", "../assets/img_experimental_white.svg"},
|
{"ExperimentalModeViaPress", "Experimental Mode Via 'LKAS' Button / Screen", "Toggle Experimental Mode by double-clicking the 'Lane Departure'/'LKAS' button or double tapping screen.\n\nOverrides 'Conditional Experimental Mode'.", "../assets/img_experimental_white.svg"},
|
||||||
|
|
||||||
|
{"FireTheBabysitter", "Fire the Babysitter", "Deactivate some of openpilot's 'Babysitter' protocols for more user autonomy.", "../frogpilot/assets/toggle_icons/icon_babysitter.png"},
|
||||||
|
{"NoLogging", "Disable All Logging", "Turn off all data tracking to enhance privacy or reduce thermal load.\n\nWARNING: This action will prevent drive recording and data cannot be recovered!", ""},
|
||||||
|
{"MuteDoor", "Mute Door Open Alert", "Disable alerts for open doors.", ""},
|
||||||
|
{"MuteDM", "Mute Driver Monitoring", "Disable driver monitoring.", ""},
|
||||||
|
{"MuteOverheated", "Mute Overheated System Alert", "Disable alerts for the device being overheated.", ""},
|
||||||
|
{"MuteSeatbelt", "Mute Seatbelt Unlatched Alert", "Disable alerts for unlatched seatbelts.", ""},
|
||||||
|
|
||||||
{"LateralTune", "Lateral Tuning", "Modify openpilot's steering behavior.", "../frogpilot/assets/toggle_icons/icon_lateral_tune.png"},
|
{"LateralTune", "Lateral Tuning", "Modify openpilot's steering behavior.", "../frogpilot/assets/toggle_icons/icon_lateral_tune.png"},
|
||||||
{"AverageCurvature", "Average Desired Curvature", "Use Pfeiferj's distance-based curvature adjustment for improved curve handling.", ""},
|
{"AverageCurvature", "Average Desired Curvature", "Use Pfeiferj's distance-based curvature adjustment for improved curve handling.", ""},
|
||||||
|
|
||||||
@@ -123,6 +130,16 @@ FrogPilotControlsPanel::FrogPilotControlsPanel(SettingsWindow *parent) : FrogPil
|
|||||||
}
|
}
|
||||||
toggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 33, shutdownLabels, this, false);
|
toggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 33, shutdownLabels, this, false);
|
||||||
|
|
||||||
|
} else if (param == "FireTheBabysitter") {
|
||||||
|
FrogPilotParamManageControl *fireTheBabysitterToggle = new FrogPilotParamManageControl(param, title, desc, icon, this);
|
||||||
|
QObject::connect(fireTheBabysitterToggle, &FrogPilotParamManageControl::manageButtonClicked, this, [this]() {
|
||||||
|
parentToggleClicked();
|
||||||
|
for (auto &[key, toggle] : toggles) {
|
||||||
|
toggle->setVisible(fireTheBabysitterKeys.find(key.c_str()) != fireTheBabysitterKeys.end());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
toggle = fireTheBabysitterToggle;
|
||||||
|
|
||||||
} else if (param == "LateralTune") {
|
} else if (param == "LateralTune") {
|
||||||
FrogPilotParamManageControl *lateralTuneToggle = new FrogPilotParamManageControl(param, title, desc, icon, this);
|
FrogPilotParamManageControl *lateralTuneToggle = new FrogPilotParamManageControl(param, title, desc, icon, this);
|
||||||
QObject::connect(lateralTuneToggle, &FrogPilotParamManageControl::manageButtonClicked, this, [this]() {
|
QObject::connect(lateralTuneToggle, &FrogPilotParamManageControl::manageButtonClicked, this, [this]() {
|
||||||
@@ -178,7 +195,7 @@ FrogPilotControlsPanel::FrogPilotControlsPanel(SettingsWindow *parent) : FrogPil
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<std::string> rebootKeys = {"AlwaysOnLateral"};
|
std::set<std::string> rebootKeys = {"AlwaysOnLateral", "FireTheBabysitter", "MuteDM"};
|
||||||
for (const std::string &key : rebootKeys) {
|
for (const std::string &key : rebootKeys) {
|
||||||
QObject::connect(toggles[key], &ToggleControl::toggleFlipped, [this]() {
|
QObject::connect(toggles[key], &ToggleControl::toggleFlipped, [this]() {
|
||||||
if (FrogPilotConfirmationDialog::toggle("Reboot required to take effect.", "Reboot Now", this)) {
|
if (FrogPilotConfirmationDialog::toggle("Reboot required to take effect.", "Reboot Now", this)) {
|
||||||
@@ -188,7 +205,7 @@ FrogPilotControlsPanel::FrogPilotControlsPanel(SettingsWindow *parent) : FrogPil
|
|||||||
}
|
}
|
||||||
|
|
||||||
conditionalExperimentalKeys = {"CECurves", "CECurvesLead", "CESlowerLead", "CENavigation", "CEStopLights", "CESignal"};
|
conditionalExperimentalKeys = {"CECurves", "CECurvesLead", "CESlowerLead", "CENavigation", "CEStopLights", "CESignal"};
|
||||||
fireTheBabysitterKeys = {};
|
fireTheBabysitterKeys = {"NoLogging", "MuteDM", "MuteDoor", "MuteOverheated", "MuteSeatbelt"};
|
||||||
laneChangeKeys = {};
|
laneChangeKeys = {};
|
||||||
lateralTuneKeys = {"AverageCurvature"};
|
lateralTuneKeys = {"AverageCurvature"};
|
||||||
longitudinalTuneKeys = {"AccelerationProfile", "AggressiveAcceleration"};
|
longitudinalTuneKeys = {"AccelerationProfile", "AggressiveAcceleration"};
|
||||||
|
|||||||
@@ -45,23 +45,30 @@ def only_offroad(started, params, CP: car.CarParams) -> bool:
|
|||||||
|
|
||||||
# FrogPilot functions
|
# FrogPilot functions
|
||||||
def allow_uploads(started, params, CP: car.CarParams) -> bool:
|
def allow_uploads(started, params, CP: car.CarParams) -> bool:
|
||||||
|
enable_logging = not (params.get_bool("FireTheBabysitter") and params.get_bool("NoLogging"))
|
||||||
wifi_connected = HARDWARE.get_network_type() == WIFI and not started
|
wifi_connected = HARDWARE.get_network_type() == WIFI and not started
|
||||||
return wifi_connected if params.get_bool("DisableOnroadUploads") else True
|
return wifi_connected if params.get_bool("DisableOnroadUploads") else enable_logging
|
||||||
|
|
||||||
|
def enable_dm(started, params, CP: car.CarParams) -> bool:
|
||||||
|
return (started or params.get_bool("IsDriverViewEnabled")) and not (params.get_bool("FireTheBabysitter") and params.get_bool("MuteDM"))
|
||||||
|
|
||||||
|
def enable_logging(started, params, CP: car.CarParams) -> bool:
|
||||||
|
return not (params.get_bool("FireTheBabysitter") and params.get_bool("NoLogging"))
|
||||||
|
|
||||||
procs = [
|
procs = [
|
||||||
DaemonProcess("manage_athenad", "selfdrive.athena.manage_athenad", "AthenadPid"),
|
DaemonProcess("manage_athenad", "selfdrive.athena.manage_athenad", "AthenadPid"),
|
||||||
|
|
||||||
NativeProcess("camerad", "system/camerad", ["./camerad"], driverview),
|
NativeProcess("camerad", "system/camerad", ["./camerad"], driverview),
|
||||||
NativeProcess("logcatd", "system/logcatd", ["./logcatd"], only_onroad),
|
NativeProcess("logcatd", "system/logcatd", ["./logcatd"], (enable_logging and only_onroad)),
|
||||||
NativeProcess("proclogd", "system/proclogd", ["./proclogd"], only_onroad),
|
NativeProcess("proclogd", "system/proclogd", ["./proclogd"], only_onroad),
|
||||||
PythonProcess("logmessaged", "system.logmessaged", always_run),
|
PythonProcess("logmessaged", "system.logmessaged", enable_logging),
|
||||||
PythonProcess("micd", "system.micd", iscar),
|
PythonProcess("micd", "system.micd", iscar),
|
||||||
PythonProcess("timezoned", "system.timezoned", always_run, enabled=not PC),
|
PythonProcess("timezoned", "system.timezoned", always_run, enabled=not PC),
|
||||||
|
|
||||||
PythonProcess("dmonitoringmodeld", "selfdrive.modeld.dmonitoringmodeld", driverview, enabled=(not PC or WEBCAM)),
|
PythonProcess("dmonitoringmodeld", "selfdrive.modeld.dmonitoringmodeld", enable_dm, enabled=(not PC or WEBCAM)),
|
||||||
NativeProcess("encoderd", "system/loggerd", ["./encoderd"], only_onroad),
|
NativeProcess("encoderd", "system/loggerd", ["./encoderd"], only_onroad),
|
||||||
NativeProcess("stream_encoderd", "system/loggerd", ["./encoderd", "--stream"], notcar),
|
NativeProcess("stream_encoderd", "system/loggerd", ["./encoderd", "--stream"], notcar),
|
||||||
NativeProcess("loggerd", "system/loggerd", ["./loggerd"], logging),
|
NativeProcess("loggerd", "system/loggerd", ["./loggerd"], (enable_logging and logging)),
|
||||||
NativeProcess("modeld", "selfdrive/modeld", ["./modeld"], only_onroad),
|
NativeProcess("modeld", "selfdrive/modeld", ["./modeld"], only_onroad),
|
||||||
NativeProcess("mapsd", "selfdrive/navd", ["./mapsd"], only_onroad),
|
NativeProcess("mapsd", "selfdrive/navd", ["./mapsd"], only_onroad),
|
||||||
PythonProcess("navmodeld", "selfdrive.modeld.navmodeld", only_onroad),
|
PythonProcess("navmodeld", "selfdrive.modeld.navmodeld", only_onroad),
|
||||||
@@ -74,7 +81,7 @@ procs = [
|
|||||||
PythonProcess("torqued", "selfdrive.locationd.torqued", only_onroad),
|
PythonProcess("torqued", "selfdrive.locationd.torqued", only_onroad),
|
||||||
PythonProcess("controlsd", "selfdrive.controls.controlsd", only_onroad),
|
PythonProcess("controlsd", "selfdrive.controls.controlsd", only_onroad),
|
||||||
PythonProcess("deleter", "system.loggerd.deleter", always_run),
|
PythonProcess("deleter", "system.loggerd.deleter", always_run),
|
||||||
PythonProcess("dmonitoringd", "selfdrive.monitoring.dmonitoringd", driverview, enabled=(not PC or WEBCAM)),
|
PythonProcess("dmonitoringd", "selfdrive.monitoring.dmonitoringd", enable_dm, enabled=(not PC or WEBCAM)),
|
||||||
PythonProcess("qcomgpsd", "system.qcomgpsd.qcomgpsd", qcomgps, enabled=TICI),
|
PythonProcess("qcomgpsd", "system.qcomgpsd.qcomgpsd", qcomgps, enabled=TICI),
|
||||||
PythonProcess("navd", "selfdrive.navd.navd", only_onroad),
|
PythonProcess("navd", "selfdrive.navd.navd", only_onroad),
|
||||||
PythonProcess("pandad", "selfdrive.boardd.pandad", always_run),
|
PythonProcess("pandad", "selfdrive.boardd.pandad", always_run),
|
||||||
@@ -84,7 +91,7 @@ procs = [
|
|||||||
PythonProcess("plannerd", "selfdrive.controls.plannerd", only_onroad),
|
PythonProcess("plannerd", "selfdrive.controls.plannerd", only_onroad),
|
||||||
PythonProcess("radard", "selfdrive.controls.radard", only_onroad),
|
PythonProcess("radard", "selfdrive.controls.radard", only_onroad),
|
||||||
PythonProcess("thermald", "selfdrive.thermald.thermald", always_run),
|
PythonProcess("thermald", "selfdrive.thermald.thermald", always_run),
|
||||||
PythonProcess("tombstoned", "selfdrive.tombstoned", always_run, enabled=not PC),
|
PythonProcess("tombstoned", "selfdrive.tombstoned", enable_logging, enabled=not PC),
|
||||||
PythonProcess("updated", "selfdrive.updated", only_offroad, enabled=not PC),
|
PythonProcess("updated", "selfdrive.updated", only_offroad, enabled=not PC),
|
||||||
PythonProcess("uploader", "system.loggerd.uploader", allow_uploads),
|
PythonProcess("uploader", "system.loggerd.uploader", allow_uploads),
|
||||||
PythonProcess("statsd", "selfdrive.statsd", always_run),
|
PythonProcess("statsd", "selfdrive.statsd", always_run),
|
||||||
|
|||||||
@@ -298,6 +298,10 @@ def thermald_thread(end_event, hw_queue) -> None:
|
|||||||
elif current_band.max_temp is not None and all_comp_temp > current_band.max_temp:
|
elif current_band.max_temp is not None and all_comp_temp > current_band.max_temp:
|
||||||
thermal_status = list(THERMAL_BANDS.keys())[band_idx + 1]
|
thermal_status = list(THERMAL_BANDS.keys())[band_idx + 1]
|
||||||
|
|
||||||
|
if params.get_bool("FireTheBabysitter"):
|
||||||
|
if params.get_bool("MuteOverheated"):
|
||||||
|
thermal_status = ThermalStatus.green
|
||||||
|
|
||||||
# **** starting logic ****
|
# **** starting logic ****
|
||||||
|
|
||||||
# Ensure date/time are valid
|
# Ensure date/time are valid
|
||||||
|
|||||||
@@ -974,7 +974,7 @@ void AnnotatedCameraWidget::paintGL() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DMoji
|
// DMoji
|
||||||
if (!hideBottomIcons && (sm.rcv_frame("driverStateV2") > s->scene.started_frame)) {
|
if (!hideBottomIcons && (sm.rcv_frame("driverStateV2") > s->scene.started_frame) && !muteDM) {
|
||||||
update_dmonitoring(s, sm["driverStateV2"].getDriverStateV2(), dm_fade_state, rightHandDM);
|
update_dmonitoring(s, sm["driverStateV2"].getDriverStateV2(), dm_fade_state, rightHandDM);
|
||||||
drawDriverState(painter, s);
|
drawDriverState(painter, s);
|
||||||
}
|
}
|
||||||
@@ -1058,6 +1058,7 @@ void AnnotatedCameraWidget::updateFrogPilotWidgets(QPainter &p) {
|
|||||||
laneWidthRight = scene.lane_width_right;
|
laneWidthRight = scene.lane_width_right;
|
||||||
leadInfo = scene.lead_info;
|
leadInfo = scene.lead_info;
|
||||||
mapOpen = scene.map_open;
|
mapOpen = scene.map_open;
|
||||||
|
muteDM = scene.mute_dm;
|
||||||
obstacleDistance = scene.obstacle_distance;
|
obstacleDistance = scene.obstacle_distance;
|
||||||
obstacleDistanceStock = scene.obstacle_distance_stock;
|
obstacleDistanceStock = scene.obstacle_distance_stock;
|
||||||
showDriverCamera = scene.show_driver_camera;
|
showDriverCamera = scene.show_driver_camera;
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ private:
|
|||||||
bool experimentalMode;
|
bool experimentalMode;
|
||||||
bool leadInfo;
|
bool leadInfo;
|
||||||
bool mapOpen;
|
bool mapOpen;
|
||||||
|
bool muteDM;
|
||||||
bool showDriverCamera;
|
bool showDriverCamera;
|
||||||
bool turnSignalLeft;
|
bool turnSignalLeft;
|
||||||
bool turnSignalRight;
|
bool turnSignalRight;
|
||||||
|
|||||||
@@ -306,6 +306,7 @@ void ui_update_params(UIState *s) {
|
|||||||
|
|
||||||
scene.driver_camera = params.getBool("DriverCamera");
|
scene.driver_camera = params.getBool("DriverCamera");
|
||||||
scene.experimental_mode_via_press = params.getBool("ExperimentalModeViaPress");
|
scene.experimental_mode_via_press = params.getBool("ExperimentalModeViaPress");
|
||||||
|
scene.mute_dm = params.getBool("FireTheBabysitter") && params.getBool("MuteDM");
|
||||||
scene.screen_brightness = params.getInt("ScreenBrightness");
|
scene.screen_brightness = params.getInt("ScreenBrightness");
|
||||||
scene.wheel_icon = params.getInt("WheelIcon");
|
scene.wheel_icon = params.getInt("WheelIcon");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ typedef struct UIScene {
|
|||||||
bool lead_info;
|
bool lead_info;
|
||||||
bool map_open;
|
bool map_open;
|
||||||
bool model_ui;
|
bool model_ui;
|
||||||
|
bool mute_dm;
|
||||||
bool show_driver_camera;
|
bool show_driver_camera;
|
||||||
bool show_fps;
|
bool show_fps;
|
||||||
bool turn_signal_left;
|
bool turn_signal_left;
|
||||||
|
|||||||
Reference in New Issue
Block a user