V10/cmd/rscan.c
/* scanning program for ricoh scanner:
OPTIONS:
-rN resolution, N : (NOT TESTED)
0 - 200x200
1 - 200x100
2 - 300x300 (default)
3 - 240x240
-D dither
-t trace stages
-d detailed debugging
16 Jan 89 (hsb): WINDOW=0 0 wid hgt changed:
1. wid pixels, not; 2. hgt is calculated at 11.7 inches (still in pixels)
*/
#include <stdio.h>
#include "rcocmd.h"
/* don't change this number - hardware puts out some number
of lines +- 5% - this makes sure we never
overrun the mapping registers */
#define MAX 1200000
#define IOALIGN 4*512
#define IMAX MAX + IOALIGN
char Buf[IMAX];
int cmdstat[] = {0, 0, 0};
int *cs = cmdstat;
char *resolution[]={
"200 200", "200 100", "300 300", "240 240" };
int width[]={ /* in bytes, not pixels */
216, 216, 324, 260 };
int height[]={ /* 11.7 inches high */
2340, 1170, 3510, 2808 };
char *ares = "300 300";
int wid = 324; /* in bytes, not pixels */
int ht = 3510;
int dither = 0;
int resol = 0;
int trace = 0;
int debug = 0;
char *device = "/dev/ricoh";
main(argc, argv)
char **argv;
{
int scanner, i, outp, count;
char *arg, *ptr, *b;
argv++;
while(--argc > 0){
if(**argv == '-'){
arg = *argv++;
switch(*++arg){
case 't':
trace = 1;
break;
case 'd':
debug = 1;
break;
case 'D':
dither = 0;
break;
case 'r':
resol = *++arg;
resol -= '0';
if(resol <0 || resol > 3)
fprintf(stderr,"strange resolution %d using default\n",resol);
ares = resolution[resol];
wid = width[resol];
ht = height[resol];
break;
case 'f':
device = ++arg;
break;
default:
fprintf(stderr,"unknown flag %s\n",arg);
exit(1);
}
}
else break;
}
if((scanner = open(device, 2)) == -1){
fprintf(stderr,"Can't open %s\n", device);
exit(1);
}
if(trace) fprintf(stderr,"opened ricoh\n");
if(argc != 0){
if((outp = creat(*argv,0666)) == -1){
fprintf(stderr,"Can't create output file %s\n",*argv);
exit(1);
}
}
else if((outp = creat("Junk", 0666)) == -1){
fprintf(stderr,"Can't create default output file junk\n");
exit(1);
}
if(trace) fprintf(stderr,"created output file\n");
sprintf(Buf,
"TYPE=binary\nWINDOW=0 0 %d %d\nRES=%s\n\n",
wid*8,ht,ares);
for(b=Buf; ;b++){
if(*b == '\n' && *(b+1) == '\n'){
count = b - Buf +2;
break;
}
}
if(write(outp, Buf, count) != count){
fprintf(stderr,"error while writing header\n");
exit(1);
}
if(dither){
*cs = dither;
if((i=ioctl(scanner,RCODITHER,cmdstat)) != 0){
fprintf(stderr,"ioctl error setting dither\n");
exit(1);
}
}
if(resol){
*cs = resol;
if((i=ioctl(scanner,RCORES,cmdstat)) != 0){
fprintf(stderr,"ioctl error setting resolution\n");
exit(1);
}
}
if(trace) fprintf(stderr,"about to read\n");
ptr = (char *)(((int)(Buf + IOALIGN-1)) & ~(IOALIGN-1));
if((i=read(scanner, ptr, MAX)) != MAX){
fprintf(stderr,"read error on scanner %d\n",i);
exit(1);
}
if(trace) fprintf(stderr,"returned from read\n");
if((ioctl(scanner, RCOHACK, cmdstat)) == 0) { /* obsolete */
fprintf(stderr, "offset %d, base = 0x%x\n", cmdstat[0], ptr);
ptr += cmdstat[0];
}
if((i=write(outp, ptr, MAX))!= MAX){
fprintf(stderr,"write error on output file\n");
exit(1);
}
close(scanner);
exit(0);
}