4 #include <linux/types.h>
5 #include <linux/hiddev.h>
14 #define CONTOUR_USB_VENDOR_ID 0x1a79
15 #define CONTOUR_USB_PRODUCT_ID 0x6002
19 unsigned char data[64];
27 int send_msg(const struct msg *msg, int fd, int usage_code)
31 if (msg->direction != OUT) {
32 trace(0, "Message direction is not OUT\n");
37 trace(1, "Sending: ");
39 print_hex(msg->data + 1, datalen(msg->data) - 1);
41 print_ascii(msg->data + 1, datalen(msg->data) - 1);
43 ret = hiddev_write(msg->data, fd, usage_code);
50 int read_and_verify(struct msg *msg, int fd)
52 unsigned char buf[64];
56 ret = hiddev_read(buf + offset, sizeof(buf) - offset, fd);
64 memcpy(msg->data, buf, sizeof(buf));
65 trace(2, "Got data %d: ", datalen(buf));
67 print_hex(buf, datalen(buf));
69 print_ascii(buf, datalen(buf));
78 read_and_verify(&msg, fd);
79 if (datalen(msg.data) <= 36)
86 #define SET_FIRST_BYTE(byte) \
88 memset(&msg.data, 0, sizeof(msg.data)); \
89 msg.data[4] = (byte); \
93 #define SET_BYTE(idx, byte) \
95 msg.data[(idx) + 4] = (byte); \
99 #define SET_BYTES(byte) msg.data[j++] = (byte)
101 int send_pattern(int fd, int uc, unsigned char byte1, unsigned char byte2)
108 SET_FIRST_BYTE(0x01);
110 send_msg(&msg, fd, uc);
115 send_msg(&msg, fd, uc);
120 send_msg(&msg, fd, uc);
123 SET_FIRST_BYTE(0x02);
126 send_msg(&msg, fd, uc);
131 send_msg(&msg, fd, uc);
137 int communicate(int fd, int uc)
144 SET_FIRST_BYTE(0x01);
146 send_msg(&msg, fd, uc);
150 send_msg(&msg, fd, uc);
154 for (i = 0; i < 6; i++) {
156 send_msg(&msg, fd, uc);
161 send_msg(&msg, fd, uc);
166 send_msg(&msg, fd, uc);
169 send_pattern(fd, uc, 'R', 'A');
170 send_pattern(fd, uc, 'R', 'C');
171 send_pattern(fd, uc, 'R', 'D');
172 send_pattern(fd, uc, 'R', 'G');
173 send_pattern(fd, uc, 'R', 'I');
174 send_pattern(fd, uc, 'R', 'M');
175 send_pattern(fd, uc, 'R', 'P');
176 send_pattern(fd, uc, 'R', 'R');
177 send_pattern(fd, uc, 'R', 'S');
178 send_pattern(fd, uc, 'R', 'T');
179 send_pattern(fd, uc, 'R', 'U');
180 send_pattern(fd, uc, 'R', 'V');
181 send_pattern(fd, uc, 'R', 'W');
182 send_pattern(fd, uc, 'R', 'X');
183 send_pattern(fd, uc, 'W', 'K');
186 SET_FIRST_BYTE(0x08);
195 send_msg(&msg, fd, uc);
199 SET_FIRST_BYTE(0x02);
202 send_msg(&msg, fd, uc);
207 send_msg(&msg, fd, uc);
212 send_msg(&msg, fd, uc);
217 send_msg(&msg, fd, uc);
222 send_msg(&msg, fd, uc);
225 send_pattern(fd, uc, 'R', 'Z');
228 SET_FIRST_BYTE(0x01);
230 send_msg(&msg, fd, uc);
235 send_msg(&msg, fd, uc);
240 send_msg(&msg, fd, uc);
245 send_msg(&msg, fd, uc);
249 send_msg(&msg, fd, uc);
254 send_msg(&msg, fd, uc);
258 send_msg(&msg, fd, uc);
262 send_msg(&msg, fd, uc);
265 trace(0, "Glucose readings:\n");
268 send_msg(&msg, fd, uc);
269 read_and_verify(&in, fd);
270 print_ascii(in.data, datalen(in.data));
271 } while (datalen(in.data) > 45);
276 int main(int argc, char *argv[])
279 struct user_options opts;
281 read_args(argc, argv, &opts);
282 trace_level = opts.trace_level;
284 if (opts.usbdev == NULL)
285 fd = hiddev_open_by_id(CONTOUR_USB_PRODUCT_ID,
286 CONTOUR_USB_VENDOR_ID, &usage_code);
288 fd = hiddev_open(opts.usbdev, &usage_code);
292 communicate(fd, usage_code);