#!/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 ( )