0%

Ubuntu读取PS4手柄

链接

  • 长安手柄的share键和PS键直到手柄快闪两次反复,配对状态
  • 使用bluetoothctl工具
  • 命令行敲击之后,输入power on
  • agent on
  • default-agent
  • scan on
  • 找到名字(最右边一列)中带有Wireless Controller字样的设备
  • 与之MAC地址配对pair XX:XX:XX:XX:XX:XX
  • 然后connect XX:XX:XX:XX:XX:XX

    第二次链接

  • 按一次PS键,白灯呼吸闪烁即可
  • 可能需要执行power on
  • 同样使用bluetoothctl工具如上
  • 输入命令查看配对的设备:paired-devices
  • connect XX:XX:XX:XX:XX:XX
  • picture 1
  • 使用trust <MAC地址>的方式信任设备

    读取

  • 使用sudo evtest查看手柄状态
  • picture 0
  • 6是触控板,8是按钮(不包括左边的四个方向键)
  • 例子
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <libevdev/libevdev.h>

void print_event(struct input_event *ev) {
if (ev->type == EV_ABS) {
switch (ev->code) {
case ABS_X:
printf("Left stick X: %d\n", ev->value);
break;
case ABS_Y:
printf("Left stick Y: %d\n", ev->value);
break;
case ABS_RX:
printf("Right stick X: %d\n", ev->value);
break;
case ABS_RY:
printf("Right stick Y: %d\n", ev->value);
break;
case ABS_Z:
printf("Left trigger: %d\n", ev->value);
break;
case ABS_RZ:
printf("Right trigger: %d\n", ev->value);
break;
}
} else if (ev->type == EV_KEY) {
switch (ev->code) {
case BTN_A:
printf("Cross button: %s\n", ev->value ? "pressed" : "released");
break;
case BTN_B:
printf("Circle button: %s\n", ev->value ? "pressed" : "released");
break;
case BTN_X:
printf("Square button: %s\n", ev->value ? "pressed" : "released");
break;
case BTN_Y:
printf("Triangle button: %s\n", ev->value ? "pressed" : "released");
break;
}
}
}

int main() {
struct libevdev *dev = NULL;
// eventX要用sudo evtest自己看
int fd = open("/dev/input/eventX", O_RDONLY | O_NONBLOCK);
if (fd < 0) {
perror("Failed to open device");
return 1;
}

int rc = libevdev_new_from_fd(fd, &dev);
if (rc < 0) {
fprintf(stderr, "Failed to init libevdev (%s)\n", strerror(-rc));
return 1;
}

printf("Input device name: \"%s\"\n", libevdev_get_name(dev));

while (1) {
struct input_event ev;
rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
if (rc == 0) {
print_event(&ev);
} else if (rc != -EAGAIN) {
fprintf(stderr, "Failed to read next event (%s)\n", strerror(-rc));
break;
}

usleep(10000); // Sleep for 10ms to reduce CPU usage
}

libevdev_free(dev);
close(fd);
return 0;
}