Android端末のハンドルにリニアトリガーをマッピングできない問題の解決策(1)

[転載の際は作者と出典を明記してください]
この解決策では Android デバイスが Root 権限を取得している必要があり、この記事では解決策のみを提供します。記事に記載されているコードを自分のデバイスで直接使用することはできません。次のように変更してください。自分のデバイスに合わせて調整してください。
テスト機器:Xiaoxin Pad pro 2021、Android 11


1. はじめに
モバイル端末でコントローラーをネイティブにサポートするゲームが少ないことはよく知られていますが、人気のモバイル ゲームをコントローラーでプレイするには基本的にマッピングが必要であり、コントローラーを入力デバイスとして使用するエミュレーターもキー マッピングを渡す必要があります。
ブロガーは最近、Android デバイスで使用するために多くのハンドルを購入しましたが、それらの一部のリニア トリガーはマッピング アプリを使用して画面のクリックにマッピングできず、 Skyline エミュレータを使用する場合は L2R2 キーに正常にマッピングできないことがわかりました。この問題を解決するために一晩中勉強しましたが、この問題を解決し、ハンドル機能の拡張についていくつかのアイデアを提案したため、この記事は同じ問題に遭遇した友人の参考になるように書かれています。
理論的には、すべてのコントローラー、ルート化された Android デバイス、Linux デバイスに適用できます。
テストに使用したハンドル:
純正デュアルショック 4 (PS4 ハンドル付き): USB 接続および Bluetooth 接続、リニア トリガー
国内デュアルショック 4: Bluetooth 接続、リニア トリガー
1UP GC1 (ハンドル付きレーシェン ボックス): Bluetooth 接続、リニア トリガー
Obox OC1 (カタツムリ ホスト)対応ハンドル):Bluetooth接続、リニアトリガー
信管ハンドル(トマホークF1ホスト対応ハンドル):Bluetooth接続、リニアトリガー
国内Xbox360ハンドル 有線:USB接続、リニアトリガー
Flying Octopus世代:Bluetooth接続、USB2.4Gレシーバー、リニアトリガー、Feizhiウィー世代: Bluetooth 接続、
ワイヤレス トリガーマッピング
に使用される APP
(リニア トリガーがマッピングできない問題は APP とは関係ありません): ZUI ペリフェラル モード
北東ゲーム ホール
Mantis
Gamepad Shanwan Gamepad


2. 問題分析
さまざまなハンドルのリニア トリガー入力をテストする過程で、ブロガーは 3 つの異なる入力モードを発見しました。
1. GAS と BRAKE 入力のみ。

1d3c95a7cfa3487e9854fd674ae82b4e.png

2. GAS/RTRIGGER と BRAKE/LTRIGGER の両方の入力信号があり、それらは結合されています。

b2b1c2eaf72c40359542d8d71866907f.png
3. GAS/RTRIGGER と BRAKE/LTRIGGER (ABS イベント) の入力信号が同時に存在するだけでなく、リニア トリガーの値が一定に達すると、入力 BUTTON_L2 または BUTTON_R2 (KEY イベント) もトリガーされます。この場合、ハンドルの内部プログラムは、他のプラットフォームとの互換性を補うために行われる可能性があります (ds4 および Feizhi Octopus がそのような入力モードです)。

b994383c62344aa8888f3f22482368c3.png

1 番目のケースは通常、ソフトウェアでキー マッピングが設定されている場合にトリガー キーが認識できないことを意味します。2
番目のケースは、通常、キー マッピングがソフトウェアで設定されている場合にトリガーキーが L2/R2 として認識されることを意味しますが、ゲームのトリガー マッピングでは認識できません。3
番目のケースでは、ボタンは正常に認識され、正常にトリガーできます。

リニアトリガーの入力イベントはジョイスティックのABSイベントと同じなので、入力はアナログ量になりますが、通常のキーの入力はKEYイベントなので0と1のみが入力されます。画面が KEY イベントと同じタイプの場合、ハンドル自体が BUTTON_L2/R2 入力補正を行わない場合、ほとんどのマッピング ソフトウェアはアナログ入力をボタン入力にマッピングできないため、リニア トリガーをマッピングできない状況が発生します。
ブロガーはFeizhi Weeハンドルをリニアトリガーなしで使用しており、トリガーキーはKEYイベントを入力する通常のキーと同じであるため、そのような問題はありません。


