Skip to content

Commit b14dce6

Browse files
authored
Merge pull request #18 from BANANASJIM/fix/emulate-elite-disable
fix: use correct VID/PID when emulate_elite is disabled
2 parents f8649eb + d5cb552 commit b14dce6

8 files changed

Lines changed: 68 additions & 4 deletions

File tree

CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,12 @@ add_executable(test-remap
6666
set_target_properties(test-remap PROPERTIES CXX_CLANG_TIDY "")
6767
target_include_directories(test-remap PRIVATE include)
6868
target_link_libraries(test-remap PRIVATE tomlplusplus::tomlplusplus)
69+
70+
add_executable(test-uinput-elite
71+
src/tools/test_uinput_elite.cpp
72+
src/config.cpp
73+
src/keycodes.cpp
74+
)
75+
set_target_properties(test-uinput-elite PROPERTIES CXX_CLANG_TIDY "")
76+
target_include_directories(test-uinput-elite PRIVATE include)
77+
target_link_libraries(test-uinput-elite PRIVATE tomlplusplus::tomlplusplus)

config/test-elite-default.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[gyro]
2+
mode = "off"

config/test-elite-false.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
emulate_elite = false
2+
3+
[gyro]
4+
mode = "off"

config/test-elite-true.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
emulate_elite = true
2+
3+
[gyro]
4+
mode = "off"

include/vader5/uinput.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct RumbleEffect {
2020
class Uinput {
2121
public:
2222
static auto create(std::span<const std::optional<int>> ext_mappings,
23+
bool emulate_elite = true,
2324
const char* name = "Vader 5 Pro Virtual Gamepad") -> Result<Uinput>;
2425
~Uinput();
2526

src/gamepad.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ auto Gamepad::open(const Config& cfg, const std::string& device_name) -> Result<
216216
return std::unexpected(std::make_error_code(std::errc::protocol_error));
217217
}
218218

219-
auto uinput = Uinput::create(cfg.ext_mappings);
219+
auto uinput = Uinput::create(cfg.ext_mappings, cfg.emulate_elite);
220220
if (!uinput) {
221221
send_test_mode(*hid, false);
222222
return std::unexpected(uinput.error());

src/tools/test_uinput_elite.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "vader5/config.hpp"
2+
#include "vader5/types.hpp"
3+
4+
#include <cstdlib>
5+
#include <iostream>
6+
7+
using namespace vader5;
8+
9+
#define CHECK(expr) \
10+
do { \
11+
if (!(expr)) { \
12+
std::cerr << "FAIL: " #expr " (" << __FILE__ << ":" << __LINE__ << ")\n"; \
13+
std::exit(1); \
14+
} \
15+
} while (0)
16+
17+
void test_config_emulate_elite_default() {
18+
auto cfg = Config::load("config/test-elite-default.toml");
19+
CHECK(cfg.has_value());
20+
CHECK(cfg->emulate_elite == true);
21+
std::cout << " emulate_elite default (absent): OK\n";
22+
}
23+
24+
void test_config_emulate_elite_true() {
25+
auto cfg = Config::load("config/test-elite-true.toml");
26+
CHECK(cfg.has_value());
27+
CHECK(cfg->emulate_elite == true);
28+
std::cout << " emulate_elite = true: OK\n";
29+
}
30+
31+
void test_config_emulate_elite_false() {
32+
auto cfg = Config::load("config/test-elite-false.toml");
33+
CHECK(cfg.has_value());
34+
CHECK(cfg->emulate_elite == false);
35+
std::cout << " emulate_elite = false: OK\n";
36+
}
37+
38+
int main() {
39+
std::cout << "Running uinput elite emulation tests...\n";
40+
test_config_emulate_elite_default();
41+
test_config_emulate_elite_true();
42+
test_config_emulate_elite_false();
43+
std::cout << "All tests passed!\n";
44+
}

src/uinput.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ inline void InputDevice::buffer_event(const input_event& ev) {
6161
}
6262

6363
auto Uinput::create(std::span<const std::optional<int>> ext_mappings,
64-
const char* name) -> Result<Uinput> {
64+
bool emulate_elite, const char* name) -> Result<Uinput> {
6565
const int file_descriptor = ::open("/dev/uinput", O_RDWR | O_NONBLOCK);
6666
if (file_descriptor < 0) {
6767
int err = errno;
@@ -132,8 +132,8 @@ auto Uinput::create(std::span<const std::optional<int>> ext_mappings,
132132
std::strncpy(setup.name, name, UINPUT_MAX_NAME_SIZE - 1);
133133
setup.name[UINPUT_MAX_NAME_SIZE - 1] = '\0';
134134
setup.id.bustype = BUS_USB;
135-
setup.id.vendor = ELITE_VENDOR_ID;
136-
setup.id.product = ELITE_PRODUCT_ID;
135+
setup.id.vendor = emulate_elite ? ELITE_VENDOR_ID : VENDOR_ID;
136+
setup.id.product = emulate_elite ? ELITE_PRODUCT_ID : PRODUCT_ID;
137137
setup.id.version = 1;
138138
setup.ff_effects_max = 16;
139139

0 commit comments

Comments
 (0)