Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(326)

Side by Side Diff: device/vr/android/gvr/gvr_gamepad_data_fetcher.cc

Issue 2879973002: Expose Gamepad API instance for Cardboard button (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 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 "device/vr/android/gvr/gvr_gamepad_data_fetcher.h" 5 #include "device/vr/android/gvr/gvr_gamepad_data_fetcher.h"
6 6
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "device/gamepad/public/cpp/gamepads.h" 9 #include "device/gamepad/public/cpp/gamepads.h"
10 #include "device/vr/android/gvr/gvr_gamepad_data_provider.h" 10 #include "device/vr/android/gvr/gvr_gamepad_data_provider.h"
11 #include "device/vr/vr_types.h" 11 #include "device/vr/vr_types.h"
12 12
13 namespace device { 13 namespace device {
14 14
15 namespace { 15 namespace {
16 16
17 void CopyToUString(UChar* dest, size_t dest_length, base::string16 src) { 17 void CopyToUString(UChar* dest, size_t dest_length, base::string16 src) {
18 static_assert(sizeof(base::string16::value_type) == sizeof(UChar), 18 static_assert(sizeof(base::string16::value_type) == sizeof(UChar),
19 "Mismatched string16/WebUChar size."); 19 "Mismatched string16/WebUChar size.");
20 20
21 const size_t str_to_copy = std::min(src.size(), dest_length - 1); 21 const size_t str_to_copy = std::min(src.size(), dest_length - 1);
22 memcpy(dest, src.data(), str_to_copy * sizeof(base::string16::value_type)); 22 memcpy(dest, src.data(), str_to_copy * sizeof(base::string16::value_type));
23 dest[str_to_copy] = 0; 23 dest[str_to_copy] = 0;
24 } 24 }
25 25
26 } // namespace 26 } // namespace
27 27
28 GvrGamepadDataFetcher::Factory::Factory(GvrGamepadDataProvider* data_provider, 28 GvrGamepadDataFetcher::Factory::Factory(GvrGamepadDataProvider* data_provider,
29 unsigned int display_id) 29 unsigned int display_id,
30 : data_provider_(data_provider), display_id_(display_id) { 30 bool only_report_screen)
31 : data_provider_(data_provider),
32 display_id_(display_id),
33 only_report_screen_(only_report_screen) {
31 DVLOG(1) << __FUNCTION__ << "=" << this; 34 DVLOG(1) << __FUNCTION__ << "=" << this;
32 } 35 }
33 36
34 GvrGamepadDataFetcher::Factory::~Factory() { 37 GvrGamepadDataFetcher::Factory::~Factory() {
35 DVLOG(1) << __FUNCTION__ << "=" << this; 38 DVLOG(1) << __FUNCTION__ << "=" << this;
36 } 39 }
37 40
38 std::unique_ptr<GamepadDataFetcher> 41 std::unique_ptr<GamepadDataFetcher>
39 GvrGamepadDataFetcher::Factory::CreateDataFetcher() { 42 GvrGamepadDataFetcher::Factory::CreateDataFetcher() {
40 return base::MakeUnique<GvrGamepadDataFetcher>(data_provider_, display_id_); 43 return base::MakeUnique<GvrGamepadDataFetcher>(data_provider_, display_id_,
44 only_report_screen_);
41 } 45 }
42 46
43 GamepadSource GvrGamepadDataFetcher::Factory::source() { 47 GamepadSource GvrGamepadDataFetcher::Factory::source() {
44 return GAMEPAD_SOURCE_GVR; 48 return GAMEPAD_SOURCE_GVR;
45 } 49 }
46 50
47 GvrGamepadDataFetcher::GvrGamepadDataFetcher( 51 GvrGamepadDataFetcher::GvrGamepadDataFetcher(
48 GvrGamepadDataProvider* data_provider, 52 GvrGamepadDataProvider* data_provider,
49 unsigned int display_id) 53 unsigned int display_id,
50 : display_id_(display_id) { 54 bool only_report_screen)
55 : display_id_(display_id), only_report_screen_(only_report_screen) {
51 // Called on UI thread. 56 // Called on UI thread.
52 DVLOG(1) << __FUNCTION__ << "=" << this; 57 DVLOG(1) << __FUNCTION__ << "=" << this;
53 data_provider->RegisterGamepadDataFetcher(this); 58 data_provider->RegisterGamepadDataFetcher(this);
54 } 59 }
55 60
56 GvrGamepadDataFetcher::~GvrGamepadDataFetcher() { 61 GvrGamepadDataFetcher::~GvrGamepadDataFetcher() {
57 DVLOG(1) << __FUNCTION__ << "=" << this; 62 DVLOG(1) << __FUNCTION__ << "=" << this;
58 } 63 }
59 64
60 GamepadSource GvrGamepadDataFetcher::source() { 65 GamepadSource GvrGamepadDataFetcher::source() {
61 return GAMEPAD_SOURCE_GVR; 66 return GAMEPAD_SOURCE_GVR;
62 } 67 }
63 68
64 void GvrGamepadDataFetcher::OnAddedToProvider() { 69 void GvrGamepadDataFetcher::OnAddedToProvider() {
65 PauseHint(false); 70 PauseHint(false);
66 } 71 }
67 72
68 void GvrGamepadDataFetcher::SetGamepadData(GvrGamepadData data) { 73 void GvrGamepadDataFetcher::SetGamepadData(GvrGamepadData data) {
69 // Called from UI thread. 74 // Called from UI thread.
70 gamepad_data_ = data; 75 gamepad_data_ = data;
71 } 76 }
72 77
73 void GvrGamepadDataFetcher::GetGamepadData(bool devices_changed_hint) { 78 void GvrGamepadDataFetcher::GetGamepadData(bool devices_changed_hint) {
74 // Called from gamepad polling thread. 79 // Called from gamepad polling thread.
75 80
76 PadState* state = GetPadState(0); 81 PadState* state = GetPadState(only_report_screen_ ? 0 : 1);
77 if (!state) 82 if (!state)
78 return; 83 return;
79 84
80 // Take a snapshot of the asynchronously updated gamepad data. 85 // Take a snapshot of the asynchronously updated gamepad data.
81 // TODO(bajones): ensure consistency? 86 // TODO(bajones): ensure consistency?
82 GvrGamepadData provided_data = gamepad_data_; 87 GvrGamepadData provided_data = gamepad_data_;
83 88
84 Gamepad& pad = state->data; 89 Gamepad& pad = state->data;
85 if (state->active_state == GAMEPAD_NEWLY_ACTIVE) { 90 if (state->active_state == GAMEPAD_NEWLY_ACTIVE) {
86 // This is the first time we've seen this device, so do some one-time 91 // This is the first time we've seen this device, so do some one-time
87 // initialization 92 // initialization
88 pad.connected = true; 93 pad.connected = true;
89 CopyToUString(pad.id, Gamepad::kIdLengthCap, 94 if (only_report_screen_) {
90 base::UTF8ToUTF16("Daydream Controller")); 95 CopyToUString(pad.id, Gamepad::kIdLengthCap,
96 base::UTF8ToUTF16("Cardboard Controller"));
97 } else {
98 CopyToUString(pad.id, Gamepad::kIdLengthCap,
99 base::UTF8ToUTF16("Daydream Controller"));
100 }
91 CopyToUString(pad.mapping, Gamepad::kMappingLengthCap, 101 CopyToUString(pad.mapping, Gamepad::kMappingLengthCap,
92 base::UTF8ToUTF16("")); 102 base::UTF8ToUTF16(""));
93 pad.buttons_length = 1; 103 pad.buttons_length = 1;
94 pad.axes_length = 2; 104 pad.axes_length = only_report_screen_ ? 2 : 0;
95 105
96 pad.display_id = display_id_; 106 pad.display_id = display_id_;
97 107
98 pad.hand = 108 pad.hand = only_report_screen_
99 provided_data.right_handed ? GamepadHand::kRight : GamepadHand::kLeft; 109 ? GamepadHand::kNone
110 : provided_data.right_handed ? GamepadHand::kRight
111 : GamepadHand::kLeft;
100 } 112 }
101 113
102 pad.timestamp = provided_data.timestamp; 114 pad.timestamp = provided_data.timestamp;
103 115
104 if (provided_data.is_touching) { 116 if (only_report_screen_) {
117 GetCardboardGamepadData(pad, provided_data);
118 } else {
119 GetDaydreamGamepadData(pad, provided_data);
120 }
121 }
122
123 void GvrGamepadDataFetcher::GetCardboardGamepadData(
124 Gamepad& pad,
125 const GvrGamepadData& provided_data) {
126 bool pressed = provided_data.is_screen_touching;
127 pad.buttons[0].touched = pressed;
128 pad.buttons[0].pressed = pressed;
129 pad.buttons[0].value = pressed ? 1.0f : 0.0f;
130 pad.pose.not_null = false;
131
132 static bool last = false;
133 if (last != pressed) {
134 last = pressed;
135 }
136 }
137
138 void GvrGamepadDataFetcher::GetDaydreamGamepadData(
139 Gamepad& pad,
140 const GvrGamepadData& provided_data) {
141 if (provided_data.is_controller_touching) {
105 gfx::Vector2dF touch_position = provided_data.touch_pos; 142 gfx::Vector2dF touch_position = provided_data.touch_pos;
106 pad.axes[0] = (touch_position.x() * 2.0f) - 1.0f; 143 pad.axes[0] = (touch_position.x() * 2.0f) - 1.0f;
107 pad.axes[1] = (touch_position.y() * 2.0f) - 1.0f; 144 pad.axes[1] = (touch_position.y() * 2.0f) - 1.0f;
108 } else { 145 } else {
109 pad.axes[0] = 0.0f; 146 pad.axes[0] = 0.0f;
110 pad.axes[1] = 0.0f; 147 pad.axes[1] = 0.0f;
111 } 148 }
112 149
113 pad.buttons[0].touched = provided_data.is_touching; 150 pad.buttons[0].touched = provided_data.is_controller_touching;
114 pad.buttons[0].pressed = provided_data.controller_button_pressed; 151 pad.buttons[0].pressed = provided_data.controller_button_pressed;
115 pad.buttons[0].value = pad.buttons[0].pressed ? 1.0f : 0.0f; 152 pad.buttons[0].value = pad.buttons[0].pressed ? 1.0f : 0.0f;
116 153
117 pad.pose.not_null = true; 154 pad.pose.not_null = true;
118 pad.pose.has_orientation = true; 155 pad.pose.has_orientation = true;
119 pad.pose.has_position = false; 156 pad.pose.has_position = false;
120 157
121 vr::Quatf orientation = provided_data.orientation; 158 vr::Quatf orientation = provided_data.orientation;
122 pad.pose.orientation.not_null = true; 159 pad.pose.orientation.not_null = true;
123 pad.pose.orientation.x = orientation.qx; 160 pad.pose.orientation.x = orientation.qx;
(...skipping 10 matching lines...) Expand all
134 gfx::Vector3dF gyro = provided_data.gyro; 171 gfx::Vector3dF gyro = provided_data.gyro;
135 pad.pose.angular_velocity.not_null = true; 172 pad.pose.angular_velocity.not_null = true;
136 pad.pose.angular_velocity.x = gyro.x(); 173 pad.pose.angular_velocity.x = gyro.x();
137 pad.pose.angular_velocity.y = gyro.y(); 174 pad.pose.angular_velocity.y = gyro.y();
138 pad.pose.angular_velocity.z = gyro.z(); 175 pad.pose.angular_velocity.z = gyro.z();
139 } 176 }
140 177
141 void GvrGamepadDataFetcher::PauseHint(bool paused) {} 178 void GvrGamepadDataFetcher::PauseHint(bool paused) {}
142 179
143 } // namespace device 180 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698