protocol: implement the message to wait for the end of pen data
This pushes the CRC fetching into the messages, making the caller code more generic. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
fc280ce555
commit
4eee838d94
|
@ -119,6 +119,7 @@ class Interactions(enum.Enum):
|
||||||
AVAILABLE_FILES_COUNT = enum.auto()
|
AVAILABLE_FILES_COUNT = enum.auto()
|
||||||
DOWNLOAD_OLDEST_FILE = enum.auto()
|
DOWNLOAD_OLDEST_FILE = enum.auto()
|
||||||
DELETE_OLDEST_FILE = enum.auto()
|
DELETE_OLDEST_FILE = enum.auto()
|
||||||
|
WAIT_FOR_END_READ = enum.auto()
|
||||||
REGISTER_PRESS_BUTTON = enum.auto()
|
REGISTER_PRESS_BUTTON = enum.auto()
|
||||||
REGISTER_WAIT_FOR_BUTTON = enum.auto()
|
REGISTER_WAIT_FOR_BUTTON = enum.auto()
|
||||||
REGISTER_COMPLETE = enum.auto()
|
REGISTER_COMPLETE = enum.auto()
|
||||||
|
@ -1134,6 +1135,62 @@ class MsgDownloadOldestFile(Msg):
|
||||||
raise UnexpectedDataError(reply)
|
raise UnexpectedDataError(reply)
|
||||||
|
|
||||||
|
|
||||||
|
class MsgWaitForEndRead(Msg):
|
||||||
|
'''
|
||||||
|
.. attribute:: crc
|
||||||
|
|
||||||
|
The checksum provided for the (out of band) pen data.
|
||||||
|
'''
|
||||||
|
interaction = Interactions.WAIT_FOR_END_READ
|
||||||
|
requires_request = False
|
||||||
|
opcode = 0x00 # unused
|
||||||
|
protocol = ProtocolVersion.ANY
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(timeout=5, *args, **kwargs)
|
||||||
|
|
||||||
|
def _handle_reply(self, reply):
|
||||||
|
if reply.opcode == 0xc8:
|
||||||
|
if reply[0] != 0xed:
|
||||||
|
raise UnexpectedDataError(reply, 'Expected c8 ed')
|
||||||
|
pass # nothing to do here
|
||||||
|
elif reply.opcode == 0xc9:
|
||||||
|
self.crc = int(binascii.hexlify(bytes(reply)), 16)
|
||||||
|
else:
|
||||||
|
raise UnexpectedReply(reply)
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
# This is a double-reply , once c8, then c9
|
||||||
|
super().execute()
|
||||||
|
super().execute()
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
class MsgWaitForEndReadSlate(Msg):
|
||||||
|
'''
|
||||||
|
.. attribute:: crc
|
||||||
|
|
||||||
|
The checksum provided for the (out of band) pen data.
|
||||||
|
'''
|
||||||
|
interaction = Interactions.WAIT_FOR_END_READ
|
||||||
|
requires_request = False
|
||||||
|
opcode = 0x00 # unused
|
||||||
|
protocol = ProtocolVersion.SLATE
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(timeout=5, *args, **kwargs)
|
||||||
|
|
||||||
|
def _handle_reply(self, reply):
|
||||||
|
if reply.opcode == 0xc8:
|
||||||
|
if reply[0] != 0xed:
|
||||||
|
raise UnexpectedDataError(reply, 'Expected c8 ed')
|
||||||
|
crc = reply[1:]
|
||||||
|
crc.reverse()
|
||||||
|
self.crc = int(binascii.hexlify(bytes(crc)), 16)
|
||||||
|
else:
|
||||||
|
raise UnexpectedReply(reply)
|
||||||
|
|
||||||
|
|
||||||
class MsgDeleteOldestFile(Msg):
|
class MsgDeleteOldestFile(Msg):
|
||||||
interaction = Interactions.DELETE_OLDEST_FILE
|
interaction = Interactions.DELETE_OLDEST_FILE
|
||||||
opcode = 0xca
|
opcode = 0xca
|
||||||
|
|
|
@ -633,17 +633,21 @@ class WacomProtocolBase(WacomProtocolLowLevelComm):
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def wait_for_end_read(self):
|
def wait_for_end_read(self, timeout=5):
|
||||||
data = self.wait_nordic_unless_pen_data(0xc8, 5)
|
msg = None
|
||||||
if data[0] != 0xed:
|
while True:
|
||||||
raise WacomException(f'unexpected answer: {data[0]:02x}')
|
try:
|
||||||
data = self.wait_nordic_data(0xc9, 5)
|
msg = self.p.execute(Interactions.WAIT_FOR_END_READ)
|
||||||
crc = data
|
break
|
||||||
crc = int(binascii.hexlify(bytes(crc)), 16)
|
except WacomTimeoutException as e:
|
||||||
|
# if we're still reading pen data, try again
|
||||||
|
if time.time() - self._last_pen_data_time > timeout:
|
||||||
|
raise e
|
||||||
|
|
||||||
pen_data = self.pen_data_buffer
|
pen_data = self.pen_data_buffer
|
||||||
self.pen_data_buffer = []
|
self.pen_data_buffer = []
|
||||||
if crc != binascii.crc32(bytes(pen_data)):
|
if msg.crc != binascii.crc32(bytes(pen_data)):
|
||||||
logger.error("CRCs don't match")
|
raise UnexpectedDataError(pen_data, message='CRCs do not match')
|
||||||
return pen_data
|
return pen_data
|
||||||
|
|
||||||
def retrieve_data(self):
|
def retrieve_data(self):
|
||||||
|
@ -857,19 +861,6 @@ class WacomProtocolSlate(WacomProtocolSpark):
|
||||||
else:
|
else:
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
def wait_for_end_read(self):
|
|
||||||
data = self.wait_nordic_unless_pen_data(0xc8, timeout=5)
|
|
||||||
if data[0] != 0xed:
|
|
||||||
raise WacomException(f'unexpected answer: {data[0]:02x}')
|
|
||||||
crc = data[1:]
|
|
||||||
crc.reverse()
|
|
||||||
crc = int(binascii.hexlify(bytes(crc)), 16)
|
|
||||||
pen_data = self.pen_data_buffer
|
|
||||||
self.pen_data_buffer = []
|
|
||||||
if crc != binascii.crc32(bytes(pen_data)):
|
|
||||||
raise UnexpectedDataError(pen_data, message='CRCs do not match')
|
|
||||||
return pen_data
|
|
||||||
|
|
||||||
|
|
||||||
class WacomProtocolIntuosPro(WacomProtocolSlate):
|
class WacomProtocolIntuosPro(WacomProtocolSlate):
|
||||||
'''
|
'''
|
||||||
|
|
Loading…
Reference in New Issue