# define CATCH_CONFIG_MAIN 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "catch2/catch.hpp" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <cassert> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <cmath> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <cstring> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "common/util.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "system/camerad/cameras/camera_common.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define W 240 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define H 160 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define TONE_SPLITS 3 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								float  gts [ TONE_SPLITS  *  TONE_SPLITS  *  TONE_SPLITS  *  TONE_SPLITS ]  =  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  0.917969 ,  0.917969 ,  0.375000 ,  0.917969 ,  0.375000 ,  0.375000 ,  0.187500 ,  0.187500 ,  0.187500 ,  0.917969 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  0.375000 ,  0.375000 ,  0.187500 ,  0.187500 ,  0.187500 ,  0.187500 ,  0.187500 ,  0.187500 ,  0.093750 ,  0.093750 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.917969 ,  0.375000 ,  0.375000 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  0.187500 ,  0.187500 ,  0.187500 ,  0.187500 ,  0.187500 ,  0.187500 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  0.093750 ,  0.093750 ,  0.093750 ,  0.093750 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 ,  0.000000 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  0.000000 } ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								TEST_CASE ( " camera.test_set_exposure_target " )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // set up fake camerabuf
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  CameraBuf  cb  =  { } ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  VisionBuf  vb  =  { } ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  uint8_t  *  fb_y  =  new  uint8_t [ W * H ] ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  vb . y  =  fb_y ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cb . cur_yuv_buf  =  & vb ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cb . rgb_width  =  W ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cb . rgb_height  =  H ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  Rect  rect  =  { 0 ,  0 ,  W - 1 ,  H - 1 } ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  printf ( " AE test patterns %dx%d \n " ,  cb . rgb_width ,  cb . rgb_height ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // mix of 5 tones
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  uint8_t  l [ 5 ]  =  { 0 ,  24 ,  48 ,  96 ,  235 } ;  // 235 is yuv max
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  passed  =  true ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  float  rtol  =  0.05 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // generate pattern and calculate EV
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  cnt  =  0 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  ( int  i_0 = 0 ;  i_0 < TONE_SPLITS ;  i_0 + + )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( int  i_1 = 0 ;  i_1 < TONE_SPLITS ;  i_1 + + )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for  ( int  i_2 = 0 ;  i_2 < TONE_SPLITS ;  i_2 + + )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( int  i_3 = 0 ;  i_3 < TONE_SPLITS ;  i_3 + + )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          int  h_0  =  i_0  *  H  /  TONE_SPLITS ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          int  h_1  =  i_1  *  ( H  -  h_0 )  /  TONE_SPLITS ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          int  h_2  =  i_2  *  ( H  -  h_0  -  h_1 )  /  TONE_SPLITS ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          int  h_3  =  i_3  *  ( H  -  h_0  -  h_1  -  h_2 )  /  TONE_SPLITS ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          int  h_4  =  H  -  h_0  -  h_1  -  h_2  -  h_3 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          memset ( & fb_y [ 0 ] ,  l [ 0 ] ,  h_0 * W ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          memset ( & fb_y [ h_0 * W ] ,  l [ 1 ] ,  h_1 * W ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          memset ( & fb_y [ h_0 * W + h_1 * W ] ,  l [ 2 ] ,  h_2 * W ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          memset ( & fb_y [ h_0 * W + h_1 * W + h_2 * W ] ,  l [ 3 ] ,  h_3 * W ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          memset ( & fb_y [ h_0 * W + h_1 * W + h_2 * W + h_3 * W ] ,  l [ 4 ] ,  h_4 * W ) ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								          float  ev  =  set_exposure_target ( ( const  CameraBuf * )  & cb ,  rect ,  1 ,  1 ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          // printf("%d/%d/%d/%d/%d ev is %f\n", h_0, h_1, h_2, h_3, h_4, ev);
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          // printf("%f\n", ev);
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          // compare to gt
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          float  evgt  =  gts [ cnt ] ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if  ( fabs ( ev  -  evgt )  >  rtol * evgt )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            passed  =  false ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          // report
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          printf ( " %d/%d/%d/%d/%d: ev %f, gt %f, err %f \n " ,  h_0 ,  h_1 ,  h_2 ,  h_3 ,  h_4 ,  ev ,  evgt ,  fabs ( ev  -  evgt )  /  ( evgt  ! =  0  ?  evgt  :  0.00001f ) ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          cnt + + ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert ( passed ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  delete [ ]  fb_y ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}