web-dev-qa-db-ja.com

Bluetooth入力デバイスが検出された後にシェルコマンドを実行しますか?

マウスがコンピューターに接続されているときに、自動的にxinputコマンドを使用して、マジックマウスの感度を遅くしようとしています。

rules.dの下に、シェルスクリプトを呼び出すファイルを作成しました。問題は、マウスが他の入力デバイスの間にリストされる前にルールがスクリプトを起動するため、xinputコマンドを除くすべてのスクリプトで適切に機能し、xinputコマンドがそれを見つけられないことです。したがって、私の質問は、そのマウスが入力デバイスとして検出された後にのみ必要なコマンドを実行する方法があるかどうか、または私の問題に対する他の解決策があるかどうかです。

BTでマウスが接続する前のターミナルから:

$ hcitool inq
Inquiring ...
00:1E:52:EE:0C:1B   clock offset: 0x33fb    class: 0x3a0104
84:38:35:31:CC:6B   clock offset: 0x1353    class: 0x002580
$ hcitool scan
Scanning ...
84:38:35:31:CC:6B   Mouse of Elios
00:1E:52:EE:0C:1B   Elios

マウスがBTで接続した後、次のようになります。

$ hcitool info 84:38:35:31:CC:6B
Requesting information ...
BD Address:  84:38:35:31:CC:6B
Device Name: Mouse of Elios
LMP Version: 2.0 (0x3) LMP Subversion: 0x31c
Manufacturer: Apple, Inc. (76)
Features: 0xbd 0x02 0x04 0x38 0x08 0x00 0x00 0x00
    <3-slot packets> <encryption> <slot offset> <timing accuracy> 
    <role switch> <sniff mode> <RSSI> <power control> 
    <enhanced iscan> <interlaced iscan> <interlaced pscan> 
    <AFH cap. slave>

これは、/ etc/udev/rules.dに配置された私のudevルールです。

SUBSYSTEMS=="input", ATTRS{name}=="Mouse of Elios", RUN+="/home/elios/Documents/FixMouse.sh"

これは私のシェルスクリプト/home/elios/Documents/FixMouse.shです(Cbhiheの回答のおかげで編集されました):

#!/bin/sh
while [ ! "$(/usr/bin/hcitool info 84:38:35:31:CC:6B 2>&1 > /dev/null; echo $?)" ]; do
 sleep 0.1
done
xinput --set-prop "Mouse of Elios" "Device Accel Constant Deceleration" 2.5

その他の情報:

$ uname -a
Linux dalek 3.19.0-30-generic #34-Ubuntu SMP Fri Oct 2 22:08:41 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ xinput --list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Mouse of Elios                    id=13   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Apple, Inc Apple Keyboard                 id=10   [slave  keyboard (3)]
    ↳ Apple, Inc Apple Keyboard                 id=11   [slave  keyboard (3)]
    ↳ FaceTime HD Camera (Built-in)             id=12   [slave  keyboard (3)]
$ xinput --list-props "Mouse of Elios"
Device 'Mouse of Elios':
Device Enabled (133):   1
Coordinate Transformation Matrix (135): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Accel Profile (527): 0
Device Accel Constant Deceleration (528):   2.500000
Device Accel Adaptive Deceleration (529):   1.000000
Device Accel Velocity Scaling (530):    10.000000
Device Product ID (253):    1452, 781
Device Node (254):  "/dev/input/event5"
Evdev Axis Inversion (531): 0, 0
Evdev Axes Swap (533):  0
Axis Labels (534):  "Rel X" (143), "Rel Y" (144), "Rel Horiz Wheel" (517), "Rel Vert Wheel" (518)
Button Labels (535):    "Button Left" (136), "Button Middle" (137), "Button Right" (138), "Button Wheel Up" (139), "Button Wheel Down" (140), "Button Horiz Wheel Left" (141), "Button Horiz Wheel Right" (142)
Evdev Scrolling Distance (536): 1, 1, 1
Evdev Middle Button Emulation (537):    0
Evdev Middle Button Timeout (538):  50
Evdev Third Button Emulation (539): 0
Evdev Third Button Emulation Timeout (540): 1000
Evdev Third Button Emulation Button (541):  3
Evdev Third Button Emulation Threshold (542):   20
Evdev Wheel Emulation (543):    0
Evdev Wheel Emulation Axes (544):   0, 0, 4, 5
Evdev Wheel Emulation Inertia (545):    10
Evdev Wheel Emulation Timeout (546):    200
Evdev Wheel Emulation Button (547): 4
Evdev Drag Lock Buttons (548):  0
4
elios

Yr udevルールによって呼び出されるスクリプトでは、while, do, doneスニペットを以下に配置します。beforexinputパラメーターの調整。

#!/bin/sh 
while [ ! "$(/usr/bin/hcitool info 84:38:35:31:CC:6B >& /dev/null; echo $?)" ]; do
     sleep 0.1
done
xinput --set-prop "Mouse of Elios" "Device Accel Constant Deceleration" 5.0
xinput --set-prop "Mouse of Elios" "Device Accel Adaptive Deceleration" 1.0
xinput --set-prop "Mouse of Elios" "Device Accel Velocity Scaling" 3.3

マウスがBluetoothによって適切にテザリングされるまで、およびxinput --set-prop cmdsが起動するまで、yrスクリプトは0.1秒の連続した時間間隔を待機できます。

マウスの手の動きに対する反応を微調整するには、3つの方法があることに注意してください。

  • デバイスアクセラレータの一定減速度(528):2.500000
  • デバイスアクセラレータの適応減速(529):1.000000
  • Device Accel Velocity Scaling(530):10.000000

this および this outをチェックして、これらのパラメーター値が何を表しているかを正確に把握します。 「速度のスケーリング」を十分に変更するには、マウスのリフレッシュレート(Hz)を知る必要があります。その値は、マウスのテクニカルデータシートに記載されています。 Velocity Scaling値は1000/refresh_rate_in_Hzと推定されます。したがって、3.3は300Hzのリフレッシュレートを想定し、10は100Hzのリフレッシュレートを想定しています。

Yrスクリプトは、次のデフォルト値を変更しないようです。

  • Device Accel Constant Deceleration (528): 2.500000
  • Device Accel Adaptive Decelaration (529): 1.000000

yr xinput --list-props cmdで明らかにされたように、prop_id 528の値2.5を変更して、prop_id 529を1(デフォルト)に設定すると、「適応的な加速または減速がないことを意味します」。

Gillesの answer onAU/U&Lから適応したudevルールは、厳密にはyrの場合には適用されません。必要なのは、デバイスを「追加」するとき、つまりデバイスの存在が最初にカーネルイベントをトリガーするとすぐに適用されるルールです。したがって、yr udevルールは単純に次のようになります。

ACTION=="add", SUBSYSTEMS=="input", ATTRS{idVendor}=="____", ATTRS{idProduct}=="____", RUN+="/usr/local/sbin/fixmouse"

____を実際のデバイスのidVendorおよびidProductに置き換える必要があります。その情報を見つけるには:

$ udevadm monitor

yr BTマウスを接続します。 「KERNEL」が表示されている行を読みます。何かに似ています

  KERNEL[22576.118379] add   /devices/pci0000:00/0000:00:1d.7/hci2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0004/input/input23/mouse1 (input)

監視を終了するには、CTRL + Cを入力してから:

$ udevadm info -a -p '/devices/pci0000:00/0000:00:1d.7/hci2/2-3/2-3.4/2-3.4' | grep -e "idVendor" -e "idProduct" 

ハードウェアの組み立て方法に応じて、(idVendor、idProduct)値の2つまたは3つのペアを取得する必要があります。私のユースケースは次のとおりです:

ATTRS{idVendor}=="192f"
ATTRS{idProduct}=="0916"
ATTRS{idVendor}=="1a40"
ATTRS{idProduct}=="0101"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0002"

表示される順にyr udevルールで試してください。通常、一番上のものが良いものでなければなりません。

終了するには:

$ Sudo mv /home/elios/Documents/FixMouse.sh /usr/local/sbin/fixmouse
$ Sudo chown root:root /usr/local/sbin/fixmouse
$ Sudo chmod 755 /usr/local/sbin/fixmouse

これが正しかったことを願っています。どちらの方法でもお知らせください。

2
Cbhihe