前回のエントリで、同じ文字が続くとその文字は1文字しか入力されない不具合がありました。なんとか解決できましたが、原因の予想はまったく外れでした。。。
同じ文字が続くと1文字しか入力されない
前回のエントリで、ひとつのスイッチを押すと複数の文字入力ができるようにプログラムを改良しました。”keyboard”など、同じ文字が続かない文字列は問題なく入力することができるようになりました。ただ、”foot keyboard”などのように、例えば ”o” が複数続く場合、その文字は1文字しか入力できない不具合が出ることがわかりました。
前回のプログラムでスイッチ1が押されたとき、”foot keyboard”と入力できるようにすると、、、
と入力されてしまいます。これでは使えないので原因をさぐる旅に、、、
ホスト側のキーチャタリング処理が原因ではないか?
フットキーボードは、1文字の送信が終わると間髪入れずに次の文字をホストに送信します。ホスト(Mac)からすると、おそらく高橋名人(古い…)よりも早い入力になるわけで、もしかしてキーチャタリングと認識してしまって1文字の入力にまとめているのではないか、と予想しました。
それで、同じ文字が続く場合、ちょっと待つようにプログラムを変えてみました。詳しい処理内容についてはプログラムをアップしますのでご確認ください。
https://github.com/tool-lab/usb-keyboard-sample-cause-of-the-issue
処理の概略ですが、
この流れ図の「未送信文字あり?」の判定のところを変更しました。具体的には、未送信文字がある場合、これから送る文字がひとつ前におくった文字と同じ場合、その文字の送信をしばらく待つ(ループはするけど何もしない)、という処理にしました。
これで “o” の文字送信後、ちょっと時間を空けて “o” をMacに送ることになるので、確実に入力できると思っていました。このときは。
ウエイトを入れてみた結果…
ところが、ウエイトを入れて試してみたところ、どうなったかというと、、、
(ノ゚Д゚)ノ
てな結果になりました。どう考えても “o” の文字は2回しかホストに送ってないのに、なんでそんなにたくさん “o” がでてくるの? 確かに “o” が続いた場合、1文字にまとめられるのはヤメテって思ったけど、今度はなんで嫌がらせみたいに “o” をこれでもか、って出してくるの?? それに “fooo…ot”のところ、スペルが違うって赤線引かれてるし。なんか屈辱的ですね。
ウエイトを思いっきり長くしてみた結果
で、小一時間いろいろと確認していたところ、ウエイトを異常に長くすると、あることに気づきました。
テキストエディットアプリを開いて、フットキーポードのスイッチを押すと、”fo” と表示されたあと、1秒ほど間が開いて、そのあと “ooooo…” と ウエイトしている時間分 “o” の入力が続くんです。どうもキーリピートとして認識されているみたいなんです。実際、普通のキーボードのどれかのキーを押し続けてみると、同じようなタイミングでキーリピート入力されました。
どうも、”o” のキーコードを送ったあと何もしないと、ホスト側はキーリピートが発生した、と解釈するみたいなんです。”o”を送った後、再度 “o” のキーコードを送っても同様みたいです。それで、前から気になっていた、サンプルコードにある、「何もしないときは、キーコードとして 0x00 をホストに送る」部分があるのですが、これかもしれない、と思いました。
キーボードデータ生成のルール?
つまり、”o”のあとに 0x00 を送ることにより、”o” のスイッチを押して、その後スイッチから手を離したよ、と伝えているのかもしれないと思ったわけです。
ということで、同じ文字が続く場合、1文字送ったあとに必ず0x00を送るように修正すれば動くかもしれません。ただ、同じ文字だったら、というより、複数文字を送る場合は、1文字ホストに送るごとに、0x00を送ってしまえばプログラムが楽になるかな、と思い、試してみました。結果は、、、うまく動きました。これって、どこかのドキュメントにさらって書いてあるんですよね。きっと。知らなかった自分、なんか思いっきりビギナー臭でてますね。まぁ、いいか。
ということで、Version 1.0.0のプログラムを改良して、複数文字列を設定できるようにしてみました。
エントリが長くなってしまったので、次のエントリでVersion 1.1.0のプログラムをアップしますね。
更新履歴
日付 | 内容 |
---|---|
2013.4.26 | 新規投稿 |
2019.3.24 | ダウンロードファイルをGithubに引越し |