4 #include <linux/types.h>
5 #include <linux/hiddev.h>
17 unsigned char data[64];
25 int send_msg(const struct msg *msg, int fd, int usage_code)
29 if (msg->direction != OUT) {
30 trace(0, "Message direction is not OUT\n");
35 trace(1, "Sending: ");
37 print_hex(msg->data + 1, datalen(msg->data) - 1);
39 print_ascii(msg->data + 1, datalen(msg->data) - 1);
41 ret = hiddev_write(msg->data, fd, usage_code);
48 int read_and_verify(struct msg *msg, int fd)
50 unsigned char buf[64];
54 ret = hiddev_read(buf + offset, sizeof(buf) - offset, fd);
62 memcpy(msg->data, buf, sizeof(buf));
63 trace(2, "Got data %d: ", datalen(buf));
65 print_hex(buf, datalen(buf));
67 print_ascii(buf, datalen(buf));
76 read_and_verify(&msg, fd);
77 if (datalen(msg.data) <= 36)
84 #define SET_FIRST_BYTE(byte) \
86 memset(&msg.data, 0, sizeof(msg.data)); \
87 msg.data[4] = (byte); \
91 #define SET_BYTE(idx, byte) \
93 msg.data[(idx) + 4] = (byte); \
97 #define SET_BYTES(byte) msg.data[j++] = (byte)
99 int send_pattern(int fd, int uc, unsigned char byte1, unsigned char byte2)
106 SET_FIRST_BYTE(0x01);
108 send_msg(&msg, fd, uc);
113 send_msg(&msg, fd, uc);
118 send_msg(&msg, fd, uc);
121 SET_FIRST_BYTE(0x02);
124 send_msg(&msg, fd, uc);
129 send_msg(&msg, fd, uc);
135 int communicate(int fd, int uc)
142 SET_FIRST_BYTE(0x01);
144 send_msg(&msg, fd, uc);
148 send_msg(&msg, fd, uc);
152 for (i = 0; i < 6; i++) {
154 send_msg(&msg, fd, uc);
159 send_msg(&msg, fd, uc);
164 send_msg(&msg, fd, uc);
167 send_pattern(fd, uc, 'R', 'A');
168 send_pattern(fd, uc, 'R', 'C');
169 send_pattern(fd, uc, 'R', 'D');
170 send_pattern(fd, uc, 'R', 'G');
171 send_pattern(fd, uc, 'R', 'I');
172 send_pattern(fd, uc, 'R', 'M');
173 send_pattern(fd, uc, 'R', 'P');
174 send_pattern(fd, uc, 'R', 'R');
175 send_pattern(fd, uc, 'R', 'S');
176 send_pattern(fd, uc, 'R', 'T');
177 send_pattern(fd, uc, 'R', 'U');
178 send_pattern(fd, uc, 'R', 'V');
179 send_pattern(fd, uc, 'R', 'W');
180 send_pattern(fd, uc, 'R', 'X');
181 send_pattern(fd, uc, 'W', 'K');
184 SET_FIRST_BYTE(0x08);
193 send_msg(&msg, fd, uc);
197 SET_FIRST_BYTE(0x02);
200 send_msg(&msg, fd, uc);
205 send_msg(&msg, fd, uc);
210 send_msg(&msg, fd, uc);
215 send_msg(&msg, fd, uc);
220 send_msg(&msg, fd, uc);
223 send_pattern(fd, uc, 'R', 'Z');
226 SET_FIRST_BYTE(0x01);
228 send_msg(&msg, fd, uc);
233 send_msg(&msg, fd, uc);
238 send_msg(&msg, fd, uc);
243 send_msg(&msg, fd, uc);
247 send_msg(&msg, fd, uc);
252 send_msg(&msg, fd, uc);
256 send_msg(&msg, fd, uc);
260 send_msg(&msg, fd, uc);
263 trace(0, "Glucose readings:\n");
266 send_msg(&msg, fd, uc);
267 read_and_verify(&in, fd);
268 print_ascii(in.data, datalen(in.data));
269 } while (datalen(in.data) > 45);
274 int main(int argc, char *argv[])
277 struct user_options opts;
279 read_args(argc, argv, &opts);
281 if (opts.usbdev == NULL) {
282 trace(0, "USB dev name needs to be give with '-d' parameter\n");
286 fd = hiddev_open(opts.usbdev, &usage_code);
290 communicate(fd, usage_code);