Index: unk/core/motion_detector.c_
===================================================================
--- /trunk/core/motion_detector.c_	(revision 1046)
+++ 	(revision )
@@ -1,538 +1,0 @@
-
-/*
-
-Motion detection module
-
-
-Author: mx3 (Max Sagaydachny) . win1251 ( Ìàêñèì Ñàãàéäà÷íûé )
-Email: win.drivers@gmail.com
-Skype: max_dtc
-ICQ#: 125-985-663
-Country: Ukraine
-Sity: Kharkiv
-
-
-20070912 mx3 
-
-
-20070915 mx3:
-
-uBASIC using of motion detector in uBASIC scripts:
-
-
-
-*/
-
-#define MD_REC_CALLS_CNT 2048
-
-#include "motion_detector.h"
-
-#include "gui.h"
-#include "gui_draw.h"
-
-
-#define MD_XY2IDX(x,y) ((y)*motion_detector.columns+x)
-
-void kbd_sched_shoot();
-
-enum {
-	MD_MAKE_DEBUG_LOG_FILE=2,
-	MD_DO_IMMEDIATE_SHOOT=1
-
-};
-
-enum {
-	MD_REGION_NONE=0,
-	MD_REGION_INCLUDE=1,
-	MD_REGION_EXCLUDE=2
-};
-
-
-//#define MD_XY2IDX(x,y) ((y)*motion_detector.columns+x)
-
-
-static struct {
-	int *curr; // points to buff1 or buff2
-	int *prev; // points to buff2 or buff1
-	int buff1[MOTION_DETECTOR_CELLS];
-	int buff2[MOTION_DETECTOR_CELLS];
-	int points[MOTION_DETECTOR_CELLS];
-
-	int columns;
-	int rows;
-	int threshold;
-	int pixel_measure_mode;
-	int timeout;
-	int measure_interval;
-
-	int last_measure_time;
-	int start_time;
-
-	int running;
-	int detected_cells;
-
-	int draw_grid;
-	int clipping_region_mode;
-	int clipping_region_row1;
-	int clipping_region_column1;
-	int clipping_region_row2;
-	int clipping_region_column2;
-
-	int previous_picture_is_ready;
-
-	int ret_var_num;
-	int parameters;
-	int pixels_step;
-	int msecs_before_trigger;
-
-// debug
-	int comp_calls_cnt;
-	int comp_calls[MD_REC_CALLS_CNT];
-
-} motion_detector;
-
-
-//motion_detector.curr=NULL;
-
-
-
-int md_init_motion_detector(
- int columns,
- int rows,
- int pixel_measure_mode,
- int detection_timeout,
- int measure_interval,
- int threshold,
- int draw_grid,
- int ret_var_num,
- int clipping_region_mode,
- int clipping_region_column1,
- int clipping_region_row1,
- int clipping_region_column2,
- int clipping_region_row2,
- int parameters,
- int pixels_step,
- int msecs_before_trigger
-){
-
-	motion_detector.comp_calls_cnt=0;
-	motion_detector.previous_picture_is_ready=0;
-	motion_detector.curr=motion_detector.buff1;
-	motion_detector.prev=motion_detector.buff2;
-	if(pixel_measure_mode>2 || pixel_measure_mode<0){
-		pixel_measure_mode=1;
-	}
-
-	if( columns * rows > MOTION_DETECTOR_CELLS ){
-		columns=3;
-		rows=3;
-	}
-
-	motion_detector.msecs_before_trigger=msecs_before_trigger;
-	motion_detector.parameters = parameters;
-	motion_detector.pixels_step=pixels_step;
-	motion_detector.columns=columns;
-	motion_detector.rows=rows;
-	motion_detector.ret_var_num=ret_var_num;
-	
-
-	motion_detector.pixel_measure_mode=pixel_measure_mode;
-	motion_detector.timeout=detection_timeout;
-	motion_detector.measure_interval=measure_interval;
-	motion_detector.threshold=threshold;
-	motion_detector.draw_grid=draw_grid;
-
-
-	if (clipping_region_column1>clipping_region_column2){
-		motion_detector.clipping_region_column2=clipping_region_column1;
-		motion_detector.clipping_region_column1=clipping_region_column2;
-	} else {
-		motion_detector.clipping_region_column2=clipping_region_column2;
-		motion_detector.clipping_region_column1=clipping_region_column1;
-	}
-
-	if (clipping_region_row1>clipping_region_row2){
-		motion_detector.clipping_region_row2=clipping_region_row1;
-		motion_detector.clipping_region_row1=clipping_region_row2;
-	} else {
-		motion_detector.clipping_region_row2=clipping_region_row2;
-		motion_detector.clipping_region_row1=clipping_region_row1;
-	}
-
-	if (clipping_region_mode!=MD_REGION_NONE && clipping_region_mode!=MD_REGION_INCLUDE && clipping_region_mode!=MD_REGION_EXCLUDE){
-		clipping_region_mode=MD_REGION_NONE;
-	}
-	motion_detector.clipping_region_mode=clipping_region_mode;
-
-	motion_detector.detected_cells=0;
-	motion_detector.previous_picture_is_ready=0;
-  motion_detector.start_time=get_tick_count();
-
-	motion_detector.running=1;
-
-	kbd_sched_motion_detector();
-	draw_clear();
-
-	return 1;
-}
-
-
-
-void md_save_calls_history(){
-	char buf[200], fn[30];
-	char big[1024];
-	int big_ln;
-	int calls,i, ln, fd;
-  static struct utimbuf t;
-    unsigned long t2;
-    static struct tm *ttm;
-
-	if( (motion_detector.parameters & MD_MAKE_DEBUG_LOG_FILE) == 0 ){
-		return;
-	}
-
-	strcpy(fn,"A/MD_INFO.TXT");//,BUILD_NUMBER,motion_detector.pixels_step);
-	fd = open(fn, O_WRONLY|O_CREAT, 0777);
-	if( fd>=0) {
-		script_console_add_line("Writing info file...");
-		lseek(fd,0,SEEK_END);
-    t2 = time(NULL);
-    ttm = localtime(&t2);
-    ln=sprintf(buf, "\r\n--- %04u-%02u-%02u  %02u:%02u:%02u\r\n", 1900+ttm->tm_year, ttm->tm_mon+1, ttm->tm_mday, ttm->tm_hour, ttm->tm_min, ttm->tm_sec);
-		write(fd,buf,ln);
-
-    ln=sprintf(buf, "CHDK Ver: %s [ #%s ]\r\nBuild Date: %s %s\r\nCamera:  %s [ %s ]\r\n", HDK_VERSION, BUILD_NUMBER, __DATE__, __TIME__, PLATFORM, PLATFORMSUB);
-		write(fd,buf,ln);
-
-		ln=sprintf(buf,"[%dx%d], threshold: %d, interval: %d, pixels step: %d\r\n",
-			motion_detector.columns,
-			motion_detector.rows,
-			motion_detector.threshold,
-			motion_detector.measure_interval,
-			motion_detector.pixels_step
-			);
-		write(fd,buf,ln);
-
-		ln=sprintf(buf,"region: [%d,%d-%d,%d], region type: %d\r\n",
-			motion_detector.clipping_region_column1,
-			motion_detector.clipping_region_row1,
-			motion_detector.clipping_region_column2,
-			motion_detector.clipping_region_row2,
-			motion_detector.clipping_region_mode
-			);
-		write(fd,buf,ln);
-
-		ln=sprintf(buf,"wait interval: %d, parameters: %d, calls: %d\r\n",
-			motion_detector.msecs_before_trigger,
-			motion_detector.parameters,
-			motion_detector.comp_calls_cnt
-		);
-		write(fd,buf,ln);
-
-
-
-		calls = ( motion_detector.comp_calls_cnt < MD_REC_CALLS_CNT) ?motion_detector.comp_calls_cnt: MD_REC_CALLS_CNT;
-//		if (calls>20){
-//			calls=20;
-//		}
-
-		big_ln=0;
-		for(i=0;i<calls;i++){
-			ln=sprintf(buf,"[%d] - %d\r\n",i,motion_detector.comp_calls[i]);
-			if(big_ln+ln>1024){
-	      write(fd,big,big_ln);
-				big_ln=0;
-			} 
-			memcpy(big+big_ln,buf,ln+1);
-			big_ln+=ln;
-		}
-    write(fd,big,big_ln);
-		close(fd);
-	  t.actime = t.modtime = time(NULL);
-    utime(fn, &t);
-	}
-}
-
-
-
-
-int md_detect_motion(void){
-	int *tmp;
-	unsigned char * img;
-	int viewport_size;
-	int vp_w, vp_h, pix_N, idx, tmp2, tick, vp_w_mul_y, in_clipping_region, x_step, y_step;
-
-	register int i, col, row, x, y;
-
-	static char buf[128];
-	double vp_hr, vp_wr;
-
-
-
-	if(motion_detector.running==0){ 
-		return 0;
-	}
-
-	tick=get_tick_count();
-	if(motion_detector.comp_calls_cnt < MD_REC_CALLS_CNT) {
-		motion_detector.comp_calls[motion_detector.comp_calls_cnt]=tick;
-	}
-	motion_detector.comp_calls_cnt++;
-
-
-
-	if(motion_detector.start_time + motion_detector.timeout < tick ) {
-		md_save_calls_history();
-		motion_detector.running=0;
-		return 0;
-	}
-
-	if(motion_detector.last_measure_time+motion_detector.measure_interval > tick){
-		// wait for the next time
-		return 1;
-	}
-	
-
-#if 0
-	return 1;
-#endif
-
-	motion_detector.last_measure_time=tick;
-
-// swap pointers so we don't need to copy last data array into Previous one
-	tmp=motion_detector.curr;
-	motion_detector.curr=motion_detector.prev;
-	motion_detector.prev=tmp;
-
-
-
-//	memset(motion_detector.points,0, sizeof(motion_detector.points));
-// WARNING. maybe not optimized
-	for(i=0 ; i<motion_detector.rows*motion_detector.columns ; i++ ){
-		motion_detector.points[i]=0;
-		motion_detector.curr[i]=0;
-	}
-// WARNING. maybe not optimized
-
-
-	// >> fill "curr" array
-  img=((mode_get()&MODE_MASK) == MODE_PLAY)?vid_get_viewport_fb_d():vid_get_viewport_fb();
-	vp_h=vid_get_viewport_height();
-	vp_w=screen_width;
-
-
-//	vp_hr=(double)motion_detector.rows / (double)vp_h;
-//	vp_wr=(double)motion_detector.columns / (double)vp_w;
-	x_step=vp_w/motion_detector.columns;
-	y_step=vp_h/motion_detector.rows;
-
-
-	// WARNING - not optimized loop
-	
-	for(x=0, y=0, row=0, vp_w_mul_y=0; y < vp_h ; ){
-		// transform LCD coordinates into Motion Detection array
-//		col= x * vp_wr;
-		col= x * motion_detector.columns / vp_w;
-		idx=MD_XY2IDX(col, row);
-		motion_detector.curr[ idx ]+=img[ (y*vp_w+x)*3 + motion_detector.pixel_measure_mode];
-		motion_detector.points[ idx ]++;
-
-		x+=motion_detector.pixels_step;
-		if (x>=vp_w) {
-			x=0;
-			y+=motion_detector.pixels_step;
-//			row= y * vp_hr;
-			row= y * motion_detector.rows / vp_h;
-//			vp_w_mul_y=y*vp_w;
-		}
-	}
-	// << fill "curr" array
-
-
-	if(motion_detector.previous_picture_is_ready==0){
-		motion_detector.previous_picture_is_ready=1;
-		motion_detector.start_time=get_tick_count();
-		motion_detector.last_measure_time=motion_detector.start_time-motion_detector.measure_interval;
-		return 1;
-	}
-
-	// >> compare arrays here
-	for ( i=0; i < motion_detector.rows*motion_detector.columns; i++){
-		motion_detector.prev[i] = (motion_detector.curr[i]-motion_detector.prev[i])/motion_detector.points[i];
-		// abs
-		tmp2 = ( motion_detector.prev[i] < 0 ) ? -motion_detector.prev[i] : motion_detector.prev[i] ;
-		if( tmp2 > motion_detector.threshold){
-			col = i % motion_detector.columns;
-			row = i / motion_detector.columns;
-
-#if 1
-			in_clipping_region=0;
-			if ( col+1>=motion_detector.clipping_region_column1 
-				&& col+1<=motion_detector.clipping_region_column2
-				&& row+1>=motion_detector.clipping_region_row1
-				&& row+1<=motion_detector.clipping_region_row2
-				){
-					in_clipping_region=1;
-			}
-
-			if(motion_detector.clipping_region_mode==MD_REGION_EXCLUDE && in_clipping_region==0){
-				motion_detector.detected_cells++;
-			} 
-
-			if(motion_detector.clipping_region_mode==MD_REGION_INCLUDE && in_clipping_region==1){
-				motion_detector.detected_cells++;
-			}
-
-			if(motion_detector.clipping_region_mode==MD_REGION_NONE){
-				motion_detector.detected_cells++;
-			}
-#else
-				motion_detector.detected_cells++;
-#endif
-		}
-	}
-		
-	// << compare arrays here
-
-
-	if( motion_detector.detected_cells > 0 ){
-//		sprintf(buf,"-cells: %d", motion_detector.detected_cells);
-//		script_console_add_line(buf);
-
-		if (motion_detector.start_time+motion_detector.msecs_before_trigger<tick){
-			motion_detector.running=0;
-			md_save_calls_history();
-			if( ( motion_detector.parameters&MD_DO_IMMEDIATE_SHOOT ) !=0){
-				//make shoot
-				kbd_sched_shoot();
-			}
-			return 0;
-		}
-	}
-
-
-	return 1;
-}
-
-
-int md_get_cell_diff(int column, int row){
-
-	if (column<1 || column > motion_detector.columns){
-		return 0;
-	}
-
-	if (row<1 || row > motion_detector.rows ){
-		return 0;
-	}
-	
-
-	return motion_detector.prev[ MD_XY2IDX(column-1,row-1) ];
-}
-
-
-
-
-void md_init(){
-	motion_detector.curr=motion_detector.buff1;
-	motion_detector.prev=motion_detector.buff2;
-	motion_detector.running=0;
-	motion_detector.ret_var_num=-1;
-}
-
-
-
-
-
-
-int md_running(){
-	if(motion_detector.detected_cells>0 && motion_detector.ret_var_num!=-1){
-    ubasic_set_variable(motion_detector.ret_var_num, motion_detector.detected_cells);
-		motion_detector.ret_var_num=-1;
-	}
-
-	return motion_detector.running==1?1:0;//detected_cells>0?1:0;
-
-}
-
-
-void md_draw_grid(){
-	int x_step, y_step, col, row;
-	int do_draw_rect, i, tmp2, in_clipping_region, color, col_start, col_stop, row_start, row_stop;
-//	int
-
-	if(motion_detector.running==0 || motion_detector.draw_grid==0){
-		return ;
-	}
-
-	x_step=screen_width/motion_detector.columns;
-	y_step=screen_height/motion_detector.rows;
-#if 0
-	row_start=1;
-	row_stop=motion_detector.rows;
-	if(motion_detector.clipping_region_mode==2){
-		row_start=motion_detector.clipping_region_row1;
-		row_stop=motion_detector.clipping_region_row2+1;
-		col_start=motion_detector.clipping_region_column1;
-		col_stop=motion_detector.clipping_region_column2+1;
-	}
-	if(motion_detector.clipping_region_mode==0 || motion_detector.clipping_region_mode==2){
-		for(col=col_start;col<col_stop;col++){
-			draw_line(col*x_step,0,col*x_step,screen_height, COLOR_GREEN);
-		}
-		for(row=row_start;row<row_stop;row++){
-			draw_line(0,row*y_step,screen_width,row*y_step, COLOR_GREEN);
-		}
-	} else if(motion_detector.clipping_region_mode==1){
-		for(col=1;col<motion_detector.columns;col++){
-			if(col<){
-				draw_line(col*x_step,0,col*x_step,screen_height, COLOR_GREEN);
-			}
-		}
-	}
-#endif
-
-	for ( col=0, row=0; row < motion_detector.rows; ){
-		i=motion_detector.rows*row+col;
-		tmp2 = ( motion_detector.prev[i] < 0 ) ? -motion_detector.prev[i] : motion_detector.prev[i] ;
-
-			in_clipping_region=0;
-			if ( col+1>=motion_detector.clipping_region_column1 
-				&& col+1<=motion_detector.clipping_region_column2
-				&& row+1>=motion_detector.clipping_region_row1
-				&& row+1<=motion_detector.clipping_region_row2
-				){
-					in_clipping_region=1;
-			}
-
-			do_draw_rect=0;
-
-			if(motion_detector.clipping_region_mode==MD_REGION_EXCLUDE && in_clipping_region==0){
-				do_draw_rect=1;
-			}
-
-			if(motion_detector.clipping_region_mode==MD_REGION_INCLUDE && in_clipping_region==1){
-				do_draw_rect=1;
-			}
-
-			if(motion_detector.clipping_region_mode==MD_REGION_NONE){
-				do_draw_rect=1;
-			}
-
-			if(do_draw_rect==1){
-				color=COLOR_GREEN;
-				if( tmp2 > motion_detector.threshold){
-					color=COLOR_RED;
-				}
-				draw_rect(x_step*col+2,y_step*row+2, x_step*(col+1)-2, y_step*(row+1)-2,color);
-			}
-
-			col++;
-			if( col >= motion_detector.columns ){
-				row++;
-				col=0;
-			}
-	}
-	
-	
-
-}
