@ -123,6 +123,8 @@ static void camera_init(CameraState *s, int camera_id, int camera_num, 
			
		
	
		
		
			
				
					
					  s - > max_gain  =  max_gain ;    s - > max_gain  =  max_gain ;   
			
		
	
		
		
			
				
					
					  s - > fps  =  fps ;    s - > fps  =  fps ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  s - > self_recover  =  0 ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  zsock_t  * ops_sock  =  zsock_new_push ( " >inproc://cameraops " ) ;    zsock_t  * ops_sock  =  zsock_new_push ( " >inproc://cameraops " ) ;   
			
		
	
		
		
			
				
					
					  assert ( ops_sock ) ;    assert ( ops_sock ) ;   
			
		
	
		
		
			
				
					
					  s - > ops_sock  =  zsock_resolve ( 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 ] ;        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 )  {    if  ( good_count  <  4 )  {   
			
		
	
		
		
			
				
					
					    s - > focus_err  =  nan ( " " ) ;      s - > focus_err  =  nan ( " " ) ;   
			
		
	
		
		
			
				
					
					    return ;      return ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -1770,8 +1777,8 @@ static void do_autofocus(CameraState *s) { 
			
		
	
		
		
			
				
					
					  float  err  =  s - > focus_err ;    float  err  =  s - > focus_err ;   
			
		
	
		
		
			
				
					
					  float  sag  =  ( s - > last_sag_acc_z / 9.8 )  *  128 ;    float  sag  =  ( s - > last_sag_acc_z / 9.8 )  *  128 ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  const  int  dac_up  =  s - > device  = =  DEVICE_LP3 ?  634 : 456 ;    const  int  dac_up  =  s - > device  = =  DEVICE_LP3 ?  LP3_AF_DAC_UP : OP3T_AF_DAC_UP ;   
			
				
				
			
		
	
		
		
			
				
					
					  const  int  dac_down  =  s - > device  = =  DEVICE_LP3 ?  366 : 224 ;    const  int  dac_down  =  s - > device  = =  DEVICE_LP3 ?  LP3_AF_DAC_DOWN : OP3T_AF_DAC_DOWN ;   
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  if  ( ! isnan ( err ) )   {    if  ( ! isnan ( err ) )   {   
			
		
	
		
		
			
				
					
					    // learn lens_true_pos
      // 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 ( )  { static  void  ops_term ( )  {  
			
		
	
		
		
			
				
					
					  zsock_t  * ops_sock  =  zsock_new_push ( " >inproc://cameraops " ) ;    zsock_t  * ops_sock  =  zsock_new_push ( " >inproc://cameraops " ) ;   
			
		
	
		
		
			
				
					
					  assert ( ops_sock ) ;    assert ( ops_sock ) ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -2036,66 +2006,81 @@ static void* ops_thread(void* arg) { 
			
		
	
		
		
			
				
					
					  zsock_t  * cameraops  =  zsock_new_pull ( " @inproc://cameraops " ) ;    zsock_t  * cameraops  =  zsock_new_pull ( " @inproc://cameraops " ) ;   
			
		
	
		
		
			
				
					
					  assert ( 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 " ,  " " ) ;    zsock_t  * terminate  =  zsock_new_sub ( " >inproc://terminate " ,  " " ) ;   
			
		
	
		
		
			
				
					
					  assert ( terminate ) ;    assert ( terminate ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  zpoller_t  * poller  =  zpoller_new ( cameraops ,  sensor_sock ,  terminate ,  NULL ) ;    zpoller_t  * poller  =  zpoller_new ( cameraops ,  terminate ,  NULL ) ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  assert ( poller ) ;    assert ( poller ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  while  ( ! do_exit )  {    SubMaster  sm ( { " sensorEvents " } ) ;  // msgq submaster
   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  while  ( ! do_exit )  {   
			
		
	
		
		
			
				
					
					    // zmq handling
   
			
		
	
		
		
			
				
					
					    zsock_t  * which  =  ( zsock_t * ) zpoller_wait ( poller ,  - 1 ) ;      zsock_t  * which  =  ( zsock_t * ) zpoller_wait ( poller ,  - 1 ) ;   
			
		
	
		
		
			
				
					
					    if  ( which  = =  terminate  | |  which  = =  NULL )  {      if  ( which  = =  terminate )  {   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      break ;        break ;   
			
		
	
		
		
			
				
					
					    }      }  else  if  ( which  ! =  NULL )  {   
			
				
				
			
		
	
		
		
			
				
					
					    void *  sockraw  =  zsock_resolve ( which ) ;        void *  sockraw  =  zsock_resolve ( which ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
 
			
				
				
			
		
	
		
		
			
				
					
					    if  ( which  = =  cameraops )  {        if  ( which  = =  cameraops )  {   
			
				
				
			
		
	
		
		
			
				
					
					      zmq_msg_t  msg ;          zmq_msg_t  msg ;   
			
				
				
			
		
	
		
		
			
				
					
					      err  =  zmq_msg_init ( & msg ) ;          err  =  zmq_msg_init ( & msg ) ;   
			
				
				
			
		
	
		
		
			
				
					
					      assert ( err  = =  0 ) ;          assert ( err  = =  0 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
 
			
				
				
			
		
	
		
		
			
				
					
					      err  =  zmq_msg_recv ( & msg ,  sockraw ,  0 ) ;          err  =  zmq_msg_recv ( & msg ,  sockraw ,  0 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					      assert ( err  > =  0 ) ;          assert ( err  > =  0 ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
 
			
				
				
			
		
	
		
		
			
				
					
					      CameraMsg  cmsg ;          CameraMsg  cmsg ;   
			
				
				
			
		
	
		
		
			
				
					
					      if  ( zmq_msg_size ( & msg )  = =  sizeof ( cmsg ) )  {          if  ( zmq_msg_size ( & msg )  = =  sizeof ( cmsg ) )  {   
			
				
				
			
		
	
		
		
			
				
					
					        memcpy ( & cmsg ,  zmq_msg_data ( & msg ) ,  zmq_msg_size ( & msg ) ) ;            memcpy ( & cmsg ,  zmq_msg_data ( & msg ) ,  zmq_msg_size ( & msg ) ) ;   
			
				
				
			
		
	
		
		
			
				
					
					
 
			
				
				
			
		
	
		
		
			
				
					
					        //LOGD("cameraops %d", cmsg.type);
            //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 )  {          zmq_msg_close ( & msg ) ;   
			
				
				
			
		
	
		
		
			
				
					
					          if  ( cmsg . camera_num  = =  0 )  {        }   
			
				
				
			
		
	
		
		
			
				
					
					            do_autoexposure ( & s - > rear ,  cmsg . grey_frac ) ;      }   
			
				
				
			
		
	
		
		
			
				
					
					            do_autofocus ( & s - > rear ) ;      // msgq handling
   
			
				
				
			
		
	
		
		
			
				
					
					          }  else  {      if  ( sm . update ( 0 )  >  0 )  {   
			
				
				
			
		
	
		
		
			
				
					
					            do_autoexposure ( & s - > front ,  cmsg . grey_frac ) ;        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 ;            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 ( ) ;        uint64_t  ts  =  nanos_since_boot ( ) ;   
			
		
	
		
		
			
				
					
					      if  ( got_accel  & &  ts  -  s - > rear . last_sag_ts  >  10000000 )  {  // 10 ms
        if  ( got_accel  & &  ts  -  s - > rear . last_sag_ts  >  10000000 )  {  // 10 ms
   
			
		
	
		
		
			
				
					
					        s - > rear . last_sag_ts  =  ts ;          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 ) ;    zpoller_destroy ( & poller ) ;   
			
		
	
		
		
			
				
					
					  zsock_destroy ( & cameraops ) ;    zsock_destroy ( & cameraops ) ;   
			
		
	
		
		
			
				
					
					  zsock_destroy ( & sensor_sock ) ;   
			
		
	
		
		
			
				
					
					  zsock_destroy ( & terminate ) ;    zsock_destroy ( & terminate ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  return  NULL ;    return  NULL ;