2021/03/06(土) [n年前の日記]
#2 [hsp][raspberrypi][linux] キーボードとマウスの取得についてまだまだ実験中
Raspberry Pi用HSPで、使っているキーボードやマウスによっては無反応になってしまう件について、hsp3dish.cpp を修正して動作を改善できないか、
_昨日の作業
を踏まえつつ実験中。
環境は、Raspberry Pi Zero W + Raspberry Pi OS buster。
修正対象ファイルは、 _OpenHSP/src/hsp3dish/raspbian/hsp3dish.cpp 。
HSPは、/dev/input/by-id 以下に、event-kbd(キーボード), event-mouse(マウス)が1つずつ出現するはず、という前提で処理が書かれているけれど。利用するキーボードやマウス製品によっては、そういう情報を返してくるとは限らなくて。
例えば以下の3製品は、想定していない情報を返してくる…。
なので、試しに、/dev/input/by-id以下に出現した event-kbd, event-mouse を全て対象にして ―― キーボードが1つ、マウスが1つ接続されてるはずと決めつけないで、相手が event-kbd か event-mouse と言ってきたらとにかくそれら全てを何個でも監視対象にして、かつ、各機器がキー入力とマウス入力を混ぜてきても取得できるように変更して動作確認してみた。
ちなみに、昨日試した、/proc/bus/input/devices の内容を見てキーボードを見つける処理は削除した。その処理では、EV=1200.. を返す機器が複数出てきた際に、どのみち対処できないので…。
修正部分は、initKeyboard(), updateKeyboard(), doneKeyboard() の3つ。かつ、グローバル変数をいくつか追加。
_hsp3dish.cpp
_hsp3dish.cpp.diff
動作確認には、sample/block3.hsp を利用。マウスを移動するとバーが左右に動いて、ESCキーを押すか、マウスの右ボタンクリックでスクリプトが終了する。
環境は、Raspberry Pi Zero W + Raspberry Pi OS buster。
修正対象ファイルは、 _OpenHSP/src/hsp3dish/raspbian/hsp3dish.cpp 。
HSPは、/dev/input/by-id 以下に、event-kbd(キーボード), event-mouse(マウス)が1つずつ出現するはず、という前提で処理が書かれているけれど。利用するキーボードやマウス製品によっては、そういう情報を返してくるとは限らなくて。
例えば以下の3製品は、想定していない情報を返してくる…。
- USB接続ワイヤレスキーボード(タッチパッド付) Logicool K400r : event-mouse は返すが event-kbd は返さない。また、キーボードとマウスの入力値が、同じevent番号に入ってくる。
- USB接続ワイヤレスキーボード BUFFALO BSKBW03WH : event-kbd と event-mouse を返す。
- USB有線接続マウス A4Tech XL-755BK : event-mouse と event-kbd を返す。
なので、試しに、/dev/input/by-id以下に出現した event-kbd, event-mouse を全て対象にして ―― キーボードが1つ、マウスが1つ接続されてるはずと決めつけないで、相手が event-kbd か event-mouse と言ってきたらとにかくそれら全てを何個でも監視対象にして、かつ、各機器がキー入力とマウス入力を混ぜてきても取得できるように変更して動作確認してみた。
ちなみに、昨日試した、/proc/bus/input/devices の内容を見てキーボードを見つける処理は削除した。その処理では、EV=1200.. を返す機器が複数出てきた際に、どのみち対処できないので…。
修正部分は、initKeyboard(), updateKeyboard(), doneKeyboard() の3つ。かつ、グローバル変数をいくつか追加。
_hsp3dish.cpp
_hsp3dish.cpp.diff
動作確認には、sample/block3.hsp を利用。マウスを移動するとバーが左右に動いて、ESCキーを押すか、マウスの右ボタンクリックでスクリプトが終了する。
◎ 動作結果。 :
この修正をしたことで、Logicool K400r も、ESCキーを押すとスクリプトが終了するし、マウス(タッチパッド)を動かすとバーが左右に動くようになった。
また、ワーストケース(?)、BUFFALO BSKBW03WH + A4Tech XL-755BK の組み合わせでも、ESCキーを押すとスクリプトが終了するし、マウスを動かすとバーが左右に動いてくれた。
ということで、もしかすると書き方次第では、変わった識別情報を返してくるキーボードやマウスにも対応できそうだなと…。
ただ、キー入力やマウス入力を解析する部分が、こういう書き方でも問題無いのかどうかは分からず…。一応動いてるように見えるけど…。キー入力で evp->code == 0 or 1 が来た時におかしなことにならないか…。
また、ワーストケース(?)、BUFFALO BSKBW03WH + A4Tech XL-755BK の組み合わせでも、ESCキーを押すとスクリプトが終了するし、マウスを動かすとバーが左右に動いてくれた。
ということで、もしかすると書き方次第では、変わった識別情報を返してくるキーボードやマウスにも対応できそうだなと…。
ただ、キー入力やマウス入力を解析する部分が、こういう書き方でも問題無いのかどうかは分からず…。一応動いてるように見えるけど…。キー入力で evp->code == 0 or 1 が来た時におかしなことにならないか…。
◎ ログ内容。 :
hsp3dish.cpp に printf() を入れてキーボードやマウスの認識状態を確認した結果もメモ。
BUFFALO BSKBW03WH + A4Tech XL-755BK の場合は以下。
実態としては、キーボード1つ、マウス1つを接続している状態だけど、BUFFALO BSKBW03WH は、キーボードなのに event-kbd と event-mouse を返すし、A4Tech XL-755BK は、マウスなのに event-mouse と event-kbd を返すので、計4つの機器が認識されていることになっている。が、4つの event を全部チェックするようにしたので、 ESCキー押しも、マウスの移動も反応するようになった。
Logiccol K400r を接続した場合は以下。
Logicool K400r はタッチパッド付キーボードで、event-mouse しか返さない。また、キーボード入力もマウス入力も1つのeventに割り当てられてしまう。なので、HSPからはマウス1つ分だけが検出される。が、キーボードかマウスかで入力の解析処理を分けずに、キー入力もマウス入力もどちらも1つのeventに入ってくる可能性があることを前提にして入力をチェックするようにしたので、ESCキー押しも、マウス操作(タッチパッド操作)も反応するようになった。
BUFFALO BSKBW03WH + A4Tech XL-755BK の場合は以下。
Runtime[hsp3dish]. hsed: Runtime [hsp3dish]. Init:hgio_setmainarg(/home/mieki256/OpenHSP/.,__hsptmp.ax) Init:HGIOScreen(1280,720) readdir (.) readdir (..) readdir (usb-A4TECH_USB_Device-event-if00) readdir (usb-A4TECH_USB_Device-if01-event-mouse) match mouse : /dev/input/by-id/usb-A4TECH_USB_Device-if01-event-mouse , devFd : 6 Getting exclusive access: SUCCESS readdir (usb-A4TECH_USB_Device-event-kbd) match kbd : /dev/input/by-id/usb-A4TECH_USB_Device-event-kbd , devFd : 7 readdir (usb-A4TECH_USB_Device-if01-mouse) readdir (usb-JME_RF_Receiver-event-if02) readdir (usb-JME_RF_Receiver-event-kbd) match kbd : /dev/input/by-id/usb-JME_RF_Receiver-event-kbd , devFd : 8 readdir (usb-JME_RF_Receiver-if01-event-mouse) match mouse : /dev/input/by-id/usb-JME_RF_Receiver-if01-event-mouse , devFd : 9 Getting exclusive access: SUCCESS readdir (usb-JME_RF_Receiver-if01-mouse) readdir (usb-Logitech_USB_Receiver-event-if01) Execute from __hsptmp.ax runtime[hsp3dish](1). hsed: Process end 0.
実態としては、キーボード1つ、マウス1つを接続している状態だけど、BUFFALO BSKBW03WH は、キーボードなのに event-kbd と event-mouse を返すし、A4Tech XL-755BK は、マウスなのに event-mouse と event-kbd を返すので、計4つの機器が認識されていることになっている。が、4つの event を全部チェックするようにしたので、 ESCキー押しも、マウスの移動も反応するようになった。
Logiccol K400r を接続した場合は以下。
Runtime[hsp3dish]. hsed: Runtime [hsp3dish]. Init:hgio_setmainarg(/home/mieki256/OpenHSP/.,__hsptmp.ax) Init:HGIOScreen(1280,720) readdir (.) readdir (..) readdir (usb-Logitech_USB_Receiver-if02-event-mouse) match mouse : /dev/input/by-id/usb-Logitech_USB_Receiver-if02-event-mouse , devFd : 6 Getting exclusive access: SUCCESS readdir (usb-Logitech_USB_Receiver-if02-mouse) readdir (usb-Logitech_USB_Receiver-event-if01) Execute from __hsptmp.ax runtime[hsp3dish](1). hsed: Process end 0.
Logicool K400r はタッチパッド付キーボードで、event-mouse しか返さない。また、キーボード入力もマウス入力も1つのeventに割り当てられてしまう。なので、HSPからはマウス1つ分だけが検出される。が、キーボードかマウスかで入力の解析処理を分けずに、キー入力もマウス入力もどちらも1つのeventに入ってくる可能性があることを前提にして入力をチェックするようにしたので、ESCキー押しも、マウス操作(タッチパッド操作)も反応するようになった。
[ ツッコむ ]
以上です。