4 #include <linux/types.h>
5 #include <linux/hiddev.h>
14 #define CONTOUR_USB_VENDOR_ID 0x1a79
15 #define CONTOUR_USB_PRODUCT_ID 0x6002
21 unsigned char data[64];
29 int send_msg(const struct msg *msg, int fd, int usage_code)
34 if (msg->direction != OUT) {
35 trace(0, "Message direction is not OUT\n");
38 if (trace_level < 1 && msg_count <= MAX_MSGS) {
39 trace(0, "\r%d%%", msg_count * 100 / MAX_MSGS);
44 trace(1, "Sending: ");
46 print_hex(msg->data + 1, datalen(msg->data) - 1);
48 print_ascii(msg->data + 1, datalen(msg->data) - 1);
50 ret = hiddev_write(msg->data, fd, usage_code);
58 int read_and_verify(struct msg *msg, int fd)
60 unsigned char buf[64];
64 ret = hiddev_read(buf + offset, sizeof(buf) - offset, fd);
72 memcpy(msg->data, buf, sizeof(buf));
73 trace(2, "Got data %d: ", datalen(buf));
75 print_hex(buf, datalen(buf));
77 print_ascii(buf, datalen(buf));
86 read_and_verify(&msg, fd);
87 if (datalen(msg.data) <= 36)
94 #define SET_FIRST_BYTE(byte) \
96 memset(&msg.data, 0, sizeof(msg.data)); \
97 msg.data[4] = (byte); \
101 #define SET_BYTE(idx, byte) \
103 msg.data[(idx) + 4] = (byte); \
107 #define SET_BYTES(byte) msg.data[j++] = (byte)
109 int send_pattern(int fd, int uc, unsigned char byte1, unsigned char byte2)
116 SET_FIRST_BYTE(0x01);
118 send_msg(&msg, fd, uc);
123 send_msg(&msg, fd, uc);
128 send_msg(&msg, fd, uc);
131 SET_FIRST_BYTE(0x02);
134 send_msg(&msg, fd, uc);
139 send_msg(&msg, fd, uc);
145 int communicate(int fd, int uc)
150 trace(0, "Initializing..\n");
153 SET_FIRST_BYTE(0x01);
155 send_msg(&msg, fd, uc);
159 send_msg(&msg, fd, uc);
163 for (i = 0; i < 6; i++) {
165 send_msg(&msg, fd, uc);
170 send_msg(&msg, fd, uc);
175 send_msg(&msg, fd, uc);
178 send_pattern(fd, uc, 'R', 'A');
179 send_pattern(fd, uc, 'R', 'C');
180 send_pattern(fd, uc, 'R', 'D');
181 send_pattern(fd, uc, 'R', 'G');
182 send_pattern(fd, uc, 'R', 'I');
183 send_pattern(fd, uc, 'R', 'M');
184 send_pattern(fd, uc, 'R', 'P');
185 send_pattern(fd, uc, 'R', 'R');
186 send_pattern(fd, uc, 'R', 'S');
187 send_pattern(fd, uc, 'R', 'T');
188 send_pattern(fd, uc, 'R', 'U');
189 send_pattern(fd, uc, 'R', 'V');
190 send_pattern(fd, uc, 'R', 'W');
191 send_pattern(fd, uc, 'R', 'X');
192 send_pattern(fd, uc, 'W', 'K');
195 SET_FIRST_BYTE(0x08);
204 send_msg(&msg, fd, uc);
208 SET_FIRST_BYTE(0x02);
211 send_msg(&msg, fd, uc);
216 send_msg(&msg, fd, uc);
221 send_msg(&msg, fd, uc);
226 send_msg(&msg, fd, uc);
231 send_msg(&msg, fd, uc);
234 send_pattern(fd, uc, 'R', 'Z');
237 SET_FIRST_BYTE(0x01);
239 send_msg(&msg, fd, uc);
244 send_msg(&msg, fd, uc);
249 send_msg(&msg, fd, uc);
254 send_msg(&msg, fd, uc);
258 send_msg(&msg, fd, uc);
263 send_msg(&msg, fd, uc);
267 send_msg(&msg, fd, uc);
271 send_msg(&msg, fd, uc);
274 trace(0, "\nGlucose readings:\n");
277 send_msg(&msg, fd, uc);
278 read_and_verify(&in, fd);
279 print_ascii(in.data, datalen(in.data));
280 } while (datalen(in.data) > 45);
285 int wait_for_device(int vendor, int product, int *usage_code)
289 fd = hiddev_open_by_id(vendor, product, usage_code);
295 "No suitable device found. Please plug in your glucose meter\n");
298 fd = hiddev_open_by_id(vendor, product, usage_code);
306 int main(int argc, char *argv[])
309 struct user_options opts;
311 read_args(argc, argv, &opts);
312 trace_level = opts.trace_level;
314 if (opts.usbdev == NULL)
315 fd = wait_for_device(CONTOUR_USB_VENDOR_ID,
316 CONTOUR_USB_PRODUCT_ID, &usage_code);
318 fd = hiddev_open(opts.usbdev, &usage_code);
322 communicate(fd, usage_code);