blob: 127010f907ff7b33f80029d92c39fef2169f9bf5 [file] [log] [blame]
#ifndef ANDROIDTVREMOTE_SERVICE_JNI_GAMEPAD_KEYS_H_
#define ANDROIDTVREMOTE_SERVICE_JNI_GAMEPAD_KEYS_H_
#include <android/input.h>
#include <android/keycodes.h>
#include <linux/input.h>
namespace android {
// The constant array below defines a mapping between "Android" IDs (key code
// within events) and what is being sent through /dev/uinput.
//
// The translation back from uinput key codes into android key codes is done through
// the corresponding key layout files. This file and
//
// data/keyboards/Vendor_18d1_Product_0200.kl
//
// MUST be kept in sync.
//
// see https://source.android.com/devices/input/key-layout-files for documentation.
// Defines axis mapping information between android and
// uinput axis.
struct GamepadKey {
int32_t androidKeyCode;
int linuxUinputKeyCode;
};
static const GamepadKey GAMEPAD_KEYS[] = {
// Right-side buttons. A/B/X/Y or circle/triangle/square/X or similar
{AKEYCODE_BUTTON_A, BTN_A},
{AKEYCODE_BUTTON_B, BTN_B},
{AKEYCODE_BUTTON_X, BTN_X},
{AKEYCODE_BUTTON_Y, BTN_Y},
// Bumper buttons and digital triggers. Triggers generally have
// both analog versions (GAS and BRAKE output) and digital ones
{AKEYCODE_BUTTON_L1, BTN_TL2},
{AKEYCODE_BUTTON_L2, BTN_TL},
{AKEYCODE_BUTTON_R1, BTN_TR2},
{AKEYCODE_BUTTON_R2, BTN_TR},
// general actions for controllers
{AKEYCODE_BUTTON_SELECT, BTN_SELECT}, // Options or "..."
{AKEYCODE_BUTTON_START, BTN_START}, // Menu/Hamburger menu
{AKEYCODE_BUTTON_MODE, BTN_MODE}, // "main" button
// Pressing on the joyticks themselves
{AKEYCODE_BUTTON_THUMBL, BTN_THUMBL},
{AKEYCODE_BUTTON_THUMBR, BTN_THUMBR},
// DPAD digital keys. HAT axis events are generally also sent.
{AKEYCODE_DPAD_UP, KEY_UP},
{AKEYCODE_DPAD_DOWN, KEY_DOWN},
{AKEYCODE_DPAD_LEFT, KEY_LEFT},
{AKEYCODE_DPAD_RIGHT, KEY_RIGHT},
// "Extra" controller buttons: some devices have "share" and "assistant"
{AKEYCODE_BUTTON_1, BTN_TRIGGER_HAPPY1},
{AKEYCODE_BUTTON_2, BTN_TRIGGER_HAPPY2},
{AKEYCODE_BUTTON_3, BTN_TRIGGER_HAPPY3},
{AKEYCODE_BUTTON_4, BTN_TRIGGER_HAPPY4},
{AKEYCODE_BUTTON_5, BTN_TRIGGER_HAPPY5},
{AKEYCODE_BUTTON_6, BTN_TRIGGER_HAPPY6},
{AKEYCODE_BUTTON_7, BTN_TRIGGER_HAPPY7},
{AKEYCODE_BUTTON_8, BTN_TRIGGER_HAPPY8},
{AKEYCODE_BUTTON_9, BTN_TRIGGER_HAPPY9},
{AKEYCODE_BUTTON_10, BTN_TRIGGER_HAPPY10},
{AKEYCODE_BUTTON_11, BTN_TRIGGER_HAPPY11},
{AKEYCODE_BUTTON_12, BTN_TRIGGER_HAPPY12},
{AKEYCODE_BUTTON_13, BTN_TRIGGER_HAPPY13},
{AKEYCODE_BUTTON_14, BTN_TRIGGER_HAPPY14},
{AKEYCODE_BUTTON_15, BTN_TRIGGER_HAPPY15},
{AKEYCODE_BUTTON_16, BTN_TRIGGER_HAPPY16},
// Assignment to support global assistant for devices that support it.
{AKEYCODE_ASSIST, KEY_ASSISTANT},
{AKEYCODE_VOICE_ASSIST, KEY_VOICECOMMAND},
};
// Defines axis mapping information between android and
// uinput axis.
struct GamepadAxis {
int32_t androidAxis;
float androidRangeMin;
float androidRangeMax;
int linuxUinputAxis;
int linuxUinputRangeMin;
int linuxUinputRangeMax;
};
// List of all axes supported by a gamepad
static const GamepadAxis GAMEPAD_AXES[] = {
{AMOTION_EVENT_AXIS_X, -1, 1, ABS_X, 0, 254}, // Left joystick X
{AMOTION_EVENT_AXIS_Y, -1, 1, ABS_Y, 0, 254}, // Left joystick Y
{AMOTION_EVENT_AXIS_Z, -1, 1, ABS_Z, 0, 254}, // Right joystick X
{AMOTION_EVENT_AXIS_RZ, -1, 1, ABS_RZ, 0, 254}, // Right joystick Y
{AMOTION_EVENT_AXIS_LTRIGGER, 0, 1, ABS_GAS, 0, 254}, // Left trigger
{AMOTION_EVENT_AXIS_RTRIGGER, 0, 1, ABS_BRAKE, 0, 254}, // Right trigger
{AMOTION_EVENT_AXIS_HAT_X, -1, 1, ABS_HAT0X, -1, 1}, // DPad X
{AMOTION_EVENT_AXIS_HAT_Y, -1, 1, ABS_HAT0Y, -1, 1}, // DPad Y
};
} // namespace android
#endif // ANDROIDTVREMOTE_SERVICE_JNI_GAMEPAD_KEYS_H_