You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							71 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							71 lines
						
					
					
						
							2.8 KiB
						
					
					
				#!/usr/bin/env python3
 | 
						|
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
 | 
						|
 | 
						|
 | 
						|
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()
 | 
						|
 |