Интерфейс Playstation DualShock 4 (DS4) Контроллер на Linux с использованием C++

Я хотел бы заставить контроллер PS4 работать на моем ПК, а затем передавать данные на микроконтроллер через UART.

Проблема в том, что у меня нет опыта программирования на C++ для Linux. UC часть больше в мою пользу. Тем не менее, я хотел бы написать программу, которая может установить соединение с контроллером PS4 и читать все кнопки, джойстики, движения и трекпад. Также было бы неплохо иметь возможность контролировать гул и цвет светодиода.

Я использую Ubuntu 16.4 и прочитал, что контроллер PS4 изначально поддерживается начиная с версии. 14.xx. Но все, что я могу найти относительно подключения, - это настроить контроллер для Steam или игр в целом. Но не о том, как получить информацию о состоянии и работать с ними с помощью C++.

В интернете я нашел несколько проектов, но им по крайней мере 3-4 года, и они используют старую версию Ubuntu. Но так как контроллер изначально поддерживается, было бы неплохо использовать его без устаревших плагинов / драйверов, которые все равно устарели. Я также начал изучать HID-устройства, но это больше похоже на обходной путь, и я надеялся найти, например, библиотеку для включения и использования...

Если кто-то может дать мне подсказку, это будет с благодарностью.

1 ответ

Я сделал большую часть этого на Raspberry Pi, но большая часть все еще применяется, потому что основные драйверы в основном одинаковы

Соединение: https://wiki.gentoo.org/wiki/Sony_DualShock посмотрите на часть о bluetoothctl и попробуйте следовать этому или получите беспроводной ключ. (Это должно настроить автоматически)

Контроли: Лучше всего читать /dev/input/jsX где x - номер контроллера, к которому вы подключены (обычно 0). Это работает при обычном чтении файлов, поэтому проблем не должно быть. Этот файл содержит все, от нажатия кнопок до событий трекпада и всех других данных датчика. Он основан на событиях, поэтому, если вы нажмете кнопку, вы получите 8-байтовый пакет данных. Структура выглядит так:
1. Метка времени младший байт
2. Отметка времени второго младшего байта
3. Отметка времени второго старшего байта
4. Отметка времени старшего байта
5. Измеренные данные MSB
6. Измеренные данные LSB
7. Введите (1 для кнопки. 2 для оси (например, палка или другое аналоговое значение))
8. Байт идентификатора (то есть идентификатор кнопки, которую вы нажали. Например: 1 для x, 2 для квадрата, 5 для левой ручки x)

Светодиоды: этот немного сложнее. Единственный способ, который я нашел до сих пор, это доступ к /sys/class/leds
Эта папка должна содержать подпапку с именем что-то вроде 0005:054C:05C4.0009:<blue/green/red/global>
Это ваши каналы R/G/B. В этих папках есть файлы, называемые max_brightness а также brightness Например, чтобы изменить цвет на 0x00ff00, напишите 0 в red 255 до green и от 0 до blue

Другие вопросы по тегам