Commit a077c7a8 authored by Matt Reynolds's avatar Matt Reynolds Committed by Commit Bot

Add bus_type param to GetGamepadStandardMappingFunction

The Standard Gamepad spec lays out a standard configuration for gamepad
buttons and axes. The browser attempts to remap the buttons and axes
reported by connected devices to more closely match the standard. In
most cases, a suitable mapping function can be chosen from the vendor
and product IDs reported by the device.

In some cases this is not sufficient; for instance, some devices are
supported over both USB and Bluetooth and require different mapping
functions in either case. To help select a mapping function in these
cases, a |bus_type| parameter is added to
GetGamepadStandardMappingFunction to specify whether the device is
connected over USB or Bluetooth.

BUG=749295

Change-Id: I566e06f5d34eeac269a0a70e912f74a64ccd19f5
Reviewed-on: https://chromium-review.googlesource.com/887231Reviewed-by: default avatarBrandon Jones <bajones@chromium.org>
Commit-Queue: Matt Reynolds <mattreynolds@chromium.org>
Cr-Commit-Position: refs/heads/master@{#532583}
parent 27008b74
...@@ -155,7 +155,8 @@ void GamepadPlatformDataFetcherLinux::RefreshJoydevDevice( ...@@ -155,7 +155,8 @@ void GamepadPlatformDataFetcherLinux::RefreshJoydevDevice(
GamepadStandardMappingFunction& mapper = state->mapper; GamepadStandardMappingFunction& mapper = state->mapper;
mapper = GetGamepadStandardMappingFunction( mapper = GetGamepadStandardMappingFunction(
vendor_id.c_str(), product_id.c_str(), version_number.c_str()); vendor_id.c_str(), product_id.c_str(), version_number.c_str(),
GAMEPAD_BUS_UNKNOWN);
Gamepad& pad = state->data; Gamepad& pad = state->data;
......
...@@ -211,7 +211,7 @@ void GamepadPlatformDataFetcherMac::DeviceAdd(IOHIDDeviceRef device) { ...@@ -211,7 +211,7 @@ void GamepadPlatformDataFetcherMac::DeviceAdd(IOHIDDeviceRef device) {
snprintf(product_as_str, sizeof(product_as_str), "%04x", product_int); snprintf(product_as_str, sizeof(product_as_str), "%04x", product_int);
snprintf(version_as_str, sizeof(version_as_str), "%04x", version_int); snprintf(version_as_str, sizeof(version_as_str), "%04x", version_int);
state->mapper = GetGamepadStandardMappingFunction( state->mapper = GetGamepadStandardMappingFunction(
vendor_as_str, product_as_str, version_as_str); vendor_as_str, product_as_str, version_as_str, GAMEPAD_BUS_UNKNOWN);
NSString* ident = NSString* ident =
[NSString stringWithFormat:@"%@ (%sVendor: %04x Product: %04x)", product, [NSString stringWithFormat:@"%@ (%sVendor: %04x Product: %04x)", product,
......
...@@ -10,13 +10,24 @@ ...@@ -10,13 +10,24 @@
namespace device { namespace device {
// For a connected gamepad, specify the type of bus through which it is
// connected. This allows for specialized mappings depending on how the device
// is connected. For instance, a gamepad may require different mappers for USB
// and Bluetooth.
enum GamepadBusType {
GAMEPAD_BUS_UNKNOWN,
GAMEPAD_BUS_USB,
GAMEPAD_BUS_BLUETOOTH
};
typedef void (*GamepadStandardMappingFunction)(const Gamepad& original, typedef void (*GamepadStandardMappingFunction)(const Gamepad& original,
Gamepad* mapped); Gamepad* mapped);
GamepadStandardMappingFunction GetGamepadStandardMappingFunction( GamepadStandardMappingFunction GetGamepadStandardMappingFunction(
const base::StringPiece& vendor_id, const base::StringPiece& vendor_id,
const base::StringPiece& product_id, const base::StringPiece& product_id,
const base::StringPiece& version_number); const base::StringPiece& version_number,
GamepadBusType bus_type);
// This defines our canonical mapping order for gamepad-like devices. If these // This defines our canonical mapping order for gamepad-like devices. If these
// items cannot all be satisfied, it is a case-by-case judgement as to whether // items cannot all be satisfied, it is a case-by-case judgement as to whether
......
...@@ -487,7 +487,8 @@ struct MappingData { ...@@ -487,7 +487,8 @@ struct MappingData {
GamepadStandardMappingFunction GetGamepadStandardMappingFunction( GamepadStandardMappingFunction GetGamepadStandardMappingFunction(
const base::StringPiece& vendor_id, const base::StringPiece& vendor_id,
const base::StringPiece& product_id, const base::StringPiece& product_id,
const base::StringPiece& version_number) { const base::StringPiece& version_number,
GamepadBusType bus_type) {
GamepadStandardMappingFunction mapper = nullptr; GamepadStandardMappingFunction mapper = nullptr;
for (size_t i = 0; i < arraysize(AvailableMappings); ++i) { for (size_t i = 0; i < arraysize(AvailableMappings); ++i) {
MappingData& item = AvailableMappings[i]; MappingData& item = AvailableMappings[i];
......
...@@ -428,7 +428,8 @@ struct MappingData { ...@@ -428,7 +428,8 @@ struct MappingData {
GamepadStandardMappingFunction GetGamepadStandardMappingFunction( GamepadStandardMappingFunction GetGamepadStandardMappingFunction(
const base::StringPiece& vendor_id, const base::StringPiece& vendor_id,
const base::StringPiece& product_id, const base::StringPiece& product_id,
const base::StringPiece& version_number) { const base::StringPiece& version_number,
GamepadBusType bus_type) {
for (size_t i = 0; i < arraysize(AvailableMappings); ++i) { for (size_t i = 0; i < arraysize(AvailableMappings); ++i) {
MappingData& item = AvailableMappings[i]; MappingData& item = AvailableMappings[i];
if (vendor_id == item.vendor_id && product_id == item.product_id) if (vendor_id == item.vendor_id && product_id == item.product_id)
......
...@@ -255,7 +255,8 @@ struct MappingData { ...@@ -255,7 +255,8 @@ struct MappingData {
GamepadStandardMappingFunction GetGamepadStandardMappingFunction( GamepadStandardMappingFunction GetGamepadStandardMappingFunction(
const base::StringPiece& vendor_id, const base::StringPiece& vendor_id,
const base::StringPiece& product_id, const base::StringPiece& product_id,
const base::StringPiece& version_number) { const base::StringPiece& version_number,
GamepadBusType bus_type) {
for (size_t i = 0; i < arraysize(AvailableMappings); ++i) { for (size_t i = 0; i < arraysize(AvailableMappings); ++i) {
MappingData& item = AvailableMappings[i]; MappingData& item = AvailableMappings[i];
if (vendor_id == item.vendor_id && product_id == item.product_id) if (vendor_id == item.vendor_id && product_id == item.product_id)
......
...@@ -199,8 +199,8 @@ void RawInputDataFetcher::EnumerateDevices() { ...@@ -199,8 +199,8 @@ void RawInputDataFetcher::EnumerateDevices() {
const std::string vendor = base::StringPrintf("%04x", vendor_int); const std::string vendor = base::StringPrintf("%04x", vendor_int);
const std::string product = base::StringPrintf("%04x", product_int); const std::string product = base::StringPrintf("%04x", product_int);
const std::string version = base::StringPrintf("%04x", version_number); const std::string version = base::StringPrintf("%04x", version_number);
state->mapper = state->mapper = GetGamepadStandardMappingFunction(
GetGamepadStandardMappingFunction(vendor, product, version); vendor, product, version, GAMEPAD_BUS_UNKNOWN);
state->axis_mask = 0; state->axis_mask = 0;
state->button_mask = 0; state->button_mask = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment