wacom: switch registering the device to the new protocol handling
This is still a bit awkward because the communication of the spark especially is so strange. It sends a (rejected) uuid, then a single command to register that UUID. The Slate and the IntuosPro are more sensible, they seem to have a special message to register a UUID - that one either fails or succeeds. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
6e20faa737
commit
b34f8794e4
|
@ -72,6 +72,7 @@ class Interactions(enum.Enum):
|
||||||
START_READING = enum.auto()
|
START_READING = enum.auto()
|
||||||
ACK_TRANSACTION = enum.auto()
|
ACK_TRANSACTION = enum.auto()
|
||||||
REGISTER_PRESS_BUTTON = enum.auto()
|
REGISTER_PRESS_BUTTON = enum.auto()
|
||||||
|
REGISTER_WAIT_FOR_BUTTON = enum.auto()
|
||||||
REGISTER_COMPLETE = enum.auto()
|
REGISTER_COMPLETE = enum.auto()
|
||||||
|
|
||||||
UNKNOWN_B1 = enum.auto()
|
UNKNOWN_B1 = enum.auto()
|
||||||
|
@ -996,29 +997,76 @@ class MsgRegisterCompleteSlate(Msg):
|
||||||
class MsgRegisterPressButtonSpark(Msg):
|
class MsgRegisterPressButtonSpark(Msg):
|
||||||
interaction = Interactions.REGISTER_PRESS_BUTTON
|
interaction = Interactions.REGISTER_PRESS_BUTTON
|
||||||
opcode = 0xe3
|
opcode = 0xe3
|
||||||
protocol = ProtocolVersion.SLATE
|
protocol = ProtocolVersion.ANY
|
||||||
|
# Does not require a reply, the reply is sent in response to the
|
||||||
|
# physical button press.
|
||||||
|
requires_reply = False
|
||||||
|
|
||||||
# FIXME: this is almost certainly incomplete
|
# uuid is unused, just there so it's compatible with the slate message
|
||||||
def _handle_reply(self, reply):
|
def __init__(self, uuid=None, *args, **kwargs):
|
||||||
if reply.opcode != 0xb3:
|
super().__init__(*args, **kwargs)
|
||||||
raise UnexpectedReply(reply)
|
self.args = [0x01]
|
||||||
|
self.uuid = uuid
|
||||||
|
|
||||||
|
|
||||||
class MsgRegisterPressButtonSlate(Msg):
|
class MsgRegisterPressButtonSlateOrIntuosPro(Msg):
|
||||||
interaction = Interactions.REGISTER_PRESS_BUTTON
|
interaction = Interactions.REGISTER_PRESS_BUTTON
|
||||||
opcode = 0xe7
|
opcode = 0xe7
|
||||||
protocol = ProtocolVersion.SLATE
|
protocol = ProtocolVersion.SLATE
|
||||||
|
# Does not require a reply, the reply is sent in response to the
|
||||||
|
# physical button press.
|
||||||
|
requires_reply = False
|
||||||
|
|
||||||
|
def __init__(self, uuid, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.uuid = uuid
|
||||||
|
self.args = [int(i) for i in binascii.unhexlify(uuid)]
|
||||||
|
|
||||||
|
|
||||||
|
class MsgRegisterWaitForButtonSpark(Msg):
|
||||||
|
'''
|
||||||
|
.. attribute:: protocol_version
|
||||||
|
|
||||||
|
The protocol version used by this device, according to this message.
|
||||||
|
|
||||||
|
'''
|
||||||
|
interaction = Interactions.REGISTER_WAIT_FOR_BUTTON
|
||||||
|
requires_request = False
|
||||||
|
opcode = 0x00 # unused
|
||||||
|
protocol = ProtocolVersion.ANY
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
kwargs['timeout'] = 10
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.protocol_version = ProtocolVersion.ANY
|
||||||
|
|
||||||
# FIXME: this is almost certainly incomplete
|
|
||||||
def _handle_reply(self, reply):
|
def _handle_reply(self, reply):
|
||||||
if reply.opcode != 0xe4:
|
if reply.opcode != 0xe4:
|
||||||
raise UnexpectedReply(reply)
|
raise UnexpectedReply(reply)
|
||||||
|
self.protocol_version = ProtocolVersion.SPARK
|
||||||
|
|
||||||
|
|
||||||
class MsgRegisterPressButtonIntuosPro(Msg):
|
class MsgRegisterWaitForButtonSlateOrIntuosPro(Msg):
|
||||||
interaction = Interactions.REGISTER_PRESS_BUTTON
|
'''
|
||||||
opcode = 0xe7
|
.. attribute:: protocol_version
|
||||||
|
|
||||||
|
The protocol version used by this device, according to this message.
|
||||||
|
|
||||||
|
'''
|
||||||
|
interaction = Interactions.REGISTER_WAIT_FOR_BUTTON
|
||||||
|
requires_request = False
|
||||||
|
opcode = 0x00 # unused
|
||||||
|
protocol = ProtocolVersion.SLATE
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
kwargs['timeout'] = 10
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.protocol_version = ProtocolVersion.ANY
|
||||||
|
|
||||||
def _handle_reply(self, reply):
|
def _handle_reply(self, reply):
|
||||||
if reply.opcode != 0x53:
|
if reply.opcode == 0xe4:
|
||||||
|
self.protocol_version = ProtocolVersion.SLATE
|
||||||
|
elif reply.opcode == 0x53:
|
||||||
|
self.protocol_version = ProtocolVersion.INTUOS_PRO
|
||||||
|
else:
|
||||||
raise UnexpectedReply(reply)
|
raise UnexpectedReply(reply)
|
||||||
|
|
|
@ -564,41 +564,41 @@ class WacomRegisterHelper(WacomProtocolLowLevelComm):
|
||||||
|
|
||||||
def register_device(self, uuid):
|
def register_device(self, uuid):
|
||||||
protocol = Protocol.UNKNOWN
|
protocol = Protocol.UNKNOWN
|
||||||
args = [int(i) for i in binascii.unhexlify(uuid)]
|
|
||||||
|
|
||||||
if self.is_spark(self.device):
|
if self.is_spark(self.device):
|
||||||
|
self.p = tuhi.protocol.Protocol(ProtocolVersion.SPARK, self.nordic_data_exchange)
|
||||||
# The spark replies with b3 01 01 when in pairing mode
|
# The spark replies with b3 01 01 when in pairing mode
|
||||||
# Usually that triggers a WacomWrongModeException but here it's
|
# Usually that triggers a WacomWrongModeException but here it's
|
||||||
# expected
|
# expected
|
||||||
try:
|
try:
|
||||||
self.send_nordic_command_sync(command=0xe6, arguments=args)
|
self.p.execute(Interactions.CONNECT, uuid)
|
||||||
except WacomWrongModeException:
|
except tuhi.protocol.DeviceError:
|
||||||
# this is expected
|
# this is expected
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# The "press button now command" on the spark
|
# The "press button now command" on the spark
|
||||||
self.send_nordic_command(command=0xe3,
|
self.p.execute(Interactions.REGISTER_PRESS_BUTTON)
|
||||||
arguments=[0x01])
|
|
||||||
protocol = Protocol.SPARK
|
|
||||||
else:
|
else:
|
||||||
# Slate requires a button press in response to e7 directly
|
# Default to Slate for now, it will handle the IntuosPro too
|
||||||
self.send_nordic_command(command=0xe7, arguments=args)
|
self.p = tuhi.protocol.Protocol(ProtocolVersion.SLATE, self.nordic_data_exchange)
|
||||||
|
self.p.execute(Interactions.REGISTER_PRESS_BUTTON, uuid)
|
||||||
|
|
||||||
logger.info('Press the button now to confirm')
|
logger.info('Press the button now to confirm')
|
||||||
self.emit('button-press-required')
|
self.emit('button-press-required')
|
||||||
|
|
||||||
# Wait for the button confirmation event, or any error
|
# Wait for the button confirmation event, or any error
|
||||||
data = self.wait_nordic_data([0xe4, 0xb3, 0x53], 10)
|
protocol_version = self.p.execute(Interactions.REGISTER_WAIT_FOR_BUTTON).protocol_version
|
||||||
|
|
||||||
if protocol == Protocol.UNKNOWN:
|
if protocol_version == ProtocolVersion.ANY:
|
||||||
if data.opcode == 0xe4:
|
raise WacomException(f'Unknown protocol version: {protocol_version}')
|
||||||
protocol = Protocol.SLATE
|
|
||||||
elif data.opcode == 0x53:
|
|
||||||
protocol = Protocol.INTUOS_PRO
|
|
||||||
else:
|
|
||||||
raise WacomException(f'unexpected opcode to register reply: {data.opcode:02x}')
|
|
||||||
|
|
||||||
return protocol
|
pvmap = {
|
||||||
|
ProtocolVersion.SPARK: Protocol.SPARK,
|
||||||
|
ProtocolVersion.SLATE: Protocol.SLATE,
|
||||||
|
ProtocolVersion.INTUOS_PRO: Protocol.INTUOS_PRO,
|
||||||
|
}
|
||||||
|
|
||||||
|
return pvmap[protocol_version]
|
||||||
|
|
||||||
|
|
||||||
class WacomProtocolBase(WacomProtocolLowLevelComm):
|
class WacomProtocolBase(WacomProtocolLowLevelComm):
|
||||||
|
|
Loading…
Reference in New Issue