From 260a3935d0124097c6d54addd7ccd103dc890623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Elio=20Petten=C3=B2?= Date: Mon, 16 Jan 2017 22:13:59 +0000 Subject: Add new driver for the Abbott FreeStyle Precision Neo. This driver uses the HID-based protocol which is shared among different devices. --- glucometerutils/drivers/fsprecisionneo.py | 65 +++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 glucometerutils/drivers/fsprecisionneo.py (limited to 'glucometerutils/drivers') diff --git a/glucometerutils/drivers/fsprecisionneo.py b/glucometerutils/drivers/fsprecisionneo.py new file mode 100644 index 0000000..9e9cea1 --- /dev/null +++ b/glucometerutils/drivers/fsprecisionneo.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +"""Driver for FreeStyle Precision Neo devices. +""" + +import collections +import datetime + +from glucometerutils import common +from glucometerutils.support import freestyle + + +# The type is a string because it precedes the parsing of the object. +_TYPE_GLUCOSE_READING = '7' + +_NeoReading = collections.namedtuple('_NeoReading', ( + 'type', # 7 = blood glucose + 'id', + 'month', 'day', 'year', # year is two-digits + 'hour', 'minute', + 'unknown2', + 'value', + 'unknown3', 'unknown4', 'unknown5', 'unknown6', 'unknown7', + 'unknown8', 'unknown9', 'unknown10', 'unknown11', 'unknown12', +)) + + +class Device(freestyle.FreeStyleHidDevice): + """Glucometer driver for FreeStyle Precision Neo devices.""" + + def get_meter_info(self): + """Return the device information in structured form.""" + return common.MeterInfo( + 'FreeStyle Precision Neo', + serial_number=self.get_serial_number(), + version_info=( + 'Software version: ' + self._get_version(),), + native_unit=self.get_glucose_unit()) + + def _get_version(self): + """Return the software version of the device.""" + return self._send_text_command(b'$swver?').rstrip('\r\n') + + def get_serial_number(self): + """Returns the serial number of the device.""" + return self._send_text_command(b'$serlnum?').rstrip('\r\n') + + def get_glucose_unit(self): + """Returns the glucose unit of the device.""" + return common.UNIT_MGDL + + def get_readings(self): + """Iterate through the reading records in the device.""" + for record in self._get_multirecord(b'$record?'): + if not record or record[0] != _TYPE_GLUCOSE_READING: + continue + + # Build a _NeoReading object by parsing each of the entries in the + # CSV as integers. + raw_reading = _NeoReading._make([int(v) for v in record]) + + timestamp = datetime.datetime( + raw_reading.year + 2000, raw_reading.month, raw_reading.day, + raw_reading.hour, raw_reading.minute) + + yield common.Reading(timestamp, raw_reading.value) -- cgit v1.2.3