ポインターインプットデバイス(PID)

emWinはポインタインプットデバイスに対応しています。タッチスクリーン、マウスまたはジョイスティックを利用できます。emWin基本パッケージには、アナログタッチスクリーン、PS2のマウスドライバだけでなく、サンプルとしてジョイスティックドライバが含まれています。タッチパネルとマウス以外も、適切なドライバを使用することができます。入力デバイス用のソフトウェアは、サブディレクトリGUI\Coreに位置しています。

 

一つのアプリケーションで複数のポインタインプットデバイスを同時に使用することができます。、イベント(マウスの移動やタッチスクリーンの操作)が検出されるたびにPIDドライバはGUI_PID_StoreState()を呼び出します。 通常ウィンドウマネージャがPIDイベントに対応しますが、ウィンドウマネージャが非アクティブ状態の時はアプリケーションがPIDのイベントに反応する必要があります。

 

マウスドライバの汎用API

API説明
GUI_MOUSE_GetState() 現在のマウスの状態を返す
GUI_MOUSE_StoreState() 現在のマウスの状態を保持する

 

タッチスクリーンドライバの汎用API

API説明
GUI_TOUCH_GetState() 現在のタッチスクリーンの状態を返す
GUI_TOUCH_StoreState() 現在のタッチスクリーンの状態をxy座標を用いて保持する
GUI_TOUCH_StoreStateEx() 現在のタッチスクリーンの状態を保持する

 

ジョイスティックを利用した時のプログラム例

/*********************************************************************
*
*         _JoystickTask
*
* Purpose:
*   Periodically read the Joystick and inform emWin using
*   GUI_PID_StoreState.
*   It supports dynamic acceleration of the pointer.
*   The Joystick is a simple, standard 5 switch (digital) type.
*
*/
static void _JoystickTask(void) {
  GUI_PID_STATE State;
  int Stat;
  int StatPrev = 0;
  int TimeAcc = 0;   // Dynamic acceleration value
  int xMax, yMax;
 
  xMax = LCD_GetXSize() - 1;
  yMax = LCD_GetYSize() - 1;
  while (1) {
    Stat = HW_ReadJoystick();
    //
    // Handle dynamic pointer acceleration
    //
    if (Stat == StatPrev) {
      if (TimeAcc < 10) {
        TimeAcc++;
      }
    } else {
      TimeAcc = 1;
    }
    if (Stat || (Stat != StatPrev)) {
      //
      // Compute the new coordinates
      //
      GUI_PID_GetState(&State);
      if (Stat & JOYSTICK_LEFT) {
        State.x -= TimeAcc;
      }
      if (Stat & JOYSTICK_RIGHT) {
        State.x += TimeAcc;
      }
      if (Stat & JOYSTICK_UP) {
        State.y -= TimeAcc;
      }
      if (Stat & JOYSTICK_DOWN) {
        State.y += TimeAcc;
      }
      //
      // Make sure coordinates are still in bounds
      //
      if (State.x < 0) {
        State.x = 0;
      }
      if (State.y < 0) {
        State.y = 0;
      }
      if (State.x >= xMax) {
        State.x = xMax;
      }
      if (State.y > yMax) {
        State.y = yMax;
      }
      //
      // Inform emWin
      //
      State.Pressed = (Stat & JOYSTICK_ENTER) ? 1: 0;
      GUI_PID_StoreState(&State);
      StatPrev = Stat;
    }
    OS_Delay(40);
  }
}

 

emWinホームに戻る 


 
SEGGER
RTOS&Middleware