3 #include <linux/types.h>
4 #include <linux/hiddev.h>
10 #include "contour-protocol.h"
15 static int send_msg(const struct msg *msg, int fd, int usage_code)
20 if (msg->direction != OUT) {
21 trace(0, "Message direction is not OUT\n");
24 if (trace_level < 1 && msg_count <= MAX_MSGS) {
25 trace(0, "\r%d%%", msg_count * 100 / MAX_MSGS);
30 trace(1, "Sending: ");
32 print_hex(msg->data + 1, datalen(msg->data) - 1);
34 print_ascii(msg->data + 1, datalen(msg->data) - 1);
36 ret = hiddev_write(msg->data, fd, usage_code);
44 static int read_and_verify(struct msg *msg, int fd)
46 unsigned char buf[64];
50 ret = hiddev_read(buf + offset, sizeof(buf) - offset, fd);
58 memcpy(msg->data, buf, sizeof(buf));
59 trace(2, "Got data %d: ", datalen(buf));
61 print_hex(buf, datalen(buf));
63 print_ascii(buf, datalen(buf));
68 static int read_msgs(int fd)
72 read_and_verify(&msg, fd);
73 if (datalen(msg.data) <= 36)
80 #define SET_FIRST_BYTE(byte) \
82 memset(&msg.data, 0, sizeof(msg.data)); \
83 msg.data[4] = (byte); \
87 #define SET_BYTE(idx, byte) \
89 msg.data[(idx) + 4] = (byte); \
93 #define SET_BYTES(byte) msg.data[j++] = (byte)
95 static int send_pattern(int fd, int uc, unsigned char byte1, unsigned char byte2)
102 SET_FIRST_BYTE(0x01);
104 send_msg(&msg, fd, uc);
109 send_msg(&msg, fd, uc);
114 send_msg(&msg, fd, uc);
117 SET_FIRST_BYTE(0x02);
120 send_msg(&msg, fd, uc);
125 send_msg(&msg, fd, uc);
131 int communicate(int fd, int uc)
136 trace(0, "Initializing..\n");
139 SET_FIRST_BYTE(0x01);
141 send_msg(&msg, fd, uc);
145 send_msg(&msg, fd, uc);
149 for (i = 0; i < 6; i++) {
151 send_msg(&msg, fd, uc);
156 send_msg(&msg, fd, uc);
161 send_msg(&msg, fd, uc);
164 send_pattern(fd, uc, 'R', 'A');
165 send_pattern(fd, uc, 'R', 'C');
166 send_pattern(fd, uc, 'R', 'D');
167 send_pattern(fd, uc, 'R', 'G');
168 send_pattern(fd, uc, 'R', 'I');
169 send_pattern(fd, uc, 'R', 'M');
170 send_pattern(fd, uc, 'R', 'P');
171 send_pattern(fd, uc, 'R', 'R');
172 send_pattern(fd, uc, 'R', 'S');
173 send_pattern(fd, uc, 'R', 'T');
174 send_pattern(fd, uc, 'R', 'U');
175 send_pattern(fd, uc, 'R', 'V');
176 send_pattern(fd, uc, 'R', 'W');
177 send_pattern(fd, uc, 'R', 'X');
178 send_pattern(fd, uc, 'W', 'K');
181 SET_FIRST_BYTE(0x08);
190 send_msg(&msg, fd, uc);
194 SET_FIRST_BYTE(0x02);
197 send_msg(&msg, fd, uc);
202 send_msg(&msg, fd, uc);
207 send_msg(&msg, fd, uc);
212 send_msg(&msg, fd, uc);
217 send_msg(&msg, fd, uc);
220 send_pattern(fd, uc, 'R', 'Z');
223 SET_FIRST_BYTE(0x01);
225 send_msg(&msg, fd, uc);
230 send_msg(&msg, fd, uc);
235 send_msg(&msg, fd, uc);
240 send_msg(&msg, fd, uc);
244 send_msg(&msg, fd, uc);
249 send_msg(&msg, fd, uc);
253 send_msg(&msg, fd, uc);
257 send_msg(&msg, fd, uc);
260 trace(0, "\nGlucose readings:\n");
263 send_msg(&msg, fd, uc);
264 read_and_verify(&in, fd);
265 print_ascii(in.data, datalen(in.data));
266 } while (datalen(in.data) > 45);
271 int wait_for_device(int vendor, int product, int *usage_code)
275 fd = hiddev_open_by_id(vendor, product, usage_code);
281 "No suitable device found. Please plug in your glucose meter\n");
284 fd = hiddev_open_by_id(vendor, product, usage_code);