|
|
1.1 root 1: #include <stdio.h>
2: #include "defines.h"
3:
4: static char Mode = 2; /* remembers resolution for check in window() */
5:
6: advance(how)
7: {
8: if (how)
9: qcmd("\020", 1); /* enable frame advance */
10: else
11: qcmd("\017", 1); /* disable frame advance */
12: qpause();
13: }
14:
15: shutter(how)
16: {
17: if (how)
18: qcmd("\033", 1); /* open shutter */
19: else
20: qcmd("\032", 1); /* close and advance film */
21: qpause();
22: qpause();
23: qpause();
24: qpause();
25: qpause();
26: qpause();
27: }
28:
29: beep()
30: {
31: qcmd("\021", 1); /* beep */
32: qpause();
33: }
34:
35: loadluts(wbuf) /* 8 bit wide lookup tables */
36: char *wbuf;
37: { char rbuf[768];
38: register int i;
39:
40: qcmd("\000", 1); /* load the rgb LUT's */
41: qpause();
42: qwrite(wbuf, 768);
43: qpause();
44: qcmd("\001", 1); /* read back rgb LUT's */
45: qpause();
46:
47: if (qread(rbuf, 768) != 768)
48: return 0;
49: else
50: for(i = 0; i < 768; i++)
51: if (rbuf[i] != wbuf[i])
52: return 0;
53: qpause();
54: return 1;
55: }
56:
57: load12luts(wbuf) /* 12 bit wide lookup tables */
58: short *wbuf;
59: {
60: register int i;
61: short rbuf[768];
62:
63: printf("loading 12 bit lookup tables\n"); fflush(stdout);
64: qpause();
65: qcmd("\094", 1); /* load the rgb LUT's */
66: qpause();
67: qwrite((char *)wbuf, 1536); /* sizeof(short)*768 */
68: qpause();
69: qcmd("\096", 1); /* read back rgb LUT's */
70: qpause();
71:
72: if (qread((char *)rbuf, 1536) != 1536)
73: return 0;
74: else
75: for(i = 0; i < 768; i++)
76: if (rbuf[i] != wbuf[i])
77: return 0;
78: qpause();
79: return 1;
80: }
81:
82: singlepass(how)
83: { /* set single pass pixel mode */
84: switch (how) {
85: default :
86: case NEUTRAL: qcmd("\002", 1); printf("singlepass neutral\n"); break;
87: case RED : qcmd("\003", 1); printf("singlepass red\n"); break;
88: case GREEN : qcmd("\004", 1); printf("singlepass green\n"); break;
89: case BLUE : qcmd("\005", 1); printf("singlepass blue\n"); break;
90: }
91: qpause();
92: }
93:
94: threepass()
95: { /* set three pass pixel mode */
96: qcmd("\006", 1);
97: qpause();
98: printf("3pass mode\n");
99: }
100:
101: nocalibs()
102: { /* disable automatic calibrations */
103: qcmd("\037", 1);
104: qpause(); qpause();
105: }
106:
107: testpattern(which)
108: {
109: if (which)
110: qcmd("\012", 1); /* test pattern 1 */
111: else
112: qcmd("\013", 1); /* test pattern 0 */
113: qpause();
114: }
115:
116: linedelay(n)
117: unsigned char n;
118: { /* interline time delay - to match host speed to qcr scanrate */
119:
120: qcmd("\014", 1);
121: qpause();
122: qwrite(n, 1); /* max delay n msec per line */
123: qpause();
124: }
125:
126: version(data)
127: char *data;
128: {
129: qcmd("\015", 1);
130: qpause();
131: qread(data, 14);
132: qpause();
133: }
134:
135: window(x, y, w, h)
136: {
137: unsigned char buf[8];
138: int maxsz = (Mode == 2)?1536:3072; /* 1536 = 2*768 = 2*3/4*1024 */
139:
140: if (w+x > maxsz || h-y > maxsz)
141: { printf("error: bad image size\n");
142: if (Mode == 2)
143: printf("\tmax: -1024, 768, 1024, -768\n");
144: else
145: printf("\tmax: -2048, 1536, 2048, -1536\n");
146: printf("\thave: %4d, %4d, %4d, %4d\n", x, y, x+w, y-h);
147: return;
148: }
149: buf[0] = (x>>8)&255; buf[1] = x&255;
150: buf[2] = (w>>8)&255; buf[3] = w&255;
151: buf[4] = (y>>8)&255; buf[5] = y&255;
152: buf[6] = (h>>8)&255; buf[7] = h&255;
153: qpause();
154: qcmd("\016", 1);
155: qpause();
156: qwrite(buf, 8);
157: qpause();
158: printf("window (%dx%d): %d %d %d %d\n", w, h, x, y, x+w, y-h);
159: }
160:
161: filmtype(n)
162: {
163: if (n == NONE || n == TMAX_100)
164: { customluts(n);
165: return;
166: }
167: qcmd("\043", 1);
168: qpause();
169: switch (n) {
170: default:
171: case LINEAR : qwrite("\001", 1); printf("linear lut's\n"); break;
172: case POLA559 : qwrite("\002", 1); printf("filmtype pola559\n"); break;
173: case EKTA100 : qwrite("\003", 1); printf("filmtype ekat100\n"); break;
174: case EKTA100_4k: qwrite("\004", 1); printf("filmtype ekta100_4k\n"); break;
175: case POLA559_4k: qwrite("\005", 1); printf("filmtype pola559_4k\n"); break;
176: case POLA809_4k: qwrite("\007", 1); printf("filmtype pola809_4k\n"); break;
177: }
178: qpause();
179: }
180:
181: moduleno()
182: { char c;
183:
184: qcmd("\045", 1);
185: qpause();
186: qread(&c, 1);
187: qpause();
188: switch (c) {
189: case 240: printf("no module\n"); break;
190: case 16: printf("35mm module\n"); break;
191: case 32: printf("4x5\" module\n"); break;
192: case 64: printf("8x10\" module\n"); break;
193: default : printf("bad module number %d\n", c);
194: }
195: return c; /* (none, m35, m120, or m240) */
196: }
197:
198: setreso(n)
199: {
200: if (n == '2')
201: { qcmd("\077", 1);
202: printf("2k mode set\n");
203: } else if (n == '4')
204: { qcmd("\078", 1);
205: printf("4k mode set \n");
206: } else
207: { printf("resolution must be either 2 or 4\n");
208: return;
209: }
210: qpause();
211: fflush(stdout);
212: }
213:
214: resolution()
215: {
216: Mode = qreso();
217: switch (Mode) {
218: case 2: printf("2k mode\n"); break;
219: case 4: printf("4k mode\n"); break;
220: default: printf("qcr: bad resolution %d\n", Mode);
221: }
222: fflush(stdout);
223: qpause();
224: return Mode;
225: }
226:
227: handshake(how)
228: {
229: if (how)
230: qcmd("\063", 1); /* enable full handshake */
231: else
232: qcmd("\062", 1); /* disable (default) */
233: qpause();
234: }
235:
236: rotate(how)
237: {
238: if (how)
239: qcmd("\067", 1); /* enable 90 deg rotation */
240: else
241: qcmd("\066", 1); /* disable (default) */
242: qpause();
243: }
244:
245: brightness(r,g,b,n)
246: {
247: char buf[4]; int oval;
248:
249: buf[0] = r; buf[1] = g; buf[2] = b; buf[3] = n;
250: qcmd("\055", 1); qpause();
251: qwrite(buf, 4); qpause();
252: }
253:
254: getbright(nq)
255: char *nq;
256: { char buf[10]; int i;
257:
258: qcmd("\073", 1); qpause();
259: qread(buf, 10); qpause();
260: for (i = 0; i < 9; i++)
261: nq[i] = buf[i+1]&0xFF;
262: qpause();
263: }
264:
265: whaterror(n)
266: { /* primary erro code, as shown on display lights:
267: 128 64 32 16
268: 8 4 2 1
269: */
270: switch (n) {
271: case 1: printf("out of film\n"); break;
272: case 129: printf("unexpected command byte\n"); break;
273: case 130: printf("unexpected data byte\n"); break;
274: case 131: printf("illegal command byte\n"); break;
275: case 132: printf("illegal data byte\n"); break;
276: case 133: printf("command interrupt\n"); break;
277: case 134: printf("unimplemented function\n"); break;
278: case 145: printf("memory fault\n"); break;
279: case 146: printf("gpib interface fault\n"); break;
280: case 147: printf("crt beam calibration fault\n"); break;
281: case 161: printf("module fault\n"); break;
282: case 162: printf("filter wheel fault\n"); break;
283: default: printf("-bad primary code (%d)-\n", n); break;
284: }
285: }
286:
287: qerror()
288: { char buf[8];
289:
290: qcmd("\044", 1);
291: qpause();
292: qread(buf, 8);
293: whaterror(buf[0]&0xFF);
294: qpause();
295: printf("Error: pri=0x%02x sec=0x%02x", (buf[0]&0xFF), (buf[1]&0xFF));
296: printf("\n\tH=0x%02x L=0x%02x ", (buf[2]&0xFF), (buf[3]&0xFF));
297: printf("D=0x%02x \n\tE=0x%02x ", (buf[4]&0xFF), (buf[5]&0xFF));
298: printf("B=0x%02x C=0x%02x\n", (buf[6]&0xFF), (buf[7]&0xFF));
299: }
300:
301: qreso()
302: { unsigned char buf[64];
303: int i, j;
304:
305: qpause();
306: qcmd("\074", 1);
307: qpause();
308: qpause();
309: qread(buf, 1);
310: qread(&buf[1], buf[0]);
311: qpause();
312: qpause();
313: return (int) buf[18];
314: }
315:
316: qstatus()
317: { unsigned char buf[64];
318: int i, j;
319:
320: qcmd("\074", 1);
321: qpause();
322: memset(buf, 0, 64);
323: qread(buf, 1);
324: printf("QCR status (%d bytes):\n", buf[0]);
325: qread(&buf[1], buf[0]);
326: for (i = 0; i < 38; i++)
327: { switch (i) {
328: case 6: printf("\timage height: %d\n", qnum(buf[i],buf[i+1]));
329: i++; break;
330: case 8: printf("\ty-offset : %d\n", qnum(buf[i],buf[i+1]));
331: i++; break;
332: case 10: printf("\timage width: %d\n", qnum(buf[i],buf[i+1]));
333: i++; break;
334: case 12: printf("\tx-offset : %d\n", qnum(buf[i],buf[i+1]));
335: i++; break;
336: case 26: printf("\tframe counter: %d\n", qnum(buf[i],buf[i+1]));
337: i++; break;
338: case 36: printf("\tdrift value : %d\n", qnum(buf[i],buf[i+1]));
339: i++; break;
340: default: whatstatus(i, buf[i]); break;
341: }
342: }
343: }
344:
345: qnum(a, b)
346: unsigned char a, b;
347: { short n;
348:
349: n = b + a<<8;
350: return (int)n;
351: }
352:
353: whatstatus(n, m)
354: unsigned char m;
355: {
356: switch (n) {
357: case 0: if (m) printf("\texternal luts loaded\n"); break;
358: case 1: if (m) printf("\tneutral luts loaded\n"); break;
359: case 2: printf("\t%d msec interline time delay\n", m); break;
360: case 3: if (m) printf("\tend of film\n"); break;
361: case 4: printf("\tautomatic filter wheel %sabled\n",(m)?"dis":" en");break;
362: case 5: printf("\tauto camera operation %sabled\n",(m)?"dis":" en");break;
363: case 14: printf("\tmodule no: %d\n", m); break;
364: case 15: printf("\tautomatic calibration %sabled\n",(m)?"en":"dis");break;
365: case 16: printf("\tautomatic warbling %sabled\n",(m)?"dis":" en");break;
366: case 17: printf("\trunlength black jumps %sabled\n",(m)?"dis":" en");break;
367: case 18: printf("\tresolution: %dk\n", m); break;
368: case 19: printf("\tmode was %sternally selected\n", (m)?"ex":"in");break;
369: case 20: if (m) printf("\timage is 90 degrees rotated\n"); break;
370: case 21: if (m) printf("\timage is mirrored\n"); break;
371: case 22: if (m) printf("\tunbuffered raster mode\n"); break;
372: case 23: if (m) printf("\treturn to no filter disabled\n"); break;
373: case 24: if (m) printf("\tx and y coordinates are swapped\n"); break;
374: case 25: if (m) printf("\tred repeat is enabled\n"); break;
375: case 28: if (m) printf("\tfilm is in camera\n"); break;
376: case 29: if (m) printf("\thalf frame mode enabled\n"); break;
377: case 30: if (m) printf("\tbulk back is in use\n"); break;
378: case 31: if (m) printf("\timage is 180 degrees rotated\n"); break;
379: case 32: if (m) printf("\t12 bit lookup tables are loaded\n"); break;
380: case 33: printf("\tinternal timing constant 1: %d\n", m); break;
381: case 34: printf("\tinternal timing constant 2: %d\n", m); break;
382: case 35: if (m) printf("\t'irradiance modulation' is active\n"); break;
383: default: printf("\t%2d: %2d\n", n, m); break;
384: }
385: }
386:
387: /* customized lookup tables */
388:
389: #include "qlut2.h" /* 8b generated by /usr/gerard/CAL/QCR/qlutnew.c */
390:
391: /*
392: #include "LUT_pola52.h" ** awful, reversed? **
393: */
394:
395: unsigned char lutpola52[] = { /* pola52 lut for brightness 148 */
396: 0, 46, 54, 61, 67, 68, 68, 69, 69, 70,
397: 70, 71, 71, 72, 72, 73, 73, 74, 74, 75,
398: 75, 76, 76, 77, 77, 78, 78, 79, 79, 80,
399: 80, 81, 81, 82, 82, 83, 83, 84, 84, 85,
400: 85, 85, 86, 86, 86, 86, 87, 87, 87, 88,
401: 88, 88, 88, 89, 89, 89, 90, 90, 90, 90,
402: 91, 91, 91, 92, 92, 92, 92, 93, 93, 93,
403: 94, 94, 94, 94, 95, 95, 95, 96, 96, 96,
404: 96, 97, 97, 97, 98, 98, 98, 98, 99, 99,
405: 99, 100, 100, 100, 100, 101, 101, 101, 102, 102,
406: 103, 103, 104, 104, 105, 105, 105, 106, 106, 107,
407: 107, 108, 108, 109, 109, 110, 110, 111, 111, 112,
408: 112, 113, 113, 114, 114, 115, 115, 115, 116, 116,
409: 117, 117, 118, 118, 119, 119, 120, 120, 120, 121,
410: 121, 122, 122, 122, 123, 123, 124, 124, 124, 125,
411: 125, 126, 126, 126, 127, 127, 128, 128, 128, 129,
412: 129, 130, 130, 130, 131, 131, 132, 132, 132, 133,
413: 133, 134, 134, 134, 135, 135, 136, 136, 136, 137,
414: 137, 138, 138, 139, 139, 139, 140, 140, 141, 141,
415: 141, 142, 142, 143, 143, 144, 144, 144, 145, 145,
416: 146, 146, 147, 147, 147, 148, 148, 149, 149, 150,
417: 150, 150, 151, 151, 152, 152, 153, 154, 154, 155,
418: 156, 157, 158, 159, 160, 161, 161, 162, 163, 164,
419: 165, 166, 167, 168, 169, 169, 171, 173, 175, 176,
420: 178, 180, 182, 184, 185, 188, 195, 201, 205, 208,
421: 211, 215, 218, 221, 234, 255,
422: };
423:
424:
425: customluts(n)
426: { short all12uts[768];
427: unsigned char alluts[768];
428: register int i;
429:
430: switch (n) {
431: case TMAX_100:
432: for (i = 0; i < 768; i++)
433: alluts[i] = qcr_lut[i%256];
434: if (!loadluts(alluts))
435: printf("loading new lookup tables failed\n");
436: break;
437: default: /* polaroid type 52 */
438: for (i = 0; i < 768; i++)
439: alluts[i] = lutpola52[i%256];
440: if (!loadluts(alluts))
441: printf("loading new lookup tables failed\n");
442: break;
443: }
444: }
445:
446: /*
447: not implemented:
448: 18 n + red runlength encoded single pass pixel mode
449: 19 n + green runlength sppm
450: 20 n + blue runlength sppm
451: 21 n + neutral runlength sppm
452: 22 n + three pass runlength image
453:
454: 24 - - disable automatic filter wheel control
455: 25 - - enable automatic filter wheel control (default)
456:
457: 29 256 - load a neutral LUT (default for neutral is blue lut)
458: 30 256 - read neutral LUT
459: 31/32 - - disable/enable automatic calibrations
460: 33/34 - - disable/enable warble sounds at end of image
461: 38 - + start an intensity calibration for used levels
462: 39 - + intensity calibration for all 9 levels
463:
464: 40/41 - - disable/enable black jumping (for runlength)
465: 48/49 - - disable/enable mirror imaging
466: 52/53 - - disable/enable end-of-image filter wheel movement
467: 54/55 - - disable/enable switch of x/y coordinates
468: 56/57 - - disable/enable red repeat mode
469: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.