7 typedef struct Tablet Tablet;
8 typedef struct Message Message;
9 typedef struct QItem QItem;
10 typedef struct Queue Queue;
11 typedef struct Reader Reader;
18 int xmax, ymax, pmax, version;
35 ctl = smprint("%sctl", dev);
36 t = calloc(sizeof(Tablet), 1);
37 t->ser = open(dev, ORDWR);
42 serctl = open(ctl, OWRITE);
49 if(fprint(serctl, "b19200\n") < 0) {
64 if(write(t->ser, "&0*", 3) < 3) return -1;
66 if(read(t->ser, buf, 1) < 1) return -1;
67 } while(buf[0] != 0xC0);
68 if(readn(t->ser, buf+1, 10) < 10) return -1;
69 t->xmax = (buf[1] << 9) | (buf[2] << 2) | ((buf[6] >> 5) & 3);
70 t->ymax = (buf[3] << 9) | (buf[4] << 2) | ((buf[6] >> 3) & 3);
71 t->pmax = buf[5] | (buf[6] & 7);
72 t->version = (buf[9] << 7) | buf[10];
73 if(write(t->ser, "1", 1) < 1) return -1;
81 char buf[189], buf2[12], *p;
83 fd = open("/dev/draw/new", OREAD);
86 memcpy(buf2, buf + 72, 11);
88 for(p = buf2; *p == ' '; p++);
90 memcpy(buf2, buf + 84, 11);
91 for(p = buf2; *p == ' '; p++);
93 if(t->sx == 0 || t->sy == 0) {
95 werrstr("invalid resolution read from /dev/draw/new");
104 findheader(Tablet* t)
109 if(read(t->ser, &c, 1) < 1) return -1;
110 } while((c & 0x80) == 0);
115 readpacket(Tablet* t)
121 head = findheader(t);
122 if(head < 0) return 0;
123 if(readn(t->ser, buf, 9) < 9) return 0;
125 m = calloc(sizeof(Message), 1);
129 m->x = (buf[0] << 9) | (buf[1] << 2) | ((buf[5] >> 5) & 3);
130 m->y = (buf[2] << 9) | (buf[3] << 2) | ((buf[5] >> 3) & 3);
131 m->p = ((buf[5] & 7) << 7) | buf[4];
140 m->msg = smprint("m %d %d %d %d\n", m->x, m->y, m->b, m->p);
145 msgdecref(Message *m)
164 qput(Queue* q, Message* m)
169 i = malloc(sizeof(QItem));
173 q->last = q->first = i;
187 if(q->first == nil) return nil;
190 if(q->first == q->last) {
191 q->first = q->last = nil;
218 Reader *rfirst, *rlast;
221 reply(Req *req, Message *m)
223 req->ofcall.count = strlen(m->msg);
224 if(req->ofcall.count > req->ifcall.count)
225 req->ofcall.count = req->ifcall.count;
226 memmove(req->ofcall.data, m->msg, req->ofcall.count);
236 for(r = rfirst; r; r = r->next) {
254 r = calloc(sizeof(Reader), 1);
255 r->e = calloc(sizeof(Queue), 1);
256 if(rlast) rlast->next = r;
259 if(rfirst == nil) rfirst = r;
266 tabletdestroyfid(Fid *fid)
273 if(r->prev) r->prev->next = r->next;
274 if(r->next) r->next->prev = r->prev;
275 if(r == rfirst) rfirst = r->next;
276 if(r == rlast) rlast = r->prev;
283 tabletdestroyreq(Req *req)
287 if(req->fid == nil) return;
307 respond(req, "no concurrent reads, please");
317 .destroyfid = tabletdestroyfid,
318 .destroyreq = tabletdestroyreq,
331 tabletsrv.infd = tabletsrv.outfd = fd[0];
332 tabletsrv.srvfd = fd[1];
333 tabletsrv.tree = alloctree(getuser(), getuser(), 0555, 0);
334 tfile = createfile(tabletsrv.tree->root, "tablet", getuser(), 0400, 0);
335 if(rfork(RFPROC | RFMEM | RFNOWAIT | RFNOTEG) > 0) exits(nil);
336 if(rfork(RFPROC | RFMEM) == 0) {
340 mount(fd[1], -1, "/dev", MAFTER, "");
342 t = newtablet("/dev/eia2");
343 if(!t) sysfatal("%r");
344 if(screensize(t) < 0) sysfatal("%r");
345 if(query(t) < 0) sysfatal("%r");
348 if(!m) sysfatal("%r");