Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/GamepadMappings.java

Issue 133943002: Gamepad API support for chrome on android (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/java/src/org/chromium/content/browser/GamepadMappings.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/GamepadMappings.java b/content/public/android/java/src/org/chromium/content/browser/GamepadMappings.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1bd9cef0df157da39db8b7b67cab6a5d6e5f8e1
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/GamepadMappings.java
@@ -0,0 +1,195 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser;
+
+/*
+ * Class to manage mapping information related to each supported gamepad controller device.
+ */
+
+class GamepadMappings {
+
+ // Standard gamepad buttons.
+ private static class StandardButtons {
+ public static final int BUTTON_A = 0;
+ public static final int BUTTON_B = 1;
+ public static final int BUTTON_X = 2;
+ public static final int BUTTON_Y = 3;
+ public static final int LEFT_TRIGGER = 4;
+ public static final int RIGHT_TRIGGER = 5;
+ public static final int BOTTOM_LEFT_TRIGGER = 6;
+ public static final int BOTTOM_RIGHT_TRIGGER = 7;
+ public static final int SELECT = 8;
+ public static final int START = 9;
+ public static final int LEFT_THUMB = 10;
+ public static final int RIGHT_THUMB = 11;
+ public static final int DPAD_UP = 12;
+ public static final int DPAD_DOWN = 13;
+ public static final int DPAD_LEFT = 14;
+ public static final int DPAD_RIGHT = 15;
+ public static final int MODE = 16;
+ public static final int MAX_BUTTONS = 17;
+ }
+
+ // Standard gamepad axes.
+ private static class StandardAxes {
+ public static final int AXIS_0 = 0;
+ public static final int AXIS_1 = 1;
+ public static final int AXIS_2 = 2;
+ public static final int AXIS_3 = 3;
+ public static final int MAX_AXES = 4;
+ }
+
+ // We guess the gamepad inputDevice type from its name and then map it to the
+ // standard gamepad if it is one of the known gamepads.
+ protected static enum GamepadType {
+ Shield,
+ XBox360,
+ Unknown
+ }
+
+ // Following values should be changed if the gamepad layout changes
+ // or frameworks exposes different axes / buttons for a particular gamepad.
+ // mRawShieldAxes is the total raw axes on known shield gamepad.
+ protected static final int mRawShieldAxes = 10;
+ // mRawShieldButtons is the total raw buttons on known shield gamepad.
+ protected static final int mRawShieldButtons = 10;
+ // mRawXBoxAxes is the total raw axes on known XBox gamepad.
+ protected static final int mRawXBoxAxes = 10;
+ // mRawXBoxButtons is the total raw buttons on known XBox gamepad.
+ protected static final int mRawXBoxButtons = 9;
+
+ public static float[] mapToStandardGamepadAxes(float[] rawAxes, GamepadType gamepadType) {
bajones 2014/02/28 23:56:11 The way this is set up now feels like it will be a
SaurabhK 2014/03/11 17:39:27 On 2014/02/28 23:56:11, bajones wrote: The new pa
+ switch (gamepadType) {
+ case Shield:
+ return mapShieldAxes(rawAxes);
+ case XBox360:
+ return mapXBox360Axes(rawAxes);
+ }
+ return rawAxes;
+ }
+
+ public static float[] mapToStandardGamepadButtons(float[] rawButtons, float[] rawAxes,
+ GamepadType gamepadType) {
+ switch (gamepadType) {
+ case Shield:
+ return mapShieldButtons(rawButtons, rawAxes);
+ case XBox360:
+ return mapXBox360Buttons(rawButtons, rawAxes);
+ }
+ return rawAxes;
+ }
+
+ private static float negativeAxisValueAsButton(float input) {
+ return (input < -0.5f) ? 1.f : 0.f;
+ }
+
+ private static float positiveAxisValueAsButton(float input) {
+ return (input > 0.5f) ? 1.f : 0.f;
+ }
+
+ /**
+ * Method for mapping Nvidia gamepad axis values to
+ * standard gamepad axis values.
+ */
+ private static float[] mapShieldAxes(float[] rawAxes) {
+ float[] values = new float[StandardAxes.MAX_AXES];
+ // Standard gamepad can have only four axes.
+ values[StandardAxes.AXIS_0] = rawAxes[0];
+ values[StandardAxes.AXIS_1] = rawAxes[1];
+ values[StandardAxes.AXIS_2] = rawAxes[4];
+ values[StandardAxes.AXIS_3] = rawAxes[5];
+ return values;
+ }
+
+ /**
+ * Method for mapping Nvidia gamepad axis and button values
+ * to standard gamepad button values.
+ */
+ private static float[] mapShieldButtons(float[] rawButtons, float[] rawAxes) {
+ float[] values = new float[StandardButtons.MAX_BUTTONS];
+ // First four buttons on Nvidia gamepad appear in correct order so no mapping is required.
+ values[StandardButtons.BUTTON_A] = rawButtons[0];
+ values[StandardButtons.BUTTON_B] = rawButtons[1];
+ values[StandardButtons.BUTTON_X] = rawButtons[2];
+ values[StandardButtons.BUTTON_Y] = rawButtons[3];
+ // Third axis on Nvidia gamepad acts as a bottom left trigger button.
+ values[StandardButtons.BOTTOM_LEFT_TRIGGER] = rawAxes[2];
+ values[StandardButtons.LEFT_TRIGGER] = rawButtons[4];
+ values[StandardButtons.RIGHT_TRIGGER] = rawButtons[5];
+ values[StandardButtons.SELECT] = rawButtons[6];
+ values[StandardButtons.START] = rawButtons[7];
+ values[StandardButtons.LEFT_THUMB] = rawButtons[8];
+ values[StandardButtons.RIGHT_THUMB] = rawButtons[9];
+ // Seventh axis on Nvidia gamepad acts as a bottom right trigger button.
+ values[StandardButtons.BOTTOM_RIGHT_TRIGGER] = rawAxes[6];
+ // Ninth axis on Nvidia gamepad acts as directional pad right and left button.
+ // Positive axis value indicates dpad right.
+ // Negative value indicates dpad left.
+ values[StandardButtons.DPAD_RIGHT] = positiveAxisValueAsButton(rawAxes[8]);
+ values[StandardButtons.DPAD_LEFT] = negativeAxisValueAsButton(rawAxes[8]);
+ // Tenth axis on Nvidia gamepad acts as directional pad up and down button.
+ // Positive axis value indicates dpad down.
+ // Negative value indicates dpad up.
+ values[StandardButtons.DPAD_DOWN] = positiveAxisValueAsButton(rawAxes[9]);
+ values[StandardButtons.DPAD_UP] = negativeAxisValueAsButton(rawAxes[9]);
+ // Other standard buttons are either not present on the gamepad or not exposed to an
+ // application.
+ values[StandardButtons.MODE] = 0.0f;
+ return values;
+ }
+
+ /**
+ * Method for mapping Microsoft XBox 360 gamepad axis values to
+ * standard gamepad axis values.
+ */
+ private static float[] mapXBox360Axes(float[] rawAxes) {
+ float[] values = new float[StandardAxes.MAX_AXES];
+ // Standard gamepad can have only four axes.
+ values[StandardAxes.AXIS_0] = rawAxes[0];
+ values[StandardAxes.AXIS_1] = rawAxes[1];
+ values[StandardAxes.AXIS_2] = rawAxes[4];
+ values[StandardAxes.AXIS_3] = rawAxes[5];
+ return values;
+ }
+
+ /**
+ * Method for mapping Microsoft XBox 360 gamepad axis and button values
+ * to standard gamepad button values.
+ */
+ private static float[] mapXBox360Buttons(float[] rawButtons, float[] rawAxes) {
+ float[] values = new float[StandardButtons.MAX_BUTTONS];
+ // First four buttons on Microsoft XBox 360 gamepad appear in correct order so no mapping
+ // is required.
+ values[StandardButtons.BUTTON_A] = rawButtons[0];
+ values[StandardButtons.BUTTON_B] = rawButtons[1];
+ values[StandardButtons.BUTTON_X] = rawButtons[2];
+ values[StandardButtons.BUTTON_Y] = rawButtons[3];
+ // Third axis on Microsoft XBox 360 gamepad acts as a left bottom shoulder button.
+ values[StandardButtons.BOTTOM_LEFT_TRIGGER] = rawAxes[2];
+ values[StandardButtons.LEFT_TRIGGER] = rawButtons[4];
+ values[StandardButtons.RIGHT_TRIGGER] = rawButtons[5];
+ values[StandardButtons.START] = rawButtons[6];
+ values[StandardButtons.LEFT_THUMB] = rawButtons[7];
+ values[StandardButtons.RIGHT_THUMB] = rawButtons[8];
+ // Seventh axis on Microsoft XBox 360 gamepad acts as a right bottom shoulder button.
+ values[StandardButtons.BOTTOM_RIGHT_TRIGGER] = rawAxes[6];
+ // Ninth axis on Microsoft XBox 360 gamepad acts as directional pad right and left button.
+ // Positive axis value indicates dpad right.
+ // Negative value indicates dpad left.
+ values[StandardButtons.DPAD_RIGHT] = positiveAxisValueAsButton(rawAxes[8]);
+ values[StandardButtons.DPAD_LEFT] = negativeAxisValueAsButton(rawAxes[8]);
+ // Tenth axis on Microsoft XBox 360 gamepad acts as directional pad up and down button.
+ // Positive axis value indicates dpad down.
+ // Negative value indicates dpad up.
+ values[StandardButtons.DPAD_DOWN] = positiveAxisValueAsButton(rawAxes[9]);
+ values[StandardButtons.DPAD_UP] = negativeAxisValueAsButton(rawAxes[9]);
+ // Other standard buttons are either not present on the gamepad or not exposed to an
+ // application.
+ values[StandardButtons.SELECT] = 0.0f;
+ values[StandardButtons.MODE] = 0.0f;
+ return values;
+ }
+
+}

Powered by Google App Engine
This is Rietveld 408576698