• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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