16 typedef struct Control Control;
33 if(v == nil) sysfatal("malloc: %r");
35 setmalloctag(v, getcallerpc(&n));
43 scr = allocscreen(screen, bg, 0);
45 disp = allocwindow(scr, screen->r, 0, 0xCCCCCCFF);
46 draw(screen, screen->r, bg, nil, ZP);
47 flushimage(display, 1);
53 fprint(2, "usage: %s cam-device\n", argv0);
54 threadexitsall("usage");
67 bp = Bfdopen(ctlfd, OREAD);
72 for(; s = Brdstr(bp, '\n', 1), s != nil; free(s)){
73 nf = tokenize(s, f, nelem(f));
75 fprint(2, "don't know how to interpret ctl line: %s\n", s);
78 c = emalloc(sizeof(Control));
79 c->unit = strdup(f[0]);
80 c->ctrl = strdup(f[1]);
81 c->value = strdup(f[2]);
82 if(nf >= 4) c->info = strdup(f[3]);
93 for(c = ctls; c != nil; c = d){
105 opencamera(char *dir)
109 s = smprint("%s/ctl", dir);
110 ctlfd = open(s, ORDWR);
111 if(ctlfd < 0) sysfatal("open: %r");
114 videoname = smprint("%s/video", dir);
122 while(recv(mc->resizec, &dummy) > 0){
123 lockdisplay(display);
124 if(getwindow(display, Refnone) < 0)
125 sysfatal("resize failed: %r");
127 unlockdisplay(display);
137 static char *items[] = {
141 static Menu menu = { .item = items };
142 switch(menuhit(3, mc, &menu, scr)){
152 static char buf[512];
154 for(c = ctls; n-- > 0 && c != nil; c = c->next)
158 snprint(buf, sizeof(buf), "%s(%s) = %s", c->ctrl, c->unit, c->value);
166 static char buf[512];
167 static char nval[512];
170 Menu menu = { .gen = ctlgen };
172 n = menuhit(2, mc, &menu, scr);
174 for(c = ctls; n-- > 0 && c != nil; c = c->next)
177 snprint(buf, sizeof(buf), "%s(%s) = %s%c(%s)", c->ctrl, c->unit, c->value, c->info != nil ? ' ' : 0, c->info);
179 if(enter(buf, nval, sizeof(nval), mc, kc, scr) <= 0) return;
180 if(fprint(ctlfd, "%q %q %q", c->unit, c->ctrl, nval) < 0){
181 fprint(2, "fprint: %r\n");
197 fd = open(videoname, OREAD);
198 if(fd < 0) sysfatal("open: %r");
200 i = readimage(display, fd, 1);
202 p = divpt(addpt(screen->r.min, screen->r.max), 2);
203 q = divpt(subpt(i->r.max, i->r.min), 2);
204 r = (Rectangle){subpt(p, q), addpt(p, q)};
205 lockdisplay(display);
206 draw(disp, r, i, nil, i->r.min);
208 flushimage(display, 1);
209 unlockdisplay(display);
211 fprint(2, "readimage: %r\n");
217 threadmain(int argc, char **argv)
224 if(argc != 1) usage();
227 if(initdraw(nil, nil, "camv") < 0)
228 sysfatal("initdraw: %r");
229 bg = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xCCCCCCFF);
231 kc = initkeyboard(nil);
232 if(kc == nil) sysfatal("initkeyboard: %r");
233 mc = initmouse(nil, screen);
234 if(mc == nil) sysfatal("initmouse: %r");
235 threadcreate(resizethread, nil, mainstacksize);
236 proccreate(videoproc, nil, mainstacksize);
237 display->locking = 1;
238 flushimage(display, 1);
239 unlockdisplay(display);
240 while(recv(mc->c, &mc->Mouse) >= 0){
243 lockdisplay(display);
244 if((mc->buttons & 4) != 0)
246 else if((mc->buttons & 2) != 0)
248 flushimage(display, 1);
249 unlockdisplay(display);