Ответы пользователя по тегу Python
  • Как отправить вибрацию в геймпад Xbox 360 с помощью python в Linux?

    @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)
    Ответ написан
    Комментировать