Commit aab278dc authored by Tetsui Ohkubo's avatar Tetsui Ohkubo Committed by Commit Bot

ozone: Add raw scancode to GamepadEvent.

Currently, Ozone converts evdev scancode to Web Gamepad keycode, and
the keycode is stored in |code| field of GamepadEvent. This CL adds
|raw_code| field to GamepadEvent, which is the original evdev scancode.

This is a part of ARC++ Improved Gamepad Support, which will forward
raw scancode to Android container rather than converting scancode to
keycode in Ozone. For further background, please check the design doc:
go/arc-improved-gamepad

TBR=oshima@chromium.org
TEST=manual
BUG=b:130597086

Change-Id: Id66565631eae9f0e90432b63160b7d82728ec12f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1602232
Commit-Queue: Tetsui Ohkubo <tetsui@chromium.org>
Reviewed-by: default avatarKevin Schoedel <kpschoedel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#659419}
parent 0ecfcf9e
...@@ -66,7 +66,7 @@ class GamingSeatTest : public test::ExoTestBase { ...@@ -66,7 +66,7 @@ class GamingSeatTest : public test::ExoTestBase {
void SendFrameToGamepads(const std::vector<int>& gamepad_device_ids) { void SendFrameToGamepads(const std::vector<int>& gamepad_device_ids) {
for (auto& id : gamepad_device_ids) { for (auto& id : gamepad_device_ids) {
ui::GamepadEvent event(id, ui::GamepadEventType::FRAME, 0, 0, ui::GamepadEvent event(id, ui::GamepadEventType::FRAME, 0, 0, 0,
base::TimeTicks()); base::TimeTicks());
ui::GamepadProviderOzone::GetInstance()->DispatchGamepadEvent(event); ui::GamepadProviderOzone::GetInstance()->DispatchGamepadEvent(event);
} }
......
...@@ -199,13 +199,17 @@ void GamepadEventConverterEvdev::ProcessEvdevKey( ...@@ -199,13 +199,17 @@ void GamepadEventConverterEvdev::ProcessEvdevKey(
} }
// If it's btn -> btn mapping, we can send the event and return now. // If it's btn -> btn mapping, we can send the event and return now.
OnButtonChange(mapped_code, value, timestamp); OnButtonChange(mapped_code, code, value, timestamp);
} }
void GamepadEventConverterEvdev::ProcessEvdevAbs( void GamepadEventConverterEvdev::ProcessEvdevAbs(
uint16_t code, uint16_t code,
int value, int value,
const base::TimeTicks& timestamp) { const base::TimeTicks& timestamp) {
// For abs type, notify raw event separately. When you're only interested in
// mapped data, you should ignore code == WG_ABS_COUNT for abs type.
OnAbsChange(WG_ABS_COUNT, code, value, timestamp);
GamepadEventType mapped_type; GamepadEventType mapped_type;
uint16_t mapped_code; uint16_t mapped_code;
...@@ -220,7 +224,7 @@ void GamepadEventConverterEvdev::ProcessEvdevAbs( ...@@ -220,7 +224,7 @@ void GamepadEventConverterEvdev::ProcessEvdevAbs(
// If the mapped type is abs, we can send it now. // If the mapped type is abs, we can send it now.
if (mapped_type == GamepadEventType::AXIS) { if (mapped_type == GamepadEventType::AXIS) {
OnAbsChange(mapped_code, mapped_abs_value, timestamp); OnAbsChange(mapped_code, 0, mapped_abs_value, timestamp);
return; return;
} }
...@@ -229,39 +233,39 @@ void GamepadEventConverterEvdev::ProcessEvdevAbs( ...@@ -229,39 +233,39 @@ void GamepadEventConverterEvdev::ProcessEvdevAbs(
bool hat_left_press = (mapped_abs_value < -kHatThreshold); bool hat_left_press = (mapped_abs_value < -kHatThreshold);
bool hat_right_press = (mapped_abs_value > kHatThreshold); bool hat_right_press = (mapped_abs_value > kHatThreshold);
if (hat_left_press != last_hat_left_press_) { if (hat_left_press != last_hat_left_press_) {
OnButtonChange(WG_BUTTON_DPAD_LEFT, hat_left_press, timestamp); OnButtonChange(WG_BUTTON_DPAD_LEFT, 0, hat_left_press, timestamp);
last_hat_left_press_ = hat_left_press; last_hat_left_press_ = hat_left_press;
} }
if (hat_right_press != last_hat_right_press_) { if (hat_right_press != last_hat_right_press_) {
OnButtonChange(WG_BUTTON_DPAD_RIGHT, hat_right_press, timestamp); OnButtonChange(WG_BUTTON_DPAD_RIGHT, 0, hat_right_press, timestamp);
last_hat_right_press_ = hat_right_press; last_hat_right_press_ = hat_right_press;
} }
} else if (mapped_code == kHAT_Y) { } else if (mapped_code == kHAT_Y) {
bool hat_up_press = (mapped_abs_value < -kHatThreshold); bool hat_up_press = (mapped_abs_value < -kHatThreshold);
bool hat_down_press = (mapped_abs_value > kHatThreshold); bool hat_down_press = (mapped_abs_value > kHatThreshold);
if (hat_up_press != last_hat_up_press_) { if (hat_up_press != last_hat_up_press_) {
OnButtonChange(WG_BUTTON_DPAD_UP, hat_up_press, timestamp); OnButtonChange(WG_BUTTON_DPAD_UP, 0, hat_up_press, timestamp);
last_hat_up_press_ = hat_up_press; last_hat_up_press_ = hat_up_press;
} }
if (hat_down_press != last_hat_down_press_) { if (hat_down_press != last_hat_down_press_) {
OnButtonChange(WG_BUTTON_DPAD_DOWN, hat_down_press, timestamp); OnButtonChange(WG_BUTTON_DPAD_DOWN, 0, hat_down_press, timestamp);
last_hat_down_press_ = hat_down_press; last_hat_down_press_ = hat_down_press;
} }
} else { } else {
OnButtonChange(mapped_code, mapped_abs_value, timestamp); OnButtonChange(mapped_code, 0, mapped_abs_value, timestamp);
} }
} }
void GamepadEventConverterEvdev::ResetGamepad() { void GamepadEventConverterEvdev::ResetGamepad() {
base::TimeTicks timestamp = ui::EventTimeForNow(); base::TimeTicks timestamp = ui::EventTimeForNow();
for (int btn_code = 0; btn_code < WG_BUTTON_COUNT; ++btn_code) { for (int btn_code = 0; btn_code < WG_BUTTON_COUNT; ++btn_code) {
OnButtonChange(btn_code, 0, timestamp); OnButtonChange(btn_code, 0, 0, timestamp);
} }
for (int abs_code = 0; abs_code < WG_ABS_COUNT; ++abs_code) { for (int abs_code = 0; abs_code < WG_ABS_COUNT; ++abs_code) {
OnAbsChange(abs_code, 0, timestamp); OnAbsChange(abs_code, 0, 0, timestamp);
} }
OnSync(timestamp); OnSync(timestamp);
} }
...@@ -270,7 +274,7 @@ void GamepadEventConverterEvdev::ResyncGamepad() { ...@@ -270,7 +274,7 @@ void GamepadEventConverterEvdev::ResyncGamepad() {
base::TimeTicks timestamp = ui::EventTimeForNow(); base::TimeTicks timestamp = ui::EventTimeForNow();
// Reset all the buttons to 0. // Reset all the buttons to 0.
for (int btn_code = 0; btn_code < WG_BUTTON_COUNT; ++btn_code) { for (int btn_code = 0; btn_code < WG_BUTTON_COUNT; ++btn_code) {
OnButtonChange(btn_code, 0, timestamp); OnButtonChange(btn_code, 0, 0, timestamp);
} }
// Read the state of all axis. // Read the state of all axis.
EventDeviceInfo info; EventDeviceInfo info;
...@@ -290,26 +294,28 @@ void GamepadEventConverterEvdev::ResyncGamepad() { ...@@ -290,26 +294,28 @@ void GamepadEventConverterEvdev::ResyncGamepad() {
void GamepadEventConverterEvdev::OnButtonChange( void GamepadEventConverterEvdev::OnButtonChange(
unsigned int code, unsigned int code,
unsigned int raw_code,
double value, double value,
const base::TimeTicks& timestamp) { const base::TimeTicks& timestamp) {
GamepadEvent event(input_device_.id, GamepadEventType::BUTTON, code, value, GamepadEvent event(input_device_.id, GamepadEventType::BUTTON, code, raw_code,
timestamp); value, timestamp);
dispatcher_->DispatchGamepadEvent(event); dispatcher_->DispatchGamepadEvent(event);
will_send_frame_ = true; will_send_frame_ = true;
} }
void GamepadEventConverterEvdev::OnAbsChange(unsigned int code, void GamepadEventConverterEvdev::OnAbsChange(unsigned int code,
unsigned int raw_code,
double value, double value,
const base::TimeTicks& timestamp) { const base::TimeTicks& timestamp) {
GamepadEvent event(input_device_.id, GamepadEventType::AXIS, code, value, GamepadEvent event(input_device_.id, GamepadEventType::AXIS, code, raw_code,
timestamp); value, timestamp);
dispatcher_->DispatchGamepadEvent(event); dispatcher_->DispatchGamepadEvent(event);
will_send_frame_ = true; will_send_frame_ = true;
} }
void GamepadEventConverterEvdev::OnSync(const base::TimeTicks& timestamp) { void GamepadEventConverterEvdev::OnSync(const base::TimeTicks& timestamp) {
if (will_send_frame_) { if (will_send_frame_) {
GamepadEvent event(input_device_.id, GamepadEventType::FRAME, 0, 0, GamepadEvent event(input_device_.id, GamepadEventType::FRAME, 0, 0, 0,
timestamp); timestamp);
dispatcher_->DispatchGamepadEvent(event); dispatcher_->DispatchGamepadEvent(event);
will_send_frame_ = false; will_send_frame_ = false;
......
...@@ -61,9 +61,11 @@ class EVENTS_OZONE_EVDEV_EXPORT GamepadEventConverterEvdev ...@@ -61,9 +61,11 @@ class EVENTS_OZONE_EVDEV_EXPORT GamepadEventConverterEvdev
void ResyncGamepad(); void ResyncGamepad();
void OnButtonChange(unsigned int code, void OnButtonChange(unsigned int code,
unsigned int raw_code,
double value, double value,
const base::TimeTicks& timestamp); const base::TimeTicks& timestamp);
void OnAbsChange(unsigned int code, void OnAbsChange(unsigned int code,
unsigned int raw_code,
double value, double value,
const base::TimeTicks& timestamp); const base::TimeTicks& timestamp);
void OnSync(const base::TimeTicks& timestamp); void OnSync(const base::TimeTicks& timestamp);
......
...@@ -158,16 +158,29 @@ TEST_F(GamepadEventConverterEvdevTest, XboxGamepadEvents) { ...@@ -158,16 +158,29 @@ TEST_F(GamepadEventConverterEvdevTest, XboxGamepadEvents) {
clock.SetNowSeconds(1493076833); clock.SetNowSeconds(1493076833);
struct ExpectedEvent expected_events[] = { struct ExpectedEvent expected_events[] = {
{GamepadEventType::AXIS, 0, 0.583062}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 19105},
{GamepadEventType::AXIS, 0, 0.547234}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 0, 0.583062},
{GamepadEventType::AXIS, 0, 0.530968}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 4, 1}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 17931},
{GamepadEventType::BUTTON, 4, 0}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 0, 0.547234},
{GamepadEventType::BUTTON, 3, 1}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 3, 0}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 17398},
{GamepadEventType::BUTTON, 1, 1}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 0, 0.530968},
{GamepadEventType::BUTTON, 1, 0}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 2, 1}, {GamepadEventType::FRAME, 0, 0}}; {GamepadEventType::BUTTON, 4, 1},
{GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 4, 0},
{GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 3, 1},
{GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 3, 0},
{GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 1, 1},
{GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 1, 0},
{GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 2, 1},
{GamepadEventType::FRAME, 0, 0}};
for (unsigned i = 0; i < base::size(mock_kernel_queue); ++i) { for (unsigned i = 0; i < base::size(mock_kernel_queue); ++i) {
dev->ProcessEvent(mock_kernel_queue[i]); dev->ProcessEvent(mock_kernel_queue[i]);
...@@ -176,9 +189,12 @@ TEST_F(GamepadEventConverterEvdevTest, XboxGamepadEvents) { ...@@ -176,9 +189,12 @@ TEST_F(GamepadEventConverterEvdevTest, XboxGamepadEvents) {
for (unsigned i = 0; i < observer.events.size(); ++i) { for (unsigned i = 0; i < observer.events.size(); ++i) {
EXPECT_EQ(observer.events[i].type(), expected_events[i].type); EXPECT_EQ(observer.events[i].type(), expected_events[i].type);
EXPECT_EQ(observer.events[i].code(), expected_events[i].code); EXPECT_EQ(observer.events[i].code(), expected_events[i].code);
double d = observer.events[i].value() - expected_events[i].value; if (observer.events[i].type() != GamepadEventType::AXIS ||
d = d > 0 ? d : -d; observer.events[i].code() != WG_ABS_COUNT) {
EXPECT_LT(d, axis_delta); double d = observer.events[i].value() - expected_events[i].value;
d = d > 0 ? d : -d;
EXPECT_LT(d, axis_delta);
}
} }
} }
...@@ -295,15 +311,28 @@ TEST_F(GamepadEventConverterEvdevTest, iBuffaloGamepadEvents) { ...@@ -295,15 +311,28 @@ TEST_F(GamepadEventConverterEvdevTest, iBuffaloGamepadEvents) {
{GamepadEventType::BUTTON, 4, 0}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::BUTTON, 4, 0}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 5, 1}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::BUTTON, 5, 1}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 5, 0}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::BUTTON, 5, 0}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 13, 1}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 128}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::AXIS, 4, 127}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::AXIS, 4, 128}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::AXIS, 4, 255}, {GamepadEventType::BUTTON, 13, 1},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 128},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 127},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 128},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 127},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 128},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 255},
{GamepadEventType::BUTTON, 15, 1}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::BUTTON, 15, 1}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 13, 0}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 128}, {GamepadEventType::BUTTON, 13, 0},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 0},
{GamepadEventType::BUTTON, 12, 1}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::BUTTON, 12, 1}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 15, 0}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 128}, {GamepadEventType::BUTTON, 15, 0},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 255},
{GamepadEventType::BUTTON, 15, 1}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::BUTTON, 15, 1}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 15, 0}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 128}, {GamepadEventType::BUTTON, 15, 0},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 0},
{GamepadEventType::BUTTON, 14, 1}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::BUTTON, 14, 1}, {GamepadEventType::FRAME, 0, 0},
{GamepadEventType::BUTTON, 12, 0}, {GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 128}, {GamepadEventType::BUTTON, 12, 0},
{GamepadEventType::FRAME, 0, 0}, {GamepadEventType::AXIS, 4, 255},
{GamepadEventType::BUTTON, 13, 1}, {GamepadEventType::FRAME, 0, 0}}; {GamepadEventType::BUTTON, 13, 1}, {GamepadEventType::FRAME, 0, 0}};
for (unsigned i = 0; i < base::size(mock_kernel_queue); ++i) { for (unsigned i = 0; i < base::size(mock_kernel_queue); ++i) {
...@@ -313,9 +342,12 @@ TEST_F(GamepadEventConverterEvdevTest, iBuffaloGamepadEvents) { ...@@ -313,9 +342,12 @@ TEST_F(GamepadEventConverterEvdevTest, iBuffaloGamepadEvents) {
for (unsigned i = 0; i < observer.events.size(); ++i) { for (unsigned i = 0; i < observer.events.size(); ++i) {
EXPECT_EQ(observer.events[i].type(), expected_events[i].type); EXPECT_EQ(observer.events[i].type(), expected_events[i].type);
EXPECT_EQ(observer.events[i].code(), expected_events[i].code); EXPECT_EQ(observer.events[i].code(), expected_events[i].code);
double d = observer.events[i].value() - expected_events[i].value; if (observer.events[i].type() != GamepadEventType::AXIS ||
d = d > 0 ? d : -d; observer.events[i].code() != WG_ABS_COUNT) {
EXPECT_LT(d, axis_delta); double d = observer.events[i].value() - expected_events[i].value;
d = d > 0 ? d : -d;
EXPECT_LT(d, axis_delta);
}
} }
} }
} // namespace ui } // namespace ui
...@@ -9,11 +9,13 @@ namespace ui { ...@@ -9,11 +9,13 @@ namespace ui {
GamepadEvent::GamepadEvent(int device_id, GamepadEvent::GamepadEvent(int device_id,
GamepadEventType type, GamepadEventType type,
uint16_t code, uint16_t code,
uint16_t raw_code,
double value, double value,
base::TimeTicks timestamp) base::TimeTicks timestamp)
: device_id_(device_id), : device_id_(device_id),
type_(type), type_(type),
code_(code), code_(code),
raw_code_(raw_code),
value_(value), value_(value),
timestamp_(timestamp) {} timestamp_(timestamp) {}
......
...@@ -15,6 +15,7 @@ class GamepadEvent { ...@@ -15,6 +15,7 @@ class GamepadEvent {
GamepadEvent(int device_id, GamepadEvent(int device_id,
GamepadEventType type, GamepadEventType type,
uint16_t code, uint16_t code,
uint16_t raw_code,
double value, double value,
base::TimeTicks timestamp); base::TimeTicks timestamp);
...@@ -24,6 +25,8 @@ class GamepadEvent { ...@@ -24,6 +25,8 @@ class GamepadEvent {
uint16_t code() const { return code_; } uint16_t code() const { return code_; }
uint16_t raw_code() const { return raw_code_; }
double value() const { return value_; } double value() const { return value_; }
base::TimeTicks timestamp() const { return timestamp_; } base::TimeTicks timestamp() const { return timestamp_; }
...@@ -33,8 +36,12 @@ class GamepadEvent { ...@@ -33,8 +36,12 @@ class GamepadEvent {
GamepadEventType type_; GamepadEventType type_;
// Web Gamepad keycode.
uint16_t code_; uint16_t code_;
// Evdev scancode.
uint16_t raw_code_;
double value_; double value_;
base::TimeTicks timestamp_; base::TimeTicks timestamp_;
......
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