GUST NOTCH? DIARY

プチコンBIG へのデータ転送その後

年末から一応改善を試みていたんだけど思いつくところで比較的簡単に試せる部分はやってみたが状況は変わらず。
Shiftキーが絡むと固まることは分かっていたので、arduino側のコードに問題があるのではないかと思い、こちらにある仕様書も参照してみた。キーイベントはModifierキーの情報を持つ1バイトとキーコードが入った配列を含む Report として渡される。キーストロークの前後でLEDが光るようにしてみた結果、Shift キーの KeyPress 後に応答がなくなっている感じ。なのでこのあたりのコードをShiftキーを press/release する専用メソッドにしてみたがやはり同じ。そもそも5文字目まではちゃんと効いてるんだし。
というわけで、今一番疑っているのは本体側からキーボード側に何かのリクエストが来ているにも関わらず、それに正しく応答できていないのではないか、ということ。でも、Windows上では問題ないんだよなあ。
いずれにせよ、Shift を使わなければ送れてはいるので、この中で送れる方法を考えることにした。つまりは、Base32 でエンコードすることにすれば、アルファベットと数字だけしか使わないで済む。ただし、転送量は元のデータの1.6倍になる。
ついでに言うと、プチコン上でプログラムを入力していると、前の行の行頭の空白に合わせてインデントがついてしまう。なので、整形済のプログラムを転送すると、インデントをつけた部分がだんだんと崩れていってしまうという問題もあった。Base32にして常に各行の1文字目から文字があるようになれば、このことは意識する必要がなくなる。
USBの仕様上、LowSpeedデバイスのキーボードはreportのやり取りのタイミングが1msごとに行われるらしい。つまり、press/release のタイミングをバッファせずに送るためには1イベントごとに1msかかるということになる。つまりは1文字あたり2msかかる。100バイトのデータを送るために160バイトにエンコードされ、最速で320msかかる。回線としての転送速度は500bytes/secなので4Kbps。
とりあえず、送信側のBase32エンコーだとプチコンBIGでのデコーダを書いて終わりにしようと思う。