diff options
Diffstat (limited to 'glucometerutils/drivers/otultra2.py')
-rw-r--r-- | glucometerutils/drivers/otultra2.py | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/glucometerutils/drivers/otultra2.py b/glucometerutils/drivers/otultra2.py index f453dc9..ebfda8f 100644 --- a/glucometerutils/drivers/otultra2.py +++ b/glucometerutils/drivers/otultra2.py @@ -13,19 +13,7 @@ import serial from glucometerutils import common from glucometerutils import exceptions - - -class MissingChecksum(exceptions.InvalidResponse): - """The response misses the expected 4-digits checksum.""" - def __init__(self, response): - self.response = response - - def __str__(self): - return 'Response is missing the OT2 checksum: %s' % self.response - - -class InvalidSerialNumber(exceptions.Error): - """The serial number is not ending with Y as expected.""" +from glucometerutils.drivers import lifescan_common class Device(object): @@ -62,11 +50,22 @@ class Device(object): match = self._RESPONSE_MATCH.match(line) if not match: - raise MissingChecksum(line) + raise lifescan_common.MissingChecksum(line) + + response, checksum_string = match.groups() + + try: + checksum_given = int(checksum_string, 16) + checksum_calculated = lifescan_common.calculate_checksum( + bytes(response, 'ascii')) - response, checksum = match.groups() + if checksum_given != checksum_calculated: + raise lifescan_common.InvalidChecksum(checksum_given, + checksum_calculated) + except ValueError: + raise lifescan_common.InvalidChecksum(checksum_given, + None) - # TODO(flameeyes) check that the checksum is actually valid return response def _send_oneliner_command(self, cmd): @@ -122,7 +121,7 @@ class Device(object): # 'Y' at the far right of the serial number is the indication of a OneTouch # Ultra2 device, as per specs. if serial_number[-1] != 'Y': - raise InvalidSerialNumber('Serial number %s is invalid.' % serial_number) + raise lifescan_common.InvalidSerialNumber(serial_number) return serial_number |