diff --git a/openpilot/cereal/deprecated.capnp b/openpilot/cereal/deprecated.capnp index 37153e4d6..b119e7091 100644 --- a/openpilot/cereal/deprecated.capnp +++ b/openpilot/cereal/deprecated.capnp @@ -775,3 +775,13 @@ struct GpsTrajectory @0x8cfeb072f5301000 { x @0 :List(Float32); y @1 :List(Float32); } + +struct AudioFeedbackDEPRECATED @0xed47e3c075be372a { + audio @0 :AudioData; + blockNum @1 :UInt16; + + struct AudioData { + data @0 :Data; + sampleRate @1 :UInt32; + } +} diff --git a/openpilot/cereal/log.capnp b/openpilot/cereal/log.capnp index 2148e81d3..60e0bb901 100644 --- a/openpilot/cereal/log.capnp +++ b/openpilot/cereal/log.capnp @@ -131,9 +131,9 @@ struct OnroadEvent @0xc4fa6047f024e718 { aeb @92; userBookmark @95; excessiveActuation @96; - audioFeedback @97; soundsUnavailableDEPRECATED @47; + audioFeedbackDEPRECATED @97; } } @@ -2485,11 +2485,6 @@ struct AudioData { sampleRate @1 :UInt32; } -struct AudioFeedback { - audio @0 :AudioData; - blockNum @1 :UInt16; -} - struct Touch { sec @0 :Int64; usec @1 :Int64; @@ -2583,7 +2578,6 @@ struct Event { # driving feedback userBookmark @93 :UserBookmark; bookmarkButton @148 :UserBookmark; - audioFeedback @149 :AudioFeedback; lateralManeuverPlan @150 :LateralManeuverPlan; @@ -2633,6 +2627,7 @@ struct Event { # *********** legacy + deprecated *********** model @9 :Deprecated.ModelData; # TODO: rename modelV2 and mark this as deprecated + audioFeedbackDEPRECATED @149 :Deprecated.AudioFeedbackDEPRECATED; liveMpcDEPRECATED @36 :Deprecated.LiveMpcData; liveLongitudinalMpcDEPRECATED @37 :Deprecated.LiveLongitudinalMpcData; liveLocationKalmanDeprecatedDEPRECATED @51 :Deprecated.LiveLocationData; diff --git a/openpilot/cereal/services.py b/openpilot/cereal/services.py index db1731a98..42669688b 100755 --- a/openpilot/cereal/services.py +++ b/openpilot/cereal/services.py @@ -75,7 +75,6 @@ _services: dict[str, tuple] = { "soundPressure": (True, 10., 10), "rawAudioData": (False, 20.), "bookmarkButton": (True, 0., 1), - "audioFeedback": (True, 0., 1), "roadEncodeData": (False, 20., None, QueueSize.BIG), "driverEncodeData": (False, 20., None, QueueSize.BIG), "wideRoadEncodeData": (False, 20., None, QueueSize.BIG), diff --git a/openpilot/common/params_keys.h b/openpilot/common/params_keys.h index 6441fc91d..7ecac1c72 100644 --- a/openpilot/common/params_keys.h +++ b/openpilot/common/params_keys.h @@ -105,7 +105,6 @@ inline static std::unordered_map keys = { {"PandaHeartbeatLost", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, BOOL}}, {"PrimeType", {PERSISTENT, INT}}, {"RecordAudio", {PERSISTENT, BOOL}}, - {"RecordAudioFeedback", {PERSISTENT, BOOL, "0"}}, {"RecordFront", {PERSISTENT, BOOL}}, {"RecordFrontLock", {PERSISTENT, BOOL}}, // for the internal fleet {"SecOCKey", {PERSISTENT | DONT_LOG, STRING}}, diff --git a/openpilot/selfdrive/selfdrived/events.py b/openpilot/selfdrive/selfdrived/events.py index 367bc03d3..ee9191fd1 100755 --- a/openpilot/selfdrive/selfdrived/events.py +++ b/openpilot/selfdrive/selfdrived/events.py @@ -12,8 +12,6 @@ from openpilot.common.constants import CV from openpilot.common.git import get_short_branch from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.locationd.calibrationd import MIN_SPEED_FILTER -from openpilot.system.micd import SAMPLE_RATE, SAMPLE_BUFFER -from openpilot.selfdrive.ui.feedback.feedbackd import FEEDBACK_MAX_DURATION from openpilot.common.hardware import HARDWARE AlertSize = log.SelfdriveState.AlertSize @@ -272,14 +270,6 @@ def too_distracted_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM return NoEntryAlert("Pay Attention to Engage", priority=Priority.HIGH) -def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: - duration = FEEDBACK_MAX_DURATION - ((sm['audioFeedback'].blockNum + 1) * SAMPLE_BUFFER / SAMPLE_RATE) - return NormalPermanentAlert( - "Recording Audio Feedback", - f"{round(duration)} second{'s' if round(duration) != 1 else ''} remaining. Press again to save early.", - priority=Priority.LOW) - - # *** debug alerts *** def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: @@ -1032,10 +1022,6 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { EventName.userBookmark: { ET.PERMANENT: NormalPermanentAlert("Bookmark Saved", duration=1.5), }, - - EventName.audioFeedback: { - ET.PERMANENT: audio_feedback_alert, - }, } diff --git a/openpilot/selfdrive/selfdrived/selfdrived.py b/openpilot/selfdrive/selfdrived/selfdrived.py index d89c56492..9fed889be 100755 --- a/openpilot/selfdrive/selfdrived/selfdrived.py +++ b/openpilot/selfdrive/selfdrived/selfdrived.py @@ -86,7 +86,7 @@ class SelfdriveD: self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration', 'carOutput', 'driverMonitoringState', 'longitudinalPlan', 'livePose', 'liveDelay', 'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters', - 'controlsState', 'carControl', 'driverAssistance', 'alertDebug', 'userBookmark', 'audioFeedback', + 'controlsState', 'carControl', 'driverAssistance', 'alertDebug', 'userBookmark', 'lateralManeuverPlan'] + \ self.camera_packets + self.sensor_packets + self.gps_packets, ignore_alive=ignore, ignore_avg_freq=ignore, @@ -171,13 +171,10 @@ class SelfdriveD: self.events.add(EventName.selfdriveInitializing) return - # Check for user bookmark press (bookmark button or end of LKAS button feedback) + # Check for user bookmark press if self.sm.updated['userBookmark']: self.events.add(EventName.userBookmark) - if self.sm.updated['audioFeedback']: - self.events.add(EventName.audioFeedback) - # Don't add any more events while in dashcam mode if self.CP.passive: return diff --git a/openpilot/selfdrive/test/process_replay/process_replay.py b/openpilot/selfdrive/test/process_replay/process_replay.py index 2a90dfc29..5d2e5a22f 100755 --- a/openpilot/selfdrive/test/process_replay/process_replay.py +++ b/openpilot/selfdrive/test/process_replay/process_replay.py @@ -436,7 +436,7 @@ CONFIGS = [ "longitudinalPlan", "livePose", "liveDelay", "liveParameters", "radarState", "modelV2", "driverCameraState", "roadCameraState", "wideRoadCameraState", "managerState", "liveTorqueParameters", "accelerometer", "gyroscope", "carOutput", "gpsLocationExternal", "gpsLocation", "controlsState", - "carControl", "driverAssistance", "alertDebug", "audioFeedback", + "carControl", "driverAssistance", "alertDebug", ], subs=["selfdriveState", "onroadEvents"], ignore=["logMonoTime"], diff --git a/openpilot/selfdrive/test/test_onroad.py b/openpilot/selfdrive/test/test_onroad.py index 2fa7c75fb..2504afb7c 100755 --- a/openpilot/selfdrive/test/test_onroad.py +++ b/openpilot/selfdrive/test/test_onroad.py @@ -57,7 +57,6 @@ PROCS = { "openpilot.selfdrive.locationd.paramsd": 9.0, "openpilot.selfdrive.locationd.lagd": 11.0, "openpilot.selfdrive.ui.soundd": 3.0, - "openpilot.selfdrive.ui.feedback.feedbackd": 1.0, "openpilot.selfdrive.monitoring.dmonitoringd": 4.0, "openpilot.system.proclogd": 7.0, "openpilot.system.logmessaged": 1.0, diff --git a/openpilot/selfdrive/ui/feedback/feedbackd.py b/openpilot/selfdrive/ui/feedback/feedbackd.py deleted file mode 100755 index 57f6b881e..000000000 --- a/openpilot/selfdrive/ui/feedback/feedbackd.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python3 -import openpilot.cereal.messaging as messaging -from openpilot.common.params import Params -from openpilot.common.swaglog import cloudlog -from opendbc.car.structs import car -from openpilot.system.micd import SAMPLE_RATE, SAMPLE_BUFFER - -FEEDBACK_MAX_DURATION = 10.0 -ButtonType = car.CarState.ButtonEvent.Type - - -def main(): - params = Params() - pm = messaging.PubMaster(['userBookmark', 'audioFeedback']) - sm = messaging.SubMaster(['rawAudioData', 'bookmarkButton', 'carState']) - should_record_audio = False - block_num = 0 - waiting_for_release = False - early_stop_triggered = False - - while True: - sm.update() - should_send_bookmark = False - - # TODO: https://github.com/commaai/openpilot/issues/36015 - if False and sm.updated['carState'] and sm['carState'].canValid: - for be in sm['carState'].buttonEvents: - if be.type == ButtonType.lkas: - if be.pressed: - if not should_record_audio: - if params.get_bool("RecordAudioFeedback"): # Start recording on first press if toggle set - should_record_audio = True - block_num = 0 - waiting_for_release = False - early_stop_triggered = False - cloudlog.info("LKAS button pressed - starting 10-second audio feedback") - else: - should_send_bookmark = True # immediately send bookmark if toggle false - cloudlog.info("LKAS button pressed - bookmarking") - elif should_record_audio and not waiting_for_release: # Wait for release of second press to stop recording early - waiting_for_release = True - elif waiting_for_release: # Second press released - waiting_for_release = False - early_stop_triggered = True - cloudlog.info("LKAS button released - ending recording early") - - if should_record_audio and sm.updated['rawAudioData']: - raw_audio = sm['rawAudioData'] - msg = messaging.new_message('audioFeedback', valid=True) - msg.audioFeedback.audio.data = raw_audio.data - msg.audioFeedback.audio.sampleRate = raw_audio.sampleRate - msg.audioFeedback.blockNum = block_num - block_num += 1 - if (block_num * SAMPLE_BUFFER / SAMPLE_RATE) >= FEEDBACK_MAX_DURATION or early_stop_triggered: # Check for timeout or early stop - should_send_bookmark = True # send bookmark at end of audio segment - should_record_audio = False - early_stop_triggered = False - cloudlog.info("10-second recording completed or second button press - stopping audio feedback") - pm.send('audioFeedback', msg) - - if sm.updated['bookmarkButton']: - cloudlog.info("Bookmark button pressed!") - should_send_bookmark = True - - if should_send_bookmark: - msg = messaging.new_message('userBookmark', valid=True) - pm.send('userBookmark', msg) - - -if __name__ == '__main__': - main() diff --git a/openpilot/selfdrive/ui/layouts/main.py b/openpilot/selfdrive/ui/layouts/main.py index 277b6f140..9ce43b9e4 100644 --- a/openpilot/selfdrive/ui/layouts/main.py +++ b/openpilot/selfdrive/ui/layouts/main.py @@ -22,7 +22,7 @@ class MainLayout(Widget): def __init__(self): super().__init__() - self._pm = messaging.PubMaster(['bookmarkButton']) + self._pm = messaging.PubMaster(['bookmarkButton', 'userBookmark']) self._sidebar = Sidebar() self._current_mode = MainState.HOME @@ -111,9 +111,9 @@ class MainLayout(Widget): self.open_settings(PanelType.DEVICE) def _on_bookmark_clicked(self): - user_bookmark = messaging.new_message('bookmarkButton') - user_bookmark.valid = True - self._pm.send('bookmarkButton', user_bookmark) + for service in ('bookmarkButton', 'userBookmark'): + msg = messaging.new_message(service, valid=True) + self._pm.send(service, msg) def _on_onroad_clicked(self): self._sidebar.set_visible(not self._sidebar.is_visible) diff --git a/openpilot/selfdrive/ui/mici/layouts/main.py b/openpilot/selfdrive/ui/mici/layouts/main.py index e59225354..20925ab63 100644 --- a/openpilot/selfdrive/ui/mici/layouts/main.py +++ b/openpilot/selfdrive/ui/mici/layouts/main.py @@ -19,7 +19,7 @@ class MiciMainLayout(Scroller): def __init__(self): super().__init__(snap_items=True, spacing=0, pad=0, scroll_indicator=False, edge_shadows=False) - self._pm = messaging.PubMaster(['bookmarkButton']) + self._pm = messaging.PubMaster(['bookmarkButton', 'userBookmark']) self._prev_onroad = False self._prev_standstill = False @@ -140,9 +140,9 @@ class MiciMainLayout(Scroller): self._scroll_to(self._home_layout) def _on_bookmark_clicked(self): - user_bookmark = messaging.new_message('bookmarkButton') - user_bookmark.valid = True - self._pm.send('bookmarkButton', user_bookmark) + for service in ('bookmarkButton', 'userBookmark'): + msg = messaging.new_message(service, valid=True) + self._pm.send(service, msg) def _on_body_changed(self): self._car_onroad_layout.set_visible(not ui_state.is_body) diff --git a/openpilot/selfdrive/ui/tests/test_feedbackd.py b/openpilot/selfdrive/ui/tests/test_feedbackd.py deleted file mode 100644 index 71803c345..000000000 --- a/openpilot/selfdrive/ui/tests/test_feedbackd.py +++ /dev/null @@ -1,55 +0,0 @@ -import unittest -from openpilot.common.parameterized import parameterized -from openpilot.common.test import OpenpilotTestCase -import openpilot.cereal.messaging as messaging -from opendbc.car.structs import car -from openpilot.common.params import Params -from openpilot.system.manager.process_config import managed_processes - - -@unittest.skip("tmp disabled") -class TestFeedbackd(OpenpilotTestCase): - def setup_method(self): - self.pm = messaging.PubMaster(['carState', 'rawAudioData']) - self.sm = messaging.SubMaster(['audioFeedback']) - - def _send_lkas_button(self, pressed: bool): - msg = messaging.new_message('carState') - msg.carState.canValid = True - msg.carState.buttonEvents = [{'type': car.CarState.ButtonEvent.Type.lkas, 'pressed': pressed}] - self.pm.send('carState', msg) - - def _send_audio_data(self, count: int = 5): - for _ in range(count): - audio_msg = messaging.new_message('rawAudioData') - audio_msg.rawAudioData.data = bytes(1600) # 800 samples of int16 - audio_msg.rawAudioData.sampleRate = 16000 - self.pm.send('rawAudioData', audio_msg) - self.sm.update(timeout=100) - - @parameterized.expand([False, True]) - def test_audio_feedback(self, record_feedback): - Params().put_bool("RecordAudioFeedback", record_feedback, block=True) - - managed_processes["feedbackd"].start() - assert self.pm.wait_for_readers_to_update('carState', timeout=5) - assert self.pm.wait_for_readers_to_update('rawAudioData', timeout=5) - - self._send_lkas_button(pressed=True) - self._send_audio_data() - self._send_lkas_button(pressed=False) - self._send_audio_data() - - if record_feedback: - assert self.sm.updated['audioFeedback'], "audioFeedback should be published when enabled" - else: - assert not self.sm.updated['audioFeedback'], "audioFeedback should not be published when disabled" - - self._send_lkas_button(pressed=True) - self._send_audio_data() - self._send_lkas_button(pressed=False) - self._send_audio_data() - - assert not self.sm.updated['audioFeedback'], "audioFeedback should not be published after second press" - - managed_processes["feedbackd"].stop() diff --git a/openpilot/system/loggerd/loggerd.cc b/openpilot/system/loggerd/loggerd.cc index 375592961..9f848608a 100644 --- a/openpilot/system/loggerd/loggerd.cc +++ b/openpilot/system/loggerd/loggerd.cc @@ -246,7 +246,7 @@ void loggerd_thread() { .counter = 0, .freq = it.decimation, .encoder = encoder, - .preserve_segment = (it.name == "userBookmark") || (it.name == "audioFeedback"), + .preserve_segment = it.name == "userBookmark", .record_audio = record_audio, }; } diff --git a/openpilot/system/loggerd/tests/test_loggerd.py b/openpilot/system/loggerd/tests/test_loggerd.py index 6bb7e9bcf..618e3d001 100644 --- a/openpilot/system/loggerd/tests/test_loggerd.py +++ b/openpilot/system/loggerd/tests/test_loggerd.py @@ -308,7 +308,7 @@ class TestLoggerd(OpenpilotTestCase): assert getxattr(segment_dir, PRESERVE_ATTR_NAME) == PRESERVE_ATTR_VALUE def test_not_preserving_nonbookmarked_segments(self): - services = set(random.sample(CEREAL_SERVICES, random.randint(5, 10))) - {"userBookmark", "audioFeedback"} + services = set(random.sample(CEREAL_SERVICES, random.randint(5, 10))) - {"userBookmark"} self._publish_random_messages(services) segment_dir = self._get_latest_log_dir() diff --git a/openpilot/system/manager/process_config.py b/openpilot/system/manager/process_config.py index 655d1c4e2..e60598a7b 100644 --- a/openpilot/system/manager/process_config.py +++ b/openpilot/system/manager/process_config.py @@ -116,7 +116,6 @@ procs = [ PythonProcess("tombstoned", "openpilot.system.tombstoned", always_run, enabled=not PC), PythonProcess("updated", "openpilot.system.updated.updated", only_offroad, enabled=not PC), PythonProcess("uploader", "openpilot.system.loggerd.uploader", always_run), - PythonProcess("feedbackd", "openpilot.selfdrive.ui.feedback.feedbackd", only_onroad), # debug procs NativeProcess("bridge", "openpilot/cereal/messaging", ["./bridge"], notcar),