1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.content.browser.input; 6 7 import android.view.KeyEvent; 8 import android.view.MotionEvent; 9 10 import org.chromium.base.JNINamespace; 11 12 /** 13 * Class to manage mapping information related to each supported gamepad controller device. 14 */ 15 @JNINamespace("content") 16 class GamepadMappings { 17 private static final String NVIDIA_SHIELD_DEVICE_NAME_PREFIX = 18 "NVIDIA Corporation NVIDIA Controller"; 19 private static final String MICROSOFT_XBOX_PAD_DEVICE_NAME = "Microsoft X-Box 360 pad"; 20 private static final String PS3_SIXAXIS_DEVICE_NAME = "Sony PLAYSTATION(R)3 Controller"; 21 private static final String SAMSUNG_EI_GP20_DEVICE_NAME = "Samsung Game Pad EI-GP20"; 22 mapToStandardGamepad(float[] mappedAxes, float[] mappedButtons, float[] rawAxes, float[] rawButtons, String deviceName)23 public static boolean mapToStandardGamepad(float[] mappedAxes, float[] mappedButtons, 24 float[] rawAxes, float[] rawButtons, String deviceName) { 25 if (deviceName.startsWith(NVIDIA_SHIELD_DEVICE_NAME_PREFIX)) { 26 mapShieldGamepad(mappedButtons, rawButtons, mappedAxes, rawAxes); 27 return true; 28 } else if (deviceName.equals(MICROSOFT_XBOX_PAD_DEVICE_NAME)) { 29 mapXBox360Gamepad(mappedButtons, rawButtons, mappedAxes, rawAxes); 30 return true; 31 } else if (deviceName.equals(PS3_SIXAXIS_DEVICE_NAME)) { 32 mapPS3SixAxisGamepad(mappedButtons, rawButtons, mappedAxes, rawAxes); 33 return true; 34 } else if (deviceName.equals(SAMSUNG_EI_GP20_DEVICE_NAME)) { 35 mapSamsungEIGP20Gamepad(mappedButtons, rawButtons, mappedAxes, rawAxes); 36 return true; 37 } 38 39 mapUnknownGamepad(mappedButtons, rawButtons, mappedAxes, rawAxes); 40 return false; 41 } 42 mapCommonXYABButtons(float[] mappedButtons, float[] rawButtons)43 private static void mapCommonXYABButtons(float[] mappedButtons, float[] rawButtons) { 44 float a = rawButtons[KeyEvent.KEYCODE_BUTTON_A]; 45 float b = rawButtons[KeyEvent.KEYCODE_BUTTON_B]; 46 float x = rawButtons[KeyEvent.KEYCODE_BUTTON_X]; 47 float y = rawButtons[KeyEvent.KEYCODE_BUTTON_Y]; 48 mappedButtons[CanonicalButtonIndex.BUTTON_PRIMARY] = a; 49 mappedButtons[CanonicalButtonIndex.BUTTON_SECONDARY] = b; 50 mappedButtons[CanonicalButtonIndex.BUTTON_TERTIARY] = x; 51 mappedButtons[CanonicalButtonIndex.BUTTON_QUATERNARY] = y; 52 } 53 mapCommonStartSelectMetaButtons( float[] mappedButtons, float[] rawButtons)54 private static void mapCommonStartSelectMetaButtons( 55 float[] mappedButtons, float[] rawButtons) { 56 float start = rawButtons[KeyEvent.KEYCODE_BUTTON_START]; 57 float select = rawButtons[KeyEvent.KEYCODE_BUTTON_SELECT]; 58 float mode = rawButtons[KeyEvent.KEYCODE_BUTTON_MODE]; 59 mappedButtons[CanonicalButtonIndex.BUTTON_START] = start; 60 mappedButtons[CanonicalButtonIndex.BUTTON_BACK_SELECT] = select; 61 mappedButtons[CanonicalButtonIndex.BUTTON_META] = mode; 62 } 63 mapCommonThumbstickButtons(float[] mappedButtons, float[] rawButtons)64 private static void mapCommonThumbstickButtons(float[] mappedButtons, float[] rawButtons) { 65 float thumbL = rawButtons[KeyEvent.KEYCODE_BUTTON_THUMBL]; 66 float thumbR = rawButtons[KeyEvent.KEYCODE_BUTTON_THUMBR]; 67 mappedButtons[CanonicalButtonIndex.BUTTON_LEFT_THUMBSTICK] = thumbL; 68 mappedButtons[CanonicalButtonIndex.BUTTON_RIGHT_THUMBSTICK] = thumbR; 69 } 70 mapCommonTriggerButtons(float[] mappedButtons, float[] rawButtons)71 private static void mapCommonTriggerButtons(float[] mappedButtons, float[] rawButtons) { 72 float l1 = rawButtons[KeyEvent.KEYCODE_BUTTON_L1]; 73 float r1 = rawButtons[KeyEvent.KEYCODE_BUTTON_R1]; 74 mappedButtons[CanonicalButtonIndex.BUTTON_LEFT_TRIGGER] = l1; 75 mappedButtons[CanonicalButtonIndex.BUTTON_RIGHT_TRIGGER] = r1; 76 } 77 mapCommonDpadButtons(float[] mappedButtons, float[] rawButtons)78 private static void mapCommonDpadButtons(float[] mappedButtons, float[] rawButtons) { 79 float dpadDown = rawButtons[KeyEvent.KEYCODE_DPAD_DOWN]; 80 float dpadUp = rawButtons[KeyEvent.KEYCODE_DPAD_UP]; 81 float dpadLeft = rawButtons[KeyEvent.KEYCODE_DPAD_LEFT]; 82 float dpadRight = rawButtons[KeyEvent.KEYCODE_DPAD_RIGHT]; 83 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_DOWN] = dpadDown; 84 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_UP] = dpadUp; 85 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_LEFT] = dpadLeft; 86 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_RIGHT] = dpadRight; 87 } 88 mapXYAxes(float[] mappedAxes, float[] rawAxes)89 private static void mapXYAxes(float[] mappedAxes, float[] rawAxes) { 90 mappedAxes[CanonicalAxisIndex.AXIS_LEFT_STICK_X] = rawAxes[MotionEvent.AXIS_X]; 91 mappedAxes[CanonicalAxisIndex.AXIS_LEFT_STICK_Y] = rawAxes[MotionEvent.AXIS_Y]; 92 } 93 mapRXAndRYAxesToRightStick(float[] mappedAxes, float[] rawAxes)94 private static void mapRXAndRYAxesToRightStick(float[] mappedAxes, float[] rawAxes) { 95 mappedAxes[CanonicalAxisIndex.AXIS_RIGHT_STICK_X] = rawAxes[MotionEvent.AXIS_RX]; 96 mappedAxes[CanonicalAxisIndex.AXIS_RIGHT_STICK_Y] = rawAxes[MotionEvent.AXIS_RY]; 97 } 98 mapZAndRZAxesToRightStick(float[] mappedAxes, float[] rawAxes)99 private static void mapZAndRZAxesToRightStick(float[] mappedAxes, float[] rawAxes) { 100 mappedAxes[CanonicalAxisIndex.AXIS_RIGHT_STICK_X] = rawAxes[MotionEvent.AXIS_Z]; 101 mappedAxes[CanonicalAxisIndex.AXIS_RIGHT_STICK_Y] = rawAxes[MotionEvent.AXIS_RZ]; 102 } 103 mapTriggerAxexToShoulderButtons(float[] mappedButtons, float[] rawAxes)104 private static void mapTriggerAxexToShoulderButtons(float[] mappedButtons, float[] rawAxes) { 105 float lTrigger = rawAxes[MotionEvent.AXIS_LTRIGGER]; 106 float rTrigger = rawAxes[MotionEvent.AXIS_RTRIGGER]; 107 mappedButtons[CanonicalButtonIndex.BUTTON_LEFT_SHOULDER] = lTrigger; 108 mappedButtons[CanonicalButtonIndex.BUTTON_RIGHT_SHOULDER] = rTrigger; 109 } 110 negativeAxisValueAsButton(float input)111 private static float negativeAxisValueAsButton(float input) { 112 return (input < -0.5f) ? 1.f : 0.f; 113 } 114 positiveAxisValueAsButton(float input)115 private static float positiveAxisValueAsButton(float input) { 116 return (input > 0.5f) ? 1.f : 0.f; 117 } 118 mapHatAxisToDpadButtons(float[] mappedButtons, float[] rawAxes)119 private static void mapHatAxisToDpadButtons(float[] mappedButtons, float[] rawAxes) { 120 float hatX = rawAxes[MotionEvent.AXIS_HAT_X]; 121 float hatY = rawAxes[MotionEvent.AXIS_HAT_Y]; 122 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_LEFT] = negativeAxisValueAsButton(hatX); 123 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_RIGHT] = positiveAxisValueAsButton(hatX); 124 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_UP] = negativeAxisValueAsButton(hatY); 125 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_DOWN] = positiveAxisValueAsButton(hatY); 126 } 127 128 /** 129 * Method for mapping Nvidia gamepad axis and button values 130 * to standard gamepad button and axes values. 131 */ mapShieldGamepad(float[] mappedButtons, float[] rawButtons, float[] mappedAxes, float[] rawAxes)132 private static void mapShieldGamepad(float[] mappedButtons, float[] rawButtons, 133 float[] mappedAxes, float[] rawAxes) { 134 mapCommonXYABButtons(mappedButtons, rawButtons); 135 mapCommonTriggerButtons(mappedButtons, rawButtons); 136 mapCommonThumbstickButtons(mappedButtons, rawButtons); 137 mapCommonStartSelectMetaButtons(mappedButtons, rawButtons); 138 mapTriggerAxexToShoulderButtons(mappedButtons, rawAxes); 139 mapHatAxisToDpadButtons(mappedButtons, rawAxes); 140 141 mapXYAxes(mappedAxes, rawAxes); 142 mapZAndRZAxesToRightStick(mappedAxes, rawAxes); 143 } 144 145 /** 146 * Method for mapping Microsoft XBox 360 gamepad axis and button values 147 * to standard gamepad button and axes values. 148 */ mapXBox360Gamepad(float[] mappedButtons, float[] rawButtons, float[] mappedAxes, float[] rawAxes)149 private static void mapXBox360Gamepad(float[] mappedButtons, float[] rawButtons, 150 float[] mappedAxes, float[] rawAxes) { 151 // These are actually mapped the same way in Android. 152 mapShieldGamepad(mappedButtons, rawButtons, mappedAxes, rawAxes); 153 } 154 mapPS3SixAxisGamepad(float[] mappedButtons, float[] rawButtons, float[] mappedAxes, float[] rawAxes)155 private static void mapPS3SixAxisGamepad(float[] mappedButtons, float[] rawButtons, 156 float[] mappedAxes, float[] rawAxes) { 157 // On PS3 X/Y has higher priority. 158 float a = rawButtons[KeyEvent.KEYCODE_BUTTON_A]; 159 float b = rawButtons[KeyEvent.KEYCODE_BUTTON_B]; 160 float x = rawButtons[KeyEvent.KEYCODE_BUTTON_X]; 161 float y = rawButtons[KeyEvent.KEYCODE_BUTTON_Y]; 162 mappedButtons[CanonicalButtonIndex.BUTTON_PRIMARY] = x; 163 mappedButtons[CanonicalButtonIndex.BUTTON_SECONDARY] = y; 164 mappedButtons[CanonicalButtonIndex.BUTTON_TERTIARY] = a; 165 mappedButtons[CanonicalButtonIndex.BUTTON_QUATERNARY] = b; 166 167 mapCommonTriggerButtons(mappedButtons, rawButtons); 168 mapCommonThumbstickButtons(mappedButtons, rawButtons); 169 mapCommonDpadButtons(mappedButtons, rawButtons); 170 mapCommonStartSelectMetaButtons(mappedButtons, rawButtons); 171 mapTriggerAxexToShoulderButtons(mappedButtons, rawAxes); 172 173 mapXYAxes(mappedAxes, rawAxes); 174 mapZAndRZAxesToRightStick(mappedAxes, rawAxes); 175 } 176 mapSamsungEIGP20Gamepad(float[] mappedButtons, float[] rawButtons, float[] mappedAxes, float[] rawAxes)177 private static void mapSamsungEIGP20Gamepad(float[] mappedButtons, float[] rawButtons, 178 float[] mappedAxes, float[] rawAxes) { 179 mapCommonXYABButtons(mappedButtons, rawButtons); 180 mapCommonTriggerButtons(mappedButtons, rawButtons); 181 mapCommonThumbstickButtons(mappedButtons, rawButtons); 182 mapCommonStartSelectMetaButtons(mappedButtons, rawButtons); 183 mapHatAxisToDpadButtons(mappedButtons, rawAxes); 184 185 mapXYAxes(mappedAxes, rawAxes); 186 mapRXAndRYAxesToRightStick(mappedAxes, rawAxes); 187 } 188 189 /** 190 * Method for mapping Unkown gamepad axis and button values 191 * to standard gamepad button and axes values. 192 */ mapUnknownGamepad(float[] mappedButtons, float[] rawButtons, float[] mappedAxes, float[] rawAxes)193 private static void mapUnknownGamepad(float[] mappedButtons, float[] rawButtons, 194 float[] mappedAxes, float[] rawAxes) { 195 mapCommonXYABButtons(mappedButtons, rawButtons); 196 mapCommonTriggerButtons(mappedButtons, rawButtons); 197 mapCommonThumbstickButtons(mappedButtons, rawButtons); 198 mapCommonStartSelectMetaButtons(mappedButtons, rawButtons); 199 mapTriggerAxexToShoulderButtons(mappedButtons, rawAxes); 200 mapCommonDpadButtons(mappedButtons, rawButtons); 201 202 mapXYAxes(mappedAxes, rawAxes); 203 mapRXAndRYAxesToRightStick(mappedAxes, rawAxes); 204 } 205 } 206