ユーザ用ツール

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
ハイハイスクールアドベンチャー_m5stack_m5cardputer版 [2025/04/25 01:26] – [BTキーボードをつなごう] arakiハイハイスクールアドベンチャー_m5stack_m5cardputer版 [2025/04/25 01:56] (現在) – [BTキーボードをつなごう] araki
行 47: 行 47:
 ソースは、GitHubから取得して、Platform IOのプロジェクトとしてビルドする。 ソースは、GitHubから取得して、Platform IOのプロジェクトとしてビルドする。
  
-<code>+<code bash>
 $ git clone https://github.com/wildtree/hhsadv.git $ git clone https://github.com/wildtree/hhsadv.git
 </code> </code>
行 86: 行 86:
 Core/Core2なら 用意されているSPIを使えば動くが、Cardputerはそこもまとめて面倒をみないといけない。 Core/Core2なら 用意されているSPIを使えば動くが、Cardputerはそこもまとめて面倒をみないといけない。
  
-<code>+<code cpp>
     cfg.clear_display = true;     cfg.clear_display = true;
     M5.begin(cfg);     M5.begin(cfg);
行 119: 行 119:
 CoreはWireでINTR=5だが、Core2はWire1でINTR=33だ。 CoreはWireでINTR=5だが、Core2はWire1でINTR=33だ。
  
-<code>+<code cpp>
 class M5StackKeyBoard : public KeyBoard class M5StackKeyBoard : public KeyBoard
 { {
行 233: 行 233:
 JIS配列に対応させたい場合はこれを書き換えることになる。 JIS配列に対応させたい場合はこれを書き換えることになる。
  
-<code>+<code cpp>
 const uint8_t BTKeyBoard::_keymap[][96] = { const uint8_t BTKeyBoard::_keymap[][96] = {
     {    0,   0,   0,   0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',     {    0,   0,   0,   0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
行 267: 行 267:
 キーボードからの通知が来るたびに、これが呼び出される。 キーボードからの通知が来るたびに、これが呼び出される。
 Handle == 41は modifiers + 10文字分のキーバッファだが Handle == 29は modifiers + res + 6文字分のキーバッファとなっている。 Handle == 41は modifiers + 10文字分のキーバッファだが Handle == 29は modifiers + res + 6文字分のキーバッファとなっている。
-そもそも Handle で見分けるのが正しいのかさえよくわかっていないがとにかく試して動いたキーボードはこのどちらかだった。+<del>そもそも Handle で見分けるのが正しいのかさえよくわかっていないがとにかく試して動いたキーボードはこのどちらかだった。</del> 
 +実はキーボードからのキー入力の通知についてはハンドルで見分けることができる。 
 + 
 +btstack でBLEキーボードをつないだ時に知ったのだけれど、Notification で渡されるパケットには実は二種類のハンドルが入っている。 
 +一つが attribute handle で、もう一つが value handleだ。 
 + 
 +私が調べたところ、attribute handle == 0x0040 のものがキーボードからのキー入力の通知になる。 
 +なので、btstack ではそのようにしてふるっているし、NimBLEでもそうするべきだろうと思ったのだが、NimBLERemoteCharacteristic クラスは、value_handleしか取得できない。 
 + 
 +value_handleの方はキーボードによってまちまちの値を返すので、使い物にならない。 
 +  
 +どうにかして attribute handle を取り出せないものかと NimBLEのコードを掘っていったら、あろうことか、attribute_handleの方は中で捨ててた。 
 + 
 +よって、NimBLEでは Notification Event Handlerの中でハンドルで処理を分けるやり方はできない、というのが結論である
  
 動作は単純で、前回渡されたデータと、今回渡ってきたデータとでキーバッファ部分を比べて、新しいのがあったらそれが今回入力されたキーだとみなして、keybufに積んでいく。 動作は単純で、前回渡されたデータと、今回渡ってきたデータとでキーバッファ部分を比べて、新しいのがあったらそれが今回入力されたキーだとみなして、keybufに積んでいく。
行 275: 行 288:
  
  
-<code>+<code cpp>
 typedef union { typedef union {
     struct __attribute__((__packed__))     struct __attribute__((__packed__))
行 345: 行 358:
 で、gatttool を使ってもう少し掘ってみることにしました。 で、gatttool を使ってもう少し掘ってみることにしました。
  
-<code>+<code bash>
 $ gatttool -I -b xx:xx:xx:xx:xx:xx $ gatttool -I -b xx:xx:xx:xx:xx:xx
 ... ...
行 357: 行 370:
 なんで、コードにごそごそと追加を行います。 なんで、コードにごそごそと追加を行います。
  
-<code>+<code cpp>
         pClient = NimBLEDevice::createClient();         pClient = NimBLEDevice::createClient();
         Serial.println("A new client created.");         Serial.println("A new client created.");
行 379: 行 392:
 初期化もちょいと変えてやります。 初期化もちょいと変えてやります。
  
-<code>+<code cpp>
     NimBLEDevice::init("");     NimBLEDevice::init("");
     NimBLEDevice::setSecurityAuth(true, true, true); // all true if requires secure connection.     NimBLEDevice::setSecurityAuth(true, true, true); // all true if requires secure connection.
行 407: 行 420:
 NimBLE のサンプルやそれを参考にした多くのコードが、次のような実装をしていたので私もそうしていました。 NimBLE のサンプルやそれを参考にした多くのコードが、次のような実装をしていたので私もそうしていました。
  
-<code>+<code cpp>
 void void
 ClientCallbacks::onDisconnect(NimBLEClient* pClient) ClientCallbacks::onDisconnect(NimBLEClient* pClient)
行 425: 行 438:
 さて、原因はなんでしょう? さて、原因はなんでしょう?
 もしかすると、一度接続したデバイスからの Advertiseを無視しているのかもしれません。 もしかすると、一度接続したデバイスからの Advertiseを無視しているのかもしれません。
-ならば <code>NimBLEDevice::getScan()->setDuplicateFilter(true);</code>とかすればいいのかもしれないと思って試してみました。+ならば <code cpp>NimBLEDevice::getScan()->setDuplicateFilter(true);</code>とかすればいいのかもしれないと思って試してみました。
 再接続はうまくいかないし、そもそも、最初の接続が完了するまで何度も Advertiseのコールバックがかかってきてしまいました。 再接続はうまくいかないし、そもそも、最初の接続が完了するまで何度も Advertiseのコールバックがかかってきてしまいました。
 筋違いのようです。 筋違いのようです。
行 436: 行 449:
 で、次のようにしました。 で、次のようにしました。
  
-<code>+<code cpp>
 static volatile bool connected = false; static volatile bool connected = false;
  
行 450: 行 463:
 で、メイン処理の中で、 で、メイン処理の中で、
  
-<code>+<code cpp>
     if (!connected)     if (!connected)
     {     {
行 595: 行 608:
 その場合自力でビルドして置き換えておく。 その場合自力でビルドして置き換えておく。
  
-<code>+<code bash>
 $ git clone --recursive https://github.com/igrr/mkspiffs.git $ git clone --recursive https://github.com/igrr/mkspiffs.git
 $ cd mkspiffs $ cd mkspiffs

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also, you acknowledge that you have read and understand our Privacy Policy. If you do not agree, please leave the website.

More information