LVGL Playerでは入力デバイスとしてLCD画面上に貼られたタッチパネルとBluetooth接続されたゲームパッド(DualShock4, DualSense, 8Bitdo Zero2)をサポートしています。LVGLにおいては、4種類の入力デバイス -- POINTER, KEYPAD, ENCODER, BUTTON -- をサポートすることができますので、LCDのタッチパネルは LV_INDEV_TYPE_POINTERとして接続し、ゲームパッドはLV_INDEV_TYPE_KEYPADとして接続することになります。
しかしながら、KEYPAD型は基本的にはキーボードとかテンキーを意識したものであって、必ずしもゲームパッドには向いているとは言えません。まず、全てのボタンは何らかのキーに対応づけて表現するしかありません。画面の制御用にいくつかのキー名が予め定義されていますが、ゲームパッド上の全てのボタンやキーを適切に表現できるわけでもありません。例えばゲームパッド上の方向キーをLV_KEY_LEFT, LV_KEY_RIGHT, LV_KEY_UP, LV_KEY_DOWNに対応づけるのは自然な割り当てだと思いますが、"L1/R1, L2/R2ボタンはどうしようか?" ということになります。どうしてもこれらのボタンを区別してLVGL上で使いたければ、自分でキーコードを定義して扱うしかありません。また、アナログジョイスティックのように、可変量を表す機能は用意されていないので、別途独自に処理を用意する必要があります。
このような制約のためにゲームパッド上の全てのボタンやスイッチをLVGLのKEYPADデバイスとして素直に表現することはできませんが、上述の画面制御用のキーへの対応付けができれば、画面上に配置された基本的なWidgetのGUI操作はゲームパッドを使って行うことができます。SliderのようなWidgetでも、方向キーを使って値を増減することができますが、増減はインクリメント/デクリメントしかできないので、値の範囲が広い場合には使い勝手が悪くなってしまいます。前記事で示した設定画面の場合には、音量/輝度はスライダーで操作できますが、キーパッドを使った場合の操作性を考慮して、0..10の11段階で値を変化させることにしました。 (Slider Widgetは、ディフォルトでは 0..100の範囲となっている)
ゲームパッドを使う際のもうひとつの問題は、Gesture操作の検出です。設定画面は、画面の上から下へのスワイプ操作で行うことにしましたが、これをゲームパッドの方向キーを使って検出させるためには、かなりの速度でキーを連打する必要があり、現実的ではありません。幸いなことに、DualSenseやDualshock4にはゲームパッド上にタッチパッドが用意されており、LCD画面上のタッチパネルと同じようにタッチされた座標の検出が可能です。そこで、タッチパッドがタッチされた時には、その座標をLCDのタッチパネルの座標系に変換してLVGLにはLCDタッチパネルが操作されたように見せかけてレポートすることにしました。この方法により、ゲームパッドを持ったまま、タッチパッド部分をスワイプすることで設定画面の呼び出し操作が行える様になりました。
以下、スワイプ操作による画面遷移の様子をキャプチャしてみました。