summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Nowak <compbrain@gmail.com>2013-02-01 15:05:03 -0800
committerWill Nowak <compbrain@gmail.com>2013-02-01 15:05:03 -0800
commit59141c8d1f3aeddc7df5b99576c73d48a9e16be6 (patch)
tree644a37bd707824d03d0e703ebaf940218a521aee
parenta6d1dce8de652eaaefe16aeb32f04f84e3d3d777 (diff)
Add an initial attempt at extracting data from the G4
-rw-r--r--readdata.py145
1 files changed, 145 insertions, 0 deletions
diff --git a/readdata.py b/readdata.py
new file mode 100644
index 0000000..7fe86c2
--- /dev/null
+++ b/readdata.py
@@ -0,0 +1,145 @@
1"""Dexcom G4 Platinum data reader.
2
3Copyright 2013
4
5Licensed under the Apache License, Version 2.0 (the "License");
6you may not use this file except in compliance with the License.
7You may obtain a copy of the License at
8
9 http://www.apache.org/licenses/LICENSE-2.0
10
11Unless required by applicable law or agreed to in writing, software
12distributed under the License is distributed on an "AS IS" BASIS,
13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14See the License for the specific language governing permissions and
15limitations under the License.
16"""
17
18from curses import ascii as asciicc
19import re
20import serial
21import sys
22import time
23import xml.etree.ElementTree as ET
24
25
26class Dexcom(object):
27 BASE_PREFIX = "\x01\x06\x00"
28
29 def __init__(self, port):
30 self._port_name = port
31 self._port = None
32
33 def Connect(self):
34 if self._port is None:
35 self._port = serial.Serial(port=self._port_name, baudrate=115200)
36
37 def Disconnect(self):
38 if self._port is not None:
39 self._port.close()
40
41 @property
42 def port(self):
43 if self._port is None:
44 self.Connect()
45 return self._port
46
47 def Waiting(self, timeout=None):
48 start_time = time.time()
49 while True:
50 if (timeout is not None) and (time.time() - start_time) > timeout:
51 return 0
52 n = self.port.inWaiting()
53 if n:
54 return n
55 time.sleep(0.1)
56
57 def write(self, *args, **kwargs):
58 return self.port.write(*args, **kwargs)
59
60 def read(self, *args, **kwargs):
61 return self.port.read(*args, **kwargs)
62
63 def readwaiting(self):
64 waiting = self.Waiting()
65 return self.read(waiting)
66
67 def Handshake(self):
68 self.write("%s\x0a\x5e\x65" % self.BASE_PREFIX)
69 if self.readwaiting() == "%s\x01\x35\xd4" % self.BASE_PREFIX:
70 return True
71
72 def IdentifyDevice(self):
73 iprefix = "\x01\x03\x01\x01"
74 self.write("%s\x0b\x7f\x75" % self.BASE_PREFIX)
75 i = self.readwaiting()
76 # Strip prefix
77 i = i[len(iprefix):]
78 # Strip tail
79 ta = i[-2:]
80 assert ta == "\xd8\xd4"
81 i = i[:-2]
82 e = ET.fromstring(i)
83 print 'Found %s' % e.get('ProductName')
84 return e
85
86 def flush(self):
87 self.port.flush()
88
89 def clear(self):
90 self.port.flushInput()
91 self.port.flushOutput()
92
93 def CleanData(self, i):
94 i = ''.join(c for c in i if ord(c) >= 32)
95 return i
96
97 def GetManufacturingParameters(self):
98 #self.port.write("\x01\x07\x00\x10\x00\x0f\xf8")
99 #self.readwaiting()
100 #self.clear()
101 self.write("\x01\x0c\x00\x11\x00\x00\x00\x00\x00\x01\x6e\x45")
102
103 i = self.CleanData(self.readwaiting())
104 i = i[8:-4]
105 e = ET.fromstring(i)
106 print 'Found %s (S/N: %s)' % (e.get('HardwarePartNumber'),
107 e.get('SerialNumber'))
108 return e
109
110 def GetFirmwareHeader(self):
111 self.write("\x01\x06\x00\x0b\x7f\x75")
112 i = self.CleanData(self.readwaiting())[:-2]
113 e = ET.fromstring(i)
114 return e
115
116 def Ping(self):
117 self.write("\x01\x07\x00\x10\x02\x4d\xd8")
118 self.readwaiting()
119 self.write("\x01\x07\x00\x10\x02\x4d\xd8")
120 self.readwaiting()
121 self.flush()
122 self.clear()
123
124 def GetPcParams(self):
125 self.write("\x01\x0c\x00\x11\x02\x00\x00\x00\x00\x01\x2e\xce")
126 i =self.CleanData(self.readwaiting())[8:-3]
127 e = ET.fromstring(i)
128 return e
129
130 def DataPartitions(self):
131 self.write("\x01\x06\x00\x36\x81\x92")
132 print self.readwaiting()
133 self.write("\x01\x06\x00\x0f\xfb\x35")
134 print self.readwaiting()
135 print self.readwaiting()
136
137d = Dexcom(sys.argv[1])
138
139if d.Handshake():
140 print "Connected successfully!"
141
142print d.IdentifyDevice()
143print d.GetManufacturingParameters()
144print d.GetFirmwareHeader()
145print d.GetPcParams()