summaryrefslogtreecommitdiffstats
path: root/glucometerutils/drivers
diff options
context:
space:
mode:
authorDiego Elio Pettenò <flameeyes@flameeyes.eu>2017-01-16 23:13:59 +0100
committerDiego Elio Pettenò <flameeyes@flameeyes.eu>2017-01-16 23:13:59 +0100
commit260a3935d0124097c6d54addd7ccd103dc890623 (patch)
treeb509b8de9642dda8ec7cbd2728f5d4252a00c767 /glucometerutils/drivers
parentRename freestyle_optium to fsoptium. (diff)
downloadglucometerutils-260a3935d0124097c6d54addd7ccd103dc890623.tar
glucometerutils-260a3935d0124097c6d54addd7ccd103dc890623.tar.gz
glucometerutils-260a3935d0124097c6d54addd7ccd103dc890623.tar.bz2
glucometerutils-260a3935d0124097c6d54addd7ccd103dc890623.tar.lz
glucometerutils-260a3935d0124097c6d54addd7ccd103dc890623.tar.xz
glucometerutils-260a3935d0124097c6d54addd7ccd103dc890623.tar.zst
glucometerutils-260a3935d0124097c6d54addd7ccd103dc890623.zip
Diffstat (limited to 'glucometerutils/drivers')
-rw-r--r--glucometerutils/drivers/fsprecisionneo.py65
1 files changed, 65 insertions, 0 deletions
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)