通过Jetson,我通过蓝牙连接了一个PS4控制器,该设备出现在/dev/input/js0下。然而,当我通过蓝牙连接控制器到我的珊瑚板时,我在那个位置什么也没看到,也许是因为孟德尔而不是Ubuntu?连接PS4控制器并从C++访问它的推荐方法是什么?我应该用不同的操纵杆吗?
发布于 2022-02-10 20:26:19
在做了一些研究之后,我了解了在linux上joydev和evdev之间的区别。看来,我的PS4控制器在Jetson上显示为joydev设备,而在上则显示为evdev设备。我在这里找到了克罗埃帕/大卫巴特勒的evdev设备的一些示例C++代码:https://handmade.network/forums/t/3673-modern_way_to_read_gamepad_input_with_c_on_linux
我对PS4控制器的代码进行了如下修改:
void runJoystick() {
auto gamepad = open("/dev/input/event4", O_RDONLY | O_NONBLOCK); //todo use /proc/bus/input/devices instead
assert(gamepad != -1);
std::cout << "Running joystick" << std::endl;
while (m_still_running) {
struct input_event events[8]; // 8 events per frame is pretty extreme, more like 1 or 2, sometimes as high as 4
auto r1 = read(gamepad, events, sizeof events);
if (r1 != -1) {
int new_event_count = r1 / sizeof(struct input_event);
for (int evi = 0; evi < new_event_count; evi++) {
auto& ev = events[evi];
switch (ev.type) {
case EV_ABS: {
switch (ev.code) {
case ABS_X: { // left x
// std::cout << "type " << ev.code << "value:" << ev.value << std::endl;
} break;
case ABS_Y: { // left y
// std::cout << "type " << ev.code << "value:" << ev.value << std::endl;
} break;
case ABS_Z: { // right x
// std::cout << "type " << ev.code << "value:" << ev.value << std::endl;
} break;
case ABS_RZ: { // right y
// std::cout << "type " << ev.code << "value:" << ev.value << std::endl;
} break;
}
} break;
case EV_KEY: {
switch (ev.code) {
case BTN_A: { // square
std::cout << "Square ";
} break;
case BTN_B: { // x
std::cout << "X ";
} break;
case BTN_C: { // circle
std::cout << "Circle ";
} break;
case BTN_X: { // triangle
std::cout << "Triangle ";
} break;
}
if (ev.value) {
std::cout << "Pressed " << std::endl;
} else {
std::cout << "Released " << std::endl;
}
} break;
}
}
}
assert(r1 != -1 || errno == EWOULDBLOCK || errno == EAGAIN);
std::this_thread::sleep_for(std::chrono::milliseconds(20));
}
}https://stackoverflow.com/questions/71067405
复制相似问题