Python HIDAPI открыть устройство, используя путь - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь заставить Raspberry Pi общаться с четырьмя одинаковыми USB-устройствами, используя HIDAPI (контроллеры PlayStation Buzz). Обычный метод использования open () заключается в передаче идентификатора производителя и продукта, но, поскольку у меня есть идентичные устройства, я не могу этого сделать, поскольку все команды открытия будут одинаковыми. Альтернативный способ заключается в открытии () с использованием пути, я пытался сделать это, но он продолжает сбой.

У меня есть класс Buzzer, который обрабатывает настройку настройки зуммера (ов) Класс устройства, который будет иметь декодирование сообщений от контроллера Buzz, а также должен обрабатывать свет. У меня есть немного python, чтобы прочитать контроллеры и попытаться открыть первое в списке и включить свет. Я сократил количество устройств до одного контроллера, чтобы упростить процесс.

Я довольно новичок в python, и у меня есть другой код, работающий с hid.open (поставщик, продукт). Я просто продолжаю нажимать блок с использованием пути.

Любой совет?

Спасибо

Main

import DeviceClass

my_buzz = BuzzerClass.BuzzerClass()

if my_buzz.device_count()>0:
    d=my_buzz.pathname_list()
    print("List size ="+ str(len(d)))
else:
    print("No devices connected!")

print ("pathname - " + str(d[0]))

buzzer=DeviceClass.DeviceClass()
buzzer.open_device(d[0])
buzzer.flashlights()

Класс устройства

import hid

class DeviceClass:
    lights_off = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
    lights_on = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

    def __init__(self):
        self.hid = hid.device()

    def open_device(self, pathname):
        self.hid.open(pathname)
        self.hid.set_nonblocking(1)
        self.hid.write(self.light_array)

    def flashlights(self):
        self.hid.write(self.lights_off)
        self.hid.write(self.lights_on)

Зуммер класса

import hid
class BuzzerClass:

    # Namtai details are  Vendor=1356 Product =4096
    # Logitech details are Vendor=1356 Product =2

    def __init__(self):
        self.pathname = ""
        self.idVendor1 = 1356
        self.idProduct1 = 4096
        self.idVendor2 = 1356
        self.idProduct2 = 2

#   Check to see if any devices are connected and add any connected devices to 
#   the buzz_controllers() list
#   Return the list of connected items
    def connected_devices(self):
        buzz_controllers = []

        #Get the list of Namtai controllers
        if hid.enumerate(self.idVendor1, self.idProduct1):
#            print("Namtai connected")
            for d in hid.enumerate(self.idVendor1, self.idProduct1):
                buzz_controllers.append(d)

        #Get the list of Logitech controllers
        if hid.enumerate(self.idVendor2, self.idProduct2):
#            print("Logitech connected")
            for d in hid.enumerate(self.idVendor2, self.idProduct2):
                buzz_controllers.append(d)
        return (buzz_controllers)

# calls connected_devices() and return the number of connected devices
    def device_count(self):
        return len(self.connected_devices())

# call connected devices and extract pathnames and place in list. return list of pathnames.
    def pathname_list(self):
        pathnames = []
        for d in self.connected_devices():
            keys = list(d.keys())
            for key in keys:
                if "path" in key:
                    print(str(d[key]))
                    pathnames.append(d[key])
        return pathnames

Корпус

Python 3.6.9 (default, Apr 18 2020, 01:56:04) 
[GCC 8.4.0] on andrew-desktop, Standard
>>> b'0007:0008:00'
List size =1
pathname - b'0007:0008:00'
Exception "unhandled TypeError"
an integer is required
File: /usr/local/lib/python3.6/dist-packages/hid.cpython-36m-x86_64-linux-gnu.so, Line: 47
>>> 
...