如何在 Google Coral 开发板上使用无线控制器?

How to use a wireless controller on the Google Coral Dev Board?

对于 Jetson Nano,我通过蓝牙连接了一个 PS4 控制器,设备显示在 /dev/input/js0 下。但是,当我通过蓝牙将控制器连接到我的 Coral 板时,我在那个位置什么也看不到,可能是因为 Mendel 而不是 Ubuntu?连接 PS4 控制器并从 C++ 访问它的推荐方法是什么?我应该使用不同的操纵杆吗?

经过一些研究,我在 linux 上了解了 joydev 和 evdev 之间的区别。似乎我的 PS4 控制器在 Jetson 上显示为一个 joydev 设备,而在 Coral 运行 Mendel 上它显示为一个 evdev 设备。我从 Croepha 找到了一些用于 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);
    }
}