Skip to content

Commit ea9d852

Browse files
committed
attempt unifying G5 support, legacy cals
Try throwing in compatibility layer, if a bit hacky, for everything.
1 parent 30bd94c commit ea9d852

File tree

2 files changed

+44
-8
lines changed

2 files changed

+44
-8
lines changed

dexcom_reader/database_records.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def xmldata(self):
9191

9292
class InsertionRecord(GenericTimestampedRecord):
9393
FIELDS = ['insertion_time', 'session_state']
94-
FORMAT = '<3Ic10BH'
94+
FORMAT = '<3IcH'
9595

9696
@property
9797
def insertion_time(self):
@@ -111,6 +111,8 @@ def session_state(self):
111111
def __repr__(self):
112112
return '%s: state=%s' % (self.display_time, self.session_state)
113113

114+
class G5InsertionRecord (InsertionRecord):
115+
FORMAT = '<3Ic10BH'
114116

115117
class Calibration(GenericTimestampedRecord):
116118
FORMAT = '<2Iddd3cdb'
@@ -184,6 +186,12 @@ def to_dict (self):
184186
def crc(self):
185187
return struct.unpack('H', self.raw_data[-2:])[0]
186188

189+
class LegacyCalibration (Calibration):
190+
@classmethod
191+
def _ClassSize(cls):
192+
193+
return cls.LEGACY_SIZE
194+
187195

188196
class SubCal (GenericTimestampedRecord):
189197
FORMAT = '<IIIIc'
@@ -207,7 +215,7 @@ def applied (self):
207215
return util.ReceiverTimeToTime(self.data[3])
208216

209217
class MeterRecord(GenericTimestampedRecord):
210-
FORMAT = '<2IHI5BH'
218+
FORMAT = '<2IHIH'
211219
FIELDS = ['meter_glucose', 'meter_time' ]
212220

213221
@property
@@ -221,6 +229,8 @@ def meter_time(self):
221229
def __repr__(self):
222230
return '%s: Meter BG:%s' % (self.display_time, self.meter_glucose)
223231

232+
class G5MeterRecord (MeterRecord):
233+
FORMAT = '<2IHI5BH'
224234

225235
class EventRecord(GenericTimestampedRecord):
226236
# sys_time,display_time,glucose,meter_time,crc
@@ -280,15 +290,15 @@ class EGVRecord(GenericTimestampedRecord):
280290
# uint, uint, ushort, byte, ushort
281291
# (system_seconds, display_seconds, glucose, trend_arrow, crc)
282292
FIELDS = ['glucose', 'trend_arrow']
283-
FORMAT = '<2IHBBBBBBBBBcBH'
293+
FORMAT = '<2IHcH'
284294

285295
@property
286296
def full_glucose(self):
287297
return self.data[2]
288298

289299
@property
290300
def full_trend(self):
291-
return self.data[12]
301+
return self.data[3]
292302

293303
@property
294304
def display_only(self):
@@ -318,3 +328,11 @@ def __repr__(self):
318328
else:
319329
return '%s: CGM BG:%s (%s) DO:%s' % (self.display_time, self.glucose,
320330
self.trend_arrow, self.display_only)
331+
332+
class G5EGVRecord (EGVRecord):
333+
FORMAT = '<2IHBBBBBBBBBcBH'
334+
@property
335+
def full_trend(self):
336+
return self.data[12]
337+
338+

dexcom_reader/readdata.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -266,17 +266,21 @@ def GenericRecordYielder(self, header, data, record_type):
266266
for x in xrange(header[1]):
267267
yield record_type.Create(data, x)
268268

269-
def ParsePage(self, header, data):
270-
record_type = constants.RECORD_TYPES[ord(header[2])]
271-
revision = int(header[3])
272-
generic_parser_map = {
269+
PARSER_MAP = {
273270
'USER_EVENT_DATA': database_records.EventRecord,
274271
'METER_DATA': database_records.MeterRecord,
275272
'CAL_SET': database_records.Calibration,
273+
# 'CAL_SET': database_records.Calibration,
276274
'INSERTION_TIME': database_records.InsertionRecord,
277275
'EGV_DATA': database_records.EGVRecord,
278276
'SENSOR_DATA': database_records.SensorRecord,
279277
}
278+
def ParsePage(self, header, data):
279+
record_type = constants.RECORD_TYPES[ord(header[2])]
280+
revision = int(header[3])
281+
generic_parser_map = self.PARSER_MAP
282+
if revision < 2 and record_type == 'CAL_SET':
283+
generic_parser_map.update(CAL_SET=database_records.LegacyCalibration)
280284
xml_parsed = ['PC_SOFTWARE_PARAMETER', 'MANUFACTURING_DATA']
281285
if record_type in generic_parser_map:
282286
return self.GenericRecordYielder(header, data,
@@ -310,6 +314,20 @@ def ReadRecords(self, record_type):
310314
records.extend(self.ReadDatabasePage(record_type, x))
311315
return records
312316

317+
class DexcomG5 (Dexcom):
318+
PARSER_MAP = {
319+
'USER_EVENT_DATA': database_records.EventRecord,
320+
'METER_DATA': database_records.G5MeterRecord,
321+
'CAL_SET': database_records.Calibration,
322+
'INSERTION_TIME': database_records.G5InsertionRecord,
323+
'EGV_DATA': database_records.G5EGVRecord,
324+
'SENSOR_DATA': database_records.SensorRecord,
325+
}
326+
327+
def GetDevice (port, G5=False):
328+
if G5:
329+
return DexcomG5(port)
330+
return Dexcom(port)
313331

314332
if __name__ == '__main__':
315333
Dexcom.LocateAndDownload()

0 commit comments

Comments
 (0)