From ff9e632209317d1c16ceb3d78f77c244504be474 Mon Sep 17 00:00:00 2001 From: Ben West Date: Thu, 31 Mar 2016 15:32:41 -0700 Subject: stub out next release: 0.0.9-dev area --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3bad349..effb534 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ def readme(): return f.read() setup(name='dexcom_reader', - version='0.0.8', # http://semver.org/ + version='0.0.9-dev', # http://semver.org/ description='Audit, and inspect data from Dexcom G4.', long_description=readme(), author="Will Nowak", -- cgit v1.2.3 From cf10d70fe0c724286d6e84c869d63eefd077e331 Mon Sep 17 00:00:00 2001 From: Ben West Date: Sat, 28 May 2016 11:22:52 -0700 Subject: support fetching cal_set Many thanks to @LorelaiL for putting up with some my remedial questions. --- dexcom_reader/database_records.py | 90 ++++++++++++++++++++++++++++++++++++++- dexcom_reader/readdata.py | 4 +- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/dexcom_reader/database_records.py b/dexcom_reader/database_records.py index 8d471f4..6d5b37b 100644 --- a/dexcom_reader/database_records.py +++ b/dexcom_reader/database_records.py @@ -111,13 +111,99 @@ class InsertionRecord(GenericTimestampedRecord): class Calibration(GenericTimestampedRecord): + FORMAT = '<2Iddd3cdb' + # CAL_FORMAT = '<2Iddd3cdb' + FIELDS = [ 'slope', 'intercept', 'scale', 'decay', 'numsub', 'raw' ] @property - def raw(self): - return binascii.hexlify(bytearray(self.data)) + def raw (self): + return binascii.hexlify(self.raw_data) + @property + def slope (self): + return self.data[2] + @property + def intercept (self): + return self.data[3] + @property + def scale (self): + return self.data[4] + @property + def decay (self): + return self.data[8] + @property + def numsub (self): + return int(self.data[9]) def __repr__(self): return '%s: CAL SET:%s' % (self.display_time, self.raw) + LEGACY_SIZE = 148 + REV_2_SIZE = 249 + @classmethod + def _ClassSize(cls): + + return cls.REV_2_SIZE + + @classmethod + def Create(cls, data, record_counter): + offset = record_counter * cls._ClassSize() + cal_size = struct.calcsize(cls.FORMAT) + raw_data = data[offset:offset + cls._ClassSize()] + + cal_data = data[offset:offset + cal_size] + unpacked_data = cls._ClassFormat().unpack(cal_data) + return cls(unpacked_data, raw_data) + + def __init__ (self, data, raw_data): + self.page_data = raw_data + self.raw_data = raw_data + self.data = data + subsize = struct.calcsize(SubCal.FORMAT) + offset = self.numsub * subsize + calsize = struct.calcsize(self.FORMAT) + caldata = raw_data[:calsize] + subdata = raw_data[calsize:calsize + offset] + crcdata = raw_data[calsize+offset:calsize+offset+2] + + subcals = [ ] + for i in xrange(self.numsub): + offset = i * subsize + raw_sub = subdata[offset:offset+subsize] + sub = SubCal(raw_sub, self.data[1]) + subcals.append(sub) + + self.subcals = subcals + + self.check_crc() + def to_dict (self): + res = super(Calibration, self).to_dict( ) + res['subrecords'] = [ sub.to_dict( ) for sub in self.subcals ] + return res + @property + def crc(self): + return struct.unpack('H', self.raw_data[-2:])[0] + + +class SubCal (GenericTimestampedRecord): + FORMAT = ' Date: Sat, 3 Oct 2015 00:54:11 -0700 Subject: Adding support for G5 EGVRecord sizes --- dexcom_reader/database_records.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dexcom_reader/database_records.py b/dexcom_reader/database_records.py index 6d5b37b..3788cd5 100644 --- a/dexcom_reader/database_records.py +++ b/dexcom_reader/database_records.py @@ -278,7 +278,7 @@ class EGVRecord(GenericTimestampedRecord): # uint, uint, ushort, byte, ushort # (system_seconds, display_seconds, glucose, trend_arrow, crc) FIELDS = ['glucose', 'trend_arrow'] - FORMAT = '<2IHcH' + FORMAT = '<2IHBBBBBBBBBcBH' @property def full_glucose(self): @@ -286,7 +286,7 @@ class EGVRecord(GenericTimestampedRecord): @property def full_trend(self): - return self.data[3] + return self.data[12] @property def display_only(self): -- cgit v1.2.3 From d6941e6283ee8d9e33ffefea6a76eb4d29348d5b Mon Sep 17 00:00:00 2001 From: Nathan Racklyeft Date: Sun, 18 Oct 2015 21:36:59 -0700 Subject: Adjusting size of Meter and Insertion record data --- dexcom_reader/database_records.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dexcom_reader/database_records.py b/dexcom_reader/database_records.py index 3788cd5..bd0178a 100644 --- a/dexcom_reader/database_records.py +++ b/dexcom_reader/database_records.py @@ -91,7 +91,7 @@ class GenericXMLRecord(GenericTimestampedRecord): class InsertionRecord(GenericTimestampedRecord): FIELDS = ['insertion_time', 'session_state'] - FORMAT = '<3IcH' + FORMAT = '<3Ic10BH' @property def insertion_time(self): @@ -205,7 +205,7 @@ class SubCal (GenericTimestampedRecord): return util.ReceiverTimeToTime(self.data[3]) class MeterRecord(GenericTimestampedRecord): - FORMAT = '<2IHIH' + FORMAT = '<2IHI5BH' FIELDS = ['meter_glucose', 'meter_time' ] @property -- cgit v1.2.3 From 30bd94ce14588b9bb73e6893d00f049b5502978a Mon Sep 17 00:00:00 2001 From: Nathan Racklyeft Date: Sun, 18 Oct 2015 21:44:16 -0700 Subject: Adding additional insertion record states --- dexcom_reader/database_records.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dexcom_reader/database_records.py b/dexcom_reader/database_records.py index bd0178a..3812573 100644 --- a/dexcom_reader/database_records.py +++ b/dexcom_reader/database_records.py @@ -103,7 +103,9 @@ class InsertionRecord(GenericTimestampedRecord): def session_state(self): states = [None, 'REMOVED', 'EXPIRED', 'RESIDUAL_DEVIATION', 'COUNTS_DEVIATION', 'SECOND_SESSION', 'OFF_TIME_LOSS', - 'STARTED', 'BAD_TRANSMITTER', 'MANUFACTURING_MODE'] + 'STARTED', 'BAD_TRANSMITTER', 'MANUFACTURING_MODE', + 'UNKNOWN1', 'UNKNOWN2', 'UNKNOWN3', 'UNKNOWN4', 'UNKNOWN5', + 'UNKNOWN6', 'UNKNOWN7', 'UNKNOWN8'] return states[ord(self.data[3])] def __repr__(self): -- cgit v1.2.3 From ea9d852533facf323f251196821c7346e743074c Mon Sep 17 00:00:00 2001 From: Ben West Date: Sat, 28 May 2016 12:30:03 -0700 Subject: attempt unifying G5 support, legacy cals Try throwing in compatibility layer, if a bit hacky, for everything. --- dexcom_reader/database_records.py | 26 ++++++++++++++++++++++---- dexcom_reader/readdata.py | 26 ++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/dexcom_reader/database_records.py b/dexcom_reader/database_records.py index 3812573..9274d24 100644 --- a/dexcom_reader/database_records.py +++ b/dexcom_reader/database_records.py @@ -91,7 +91,7 @@ class GenericXMLRecord(GenericTimestampedRecord): class InsertionRecord(GenericTimestampedRecord): FIELDS = ['insertion_time', 'session_state'] - FORMAT = '<3Ic10BH' + FORMAT = '<3IcH' @property def insertion_time(self): @@ -111,6 +111,8 @@ class InsertionRecord(GenericTimestampedRecord): def __repr__(self): return '%s: state=%s' % (self.display_time, self.session_state) +class G5InsertionRecord (InsertionRecord): + FORMAT = '<3Ic10BH' class Calibration(GenericTimestampedRecord): FORMAT = '<2Iddd3cdb' @@ -184,6 +186,12 @@ class Calibration(GenericTimestampedRecord): def crc(self): return struct.unpack('H', self.raw_data[-2:])[0] +class LegacyCalibration (Calibration): + @classmethod + def _ClassSize(cls): + + return cls.LEGACY_SIZE + class SubCal (GenericTimestampedRecord): FORMAT = ' Date: Sat, 28 May 2016 18:29:28 -0700 Subject: re-add udev rules? --- etc/udev/rules.d/80-dexcom.rules | 18 ++++++++++++++++++ setup.py | 4 ++++ 2 files changed, 22 insertions(+) create mode 100644 etc/udev/rules.d/80-dexcom.rules diff --git a/etc/udev/rules.d/80-dexcom.rules b/etc/udev/rules.d/80-dexcom.rules new file mode 100644 index 0000000..0c95f52 --- /dev/null +++ b/etc/udev/rules.d/80-dexcom.rules @@ -0,0 +1,18 @@ + + + +# udev can only match one entry at a time, but this triggers additional add entries. +# 22a3:0047 +# 22a3 0047 +ATTRS{idVendor}=="22a3", ATTRS{idProduct}=="0047", \ + ENV{ID_MM_DEVICE_IGNORE}="1", \ + MODE="0664", GROUP="plugdev" + + +# create a symlink to the ttyUSB device created automatically above +#ACTION=="add", \ +# SUBSYSTEM=="tty", \ +# ATTRS{idVendor}=="22a3", ATTRS{idProduct}=="0047", \ +# SYMLINK+="ttyUSB.Dexcom%n" + + diff --git a/setup.py b/setup.py index effb534..b9f55b3 100644 --- a/setup.py +++ b/setup.py @@ -34,6 +34,10 @@ setup(name='dexcom_reader', package_data={ 'dexcom_reader': ['etc/udev/rules.d/*'] }, + data_files = [ + ('/etc/udev/rules.d/80-dexcom.rules', ['etc/udev/80-dexcom.rules'] ), + + ], zip_safe=False, include_package_data=True ) -- cgit v1.2.3 From 0193c69e36cfb079a5cefd56518215c4cef103ec Mon Sep 17 00:00:00 2001 From: Ben West Date: Sat, 28 May 2016 19:22:36 -0700 Subject: bump version The previous commits introduce a new way to find a Dexcom device. Bumping minor version, resetting patch level. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b9f55b3..da90585 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ def readme(): return f.read() setup(name='dexcom_reader', - version='0.0.9-dev', # http://semver.org/ + version='0.1.0-dev', # http://semver.org/ description='Audit, and inspect data from Dexcom G4.', long_description=readme(), author="Will Nowak", -- cgit v1.2.3