OLD | NEW |
(Empty) | |
| 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; |
| 6 |
| 7 import org.chromium.content.browser.input.gamepad_mapping.CanonicalAxisIndex; |
| 8 import org.chromium.content.browser.input.gamepad_mapping.CanonicalButtonIndex; |
| 9 |
| 10 /* |
| 11 * Class to manage mapping information related to each supported gamepad control
ler device. |
| 12 */ |
| 13 |
| 14 class GamepadMappings { |
| 15 // Following values should be changed if the gamepad layout changes |
| 16 // or frameworks exposes different axes / buttons for a particular gamepad. |
| 17 // mRawShieldAxes is the total raw axes on known shield gamepad. |
| 18 protected static final int mRawShieldAxes = 10; |
| 19 // mRawShieldButtons is the total raw buttons on known shield gamepad. |
| 20 protected static final int mRawShieldButtons = 10; |
| 21 // mRawXBoxAxes is the total raw axes on known XBox gamepad. |
| 22 protected static final int mRawXBoxAxes = 10; |
| 23 // mRawXBoxButtons is the total raw buttons on known XBox gamepad. |
| 24 protected static final int mRawXBoxButtons = 9; |
| 25 |
| 26 public static boolean mapToStandardGamepad(float[] mappedAxis, float[] mappe
dButtons, |
| 27 float[] rawAxes, float[] rawButto
ns, |
| 28 String deviceName) { |
| 29 boolean isMapped = true; |
| 30 if (deviceName.contains("NVIDIA Corporation NVIDIA Controller") && |
| 31 rawAxes.length == mRawShieldAxes && rawButtons.length == mRawShieldB
uttons) { |
| 32 mapShieldGamepad(mappedButtons, rawButtons, mappedAxis, rawAxes); |
| 33 } |
| 34 else if (deviceName.contains("Microsoft X-Box 360 pad") && |
| 35 rawAxes.length == mRawXBoxAxes && rawButtons.length == mRawXBox
Buttons) { |
| 36 mapXBox360Gamepad(mappedButtons, rawButtons, mappedAxis, rawAxes); |
| 37 } |
| 38 else { |
| 39 isMapped = false; |
| 40 } |
| 41 return isMapped; |
| 42 } |
| 43 |
| 44 private static float negativeAxisValueAsButton(float input) { |
| 45 return (input < -0.5f) ? 1.f : 0.f; |
| 46 } |
| 47 |
| 48 private static float positiveAxisValueAsButton(float input) { |
| 49 return (input > 0.5f) ? 1.f : 0.f; |
| 50 } |
| 51 |
| 52 /** |
| 53 * Method for mapping Nvidia gamepad axis and button values |
| 54 * to standard gamepad button and axes values. |
| 55 */ |
| 56 private static void mapShieldGamepad(float[] mappedButtons, float[] rawButto
ns, |
| 57 float[] mappedAxis, float[] rawAxes) { |
| 58 // First four buttons on Nvidia gamepad appear in correct order so no ma
pping is required. |
| 59 mappedButtons[CanonicalButtonIndex.BUTTON_PRIMARY] = rawButtons[0]; |
| 60 mappedButtons[CanonicalButtonIndex.BUTTON_SECONDARY] = rawButtons[1]; |
| 61 mappedButtons[CanonicalButtonIndex.BUTTON_TERTIARY] = rawButtons[2]; |
| 62 mappedButtons[CanonicalButtonIndex.BUTTON_QUATERNARY] = rawButtons[3]; |
| 63 // Third axis on Nvidia gamepad acts as a bottom left trigger button. |
| 64 mappedButtons[CanonicalButtonIndex.BUTTON_LEFT_TRIGGER] = rawAxes[2]; |
| 65 mappedButtons[CanonicalButtonIndex.BUTTON_LEFT_SHOULDER] = rawButtons[4]
; |
| 66 mappedButtons[CanonicalButtonIndex.BUTTON_RIGHT_SHOULDER] = rawButtons[5
]; |
| 67 mappedButtons[CanonicalButtonIndex.BUTTON_BACK_SELECT] = rawButtons[6]; |
| 68 mappedButtons[CanonicalButtonIndex.BUTTON_START] = rawButtons[7]; |
| 69 mappedButtons[CanonicalButtonIndex.BUTTON_LEFT_THUMBSTICK] = rawButtons[
8]; |
| 70 mappedButtons[CanonicalButtonIndex.BUTTON_RIGHT_THUMBSTICK] = rawButtons
[9]; |
| 71 // Seventh axis on Nvidia gamepad acts as a bottom right trigger button. |
| 72 mappedButtons[CanonicalButtonIndex.BUTTON_RIGHT_TRIGGER] = rawAxes[6]; |
| 73 // Ninth axis on Nvidia gamepad acts as directional pad right and left b
utton. |
| 74 // Positive axis value indicates dpad right. |
| 75 // Negative value indicates dpad left. |
| 76 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_RIGHT] = |
| 77 positiveAxisValueAsButton(rawAxes[8]); |
| 78 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_LEFT] = |
| 79 negativeAxisValueAsButton(rawAxes[8]); |
| 80 // Tenth axis on Nvidia gamepad acts as directional pad up and down butt
on. |
| 81 // Positive axis value indicates dpad down. |
| 82 // Negative value indicates dpad up. |
| 83 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_DOWN] = |
| 84 positiveAxisValueAsButton(rawAxes[9]); |
| 85 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_UP] = negativeAxisValueAs
Button(rawAxes[9]); |
| 86 // Other standard buttons are either not present on the gamepad or not e
xposed to an |
| 87 // application. |
| 88 mappedButtons[CanonicalButtonIndex.BUTTON_META] = 0.0f; |
| 89 |
| 90 // Standard gamepad can have only four axes. |
| 91 mappedAxis[CanonicalAxisIndex.AXIS_LEFT_STICK_X] = rawAxes[0]; |
| 92 mappedAxis[CanonicalAxisIndex.AXIS_LEFT_STICK_Y] = rawAxes[1]; |
| 93 mappedAxis[CanonicalAxisIndex.AXIS_RIGHT_STICK_X] = rawAxes[4]; |
| 94 mappedAxis[CanonicalAxisIndex.AXIS_RIGHT_STICK_Y] = rawAxes[5]; |
| 95 } |
| 96 |
| 97 /** |
| 98 * Method for mapping Microsoft XBox 360 gamepad axis and button values |
| 99 * to standard gamepad button and axes values. |
| 100 */ |
| 101 private static void mapXBox360Gamepad(float[] mappedButtons, float[] rawButt
ons, |
| 102 float[] mappedAxis, float[] rawAxes) { |
| 103 // First four buttons on Microsoft XBox 360 gamepad appear in correct or
der so no mapping |
| 104 // is required. |
| 105 mappedButtons[CanonicalButtonIndex.BUTTON_PRIMARY] = rawButtons[0]; |
| 106 mappedButtons[CanonicalButtonIndex.BUTTON_SECONDARY] = rawButtons[1]; |
| 107 mappedButtons[CanonicalButtonIndex.BUTTON_TERTIARY] = rawButtons[2]; |
| 108 mappedButtons[CanonicalButtonIndex.BUTTON_QUATERNARY] = rawButtons[3]; |
| 109 // Third axis on Microsoft XBox 360 gamepad acts as a left bottom should
er button. |
| 110 mappedButtons[CanonicalButtonIndex.BUTTON_LEFT_TRIGGER] = rawAxes[2]; |
| 111 mappedButtons[CanonicalButtonIndex.BUTTON_LEFT_SHOULDER] = rawButtons[4]
; |
| 112 mappedButtons[CanonicalButtonIndex.BUTTON_RIGHT_SHOULDER] = rawButtons[5
]; |
| 113 mappedButtons[CanonicalButtonIndex.BUTTON_START] = rawButtons[6]; |
| 114 mappedButtons[CanonicalButtonIndex.BUTTON_LEFT_THUMBSTICK] = rawButtons[
7]; |
| 115 mappedButtons[CanonicalButtonIndex.BUTTON_RIGHT_THUMBSTICK] = rawButtons
[8]; |
| 116 // Seventh axis on Microsoft XBox 360 gamepad acts as a right bottom sho
ulder button. |
| 117 mappedButtons[CanonicalButtonIndex.BUTTON_RIGHT_TRIGGER] = rawAxes[6]; |
| 118 // Ninth axis on Microsoft XBox 360 gamepad acts as directional pad righ
t and left button. |
| 119 // Positive axis value indicates dpad right. |
| 120 // Negative value indicates dpad left. |
| 121 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_RIGHT] = |
| 122 positiveAxisValueAsButton(rawAxes[8]); |
| 123 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_LEFT] = |
| 124 negativeAxisValueAsButton(rawAxes[8]); |
| 125 // Tenth axis on Microsoft XBox 360 gamepad acts as directional pad up a
nd down button. |
| 126 // Positive axis value indicates dpad down. |
| 127 // Negative value indicates dpad up. |
| 128 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_DOWN] = |
| 129 positiveAxisValueAsButton(rawAxes[9]); |
| 130 mappedButtons[CanonicalButtonIndex.BUTTON_DPAD_UP] = negativeAxisValueAs
Button(rawAxes[9]); |
| 131 // Other standard buttons are either not present on the gamepad or not e
xposed to an |
| 132 // application. |
| 133 mappedButtons[CanonicalButtonIndex.BUTTON_BACK_SELECT] = 0.0f; |
| 134 mappedButtons[CanonicalButtonIndex.BUTTON_META] = 0.0f; |
| 135 |
| 136 // Standard gamepad can have only four axes. |
| 137 mappedAxis[CanonicalAxisIndex.AXIS_LEFT_STICK_X] = rawAxes[0]; |
| 138 mappedAxis[CanonicalAxisIndex.AXIS_LEFT_STICK_Y] = rawAxes[1]; |
| 139 mappedAxis[CanonicalAxisIndex.AXIS_RIGHT_STICK_X] = rawAxes[4]; |
| 140 mappedAxis[CanonicalAxisIndex.AXIS_RIGHT_STICK_Y] = rawAxes[5]; |
| 141 } |
| 142 |
| 143 } |
OLD | NEW |