@kharlashkin

Как отправить вибрацию в геймпад Xbox 360 с помощью python в Linux?

Собственно вопрос задан, мне не хватает квалификации и знаний для понимания и решения.
Есть следующие вводные данные:
  1. Документация на модуль отправки вибраций в геймпад.
  2. Исходники тестовой программы для проверки вибраций написанный на С.
  3. Использую встроенный драйвер для Xbox 360 контроллера Xpad - исходник, документация.

Может кто подсказать направление или дать пример реализации аналога fftest на python?
  • Вопрос задан
  • 1587 просмотров
Решения вопроса 1
@kharlashkin Автор вопроса
Нашелся нужный код, который с помощью небольшой модификации позволяет делать нужные действия, в примере запуск 4-х вибраций продолжительностью по 2 секунды с 2-х секундным интервалом (первая вибрация не срабатывает почему-то). ОС Ubuntu 14.04 LTS в виртуальной машине VMWare с проброшенным внутрь проводным геймпадом Xbox 360.

Чуть позже нашел правильное и корректно отрабатывающее решение, почему сразу не написал - ХЗ.
import fcntl, struct, array, time
	
EVIOCRMFF = 0x40044581
EVIOCSFF = 0x40304580
LOG_CLASS_ON = False
TIME_DELTA = 25

class Vibrate:

    def __init__(self, file):
        self.ff_joy = open(file, "r+")

    def close(self):
        self.ff_joy.close()

    def new_effect(self, strong, weak, length):
        effect = struct.pack('HhHHHHHxHH', 0x50, -1, 0, 0, 0, length, 0, int(strong * 0xFFFF), int(weak * 0xFFFF))
        a = array.array('h', effect)
        fcntl.ioctl(self.ff_joy, EVIOCSFF, a, True)
        return a[1]
        id = a[1]
        return (ev_play, ev_stop)

    def play_efect(self, id):
        if type(id) == tuple or type(id) == list:
            ev_play = ''
            for i in id:
                ev_play = ev_play + struct.pack('LLHHi', 0, 0, 0x15, i, 1)
        else:
            ev_play = struct.pack('LLHHi', 0, 0, 0x15, id, 1)
        self.ff_joy.write(ev_play)
        self.ff_joy.flush()

    def stop_effect(self, id):
        if type(id) == tuple or type(id) == list:
            ev_stop = ''
            for i in id:
                ev_stop = ev_stop + struct.pack('LLHHi', 0, 0, 0x15, i, 0)
        else:
            ev_stop = struct.pack('LLHHi', 0, 0, 0x15, id, 0)
        self.ff_joy.write(ev_stop)
        self.ff_joy.flush()

    def forget_effect(self, id):
        if type(id) == tuple or type(id) == list:
            for i in id:
                fcntl.ioctl(self.ff_joy, EVIOCRMFF, i)
        else:
            fcntl.ioctl(self.ff_joy, EVIOCRMFF, id)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы