お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2010-12-14 16:22:07

fatcat
メンバ
登録日: 2009-08-25

キーボード入力の判別方法

いつもお世話になっております。
Ubuntu9.04を使用しております。
開発環境はgcc4.5
C言語を使用しております。

現在のハードウェアの構成は以下の通りです。
・USBポートが2つ(以降ではUSBポート1、USBポート2と呼称します)
・COMポートが2つ(以降ではCOM1、COM2と呼称します)
・USBキーボードが2つ(キーボード1、キーボード2と呼称します)
USBポート1にキーボード1を、USBポート2にキーボードを接続しておきます。


目的はキーボード1で入力されたキーをASCIIでCOM1へ出力し
キーボード2で入力されたキーをASCIIでCOM2へ出力したく思います。
プログラムで判別できるかのかと思いましたがいい方法がわかりませんでした。
以下にコードを記載します。

1.ncurseの使用

char buf = getch();
write(sio_fd, &buf, 1);

上記の場合ですと、どちらのキーボードから入力があったのかが判別できません。
ですのでUSBポートAに接続されているキーボードの入力をCOM1へ送信し
USBポートBに接続されているキーボードの入力をCOM2へ送信するといったことができません。
ただ、Shiftキーを押しながらAキーを押した場合には、bufには0x41が設定されておりますので
現在Shiftキーが押されているかどうかを意識することなくbufのデータを出力するだけという
手軽さがあります。


2.デバイスファイルのread

struct input_event event;
char devFile="/dev/event/input7";
int kbd_fd = open(devFile, O_RDONLY);
if (read(kbd_fd, &event, sizeof(event)) != sizeof(event)) {
  exit(EXIT_FAILURE);
}

上記の場合ですと、キーボードからの入力ではなく押下されたキーの取得になります。
そのためShiftキーを押しながらAキーを押した場合には、Shiftキーが繰り返し押されているという情報と
Aキーが押されているという情報からプログラム側で0x41に変換しなければなりません。
キーボードの全キーに対してShiftキーが押されているならば別の値に変換するということが必要になります。
ちょっと面倒だと感じております。
またdevFileに設定すべきデバイスファイル名もキーボードが2つ接続されている場合では
/dev/input以下にはevent1,event2,event3,event4と複数でてきますが
どのデバイスファイル名を設定すべきかもはっきりとわかっておりません。
(漠然とudevルールでDRIVERS=="usbkbd" KERNELS=="1-2:1.0"の時に、/dev/event/input*へのシンボリックリンクを作成し、
それを設定すればいけるのではないかくらいの認識です)



何卒いい方法をご教授いただければと思います。

オフライン

 

Board footer

Powered by FluxBB