@ -123,6 +123,8 @@ static void camera_init(CameraState *s, int camera_id, int camera_num, 
			
		
	
		
			
				
					  s - > max_gain  =  max_gain ;   
			
		
	
		
			
				
					  s - > fps  =  fps ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  s - > self_recover  =  0 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  zsock_t  * ops_sock  =  zsock_new_push ( " >inproc://cameraops " ) ;   
			
		
	
		
			
				
					  assert ( ops_sock ) ;   
			
		
	
		
			
				
					  s - > ops_sock  =  zsock_resolve ( ops_sock ) ;   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1745,8 +1747,13 @@ static void parse_autofocus(CameraState *s, uint8_t *d) { 
			
		
	
		
			
				
					      avg_focus  + =  s - > focus [ i ] ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					  // self recover override
   
			
		
	
		
			
				
					  if  ( s - > self_recover  >  1 )  {   
			
		
	
		
			
				
					    s - > focus_err  =  200  *  ( ( s - > self_recover  %  2  = =  0 )  ?  1 : - 1 ) ;  // far for even numbers, close for odd
   
			
		
	
		
			
				
					    s - > self_recover  - =  2 ;   
			
		
	
		
			
				
					    return ;   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  //printf("\n");
   
			
		
	
		
			
				
					  if  ( good_count  <  4 )  {   
			
		
	
		
			
				
					    s - > focus_err  =  nan ( " " ) ;   
			
		
	
		
			
				
					    return ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -1770,8 +1777,8 @@ static void do_autofocus(CameraState *s) { 
			
		
	
		
			
				
					  float  err  =  s - > focus_err ;   
			
		
	
		
			
				
					  float  sag  =  ( s - > last_sag_acc_z / 9.8 )  *  128 ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  const  int  dac_up  =  s - > device  = =  DEVICE_LP3 ?  634 : 456 ;   
			
		
	
		
			
				
					  const  int  dac_down  =  s - > device  = =  DEVICE_LP3 ?  366 : 224 ;   
			
		
	
		
			
				
					  const  int  dac_up  =  s - > device  = =  DEVICE_LP3 ?  LP3_AF_DAC_UP : OP3T_AF_DAC_UP ;   
			
		
	
		
			
				
					  const  int  dac_down  =  s - > device  = =  DEVICE_LP3 ?  LP3_AF_DAC_DOWN : OP3T_AF_DAC_DOWN ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  if  ( ! isnan ( err ) )   {   
			
		
	
		
			
				
					    // learn lens_true_pos
   
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1980,43 +1987,6 @@ static FrameMetadata get_frame_metadata(CameraState *s, uint32_t frame_id) { 
			
		
	
		
			
				
					  } ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  bool  acceleration_from_sensor_sock ( void  * sock ,  float  * vs )  {  
			
		
	
		
			
				
					  int  err ;   
			
		
	
		
			
				
					  bool  ret  =  false ;   
			
		
	
		
			
				
					  zmq_msg_t  msg ;   
			
		
	
		
			
				
					  err  =  zmq_msg_init ( & msg ) ;   
			
		
	
		
			
				
					  assert ( err  = =  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  err  =  zmq_msg_recv ( & msg ,  sock ,  0 ) ;   
			
		
	
		
			
				
					  assert ( err  > =  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  void  * data  =  zmq_msg_data ( & msg ) ;   
			
		
	
		
			
				
					  size_t  size  =  zmq_msg_size ( & msg ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  auto  amsg  =  kj : : heapArray < capnp : : word > ( size  /  sizeof ( capnp : : word )  +  1 ) ;   
			
		
	
		
			
				
					  memcpy ( amsg . begin ( ) ,  data ,  size ) ;   
			
		
	
		
			
				
					  capnp : : FlatArrayMessageReader  cmsg ( amsg ) ;   
			
		
	
		
			
				
					  auto  event  =  cmsg . getRoot < cereal : : Event > ( ) ;   
			
		
	
		
			
				
					  if  ( event . which ( )  = =  cereal : : Event : : SENSOR_EVENTS )  {   
			
		
	
		
			
				
					    auto  sensor_events  =  event . getSensorEvents ( ) ;   
			
		
	
		
			
				
					    for  ( auto  sensor_event  :  sensor_events )  {   
			
		
	
		
			
				
					      if  ( sensor_event . which ( )  = =  cereal : : SensorEventData : : ACCELERATION )  {   
			
		
	
		
			
				
					        auto  v  =  sensor_event . getAcceleration ( ) . getV ( ) ;   
			
		
	
		
			
				
					        if  ( v . size ( )  <  3 )  {   
			
		
	
		
			
				
					          continue ;   //wtf
   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        for  ( int  j  =  0 ;  j  <  3 ;  j + + )  {   
			
		
	
		
			
				
					          vs [ j ]  =  v [ j ] ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					        ret  =  true ;   
			
		
	
		
			
				
					        break ;   
			
		
	
		
			
				
					      }   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					  zmq_msg_close ( & msg ) ;   
			
		
	
		
			
				
					  return  ret ;   
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  ops_term ( )  {  
			
		
	
		
			
				
					  zsock_t  * ops_sock  =  zsock_new_push ( " >inproc://cameraops " ) ;   
			
		
	
		
			
				
					  assert ( ops_sock ) ;   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -2036,66 +2006,81 @@ static void* ops_thread(void* arg) { 
			
		
	
		
			
				
					  zsock_t  * cameraops  =  zsock_new_pull ( " @inproc://cameraops " ) ;   
			
		
	
		
			
				
					  assert ( cameraops ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  zsock_t  * sensor_sock  =  zsock_new_sub ( " >tcp://127.0.0.1:8003 " ,  " " ) ;   
			
		
	
		
			
				
					  assert ( sensor_sock ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  zsock_t  * terminate  =  zsock_new_sub ( " >inproc://terminate " ,  " " ) ;   
			
		
	
		
			
				
					  assert ( terminate ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  zpoller_t  * poller  =  zpoller_new ( cameraops ,  sensor_sock ,  terminate ,  NULL ) ;   
			
		
	
		
			
				
					  zpoller_t  * poller  =  zpoller_new ( cameraops ,  terminate ,  NULL ) ;   
			
		
	
		
			
				
					  assert ( poller ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  while  ( ! do_exit )  {   
			
		
	
		
			
				
					  SubMaster  sm ( { " sensorEvents " } ) ;  // msgq submaster
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  while  ( ! do_exit )  {   
			
		
	
		
			
				
					    // zmq handling
   
			
		
	
		
			
				
					    zsock_t  * which  =  ( zsock_t * ) zpoller_wait ( poller ,  - 1 ) ;   
			
		
	
		
			
				
					    if  ( which  = =  terminate  | |  which  = =  NULL )  {   
			
		
	
		
			
				
					    if  ( which  = =  terminate )  {   
			
		
	
		
			
				
					      break ;   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    void *  sockraw  =  zsock_resolve ( which ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    if  ( which  = =  cameraops )  {   
			
		
	
		
			
				
					      zmq_msg_t  msg ;   
			
		
	
		
			
				
					      err  =  zmq_msg_init ( & msg ) ;   
			
		
	
		
			
				
					      assert ( err  = =  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      err  =  zmq_msg_recv ( & msg ,  sockraw ,  0 ) ;   
			
		
	
		
			
				
					      assert ( err  > =  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      CameraMsg  cmsg ;   
			
		
	
		
			
				
					      if  ( zmq_msg_size ( & msg )  = =  sizeof ( cmsg ) )  {   
			
		
	
		
			
				
					        memcpy ( & cmsg ,  zmq_msg_data ( & msg ) ,  zmq_msg_size ( & msg ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        //LOGD("cameraops %d", cmsg.type);
   
			
		
	
		
			
				
					    }  else  if  ( which  ! =  NULL )  {   
			
		
	
		
			
				
					      void *  sockraw  =  zsock_resolve ( which ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      if  ( which  = =  cameraops )  {   
			
		
	
		
			
				
					        zmq_msg_t  msg ;   
			
		
	
		
			
				
					        err  =  zmq_msg_init ( & msg ) ;   
			
		
	
		
			
				
					        assert ( err  = =  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        err  =  zmq_msg_recv ( & msg ,  sockraw ,  0 ) ;   
			
		
	
		
			
				
					        assert ( err  > =  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        CameraMsg  cmsg ;   
			
		
	
		
			
				
					        if  ( zmq_msg_size ( & msg )  = =  sizeof ( cmsg ) )  {   
			
		
	
		
			
				
					          memcpy ( & cmsg ,  zmq_msg_data ( & msg ) ,  zmq_msg_size ( & msg ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					          //LOGD("cameraops %d", cmsg.type);
   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					          if  ( cmsg . type  = =  CAMERA_MSG_AUTOEXPOSE )  {   
			
		
	
		
			
				
					            if  ( cmsg . camera_num  = =  0 )  {   
			
		
	
		
			
				
					              do_autoexposure ( & s - > rear ,  cmsg . grey_frac ) ;   
			
		
	
		
			
				
					              do_autofocus ( & s - > rear ) ;   
			
		
	
		
			
				
					            }  else  {   
			
		
	
		
			
				
					              do_autoexposure ( & s - > front ,  cmsg . grey_frac ) ;   
			
		
	
		
			
				
					            }   
			
		
	
		
			
				
					          }  else  if  ( cmsg . type  = =  - 1 )  {   
			
		
	
		
			
				
					            break ;   
			
		
	
		
			
				
					          }   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( cmsg . type  = =  CAMERA_MSG_AUTOEXPOSE )  {   
			
		
	
		
			
				
					          if  ( cmsg . camera_num  = =  0 )  {   
			
		
	
		
			
				
					            do_autoexposure ( & s - > rear ,  cmsg . grey_frac ) ;   
			
		
	
		
			
				
					            do_autofocus ( & s - > rear ) ;   
			
		
	
		
			
				
					          }  else  {   
			
		
	
		
			
				
					            do_autoexposure ( & s - > front ,  cmsg . grey_frac ) ;   
			
		
	
		
			
				
					        zmq_msg_close ( & msg ) ;   
			
		
	
		
			
				
					      }   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					    // msgq handling
   
			
		
	
		
			
				
					    if  ( sm . update ( 0 )  >  0 )  {   
			
		
	
		
			
				
					      float  vals [ 3 ]  =  { 0.0 } ;   
			
		
	
		
			
				
					      bool  got_accel  =  false ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      auto  sensor_events  =  sm [ " sensorEvents " ] . getSensorEvents ( ) ;   
			
		
	
		
			
				
					      for  ( auto  sensor_event  :  sensor_events )  {   
			
		
	
		
			
				
					        if  ( sensor_event . which ( )  = =  cereal : : SensorEventData : : ACCELERATION )  {   
			
		
	
		
			
				
					          auto  v  =  sensor_event . getAcceleration ( ) . getV ( ) ;   
			
		
	
		
			
				
					          if  ( v . size ( )  <  3 )  {   
			
		
	
		
			
				
					            continue ;   //wtf
   
			
		
	
		
			
				
					          }   
			
		
	
		
			
				
					        }  else  if  ( cmsg . type  = =  - 1 )  {   
			
		
	
		
			
				
					          for  ( int  j  =  0 ;  j  <  3 ;  j + + )  {   
			
		
	
		
			
				
					            vals [ j ]  =  v [ j ] ;   
			
		
	
		
			
				
					          }   
			
		
	
		
			
				
					          got_accel  =  true ;   
			
		
	
		
			
				
					          break ;   
			
		
	
		
			
				
					        }   
			
		
	
		
			
				
					      }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      zmq_msg_close ( & msg ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    }  else  if  ( which  = =  sensor_sock )  {   
			
		
	
		
			
				
					      float  vs [ 3 ]  =  { 0.0 } ;   
			
		
	
		
			
				
					      bool  got_accel  =  acceleration_from_sensor_sock ( sockraw ,  vs ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      uint64_t  ts  =  nanos_since_boot ( ) ;   
			
		
	
		
			
				
					      if  ( got_accel  & &  ts  -  s - > rear . last_sag_ts  >  10000000 )  {  // 10 ms
   
			
		
	
		
			
				
					        s - > rear . last_sag_ts  =  ts ;   
			
		
	
		
			
				
					        s - > rear . last_sag_acc_z  =  - vs [ 2 ] ;   
			
		
	
		
			
				
					        s - > rear . last_sag_acc_z  =  - vals [ 2 ] ;   
			
		
	
		
			
				
					      }   
			
		
	
		
			
				
					    }   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  zpoller_destroy ( & poller ) ;   
			
		
	
		
			
				
					  zsock_destroy ( & cameraops ) ;   
			
		
	
		
			
				
					  zsock_destroy ( & sensor_sock ) ;   
			
		
	
		
			
				
					  zsock_destroy ( & terminate ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  return  NULL ;