OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/gamepad/gamepad_platform_data_fetcher_win.h" | 5 #include "content/browser/gamepad/gamepad_platform_data_fetcher_win.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "base/win/windows_version.h" | 9 #include "base/win/windows_version.h" |
10 #include "content/common/gamepad_hardware_buffer.h" | 10 #include "content/common/gamepad_hardware_buffer.h" |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 state.raw_input_handle = gamepad->handle; | 135 state.raw_input_handle = gamepad->handle; |
136 | 136 |
137 std::string vendor = base::StringPrintf("%04x", gamepad->vendor_id); | 137 std::string vendor = base::StringPrintf("%04x", gamepad->vendor_id); |
138 std::string product = base::StringPrintf("%04x", gamepad->product_id); | 138 std::string product = base::StringPrintf("%04x", gamepad->product_id); |
139 state.mapper = GetGamepadStandardMappingFunction(vendor, product); | 139 state.mapper = GetGamepadStandardMappingFunction(vendor, product); |
140 | 140 |
141 swprintf(pad.id, WebGamepad::idLengthCap, | 141 swprintf(pad.id, WebGamepad::idLengthCap, |
142 L"%ls (%lsVendor: %04x Product: %04x)", | 142 L"%ls (%lsVendor: %04x Product: %04x)", |
143 gamepad->id, state.mapper ? L"STANDARD GAMEPAD " : L"", | 143 gamepad->id, state.mapper ? L"STANDARD GAMEPAD " : L"", |
144 gamepad->vendor_id, gamepad->product_id); | 144 gamepad->vendor_id, gamepad->product_id); |
| 145 |
| 146 if (state.mapper) |
| 147 swprintf(pad.mapping, WebGamepad::mappingLengthCap, L"standard"); |
| 148 else |
| 149 pad.mapping[0] = 0; |
| 150 |
145 pads->length++; | 151 pads->length++; |
146 } | 152 } |
147 } | 153 } |
148 } | 154 } |
149 | 155 |
150 | 156 |
151 void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads, | 157 void GamepadPlatformDataFetcherWin::GetGamepadData(WebGamepads* pads, |
152 bool devices_changed_hint) { | 158 bool devices_changed_hint) { |
153 TRACE_EVENT0("GAMEPAD", "GetGamepadData"); | 159 TRACE_EVENT0("GAMEPAD", "GetGamepadData"); |
154 | 160 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 DWORD res = xinput_get_capabilities_(i, XINPUT_FLAG_GAMEPAD, &caps); | 204 DWORD res = xinput_get_capabilities_(i, XINPUT_FLAG_GAMEPAD, &caps); |
199 if (res == ERROR_DEVICE_NOT_CONNECTED) { | 205 if (res == ERROR_DEVICE_NOT_CONNECTED) { |
200 pad->connected = false; | 206 pad->connected = false; |
201 return false; | 207 return false; |
202 } else { | 208 } else { |
203 pad->connected = true; | 209 pad->connected = true; |
204 swprintf(pad->id, | 210 swprintf(pad->id, |
205 WebGamepad::idLengthCap, | 211 WebGamepad::idLengthCap, |
206 L"Xbox 360 Controller (XInput STANDARD %ls)", | 212 L"Xbox 360 Controller (XInput STANDARD %ls)", |
207 GamepadSubTypeName(caps.SubType)); | 213 GamepadSubTypeName(caps.SubType)); |
| 214 swprintf(pad->mapping, WebGamepad::mappingLengthCap, L"standard"); |
208 return true; | 215 return true; |
209 } | 216 } |
210 } | 217 } |
211 | 218 |
212 void GamepadPlatformDataFetcherWin::GetXInputPadData( | 219 void GamepadPlatformDataFetcherWin::GetXInputPadData( |
213 int i, | 220 int i, |
214 WebGamepad* pad) { | 221 WebGamepad* pad) { |
215 XINPUT_STATE state; | 222 XINPUT_STATE state; |
216 memset(&state, 0, sizeof(XINPUT_STATE)); | 223 memset(&state, 0, sizeof(XINPUT_STATE)); |
217 TRACE_EVENT_BEGIN1("GAMEPAD", "XInputGetState", "id", i); | 224 TRACE_EVENT_BEGIN1("GAMEPAD", "XInputGetState", "id", i); |
218 DWORD dwResult = xinput_get_state_(pad_state_[i].xinput_index, &state); | 225 DWORD dwResult = xinput_get_state_(pad_state_[i].xinput_index, &state); |
219 TRACE_EVENT_END1("GAMEPAD", "XInputGetState", "id", i); | 226 TRACE_EVENT_END1("GAMEPAD", "XInputGetState", "id", i); |
220 | 227 |
221 if (dwResult == ERROR_SUCCESS) { | 228 if (dwResult == ERROR_SUCCESS) { |
222 pad->timestamp = state.dwPacketNumber; | 229 pad->timestamp = state.dwPacketNumber; |
223 pad->buttonsLength = 0; | 230 pad->buttonsLength = 0; |
224 #define ADD(b) pad->buttons[pad->buttonsLength++] = \ | 231 #define ADD(b) pad->buttons[pad->buttonsLength].pressed = \ |
225 ((state.Gamepad.wButtons & (b)) ? 1.0 : 0.0); | 232 (state.Gamepad.wButtons & (b)) != 0; \ |
| 233 pad->buttons[pad->buttonsLength++].value = \ |
| 234 ((state.Gamepad.wButtons & (b)) ? 1.f : 0.f); |
226 ADD(XINPUT_GAMEPAD_A); | 235 ADD(XINPUT_GAMEPAD_A); |
227 ADD(XINPUT_GAMEPAD_B); | 236 ADD(XINPUT_GAMEPAD_B); |
228 ADD(XINPUT_GAMEPAD_X); | 237 ADD(XINPUT_GAMEPAD_X); |
229 ADD(XINPUT_GAMEPAD_Y); | 238 ADD(XINPUT_GAMEPAD_Y); |
230 ADD(XINPUT_GAMEPAD_LEFT_SHOULDER); | 239 ADD(XINPUT_GAMEPAD_LEFT_SHOULDER); |
231 ADD(XINPUT_GAMEPAD_RIGHT_SHOULDER); | 240 ADD(XINPUT_GAMEPAD_RIGHT_SHOULDER); |
232 pad->buttons[pad->buttonsLength++] = state.Gamepad.bLeftTrigger / 255.0; | 241 pad->buttons[pad->buttonsLength].pressed = |
233 pad->buttons[pad->buttonsLength++] = state.Gamepad.bRightTrigger / 255.0; | 242 state.Gamepad.bLeftTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD; |
| 243 pad->buttons[pad->buttonsLength++].value = |
| 244 state.Gamepad.bLeftTrigger / 255.f; |
| 245 pad->buttons[pad->buttonsLength].pressed = |
| 246 state.Gamepad.bRightTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD; |
| 247 pad->buttons[pad->buttonsLength++].value = |
| 248 state.Gamepad.bRightTrigger / 255.f; |
234 ADD(XINPUT_GAMEPAD_BACK); | 249 ADD(XINPUT_GAMEPAD_BACK); |
235 ADD(XINPUT_GAMEPAD_START); | 250 ADD(XINPUT_GAMEPAD_START); |
236 ADD(XINPUT_GAMEPAD_LEFT_THUMB); | 251 ADD(XINPUT_GAMEPAD_LEFT_THUMB); |
237 ADD(XINPUT_GAMEPAD_RIGHT_THUMB); | 252 ADD(XINPUT_GAMEPAD_RIGHT_THUMB); |
238 ADD(XINPUT_GAMEPAD_DPAD_UP); | 253 ADD(XINPUT_GAMEPAD_DPAD_UP); |
239 ADD(XINPUT_GAMEPAD_DPAD_DOWN); | 254 ADD(XINPUT_GAMEPAD_DPAD_DOWN); |
240 ADD(XINPUT_GAMEPAD_DPAD_LEFT); | 255 ADD(XINPUT_GAMEPAD_DPAD_LEFT); |
241 ADD(XINPUT_GAMEPAD_DPAD_RIGHT); | 256 ADD(XINPUT_GAMEPAD_DPAD_RIGHT); |
242 #undef ADD | 257 #undef ADD |
243 pad->axesLength = 0; | 258 pad->axesLength = 0; |
(...skipping 16 matching lines...) Expand all Loading... |
260 pad->connected = false; | 275 pad->connected = false; |
261 return; | 276 return; |
262 } | 277 } |
263 | 278 |
264 WebGamepad raw_pad = *pad; | 279 WebGamepad raw_pad = *pad; |
265 | 280 |
266 raw_pad.timestamp = gamepad->report_id; | 281 raw_pad.timestamp = gamepad->report_id; |
267 raw_pad.buttonsLength = gamepad->buttons_length; | 282 raw_pad.buttonsLength = gamepad->buttons_length; |
268 raw_pad.axesLength = gamepad->axes_length; | 283 raw_pad.axesLength = gamepad->axes_length; |
269 | 284 |
270 for (unsigned int i = 0; i < raw_pad.buttonsLength; i++) | 285 for (unsigned int i = 0; i < raw_pad.buttonsLength; i++) { |
271 raw_pad.buttons[i] = gamepad->buttons[i] ? 1.0 : 0.0; | 286 raw_pad.buttons[i].pressed = gamepad->buttons[i]; |
| 287 raw_pad.buttons[i].value = gamepad->buttons[i] ? 1.0 : 0.0; |
| 288 } |
272 | 289 |
273 for (unsigned int i = 0; i < raw_pad.axesLength; i++) | 290 for (unsigned int i = 0; i < raw_pad.axesLength; i++) |
274 raw_pad.axes[i] = gamepad->axes[i].value; | 291 raw_pad.axes[i] = gamepad->axes[i].value; |
275 | 292 |
276 // Copy to the current state to the output buffer, using the mapping | 293 // Copy to the current state to the output buffer, using the mapping |
277 // function, if there is one available. | 294 // function, if there is one available. |
278 if (pad_state_[index].mapper) | 295 if (pad_state_[index].mapper) |
279 pad_state_[index].mapper(raw_pad, pad); | 296 pad_state_[index].mapper(raw_pad, pad); |
280 else | 297 else |
281 *pad = raw_pad; | 298 *pad = raw_pad; |
(...skipping 12 matching lines...) Expand all Loading... |
294 return false; | 311 return false; |
295 xinput_get_state_ = reinterpret_cast<XInputGetStateFunc>( | 312 xinput_get_state_ = reinterpret_cast<XInputGetStateFunc>( |
296 xinput_dll_.GetFunctionPointer("XInputGetState")); | 313 xinput_dll_.GetFunctionPointer("XInputGetState")); |
297 if (!xinput_get_state_) | 314 if (!xinput_get_state_) |
298 return false; | 315 return false; |
299 xinput_enable_(true); | 316 xinput_enable_(true); |
300 return true; | 317 return true; |
301 } | 318 } |
302 | 319 |
303 } // namespace content | 320 } // namespace content |
OLD | NEW |