|  |  | @ -1710,6 +1710,9 @@ static void parse_autofocus(CameraState *s, uint8_t *d) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   int good_count = 0; |  |  |  |   int good_count = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |   int16_t max_focus = -32767; |  |  |  |   int16_t max_focus = -32767; | 
			
		
	
		
		
			
				
					
					|  |  |  |   int avg_focus = 0; |  |  |  |   int avg_focus = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   // force to max if not able to determine focus for long
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   const int patience_cnt = 100; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   static int nan_cnt = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   /*printf("FOCUS: ");
 |  |  |  |   /*printf("FOCUS: ");
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   for (int i = 0; i < 0x10; i++) { |  |  |  |   for (int i = 0; i < 0x10; i++) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -1717,42 +1720,49 @@ static void parse_autofocus(CameraState *s, uint8_t *d) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   }*/ |  |  |  |   }*/ | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   for (int i = 0; i < NUM_FOCUS; i++) { |  |  |  |   for (int i = 0; i < NUM_FOCUS; i++) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     int doff = i*5+5; |  |  |  |     int pd_idx = (i+1)*5; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     s->confidence[i] = d[doff]; |  |  |  |     s->confidence[i] = d[pd_idx]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     int16_t focus_t = (d[doff+1] << 3) | (d[doff+2] >> 5); |  |  |  |     int16_t focus_delta = d[pd_idx+1]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     if (focus_t >= 1024) focus_t = -(2048-focus_t); |  |  |  |     if (focus_delta >= 128) focus_delta = - (256 - focus_delta); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     s->focus[i] = focus_t; |  |  |  |     s->focus[i] = focus_delta; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     //printf("%x->%d ", d[doff], focus_t);
 |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     if (s->confidence[i] > 0x20) { |  |  |  |     if (s->confidence[i] > 64) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |       good_count++; |  |  |  |       good_count++; | 
			
		
	
		
		
			
				
					
					|  |  |  |       max_focus = max(max_focus, s->focus[i]); |  |  |  |       max_focus = max(max_focus, s->focus[i]); | 
			
		
	
		
		
			
				
					
					|  |  |  |       avg_focus += s->focus[i]; |  |  |  |       avg_focus += s->focus[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     // printf("%d\n", s->focus[i]);
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   //printf("\n");
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   if (good_count < 4) { |  |  |  |   if (good_count < 4) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     s->focus_err = nan(""); |  |  |  |     s->focus_err = nan(""); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     nan_cnt += 1; | 
			
		
	
		
		
			
				
					
					|  |  |  |     return; |  |  |  |     return; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   avg_focus /= good_count; |  |  |  |   avg_focus /= good_count; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   // outlier rejection
 |  |  |  |   if (abs(avg_focus - max_focus) > 16) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   if (abs(avg_focus - max_focus) > 200) { |  |  |  |     if (nan_cnt < patience_cnt) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     s->focus_err = nan(""); |  |  |  |       s->focus_err = nan(""); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     return; |  |  |  |       nan_cnt += 1; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       s->focus_err = max_focus*8.0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       nan_cnt = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     s->focus_err = avg_focus*8.0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     nan_cnt = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |   // printf("fe=%f\n", s->focus_err);
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   s->focus_err = max_focus*1.0; |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void do_autofocus(CameraState *s) { |  |  |  | static void do_autofocus(CameraState *s) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   // params for focus PI controller
 |  |  |  |   // params for focus PI controller
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   const float focus_kp = 0.005; |  |  |  |   const float focus_kp = 0.1; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   float err = s->focus_err; |  |  |  |   float err = s->focus_err; | 
			
		
	
		
		
			
				
					
					|  |  |  |   float offset = 0; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   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? 634:456; | 
			
		
	
	
		
		
			
				
					|  |  | @ -1776,6 +1786,7 @@ static void do_autofocus(CameraState *s) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   LOGD(debug);*/ |  |  |  |   LOGD(debug);*/ | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   actuator_move(s, target); |  |  |  |   actuator_move(s, target); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   // printf("ltp=%f, clp=%d\n",s->lens_true_pos,s->cur_lens_pos);
 | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -2165,6 +2176,9 @@ void cameras_run(DualCameraState *s) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         } else { |  |  |  |         } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |           uint8_t *d = c->ss[buffer].bufs[buf_idx].addr; |  |  |  |           uint8_t *d = c->ss[buffer].bufs[buf_idx].addr; | 
			
		
	
		
		
			
				
					
					|  |  |  |           if (buffer == 1) { |  |  |  |           if (buffer == 1) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             // FILE *df = fopen("/sdcard/focus_buf","wb");
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             // fwrite(d, c->ss[buffer].bufs[buf_idx].len, sizeof(uint8_t), df);
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             // fclose(df);
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             parse_autofocus(c, d); |  |  |  |             parse_autofocus(c, d); | 
			
		
	
		
		
			
				
					
					|  |  |  |           } |  |  |  |           } | 
			
		
	
		
		
			
				
					
					|  |  |  |           c->ss[buffer].qbuf_info[buf_idx].dirty_buf = 1; |  |  |  |           c->ss[buffer].qbuf_info[buf_idx].dirty_buf = 1; | 
			
		
	
	
		
		
			
				
					|  |  | 
 |