From 5e4ab89f4138feaa3977b776334d6b41cc9a7bf9 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 9 Aug 2019 14:27:54 +1000 Subject: [PATCH] Drop the semi-duplicate separate Protocol class We can hook into the ProtocolVersion here, so let's de-duplicate this. Should be backwards-compatible for config files but new config files will have the uppercase name written now. Signed-off-by: Peter Hutterer --- tuhi/config.py | 8 ++++---- tuhi/protocol.py | 27 +++++++++++++++++++++++++-- tuhi/wacom.py | 47 ++++++++++++++--------------------------------- 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/tuhi/config.py b/tuhi/config.py index e7f61f1..d455022 100644 --- a/tuhi/config.py +++ b/tuhi/config.py @@ -19,7 +19,7 @@ import configparser import re import logging from .drawing import Drawing -from .wacom import Protocol +from .protocol import ProtocolVersion logger = logging.getLogger('tuhi.config') @@ -73,13 +73,13 @@ class TuhiConfig(GObject.Object): assert config['Device']['Address'] == entry.name if 'Protocol' not in config['Device']: - config['Device']['Protocol'] = Protocol.UNKNOWN.value + config['Device']['Protocol'] = ProtocolVersion.ANY.name.lower() self._devices[entry.name] = config['Device'] def new_device(self, address, uuid, protocol): assert is_btaddr(address) assert len(uuid) == 12 - assert protocol != Protocol.UNKNOWN + assert protocol != ProtocolVersion.ANY logger.debug(f'{address}: adding new config, UUID {uuid}') path = os.path.join(self.config_dir, address) @@ -100,7 +100,7 @@ class TuhiConfig(GObject.Object): config['Device'] = { 'Address': address, 'UUID': uuid, - 'Protocol': protocol.value, + 'Protocol': protocol.name.lower(), } with open(path, 'w') as configfile: diff --git a/tuhi/protocol.py b/tuhi/protocol.py index 1a9cc61..11a45e2 100644 --- a/tuhi/protocol.py +++ b/tuhi/protocol.py @@ -166,6 +166,29 @@ class ProtocolVersion(enum.IntEnum): SLATE = 2 INTUOS_PRO = 3 + @classmethod + def from_string(cls, string): + ''' + Return the Enum value for the given string, allowing for different + spellings. Specifically: INTUOS_PRO, intuos_pro and intuos-pro are + all allowed for the ``INTUOS_PRO`` enum value. + + :raise ValueError: if the name cannot be mapped. + ''' + names = {e.name: e for e in cls} + if string in names: + return names[string] + + names = {e.name.lower(): e for e in cls} + if string in names: + return names[string] + + names = {e.name.lower().replace('_', '-'): e for e in cls} + if string in names: + return names[string] + + raise ValueError(string) + class Mode(enum.IntEnum): ''' @@ -1065,8 +1088,8 @@ class MsgRegisterWaitForButtonSlateOrIntuosPro(Msg): def _handle_reply(self, reply): if reply.opcode == 0xe4: - self.protocol_version = ProtocolVersion.SLATE + self.protocol_version = ProtocolVersion.SLATE elif reply.opcode == 0x53: - self.protocol_version = ProtocolVersion.INTUOS_PRO + self.protocol_version = ProtocolVersion.INTUOS_PRO else: raise UnexpectedReply(reply) diff --git a/tuhi/wacom.py b/tuhi/wacom.py index 605964e..41b4cb4 100644 --- a/tuhi/wacom.py +++ b/tuhi/wacom.py @@ -40,14 +40,6 @@ SYSEVENT_NOTIFICATION_SERVICE_UUID = '3a340720-c572-11e5-86c5-0002a5d5c51b' # N SYSEVENT_NOTIFICATION_CHRC_UUID = '3a340721-c572-11e5-86c5-0002a5d5c51b' # NOQA -@enum.unique -class Protocol(enum.Enum): - UNKNOWN = 'unknown' - SPARK = 'spark' - SLATE = 'slate' - INTUOS_PRO = 'intuos-pro' - - @enum.unique class DeviceMode(enum.Enum): REGISTER = 1 @@ -544,8 +536,6 @@ class WacomRegisterHelper(WacomProtocolLowLevelComm): return SYSEVENT_NOTIFICATION_CHRC_UUID not in device.characteristics def register_device(self, uuid): - protocol = Protocol.UNKNOWN - 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 @@ -571,15 +561,9 @@ class WacomRegisterHelper(WacomProtocolLowLevelComm): protocol_version = self.p.execute(Interactions.REGISTER_WAIT_FOR_BUTTON).protocol_version if protocol_version == ProtocolVersion.ANY: - raise WacomException(f'Unknown protocol version: {protocol_version}') + raise WacomException(f'Unknown protocol version: {protocol_version}') - pvmap = { - ProtocolVersion.SPARK: Protocol.SPARK, - ProtocolVersion.SLATE: Protocol.SLATE, - ProtocolVersion.INTUOS_PRO: Protocol.INTUOS_PRO, - } - - return pvmap[protocol_version] + return protocol_version class WacomProtocolBase(WacomProtocolLowLevelComm): @@ -591,7 +575,7 @@ class WacomProtocolBase(WacomProtocolLowLevelComm): :param device: the BlueZDevice object that is this wacom device :param uuid: the UUID {to be} assigned to the device ''' - protocol = Protocol.UNKNOWN + protocol = ProtocolVersion.ANY __gsignals__ = { # Signal sent for each single drawing that becomes available. The @@ -956,7 +940,7 @@ class WacomProtocolSpark(WacomProtocolBase): y_max = 14300 pressure = 2047 - protocol = Protocol.SPARK + protocol = ProtocolVersion.SPARK packet_handlers = [WacomPacketHandlerEndOfStroke, WacomPacketHandlerEndOfSequence] @@ -982,7 +966,7 @@ class WacomProtocolSlate(WacomProtocolSpark): y_max = 14300 pressure = 2047 - protocol = Protocol.SLATE + protocol = ProtocolVersion.SLATE packet_handlers = [WacomPacketHandlerStrokePrefixSlate] def __init__(self, device, uuid, protocol_version=ProtocolVersion.SLATE): @@ -1069,7 +1053,7 @@ class WacomProtocolIntuosPro(WacomProtocolSlate): y_max = 29600 pressure = 4095 - protocol = Protocol.INTUOS_PRO + protocol = ProtocolVersion.INTUOS_PRO packet_handlers = [WacomPacketHandlerStrokePrefixIntuosPro, WacomPacketHandlerStrokeTimestampIntuosPro, WacomPacketHandlerUnknownFixedStrokeDataIntuosPro] @@ -1161,24 +1145,21 @@ class WacomDevice(GObject.Object): else: self._uuid = self._config['uuid'] - # retrieve the protocol from the config file - protocol = Protocol.UNKNOWN try: - protocol = next(p for p in Protocol if p.value == self._config['Protocol']) - except StopIteration: + protocol = ProtocolVersion.from_string(self._config['Protocol']) + except KeyError: + raise WacomCorruptDataException(f'Missing Protocol entry from config file. Please delete config file and re-register device') + except ValueError: logger.error(f'Unknown protocol in configuration: {self._config["Protocol"]}') raise WacomCorruptDataException(f'Unknown Protocol {self._config["Protocol"]}') - if protocol == Protocol.UNKNOWN: - raise WacomCorruptDataException(f'Missing Protocol entry from config file. Please delete config file and re-register device') - self._init_protocol(protocol) def _init_protocol(self, protocol): protocols = { - Protocol.SPARK: WacomProtocolSpark, - Protocol.SLATE: WacomProtocolSlate, - Protocol.INTUOS_PRO: WacomProtocolIntuosPro, + ProtocolVersion.SPARK: WacomProtocolSpark, + ProtocolVersion.SLATE: WacomProtocolSlate, + ProtocolVersion.INTUOS_PRO: WacomProtocolIntuosPro, } if protocol not in protocols: @@ -1186,7 +1167,7 @@ class WacomDevice(GObject.Object): pclass = protocols[protocol] self._wacom_protocol = pclass(self._device, self._uuid) - logger.debug(f'{self._device.name} is using protocol {protocol}') + logger.debug(f'{self._device.name} is using protocol {protocol.name}') self._wacom_protocol.connect( 'drawing',