見出し画像

M5Stack Core2タッチパネル 自主トレ 

1.M5.Touchクラス getPressPointでタッチパネル座標を取得する

#include <M5Core2.h>

//Buttonクラスの練習帳

#define LCDWIDE 320
#define LCDHEIGHT 240

TFT_eSprite canvas = TFT_eSprite(&M5.Lcd);


void setup()
{
    M5.begin();
    canvas.setColorDepth(8); // Set color depth.  
    canvas.setTextSize(2);
    canvas.createSprite(320, 240);  //Create a 320x240 canvas.
    uint8_t interval = M5.Touch.interval();
    Serial.printf("M5Touch interval:%d\r",interval);//default:13ms
    //Strangely, the value 13 leads to slightly more frequent updates than 10
    //(Still not every 13 ms, often more like 15 to 20)
}

void loop()
{
   //クラス配列の初期化の仕方
   static TouchPoint_t coordinate[2]={Point(0,0),Point(0,0)};
   //タッチパネル getPressPointのエラー値
   static TouchPoint_t errPt(-1,-1);//getPoint invalid value.
  
   //パネルが押されているか?
   //FT6336はWire1(G21:SDA G22:SCL)を使用。
   //他のデバイスとの兼ね合いで、INTpin(G39)をポーリング。
   if(M5.Touch.ispressed())//INT wire polled mode 
   {
        coordinate[0] = M5.Touch.getPressPoint();//タッチ座標の取得
        if(M5.Touch.changed)//変化あり?
        {
            //エラーだったら描画しない。
            //演算子!=のオーバロードでPointクラスを比較。
            if(errPt!=coordinate[0])//getting point is set to an invalid value?
            {
                //Serial.printf("%d,%d\r",coordinate[0].x, coordinate[0].y);
                canvas.fillCircle(coordinate[0].x,coordinate[0].y,80,ORANGE);
                canvas.fillCircle(coordinate[1].x,coordinate[1].y,80,BLACK);
                canvas.pushSprite(0,0);
                coordinate[1].set(coordinate[0].x,coordinate[0].y);
            }
        }
   }
}

2.M5.Touchクラス HotZoneを使って図形をドラッグする。

#include <M5Core2.h>

//M5.Touch クラスの練習帳2
//HotZonの追跡、ドラッグする

#define LCDWIDE 320
#define LCDHEIGHT 240
#define HOTZONE_WIDE 100
#define HOTZONE_HEIGHT 100
#define HOTZONE_HALF_SIZE 50


//移動量
typedef struct main
{
    int16_t x;
    int16_t y;
}differentialDelta ;

differentialDelta  dt;//移動ベクトル


//スプライトインスタンス
TFT_eSprite canvas = TFT_eSprite(&M5.Lcd);

//クラス配列の初期化の仕方 //TouchPoint_t(実体はPoint)
static TouchPoint_t coordinate[2]=
        {Point(LCDWIDE/2-HOTZONE_HALF_SIZE,LCDHEIGHT/2-HOTZONE_HALF_SIZE),
            Point(LCDWIDE/2-HOTZONE_HALF_SIZE,LCDHEIGHT/2-HOTZONE_HALF_SIZE)};

//タッチパネル座標
static TouchPoint_t tpCoordinate[2]={Point(0,0),Point(0,0)};

//タッチパネル getPressPointのエラー値
static TouchPoint_t errPt(-1,-1);//getPoint invalid value.

//HotZone Callback関数
void hotZone1Callback(void);

//HotZoneインスタンス初期化。Top-LeftとBottom-Right で枠指定。
HotZone hotZone1(LCDWIDE/2-HOTZONE_HALF_SIZE,LCDHEIGHT/2-HOTZONE_HALF_SIZE,
                 LCDWIDE/2+HOTZONE_HALF_SIZE,LCDHEIGHT/2+HOTZONE_HALF_SIZE,
                                                             &hotZone1Callback);

