Skip to content
This repository was archived by the owner on Jan 30, 2025. It is now read-only.

Commit

Permalink
vm_tools: add mapping for dualsense gamepad
Browse files Browse the repository at this point in the history
Adding an input mapping for the dualsense gamepad to correct
it's mapping.

BUG=b:277829347
TEST=tested on dut

Change-Id: I961b0b546272a83e43164b53f72a3d70566a18a7
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/4432333
Reviewed-by: Kenneth Albanowski <[email protected]>
Reviewed-by: Daniel Ng <[email protected]>
Tested-by: Daniel Ng <[email protected]>
Reviewed-by: Chloe Pelling <[email protected]>
Commit-Queue: Daniel Ng <[email protected]>
  • Loading branch information
BipBopBoop authored and Chromeos LUCI committed May 13, 2023
1 parent 7f5c420 commit f4c9a8d
Show file tree
Hide file tree
Showing 13 changed files with 780 additions and 63 deletions.
12 changes: 10 additions & 2 deletions BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,10 @@ sommelier_defines = [
] + gaming_defines + tracing_defines

static_library("libgaming") {
sources = [ "sommelier-gaming.cc" ]
sources = [
"libevdev/libevdev-shim.cc",
"sommelier-gaming.cc",
]
defines = gaming_defines
pkg_deps = [
"libevdev",
Expand Down Expand Up @@ -128,6 +131,7 @@ static_library("libsommelier") {
pkg_deps = [
"gbm",
"libdrm",
"libevdev",
"pixman-1",
"wayland-client",
"wayland-server",
Expand Down Expand Up @@ -155,6 +159,7 @@ executable("sommelier") {
if (use.test) {
executable("sommelier_test") {
sources = [
"sommelier-gaming-test.cc",
"sommelier-output-test.cc",
"sommelier-test-main.cc",
"sommelier-test.cc",
Expand All @@ -167,7 +172,10 @@ if (use.test) {

defines = sommelier_defines

pkg_deps = [ "pixman-1" ]
pkg_deps = [
"libevdev",
"pixman-1",
] + tracing_pkg_deps

# gnlint: disable=GnLintCommonTesting
libs = [
Expand Down
59 changes: 59 additions & 0 deletions libevdev/libevdev-shim.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "libevdev-shim.h" // NOLINT(build/include_directory)

struct libevdev* LibevdevShim::new_evdev(void) {
return libevdev_new();
}
void LibevdevShim::free(struct libevdev* dev) {
libevdev_free(dev);
}
int LibevdevShim::enable_event_code(struct libevdev* dev,
unsigned int type,
unsigned int code,
const void* data) {
return libevdev_enable_event_code(dev, type, code, data);
}
void LibevdevShim::set_name(struct libevdev* dev, const char* name) {
libevdev_set_name(dev, name);
}
void LibevdevShim::set_id_product(struct libevdev* dev, int product_id) {
libevdev_set_id_product(dev, product_id);
}
void LibevdevShim::set_id_vendor(struct libevdev* dev, int vendor_id) {
libevdev_set_id_vendor(dev, vendor_id);
}
void LibevdevShim::set_id_bustype(struct libevdev* dev, int bustype) {
libevdev_set_id_bustype(dev, bustype);
}
void LibevdevShim::set_id_version(struct libevdev* dev, int version) {
libevdev_set_id_version(dev, version);
}

int LibevdevShim::uinput_create_from_device(
const struct libevdev* dev,
int uinput_fd,
struct libevdev_uinput** uinput_dev) {
return libevdev_uinput_create_from_device(dev, uinput_fd, uinput_dev);
}
int LibevdevShim::uinput_write_event(const struct libevdev_uinput* uinput_dev,
unsigned int type,
unsigned int code,
int value) {
return libevdev_uinput_write_event(uinput_dev, type, code, value);
}
void LibevdevShim::uinput_destroy(struct libevdev_uinput* uinput_dev) {
libevdev_uinput_destroy(uinput_dev);
}

LibevdevShim* Libevdev::singleton = nullptr;

LibevdevShim* Libevdev::Get() {
return singleton;
}

void Libevdev::Set(LibevdevShim* shim) {
singleton = shim;
}
50 changes: 50 additions & 0 deletions libevdev/libevdev-shim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef VM_TOOLS_SOMMELIER_LIBEVDEV_LIBEVDEV_SHIM_H_
#define VM_TOOLS_SOMMELIER_LIBEVDEV_LIBEVDEV_SHIM_H_

#include <libevdev/libevdev.h>
#include <libevdev/libevdev-uinput.h>

class LibevdevShim {
public:
LibevdevShim() = default;
LibevdevShim(LibevdevShim&&) = delete;
LibevdevShim& operator=(LibevdevShim&&) = delete;

virtual ~LibevdevShim() = default;

virtual struct libevdev* new_evdev(void);
virtual void free(struct libevdev* dev);
virtual int enable_event_code(struct libevdev* dev,
unsigned int type,
unsigned int code,
const void* data);
virtual void set_name(struct libevdev* dev, const char* name);
virtual void set_id_product(struct libevdev* dev, int product_id);
virtual void set_id_vendor(struct libevdev* dev, int vendor_id);
virtual void set_id_bustype(struct libevdev* dev, int bustype);
virtual void set_id_version(struct libevdev* dev, int version);

virtual int uinput_create_from_device(const struct libevdev* dev,
int uinput_fd,
struct libevdev_uinput** uinput_dev);
virtual int uinput_write_event(const struct libevdev_uinput* uinput_dev,
unsigned int type,
unsigned int code,
int value);
virtual void uinput_destroy(struct libevdev_uinput* uinput_dev);
};

class Libevdev {
public:
static LibevdevShim* Get();
static void Set(LibevdevShim* shim);

private:
static LibevdevShim* singleton;
};

#endif // VM_TOOLS_SOMMELIER_LIBEVDEV_LIBEVDEV_SHIM_H_
72 changes: 72 additions & 0 deletions libevdev/mock-libevdev-shim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef VM_TOOLS_SOMMELIER_LIBEVDEV_MOCK_LIBEVDEV_SHIM_H_
#define VM_TOOLS_SOMMELIER_LIBEVDEV_MOCK_LIBEVDEV_SHIM_H_

#include <gmock/gmock.h>

#include "libevdev-shim.h" // NOLINT(build/include_directory)

class MockLibevdevShim : public LibevdevShim {
public:
MOCK_METHOD(struct libevdev*, new_evdev, (), (override));

MOCK_METHOD(void, free, (struct libevdev * dev), (override));

MOCK_METHOD(int,
enable_event_code,
(struct libevdev * dev,
unsigned int type,
unsigned int code,
const void* data),
(override));

MOCK_METHOD(void,
set_name,
(struct libevdev * dev, const char* name),
(override));

MOCK_METHOD(void,
set_id_product,
(struct libevdev * dev, int product_id),
(override));

MOCK_METHOD(void,
set_id_vendor,
(struct libevdev * dev, int vendor_id),
(override));

MOCK_METHOD(void,
set_id_bustype,
(struct libevdev * dev, int bustype_id),
(override));

MOCK_METHOD(void,
set_id_version,
(struct libevdev * dev, int version_id),
(override));

MOCK_METHOD(int,
uinput_create_from_device,
(const struct libevdev* dev,
int uinput_fd,
struct libevdev_uinput** uinput_dev),
(override));

MOCK_METHOD(int,
uinput_write_event,
(const struct libevdev_uinput* uinput_dev,
unsigned int type,
unsigned int code,
int value),
(override));

MOCK_METHOD(void,
uinput_destroy,
(struct libevdev_uinput * uinput_dev),
(override));
};

#endif // VM_TOOLS_SOMMELIER_LIBEVDEV_MOCK_LIBEVDEV_SHIM_H_
4 changes: 3 additions & 1 deletion meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ gamepad_dependencies = []
if get_option('gamepad')
gamepad_sources = [
'sommelier-gaming.cc',
'libevdev/libevdev-shim.cc',
]
gamepad_dependencies = [
dependency('libevdev'),
Expand Down Expand Up @@ -202,6 +203,7 @@ if get_option('with_tests')
sommelier_test = executable('sommelier_test',
install: true,
sources: [
'sommelier-gaming-test.cc',
'sommelier-test.cc',
'sommelier-test-main.cc',
'sommelier-output-test.cc',
Expand All @@ -215,7 +217,7 @@ if get_option('with_tests')
dependency('gtest'),
dependency('gmock'),
dependency('pixman-1')
],
] + gamepad_dependencies + tracing_dependencies,
cpp_args: cpp_args + sommelier_defines,
include_directories: includes + testing_includes,
)
Expand Down
1 change: 1 addition & 0 deletions sommelier-ctx.cc
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ void sl_context_init_default(struct sl_context* ctx) {
ctx->xdg_output_manager = NULL;
#ifdef GAMEPAD_SUPPORT
ctx->gaming_input_manager = NULL;
ctx->gaming_seat = NULL;
#endif
ctx->display_event_source = NULL;
ctx->display_ready_event_source = NULL;
Expand Down
1 change: 1 addition & 0 deletions sommelier-ctx.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ struct sl_context {
struct sl_xdg_output_manager* xdg_output_manager;
#ifdef GAMEPAD_SUPPORT
struct sl_gaming_input_manager* gaming_input_manager;
struct zcr_gaming_seat_v2* gaming_seat;
#endif
struct sl_relative_pointer_manager* relative_pointer_manager;
struct sl_pointer_constraints* pointer_constraints;
Expand Down
Loading

0 comments on commit f4c9a8d

Please sign in to comment.