TouchGFXの動作に関する覚書です
TouchGFXのバックで動くメインループ
FreeRTOSのDefaultTaskにある。
コードジェネレータが勝手に作ってくれたかどうかは記憶にない。
ドキュメントには一定のサイクルで動作するようにとの記述があったような気がするがTaskDelay()とか入れなくて良いのだろうか。
/* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void *argument) { /* USER CODE BEGIN 5 */ /* Infinite loop */ for(;;) { MX_TouchGFX_Process(); } /* USER CODE END 5 */ }
Touchパネル状態読出し関数の呼び出し
コードジェネレータが自動生成したtarget\TouchGFXConfiguration.cppに記述する
/* USER CODE BEGIN STM32TouchController */ #include <STM32TouchController.hpp> extern "C" { int BU21025_Read(uint16_t *x, uint16_t *y); } void STM32TouchController::init() { /** * Initialize touch controller and driver * */ } bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y) { /** * By default sampleTouch returns false, * return true if a touch has been detected, otherwise false. * * Coordinates are passed to the caller by reference by x and y. * * This function is called by the TouchGFX framework. * By default sampleTouch is called every tick, this can be adjusted by HAL::setTouchSampleRate(int8_t); * */ BU21025_Read(&x, &y); if(10 < x){ return true; } return false; } /* USER CODE END STM32TouchController */
画面のボタン等を操作したときに呼び出す関数の設定について
new virtual functionを追加すると
TouchGFX/generated/gui_generated/src/screen_screen/screenViewBase.cpp
に宣言が出来るがこれを直接編集出来ないので、派生クラスを自分で書いてオーバーライドした関数で呼び出そうとするとその関数には飛ばない。
出来るだけC++には関わりたくないがTouchGFXを使えるようにするために試行錯誤した結果、下記のサイトで解決した。
要するにSTM32CubeIDEを使ってTouchGFX下のディレクトリにあるソースに関数を追加しなさいということらしい。
サイトで紹介された手順通りにやればちゃんと動いたのでC++の闇についてはこれ以上考えないことにした。