USB Keybord to X680x0 その4

2016年9月21日

ん~、途中経過だから仕方がないのだけれど、殆ど間違えです。



その3では USB キーボードをキャラクタ LCD に表示が出来たところまで書きました。
土台のソフトが何を使って書いていなかったようなので、
「microchip_solutions_v2013-06-15\USB\Host – HID – Keyboard」
を、使っています。最近「Microchip Libraries for Applications」に呼び名が変わったのか、X 系に変更したのか、殆ど同じですが、私の使ったものが何処にあるのか分かりません。これでもいいかと。
左のリンクにあります。
動かしてみたところ、key down, key up の挙動をしているのではなく、key down しか処理していません。
up が無いので困るのですが、なぜかそこの関数が 500msec 位でキーリピートして、50ループ以下でリピートしています。
この時間と間隔が何処から作りだされているのか謎なんですが、かなり USB の深いところのプログラム見てもだめなので、あきらめです。ちゃんとそう動いてくれるなら合わせます(´Д`)
ということで down は自分でも把握できているタイマー 30msec 以上の間隔でキーが連打できるようです。
この条件を合わせると


#define KEY_DOWN      0x80
#define KEY_UP        0x00
BYTE KEY_MAP[128];
SetKey(BYTE code)
{
if(KEY_MAP) {
PutCharUART2(code | KEY_UP)
}
KEY_MAP = 50;
PutCharUART2(code | KEY_DOWN)
}
LoopKey()
{
int i;
for(i = 0; i < 128; i++) { if(KEY_MAP[i] > 0) {
if(--KEY_MAP[i] == 0) {
PutCharUART2(i | KEY_UP);
}
}
}
}

ざっくり書いてこんな感じ?
50回以内でループでダウンカウント、ダウンカウント中キーの down が来たら、先に up を送る。あとは、テーブル作って X68のキーコードと合わせます。
おk牧場?
あとは、キーリピートの時間が X68 来るので、その辺は後で作るとして、これから HEX 変換書きます。ですが問題は、USB キーボードの方がキーが少ないことです。あとは 101 で動いているので、106+α の日本語キーボードは使いきれません。SHIFT の時のキャラクタも違うので、全部押して表示させてみてメモしないと駄目です(`・ω・´)
とりあえずは適当なキーを押すと、X68で文字が思惑通り出ているので、あとは脳味噌使う必要なさそうです。



その4で X68 にキーコードを送る記事を書く予定ですが、これがその4?ぼやき、壁にぶち当たりました。
キーを押すと表示はされるのですが、実際ローレベルなところ、このキー押した。このキー離した。button down, button up では無いのです。
key down しかメッセージが来ません。表示とか組み込み的には自分で使うのであればいいのかもしれませんが、これでは困ります。
キーは 30msec で見ています。タイマーが動いているのは確認できます。押しっぱなしだと 500msec 位毎にキーリピートが来るのですが、この時間の設定が何処にあるのか分かりません。
30msec 周期の割り込みに対し、1つの文字は50回ループしたらまた判定。周期を早くしても変わらない。キーを連打すれば最小 30msec 何だと思います。リピートがなぜか常に50回ループ。どう考えてももう1つタイマー使ってますよね?
この周期を早くできれば、次同じキーが押されていなければ離れていると判定できるのですが。
30msec を早くしたりしても、500msec が変わりません。USB のポーリングは 1msec みたいです。コードを検索したらそんな感じで書いて有りました。1mec は USB Keybord 規格的には、全キースキャンじゃなく、押している物だけ Keybord は返事しているのでしょうか。多分そうだと思いますが。
USB HOST の基本コードに、main で必要なデータをチョイスして文字コードを拾っているみたいなのですが、そのパラメータがむちゃくちゃ多くて、更に USB の基本コードを使って キーデータに変換しているので、そもそもの基本コードを理解していなければなりません。
結構頑張ってるのですが、やばいです。挫折しそうです。くじけそうです。
とりあえず、全容は見えてきたので、パラメータを引っ張り出すか、500msec を早くできないか、もうひと押しなのか遠いのかさっぱりです(´Д`)
んー、分からん。500msec のタイマみたいな物が見つかりません。この周期キーボードが返事をする周期なのかもしれません。確実に50ループ以下でプログラムが回るので、そこで離したかどうか判定ですかねぇ。連打したら、先に離した、押した。にしないといけないので、マカロニスパゲッティ~プログラムに(´Д`)
50と言う数字から連想できるキーワード。東日本の電源 50Hz 関係ないない。
出来てしまうとあっさりなんですが。