From 1c7351722dab02b01b4d76565f5b16bdcbd61404 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Wed, 4 Jan 2017 12:25:49 -0500 Subject: dexcom_dumper: new subcommand: --poll --- dexcom_reader/dexcom_dumper.py | 60 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 7 deletions(-) (limited to 'dexcom_reader') diff --git a/dexcom_reader/dexcom_dumper.py b/dexcom_reader/dexcom_dumper.py index f0bac36..4a14762 100644 --- a/dexcom_reader/dexcom_dumper.py +++ b/dexcom_reader/dexcom_dumper.py @@ -1,5 +1,8 @@ import constants import readdata +from sys import stdout +from datetime import timedelta +from time import sleep from optparse import OptionParser @@ -9,11 +12,16 @@ DEFAULT_PAGE_COUNT = 2 parser = OptionParser() parser.add_option("--g4", action="store_false", dest="g5", default=G5_IS_DEFAULT, help="use Dexcom G4 instead of Dexcom G5") parser.add_option("--g5", action="store_true", dest="g5", default=G5_IS_DEFAULT, help="use Dexcom G5 instead of Dexcom G4") -parser.add_option("-a", "--all", action="store_true", dest="dump_everything", default=False, help="dump all available records") + +parser.add_option("-a", "--all", action="store_const", dest="command", const="dump_everything", help="dump all available records") +parser.add_option("-p", "--poll", action="store_const", dest="command", const="poll", help="poll for latest CGM record") + parser.add_option("-n", type="int", dest="num_records", default=DEFAULT_PAGE_COUNT, help="number of pages of CGM records to display") (options, args) = parser.parse_args() +command = options.command or "dump_cgm" + def get_dexcom_reader(): if options.g5: dd = readdata.DexcomG5.FindDevice() @@ -24,13 +32,13 @@ def get_dexcom_reader(): dr = get_dexcom_reader() -if options.dump_everything: +def dump_everything(): # record_types = ['METER_DATA', 'INSERTION_TIME', 'USER_EVENT_DATA', 'CAL_SET', 'SENSOR_DATA'] unparseable = ['FIRMWARE_PARAMETER_DATA', 'RECEIVER_LOG_DATA', 'USER_SETTING_DATA', 'MAX_VALUE'] parsed_to_xml = ['MANUFACTURING_DATA', 'PC_SOFTWARE_PARAMETER'] - skip = unparseable + parsed_to_xml + ['EGV_DATA'] + skip = unparseable + parsed_to_xml record_types = filter(lambda v: not v in skip, constants.RECORD_TYPES) for t in record_types: @@ -38,7 +46,45 @@ if options.dump_everything: for r in dr.ReadRecords(t): print r -cgm_records = dr.ReadRecords('EGV_DATA', 0 if options.dump_everything else options.num_records) -for cr in cgm_records: - if not cr.display_only: - print cr +def dump_cgm(): + cgm_records = dr.ReadRecords('EGV_DATA', options.num_records) + for cr in cgm_records: + if not cr.display_only: + print cr + +def recent(t): + now = dr.ReadSystemTime() + return t.system_time > now - timedelta(minutes=5) + +def read_recent_egv_data(): + try: + r = dr.ReadRecords('EGV_DATA', options.num_records)[-1] + if recent(r) and not r.is_special and not r.display_only: + return r + else: + return None + except: + return None + +def format_times(now, stamp): + diff = (stamp - now).total_seconds() + operand = '-' if diff < 0 else '+' # should always be - + return '%s %s %d' % (now.strftime('%s'), operand, abs(diff)) + +def poll(): + while True: + r = read_recent_egv_data() + if r is None: + sleep(10) + else: + now = dr.ReadSystemTime() + print '%s: %s %s' % (format_times(now, r.system_time), r.glucose, r.trend_arrow) + stdout.flush() + next_reading = (r.system_time - now + timedelta(minutes=5, seconds=2)).total_seconds() + if (next_reading > 0): + sleep(next_reading) + +{"dump_everything": dump_everything, + "dump_cgm": dump_cgm, + "poll": poll +}[command]() -- cgit v1.2.3