フットキーポードの1つのキーに複数文字登録する

ガジェット製作

フットキーポードの1つのキーに、文字列(複数文字)を登録できるようにしてみました。

1つのキー入力で複数文字

前回までで、キーの割り当てを変えられないフットキーボードは完成しましたので、次はMacからキー割り当てを変えられるようにしよう、ということでキー割り当てデータはどんなフォーマットにしようかな、と考えていました。

内容としては、どのスイッチにどのようなキーコードを割り当てるかがわかればいいので、

[スイッチ番号] [修飾キー] [キーコード]

のようなデータを、設定するスイッチの数だけフットキーポードに送ればいいかな、と考えていました。

ただ、フォーマットを決めるのであれば、将来的な拡張に耐えられた方がいいのでは、と思いちょっと考えてたところ、そもそもひとつのスイッチに1文字の割り当てではなく、複数の文字を割り当てることはできないのかな、と思いました。それができるのであれば、キー割り当てデータは

[スイッチ番号] [文字数] [修飾キー] [キーコード] [修飾キー] [キーコード] … (文字数分繰り返し)

としておいた方がよさげな感じです。

ということで、スイッチ1つに複数文字を割り当てるようにしたところ、できましたのでその内容を説明したいと思います。

 

1文字送る場合のキーデータ生成部フローチャート

前回公開したソースコードは、スイッチを1回押すと1文字のキーコードを生成するようになっています。処理の内容をフローチャートでかくと以下のようになります。

One char flow chart

キーデータの送信はkeyboard()関数で処理しています。keyboard()内では、まず、現在キーデータの送信中か確認します。具体的には、HIDTxHandleBusy(lastINTransmission) が falseであれば(ソースコードでは if(!HIDTxHandleBusy(lastINTransmission)) となります)を確認しています。送信中であれば、まだデータは送れませんので、今回はあきらめてメインの処理(ProcessIO())に戻ります。

送信中でなければ、ひとつひとつのスイッチの状態を確認して、スイッチが押されていれば、そのスイッチに対応するキーコードをホストに送信します。どのスイッチも押されていなければ、何も押されていない、ということで0x00のデータをホストに送信します。

これが現在の処理内容です。

 

複数文字送る場合の考え方

複数文字を送る場合、このように考えてみました。

まず、グローバル変数として、remainedSendCharという変数を用意して、複数文字を送信する場合、ここに送信する文字数を入れます。

keyboard()を処理する度に、スイッチ状態を調べる前に、まずこのremainedSendCharが1以上であれば、まだ複数文字送信が終わっていないと判断して、残りの文字列から一文字送信します。送信したらremainedSendCharから1を引きます。これを繰り返すと、必要な文字数を送り終わるとremainedSendCharはゼロになりますので、通常のスイッチ状態をみる処理になります。

言葉ではわかりづらいので、こちらもフローチャートにしました。こんな感じです。

Multi chars flow chart

なお、押されたキー(スイッチ)が複数文字割り当ての場合、スイッチ確認処理のところで、remainedSendCharに文字数をセット、最初の一文字を送るようにしました。

この実装をしたkeyboard.cを以下にアップします。なお、他のソースコードはいじらないでkeyboard.cを以下のソースに入れ替えるだけでビルドOKです。

 

動作確認

keyboard.cを変更して、ビルド、フットキーポードにプログラムを書き込みます。

switch1を複数文字に割り当て、割り当て文字列を “keyboard” としました。

USBケーブルでつないでテキストエディットを開いてスイッチ1を押すと、”keyboard”と入力されました。

 

ところが、、、

これはうまくいったと思ったのですが、割り当てる文字列によっては、問題が発生することがわかりました。。。

例えば、”foot keyboard” と登録しておくと、テキストエディットを開いてスイッチ1を押すと、”fot keyboard”と入力されてしまいます。

はじめはプログラムミスかと思ったのですが、プログラムでは foot と正しく設定しています。また、keyboardは正しく入力されますので、どうも同じ文字が続くとこのような現象になるようです。

いろいろと原因を考えてみました。

予想ですが、プログラムで複数の文字をホストに送っていますので、入力速度は異常に早いはずです。で、同じ文字が短時間に入力されると、ホスト側で、キーのチャタリングと認識されて、1文字に置き換えられるのではないか、と思いました。

原因が本当にこれなのか、これから確認する必要がありそうです。具体的には、複数文字送信の時に、これから送る文字が一つ前の文字と同じ場合、ちょっと時間をあける、という処理を入れて確認する、というものです。

今日は時間がないので、また来週かな、、、

週末はあっという間に終わってしまいますね。

 

変更履歴

 

日付 変更内容
2013.4.21 初版

« »