/* * ***************************************************************** * * * * * Copyright (c) Fast Corporation, 1999 * * * * * * 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. * * * * * ***************************************************************** */ /* CSC902 2カメラ同時取込(CSC902−RICEのみ) 2sim_rx.c */ /*[作成者] Fast corp.*/ /* 目的:2カメラ同時取込を実行します。     関数: 履歴:Ver 1.0 99/03/26 初版。 注記:CSC902(RICE)でのみ実行可能 m_menu.hをインクルードして下さい。 m_menu.c及びm_note.cをリンクして下さい。 */ /* Include compiler runtime library */ #include #include /* CSC902ライブラリ用ヘッダ */ #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_gray.h" /* Include CSC90X common local */ #include "m_menu.h" /* 外部参照モジュール */ extern int message_note( void ); /* ファイル内モジュール */ void main( void ); static void init_sys( void ); static void init_data( void ); static void main_menu_disp( void ); static void disp_help( void ); static int sim_set_pad( int, int ); static void sim_freeze( int* ); static void sim_image_disp( int* ); static void main_channel_select( void ); static void set_channel( int, int, PARADIGM[] ); #define TITLE_ON_TABLE 0 #define BUFF_SIZE 100 enum{ SIM_1, SIM_2, SIM1_MEM, SIM2_MEM, MAX_MEM_NUM }; enum{ CH0,CH1,CH2,CH3,MAX_CH_NUM }; enum{ SIM_CH01, SIM_CH23, MAX_SIM_MODE_NUM }; /** 本モジュール内で有効な変数定義 **/ static int wChMode; static int wMainCh; static int wInputFlg; static int waMemNo[MAX_MEM_NUM]; /*メイン関数 */ void main( void ) { int i, pad_back; /* 初期メッセージ表示 */ if( NORMAL_RETURN != message_note() ) return; /* システムの初期化 */ init_sys(); /* データの初期化 */ init_data(); /* パッドの表示色は黒 */ pad_back = Lib_get_pad_background(); Lib_set_pad_background( ON ); /* メモリの確保 */ for( i = 0; i < MAX_MEM_NUM; i++ ) { waMemNo[i] = Lib_alloc_gray_memory(); } if( ERROR_RETURN != waMemNo[SIM_1] && ERROR_RETURN != waMemNo[SIM_2] && ERROR_RETURN != waMemNo[SIM1_MEM] && ERROR_RETURN != waMemNo[SIM2_MEM] ) { /* メモリのクリア */ for( i = 0; i < MAX_MEM_NUM; i++ ) { Lib_gray_memory_cls( waMemNo[i] ); } /* メインメニューの表示 */ main_menu(); /* メモリの解放 */ for( i = 0; i < MAX_MEM_NUM; i++ ) { Lib_free_gray_memory( waMemNo[i] ); } } else { /* 確保済みのメモリの解放 */ for( i = 0; i < MAX_MEM_NUM; i++ ) { if( ERROR_RETURN != waMemNo[i] ) Lib_free_gray_memory( waMemNo[i] ); } } /* パッドの表示色を元に戻す */ Lib_set_pad_background( pad_back ); } /* ファイル内変数初期化 */ static void init_data() { /* データ初期化 */ wChMode = SIM_CH01; wMainCh = Lib_get_video_channel(); wInputFlg = OFF; } /* メニュー項目 */ #define MAIN_MENU_N 4 static const char *sim_main_menu[MAIN_MENU_N][KIND_LANGUAGE] = { { "InpuCh", "取込チャネル" }, { " INPUT", "画像取込" }, { " DISP ", "画像表\示"}, { "DispCH", "表\示チャネル" } }; /*メインメニュー*/ static main_menu() { int sts; int xpos, ypos, old_xpos, old_ypos; int ch_no[2]; /* メニューの表示 */ main_menu_disp(); /* マウスカーソルの現在位置取得 */ Lib_look_current_position( &xpos, &ypos ); /* マウスカーソルの表示 */ Lib_draw_cursor( xpos, ypos ); /* 取り込むチャネルNO */ if( SIM_CH01 == wChMode ) { ch_no[0] = CH0; ch_no[1] = CH1; } else { ch_no[0] = CH2; ch_no[1] = CH3; } /* メニュー制御 */ for (;;) { sts = 0; /* マウス位置読みとり */ Lib_look_current_position( &xpos, &ypos ); sts = Lib_see_current_position( &xpos, &ypos ); if ( old_xpos != xpos || old_ypos != ypos ) { /* マウス表示位置移動 */ Lib_move_cursor( xpos, ypos ); old_xpos = xpos; old_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 ); sim_set_pad(xpos+10, ypos+10 ); /* 取り込むチャネルNO再設定 */ if( SIM_CH01 == wChMode ) { ch_no[0] = CH0; ch_no[1] = CH1; } else { ch_no[0] = CH2; ch_no[1] = CH3; } 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 ); Lib_strtclk_count(); sim_freeze( ch_no ); Lib_time_disp( 1, 450 ); Lib_display_keyinput( 410, 410, "確認" ); /* 取込映像の待避 */ sim_image_to_memory(); Lib_freerun(); 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 ); sim_image_disp( ch_no ); Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); main_menu_disp(); } /* 表示チャネル */ else if ( xpos > MENU_4_XS && xpos < MENU_4_XE && ypos > MENU_4_YS && ypos < MENU_4_YE ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); main_channel_select(); 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 init_sys() { /* 入力ビデオ制御 */ 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_freerun(); } /* メインメニュー表示 */ static void main_menu_disp( void ) { int iLanguage; /* 日本語/英語表示文字列切替情報取得 */ iLanguage = Lib_get_disp_language(); /* 整列キー表示 ( m_menu.c の中に実体 ) */ SUB_menu_disp4he( (char *)sim_main_menu[0][iLanguage], (char *)sim_main_menu[1][iLanguage], (char *)sim_main_menu[2][iLanguage], (char *)sim_main_menu[3][iLanguage] ); } /* ヘルプ表示 */ static void disp_help( void ) { int fx_size, fy_size; int column, line; fx_size = Lib_get_fx_size(); fy_size = Lib_get_fy_size(); Lib_view( 0, 0, fx_size-1, fy_size-1, GRAPH_ERAS ); column = 5; line = 1; Lib_chrdisp( column-1, line, "【機能\概要】2チャネル同時取込 2SIM_RX.EXE" ); line+=2; Lib_chrdisp( column, line, "2チャネル同時取込を行います。" ); line++; Lib_chrdisp( column, line, "本サンプルでは「CH0とCH1」または「CH2&CH3」の" ); line++; Lib_chrdisp( column, line, "同時取込を行います。" ); line++; Lib_chrdisp( column, line, "本サンプルは902(RICE)のみで実行可能\です。" ); line++; line++; Lib_chrdisp( column, line, "[取込チャネル] 同時取込チャネル(「CH0&CH1」か「CH2&CH3」)を" ); line++; Lib_chrdisp( column, line, " 選択します。" ); line++; line++; Lib_chrdisp( column, line, "[画像取込] 同時取込を実行します。" ); line++; line++; Lib_chrdisp( column, line, "[画像表\示] 取り込み済みの画像を表\示します。" ); line++; line++; Lib_chrdisp( column, line, "[表\示チャネル] モニタに表\示するチャネルの選択を行います。" ); line++; line++; Lib_chrdisp( column, line, "-----------------------------------------------------------" ); line++; Lib_chrdisp( column-1, line, "[備考]2チャネル同時取込には下記の制限があります。" ); line++; line++; Lib_chrdisp( column, line, " ・ 同時取込が可能\な組み合わせは、      " );line++; Lib_chrdisp( column, line, "  「CH0&CH1」か「CH2&CH3」の2通りのみです。" ); line++; Lib_chrdisp( column, line, " ・ カメラの同期信号は「外部で同期」されている" ); line++; Lib_chrdisp( column, line, "   必要があります。             " ); line++; Lib_chrdisp( column, line, " ・ ランダムトリガ取込は使用できません。   " ); line++; Lib_chrdisp( column, line, " ・ カメラ接続モードが「ノーマルカメラモード」" ); line++; Lib_chrdisp( column, line, "   である必要があります。          " ); line++; line++; Lib_chrdisp( column, line, "(詳しくは902取扱説明書をご参照下さい。)" ); line++; Lib_display_keyinput( 430, 400, "確 認" ); Lib_memory_clear( CHAR_PLANE ); Lib_view( 0, 0, fx_size-1, fy_size-1, GRAPH_DRAW ); } /*設定パッドデーブル */ #define PARAM_SET_PAD_ITEM_N 2 /* 項目数 */ static const char *set_param_menu[][KIND_LANGUAGE] = { { "Param Set", "パラメータ設定" }, { "Input Ch", "取込チャネル" } }; static const char *sim_mode_select_table[3] = { "CH0&CH1" , "CH2&CH3" }; /* パラメータ設定 */ static int sim_set_pad( int x_pos, int y_pos ) { int language, old_max_string; int column; int no, i; int pad_level; int row[PARAM_SET_PAD_ITEM_N]; int item_n, width, height; PVAL value[6]; language = Lib_get_disp_language(); old_max_string = Lib_get_pad_maxstring(); Lib_set_pad_maxstring( strlen(set_param_menu[1][language]) ); /* レイアウトの設定 */ item_n = PARAM_SET_PAD_ITEM_N; Lib_get_standard_key_size( &width, &height ); for( row[0] = PAD_MARGIN+5, i = 1; i < item_n ; i++ ) row[i] = row[i-1] + height + PAD_MARGIN; column = PAD_MARGIN+2; /* パッドのオープン */ pad_level = Lib_view_open(); /* パッドタイトル設定 */ Lib_view_set_title( pad_level, (char*)set_param_menu[TITLE_ON_TABLE][language] ); /* パッドメニュー設定 */ i = 0; /*チャネルの選択*/ Lib_view_set_select( pad_level, column, row[i], (char*)set_param_menu[i+1][language], wChMode, 2, (char **)sim_mode_select_table, i ); i++; Lib_view_set_size( pad_level, x_pos, y_pos, PAD_MARGIN+10, PAD_MARGIN+10 ); Lib_draw_menu2( pad_level ); /* get menu2_value */ if( ERROR_RETURN != ( no = Lib_process_menu2( pad_level, value ) ) ) { switch( no ) { case PAD_EXECUTE: i = 0; /* チャネルの選択 */ if( wChMode != value[i].select_type ) { wChMode = value[i].select_type; wInputFlg = OFF; /* 取込チャネル変更のため入力フラグOFF */ } i++; break; case PAD_CANCEL: break; } } Lib_erase_menu( pad_level ); Lib_view_close( pad_level ); Lib_set_pad_maxstring( old_max_string ); return( no ); } /* 同時取込実行 */ static void sim_freeze( int ch_no[] ) { int cur_ch; cur_ch = Lib_get_video_channel(); /* カレントチャネル変更 */ if( ch_no[0] != cur_ch ) { Lib_xvideo_channel( NO_WAIT, ch_no[0] ); } /* 同時取込モードへ変更 */ Lib_set_video_input_mode( SIM_VIDEO_MODE, ch_no[0] ); /* 取り込むメモリの選択 */ Lib_set_sim_gray_memory( ch_no[0], waMemNo[SIM_1] ); Lib_set_sim_gray_memory( ch_no[1], waMemNo[SIM_2] ); Lib_freeze( NOT_TRANSMIT ); wInputFlg = ON; /* 取込フラグON */ /* 通常入力モードへ戻す */ Lib_set_video_input_mode( NORMAL_VIDEO_MODE, ch_no[0] ); if( ch_no[0] != cur_ch ) { Lib_xvideo_channel( NO_WAIT, cur_ch ); } } static const char *menu_string[4] = { "CH 0", "CH 1", "CH 2", "CH 3" }; /* 取込画像表示 */ static void sim_image_disp( int ch_no[] ) { int cur_mem_no; char string[20]; if( ON == wInputFlg ) { cur_mem_no = Lib_get_gray_memory(); Lib_freeze( NOT_TRANSMIT ); Lib_gray_memory_move( waMemNo[SIM1_MEM],cur_mem_no,0xFF ); Lib_xvideo_transmit( cur_mem_no, GRAY_PLANE ); Lib_sprintf( string, "%s", menu_string[ch_no[0]] ); Lib_display_keyinput( 410, 410, string ); Lib_gray_memory_move( waMemNo[SIM2_MEM],cur_mem_no,0xFF ); Lib_xvideo_transmit( cur_mem_no, GRAY_PLANE ); Lib_sprintf( string, "%s", menu_string[ch_no[1]] ); Lib_display_keyinput( 410, 410, string ); Lib_memory_clear( GRAY_PLANE ); Lib_freerun(); } else { Lib_display_message( 100, 150, "エラー", "先に画像取込を実行して下さい。" ); } } /* 取込画像をメモリへ待避 */ static void sim_image_to_memory() { Lib_gray_memory_move( waMemNo[SIM_1],waMemNo[SIM1_MEM],0xFF ); Lib_gray_memory_move( waMemNo[SIM_2],waMemNo[SIM2_MEM],0xFF ); } #define NO_ITEM_N 2 /* 項目数 */ PRIVATE const BYTE *cpNoTable[][KIND_LANGUAGE] = { { "Channel" , "表\示チャネル" }, { "Disp Channl" , " 表\示チャネル " } }; /* 表示チャネル設定 */ static void main_channel_select() { PVAL value[NO_ITEM_N]; int width, height; int pad_level; int row[NO_ITEM_N], column; int no; int wProcess; int wLanguage; int i, wItemN; int old_max_string; int cursor_xpos, cursor_ypos; char baString[64]; int wCh; /* レイアウトの設定 */ wItemN = NO_ITEM_N; Lib_get_standard_key_size( &width, &height ); for( row[0] = PAD_MARGIN+5, i = 1; i < wItemN; i++ ) row[i] = row[i-1] + height + PAD_MARGIN; column = PAD_MARGIN+2; wLanguage = Lib_get_disp_language(); wCh = wMainCh; old_max_string = Lib_get_pad_maxstring( ); Lib_set_pad_maxstring( strlen(cpNoTable[1][wLanguage]) ); Lib_set_pad_execute_field( "Apply", "更 新" ); Lib_set_pad_cancel_field ( "Canc", "取消" ); /* オーバーラップテーブルオープン */ pad_level = Lib_view_open(); /* メニューの登録 */ /*タイトル設定*/ Lib_sprintf( baString,"%s", cpNoTable[TITLE_ON_TABLE][wLanguage] ); Lib_view_set_title( pad_level, baString ); i = 0; /*表示チャネル*/ Lib_view_set_uniq_numeral( pad_level, column, row[i], (char *)cpNoTable[i+1][wLanguage], wCh, 0, 3, i ); Lib_set_paradigm( pad_level, i, WHOLE_TIMING, set_channel ); i++; /* パッドサイズの登録 */ Lib_view_set_size( pad_level, 100, 100, PAD_MARGIN+15, PAD_MARGIN+15 ); /*パッドの表示*/ if( NORMAL_RETURN == Lib_draw_menu2( pad_level )) { for( wProcess = ON; ON == wProcess; ) { if( ERROR_RETURN != ( no = Lib_process_menu2( pad_level, value ) ) ) { Lib_look_current_position( &cursor_xpos, &cursor_ypos ); switch( no ) { case PAD_EXECUTE: i = 0; wCh = value[i].value_type; i++; wMainCh = wCh; wProcess = OFF; break; case PAD_CANCEL: wProcess = OFF; break; } Lib_draw_cursor( cursor_xpos, cursor_ypos ); } else { wProcess = OFF; } } Lib_erase_menu( pad_level ); } /* オーバーラップテーブルクローズ */ Lib_view_close( pad_level ); Lib_set_pad_maxstring( old_max_string ); } /* パラダイム(表示チャネル設定)*/ static void set_channel( int timing, int num, PARADIGM taVal[] ) { switch( timing ) { case PROCESS_TIMING: Lib_xvideo_channel( WAITING, taVal[0].long_type ); break; } }