diff --git a/cereal/custom.capnp b/cereal/custom.capnp index a8ba066a5..5f2a11dc1 100644 --- a/cereal/custom.capnp +++ b/cereal/custom.capnp @@ -265,6 +265,7 @@ struct StarPilotSelfdriveState @0xf416ec09499d9d19 { alertSize @3 :AlertSize; alertType @4 :Text; alertSound @5 :Car.CarControl.HUDControl.AudibleAlert; + vEgo @6 :Float32; enum AlertStatus { normal @0; diff --git a/cereal/libcereal.a b/cereal/libcereal.a index 6c682fe7c..3139a7c5e 100644 Binary files a/cereal/libcereal.a and b/cereal/libcereal.a differ diff --git a/selfdrive/selfdrived/selfdrived.py b/selfdrive/selfdrived/selfdrived.py index 6f5188e73..7fedd395a 100644 --- a/selfdrive/selfdrived/selfdrived.py +++ b/selfdrive/selfdrived/selfdrived.py @@ -926,6 +926,7 @@ class SelfdriveD: fpss.alertSize = self.starpilot_AM.current_alert.alert_size fpss.alertStatus = self.starpilot_AM.current_alert.alert_status fpss.alertType = self.starpilot_AM.current_alert.alert_type + fpss.vEgo = self.sm["carState"].vEgo fpss.alertSound, self.forcing_stop_chime_played = filter_forcing_stop_alert_sound( fpss.alertType, self.starpilot_AM.current_alert.audible_alert, diff --git a/selfdrive/ui/feedback/feedbackd.py b/selfdrive/ui/feedback/feedbackd.py index 0a1996506..628bedab3 100755 --- a/selfdrive/ui/feedback/feedbackd.py +++ b/selfdrive/ui/feedback/feedbackd.py @@ -2,50 +2,24 @@ import cereal.messaging as messaging from openpilot.common.params import Params from openpilot.common.swaglog import cloudlog -from cereal import car from openpilot.system.micd import SAMPLE_RATE, SAMPLE_BUFFER FEEDBACK_MAX_DURATION = 10.0 -ButtonType = car.CarState.ButtonEvent.Type +FEEDBACKD_SERVICES = ('rawAudioData', 'bookmarkButton', 'visionSpeedLimitBookmark') def main(): - params = Params() params_memory = Params(memory=True) pm = messaging.PubMaster(['userBookmark', 'audioFeedback']) - sm = messaging.SubMaster(['rawAudioData', 'bookmarkButton', 'visionSpeedLimitBookmark', 'carState']) + sm = messaging.SubMaster(list(FEEDBACKD_SERVICES)) should_record_audio = False block_num = 0 - waiting_for_release = False - early_stop_triggered = False last_wheel_bookmark_counter = params_memory.get_int("WheelButtonBookmarkCounter") while True: sm.update() bookmark_requests = 0 - # 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: - bookmark_requests += 1 # 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) @@ -53,11 +27,10 @@ def main(): 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 + if (block_num * SAMPLE_BUFFER / SAMPLE_RATE) >= FEEDBACK_MAX_DURATION: bookmark_requests += 1 # 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") + cloudlog.info("10-second recording completed - stopping audio feedback") pm.send('audioFeedback', msg) if sm.updated['bookmarkButton']: diff --git a/selfdrive/ui/soundd.py b/selfdrive/ui/soundd.py index a09e6816d..ddb64fa4d 100644 --- a/selfdrive/ui/soundd.py +++ b/selfdrive/ui/soundd.py @@ -5,7 +5,7 @@ import wave from pathlib import Path -from cereal import car, custom, log, messaging +from cereal import custom, log, messaging from openpilot.common.basedir import BASEDIR from openpilot.common.filter_simple import FirstOrderFilter from openpilot.common.params import Params @@ -41,6 +41,8 @@ StarPilotAudibleAlert = custom.StarPilotCarControl.HUDControl.AudibleAlert STARPILOT_CUSTOM_ALERT_OFFSET = 1000 STARPILOT_CUSTOM_ALERT_START = int(StarPilotAudibleAlert.angry) TURN_STEERING_LIMIT_ALERT_SUFFIX = "steersaturated" +# Keep carState out of this list; C4's onroad stack is near msgq's 15-reader limit. +SOUNDD_SERVICES = ('selfdriveState', 'soundPressure', 'starpilotSelfdriveState', 'starpilotPlan') def starpilot_alert_key(alert): @@ -301,9 +303,7 @@ class Soundd: # sounddevice must be imported after forking processes import sounddevice as sd - sm = messaging.SubMaster(['selfdriveState', 'soundPressure', 'carState']) - - sm = sm.extend(['starpilotSelfdriveState', 'starpilotPlan']) + sm = messaging.SubMaster(list(SOUNDD_SERVICES)) while True: stream = None @@ -330,7 +330,7 @@ class Soundd: self.get_audible_alert(sm) if self.current_alert != AudibleAlert.none: - v_ego = max(float(getattr(sm["carState"], "vEgo", 0.0)), 0.0) + v_ego = max(float(getattr(sm["starpilotSelfdriveState"], "vEgo", 0.0)), 0.0) if should_mute_turn_steering_limit_alert( self.current_alert_type, v_ego, diff --git a/selfdrive/ui/tests/test_feedbackd.py b/selfdrive/ui/tests/test_feedbackd.py index 6b7ec4486..76d38f4dc 100644 --- a/selfdrive/ui/tests/test_feedbackd.py +++ b/selfdrive/ui/tests/test_feedbackd.py @@ -3,6 +3,11 @@ import cereal.messaging as messaging from cereal import car from openpilot.common.params import Params from openpilot.system.manager.process_config import managed_processes +from openpilot.selfdrive.ui.feedback.feedbackd import FEEDBACKD_SERVICES + + +def test_feedbackd_does_not_consume_car_state_reader(): + assert "carState" not in FEEDBACKD_SERVICES @pytest.mark.skip("tmp disabled") diff --git a/selfdrive/ui/tests/test_soundd.py b/selfdrive/ui/tests/test_soundd.py index c146dce75..ae0b2db2b 100644 --- a/selfdrive/ui/tests/test_soundd.py +++ b/selfdrive/ui/tests/test_soundd.py @@ -3,6 +3,7 @@ from cereal import messaging from cereal.messaging import SubMaster, PubMaster from openpilot.selfdrive.ui.soundd import ( SELFDRIVE_STATE_TIMEOUT, + SOUNDD_SERVICES, check_selfdrive_timeout_alert, is_turn_steering_limit_alert, should_mute_turn_steering_limit_alert, @@ -14,6 +15,10 @@ AudibleAlert = log.SelfdriveState.AudibleAlert class TestSoundd: + def test_does_not_consume_car_state_reader(self): + assert "carState" not in SOUNDD_SERVICES + assert "starpilotSelfdriveState" in SOUNDD_SERVICES + def test_turn_steering_limit_alert_detection(self): assert is_turn_steering_limit_alert("steerSaturated/warning") assert is_turn_steering_limit_alert("goatSteerSaturated/warning")