//HotZoneコールバック関数定義
void hotZone1Callback(void)
{
    //新しいタッチポイント座標で、移動ベクトルを求める。
    dt.x = tpCoordinate[1].x - tpCoordinate[0].x;
    dt.y = tpCoordinate[1].y - tpCoordinate[0].y;
    //HotZoneのTop-Left座標に加算。
    coordinate[0].x-=dt.x;
    coordinate[0].y-=dt.y;
#if 0
    Serial.printf("[0](%d,%d)\r",tpCoordinate[0].x,tpCoordinate[0].y);
    Serial.printf("[1](%d,%d)\r",tpCoordinate[0].x,tpCoordinate[0].y);
    Serial.printf("dt x:%d y:%d\r", dt.x, dt.y);
    Serial.printf("[0](%d,%d)\r",coordinate[0].x,coordinate[0].y);
#endif 
    //HotZoneを再設定。
    hotZone1.setZone(coordinate[0].x,
                     coordinate[0].y,
                     coordinate[0].x + HOTZONE_WIDE,
                     coordinate[0].y + HOTZONE_HEIGHT,
                     &hotZone1Callback);   
}

//setup関数
void setup()
{
    M5.begin();
    canvas.setColorDepth(8);  
    canvas.setTextSize(2);   
    canvas.createSprite(320, 240);  //Create a 320x240 canvas.
    canvas.drawRect(LCDWIDE/2-HOTZONE_HALF_SIZE,LCDHEIGHT/2-HOTZONE_HALF_SIZE,
                      HOTZONE_WIDE,HOTZONE_HEIGHT,DARKGREEN);
                      uint8_t interval = M5.Touch.interval();
    //タッチパネル interval(ms)
    //Serial.printf("M5Touch interval:%d\r",interval);//default:13ms
    //Serial.printf("origin(%d,%d),w:%d h:%d)\r",hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h);
    canvas.pushSprite(0,0);
}

//FT6336はWire1(G21:SDA G22:SCL)を使用。
//他のデバイスとの兼ね合いで、INTpin(G39)をポーリング。
void loop()
{
   //パネルが押されているか?サンプリング間隔は、13ms
   if(M5.Touch.ispressed())//INT wire polled mode 
   {
        tpCoordinate[0] = M5.Touch.getPressPoint();//タッチ座標の取得
        if(tpCoordinate[1].x==0 && tpCoordinate[1].y==0)
        {
            tpCoordinate[1]=tpCoordinate[0];
        }
        if(M5.Touch.changed)//座標の変化あり?
        {
            //Point座標エラーinvalid value(-1,-1)だったら描画しない。            
            if(errPt!=tpCoordinate[0])//演算子!=のオーバロードでPointクラスを比較。
            {                       
                //前位置の図形の消去
                canvas.fillRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,BLACK);         
                //HotZone内をタッチしているか?
                if(hotZone1.inHotZoneDoFun(tpCoordinate[0]))//HotZone内ならCallback実行。
                {//HotZone内にタッチ                                        
                    //Callback関数内で、HotZoneが新しい座標に移動したので、再描画。
                    canvas.fillRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,DARKGREEN);                    
                }else
                {//HotZone外でタッチ
                    //HotZoneの外でタッチなので、移動しないで描画。
                    canvas.drawRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,DARKGREEN);
                    canvas.pushSprite(0,0);
                }
                //タッチ座標の保存
                tpCoordinate[1].set(tpCoordinate[0].x,tpCoordinate[0].y);
                canvas.pushSprite(0,0);
            }
                           
        }
   }else
   {//タッチされていない
        tpCoordinate[1].set(0,0);
        canvas.fillRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,BLACK);
        canvas.drawRect(hotZone1.x,hotZone1.y,hotZone1.w,hotZone1.h,DARKGREEN);
        canvas.pushSprite(0,0);
   }
   delay(1);
}


この記事が気に入ったらサポートをしてみませんか?