# Copyright (C) 2020 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#
# Steam Controller - Model 1001 - USB
#

# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html

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 312   BUTTON_L2
key 313   BUTTON_R2

# Triggers.
axis 0x15 LTRIGGER
axis 0x14 RTRIGGER

# Left and right stick.
axis 0x00 X
axis 0x01 Y

# Right stick / mousepad
axis 0x03 Z
axis 0x04 RZ

key 317   BUTTON_THUMBL
key 318   BUTTON_THUMBR

# Hat.
axis 0x10 HAT_X
axis 0x11 HAT_Y

# Dpad (clicks)
key 544 DPAD_UP
key 545 DPAD_DOWN
key 546 DPAD_LEFT
key 547 DPAD_RIGHT

# Touching the dpad (light touch without pressing down)
key 289 BUTTON_1
# Touching the "right stick" / mousepad (light touch without pressing down)
key 290 BUTTON_2

# Pressing the large paddle on the back, left (linux BTN_WHEEL / BTN_GEAR_DOWN)
key 336 BUTTON_3
# Pressing the large paddle on the back, right (linux BTN_GEAR_UP)
key 337 BUTTON_4


# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt
# Left arrow
key 314   BUTTON_SELECT
# Right arrow
key 315   BUTTON_START

# Steam key
key 316   BUTTON_MODE
