High High School Adventure for M5Stack Core/Core2 / M5Cardputer
ハイハイスクールアドベンチャーのM5Stack Core/Core2 および M5Cardputer 対応版です。 M5Unified, M5GFX, M5Cardputer 依存です。
データファイル群(*.dat)はSDカードに /HHSAdv を作りその中に入れてください。
ver 1.2 からBLEキーボードをサポートしました。 Faces などのキーボードがつながっていなかったら、BLEキーボードを探すようにしたかったのですが、Facesがつながっているかどうかの判別方法がわからなかったため、BtnAを長押ししていたらBLEキーボードを探すようにしました。
なお、BLEはNimBLEを使っているため、古いBTキーボードは使えません。BLEのものをご使用ください。また、ハイハイスクールアドベンチャーを遊んでいる限りはあまり関係ないですが、キーマップは英字配列を想定しています。
BLEキーボードに関しては、手探りの状態で、古めのBLEキーボードはどうやらうまく動きません。接続できるものの通知が来ないためキーを受け取れないのです。BuffaloのBSKBB335は使えますが、https://github.com/geo-tp/Bluetooth-Keyboard-Mouse-Emulator.git を使って CardpuerをBLEキーボード化したものは使えません。ただ、このアプリのBLEスタックをNimBLEで置き換えると動きます。
キーボードについては知見が集まりつつあり、大体のBLEキーボードで動作しています。
現状、BLEキーボードを選ぶ状態であることは間違えありません。
BLEキーボードの接続処理を変更しました。キーボードによってつながったりつながらなかったりする原因の一つは、キーボードによってはReport Dataのcharacteristicに対して、セキュアな接続でないとアクセスを許さないものがありました。(もしかするとこっちの方が多数派かもしれません)
なので、接続時に secureConnect()を発呼するように変更しました。この操作は、セキュアアクセスを要求しないキーボードに対しても特に問題はないようなので、すべてのケースで呼び出しています。
また、現在試したキーボード四種類でそれぞれ、キー入力を渡す Handleが異なっていて、このあたりをどう扱うのが正しいのかいまだにわかっていません。何か情報をお持ちの方は教えてください。 現在、22, 29, そして 41を受け付けています。
キーバッファの仕様は二種類あって、8バイトのものと11バイトのものがあります。このどっちなのかは、長さを見て判断しています。(ハンドルチェックいらないかも?)
画面のスケーリングをサポートしました。一応、M5.Displays(0).width(), M5.Displays(0).height()が表示装置と一致していれば、自動的にスケーリングしますが、この判別がうまく行かなかったとき、CTRL+Gで1.0->0.75->0.67->1.0と倍率を変更できます。
しかるのちさん(@shikarunoci)から、M5Atom に外部ディスプレイを接続してプレイするためのソースの差分をご提供いただきました。ver 1.6に統合いたしました。env:m5atomExDisplay でビルドしてください。 データファイルはdataの下にまとめましたので、PlatformIOのメニューから、Upload Filesystem Imageを使ってM5AtomのSPIFFSに転送してください。ビルド環境がARM64である場合、mkspiffs コマンドがないので、ご自分でビルドして、適切な場所においてから実行してください。
どちらのキーボードについても Fn キーとのコンビネーションでカーソルキーとして動作するキーが割り当てられている。 Copilotに聞くと「カーソルキーは存在しない」とか「キーコードが公開されていないから自分で調べろ」とかいわれるので、まあ自分で調べました。
基本的に M5 Facesはキーボード側が処理をして文字を渡してくるので、対応するキーコードに対して処理を行えばいい。
| キー | コード |
|---|---|
| ↑ | 0xB7 |
| ↓ | 0xC0 |
| ← | 0xBF |
| → | 0xC1 |
公開されていない理由は不明ですが、とにかくこれがM5 Facesのカーソルキーのキーコードになります。
M5 Cardputer については、キーマトリックスが露出した形で見えているので、渡されるのは押されたキーとModifierになります。
Shift, Ctrl, Alt は modifiersというフィールドにビットマップで渡されますが、Fnキーは fn という bool型のフィールドで押されているかどうかを判定します。
つまり、CardputerではFnキーは押しながらほかのキーを押す形になります。
カーソルキーに対応するキーは ';', ',', '.', '/' になりますので、これらと Fn キーが同時に押されていたらカーソルキーだと判定します。
というわけで、カーソルキーの処理にめどが立ったので、Ver 1.11 からメッセージエリアについてはスクロール可能になりました。最大で16行を保持しており、カーソルキーの上下でさかのぼることができます。
一部のメッセージについてはスクロールアウトしてしまっていたのをさかのぼって確認することができます。 まあ、たいてい大したことはいってないはずなのですが、時にクリアのためには必要になることもあるかと思います。