/* * ***************************************************************** * * * * * 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 グレイサーチ・サンプルソフト 90xgs.c */ /*[作成者]A.Sekimori */ /*[概要] グレイサーチのサンプルソフトです。 */ /* トラックボールの操作のほかに、RS232CCH0からコマンドを入力することに */ /* よって実行することができます。 */ /* */ /* コマンド G・・・サーチ実行 */ /* E・・・リモートモード終了 */ /* 結果送信形式 正常終了時 XXXX,YYYY,SSSS XXXX:X座標 */ /* YYYY:Y座標 */ /* SSSS:相関値 */ /* :制御コード */ /* 異常終了時 E1:コマンドエラー */ /* E2:コマンド文字数エラー */ /* E3:サーチエラー */ /* E3:パタンが登録されていない */ /* Eコマンド発行時 OK */ /* 目的: 関数: 履歴: Ver 1.0 97/09/10 Ver 1.1 99/03/17 パタン名称を共用体に変更 リモートモード時に正常終了した際、結果送信後にゴミデータを 送信していた不具合を修正 注記:m_menu.hをインクルードして下さい。 m_menu.c及びm_note.cをリンクして下さい。 */ /* Include compiler runtime library */ #include #include #include /* Include CSC90X library */ #include "f_stdio.h" /* 標準入出力 */ #include "f_stdlib.h" /* メモリ領域割当 */ #include "f_file.h" /* ファイルシステム */ #include "f_math.h" /* 数学演算 */ #include "f_gui.h" /* GUI */ #include "f_graph.h" /* モニタ表示 */ #include "f_pinf.h" /* システムパラメータ */ #include "f_video.h" /* ビデオ入力制御 */ #include "f_image.h" /* フレームバッファ */ #include "f_time.h" /* 時刻サービス */ #include "f_gray.h" /* 濃度変換 */ #include "f_search.h" /* グレイサーチ */ #include "f_system.h" /* システム制御 */ /* Include CSC90X common local */ #include "m_menu.h" /* メニュー項目 */ #define LANG_N 2 #define MAIN_MENU_N 3 static const char *str_main_menu[MAIN_MENU_N][LANG_N] = { { " GRAY ", " グレイ " }, { " SAVE ", " セーブ " }, { " REMOTE ", " リモート " } }; static char *result_key[][KIND_LANGUAGE] = { { "Backward", "前頁" }, { "Forward" , "次頁" } }; #define INIT_CUR_POS_X 255 #define INIT_CUR_POS_Y 239 #define PTN_SIZE 102400 #define NUM_MIN 1 #define NUM_MAX 50 #define COM_MIN 1 #define COM_MAX 9 #define SCO_MIN 1000 #define SCO_MAX 9999 #define XS_MIN 0 #define XS_MAX 512 #define YS_MIN 0 #define YS_MAX 480 #define TRY 100 #define EXE 200 typedef union { char cn[5]; /* パタン名称 */ int in; /* パタン名称 */ } PTN_N; typedef struct { int number; /* 個数 */ int mode; /* 精度 */ int complex; /* 複雑度 */ int mid_lower; /* 途中相関値 */ int last_lower; /* 最終相関値 */ int edge_detect; /* Wエッジ */ int x_step; /* ピッチX */ int y_step; /* ピッチY */ int filter; /* フィルター */ } SEARCH_P; typedef struct { int xs; /* 処理範囲始点X */ int ys; /* 処理範囲始点Y */ int x_size; /* 処理範囲サイズX */ int y_size; /* 処理範囲サイズY */ } WINDOW; typedef struct { PTN_N pn_data; SEARCH_P gsp_data; WINDOW win_data; } DATA; static char *select[3] = { "通常" , "高 " , "超高" }; static char *select_f[4] = { "高速", "黒線" , "白線" , "通常" }; static PTN_N name; static SEARCH_P gsp; static WINDOW win; static char *ptn_adr; /* プロトタイプ宣言 */ void main( void ); void main_menu_disp( void ); void disp_help( void ); void data_init( void ); int load_file( char * ); void save_file( char * ); int alloc_ptn_area( void ); void save_user_ptn_file( void ); void gray_command( void ); void set_search_parm( void ); void ptn_entry( void ); void disp_ptn( void ); void set_window( void ); void pre_search( void ); int exe_GS( int ); void remote( void ); void remote_inspection_control( void ); void disp_search_result( int, int, int * ); void disp_result_ptn( int, int *, int, int ); extern int message_note( void ); /* メイン */ void main( void ) { int sts; int xpos; int ypos; int s_xpos; int s_ypos; /* 初期メッセージ表示 */ if( NORMAL_RETURN != message_note() ) return; if ( NORMAL_RETURN == Lib_opensio( SIO_CHANNEL0 ) ) { if ( NORMAL_RETURN == alloc_ptn_area() ) { if ( ERROR_RETURN == load_file( "90XGS.CFG" ) ) /* ファイルをロード */ data_init(); /* ロードに失敗したのでデータを初期化 */ /* パラメタ初期化 */ 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(); /* メインメニューの表示 */ 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 ); gray_command(); 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 ) { /* 「セーブ」が選択された */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); save_file( "90XGS.CFG" ); save_user_ptn_file(); Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); main_menu_disp(); } else if ( xpos > MENU_3_XS && xpos < MENU_3_XE && ypos > MENU_3_YS && ypos < MENU_3_YE ) { /* 「リモート」が選択された */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); remote(); 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; /* 終了 */ } } } } } else Lib_display_message( 100, 200, "エラー", "RS232Cがオープンできません" ); Lib_clossio( SIO_CHANNEL0 ); Lib_lfree( ptn_adr ); } /* メインメニュー表示 */ 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 *)str_main_menu[2][iLanguage], (char *)NULL ); } /* ヘルプ表示 */ static void disp_help( void ) { Lib_chrdisp( 10, 8, "【機能\概要】 90XGS" ); Lib_chrdisp( 11, 10, "グレイサーチサンプルソ\フトです。" ); Lib_chrdisp( 11, 13, "【グレイ】 グレイサーチの各種設定を行います。" ); Lib_chrdisp( 11, 15, "【セーブ】 パラメータ、サーチパタンをセーブします。" ); Lib_chrdisp( 11, 17, "【リモート】リモートモード(RS232C-CH0)へ移行します。" ); Lib_chrdisp( 11, 18, " G でサーチ実行" ); Lib_chrdisp( 11, 19, " E でリモート終了" ); } /***** データ初期化 *****/ void data_init( void ) { /* グレイサーチ・パラメータ */ Lib_sprintf( name.cn, "%04d", 0 ); /* パタン名称 */ gsp.number = 1; /* 個数 */ gsp.mode = NORMAL_MODE; /* 精度 */ gsp.complex = 1; /* 複雑度 */ gsp.mid_lower = 5000; /* 途中相関値 */ gsp.last_lower = 6000; /* 最終相関値 */ gsp.edge_detect = 0; /* Wエッジ */ gsp.x_step = 0; /* ピッチX */ gsp.y_step = 0; /* ピッチY */ gsp.filter = 0; /* フィルター */ /* 処理範囲 */ win.xs = 0; /* ウィンドウ始点X */ win.ys = 0; /* ウィンドウ始点Y */ win.x_size = 512; /* ウィンドウサイズX */ win.y_size = 480; /* ウィンドウサイズY */ } /***** サーチ・パタン領域の確保(起動時)*****/ int alloc_ptn_area( void ) { int mode; int error; if ( NULL != ( ptn_adr = Lib_mlalloc( PTN_SIZE ) ) ) { if ( ( unsigned long )NULL != Lib_fload( "\\FS0\\USER_PTN.DAT", ptn_adr, PTN_SIZE ) ) mode = CONTINUE_PTN_AREA; /* パタンエリアは継続して使用する */ else { mode = INITIAL_PTN_AREA; /* パタンエリアは初期化して使用する */ /*Lib_cls( CHAR_PLANE , BLACK_COLOR );*/ Lib_display_message( 70, 200, "パタンファイル無し", "パタンエリアは初期化して使用します" ); } if ( 0 == Lib_gs_defadrs( ptn_adr, PTN_SIZE, mode ) ) error = NORMAL_RETURN; else { error = ERROR_RETURN; Lib_cls( CHAR_PLANE , BLACK_COLOR ); Lib_display_message( 100, 200, "エラー", "パタンエリアは使用できません" ); } } else { error = ERROR_RETURN; Lib_display_message( 100, 200, "エラー", "パタン用メモリーが確保できません" ); } return( error ); } /***** パタン・ファイルのセーブ *****/ void save_user_ptn_file( void ) { /* パタン・ファイルのセーブ */ Lib_display_comment( 144, 228, "パタンファイルをセーブ中です" ); if ( ( unsigned long )NULL == Lib_fsave( "\\FS0\\USER_PTN.DAT", ptn_adr, PTN_SIZE ) ) { Lib_cls( CHAR_PLANE, BLACK_COLOR ); Lib_display_message( 112, 200, "エラー", "パタン・ファイルをセーブできません" ); } Lib_set_cursor_shape( ARROW_TYPE ); Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); } /***** 設定ファイルのセーブ *****/ void save_file( f_name ) char f_name[]; { DATA *ap; char fp_name[30]; unsigned long file_size; Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); if ( ( DATA * )NULL != ( ap = ( DATA * )Lib_mlalloc( sizeof( DATA ) ) ) ) { ap->pn_data = name; ap->gsp_data = gsp; ap->win_data = win; Lib_sprintf( fp_name, "\\FS0\\%s", f_name ); /* 設定ファイルのセーブ */ Lib_display_comment( 144, 228, "設定ファイルをセーブ中です" ); if ( ( unsigned long )NULL == ( file_size = Lib_fsave( fp_name, ( char * )ap, sizeof( DATA ) ) ) ) Lib_display_message( 120, 200, "エラー", "設定ファイルをセーブできません" ); Lib_lfree( ( char * )ap ); } else Lib_display_message( 120, 200, "エラー", "メモリーが確保できません" ); Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); } /***** 設定ファイルのロード *****/ int load_file( f_name ) char f_name[]; { DATA *ap; char fp_name[30]; unsigned long file_size; int error_status; if ( ( DATA * )NULL != ( ap = ( DATA * )Lib_mlalloc( sizeof( DATA ) ) ) ) { Lib_sprintf( fp_name, "\\FS0\\%s", f_name ); /* 設定ファイルのロード */ if ( ( unsigned long )NULL != ( file_size = Lib_fload( fp_name, ( char * )ap, sizeof( DATA ) ) ) ) { name = ap->pn_data; gsp = ap->gsp_data; win = ap->win_data; error_status = NORMAL_RETURN; } else { /*Lib_display_message( 120, 200, "エラー", "設定ファイルをロードできません" );*/ error_status = ERROR_RETURN; } Lib_lfree( ( char * )ap ); } else { Lib_display_message( 120, 200, "エラー", "メモリーが確保できません" ); error_status = ERROR_RETURN; } return( error_status ); } /***** グレイサーチメニュー *****/ void gray_command( void ) { int pad_level; int no; int status_flag; Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); pad_level = Lib_view_open(); Lib_view_set_title( pad_level, "グレイ" ); Lib_view_set_null( pad_level, 5, 5, "設定" , 0 ); Lib_view_set_null( pad_level, 5, 35, "登録" , 1 ); Lib_view_set_null( pad_level, 5, 65, "パタン表\示", 2 ); Lib_view_set_null( pad_level, 5, 95, "処理範囲" , 3 ); Lib_view_set_null( pad_level, 5, 125, "サーチ試行" , 4 ); Lib_view_set_size( pad_level, 50, 50, 5, 5 ); Lib_draw_command( pad_level ); for ( status_flag = ON; OFF != status_flag; ) { if ( ERROR_RETURN != ( no = Lib_process_command( pad_level ) ) ) { switch( no ) { case 0:/* 設定 */ set_search_parm(); break; case 1:/* 登録 */ ptn_entry(); break; case 2:/* パタン表示 */ disp_ptn(); break; case 3:/* 処理範囲 */ set_window(); break; case 4:/* サーチ試行 */ pre_search(); break; case 102:/* 終了 */ status_flag = OFF; break; } } } Lib_erase_command( pad_level ); Lib_view_close( pad_level ); Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); } /***** グレイサーチ設定 *****/ void set_search_parm( void ) { PVAL value[10]; int no; int pad_level_gsp; int idc; idc = Lib_shelter_plane( 0, 0, (Lib_get_dx_size() - 1), (Lib_get_dy_size() - 1), CHAR_PLANE ); pad_level_gsp = Lib_view_open(); /* パッドのオープン */ Lib_view_set_title( pad_level_gsp, "設定" ); /* パッドタイトルの登録 */ /* 各属性メニューの登録 */ Lib_view_set_uniq_string ( pad_level_gsp, 5, 5, "パタン名称", name.cn , 4 , 0 ); Lib_view_set_uniq_numeral( pad_level_gsp, 5, 35, "個数" , gsp.number , NUM_MIN, NUM_MAX , 1 ); Lib_view_set_select ( pad_level_gsp, 5, 65, "精度" , gsp.mode - 1 , 3 , select , 2 ); Lib_view_set_uniq_numeral( pad_level_gsp, 5, 95, "複雑度" , gsp.complex , COM_MIN, COM_MAX , 3 ); Lib_view_set_uniq_numeral( pad_level_gsp, 5, 125, "途中下限値", gsp.mid_lower , SCO_MIN, SCO_MAX , 4 ); Lib_view_set_uniq_numeral( pad_level_gsp, 5, 155, "最終下限値", gsp.last_lower , SCO_MIN, SCO_MAX , 5 ); Lib_view_set_uniq_alter ( pad_level_gsp, 5, 185, "Wエッジ" , gsp.edge_detect, 6 ); Lib_view_set_uniq_numeral( pad_level_gsp, 5, 215, "ピッチX" , gsp.x_step , XS_MIN , XS_MAX , 7 ); Lib_view_set_uniq_numeral( pad_level_gsp, 5, 245, "ピッチY" , gsp.y_step , YS_MIN , YS_MAX , 8 ); Lib_view_set_select ( pad_level_gsp, 5, 275, "フィルター", gsp.filter , 4 , select_f, 9 ); /* パッドの表示位置の登録 */ Lib_view_set_size( pad_level_gsp, 80, 80, 5, 5 ); Lib_draw_menu( pad_level_gsp ); /* メニューパッドの表示 */ if ( ERROR_RETURN != ( no = Lib_process_menu( pad_level_gsp, value ) ) ) /* メニュー値の取得 */ { switch( no ) { case 101: /*「実行」が選択された */ strcpy( name.cn, value[0].string_type ); gsp.number = value[1].value_type; gsp.mode = value[2].select_type + 1; gsp.complex = value[3].value_type; gsp.mid_lower = value[4].value_type; gsp.last_lower = value[5].value_type; gsp.edge_detect = value[6].on_off_type; gsp.x_step = value[7].value_type; gsp.y_step = value[8].value_type; gsp.filter = value[9].select_type; break; case 102: /*「取り消し」が選択された */ break; } } Lib_erase_menu( pad_level_gsp ); /* メニューパッドの消去 */ Lib_view_close( pad_level_gsp ); /* パッドのクローズ */ Lib_recover_plane( idc ); } /***** パタン登録 *****/ void ptn_entry( void ) { int error; int idc; idc = Lib_shelter_plane( 0, 0, (Lib_get_dx_size() - 1), (Lib_get_dy_size() - 1), CHAR_PLANE ); Lib_freeze( TRANSMIT ); Lib_gs_smode( gsp.filter ); error = Lib_gs_defpat( name.in ); if ( -1 == error ) Lib_display_message( 150, 200, "エラー", "既に200個登録済みです" ); else if ( -2 == error ) Lib_display_message( 150, 200, "エラー", "パタン格納領域不足です" ); Lib_freerun(); Lib_recover_plane( idc ); } /***** パタン表示 *****/ void disp_ptn( void ) { int idc; idc = Lib_shelter_plane( 0, 0, (Lib_get_dx_size() - 1), (Lib_get_dy_size() - 1), CHAR_PLANE ); Lib_gs_dsppat(); Lib_freerun(); Lib_recover_plane( idc ); } /***** 処理範囲設定 *****/ void set_window( void ) { PVAL value[2]; int pad_level_w; int no; int idc; idc = Lib_shelter_plane( 0, 0, (Lib_get_dx_size() - 1), (Lib_get_dy_size() - 1), CHAR_PLANE ); Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); pad_level_w = Lib_view_open(); /* パッドのオープン */ Lib_view_set_title( pad_level_w, "処理範囲" ); /* 各属性メニューの登録 */ Lib_view_set_box( pad_level_w, 5, 5, "W始点" , win.xs , win.ys , 3, 1, 0 ); Lib_view_set_box( pad_level_w, 5, 35, "Wサイズ", win.x_size, win.y_size, 3, 0, 1 ); /* パッドの表示位置の登録 */ Lib_view_set_size( pad_level_w, 5, 410, 5, 5 ); Lib_draw_menu( pad_level_w ); /* メニューパッドの表示 */ if ( ERROR_RETURN != ( no = Lib_process_menu( pad_level_w, value ) ) ) /* メニュー値の取得 */ { switch( no ) { case 101: /*「実行」が選択された */ win.xs = value[0].box_type.x; win.ys = value[0].box_type.y; win.x_size = value[1].box_type.x; win.y_size = value[1].box_type.y; break; case 102: /*「取り消し」が選択された */ break; } } Lib_erase_menu( pad_level_w ); Lib_view_close( pad_level_w ); Lib_recover_plane( idc ); } /***** サーチ試行 *****/ void pre_search( void ) { int idc; int status; idc = Lib_shelter_plane( 0, 0, (Lib_get_dx_size() - 1), (Lib_get_dy_size() - 1), CHAR_PLANE ); if ( 0 == ( status = exe_GS( TRY ) ) ) Lib_display_message( 100, 200, "エラー", "対象物がありません" ); else if ( -1 == status ) Lib_display_message( 100, 200, "エラー", "パタンが登録されていません" ); Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); Lib_recover_plane( idc ); } /***** サーチ実行 *****/ int exe_GS( mode ) int mode; { char ss[50]; int result[150]; int ct; int id; int num; Lib_freeze( TRANSMIT ); Lib_gs_window( ON_DISPLAY, win.xs, win.ys, win.xs + win.x_size - 1, win.ys + win.y_size - 1 ); Lib_gs_smode( gsp.filter ); Lib_gs_xcondition( gsp.edge_detect, gsp.x_step, gsp.y_step, 0, 0 ); Lib_strtclk_count(); if ( 0 < ( num = Lib_gs_search( ON_DISPLAY, name.in, gsp.number, gsp.mode, gsp.complex, gsp.mid_lower, gsp.last_lower, result ) ) ) { Lib_time_disp( 0, 452 ); if ( EXE == mode ) /* リモートモード */ { for ( ct = 0; ct < num; ct++ ) { id = ct * 3; Lib_sprintf( ss, "%04d,%04d,%04d\r\n", result[id], result[id+1], result[id+2] ); Lib_putso( SIO_CHANNEL0, strlen( ss ), ss ); } } else if ( TRY == mode ) /* 試行モード */ disp_search_result( name.in, num, result ); } Lib_freerun(); return( num ); } /***** リモート・モード *****/ void remote( void ) { char command[5]; char buf[20]; char ss[20]; int ch; Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); Lib_erase_cursor(); for ( ; ; ) { Lib_display_comment( 430, 0, "リモート" ); command[0] = 0x00; /* NULL */ for ( ; ; ) { if ( 0x0d == ( ch = Lib_getc_rs232c( SIO_CHANNEL0 ) ) ) /* CR */ { Lib_sprintf( buf, "%c", ( ch & 0xff ) ); Lib_putc_rs232c( buf[0], SIO_CHANNEL0 ); /* エコーバック */ break; } else { if ( EOF != ch ) { Lib_sprintf( buf, "%c", ( ch & 0xff ) ); Lib_putc_rs232c( buf[0], SIO_CHANNEL0 ); /* エコーバック */ strcat( command, buf ); } } } if ( 1 == strlen( command ) ) { if ( 0 == strcmp( "G", command ) ) { Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); remote_inspection_control(); } else if ( 0 == strcmp( "E", command ) ) { Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); Lib_sprintf( ss, "OK\r\n" ); Lib_putso( SIO_CHANNEL0, strlen( ss ), ss ); break; } else { Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); Lib_chrdisp( 1, 30, "コマンドエラー" ); Lib_sprintf( ss, "E1\r\n" ); Lib_putso( SIO_CHANNEL0, strlen( ss ), ss ); } } else { Lib_cls( ( LINE_PLANE | CHAR_PLANE ), BLACK_COLOR ); Lib_chrdisp( 1, 30, "コマンド文字数エラー" ); Lib_sprintf( ss, "E2\r\n" ); Lib_putso( SIO_CHANNEL0, strlen( ss ), ss ); } } /* マウスカーソルの表示 */ Lib_draw_cursor( INIT_CUR_POS_X, INIT_CUR_POS_Y ); } /***** リモート実行制御 *****/ void remote_inspection_control( void ) { char ss[20]; int status; if ( 0 == ( status = exe_GS( EXE ) ) ) { Lib_chrdisp( 1, 30, "エラー:対象物がありません" ); Lib_sprintf( ss, "E3\r\n" ); Lib_putso( SIO_CHANNEL0, strlen( ss ), ss ); } else if ( -1 == status ) { Lib_chrdisp( 1, 30, "エラー:パタンが登録されていません" ); Lib_sprintf( ss, "E4\r\n" ); Lib_putso( SIO_CHANNEL0, strlen( ss ), ss ); } } /***** サーチ結果の表示 *****/ void disp_search_result( p_name, num, result ) int p_name; /* サーチパタン名称 */ int num; /* サーチ結果の個数 */ int result[]; /* サーチ結果 */ { char title[17]; char r_disp[35]; int pad_level_r; int status_flag; int start,end; int page,page_count,remain; int n_key,b_key; int no,m_no; int ct; int ys; int score; int lang; double xx, yy; lang = Lib_get_disp_language(); page_count = 1; if ( num <= 5 ) { page = 1; remain = 0; } else { if ( 0 != ( remain = num % 5 ) ) page = num / 5 + 1; else page = num / 5; } if ( 0 == lang ) Lib_sprintf( title, "Result = %d", num ); else if ( 1 == lang ) Lib_sprintf( title, "サーチ結果 = %d", num ); for ( status_flag = ON; OFF != status_flag; ) { n_key = 0; b_key = 0; pad_level_r = Lib_view_open(); /* パッドのオープン */ Lib_view_set_title( pad_level_r, title ); /* パッドタイトルの登録 */ /* 各属性メニューの登録 */ if ( 0 == lang ) Lib_view_set_comment( pad_level_r, 2, 2, "No. | X pos.| Y pos.|C-Val.", 0 ); else if ( 1 == lang ) Lib_view_set_comment( pad_level_r, 2, 2, "No. | X 位置| Y 位置|相関値", 0 ); m_no = 1; ys = 2; if ( 1 == page ) { start = 1; end = num; } else { if ( page == page_count ) { start = 1 + ( page_count - 1 ) * 5; end = num; } else { start = 1 + ( page_count - 1 ) * 5; end = start + 4; } } for ( ct = start; ct <= end; ct++ ) { ys += 27; xx = (double)result[(ct-1)*3] / 10.0; yy = (double)result[(ct-1)*3+1] / 10.0; score = result[(ct-1)*3+2]; Lib_sprintf( r_disp, " %2d |+ %5.1f|+ %5.1f| %4d ", ct, xx, yy, score ); Lib_view_set_comment( pad_level_r, 2, ys, r_disp, m_no ); m_no++; } /* 改ページキー表示状態を判断 */ if ( 3 <= page ) { if ( 1 == page_count ) { Lib_view_set_null( pad_level_r, 130, ys+30, result_key[1][lang], m_no ); n_key = m_no; } else if ( page == page_count ) { Lib_view_set_null( pad_level_r, 15, ys+30, result_key[0][lang], m_no ); b_key = m_no; } else { Lib_view_set_null( pad_level_r, 15, ys+30, result_key[0][lang], m_no ); b_key = m_no; Lib_view_set_null( pad_level_r, 130, ys+30, result_key[1][lang], ++m_no ); n_key = m_no; } } else if ( 2 == page ) { if ( 1 == page_count ) { Lib_view_set_null( pad_level_r, 130, ys+30, result_key[1][lang], m_no ); n_key = m_no; } else if ( page == page_count ) { Lib_view_set_null( pad_level_r, 15, ys+30, result_key[0][lang], m_no ); b_key = m_no; } } /* パッドの表示位置の登録 */ Lib_view_set_size( pad_level_r, 0, 0, 2, 2 ); Lib_draw_command( pad_level_r ); /* コマンドパッドの表示 */ if ( ERROR_RETURN != ( no = Lib_process_command( pad_level_r ) ) ) /* メニュー値の取得 */ { Lib_erase_command( pad_level_r ); /* コマンドパッドの消去 */ Lib_view_close( pad_level_r ); /* パッドのクローズ */ if ( 0 != no ) { if ( b_key == no ) page_count--; /* 前ページ */ else if ( n_key == no ) page_count++; /* 次ページ */ else if ( 102 == no ) status_flag = OFF; /*「終了」が選択された */ else disp_result_ptn( p_name, result, page_count, no ); } } } } /***** サーチ結果の表示(サーチ箇所を枠で囲う)*****/ void disp_result_ptn( p_name, result, page_count, no ) int p_name; int result[]; int page_count; int no; { char string[30],string2[30]; char *save_l,*save_c; int out_inf[8]; int x_ofset,y_ofset; int x_size,y_size; int i; int xx,yy; int score; int lang; int wxs,wys,wxe,wye; lang = Lib_get_disp_language(); if ( NULL != ( save_l = Lib_mlalloc( 31220 ) ) && NULL != ( save_c = Lib_mlalloc( 31220 ) ) ) { if ( NORMAL_RETURN == Lib_get( 0, 0, 511, 479, LINE_PLANE, save_l ) && NORMAL_RETURN == Lib_get( 0, 0, 511, 479, CHAR_PLANE, save_c ) ) { if ( 0 == Lib_gs_infpat( p_name, out_inf ) ) { x_size = out_inf[0]; y_size = out_inf[1]; x_ofset = out_inf[2] / 10; y_ofset = out_inf[3] / 10; i = ( page_count - 1 ) * 5 + no; xx = result[(i-1)*3] / 10; yy = result[(i-1)*3+1] / 10; score = result[(i-1)*3+2]; wxs = xx - x_ofset; wys = yy - y_ofset; wxe = wxs + x_size - 1; wye = wys + y_size - 1; Lib_box( wxs - 1, wys - 1, wxe + 1, wye + 1, SOLID_LINE ); Lib_box( wxs, wys, wxe, wye, SOLID_LINE ); Lib_box( wxs + 1, wys + 1, wxe - 1, wye - 1, SOLID_LINE ); Lib_sprintf( string, "No.%d ", i ); if ( 0 == lang ) Lib_sprintf( string2, "C-Val.| %4d ", score ); else if ( 1 == lang ) Lib_sprintf( string2, "相関値| %4d ", score ); Lib_display_message( 0, 0, string, string2 ); Lib_cls( LINE_PLANE, BLACK_COLOR ); Lib_put( save_l ); Lib_put( save_c ); } } } Lib_lfree( save_l ); Lib_lfree( save_c ); }