ユーザ用ツール

差分

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

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
bleについて [2024/12/09 03:10] arakibleについて [2026/05/27 00:05] (現在) – [コード片] araki
行 129: 行 129:
 キーボードからの通知が来るたびに、これが呼び出される。 キーボードからの通知が来るたびに、これが呼び出される。
 Handle == 41は modifiers + 10文字分のキーバッファだが Handle == 29は modifiers + res + 6文字分のキーバッファとなっている。 Handle == 41は modifiers + 10文字分のキーバッファだが Handle == 29は modifiers + res + 6文字分のキーバッファとなっている。
-そもそも Handle で見分けるのが正しいのかさえよくわかっていないがとにかく試して動いたキーボードはこのどちらかだった。+<del>そもそも Handle で見分けるのが正しいのかさえよくわかっていないがとにかく試して動いたキーボードはこのどちらかだった。</del> 
 +Handleで見分けるのは正しいのだが、見るべきは Notification Handleと呼ばれるもので、これが41のものがキーボードであるようだ。 
 +問題は NimBLEは Notification Handleを捨ててしまっているので、つまりはNimBLEでは Handleでデバイスの種別を見分けることはできない。 
 +キーボード決め打ちでやってみるしかないだろう
  
 動作は単純で、前回渡されたデータと、今回渡ってきたデータとでキーバッファ部分を比べて、新しいのがあったらそれが今回入力されたキーだとみなして、keybufに積んでいく。 動作は単純で、前回渡されたデータと、今回渡ってきたデータとでキーバッファ部分を比べて、新しいのがあったらそれが今回入力されたキーだとみなして、keybufに積んでいく。
行 484: 行 487:
 カウンターがオーバーフローした場合の処理を入れていませんが、32bitでも2500日くらい押し続けないと溢れないので、実用上問題はないと思っています。頑張って2500日押し続けてオーバーフローしたら教えてください。 カウンターがオーバーフローした場合の処理を入れていませんが、32bitでも2500日くらい押し続けないと溢れないので、実用上問題はないと思っています。頑張って2500日押し続けてオーバーフローしたら教えてください。
 直します。 直します。
 +
 +=== キーが押されているか? ===
 +
 +まあ、[[フルーツフィールド]]については、オートリピートでもゲームになりますが、結局ゲームの場合、キーが押されているかどうかを読んで、動作させる必要性があります。
 +
 +実際、PC-6001mkII版だって、キーが押されているかどうかを調べるシステムコールを使って動作させているので、BLE版だってそうさせたい。
 +
 +実装は簡単なのですが、どういう実装にするのかが問題。
 +
 +PC-6001mkII版のように、上下左右+SPC+ESC+何か二つ、をuint8_tのビットマップにパックするのも考えたんですが、ビットマップに畳み込んで、ビットマップを展開してとかやるんだったら、BLEの通信バッファの方を直接スキャンしても大差ないだろうということで、
 +<code>
 +キーコード, 文字コード
 +</code>
 +のペアの配列を用意して、そこに定義されているキーが押されているかどうかをチェックして、押されてたら文字コードの方を返すようにしました。
 +
 +<code>
 +static uint8_t _keymap[] = { 
 +    0x50, 28, 
 +    0x4f, 29, 
 +    0x52, 30,  
 +    0x51, 31, 
 +    0x2c, ' ',  
 +    0x29, 27,  
 +    0x16, 's', 
 +    0x1f, '@', 
 +    0, 0 
 +};
 +
 +bool
 +keyscan(uint8_t &code)
 +{
 +    for (int i = 0 ; _keymap[2 * i] != 0 ; i++)
 +    {
 +        if (_keyboard->is_pressed(_keymap[2 * i]))
 +        {
 +            code = _keymap[2 * i + 1];
 +            return true;
 +        }
 +    }
 +    return false;
 +}
 +</code>
 +

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