TouchGFXを使おう7～ハードウェアボタン編～

TouchGFXを使おう6～Lチカ編２～の続きです。

https://qiita.com/usashirou/items/7b388420e94a9d0fedab

TouchGFXでハードウェアボタンを使ってみましょう。
# 画面の製作
新規プロジェクトを作成します。
今回は、2枚のスクリーンをハードウェアボタンと画面のボタンで行き来するプログラムにします。
# インタラクションの設定
2枚のスクリーンを作成し1枚目のスクリーンのインタラクションを以下に設定します。
||Interaction1|
|---|:-:|
|Trigger|Hardware button is clicked|
|Choose button key|1|
|Action|Change screen|
|Choose screen|Screen2|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b364d2c4-c193-1603-6c7d-8caed6a7dd1e.png)
# ピン設定
コード生成を行い、STM32CubeIDEでプロジェクトをインポートしiocファイルを開きます。
今回、PC13がスイッチにつながっていますので、PC13に割り込みの設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/df306f6e-4f8a-21d9-24f7-2405c249129a.png)
# 割り込み設定
__PC13__ を選択し、__GPIO_EXIT13__ を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6c879240-fa30-209c-0ccc-e3ee42e3a9ee.png)
__NVIC__ から __EXIT line[15:10]interrupts__ のチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9594a114-277b-3b86-bb27-f661b058b95d.png)
それでは、__Generation__ しましょう、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/71d7a496-b941-5b1f-3d01-2ac06691df2e.png)
Warningが出ますが __Yes__ で進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6162f98f-ff2b-06ba-7d32-60c3b2fc860e.png)
TouchGFXでも変更されたことが表示されますのでYesをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/924e233a-27bd-d7b5-bd99-7552871c9f1c.png)
# プログラムファイルを追加する
__Application/User/Coreフォルダ__ に __MyButtonController.cpp__ を追加します。
__ファイル⇒ソース・ファイル⇒ソース・フォルダー、ソース・ファイル名__ を入力します。
__ソース・フォルダ：Application/User/Core
ソース・ファイル名：MyButtonController.cpp__ とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/74df1721-be9c-9de3-1021-2a9780ede6d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8bb1576a-1d8a-8029-31f8-7090c8f44d62.png)
__MyButtonController.cpp__ が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c547f917-1708-a1f9-ca5d-4fefba8090e0.png)
```
/*
 * MyButtonController.cpp
 *
 *  Created on: Feb 1, 2025
 *      Author: user
 */

#include <MyButtonController.hpp>
#include <main.h>
#include <touchgfx/hal/HAL.hpp>

void MyButtonController::init()
{
	previousState = 0xFF;
}

bool MyButtonController::sample(uint8_t& key)
{

    if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET)
    {
    	if (previousState == 0xFF)
    	{
    		previousState = 0x00;
   // 		User_ButtonState = 0x00;
	        key = 1;
	        return true;
    	}
    	return false;
    }

    previousState = 0xFF;
    return false;
}
```
# ヘッダーファイルを追加する
次にヘッダーファイル __MyButtonController.hpp__ を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f17a742b-cd3a-0529-49d7-9b91efff836a.png)
```
/*
 * MyButtonController.hpp
 *
 *  Created on: Feb 1, 2025
 *      Author: user
 */

#ifndef APPLICATION_USER_CORE_MYBUTTONCONTROLLER_HPP_
#define APPLICATION_USER_CORE_MYBUTTONCONTROLLER_HPP_

#include <platform/driver/button/ButtonController.hpp>

class MyButtonController : public touchgfx::ButtonController
{
    virtual void init();
    virtual bool sample(uint8_t& key);


private:
    uint8_t previousState;
};
#endif /* APPLICATION_USER_CORE_MYBUTTONCONTROLLER_HPP_ */
```
# ヘッダーファイルを移動する
__MyButtonController.hpp__ をエクスプローラで
__\MyApplication_button\Core\Inc__ に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ed11b3bd-94b8-74a3-e2f0-358bfc14b8ee.png)
# TouchGFXHAL.cppの修正
最後に __\TouchGFX\target\TouchGFXHAL.cpp__ を修正します。
以下3行を追加します。
```
#include <MyButtonController.hpp>
MyButtonController bc;
```
    setButtonController(&bc);
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8341eb96-90a9-d703-5b1c-87bf20092d74.png)
以上でボタンを押すとScreen1からScreen2に移動するプログラムになりました。

TouchGFXを使おう8～ADC編～に続きます。