フットキーポードの1つのキーに、文字列(複数文字)を登録できるようにしてみました。
1つのキー入力で複数文字
前回までで、キーの割り当てを変えられないフットキーボードは完成しましたので、次はMacからキー割り当てを変えられるようにしよう、ということでキー割り当てデータはどんなフォーマットにしようかな、と考えていました。
内容としては、どのスイッチにどのようなキーコードを割り当てるかがわかればいいので、
[スイッチ番号] [修飾キー] [キーコード]
のようなデータを、設定するスイッチの数だけフットキーポードに送ればいいかな、と考えていました。
ただ、フォーマットを決めるのであれば、将来的な拡張に耐えられた方がいいのでは、と思いちょっと考えてたところ、そもそもひとつのスイッチに1文字の割り当てではなく、複数の文字を割り当てることはできないのかな、と思いました。それができるのであれば、キー割り当てデータは
[スイッチ番号] [文字数] [修飾キー] [キーコード] [修飾キー] [キーコード] … (文字数分繰り返し)
としておいた方がよさげな感じです。
ということで、スイッチ1つに複数文字を割り当てるようにしたところ、できましたのでその内容を説明したいと思います。
1文字送る場合のキーデータ生成部フローチャート
前回公開したソースコードは、スイッチを1回押すと1文字のキーコードを生成するようになっています。処理の内容をフローチャートでかくと以下のようになります。
キーデータの送信はkeyboard()関数で処理しています。keyboard()内では、まず、現在キーデータの送信中か確認します。具体的には、HIDTxHandleBusy(lastINTransmission) が falseであれば(ソースコードでは if(!HIDTxHandleBusy(lastINTransmission)) となります)を確認しています。送信中であれば、まだデータは送れませんので、今回はあきらめてメインの処理(ProcessIO())に戻ります。
送信中でなければ、ひとつひとつのスイッチの状態を確認して、スイッチが押されていれば、そのスイッチに対応するキーコードをホストに送信します。どのスイッチも押されていなければ、何も押されていない、ということで0x00のデータをホストに送信します。
これが現在の処理内容です。
複数文字送る場合の考え方
複数文字を送る場合、このように考えてみました。
まず、グローバル変数として、remainedSendCharという変数を用意して、複数文字を送信する場合、ここに送信する文字数を入れます。
keyboard()を処理する度に、スイッチ状態を調べる前に、まずこのremainedSendCharが1以上であれば、まだ複数文字送信が終わっていないと判断して、残りの文字列から一文字送信します。送信したらremainedSendCharから1を引きます。これを繰り返すと、必要な文字数を送り終わるとremainedSendCharはゼロになりますので、通常のスイッチ状態をみる処理になります。
言葉ではわかりづらいので、こちらもフローチャートにしました。こんな感じです。
なお、押されたキー(スイッチ)が複数文字割り当ての場合、スイッチ確認処理のところで、remainedSendCharに文字数をセット、最初の一文字を送るようにしました。
この実装をしたkeyboard.cを以下にアップします。なお、他のソースコードはいじらないでkeyboard.cを以下のソースに入れ替えるだけでビルドOKです。
https://github.com/tool-lab/foot-keyboard-multi-chars-registration
動作確認
keyboard.cを変更して、ビルド、フットキーポードにプログラムを書き込みます。
switch1を複数文字に割り当て、割り当て文字列を “keyboard” としました。
USBケーブルでつないでテキストエディットを開いてスイッチ1を押すと、”keyboard”と入力されました。
ところが、、、
これはうまくいったと思ったのですが、割り当てる文字列によっては、問題が発生することがわかりました。。。
例えば、”foot keyboard” と登録しておくと、テキストエディットを開いてスイッチ1を押すと、”fot keyboard”と入力されてしまいます。
はじめはプログラムミスかと思ったのですが、プログラムでは foot と正しく設定しています。また、keyboardは正しく入力されますので、どうも同じ文字が続くとこのような現象になるようです。
いろいろと原因を考えてみました。
予想ですが、プログラムで複数の文字をホストに送っていますので、入力速度は異常に早いはずです。で、同じ文字が短時間に入力されると、ホスト側で、キーのチャタリングと認識されて、1文字に置き換えられるのではないか、と思いました。
原因が本当にこれなのか、これから確認する必要がありそうです。具体的には、複数文字送信の時に、これから送る文字が一つ前の文字と同じ場合、ちょっと時間をあける、という処理を入れて確認する、というものです。
今日は時間がないので、また来週かな、、、
週末はあっという間に終わってしまいますね。
変更履歴
日付 | 変更内容 |
---|---|
2013.4.21 | 初版 |