ハイハイスクールアドベンチャー_m5stack_m5cardputer版
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
ハイハイスクールアドベンチャー_m5stack_m5cardputer版 [2024/11/06 03:17] – [BTキーボードをつなごう] araki | ハイハイスクールアドベンチャー_m5stack_m5cardputer版 [2024/12/09 02:30] (現在) – [BTキーボードをつなごう] araki | ||
---|---|---|---|
行 321: | 行 321: | ||
{ | { | ||
uint8_t c = input[i]; | uint8_t c = input[i]; | ||
- | if (c == 0) break; | + | if (c == 0) continue; |
if (memchr(buf, | if (memchr(buf, | ||
} | } | ||
行 329: | 行 329: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | == つながるキーボードつながらないキーボード == | ||
+ | |||
+ | BLEキーボードっていっているのにつながるやつとつながらないやつがありまして、なんでだろうと思っていたのです。 | ||
+ | 思えば、最初にテストに使った、バッファローのBSKBB335がつながる方のやつだったので、深く考えないで、かつさっさと実装を終えられたのですが。 | ||
+ | |||
+ | それでもつながらないのがあるというのが気になります。 | ||
+ | BLEの実装に関しては、ペリフェラル側((サーバー側))に多く、セントラル側((クライアント側))については、ほぼ、NimBLEのサンプルとその亜種しかないのです。 | ||
+ | |||
+ | ハイハイスクールアドベンチャーについても、もちろん、亜種の一つです。 | ||
+ | |||
+ | 通知可能のCharacteristicは端から notfy()をかけてみても、まったく一つも callbackを返してきません。 | ||
+ | 悶々とします。 | ||
+ | |||
+ | で、gatttool を使ってもう少し掘ってみることにしました。 | ||
+ | |||
+ | < | ||
+ | $ gatttool -I -b xx: | ||
+ | ... | ||
+ | [xx: | ||
+ | Error: Read characteristics by UUID failed: Encryption required before read/write | ||
+ | [xx: | ||
+ | </ | ||
+ | |||
+ | え、これって、セキュアな接続をはらないとダメってことですか? | ||
+ | |||
+ | なんで、コードにごそごそと追加を行います。 | ||
+ | |||
+ | < | ||
+ | pClient = NimBLEDevice:: | ||
+ | Serial.println(" | ||
+ | pClient-> | ||
+ | pClient-> | ||
+ | pClient-> | ||
+ | if (!pClient-> | ||
+ | { | ||
+ | NimBLEDevice:: | ||
+ | Serial.println(" | ||
+ | return false; | ||
+ | } | ||
+ | if (!pClient-> | ||
+ | { | ||
+ | Serial.println(" | ||
+ | return false; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | そうそう。 | ||
+ | 初期化もちょいと変えてやります。 | ||
+ | |||
+ | < | ||
+ | NimBLEDevice:: | ||
+ | NimBLEDevice:: | ||
+ | NimBLEDevice:: | ||
+ | NimBLEScan *pScan = NimBLEDevice:: | ||
+ | pScan-> | ||
+ | pScan-> | ||
+ | pScan-> | ||
+ | pScan-> | ||
+ | pScan-> | ||
+ | </ | ||
+ | |||
+ | NimBLEDevice:: | ||
+ | これで無事につながらなかったキーボードがつながるようになりました。 | ||
+ | |||
+ | == キーボードが再接続できない == | ||
+ | |||
+ | BLEキーボードを接続した状態でしばらく何もしないで放置していると、キーボード側がパワーセーブモードに入って接続が切れます。 | ||
+ | クライアント側には onDisconnect() の通知が送られて、接続が切れたことが認識されます。 | ||
+ | |||
+ | ここで、デバイスの再検索を始めて、打鍵するなどして復帰したキーボードから Advertiseがやってくればめでたく再接続になります。 | ||
+ | |||
+ | NimBLE のサンプルやそれを参考にした多くのコードが、次のような実装をしていたので私もそうしていました。 | ||
+ | |||
+ | < | ||
+ | void | ||
+ | ClientCallbacks:: | ||
+ | { | ||
+ | Serial.print(pClient-> | ||
+ | Serial.println(" | ||
+ | NimBLEDevice:: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 一見すると何の問題もありません。 | ||
+ | 実際、シリアルコンソールにも | ||
+ | 一向にデバイスが再接続されないのです。 | ||
+ | 困った。 | ||
+ | これでは、一気通貫にハイハイスクールアドベンチャーを最後までプレイするのでなければ、ゲームの途中でにっちもさっちもいかなくなってしまいます。 | ||
+ | |||
+ | さて、原因はなんでしょう? | ||
+ | もしかすると、一度接続したデバイスからの Advertiseを無視しているのかもしれません。 | ||
+ | ならば < | ||
+ | 再接続はうまくいかないし、そもそも、最初の接続が完了するまで何度も Advertiseのコールバックがかかってきてしまいました。 | ||
+ | 筋違いのようです。 | ||
+ | |||
+ | じゃあ、なんなんだろう? | ||
+ | |||
+ | ふと、callbackの中から NimBLEDevice:: | ||
+ | これ、つまりコールバック処理が完了しなくなって、おかしなことになっている可能性があるんじゃないかと。 | ||
+ | |||
+ | で、次のようにしました。 | ||
+ | |||
+ | < | ||
+ | static volatile bool connected = false; | ||
+ | |||
+ | void | ||
+ | ClientCallbacks:: | ||
+ | { | ||
+ | Serial.print(pClient-> | ||
+ | Serial.println(" | ||
+ | connected = false; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | で、メイン処理の中で、 | ||
+ | |||
+ | < | ||
+ | if (!connected) | ||
+ | { | ||
+ | Serial.println(" | ||
+ | NimBLEDevice:: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | という処理を足してやりました。 | ||
+ | |||
+ | 結論。 | ||
+ | |||
+ | あっさり再接続しました_ノ乙(、ン、)_ | ||
+ | |||
+ | < | ||
+ | Connect to BLE Keybord. | ||
+ | Advertised HID Device found: Name: Notepad8, Address: XX: | ||
+ | Start connecting to server... | ||
+ | A new client created. | ||
+ | BLE Device connected. | ||
+ | Connected to XX: | ||
+ | RSSI: -60 | ||
+ | Done. | ||
+ | XX: | ||
+ | Start scan. | ||
+ | Advertised HID Device found: Name: Notepad8, Address: XX: | ||
+ | Start connecting to server... | ||
+ | BLE Device connected. | ||
+ | Reconnected. | ||
+ | Connected to XX: | ||
+ | RSSI: -62 | ||
+ | Done. | ||
+ | </ | ||
+ | |||
+ | == キーバッファ == | ||
+ | |||
+ | キーバッファの仕様は何種類か存在しているようである。 | ||
+ | |||
+ | 最も多い実装は8bytesで、modifiers + padding + key buffer (6bytes) という構成で、手元ではバッファローのBSKBB335だけが11bytes で modifiers + key buffer (10bytes)というものである。 | ||
+ | |||
+ | キーバッファのサイズだとか、多分アラインメントを考慮したであろうパディングの有無や全体長などの差異はあれど、渡ってくる情報(modifiersやキーコード)に違いはない。 | ||
+ | |||
+ | が、キーバッファーの部分の扱いには、解釈違いのものがあるようである。 | ||
+ | |||
+ | 当初、試したキーボード((BSKBB335/ | ||
+ | なので、常にキーが押されればキーバッファの先頭にはキーコードがあるという想定だった。 | ||
+ | |||
+ | 他のキーボードでもそれで問題は特にはなかった。 | ||
+ | |||
+ | が、ちょっと色気(?)を出して、シフトキーを押したりコントロールキーを押したりしたときにそれは起きた。 | ||
+ | |||
+ | 文字が入力されない。 | ||
+ | |||
+ | 仕方がないので、デバッグです。 | ||
+ | 調べてみたら、キーは渡ってきてます。 | ||
+ | 但し、なぜか二文字目で先頭は0です。 | ||
+ | どうやら、キーボードによっては、modifiers が押されたのもキーバッファを消費する((ただしよりにもよってキーコードは0))ようです。 | ||
+ | なので、0ならそこで打ち切りとしていた処理を、0なら飛ばすように変更しました。 | ||
+ | |||
+ | |||
+ | |||
==== 画面のスケーリング ==== | ==== 画面のスケーリング ==== |
ハイハイスクールアドベンチャー_m5stack_m5cardputer版.1730863046.txt.gz · 最終更新: 2024/11/06 03:17 by araki