3. 解決策
1. kl ファイルを変更します。
テストの結果、GAS と BRAKE が入力された場合にのみマッピング ソフトウェアがそれを認識できないことがわかりました。kl ファイルを設定し、2 つのトリガー キーを LTRIGGER と RTRIGGER にバインドすることで、マッピングソフトウェアがそれを認識し、デバイスがこのステップまで設定された後、トリガー ボタンのマッピングを実現できます。それでもマッピングが完了できない場合は、2 番目の問題を参照してください。
ここでは 1UP GC1 ハンドルをデモンストレーションに使用します。このハンドルのトリガー入力は GAS と BRAKE のみです。kl ファイルを変更すると、LTRIGGER と RTRIGGER 入力信号を持つことができます。
kl ファイルは /system/usr/keylayout ディレクトリにあります。一部のデバイスでは、システム パーティションを変更するにはシステム パーティションのロックを解除する必要があります。パーティションのロック解除の問題はご自身で解決してください。
kl ファイルの命名形式は Vendor_xxxx_Product_xxxx.kl です。自分のデバイスのファイルが見つかった場合は、それを直接変更できます (通常、Xbox や PS コントローラーなどの大手メーカーの機器)。1UP GC1 コントローラーは私の手はキーレイアウト内にあります ディレクトリ内に kl ファイルがありません。手動で作成する必要があります。
以下では、デバイスのベンダー コードと製品コードを見つける方法を説明します。
まずターミナル (被験者が使用する Termux) を開き、su と入力して root 権限を取得し、getevent コマンドを入力すると、現在の入力イベント情報がポップアップ表示され、入力イベントがリアルタイムで画面に出力されます。次のようにしてターミナルを確認できます。ハンドルのボタンを 2 回押すと出力情報が含まれます。自分のデバイスのイベント番号を書き留めます。ここでの件名はイベント 21 です。

$ su

# getevent

298fa4d844aa430aa25cd509cc857553.png
getevent -i /dev/input/event21 と入力すると、自分のデバイスの情報が表示されます (この情報の意味を知りたい場合は、Linux 入力サブシステムの情報を自分で検索して学習できます)。

# getevent -i /dev/input/event21

dcc08368083a4039850cb32fb687e7e7.pngベンダーが 1d79、製品が 1001 であることがわかります。そのため、 /system/usr/keylayout ディレクトリにVendor_1d79_Product_1001.klという名前のファイルを作成し、それを開いた後に次の内容を入力します。 (インターネットで情報を見つけてください) kl ファイルの書き方の詳細については、こちらをご覧ください)

# 1UP GC1
key 304 BUTTON_A
key 305 BUTTON_B
key 307 BUTTON_X
key 308 BUTTON_Y
key 310 BUTTON_L1
key 311 BUTTON_R1
key 315 BUTTON_START
key 314 BUTTON_SELECT
key 172 BUTTON_MODE
key 317 BUTTON_THUMBL
key 318 BUTTON_THUMBL

axis 0x00 X
axis 0x01 Y
axis 0x02 Z
axis 0x05 RZ
axis 0x09 RTRIGGER        #重点
axis 0x0a LTRIGGER        #重点
axis 0x10 HAT_X
axis 0x11 HAT_Y


ここで行う作業は主に、2 つのトリガーの軸を RTRIGGER と LTRIGGER にバインドすることです (
これら 2 つの文が次のように変更される場合)。

axis 0x09 GAS
axis 0x0a BRAKE


その場合、アプリは GAS と BRAKE のみを検出します。
すべてのハンドルが私と同じ入力信号を持っているわけではありません。つまり、トリガー ボタンの入力信号は必ずしも 0x09 と 0x0a であるとは限らず、状況に応じて変更する必要があります。自身のハンドルを使用して入力信号を取得します 方法は次のとおりです:
ターミナルに getevent /dev/input/event21 と入力し、左トリガーを引くと多くの出力が表示されます ここでの出力はすべて 16 進数で表され、0003 はABS イベント (つまり軸) を入力し、000a は kl ファイルの 0x0a に書き込んだものです。右トリガーも同様に設定します。

getevent  /dev/input/event21

081d61b33e444436be553bc8fa5d0279.png
kl ファイルを編集した後、ハンドルを保存して再接続すると、ハンドル トリガーが正常にマッピングできるかどうかを確認できます。
まだ後半が見れない方は。

おすすめ

転載: blog.csdn.net/oyanzhishiyue/article/details/125966856