testing improved detection of device status
This commit is contained in:
parent
5f6fd5a333
commit
e5332500ea
|
@ -105,13 +105,13 @@ class _FeaturesArray(object):
|
||||||
class DeviceInfo(_api.PairedDevice):
|
class DeviceInfo(_api.PairedDevice):
|
||||||
"""A device attached to the receiver.
|
"""A device attached to the receiver.
|
||||||
"""
|
"""
|
||||||
def __init__(self, listener, number, pair_code, status=STATUS.UNKNOWN):
|
def __init__(self, listener, number, serial_prefix, status=STATUS.UNKNOWN):
|
||||||
super(DeviceInfo, self).__init__(listener.handle, number)
|
super(DeviceInfo, self).__init__(listener.handle, number)
|
||||||
|
|
||||||
self.LOG = _Logger("Device[%d]" % number)
|
self.LOG = _Logger("Device[%d]" % number)
|
||||||
self._listener = listener
|
self._listener = listener
|
||||||
self._pair_code = pair_code
|
self._pair_code = _pack('!B', 0x40 + number - 1)
|
||||||
self._serial = None
|
self._serial = serial_prefix
|
||||||
self._codename = None
|
self._codename = None
|
||||||
|
|
||||||
self._status = status
|
self._status = status
|
||||||
|
@ -180,13 +180,14 @@ class DeviceInfo(_api.PairedDevice):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def serial(self):
|
def serial(self):
|
||||||
if self._serial is None:
|
assert self._serial is not None
|
||||||
|
if len(self._serial) == 2:
|
||||||
# dodgy
|
# dodgy
|
||||||
b = bytearray(self._pair_code)
|
b = bytearray(self._pair_code)
|
||||||
b[0] -= 0x10
|
b[0] -= 0x10
|
||||||
serial = _base.request(self.handle, 0xFF, b'\x83\xB5', bytes(b))
|
serial = _base.request(self.handle, 0xFF, b'\x83\xB5', bytes(b))
|
||||||
if serial:
|
if serial:
|
||||||
self._serial = _base._hex(serial[1:5])
|
self._serial = _base._hex(self._serial) + '-' + _base._hex(serial[1:5])
|
||||||
return self._serial or '?'
|
return self._serial or '?'
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -292,12 +293,12 @@ class ReceiverListener(_EventsListener):
|
||||||
self.status_changed_callback(self.receiver, device, urgent)
|
self.status_changed_callback(self.receiver, device, urgent)
|
||||||
|
|
||||||
def _device_status_from(self, event):
|
def _device_status_from(self, event):
|
||||||
state_code = ord(event.data[2:3]) & 0xF0
|
state_code = ord(event.data[2:3]) & 0xC0
|
||||||
state = STATUS.UNAVAILABLE if state_code == 0x60 else \
|
state = STATUS.UNAVAILABLE if state_code == 0x40 else \
|
||||||
STATUS.CONNECTED if state_code == 0xA0 else \
|
STATUS.CONNECTED if state_code == 0x80 else \
|
||||||
STATUS.CONNECTED if state_code == 0x20 else \
|
STATUS.CONNECTED if state_code == 0x00 else \
|
||||||
STATUS.UNKNOWN
|
None
|
||||||
if state == STATUS.UNKNOWN:
|
if state is None:
|
||||||
self.LOG.warn("don't know how to handle state code 0x%02X: %s", state_code, event)
|
self.LOG.warn("don't know how to handle state code 0x%02X: %s", state_code, event)
|
||||||
return state
|
return state
|
||||||
|
|
||||||
|
@ -309,7 +310,7 @@ class ReceiverListener(_EventsListener):
|
||||||
|
|
||||||
if event.devnumber in self.receiver.devices:
|
if event.devnumber in self.receiver.devices:
|
||||||
status = self._device_status_from(event)
|
status = self._device_status_from(event)
|
||||||
if status > STATUS.UNKNOWN:
|
if status is not None:
|
||||||
self.receiver.devices[event.devnumber].status = status
|
self.receiver.devices[event.devnumber].status = status
|
||||||
else:
|
else:
|
||||||
dev = self.make_device(event)
|
dev = self.make_device(event)
|
||||||
|
@ -343,12 +344,15 @@ class ReceiverListener(_EventsListener):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
status = self._device_status_from(event)
|
status = self._device_status_from(event)
|
||||||
|
if status is not None:
|
||||||
dev = DeviceInfo(self, event.devnumber, event.data[4:5], status)
|
serial_prefix = event.data[-1:] + event.data[-2:-1]
|
||||||
|
dev = DeviceInfo(self, event.devnumber, serial_prefix, status)
|
||||||
self.LOG.info("new device %s", dev)
|
self.LOG.info("new device %s", dev)
|
||||||
self.status_changed(dev, True)
|
self.status_changed(dev, True)
|
||||||
return dev
|
return dev
|
||||||
|
|
||||||
|
self.LOG.error("failed to identify status of device %d from %s", event.devnumber, event)
|
||||||
|
|
||||||
def unpair_device(self, device):
|
def unpair_device(self, device):
|
||||||
try:
|
try:
|
||||||
del self.receiver[device.number]
|
del self.receiver[device.number]
|
||||||
|
|
Loading…
Reference in New Issue