Hostシールドを付けてUSBキーボードを接続する)。今回はこのとき作ったスケッチをすこし拡張し、キー配列を変更できるアダプタにしてみた。8MHz動作)にminiUHSを組み合わせたものを使う。上記のリンクとを参照のこと。経緯もともとの記事では、ふつうのUSBキーボードとPCの間に上記のハードウェアを挟んでも、ふつうのUSBキーボードとして使えますよ、というだけの話なのだけど、その後キー配列の入れ替えや同時打鍵処理の実装によって親指シフト化アダプタ(hoboNicolaアダプタ)の実現に至った。Microのことはすっかり忘れていた。そんな中、ブログ記事を読んでくれた方から最初の記事の内容をちょっと膨らませて、単純なキーの入れ替えができるようなスケッチを作るためのヒントが欲しいというお手紙をいただいた。英数キーと左Ctrlキーを入れ替えたい。押したらBackspaceキーを押したことにしたい。このとき、英数キーは単独では機能はしなくて結構。項目1はよく聞く話であり、PCだったらキーコードを入れ替えるソフトはいくつもありそうである。PCでもスマホでもその他のホストでも、余計な手間をかけずに同じように使いたいのです、ということだった。英数キーは省略されている。項目2については、Ctrlキーと英数キーを入れ替えた上で、各エディタやブラウザのキーバインドを揃えていけばいいのだろう、と思った。アダプタあるいはキーボードの中で、CtrlキーやShiftキーを押したときだけ、一部の配列を変更していく処理は厄介である。Ctrlキーが押されているとき、いったんそれをオフにして文字キー側のコードを出力してその後またCtrlキーをオンにするとか、先にCtrlキーを離したらどうするのかとか、そのとき別のキーも押されたら...、とかややこしい話になる。やり方の説明の代わりに、以下のような機能をもつスケッチを作ることにした。キーコードを入れ替えるための変換テーブルをもつ。IDで指定することでキーの配列を変更できる。入力側に英数キー、出力側に左Ctrlキーのコードを書いておけば、キーボードで英数キーを打ってもPCにはCtrlーオンが伝わるようになる。その逆の組み合わせも指定しておけば、キーの位置が入れ替わることになる。アダプタ内部でローカルな修飾キー(Fnキーのようなキー)を定義する。英数キーを念頭に考えたので、このローカルなFnキーを「小指キー」と称することにした。小指キーを表す内部コードを変換テーブルの出力側に指定することで、例えば英数キーを小指キーに割り付けることができる。小指キーの内部コードはPC側には何も影響しない(出力しないので)。変換テーブルの入力コードに、小指キーがオンであることを条件として追加できる。右矢印キーとか指定できる。Endなど、キーボードに存在するキーのコードは指定できる。細かいところでは、小指キーの単独ストローク(小指キーを押し、他のキーを押さずに離す)では、変換テーブルの入力側のキーコードも出せること。編集操作の邪魔になるかもしれないから、単独ストロークでは何も出さないこともできる。いう要件で作ってみた。スケッチについてスケッチ一式については、後ろの方にダウンロードのリンクがあるので、そこから入手してください。(以下、UHSライブラリ)を利用する。前回の記事にあるように、UHSライブラリはGitHubに公開されている。IDEにライブラリマネージャを使って組み込むこともできる。以前の記事内容と重複する部分もあるが、今回のスケッチでUHSライブラリを使ってキーボード入力を得る方法やコード変換のための仕組みなどをしょうしょう。受けとるためのメソッドを実装してやる、という流儀になっている。クラスがそれにあたる。GUI(Win)の各キー)とで通知のされ方が異なっている。key);キーの押下通知。ID(USBキーコード)。key);キーのリリース通知。引数はOnKeyDown()と同じ。いう関数を呼び出すようにした。この呼出しにより、ホストにキー入力が通知される。修飾キーの押下/リリース時には対応するキーコードの通知はない。after);修飾キーが変化したことの通知を受ける。beforeに変化前、afterに変化後(現在)の状態。更新したうえでホスト側にキー入力通知(sendReport())を上げてやるようにしている。修飾キーのコード化このように修飾キー自体のコードは通知されないから、キーコードの入れ替えには都合が悪い。受けた修飾キー状態を分解し、内部的に以下のようなキーコードを与えるようにした。上記の内部キーコードと合わせて書くと以下のようになる。右GUIこんな具合なので、beforeとafterとで変化があるビットの位置を数値化し、0xe0に足し込んでコード生成している。渡してコード変換させている。