05092024

Last update2016/05/28 14:38

Back 現在地: Home パートナー segger-tools タッチスクリーンのサポート

タッチスクリーンのサポート

 

タッチスクリーンのサポート

emWinはタッチスクリーンをサポートしています。

emWinのためのタッチスクリーンのサポートが利用可能になりました。これは、アナログ入力(8ビットまたはADコンバータより良いから)、デバウンスおよびタッチスクリーンのキャリブレーションを処理する低レベルのドライバが含まれています。ウィンドウマネージャのタッチメッセージと、ボタンオブジェクトなどのウィジェットを扱う。その後、自動的にタッチメッセージを処理し、それに応じて反応するボタンや他のウィジェットを、作成するコードの1つしか線を取ります。ウィジェットは、それらがとても柔軟に異なる属性を持っている。ほとんどの場合、デフォルトの属性が正常であるので、それらを使用するのは簡単です。もちろん、タッチスクリーンのサポートは、シンプルなANSI -"C"で書かれています。

タッチスクリーンのシミュレーション

タッチスクリーンのシミュレーションは、通常のemWinシミュレーションに統合されています。マウスイベントは、タッチスクリーンをシミュレートするために使用されています。表示領域の任意の場所でマウスの左ボタンを押すと、同じ効果は、実際のハードウェアでタッチパネルに触れているしている。実際のアプリケーションが正確にシミュレーションのように振る舞うことはいうまでも。シミュレーションは、アプリケーションのユーザーインターフェイスを記述すると議論、デモや検証のために誰にも簡単なexeファイルとして送信することができます使用することができます。

私はタッチをサポートするためにマルチタスクが必要ですか?

いいえ。タッチスクリーンは(毎秒通常100回)定期的にポーリングする必要がありますが、これはリアルタイムOSの助けを借りて行うことが持っていない。また、タイマ割り込みを使用するか、単純にタッチスクリーンをポーリングすることができます。

サンプルプログラム

以下に、あなたは、サンプルプログラムの2 screenhotsを参照してください。このサンプルプログラムは、コンパクトで理解し易いです。
"C"コードの約300行で私たちは、あなたがどのように(必要に応じて)タッチスクリーンを較正するためにイベントやに反応するかもしれないか、それはボタンを作成することがいかに簡単かを示しています。このサンプルでは、ディスプレイ上のantire"タッチ"キーボードを作成します。サンプルシミュレーションをダウンロードしてください!(150KB)(この先は英語になります。)
スクリーンショットのタッチスクリーン
スクリーンショットのシミュレーションの開始 スクリーンショットのシミュレーションのキーボード

サンプルプログラムの"C"のソース


