OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved. |
| 3 * |
| 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions |
| 6 * are met: |
| 7 * * Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. |
| 9 * * Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the |
| 11 * documentation and/or other materials provided with the distribution. |
| 12 * * Neither the name of NVIDIA CORPORATION nor the names of its |
| 13 * contributors may be used to endorse or promote products derived |
| 14 * from this software without specific prior written permission. |
| 15 * |
| 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY |
| 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
| 20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| 24 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 */ |
| 28 |
| 29 #include "base/strings/string_number_conversions.h" |
| 30 #include "base/strings/string_util.h" |
| 31 #include "base/strings/utf_string_conversions.h" |
| 32 #include "content/browser/gamepad/gamepad_platform_data_fetcher_android.h" |
| 33 #include "third_party/WebKit/public/platform/WebGamepads.h" |
| 34 |
| 35 #if defined(OS_ANDROID) |
| 36 |
| 37 namespace content { |
| 38 |
| 39 GamepadPlatformDataFetcherAndroid::GamepadPlatformDataFetcherAndroid() { |
| 40 } |
| 41 |
| 42 void GamepadPlatformDataFetcherAndroid::GetGamepadData( |
| 43 blink::WebGamepads* pads, bool) { |
| 44 |
| 45 GamepadsReader* m_gamepadsReader = GamepadsReader::GetInstance(); |
| 46 |
| 47 pads->length = m_gamepadsReader->updateGamepadsCount(); |
| 48 if (pads->length == 0) |
| 49 return; |
| 50 |
| 51 for (unsigned int i = 0; i < WebGamepads::itemsLengthCap; i++) { |
| 52 bool ifDeviceConnected = m_gamepadsReader->isDeviceConnected(i); |
| 53 if (ifDeviceConnected) { |
| 54 |
| 55 // Set connected flag to true for all the gamepad devices that are |
| 56 // attached. |
| 57 pads->items[i].connected = true; |
| 58 |
| 59 // Map the Gamepad DeviceName String to the WebGamepad Id and then |
| 60 // convert the utf-8 id string to WebUChar. |
| 61 // Ideally it should be mapped to vendor and product information |
| 62 // but it is only available at kernel level and it can not be |
| 63 // queried using class android.hardware.input.InputManager. |
| 64 |
| 65 std::string string1 = m_gamepadsReader->getDeviceName(i); |
| 66 base::TruncateUTF8ToByteSize(string1, WebGamepad::idLengthCap - 1, |
| 67 &string1); |
| 68 base::string16 tmp16 = base::UTF8ToUTF16(string1); |
| 69 memset(pads->items[i].id, 0, sizeof(pads->items[i].id)); |
| 70 tmp16.copy(pads->items[i].id, arraysize(pads->items[i].id) - 1); |
| 71 |
| 72 // timestamp is queried from GamepadReader. |
| 73 pads->items[i].timestamp = m_gamepadsReader->getDeviceTimestamp(i); |
| 74 |
| 75 // A float vector is queried from GamepadReader that stores the |
| 76 // state of axeses. |
| 77 std::vector<float> axes = m_gamepadsReader->getDeviceAxes(i); |
| 78 |
| 79 // Set WebGamepad axeslength to total number of axes on the gamepad |
| 80 // device. |
| 81 pads->items[i].axesLength = axes.size(); |
| 82 |
| 83 // A float vector is queried from GamepadReader that stores the |
| 84 // button's state. |
| 85 std::vector<float> buttons = m_gamepadsReader->getDeviceButtons(i); |
| 86 |
| 87 // Set WebGamepad buttonslength to total numbers of buttons on the |
| 88 // gamepad device. |
| 89 pads->items[i].buttonsLength = buttons.size(); |
| 90 |
| 91 // Set WebGamepad connected flag to false if buttonslength or |
| 92 // axeslength returned by |
| 93 // JNI are larger than permitted value. |
| 94 if (pads->items[i].axesLength > WebGamepad::axesLengthCap || |
| 95 pads->items[i].buttonsLength > |
| 96 WebGamepad::buttonsLengthCap) { |
| 97 pads->items[i].connected = false; |
| 98 } else { |
| 99 // Copy axes state to the WebGamepad axes[]. |
| 100 for (unsigned int j = 0; j < pads->items[i].axesLength; j++) |
| 101 pads->items[i].axes[j] = axes[j]; |
| 102 |
| 103 // Copy buttons state to the WebGamepad buttons[]. |
| 104 for (unsigned int j = 0; j < pads->items[i].buttonsLength; j++) |
| 105 pads->items[i].buttons[j] = buttons[j]; |
| 106 } |
| 107 } else { |
| 108 // Set connected flag to flase for all the gamepad devices that are |
| 109 // not attached. |
| 110 pads->items[i].connected = false; |
| 111 } |
| 112 } |
| 113 } |
| 114 |
| 115 void GamepadPlatformDataFetcherAndroid::PauseHint(bool isaccesspaused) { |
| 116 GamepadsReader::GetInstance()->notifyForGamepadsAccess(isaccesspaused); |
| 117 } |
| 118 |
| 119 GamepadPlatformDataFetcherAndroid::~GamepadPlatformDataFetcherAndroid() { |
| 120 } |
| 121 |
| 122 } // namespace content |
| 123 #endif |
OLD | NEW |