/* * ***************************************************************** * * * * * Copyright (c) Fast Corporation, 1997 * * * * * * All Rights Reserved. Unpublished rights reserved under * * * the copyright laws of the Japan. * * * * * * The software contained on this media is proprietary to * * * and embodies the confidential technology of Fast * * * Corporation. Possession, use, duplication or * * * dissemination of the software and media is authorized only * * * pursuant to a valid written license from Fast Corporation. * * * * * ***************************************************************** */ /* CSC90X フォーカス値計測               FOCUS.C */ /*[作成者]??? */ /* 目的: 関数: 履歴: Ver 1.0 97/08/15 Ver 2.0 99/03/24 CSC903確認 Ver 2.1 99/04/08 パッド表示系のエラーを修正 S.Masuda 注記:m_menu.hをインクルードして下さい。 m_menu.c及びm_note.cをリンクして下さい。 */ /* * Include compiler runtime library */ #include #include #include /* * Include CSC90X library */ #include "f_stdlib.h" #include "f_time.h" #include "f_gui.h" #include "f_stdio.h" #include "f_graph.h" #include "f_image.h" #include "f_pinf.h" #include "f_video.h" #include "f_system.h" /* * Include CSC90X common local */ #include "m_menu.h" /* * プロトタイプ宣言 */ void main( void ); void main_menu_disp( void ); void disp_help( void ); void exec( void ); void sxx_pad_focus( void ); void pad_exec( int, int, PARADIGM * ); void u_video_input( int ); void sxx_draw_cros( int, int ); void sxx_eras_cros( int, int ); void sxx_timer_wait( int ); void sxx_timer_start( void ); void sxx_time_disp( int, int, int ); void sxx_time_lapse_read( int ); void u_hist( int, int, int, int, int, int, int * ); int u_bun( int * ); int u_xdif( int, int, int, int, int, int ); int u_ydif( int, int, int, int, int, int ); int u_dif( int, int, int, int, int, int ); int u_dif_sumx( int, int, int, int, int, int ); int u_xdif_h( int, int, int, int, int, int, int * ); int u_ydif_h( int, int, int, int, int, int, int * ); extern int message_note( void ); /* * メニュー項目 */ #define LANG_N 2 #define MAIN_MENU_N 4 static const char *str_main_menu[MAIN_MENU_N][LANG_N] = { { " EXEC ", "設定&実行" }, { " PROC2 ", " 処理2 " }, { " PROC3 ", " 処理3 " }, { " PROC4 ", " 処理4 " } }; #define INIT_CUR_POS_X 255 #define INIT_CUR_POS_Y 239 #define YES 1 #define NO 0 #define FOREVER while( YES ) #define SUCCESS 0 #define FAILURE -1 #define WDX_MIN 0 #define WDX_MAX 511 #define WDY_MIN 0 #define WDY_MAX 479 #define MOUSE_XS 256 #define MOUSE_YS 240 #define PAD_XS 2 #define PAD_YS 2 #define ENGLISH 0 #define JAPANESE 1 #define PAD_ALL 0 #define PAD_SYSTEM 1 #define PAD_GRAY 2 #define PAD_FOCUS 3 #define PAD_END 5 #define PAD_DX 0 #define PAD_DY 1 #define PAD_WAIT 2 #define PAD_EXEC 3 #define NO_GRAY_STAGE 0 #define TIME_WAIT 50 #define EXECUTE 1 static char *gs_mem; static int sys_mem_no; static int Time_Save[10]; static PVAL pad_value[15]; static int pad_level_0; static int pad_level_1; /* * メイン */ void main( void ) { int sts; int xpos; int ypos; int s_xpos; int s_ypos; /* 初期メッセージ表示 */ if( NORMAL_RETURN != message_note() ) return; /* パラメタ初期化 */ xpos = INIT_CUR_POS_X; ypos = INIT_CUR_POS_Y; s_xpos = INIT_CUR_POS_X; s_ypos = INIT_CUR_POS_Y; pad_value[PAD_DX].value_type = 2; pad_value[PAD_DY].value_type = 2; pad_value[PAD_WAIT].value_type =100; /* 入力ビデオ制御 */ Lib_input_video_control( GRAY_PLANE ); /* ビデオ出力表示項目制御 */ Lib_display_control( GRAY_PLANE | LINE_PLANE | CHAR_PLANE ); /* ビデオ表示項目クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); /* カーソル初期化 */ Lib_init_cursor(); /* メインメニューの表示 */ main_menu_disp(); /* マウスカーソルの表示 */ Lib_draw_cursor( INIT_CUR_POS_X, INIT_CUR_POS_Y ); /* メニュー制御 */ for (;;) { sts = 0; /* マウス位置読みとり */ sts = Lib_see_current_position( &xpos, &ypos ); if ( s_xpos != xpos || s_ypos != ypos ) { /* マウス表示位置移動 */ Lib_move_cursor( xpos, ypos ); s_xpos = xpos; s_ypos = ypos; } /* 処理振り分け */ if( CURSOR_EXECUTE == sts ) { if ( xpos > MENU_1_XS && xpos < MENU_1_XE && ypos > MENU_1_YS && ypos < MENU_1_YE ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); exec(); /*設定&実行*/ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); main_menu_disp(); } else if ( xpos > MENU_H_XS && xpos < MENU_H_XE && ypos > MENU_H_YS && ypos < MENU_H_YE ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); disp_help(); /* ヘルプ */ main_menu_disp(); } else if ( xpos > MENU_E_XS && xpos < MENU_E_XE && ypos > MENU_E_YS && ypos < MENU_E_YE ) { break; /* 終了 */ } } } } /* * メインメニュー表示 */ static void main_menu_disp( void ) { int iLanguage; /* 日本語/英語表示文字列切替情報取得 */ iLanguage = Lib_get_disp_language(); /* 整列キー表示 -> ( m_menu.c ) */ SUB_menu_disp4he( (char *)str_main_menu[0][iLanguage], (char *)NULL, (char *)NULL, (char *)NULL ); } /* * ヘルプ表示 */ static void disp_help( void ) { Lib_chrdisp( 10, 8, "【機能\概要】 FOCUS " ); Lib_chrdisp( 11, 10, "フォーカス値計測" ); } /* * 実行 */ void exec() { sxx_pad_focus( ); } /************************************************************************/ /* パラメータ セッテイ メニュー ノ ジッコウ */ /************************************************************************/ void sxx_pad_focus( ) { static int rtn_code; if( ERROR_RETURN != ( pad_level_0 = Lib_view_open( ) ) ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); Lib_view_set_title( pad_level_0, "ケンサ パラメータ" ); Lib_view_set_uniq_numeral( pad_level_0, 5, 5, "カンカク X", pad_value[PAD_DX].value_type, 1, 128, PAD_DX ); Lib_view_set_uniq_numeral( pad_level_0, 5,35, "カンカク Y", pad_value[PAD_DY].value_type, 1, 128, PAD_DY ); Lib_view_set_uniq_numeral( pad_level_0, 5,65, "ウエイト ジカン", pad_value[PAD_WAIT].value_type, 0,10000, PAD_WAIT ); Lib_view_set_null ( pad_level_0, 5,95, "ジッコウ ", PAD_EXEC ); Lib_set_paradigm( pad_level_0, PAD_EXEC, START_TIMING, pad_exec ); Lib_view_set_size( pad_level_0, 5, 5, 5, 5 ); Lib_draw_menu( pad_level_0 ); rtn_code = Lib_process_menu(pad_level_0, pad_value ); if (rtn_code == 101) { } Lib_erase_menu( pad_level_0 ); Lib_view_close( pad_level_0 ); Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); Lib_freerun(); } } /************************************************************************/ /* PAD_EXEC */ /************************************************************************/ void pad_exec( timing, numb, val ) int timing; int numb; PARADIGM val[]; { static char s[40]; static int hist[256]; static int x, y; static int xs, ys, xe, ye; static int dx, dy; static int d1, d2, d3, d4, d5; static int ct; Lib_erase_menu( pad_level_1 ); Lib_erase_cursor(); Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); Lib_chrdisp (2,2,"ノウド ヒストグラム ノ ブンサン :"); Lib_chrdisp (2,3,"X ホウコウ ビブンチ :"); Lib_chrdisp (2,4,"Y ホウコウ ビブンチ :"); Lib_chrdisp (2,5,"ノウド ノ サイダイ サイショウ サ :"); Lib_chrdisp (2,6,"サイダイ サイショウ サ ノ セキブン:"); Lib_chrdisp (2,30,"キャンセルキーで終了"); Lib_set_stage_no( NO_GRAY_STAGE ); Lib_get_stage_window(&xs,&ys,&xe,&ye); Lib_drawline(xs,ys,xe,ys); Lib_drawline(xe,ys,xe,ye); Lib_drawline(xe,ye,xs,ye); Lib_drawline(xs,ye,xs,ys); dx = pad_value[PAD_DX].value_type; dy = pad_value[PAD_DY].value_type; ct = 0; x = y = 0; FOREVER { if (CURSOR_CANCEL == Lib_see_current_position( &x, &y )) break; Lib_freeze( TRANSMIT ); sxx_timer_start(); u_hist(xs,ys,xe,ye,dx,dy,hist); d1 = u_bun(hist); sxx_time_lapse_read( 0 ); sxx_timer_start(); d2 = u_xdif_h(xs,ys,xe,ye,dx,dy,hist); /*d2 = u_xdif(xs,ys,xe,ye,dx,dy);*/ sxx_time_lapse_read( 1 ); sxx_timer_start(); d3 = u_ydif_h(xs,ys,xe,ye,dx,dy,hist); /*d3 = u_ydif(xs,ys,xe,ye,dx,dy);*/ sxx_time_lapse_read( 2 ); sxx_timer_start(); d4 = u_dif(xs,ys,xe,ye,dx,dy); sxx_time_lapse_read( 3 ); sxx_timer_start(); d5 = u_dif_sumx(xs,ys,xe,ye,dx,dy); sxx_time_lapse_read( 4 ); Lib_sprintf(s,"%7d",d1); Lib_chrdisp(25,2,s); Lib_sprintf(s,"%7d",d2); Lib_chrdisp(25,3,s); Lib_sprintf(s,"%7d",d3); Lib_chrdisp(25,4,s); Lib_sprintf(s,"%7d",d4); Lib_chrdisp(25,5,s); Lib_sprintf(s,"%7d",d5); Lib_chrdisp(25,6,s); sxx_time_disp(35,2, 0 ); sxx_time_disp(35,3, 1 ); sxx_time_disp(35,4, 2 ); sxx_time_disp(35,5, 3 ); sxx_time_disp(35,6, 4 ); sxx_timer_wait( pad_value[PAD_WAIT].value_type ); ct++; } Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); Lib_draw_menu( pad_level_1 ); } /************************************************************************/ /* 指定タイマーのウエイト */ /************************************************************************/ void sxx_timer_wait( ms ) int ms; /*入力 ウエイト時間*/ { static int tm; tm = ms * 10000 / 8138; Lib_strtclk_count(); while ( Lib_readclk_count() < tm ) ; } /************************************************************************/ /* タイマーのスタート */ /************************************************************************/ void sxx_timer_start() { Lib_strtclk_count(); /*タイマーカウントモードのスタート*/ } /************************************************************************/ /* タイマーの読み取り */ /************************************************************************/ void sxx_time_lapse_read( numb ) int numb; /*入力 表示位置*/ { int time; time = Lib_readclk_count(); /*タイマーカウントモードの読み取り*/ Time_Save[numb] = ( time * 8138 ) / 10000; } /************************************************************************/ /* タイム表示 */ /************************************************************************/ void sxx_time_disp( xpos, ypos, numb ) int xpos; /*入力 表示位置*/ int ypos; /*入力 表示位置*/ int numb; /*入力 表示No*/ { char s[36]; Lib_sprintf( s, "/%4d(msec)", Time_Save[numb] ); Lib_chrdisp( xpos, ypos, s ); } /************************************************************************/ /* ノウド ヒストグラム ノ ブンサン */ /************************************************************************/ void u_hist( xs, ys, xe, ye, dx, dy, hb ) int xs, ys, xe, ye, dx, dy, *hb; { register int x, y; register int fdx, fdy, d, i; register int *b; unsigned register char *fr; unsigned register char *frw; b = hb; for (i = 0; i < 256; i++) *b++ = 0; gs_mem = (void *)Lib_adrs_gray_memory( sys_mem_no ); fr = (void *)( (unsigned int)gs_mem + (unsigned int)( (512 * ys) + xs ) ); fdx = dx; fdy = dy * 512; b = hb; for ( y = ys; y <= ye; y += dy ) { frw = fr; for ( x = xs; x <= xe; x += dx ) { d = ( *frw & 0xff ); *( b + d ) += 1; frw += fdx; } fr += fdy; } } /************************************************************************/ /* 分散 */ /************************************************************************/ int u_bun( hb ) int *hb; { register int *b; register int a, c, i, d, dsum; b = hb; c = a = 0; for ( i = 0; i < 256; i++ ) { a += ( *b * i ); c += *b++; } a = a / c; b = hb; dsum = 0; for ( i = 0; i < 256; i++ ) { d = i - a; dsum += ( d * d * (*b++) ); } dsum /= c; return( dsum ); } /************************************************************************/ /* X ホウコウ ビブンチ */ /************************************************************************/ int u_xdif_h( xs, ys, xe, ye, dx, dy, hb ) int xs, ys, xe, ye, dx, dy, *hb; { register int x, y, a, c, i; register int fdx, fdy, d1, d2, d, dhist; unsigned register char *fr; unsigned register char *frw; register int *b; b = hb; for ( i = 0; i < 256; i++ ) *b++ = 0; gs_mem = (void *)Lib_adrs_gray_memory( sys_mem_no ); fr = (void *)( (unsigned int)gs_mem + (unsigned int)( (512 * ys) + xs ) ); b = hb; fdx = dx; fdy = dy * 512; for ( y = ys; y <= ye; y += dy ) { d1 = ( *fr & 0xff ); frw = fr + fdx; for ( x = (xs + dx); x <= xe; x += dx ) { d2 = ( *frw & 0xff ); if ( (d = d2 - d1) < 0 ) d = -d; *( b + d ) += d; d1 = d2; frw += fdx; } fr += fdy; } b = hb; c = a = 0; for ( i = 0; i < 256; i++ ) { a += ( *b * i ); c += *b++; } if ( c == 0 ) dhist = 0; else dhist = (double)a * 100.0 / (double)c; return( dhist ); } /************************************************************************/ /* Y ホウコウ ビブンチ */ /************************************************************************/ int u_ydif_h( xs, ys, xe, ye, dx, dy, hb ) int xs, ys, xe, ye, dx, dy, *hb; { register int x, y, a, c, i; register int fdx, fdy, d1, d2, d, dhist; unsigned register char *fr; unsigned register char *frw; register int *b; b = hb; for ( i = 0; i < 256; i++ ) *b++ = 0; gs_mem = (void *)Lib_adrs_gray_memory( sys_mem_no ); fr = (void *)( (unsigned int)gs_mem + (unsigned int)( (512 * ys) + xs ) ); b = hb; fdx = dx; fdy = dy * 512; for ( x = xs; x <= xe; x += dx ) { d1 = ( *fr & 0xff ); frw = fr + fdy; for ( y = (ys + dy); y <= ye; y += dy ) { d2 = ( *frw & 0xff ); if ( ( d = d2 - d1 ) < 0 ) d = -d; *( b + d ) += d; d1 = d2; frw += fdy; } fr += fdx; } b = hb; c = a = 0; for ( i = 0; i < 256; i++ ) { a += ( *b * i ); c += *b++; } if ( c == 0 ) dhist = 0; else dhist = (double)a * 100.0 / (double)c; return( dhist ); } /************************************************************************/ /* サイダイ サイショウ サ */ /************************************************************************/ int u_dif( xs, ys, xe, ye, dx, dy ) int xs, ys, xe, ye, dx, dy; { register int x, y; register int fdx, fdy, d; register int dmin, dmax; unsigned register char *fr; unsigned register char *frw; gs_mem = (void *)Lib_adrs_gray_memory( sys_mem_no ); fr = (void *)( (unsigned int)gs_mem + (unsigned int)( (512 * ys) + xs ) ); dmin = 255; dmax = 0; fdx = dx; fdy = dy * 512; for ( y = ys; y <= ye; y += dy ) { frw = fr; for ( x = xs; x <= xe; x += dx ) { d = ( *frw & 0xff ); if (d < dmin) dmin = d; if (d > dmax) dmax = d; frw += fdx; } fr += fdy; } return( dmax - dmin ); } /************************************************************************/ /* サイダイ サイショウ サ ノ セキブン */ /************************************************************************/ int u_dif_sumx( xs, ys, xe, ye, dx, dy ) int xs, ys, xe, ye, dx, dy; { register int x, y; register int fdx, fdy, d, dsum; register int dmin, dmax; unsigned register char *fr; unsigned register char *frw; gs_mem = (void *)Lib_adrs_gray_memory( sys_mem_no ); fr = (void *)( (unsigned int)gs_mem + (unsigned int)( (512 * ys) + xs ) ); dsum = 0; fdx = dx; fdy = dy * 512; for ( y = ys; y <= ye; y += dy ) { dmin = 255; dmax = 0; frw = fr; for ( x = xs; x <= xe; x += dx ) { d = ( *frw & 0xff ); if ( d < dmin ) dmin = d; if ( d > dmax ) dmax = d; frw += fdx; } dsum += ( dmax - dmin ); fr += fdy; } return( dsum ); } /************************************************************************/ /* X ホウコウ ビブンチ */ /************************************************************************/ int u_xdif( xs, ys, xe, ye, dx, dy ) int xs, ys, xe, ye, dx, dy; { register int x, y; register int fdx, fdy, d1, d2, d, dsum; unsigned register char *fr; unsigned register char *frw; gs_mem = (void *)Lib_adrs_gray_memory( sys_mem_no ); fr = (void *)( (unsigned int)gs_mem + (unsigned int)( (512 * ys) + xs ) ); dsum = 0; fdx = dx; fdy = dy * 512; for ( y = ys; y <= ye; y += dy ) { d1 = ( *fr & 0xff ); frw = fr + fdx; for ( x = (xs + dx); x <= xe; x += dx ) { d2 = ( *frw & 0xff ); if ( (d = d2 - d1) < 0 ) d = -d; dsum += d; d1 = d2; frw += fdx; } fr += fdy; } return( dsum ); } /************************************************************************/ /* Y ホウコウ ビブンチ */ /************************************************************************/ int u_ydif( xs, ys, xe, ye, dx, dy ) int xs, ys, xe, ye, dx, dy; { register int x, y; register int fdx, fdy, d1, d2, d, dsum; unsigned register char *fr; unsigned register char *frw; gs_mem = (void *)Lib_adrs_gray_memory( sys_mem_no ); fr = (void *)( (unsigned int)gs_mem + (unsigned int)( (512 * ys) + xs ) ); dsum = 0; fdx = dx; fdy = dy * 512; for ( x = xs; x <= xe; x += dx ) { d1 = ( *fr & 0xff ); frw = fr + fdy; for ( y = (ys + dy); y <= ye; y += dy ) { d2 = ( *frw & 0xff ); if ( (d = d2 - d1) < 0 ) d = -d; dsum += d; d1 = d2; frw += fdy; } fr += fdx; } return( dsum ); }