ハイハイスクールアドベンチャー_m5stack_m5cardputer版
差分
このページの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のプロジェクトとしてビルドする。 | ||
- | < | + | < |
$ git clone https:// | $ git clone https:// | ||
</ | </ | ||
行 86: | 行 86: | ||
Core/ | Core/ | ||
- | < | + | < |
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だ。 | ||
- | < | + | < |
class M5StackKeyBoard : public KeyBoard | class M5StackKeyBoard : public KeyBoard | ||
{ | { | ||
行 233: | 行 233: | ||
JIS配列に対応させたい場合はこれを書き換えることになる。 | JIS配列に対応させたい場合はこれを書き換えることになる。 | ||
- | < | + | < |
const uint8_t BTKeyBoard:: | const uint8_t BTKeyBoard:: | ||
{ 0, | { 0, | ||
行 267: | 行 267: | ||
キーボードからの通知が来るたびに、これが呼び出される。 | キーボードからの通知が来るたびに、これが呼び出される。 | ||
Handle == 41は modifiers + 10文字分のキーバッファだが Handle == 29は modifiers + res + 6文字分のキーバッファとなっている。 | Handle == 41は modifiers + 10文字分のキーバッファだが Handle == 29は modifiers + res + 6文字分のキーバッファとなっている。 | ||
- | そもそも Handle で見分けるのが正しいのかさえよくわかっていないがとにかく試して動いたキーボードはこのどちらかだった。 | + | <del>そもそも Handle で見分けるのが正しいのかさえよくわかっていないがとにかく試して動いたキーボードはこのどちらかだった。</ |
+ | 実はキーボードからのキー入力の通知についてはハンドルで見分けることができる。 | ||
+ | |||
+ | 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: | ||
- | < | + | < |
typedef union { | typedef union { | ||
struct __attribute__((__packed__)) | struct __attribute__((__packed__)) | ||
行 345: | 行 358: | ||
で、gatttool を使ってもう少し掘ってみることにしました。 | で、gatttool を使ってもう少し掘ってみることにしました。 | ||
- | < | + | < |
$ gatttool -I -b xx: | $ gatttool -I -b xx: | ||
... | ... | ||
行 357: | 行 370: | ||
なんで、コードにごそごそと追加を行います。 | なんで、コードにごそごそと追加を行います。 | ||
- | < | + | < |
pClient = NimBLEDevice:: | pClient = NimBLEDevice:: | ||
Serial.println(" | Serial.println(" | ||
行 379: | 行 392: | ||
初期化もちょいと変えてやります。 | 初期化もちょいと変えてやります。 | ||
- | < | + | < |
NimBLEDevice:: | NimBLEDevice:: | ||
NimBLEDevice:: | NimBLEDevice:: | ||
行 407: | 行 420: | ||
NimBLE のサンプルやそれを参考にした多くのコードが、次のような実装をしていたので私もそうしていました。 | NimBLE のサンプルやそれを参考にした多くのコードが、次のような実装をしていたので私もそうしていました。 | ||
- | < | + | < |
void | void | ||
ClientCallbacks:: | ClientCallbacks:: | ||
行 425: | 行 438: | ||
さて、原因はなんでしょう? | さて、原因はなんでしょう? | ||
もしかすると、一度接続したデバイスからの Advertiseを無視しているのかもしれません。 | もしかすると、一度接続したデバイスからの Advertiseを無視しているのかもしれません。 | ||
- | ならば < | + | ならば < |
再接続はうまくいかないし、そもそも、最初の接続が完了するまで何度も Advertiseのコールバックがかかってきてしまいました。 | 再接続はうまくいかないし、そもそも、最初の接続が完了するまで何度も Advertiseのコールバックがかかってきてしまいました。 | ||
筋違いのようです。 | 筋違いのようです。 | ||
行 436: | 行 449: | ||
で、次のようにしました。 | で、次のようにしました。 | ||
- | < | + | < |
static volatile bool connected = false; | static volatile bool connected = false; | ||
行 450: | 行 463: | ||
で、メイン処理の中で、 | で、メイン処理の中で、 | ||
- | < | + | < |
if (!connected) | if (!connected) | ||
{ | { | ||
行 595: | 行 608: | ||
その場合自力でビルドして置き換えておく。 | その場合自力でビルドして置き換えておく。 | ||
- | < | + | < |
$ git clone --recursive https:// | $ git clone --recursive https:// | ||
$ cd mkspiffs | $ cd mkspiffs |
ハイハイスクールアドベンチャー_m5stack_m5cardputer版.1745544374.txt.gz · 最終更新: 2025/04/25 01:26 by araki