OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 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 #include "device/gamepad/game_controller_data_fetcher_mac.h" |
| 6 |
| 7 #include <string.h> |
| 8 |
| 9 #include "base/strings/string16.h" |
| 10 #include "base/strings/string_util.h" |
| 11 #include "base/strings/utf_string_conversions.h" |
| 12 #include "base/time/time.h" |
| 13 #include "device/gamepad/gamepad_standard_mappings.h" |
| 14 |
| 15 #import <GameController/GameController.h> |
| 16 |
| 17 using blink::WebGamepad; |
| 18 using blink::WebGamepads; |
| 19 |
| 20 namespace device { |
| 21 |
| 22 namespace { |
| 23 |
| 24 void CopyNSStringAsUTF16LittleEndian(NSString* src, |
| 25 blink::WebUChar* dest, |
| 26 size_t dest_len) { |
| 27 NSData* as16 = [src dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; |
| 28 memset(dest, 0, dest_len); |
| 29 [as16 getBytes:dest length:dest_len - sizeof(blink::WebUChar)]; |
| 30 } |
| 31 |
| 32 } // namespace |
| 33 |
| 34 GameControllerDataFetcherMac::GameControllerDataFetcherMac() {} |
| 35 |
| 36 GameControllerDataFetcherMac::~GameControllerDataFetcherMac() {} |
| 37 |
| 38 GamepadSource GameControllerDataFetcherMac::source() { |
| 39 return Factory::static_source(); |
| 40 } |
| 41 |
| 42 void GameControllerDataFetcherMac::GetGamepadData(bool) { |
| 43 NSArray* controllers = [GCController controllers]; |
| 44 |
| 45 for (GCController* controller in controllers) { |
| 46 auto extended_gamepad = [controller extendedGamepad]; |
| 47 |
| 48 // We only support the extendedGamepad profile, the basic gamepad profile |
| 49 // appears to only be for iOS devices. |
| 50 if (!extended_gamepad) |
| 51 continue; |
| 52 |
| 53 int player_index = [controller playerIndex]; |
| 54 PadState* state = GetPadState(player_index); |
| 55 if (!state) |
| 56 continue; |
| 57 |
| 58 WebGamepad& pad = state->data; |
| 59 |
| 60 // This first time we encounter a gamepad, set its name, mapping, and |
| 61 // axes/button counts. This information is static, so it only needs to be |
| 62 // done once. |
| 63 if (state->active_state == GAMEPAD_NEWLY_ACTIVE) { |
| 64 NSString* vendorName = [controller vendorName]; |
| 65 NSString* ident = |
| 66 [NSString stringWithFormat:@"%@ (STANDARD GAMEPAD)", |
| 67 vendorName ? vendorName : @"Unknown"]; |
| 68 CopyNSStringAsUTF16LittleEndian(ident, pad.id, sizeof(pad.id)); |
| 69 |
| 70 CopyNSStringAsUTF16LittleEndian(@"standard", pad.mapping, |
| 71 sizeof(pad.mapping)); |
| 72 |
| 73 pad.axesLength = AXIS_INDEX_COUNT; |
| 74 pad.buttonsLength = BUTTON_INDEX_COUNT - 1; |
| 75 pad.connected = true; |
| 76 } |
| 77 |
| 78 pad.timestamp = base::TimeTicks::Now().ToInternalValue(); |
| 79 |
| 80 pad.axes[AXIS_INDEX_LEFT_STICK_X] = |
| 81 [[[extended_gamepad leftThumbstick] xAxis] value]; |
| 82 pad.axes[AXIS_INDEX_LEFT_STICK_Y] = |
| 83 -[[[extended_gamepad leftThumbstick] yAxis] value]; |
| 84 pad.axes[AXIS_INDEX_RIGHT_STICK_X] = |
| 85 [[[extended_gamepad rightThumbstick] xAxis] value]; |
| 86 pad.axes[AXIS_INDEX_RIGHT_STICK_Y] = |
| 87 -[[[extended_gamepad rightThumbstick] yAxis] value]; |
| 88 |
| 89 #define BUTTON(i, b) \ |
| 90 pad.buttons[i].pressed = [b isPressed]; \ |
| 91 pad.buttons[i].value = [b value]; |
| 92 |
| 93 BUTTON(BUTTON_INDEX_PRIMARY, [extended_gamepad buttonA]); |
| 94 BUTTON(BUTTON_INDEX_SECONDARY, [extended_gamepad buttonB]); |
| 95 BUTTON(BUTTON_INDEX_TERTIARY, [extended_gamepad buttonX]); |
| 96 BUTTON(BUTTON_INDEX_QUATERNARY, [extended_gamepad buttonY]); |
| 97 BUTTON(BUTTON_INDEX_LEFT_SHOULDER, [extended_gamepad leftShoulder]); |
| 98 BUTTON(BUTTON_INDEX_RIGHT_SHOULDER, [extended_gamepad rightShoulder]); |
| 99 BUTTON(BUTTON_INDEX_LEFT_TRIGGER, [extended_gamepad leftTrigger]); |
| 100 BUTTON(BUTTON_INDEX_RIGHT_TRIGGER, [extended_gamepad rightTrigger]); |
| 101 |
| 102 // No start, select, or thumbstick buttons |
| 103 |
| 104 BUTTON(BUTTON_INDEX_DPAD_UP, [[extended_gamepad dpad] up]); |
| 105 BUTTON(BUTTON_INDEX_DPAD_DOWN, [[extended_gamepad dpad] down]); |
| 106 BUTTON(BUTTON_INDEX_DPAD_LEFT, [[extended_gamepad dpad] left]); |
| 107 BUTTON(BUTTON_INDEX_DPAD_RIGHT, [[extended_gamepad dpad] right]); |
| 108 |
| 109 #undef BUTTON |
| 110 } |
| 111 } |
| 112 |
| 113 } // namespace device |
OLD | NEW |