tmytのらくがき

個人の日記レベルです

Surface Duoに接続したSurface Penのボタンをイベントで受ける

Surface DuoはいちおうSurfaceと言ってるだけあって、Surface Pen(Slim Pen含む)に対応してます。サイドボタンなどなども一応ちゃんと動くそうです。

さて、このペンがAndroidにどう認識されているのかとても気になるので確認してみます。

$ getevent -p
add device 1: /dev/input/event6
  name:     "sm8150-tavil-snd-card Button Jack"
  events:
    KEY (0001): 0072  0073  00e2  0104  0105  0246
  input props:
    <none>
add device 2: /dev/input/event5
  name:     "sm8150-tavil-snd-card Headset Jack"
  events:
    SW  (0005): 0002  0004  0006  0007  0010  0011  0012  0013
  input props:
    <none>
add device 3: /dev/input/event4
  name:     "surface_touchscreen"
  events:
    KEY (0001): 0141  014b
    ABS (0003): 002f  : value 0, min 0, max 11, fuzz 0, flat 0, resolution 0
                0030  : value 0, min 0, max 21067, fuzz 0, flat 0, resolution 0
                0031  : value 0, min 0, max 21067, fuzz 0, flat 0, resolution 0
                0034  : value 0, min -90, max 90, fuzz 0, flat 0, resolution 0
                0035  : value 0, min 0, max 17709, fuzz 0, flat 0, resolution 0
                0036  : value 0, min 0, max 11411, fuzz 0, flat 0, resolution 0
                0037  : value 0, min 0, max 15, fuzz 0, flat 0, resolution 0
                0039  : value 0, min 0, max 65535, fuzz 0, flat 0, resolution 0
                003a  : value 0, min 0, max 65535, fuzz 0, flat 0, resolution 0
  input props:
    INPUT_PROP_DIRECT
add device 4: /dev/input/event3
  name:     "surface_tail_button"
  events:
    KEY (0001): 007d  00bc  00bd  00be
  input props:
    <none>
add device 5: /dev/input/event1
  name:     "da7280-haptic"
  events:
    FF  (0015): 0050  0051  0052  005d  0060
  input props:
    <none>
add device 6: /dev/input/event0
  name:     "qpnp_pon"
  events:
    KEY (0001): 0072  0074
  input props:
    <none>
add device 7: /dev/input/event2
  name:     "gpio-keys"
  events:
    KEY (0001): 0073
  input props:
    <none>

"surface_tail_button" なんて気になる名前があります。とりあえずペンで画面をタップします。

/dev/input/event4: 0003 002f 0000000a
/dev/input/event4: 0003 0039 0000ffff
/dev/input/event4: 0003 0035 00002c7f
/dev/input/event4: 0003 0036 000018ae
/dev/input/event4: 0000 0000 00000000
/dev/input/event4: 0003 0035 00002c82

ペンは /dev/input/event4 なので、 "surface_touchscreen" で処理されていました。ペンの両端とも反応します。後のボタンは反応しません。

後ろボタンの行方

ペンの後ろのボタンは"surface_tail_button" で来ると思った…けれどもどうやら違うようです。ペンの後ろボタンは実はBluetooth接続されています。あのボタンだけ。 ペンを接続するために、後ろのボタンを5秒間長押しします。すると、ペンが接続されて新しいデバイスが出現します。

add device 1: /dev/input/event7
  name:     "Surface Slim Pen"
  events:
    KEY (0001): 0001  0002  0003  0004  0005  0006  0007  0008
                0009  000a  000b  000c  000d  000e  000f  0010
                0011  0012  0013  0014  0015  0016  0017  0018
                0019  001a  001b  001c  001d  001e  001f  0020
                0021  0022  0023  0024  0025  0026  0027  0028
                0029  002a  002b  002c  002d  002e  002f  0030
                0031  0032  0033  0034  0035  0036  0037  0038
                0039  003a  003b  003c  003d  003e  003f  0040
                0041  0042  0043  0044  0045  0046  0047  0048
                0049  004a  004b  004c  004d  004e  004f  0050
                0051  0052  0053  0056  0057  0058  0060  0061
                0062  0063  0064  0066  0067  0068  0069  006a
                006b  006c  006d  006e  006f  0074  0075  0077
                007d  007e  007f  00b7  00b8  00b9  00ba  00bb
                00bc  00bd  00be
    ABS (0003): 0028  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0029  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                002a  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                002b  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                002c  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                002d  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                002e  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                002f  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0030  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0031  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0032  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0033  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0034  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0035  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0036  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0037  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0038  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0039  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                003a  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                003b  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                003c  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                003d  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                003e  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                003f  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
    MSC (0004): 0004
  input props:
    <none>

これが後ろのペンに反応する入力デバイスだそうです。これはキーボードに見えていて、ボタンを押すとキーコードを出力します。

操作 キーコード
短押し 291
長押し 289

しかも、ACTION_UPだけきます。

…と、ここまではつながってさえいればアプリに新機能組み込んだりいろいろできそうだね!で終わるのですがちゃんとオチを用意しました。

このボタン、30秒無操作でBluetoothが切断します。30秒以内にボタンを押せば一応延長されます。でも無操作30秒で切断されます。再接続は5秒長押しです。というわけであんまり役に立ちません…

ところで

"surface_tail_button" は何だったんだろう…古いSurface Penだとあそこが反応する…?いやそんなまさかね…