1 // Copyright (c) 2012 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.
5 #include "content/browser/gamepad/gamepad_standard_mappings.h"
11 void MapperXInputStyleGamepad(const blink::WebGamepad& input,
12 blink::WebGamepad* mapped) {
14 mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[2]);
15 mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]);
16 mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[6];
17 mapped->buttons[BUTTON_INDEX_START] = input.buttons[7];
18 mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[9];
19 mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[10];
20 mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[7]);
21 mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[7]);
22 mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[6]);
23 mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
24 AxisPositiveAsButton(input.axes[6]);
25 mapped->buttons[BUTTON_INDEX_META] = input.buttons[8];
26 mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[3];
27 mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[4];
28 mapped->buttonsLength = BUTTON_INDEX_COUNT;
29 mapped->axesLength = AXIS_INDEX_COUNT;
32 void MapperLakeviewResearch(const blink::WebGamepad& input,
33 blink::WebGamepad* mapped) {
35 mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2];
36 mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
37 mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[0];
38 mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
39 mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
40 mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = input.buttons[4];
41 mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = input.buttons[5];
42 mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[9];
43 mapped->buttons[BUTTON_INDEX_START] = input.buttons[8];
44 mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[5]);
45 mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[5]);
46 mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[4]);
47 mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
48 AxisPositiveAsButton(input.axes[4]);
49 mapped->buttonsLength = BUTTON_INDEX_COUNT - 1; // no Meta on this device
50 mapped->axesLength = AXIS_INDEX_COUNT;
53 void MapperPlaystationSixAxis(const blink::WebGamepad& input,
54 blink::WebGamepad* mapped) {
56 mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[14];
57 mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[13];
58 mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[15];
59 mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[12];
60 mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[10];
61 mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[11];
62 mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[12]);
63 mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[13]);
64 mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[0];
65 mapped->buttons[BUTTON_INDEX_START] = input.buttons[3];
66 mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[1];
67 mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[2];
68 mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisToButton(input.axes[8]);
69 mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisToButton(input.axes[10]);
70 mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[7];
71 mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = AxisToButton(input.axes[9]);
72 mapped->buttons[BUTTON_INDEX_META] = input.buttons[16];
74 mapped->buttonsLength = BUTTON_INDEX_COUNT;
75 mapped->axesLength = AXIS_INDEX_COUNT;
78 void MapperDualshock4(const blink::WebGamepad& input,
79 blink::WebGamepad* mapped) {
80 enum Dualshock4Buttons {
81 DUALSHOCK_BUTTON_TOUCHPAD = BUTTON_INDEX_COUNT,
82 DUALSHOCK_BUTTON_COUNT
86 mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[1];
87 mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[2];
88 mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[0];
89 mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[3];
90 mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[4];
91 mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[5];
92 mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[3]);
93 mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]);
94 mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[8];
95 mapped->buttons[BUTTON_INDEX_START] = input.buttons[9];
96 mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[10];
97 mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[11];
98 mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[7]);
99 mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[7]);
100 mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[6]);
101 mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
102 AxisPositiveAsButton(input.axes[6]);
103 mapped->buttons[BUTTON_INDEX_META] = input.buttons[12];
104 mapped->buttons[DUALSHOCK_BUTTON_TOUCHPAD] = input.buttons[13];
105 mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
107 mapped->buttonsLength = DUALSHOCK_BUTTON_COUNT;
108 mapped->axesLength = AXIS_INDEX_COUNT;
111 void MapperXGEAR(const blink::WebGamepad& input, blink::WebGamepad* mapped) {
113 mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2];
114 mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
115 mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
116 mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[0];
117 mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
118 mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
119 mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = input.buttons[4];
120 mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = input.buttons[5];
121 mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[5]);
122 mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[5]);
123 mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[4]);
124 mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
125 AxisPositiveAsButton(input.axes[4]);
126 mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[3];
127 mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[2];
128 mapped->buttonsLength = BUTTON_INDEX_COUNT - 1; // no Meta on this device
129 mapped->axesLength = AXIS_INDEX_COUNT;
132 void MapperDragonRiseGeneric(const blink::WebGamepad& input,
133 blink::WebGamepad* mapped) {
135 mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[6]);
136 mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[6]);
137 mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[5]);
138 mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
139 AxisPositiveAsButton(input.axes[5]);
140 mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0];
141 mapped->axes[AXIS_INDEX_LEFT_STICK_Y] = input.axes[1];
142 mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[3];
143 mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[4];
144 mapped->buttonsLength = BUTTON_INDEX_COUNT - 1; // no Meta on this device
145 mapped->axesLength = AXIS_INDEX_COUNT;
148 void MapperOnLiveWireless(const blink::WebGamepad& input,
149 blink::WebGamepad* mapped) {
151 mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[2]);
152 mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]);
153 mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[6];
154 mapped->buttons[BUTTON_INDEX_START] = input.buttons[7];
155 mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[9];
156 mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[10];
157 mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[7]);
158 mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[7]);
159 mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[6]);
160 mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
161 AxisPositiveAsButton(input.axes[6]);
162 mapped->buttons[BUTTON_INDEX_META] = input.buttons[8];
163 mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[3];
164 mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[4];
166 mapped->buttonsLength = BUTTON_INDEX_COUNT;
167 mapped->axesLength = AXIS_INDEX_COUNT;
170 void MapperADT1(const blink::WebGamepad& input, blink::WebGamepad* mapped) {
172 mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[5]);
173 mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]);
174 mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
175 mapped->buttons[BUTTON_INDEX_START] = NullButton();
176 mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[7];
177 mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[8];
178 mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[7]);
179 mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[7]);
180 mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[6]);
181 mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
182 AxisPositiveAsButton(input.axes[6]);
183 mapped->buttons[BUTTON_INDEX_META] = input.buttons[6];
185 mapped->buttonsLength = BUTTON_INDEX_COUNT;
186 mapped->axesLength = AXIS_INDEX_COUNT;
190 const char* const vendor_id;
191 const char* const product_id;
192 GamepadStandardMappingFunction function;
193 } AvailableMappings[] = {
194 // http://www.linux-usb.org/usb.ids
195 {"0079", "0006", MapperDragonRiseGeneric}, // DragonRise Generic USB
196 {"045e", "028e", MapperXInputStyleGamepad}, // Xbox 360 Controller
199 MapperXInputStyleGamepad}, // Xbox 360 Wireless Controller
200 {"046d", "c21d", MapperXInputStyleGamepad}, // Logitech F310
201 {"046d", "c21e", MapperXInputStyleGamepad}, // Logitech F510
202 {"046d", "c21f", MapperXInputStyleGamepad}, // Logitech F710
203 {"054c", "0268", MapperPlaystationSixAxis}, // Playstation SIXAXIS
204 {"054c", "05c4", MapperDualshock4}, // Playstation Dualshock 4
205 {"0925", "0005", MapperLakeviewResearch}, // SmartJoy PLUS Adapter
206 {"0925", "8866", MapperLakeviewResearch}, // WiseGroup MP-8866
207 {"0e8f", "0003", MapperXGEAR}, // XFXforce XGEAR PS2 Controller
208 {"2378", "1008", MapperOnLiveWireless}, // OnLive Controller (Bluetooth)
209 {"2378", "100a", MapperOnLiveWireless}, // OnLive Controller (Wired)
210 {"18d1", "2c40", MapperADT1}, // ADT-1 Controller
215 GamepadStandardMappingFunction GetGamepadStandardMappingFunction(
216 const base::StringPiece& vendor_id,
217 const base::StringPiece& product_id) {
218 for (size_t i = 0; i < arraysize(AvailableMappings); ++i) {
219 MappingData& item = AvailableMappings[i];
220 if (vendor_id == item.vendor_id && product_id == item.product_id)
221 return item.function;
226 } // namespace content