diff options
author | Will Nowak <compbrain@gmail.com> | 2013-02-01 15:05:03 -0800 |
---|---|---|
committer | Will Nowak <compbrain@gmail.com> | 2013-02-01 15:05:03 -0800 |
commit | 59141c8d1f3aeddc7df5b99576c73d48a9e16be6 (patch) | |
tree | 644a37bd707824d03d0e703ebaf940218a521aee | |
parent | a6d1dce8de652eaaefe16aeb32f04f84e3d3d777 (diff) |
Add an initial attempt at extracting data from the G4
-rw-r--r-- | readdata.py | 145 |
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 | |||
3 | Copyright 2013 | ||
4 | |||
5 | Licensed under the Apache License, Version 2.0 (the "License"); | ||
6 | you may not use this file except in compliance with the License. | ||
7 | You may obtain a copy of the License at | ||
8 | |||
9 | http://www.apache.org/licenses/LICENSE-2.0 | ||
10 | |||
11 | Unless required by applicable law or agreed to in writing, software | ||
12 | distributed under the License is distributed on an "AS IS" BASIS, | ||
13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
14 | See the License for the specific language governing permissions and | ||
15 | limitations under the License. | ||
16 | """ | ||
17 | |||
18 | from curses import ascii as asciicc | ||
19 | import re | ||
20 | import serial | ||
21 | import sys | ||
22 | import time | ||
23 | import xml.etree.ElementTree as ET | ||
24 | |||
25 | |||
26 | class 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 | |||
137 | d = Dexcom(sys.argv[1]) | ||
138 | |||
139 | if d.Handshake(): | ||
140 | print "Connected successfully!" | ||
141 | |||
142 | print d.IdentifyDevice() | ||
143 | print d.GetManufacturingParameters() | ||
144 | print d.GetFirmwareHeader() | ||
145 | print d.GetPcParams() | ||