| Index: device/vr/android/gvr/cardboard_gamepad_data_fetcher.cc
|
| diff --git a/device/vr/android/gvr/cardboard_gamepad_data_fetcher.cc b/device/vr/android/gvr/cardboard_gamepad_data_fetcher.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4ad10d9624e199ea17b8b75fd6cf1ee3e1e3421b
|
| --- /dev/null
|
| +++ b/device/vr/android/gvr/cardboard_gamepad_data_fetcher.cc
|
| @@ -0,0 +1,111 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "device/vr/android/gvr/cardboard_gamepad_data_fetcher.h"
|
| +
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "device/gamepad/public/cpp/gamepads.h"
|
| +#include "device/vr/android/gvr/cardboard_gamepad_data_provider.h"
|
| +#include "device/vr/vr_types.h"
|
| +
|
| +namespace device {
|
| +
|
| +namespace {
|
| +
|
| +void CopyToUString(UChar* dest, size_t dest_length, base::string16 src) {
|
| + static_assert(sizeof(base::string16::value_type) == sizeof(UChar),
|
| + "Mismatched string16/WebUChar size.");
|
| +
|
| + const size_t str_to_copy = std::min(src.size(), dest_length - 1);
|
| + memcpy(dest, src.data(), str_to_copy * sizeof(base::string16::value_type));
|
| + dest[str_to_copy] = 0;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +CardboardGamepadDataFetcher::Factory::Factory(
|
| + CardboardGamepadDataProvider* data_provider,
|
| + unsigned int display_id)
|
| + : data_provider_(data_provider), display_id_(display_id) {
|
| + DVLOG(1) << __FUNCTION__ << "=" << this;
|
| +}
|
| +
|
| +CardboardGamepadDataFetcher::Factory::~Factory() {
|
| + DVLOG(1) << __FUNCTION__ << "=" << this;
|
| +}
|
| +
|
| +std::unique_ptr<GamepadDataFetcher>
|
| +CardboardGamepadDataFetcher::Factory::CreateDataFetcher() {
|
| + return base::MakeUnique<CardboardGamepadDataFetcher>(data_provider_,
|
| + display_id_);
|
| +}
|
| +
|
| +GamepadSource CardboardGamepadDataFetcher::Factory::source() {
|
| + return GAMEPAD_SOURCE_CARDBOARD;
|
| +}
|
| +
|
| +CardboardGamepadDataFetcher::CardboardGamepadDataFetcher(
|
| + CardboardGamepadDataProvider* data_provider,
|
| + unsigned int display_id)
|
| + : display_id_(display_id) {
|
| + // Called on UI thread.
|
| + DVLOG(1) << __FUNCTION__ << "=" << this;
|
| + data_provider->RegisterCardboardGamepadDataFetcher(this);
|
| +}
|
| +
|
| +CardboardGamepadDataFetcher::~CardboardGamepadDataFetcher() {
|
| + DVLOG(1) << __FUNCTION__ << "=" << this;
|
| +}
|
| +
|
| +GamepadSource CardboardGamepadDataFetcher::source() {
|
| + return GAMEPAD_SOURCE_CARDBOARD;
|
| +}
|
| +
|
| +void CardboardGamepadDataFetcher::OnAddedToProvider() {
|
| + PauseHint(false);
|
| +}
|
| +
|
| +void CardboardGamepadDataFetcher::SetGamepadData(CardboardGamepadData data) {
|
| + // Called from UI thread.
|
| + gamepad_data_ = data;
|
| +}
|
| +
|
| +void CardboardGamepadDataFetcher::GetGamepadData(bool devices_changed_hint) {
|
| + // Called from gamepad polling thread.
|
| + PadState* state = GetPadState(0);
|
| + if (!state)
|
| + return;
|
| +
|
| + CardboardGamepadData provided_data = gamepad_data_;
|
| +
|
| + Gamepad& pad = state->data;
|
| + if (state->active_state == GAMEPAD_NEWLY_ACTIVE) {
|
| + // This is the first time we've seen this device, so do some one-time
|
| + // initialization
|
| + pad.connected = true;
|
| + CopyToUString(pad.id, Gamepad::kIdLengthCap,
|
| + base::UTF8ToUTF16("Cardboard Button"));
|
| + CopyToUString(pad.mapping, Gamepad::kMappingLengthCap,
|
| + base::UTF8ToUTF16(""));
|
| + pad.buttons_length = 1;
|
| + pad.axes_length = 0;
|
| +
|
| + pad.display_id = display_id_;
|
| +
|
| + pad.hand = GamepadHand::kNone;
|
| + }
|
| +
|
| + pad.timestamp = provided_data.timestamp;
|
| +
|
| + bool pressed = provided_data.is_screen_touching;
|
| + pad.buttons[0].touched = pressed;
|
| + pad.buttons[0].pressed = pressed;
|
| + pad.buttons[0].value = pressed ? 1.0f : 0.0f;
|
| + pad.pose.not_null = false;
|
| +}
|
| +
|
| +void CardboardGamepadDataFetcher::PauseHint(bool paused) {}
|
| +
|
| +} // namespace device
|
|
|