/* * ***************************************************************** * * * * * 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. * * * * * ***************************************************************** */ /* CSC901 CSC902 弛緩法による明度検査 rlx_smp.c */ /*[作成者]Y.Hori */ /* 目的:弛緩法による明度検査 関数: 履歴: Ver 1.0 99/07/3 注記:m_menu.hをインクルードして下さい。 m_menu.c及びm_note.cをリンクして下さい。 */ /********************************************************* ** Include compiler runtime library ** *********************************************************/ #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 "f_rlx.h" /* 弛緩法ライブラリ */ /********************************************************* ** Include CSC90X common local ** *********************************************************/ #include "m_menu.h" /********************************************************* ** プロトタイプ宣言 ** *********************************************************/ void main( void ); /* メイン関数 */ void main_menu_disp( void ); /* メニュー表示 */ void disp_help( void ); /* ヘルプ表示 */ extern int message_note( void ); /* 警告文表示 */ static void set( void ); /* 設定 */ static void regist_ptn( void ); /* パタン登録 */ static void prdm_regist_srtpt( int timing, int n, PARADIGM val[] ); /* パタン登録パラダイム */ static void prdm_regist_size( int timing, int n, PARADIGM val[] ); /* パタン登録パラダイム */ static void close( int num ); /* パタン削除 */ static void insp_cond( char name[], int update ); /* パタンそれぞれの設定 */ static void indication_ptn( void ); /* パタン表示 */ static int ptn_select( int page ); /* パタン選択 */ static void execute( int num ); /* 弛緩法による明度検査、実行 */ /************************************************************ * メニュー項目 ************************************************************/ #define LANG_N 2 #define MAIN_MENU_N 4 static const char *str_main_menu[MAIN_MENU_N][LANG_N] = { { " SET ", " 設 定 " }, { " EXEC ", " 実 行 " }, { " PROC3 ", " 処理3 " }, { " PROC4 ", " 処理4 " } }; #define INIT_CUR_POS_X 255 #define INIT_CUR_POS_Y 239 #define MEM_SIZE 983040 #define MAX_PTN 100 /************************************************************ ** グローバル変数 ** ************************************************************/ char master_name[MAX_PTN][13]; /* パタン名称保管 */ PVAL rgst_pad_value[3]; /* パタン登録パッドの共用体 */ /************************************************************ ** メイン ** ************************************************************/ void main( void ) { int sts; int xpos; int ypos; int s_xpos; int s_ypos; char *adrs; /* 弛緩法メモリアドレス */ int page; /* パタン選択、ページ番号 */ int exe_rtn; /* パタン選択の戻り値 */ int num; /* パタンナンバー */ PRIVATE WORD wXs, wYs, wXe, wYe; /* 初期メッセージ表示 */ 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; /* 入力ビデオ制御 */ 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(); Lib_get_stage_window( &wXs, &wYs, &wXe, &wYe ); /* 弛緩法メモリの確保 */ if(NULL != ( adrs = Lib_mlalloc( MEM_SIZE )) ) { /* 弛緩法のオープン */ if( 0 == Lib_rlx_open( adrs, MEM_SIZE, INITIAL_MODE ) ) { /* メインメニューの表示 */ 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 ); set( ); Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); main_menu_disp(); } else if ( xpos > MENU_2_XS && xpos < MENU_2_XE && ypos > MENU_2_YS && ypos < MENU_2_YE ) { page = 0; /* 「実行」が押されたとき */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); for( ; ; ) { /* オープンされているパタンを表示 */ exe_rtn = ptn_select( page ); if(exe_rtn == 12) /* 前のページへ */ page--; else if(exe_rtn == 13) /* 次のページへ */ page++; else if(0 <= exe_rtn && exe_rtn <=11)/* オープンパタンが選択されたら */ break; else if(exe_rtn == 102) /* 終了ボタンが押されたら */ break; else if(exe_rtn == -1) /* 異常終了したら */ break; } if(0 <= exe_rtn && exe_rtn <= 11) /* オープンパタンが選択された場合 */ { /* ページ番号と戻り値からOP_PTNの登録場所を見つけ出す */ num=page*12+exe_rtn; execute( num ); } 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 ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); break; /* 終了 */ } } } } else Lib_display_message( 100, 100, "エラー", "弛緩法ライブラリのオープンができません" ); } else Lib_display_message( 150, 150, "エラー", "メモリが足りません" ); /* メモリの開放 */ Lib_lfree( adrs ); Lib_set_stage_window( wXs, wYs, wXe, wYe ); } /************************************************************ ** メインメニュー表示 ** ************************************************************/ 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 *)str_main_menu[1][iLanguage], (char *)NULL, (char *)NULL ); } /************************************************************ ** ヘルプ表示 ** ************************************************************/ static void disp_help( void ) { int i = 6; Lib_chrdisp( 8, i, "【機能\概要】 RLX_SMP" ); i++; Lib_chrdisp( 9, i, "このプログラムは弛緩法を行ない、マスタパタンと" ); i++; Lib_chrdisp( 9, i, "検査画像を比べ欠陥部分の特定を行ないます。" ); i++; i++; Lib_chrdisp( 8, i, "【使用法】" ); i++; Lib_chrdisp( 9, i, "まず設定のパタン登録でマスタパタンを登録してくだ" ); i++; Lib_chrdisp( 9, i, "さい。登録されたパタンは、パタン確認で見ることが" ); i++; Lib_chrdisp( 9, i, "でき、さらに削除や設定変更も行なえます。" ); i++; Lib_chrdisp( 9, i, "実行ボタンを押し、登録パタンの選択を行なうと実際" ); i++; Lib_chrdisp( 9, i, "に実行を開始します。" ); i++; i++; Lib_chrdisp( 8, i, "【注意点】" ); i++; Lib_chrdisp( 9, i, "メモリ不足でパタン登録が行なえない場合は、ソ\ースの" ); i++; Lib_chrdisp( 9, i, "#define MEM_SIZE 983040 の数字を増やしてください。" ); i++; } /************************************************************ ** 設定 ** ************************************************************/ static void set( void ) { int pad_level; /* パッドレベル */ int width,height; /* キーサイズ */ int no; /* 戻り値 */ int xs, ys; /* パッド位置 */ /* メニューサイズの取得 */ Lib_set_pad_maxstring( 10 ); Lib_get_standard_key_size( &width, &height); /* パッドのオープン */ pad_level = Lib_view_open(); /* パッドのタイトル */ Lib_view_set_title( pad_level, "設定" ); /* メニューの登録 */ Lib_view_set_null( pad_level, 10, 5, "パタン登録", 0 ); Lib_view_set_null( pad_level, 10, 8+height, "パタン表\示", 1 ); /* パッドの表示位置 */ Lib_get_start_pad( pad_level, &xs, &ys ); Lib_view_set_size( pad_level, xs, ys, 10, 5 ); /* パッドの表示 */ Lib_draw_command( pad_level ); for( ; ; ) { if(ERROR_RETURN != ( no = Lib_process_command( pad_level )) ) { if( no == 0 ) /* パタン登録 */ { Lib_erase_command( pad_level ); /* パッドを一時的に消す */ regist_ptn( ); Lib_draw_command( pad_level ); /* パッドの復活 */ } else if( no == 1 ) /* パタン表示 */ { Lib_erase_command( pad_level ); /* パッドを一時的に消す */ indication_ptn( ); Lib_draw_command( pad_level ); /* パッドの復活 */ } else if( no == 102 ) /* 終了ボタン */ break; else { Lib_display_message( 150, 150, "エラー", "設定パッドエラー" ); break; } } } Lib_erase_command(pad_level); /* コマンドパッドを消す */ Lib_view_close(pad_level); /* パッドのクローズ */ } /************************************************************ ** パタン登録 ** ************************************************************/ static void regist_ptn( ) { int pad_level; /* パッドレベル */ int no; /* メニューの戻り値 */ int width, height; /* キーサイズ */ int flg = 0; /* 登録パタンに同名が存在するかどうかのフラグ */ char str[64]; /* 出力用バッファ */ int msg_rtn; /* Lib_display_messge2の戻り値を入れる */ int strcmp_rtn; /* 戻り値 */ int position[4], size[4]; /* パタン位置の移動範囲 */ int rlx_rtn; int ptn_num; int num; /* 最大数をオーバーしていないかの確認 */ ptn_num = Lib_rlx_get_entry_num( ); if( ptn_num >= MAX_PTN ) Lib_display_message( 150, 150, "エラー","登録数オーバー" ); else { /* 初期値代入 */ strcpy( rgst_pad_value[0].string_type , " 000000"); rgst_pad_value[1].box_type.x = 240; rgst_pad_value[1].box_type.y = 224; rgst_pad_value[2].box_type.x = 32; rgst_pad_value[2].box_type.y = 32; position[0] = 0; position[1] = 0; position[2] = 502; position[3] = 470; size[0] = 9; size[1] = 9; size[2] = 512; size[3] = 480; /* 登録範囲のボックス線 */ Lib_box( rgst_pad_value[1].box_type.x, rgst_pad_value[1].box_type.y, rgst_pad_value[1].box_type.x+rgst_pad_value[2].box_type.x, rgst_pad_value[1].box_type.y+rgst_pad_value[2].box_type.y,SOLID_LINE ); /* パッドのオープン */ pad_level = Lib_view_open( ); /* パッドのタイトル */ Lib_view_set_title( pad_level, "パタン登録" ); /* メニューサイズの取得 */ Lib_set_pad_maxstring( 10 ); Lib_get_standard_key_size( &width, &height ); /* メニューの登録 */ Lib_view_set_uniq_string( pad_level, 5, 5, "名 称", rgst_pad_value[0].string_type, 12, 0 ); Lib_view_set_ybox( pad_level, 5, 8+height,"パターン始点", rgst_pad_value[1].box_type.x, rgst_pad_value[1].box_type.y, 3, 2, 1, 1, position, size, 1 ); Lib_view_set_ybox( pad_level, 5, 11+height*2, "パターンサイズ", rgst_pad_value[2].box_type.x, rgst_pad_value[2].box_type.y, 3, 1, 1, 1, position, size, 2 ); /* パラダイムの設定 */ Lib_set_paradigm( pad_level, 1, ST_AND_ED_TIMING, prdm_regist_srtpt ); Lib_set_paradigm( pad_level, 2, ST_AND_ED_TIMING, prdm_regist_size ); /* パッドの表示位置 */ Lib_view_set_size( pad_level, 10, 300, 5, 5 ); /* パッドの表示 */ Lib_draw_menu( pad_level ); Lib_freeze( TRANSMIT ); if( ERROR_RETURN != ( no = Lib_process_menu( pad_level, rgst_pad_value )) ) { switch( no ) { case 101 : /* 実行ボタンが押されたとき */ for( num=0; num= ( ptn_num = Lib_rlx_get_entry_num( )) ) /* 登録パタンがなかった場合 */ { Lib_display_message( 150, 150, "エラー", "1個も登録されていません" ); break; } else /* それ以外 */ { if( pt < 0 ) pt = ptn_num - 1; else if( pt >= ptn_num ) pt = 0; /* パラメータ取得 */ Lib_rlx_get_param2( master_name[pt], &x, &y, &x_size, &y_size ); /* パタンの表示 */ Lib_freeze(NOT_TRANSMIT); Lib_gray_memory_cls( gray_current ); /* 画面を消す */ temp_x = ( 512 - x_size ) / 2; /* パタンの表示位置 */ temp_y = 70; /* パタンの表示位置 */ Lib_rlx_dsp_image( master_name[pt], gray_current, temp_x, temp_y );/* パタンの表示 */ Lib_video_transmit( GRAY_PLANE ); /* メニューサイズの取得 */ Lib_set_pad_maxstring( 12 ); Lib_get_standard_key_size(&width, &height); /* パッドのオープン */ pad_level = Lib_view_open(); /* パッドのタイトル */ Lib_sprintf( str, "パタン:%s", master_name[pt] ); Lib_view_set_title(pad_level,str); /* メニューの登録 */ Lib_sprintf( str, "パタンサイズ:(%4d,%4d)", x_size, y_size ); Lib_view_set_comment( pad_level, 5, 5, str, 0 ); Lib_sprintf( str, "左上位置:(%4d,%4d)", x, y ); Lib_view_set_comment( pad_level, 5, 8+height, str, 1 ); Lib_view_set_null(pad_level,5,11+height*2,"前頁",2); Lib_view_set_null(pad_level,10+width,11+height*2,"次頁",3); Lib_view_set_null(pad_level,5,14+height*3,"検査条件変更",4); Lib_view_set_null(pad_level,10+width,14+height*3,"削除",5); /* パッドの表示位置 */ Lib_view_set_size( pad_level, 10, 300, 5, 5); /* パッドの表示 */ Lib_draw_command( pad_level ); if( ERROR_RETURN != ( no = Lib_process_command( pad_level )) ) { if( no == 2 ) pt--; /* 前頁が押された場合 */ else if( no == 3 ) pt++; /* 次頁が押された場合 */ else if( no == 4 ) /* 設定値変更が押された場合 */ { Lib_erase_command( pad_level ); /* パッドを一時的に消す */ insp_cond( master_name[pt], 1 ); /* 設定値変更を行なう */ Lib_draw_command( pad_level ); /* パッドの復活 */ } else if( no == 5 ) /* 削除が押された場合 */ { if( PAD_EXECUTE == ( conf_rtn = Lib_display_message2( 150, 150, "確認","削除してもよろしいですか?")) ) close( pt ); } else if( no == 102 ) /* 終了が押された場合 */ { Lib_erase_command( pad_level ); Lib_view_close( pad_level ); Lib_memory_clear( LINE_PLANE ); break; } } Lib_erase_command( pad_level ); /* コマンドパッドを消す */ Lib_view_close( pad_level ); /* パッドのクローズ */ } } Lib_freerun( ); } /************************************************************ ** 検査条件の設定 ** ************************************************************/ static void insp_cond( char name[], int update ) { int pad_level; /* パッドレベル */ int width,height; /* キーサイズ */ int no; /* パッド実行の戻り値 */ char str[64]; /* 文字列バッファ */ PVAL pad_value[2]; /* パッド共用体 */ int turn, err_level; /* 検査条件 */ if( update == 1 ) /* 更新の場合 */ { Lib_rlx_get_param( name, &turn, &err_level ); /* パラメータの取得 */ pad_value[0].value_type = turn; pad_value[1].value_type = err_level; } else /* 新規の場合 */ { pad_value[0].value_type = 5; pad_value[1].value_type = 30; } /* メニューサイズの取得 */ Lib_set_pad_maxstring( 12 ); Lib_get_standard_key_size(&width, &height); /* パッドのオープン */ pad_level = Lib_view_open( ); /* パッドのタイトル */ Lib_sprintf( str, "%s", name ); Lib_view_set_title( pad_level, str ); /*メニューの登録 */ Lib_view_set_uniq_numeral( pad_level, 10, 5, "弛緩法回数", pad_value[0].value_type, 1, 10, 0); Lib_view_set_uniq_numeral( pad_level, 10, 8+height, "エラーしきい値", pad_value[1].value_type, 0, 100, 1); /* パッドの表示位置 */ Lib_view_set_size( pad_level, 10, 300, 30, 5 ); /* パッドの表示 */ Lib_draw_menu( pad_level ); if(ERROR_RETURN != (no=Lib_process_menu( pad_level, pad_value )) ) { if( no == 101) Lib_rlx_set_param( name, pad_value[0].value_type, pad_value[1].value_type ); } else Lib_display_message( 150, 150, "エラー", "メニューパッドエラーが発生しました" ); Lib_erase_menu(pad_level); /* メニューパッドを消す */ Lib_view_close(pad_level); /* パッドのクローズ */ } /************************************************************ ** パタン選択 ** ************************************************************/ static int ptn_select( int page ) { int pad_level; /* パッドレベル */ int width,height; /* キーサイズ */ int no,rtn=0; /* 戻り値代入 */ int i; int max_page; /* 最大のページ番号を入れる */ char str[64]; /* 文字列バッファ */ char m_name[13]; /* パタン名(char) */ int ptn_num; int key_n; int p, s; ptn_num = Lib_rlx_get_entry_num( ); /* 登録されているパタン数を取得 */ if( ptn_num == 0 ) /* 1つも登録されていなかったら */ { Lib_display_message( 150, 150, "エラー", "1個も登録されていません"); return( -1 ); } else { /* マックスページの取得 */ max_page = (ptn_num - 1) / 12; /* メニューサイズの取得 */ Lib_set_pad_maxstring( 12 ); Lib_get_standard_key_size(&width, &height); /* パッドのオープン */ pad_level = Lib_view_open( ); /* パッドのタイトル */ Lib_sprintf( str, "パタン選択:page%d", page+1 ); Lib_view_set_title( pad_level, str ); if( page == max_page ) key_n = ptn_num - page * 12; else key_n = 12; /* メニューの登録 */ for( i=0; i