/************************************************* ********************
* SEGGERマイクロ社&Co.KG *
*リアルタイムマイクロコントローラアプリケーションのためのソリューション*
************* ************************************************** *******
* *
*(C)2000 SEGGERマイクロ社&Co.KG *
* *
*インターネット:www.segger.comのサポート: このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。 *
* *
******** ************************************************** ************ ファイル:Main.cppで目的:ウィンドウのシミュレータでのアプリケーションプログラム-------------------------- - END - OF - HEADER ------------------------------ * / #"GUI.hが"含まれています#"GUITouchを含む。 hは"/ * GUIxに位置し、GUITouch.conf.h *を含む/予定の#include"Button.hは" Edit.hに"#include" のextern constのGUI_BITMAP bmSeggerLogoBlueを、#countofを(OBJ)を定義 ExecCalibration * ************************************************ ********************** * / ボイドExecCalibration(ボイド){ int型ax_Phys [2]、ay_Phys [2]; / *は、ログを計算する。位置* / const intに斧[2] = {15、LCD_XSIZE - 1 - 15}; const intにAY [2] = {15、LCD_YSIZE - 1 - 15}; GUI_TOUCH_SetDefaultCalibration(); / *は、左上の*のキャリブレーション/ GUI_SetBkColor( GUI_RED); GUI_Clear(); GUI_SetColor(GUI_WHITE); GUI_FillCircle(斧[0]、AY [0]、10); GUI_SetColor(GUI_RED); GUI_FillCircle(斧[0]、AY [0]、5); GUI_SetColor(GUI_WHITE ); GUI_DispStringAt("ここに押して"、斧[0] +20、AY [0]); }何 GUI_TOUCH_tState状態を、 GUI_TOUCH_GetState(&国)、 場合(State.PressedCnt){ ax_Phys [0] = GUI_TOUCH_GetxPhys(); ay_Phys [ 0] = GUI_TOUCH_GetyPhys(); 休憩; } ; GUI_Delay(100) (1)}一方、/ * * /解放するためにユーザーに知らせる GUI_Clearを(); GUI_DispStringAt("OK"、斧[0] +20、AYは[0] ); です{ ; GUI_TOUCH_tState州立 GUI_TOUCH_GetState(&状態)、 (State.PressedCnt == 0なら){ 休憩; } GUI_Delay(100); }(1)中には、/ *右下* /キャリブレーション GUI_SetBkColor(GUI_RED); GUI_Clear( ); GUI_SetColor(GUI_WHITE); GUI_FillCircle(斧[1]、AY [1]、10); GUI_SetColor(GUI_RED); GUI_FillCircle(斧[1]、AY [1]、5); GUI_SetColor(GUI_WHITE); GUI_SetTextAlign(GUI_TA_RIGHT ); GUI_DispStringAt("ここに押して"、斧[1] -20、AY [1]); }です 。GUI_TOUCH_tState州立 GUI_TOUCH_GetState(&国)、 場合(State.PressedCnt){ ax_Phys [1] = GUI_TOUCH_GetxPhys(); ay_Phys [ 1] = GUI_TOUCH_GetyPhys(); 休憩; } GUI_Delay(100); }(1)一方、 (GUI_COORD_X、斧[0]、斧[1]、ax_Phys [0]、ax_Phys [1])GUI_TOUCH_Calibrate、 GUI_TOUCH_Calibrate(GUI_COORD_Y、 AY [0]、AY [1]、ay_Phys [0]、ay_Phys [1]); } / * ************************** ******************************************** * * TestCalibration * ** ************************************************** ****************** * / ボイドTestCalibration(ボイド){ int型IdleCnt = 0; BUTTON_Handle hButton、 GUI_SetBkColor(GUI_RED); GUI_SetColor(GUI_WHITE); GUI_Clear(); hButton = BUTTON_Create(235、180、80、40、1,0); BUTTON_SetText(hButton、"ABORT"); BUTTON_SetFont(hButton、&GUI_FontComic18)、 中((IdleCnt <50)&&(wm_getkey()== 0="" span=""> 静的GUI_TOUCH_tState StateLast、 GUI_TOUCH_tState州、 GUI_TOUCH_GetState(&国)、 場合((StateLast.PressedCnt = State.PressedCnt)&&(State.PressedCnt == 0)){ GUI_Clear(); } !(IF(StateLast.x = State.x )| |((StateLast.y = State.y!))){ 場合(State.PressedCnt){ GUI_FillCircle(State.x、State.y、5); } StateLast =国家; } 場合(State.PressedCnt){ IdleCnt = 0; }他{ IdleCnt + +; } GUI_Delay ExecKeyboard * *関数の説明:これはサンプルのキーボードを作成するには、EnterキーまたはEscが押された後に*ルーチンを返します。************************** ******************************************** * / 静的char acText [ ] = {'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'0'、'=' 、'、 'Q'、'W'、'E'、'R'、'T'、'Y'、'U'、'I'、'O'、'P' 、'、'、'S' 、'D'、'F'、'G'、'H'、'J'、'K'、'L'、'Q' 、'、'Z'、'X'、'C'、'V '、'B'、'N'、'M'、'O'、'A'、'U' 、''、''、''、''、''、0、0 }; ボイドExecKeyboard(ボイド){ int型私、 int型のキー、 BUTTON_Handle ahButton [52]; BUTTON_Handle hButtonESC、 EDIT_Handle hEdit; GUI_RECT rText = {000,0、LCD_XSIZE、20}; GUI_SetBkColor(GUI_RED); GUI_Clear(); GUI_DrawBitmap(&bmSeggerLogoBlue、0、0) ; GUI_SetFont(&GUI_FontComic18); GUI_SetColor(GUI_WHITE); GUI_DispStringInRect("emWin"、&rText、GUI_TA_RIGHT | GUI_TA_VCENTER); rText.y0 + = 20; rText.y1 + = 20; GUI_DispStringInRect("タッチスクリーンのデモ"、&rText、GUI_TA_RIGHT | GUI_TA_VCENTER); / / / /キーボードのボタンを作成 / / I <51; i="0のために</span"> int型POS =(I <47)?I:4、 int型X0 = 5 + 28 *(POS%11)、 int型Y0 = 100 + 28 *(Pos/11); にchar c = acText [i]は、 int型イド= C; CHAR AC [2] = {0}; char *のS = AC、 AC [0] = C; ahButton [I] = BUTTON_Create(X0、Y0、25、25、ID、0); BUTTON_SetText(ahButton [i]は、秒); } ahButton [I + +] = BUTTON_Create(89、212、109、25、'、0); hButtonESC = BUTTON_Create(230、40、80、25、GUI_ID_CANCEL、0); BUTTON_SetText(hButtonESC、"ESC"); hEdit = EDIT_Create( 5、70、310、25、'、80、0); EDIT_SetFont(hEdit、&GUI_Font8x16); BUTTON_SetBkColor(ahButton [49]、0、GUI_RED); BUTTON_SetBkColor(ahButton [50]、0、GUI_BLUE); / * ハンドルESCまでキーボードまたはEnterが押された* / ループ: キー= WM_WaitKey(); スイッチ(キー){ ケースGUI_ID_CANCEL: 休憩; ケース0: デフォルト: EDIT_AddKey(hEdit、キー)、 後藤ループ; } / / / /クリーンアップ / / 用(i = 0のは、i USER_Task * ************************************************ ********************** * / ボイドUSER_Task(ボイド){ #ID_KEYBOARD 1定義 #ID_TESTCAL 2を定義 #ID_CALIBRATE 3定義 {(1)一方 、int型私R; GUI_RECT rText = {0,80、319、120}; BUTTON_Handle ahButton [3]; GUI_SetBkColor(GUI_BLUE); GUI_Clear(); GUI_DrawBitmap(&bmSeggerLogoBlue、(LCD_XSIZE - 1 - bmSeggerLogoBlue.XSize)/ 2、15); GUI_SetFont (&GUI_FontComic18); GUI_DispStringInRect("emWinのタッチスクリーンのデモ"、&rText、GUI_TA_HCENTER | GUI_TA_VCENTER); ahButton [0] = BUTTON_Create(110、140、100、50、ID_CALIBRATE、0); ahButton [1] = BUTTON_Create(70、200 、80、30、ID_KEYBOARD、0); ahButton [2] = BUTTON_Create(170、200、80、30、ID_TESTCAL、0); BUTTON_SetText(ahButton [0]、"補正"); BUTTON_SetBkColor(ahButton [0]、0 、GUI_RED); BUTTON_SetText(ahButton [1]、"キーボード"); BUTTON_SetText(ahButton [2]、"テストのキャリブレーション"); BUTTON_SetFont(ahButton [0]、&GUI_FontComic18)、 R = WM_WaitKey()、 (i = 0のためには、i BUTTON_Delete(ahButton [I]); } スイッチ(R){ ケースID_KEYBOARD:ExecKeyboard();休憩; ケースがID_CALIBRATE:ExecCalibration();休憩; ケースID_TESTCAL:TestCalibration();休憩; } } } / * ******************************************* *************************** * * TouchMan:タッチ桶(タスク)* *関数の説明:このタスクは、の場合に使用されていますシステムをマルチタスク。*その目的は、定期的なタッチハンドラGUI_TOUCH_Exec()を呼び出すことです。********************************* ************************************* * / #ifndefの_WIN32 静的なint型StackTouch [512]; / *スタック領域* / OS_TASK TCBTouch; / *タスクコントロールブロック* / 静的ボイドTouchMan(ボイド){ しますwhile(1)ターゲットシステムのmain()* ******************************************* ************************ * / #ifndefの_WIN32 int型Stack0 [512]; / *スタック領域* / OS_TASK TCB0; / *タスクの制御ブロック* / 無効メイン(ボイド){ OS_InitKern(); OS_InitHW(); / *共通* / GUI_Init(); / *タスクの作成* / OS_CREATETASK(&TCB0、"USER_Task"、USER_Task、100、Stack0); / * Task0 * /作成 / * Touchmanタスク* /; OS_CREATETASK(&TCBTouch、"TouchMan"、TouchMan、200、StackTouch)/ *スタート* /マルチタスク OS_Start(); / /マルチタスク開始を} #endifの/ * ****** ************************************************** *********** * *メイン()シミュレーションで* ******************************* ************************************ * / #ifdefの_WIN32 無効メイン(ボイド){ GUI_Init() ; USER_Task(); } #endifの