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

Side by Side Diff: content/public/android/java/src/org/chromium/content/browser/input/GamepadDevice.java

Issue 2081583002: Migrating majority of gamepad from content/browser/ to device/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Final tweaks Created 4 years, 5 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 unified diff | Download patch
OLDNEW
(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.input;
6
7 import android.os.SystemClock;
8 import android.view.InputDevice;
9 import android.view.InputDevice.MotionRange;
10 import android.view.KeyEvent;
11 import android.view.MotionEvent;
12
13 import org.chromium.base.VisibleForTesting;
14
15 import java.util.Arrays;
16 import java.util.List;
17
18 /**
19 * Manages information related to each connected gamepad device.
20 */
21 class GamepadDevice {
22 // Axis ids are used as indices which are empirically always smaller than 25 6 so this allows
23 // us to create cheap associative arrays.
24 @VisibleForTesting
25 static final int MAX_RAW_AXIS_VALUES = 256;
26
27 // Keycodes are used as indices which are empirically always smaller than 25 6 so this allows
28 // us to create cheap associative arrays.
29 @VisibleForTesting
30 static final int MAX_RAW_BUTTON_VALUES = 256;
31
32 // An id for the gamepad.
33 private int mDeviceId;
34 // The index of the gamepad in the Navigator.
35 private int mDeviceIndex;
36 // Last time the data for this gamepad was updated.
37 private long mTimestamp;
38 // If this gamepad is mapped to standard gamepad?
39 private boolean mIsStandardGamepad;
40
41 // Array of values for all axes of the gamepad.
42 // All axis values must be linearly normalized to the range [-1.0 .. 1.0].
43 // As appropriate, -1.0 should correspond to "up" or "left", and 1.0
44 // should correspond to "down" or "right".
45 private final float[] mAxisValues = new float[CanonicalAxisIndex.COUNT];
46
47 private final float[] mButtonsValues = new float[CanonicalButtonIndex.COUNT] ;
48
49 // When the user agent recognizes the attached inputDevice, it is recommende d
50 // that it be remapped to a canonical ordering when possible. Devices that a re
51 // not recognized should still be exposed in their raw form. Therefore we mu st
52 // pass the raw Button and raw Axis values.
53 private final float[] mRawButtons = new float[MAX_RAW_BUTTON_VALUES];
54 private final float[] mRawAxes = new float[MAX_RAW_AXIS_VALUES];
55
56 // An identification string for the gamepad.
57 private String mDeviceName;
58
59 // Array of axes ids.
60 private int[] mAxes;
61
62 GamepadDevice(int index, InputDevice inputDevice) {
63 mDeviceIndex = index;
64 mDeviceId = inputDevice.getId();
65 mDeviceName = inputDevice.getName();
66 mTimestamp = SystemClock.uptimeMillis();
67 // Get axis ids and initialize axes values.
68 final List<MotionRange> ranges = inputDevice.getMotionRanges();
69 mAxes = new int[ranges.size()];
70 int i = 0;
71 for (MotionRange range : ranges) {
72 if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
73 int axis = range.getAxis();
74 assert axis < MAX_RAW_AXIS_VALUES;
75 mAxes[i++] = axis;
76 }
77 }
78 }
79
80 /**
81 * Updates the axes and buttons maping of a gamepad device to a standard gam epad format.
82 */
83 public void updateButtonsAndAxesMapping() {
84 mIsStandardGamepad = GamepadMappings.mapToStandardGamepad(
85 mAxisValues, mButtonsValues, mRawAxes, mRawButtons, mDeviceName) ;
86 }
87
88 /**
89 * @return Device Id of the gamepad device.
90 */
91 public int getId() {
92 return mDeviceId;
93 }
94
95 /**
96 * @return Mapping status of the gamepad device.
97 */
98 public boolean isStandardGamepad() {
99 return mIsStandardGamepad;
100 }
101
102 /**
103 * @return Device name of the gamepad device.
104 */
105 public String getName() {
106 return mDeviceName;
107 }
108
109 /**
110 * @return Device index of the gamepad device.
111 */
112 public int getIndex() {
113 return mDeviceIndex;
114 }
115
116 /**
117 * @return The timestamp when the gamepad device was last interacted.
118 */
119 public long getTimestamp() {
120 return mTimestamp;
121 }
122
123 /**
124 * @return The axes state of the gamepad device.
125 */
126 public float[] getAxes() {
127 return mAxisValues;
128 }
129
130 /**
131 * @return The buttons state of the gamepad device.
132 */
133 public float[] getButtons() {
134 return mButtonsValues;
135 }
136
137 /**
138 * Reset the axes and buttons data of the gamepad device everytime gamepad d ata access is
139 * paused.
140 */
141 public void clearData() {
142 Arrays.fill(mAxisValues, 0);
143 Arrays.fill(mRawAxes, 0);
144 Arrays.fill(mButtonsValues, 0);
145 Arrays.fill(mRawButtons, 0);
146 }
147
148 /**
149 * Handles key event from the gamepad device.
150 * @return True if the key event from the gamepad device has been consumed.
151 */
152 public boolean handleKeyEvent(KeyEvent event) {
153 // Ignore event if it is not for standard gamepad key.
154 if (!GamepadList.isGamepadEvent(event)) return false;
155 int keyCode = event.getKeyCode();
156 assert keyCode < MAX_RAW_BUTTON_VALUES;
157 // Button value 0.0 must mean fully unpressed, and 1.0 must mean fully p ressed.
158 if (event.getAction() == KeyEvent.ACTION_DOWN) {
159 mRawButtons[keyCode] = 1.0f;
160 } else if (event.getAction() == KeyEvent.ACTION_UP) {
161 mRawButtons[keyCode] = 0.0f;
162 }
163 mTimestamp = event.getEventTime();
164
165 return true;
166 }
167
168 /**
169 * Handles motion event from the gamepad device.
170 * @return True if the motion event from the gamepad device has been consume d.
171 */
172 public boolean handleMotionEvent(MotionEvent event) {
173 // Ignore event if it is not a standard gamepad motion event.
174 if (!GamepadList.isGamepadEvent(event)) return false;
175 // Update axes values.
176 for (int i = 0; i < mAxes.length; i++) {
177 int axis = mAxes[i];
178 mRawAxes[axis] = event.getAxisValue(axis);
179 }
180 mTimestamp = event.getEventTime();
181 return true;
182 }
183 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698