kopia lustrzana https://gitlab.com/sane-project/backends
* backend/fujitsu.c, backend/fujitsu.h: renamed some variables
* backend/fujitsu.c: gray duplex scanning now works with the 4097D when disconnect is enabled in the scsi-controller * doc/descriptions/unsupported.desc: remove fujitsu fi4120C * doc/descriptions/fujitsu.desc added fi4120C, ScanParter 93GXmerge-requests/1/head
rodzic
a4b5a465fd
commit
f9d7350534
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,10 @@
|
|||
2003-03-05 Oliver Schirrmeister <oschirr@abm.de>
|
||||
* backend/fujitsu.c, backend/fujitsu.h: renamed some variables
|
||||
* backend/fujitsu.c: gray duplex scanning now works with the 4097D
|
||||
when disconnect is enabled in the scsi-controller
|
||||
* doc/descriptions/unsupported.desc: remove fujitsu fi4120C
|
||||
* doc/descriptions/fujitsu.desc added fi4120C, ScanParter 93GX
|
||||
|
||||
2003-03-04 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
||||
|
||||
* include/sane/sanei.h sanei/sanei_constrain_value.c: Added function
|
||||
|
@ -158,15 +165,14 @@
|
|||
HP scanners.
|
||||
|
||||
2003-02-20 Oliver Schirrmeister <oschirr@abm.de>
|
||||
* make option RIF available for 3091 and 3092, bugfix
|
||||
* set availability of options THRESHOLD und VARIANCE
|
||||
* backend/fujitsu.c: make option RIF available for 3091 and 3092, bugfix
|
||||
* backend/fujitsu.c: set availability of options THRESHOLD und VARIANCE
|
||||
|
||||
2003-02-20 Oliver Schirrmeister <oschirr@abm.de>
|
||||
* patch from <ron@roncemer.com>:
|
||||
* backend/fujitsu.c, backend/fujitsu.h: patch from <ron@roncemer.com>:
|
||||
fi4220 support
|
||||
USB support for scanners which send SCSI commands over usb
|
||||
|
||||
|
||||
2003-02-19 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
||||
|
||||
* doc/descriptions-external/ma1509.desc: Added description of the
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
V 1.3, 08-Aug-2002, OS (oschirr@abm.de)
|
||||
- bugfix. Imprinter didn't print the first time after
|
||||
switching on the scanner
|
||||
- bugfix. readerGenericPassthrough ignored the number of bytes
|
||||
- bugfix. reader_generic_passthrough ignored the number of bytes
|
||||
returned by the scanner.
|
||||
V 1.4, 13-Sep-2002
|
||||
- 3092 support (mgoppold@tbz-pariv.de)
|
||||
|
@ -85,6 +85,10 @@
|
|||
- set availability of options THRESHOLD und VARIANCE
|
||||
correctly
|
||||
- option RIF is available for 3091 und 3092
|
||||
V 1.6, 04-Mar-2003 (oschirr@abm.de)
|
||||
- renamed some variables
|
||||
- bugfix: duplex scanning now works when disconnect is enabled
|
||||
in the scsi controller.
|
||||
|
||||
SANE FLOW DIAGRAM
|
||||
|
||||
|
@ -1949,7 +1953,7 @@ sane_start (SANE_Handle handle)
|
|||
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
|
||||
DBG (10, "sane_start opening SCSI device\n");
|
||||
if (sanei_scsi_open (scanner->sane.name, &(scanner->sfd),
|
||||
scsiSenseHandler, 0) != SANE_STATUS_GOOD) {
|
||||
scsi_sense_handler, 0) != SANE_STATUS_GOOD) {
|
||||
DBG (MSG_ERR,
|
||||
"sane_start: open of %s failed:\n", scanner->sane.name);
|
||||
return SANE_STATUS_INVAL;
|
||||
|
@ -1959,7 +1963,7 @@ sane_start (SANE_Handle handle)
|
|||
scanner->object_count = 1;
|
||||
scanner->eof = SANE_FALSE;
|
||||
|
||||
if ((ret = grabScanner (scanner)))
|
||||
if ((ret = grab_scanner (scanner)))
|
||||
{
|
||||
DBG (5, "sane_start: unable to reserve scanner\n");
|
||||
if (scanner->connection == SANE_FUJITSU_USB) {
|
||||
|
@ -1985,7 +1989,7 @@ sane_start (SANE_Handle handle)
|
|||
if ((ret = fujitsu_send(scanner)))
|
||||
{
|
||||
DBG (5, "sane_start: ERROR: failed to start send command\n");
|
||||
freeScanner (scanner);
|
||||
free_scanner (scanner);
|
||||
if (scanner->connection == SANE_FUJITSU_USB) {
|
||||
sanei_usb_close (scanner->sfd);
|
||||
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
|
||||
|
@ -1999,7 +2003,7 @@ sane_start (SANE_Handle handle)
|
|||
if ((ret = imprinter(scanner)))
|
||||
{
|
||||
DBG (5, "sane_start: ERROR: failed to start imprinter command\n");
|
||||
freeScanner (scanner);
|
||||
free_scanner (scanner);
|
||||
if (scanner->connection == SANE_FUJITSU_USB) {
|
||||
sanei_usb_close (scanner->sfd);
|
||||
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
|
||||
|
@ -2015,7 +2019,7 @@ sane_start (SANE_Handle handle)
|
|||
(ret = object_position (scanner, SANE_TRUE)))
|
||||
{
|
||||
DBG (5, "sane_start: WARNING: ADF empty\n");
|
||||
freeScanner (scanner);
|
||||
free_scanner (scanner);
|
||||
if (scanner->connection == SANE_FUJITSU_USB) {
|
||||
sanei_usb_close (scanner->sfd);
|
||||
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
|
||||
|
@ -2032,7 +2036,7 @@ sane_start (SANE_Handle handle)
|
|||
if ((ret = setWindowParam (scanner)))
|
||||
{
|
||||
DBG (5, "sane_start: ERROR: failed to set window\n");
|
||||
freeScanner (scanner);
|
||||
free_scanner (scanner);
|
||||
if (scanner->connection == SANE_FUJITSU_USB) {
|
||||
sanei_usb_close (scanner->sfd);
|
||||
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
|
||||
|
@ -2052,14 +2056,19 @@ sane_start (SANE_Handle handle)
|
|||
DBG (10, "\tthreshold (line art) = %d\n", scanner->threshold);
|
||||
|
||||
|
||||
startScan (scanner);
|
||||
ret = start_scan (scanner);
|
||||
if (ret != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (MSG_ERR, "start_scan failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* create a pipe, fds[0]=read-fd, fds[1]=write-fd */
|
||||
if (pipe (defaultFds) < 0)
|
||||
{
|
||||
DBG (MSG_ERR, "ERROR: could not create pipe\n");
|
||||
scanner->object_count = 0;
|
||||
freeScanner (scanner);
|
||||
free_scanner (scanner);
|
||||
if (scanner->connection == SANE_FUJITSU_USB) {
|
||||
sanei_usb_close (scanner->sfd);
|
||||
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
|
||||
|
@ -2078,7 +2087,7 @@ sane_start (SANE_Handle handle)
|
|||
{
|
||||
DBG (MSG_ERR, "ERROR: could not create temporary file.\n");
|
||||
scanner->object_count = 0;
|
||||
freeScanner (scanner);
|
||||
free_scanner (scanner);
|
||||
if (scanner->connection == SANE_FUJITSU_USB) {
|
||||
sanei_usb_close (scanner->sfd);
|
||||
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
|
||||
|
@ -2094,7 +2103,7 @@ sane_start (SANE_Handle handle)
|
|||
{
|
||||
DBG (MSG_ERR, "ERROR: could not create duplex pipe.\n");
|
||||
scanner->object_count = 0;
|
||||
freeScanner (scanner);
|
||||
free_scanner (scanner);
|
||||
if (scanner->connection == SANE_FUJITSU_USB) {
|
||||
sanei_usb_close (scanner->sfd);
|
||||
} else if (scanner->connection == SANE_FUJITSU_SCSI) {
|
||||
|
@ -2427,7 +2436,7 @@ attachScanner (const char *devicename, struct fujitsu **devp)
|
|||
}
|
||||
} else if (mostRecentConfigConnectionType == SANE_FUJITSU_SCSI) {
|
||||
DBG (15, "attachScanner opening SCSI device\n");
|
||||
if (sanei_scsi_open (devicename, &sfd, scsiSenseHandler, 0) != 0) {
|
||||
if (sanei_scsi_open (devicename, &sfd, scsi_sense_handler, 0) != 0) {
|
||||
DBG (5, "attach_scanner: open failed\n");
|
||||
return SANE_STATUS_INVAL;
|
||||
}
|
||||
|
@ -2448,7 +2457,7 @@ attachScanner (const char *devicename, struct fujitsu **devp)
|
|||
/*
|
||||
* Now query the device and find out what it is, exactly.
|
||||
*/
|
||||
if (identifyScanner (dev) != 0)
|
||||
if (identify_scanner (dev) != 0)
|
||||
{
|
||||
DBG (5, "attach_scanner: scanner identification failed\n");
|
||||
if (dev->connection == SANE_FUJITSU_USB) {
|
||||
|
@ -2504,7 +2513,7 @@ attachOne (const char *name)
|
|||
* Responsible for producing a meaningful debug message.
|
||||
*/
|
||||
static SANE_Status
|
||||
scsiSenseHandler (int scsi_fd, u_char * sensed_data, void *arg)
|
||||
scsi_sense_handler (int scsi_fd, u_char * sensed_data, void *arg)
|
||||
{
|
||||
unsigned int ret = SANE_STATUS_IO_ERROR;
|
||||
unsigned int sense = get_RS_sense_key (sensed_data);
|
||||
|
@ -2728,7 +2737,7 @@ scsiSenseHandler (int scsi_fd, u_char * sensed_data, void *arg)
|
|||
* struct buffer.
|
||||
*/
|
||||
static void
|
||||
doInquiry (struct fujitsu *s)
|
||||
do_inquiry (struct fujitsu *s)
|
||||
{
|
||||
DBG (10, "do_inquiry\n");
|
||||
|
||||
|
@ -2764,7 +2773,7 @@ get_hardware_status (struct fujitsu *s)
|
|||
}
|
||||
} else if (s->connection == SANE_FUJITSU_SCSI) {
|
||||
DBG (10, "get_hardware_status opening SCSI device\n");
|
||||
if (sanei_scsi_open (s->devicename, &sfd, scsiSenseHandler, 0)!=0) {
|
||||
if (sanei_scsi_open (s->devicename, &sfd, scsi_sense_handler, 0)!=0) {
|
||||
DBG (5, "get_hardware_status: open failed\n");
|
||||
return SANE_STATUS_INVAL;
|
||||
}
|
||||
|
@ -3177,10 +3186,10 @@ makeTempFile ()
|
|||
* GOOD
|
||||
*/
|
||||
static int
|
||||
freeScanner (struct fujitsu *s)
|
||||
free_scanner (struct fujitsu *s)
|
||||
{
|
||||
int ret;
|
||||
DBG (10, "freeScanner\n");
|
||||
DBG (10, "free_scanner\n");
|
||||
|
||||
#if 0
|
||||
ret = object_position (s, SANE_FALSE);
|
||||
|
@ -3196,13 +3205,13 @@ freeScanner (struct fujitsu *s)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
DBG (10, "freeScanner: ok\n");
|
||||
DBG (10, "free_scanner: ok\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reserves the scanner on the SCSI bus for our exclusive access until released
|
||||
* by freeScanner.
|
||||
* by free_scanner.
|
||||
*
|
||||
* Should go through the following command sequence:
|
||||
* TEST UNIT READY
|
||||
|
@ -3215,11 +3224,11 @@ freeScanner (struct fujitsu *s)
|
|||
* GOOD
|
||||
*/
|
||||
static int
|
||||
grabScanner (struct fujitsu *s)
|
||||
grab_scanner (struct fujitsu *s)
|
||||
{
|
||||
int ret;
|
||||
|
||||
DBG (10, "grabScanner\n");
|
||||
DBG (10, "grab_scanner\n");
|
||||
wait_scanner (s);
|
||||
|
||||
hexdump (MSG_IO, "reserve_unit", reserve_unitB.cmd, reserve_unitB.size);
|
||||
|
@ -3228,7 +3237,7 @@ grabScanner (struct fujitsu *s)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
DBG (10, "grabScanner: ok\n");
|
||||
DBG (10, "grab_scanner: ok\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3404,7 +3413,7 @@ doCancel (struct fujitsu *scanner)
|
|||
|
||||
if (scanner->sfd >= 0)
|
||||
{
|
||||
freeScanner (scanner);
|
||||
free_scanner (scanner);
|
||||
DBG (10, "doCancel: close filedescriptor\n");
|
||||
if (scanner->connection == SANE_FUJITSU_USB) {
|
||||
sanei_usb_close (scanner->sfd);
|
||||
|
@ -3445,14 +3454,14 @@ maxStringSize (const SANE_String_Const strings[])
|
|||
* to start scanning.)
|
||||
*/
|
||||
static int
|
||||
startScan (struct fujitsu *s)
|
||||
start_scan (struct fujitsu *s)
|
||||
{
|
||||
int ret;
|
||||
|
||||
unsigned char *command;
|
||||
int cmdsize;
|
||||
|
||||
DBG (10, "startScan\n");
|
||||
DBG (10, "start_scan\n");
|
||||
command = malloc (scanB.size + 2);
|
||||
memcpy (command, scanB.cmd, scanB.size);
|
||||
|
||||
|
@ -3485,8 +3494,16 @@ startScan (struct fujitsu *s)
|
|||
free (command);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
/* possible reasons:
|
||||
* - duplex reading without object_position
|
||||
* - invalid field in parameter list
|
||||
*/
|
||||
|
||||
return ret;
|
||||
DBG (10, "startScan:ok\n");
|
||||
}
|
||||
|
||||
DBG (10, "start_scan:ok\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -3618,16 +3635,16 @@ sigtermHandler (int signal)
|
|||
* through (i.e. stuffs it into the pipe).
|
||||
*/
|
||||
static unsigned int
|
||||
readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
|
||||
reader_generic_passthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
|
||||
{
|
||||
int status;
|
||||
unsigned int totalDataSize, dataLeft, dataToRead;
|
||||
unsigned int total_data_size, dataLeft, data_to_read;
|
||||
unsigned char *largeBuffer;
|
||||
unsigned int largeBufferSize = 0;
|
||||
unsigned int i_data_read;
|
||||
|
||||
dataLeft = scanner->bytes_per_scan_line * scanner->scan_height_pixels;
|
||||
totalDataSize = dataLeft;
|
||||
total_data_size = dataLeft;
|
||||
|
||||
largeBuffer = scanner->buffer;
|
||||
largeBufferSize =
|
||||
|
@ -3636,9 +3653,9 @@ readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
|
|||
|
||||
do
|
||||
{
|
||||
dataToRead = (dataLeft < largeBufferSize) ? dataLeft : largeBufferSize;
|
||||
data_to_read = (dataLeft < largeBufferSize) ? dataLeft : largeBufferSize;
|
||||
|
||||
status = read_large_data_block (scanner, largeBuffer, dataToRead,
|
||||
status = read_large_data_block (scanner, largeBuffer, data_to_read,
|
||||
i_window_id, &i_data_read);
|
||||
|
||||
switch (status)
|
||||
|
@ -3648,8 +3665,8 @@ readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
|
|||
case SANE_STATUS_EOF:
|
||||
DBG (10, "reader_process: EOM (no more data) length = %d\n",
|
||||
i_data_read);
|
||||
dataToRead -= i_data_read;
|
||||
dataLeft = dataToRead;
|
||||
data_to_read -= i_data_read;
|
||||
dataLeft = data_to_read;
|
||||
break;
|
||||
default:
|
||||
DBG (MSG_ERR,
|
||||
|
@ -3661,14 +3678,14 @@ readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
|
|||
fwrite (largeBuffer, 1, i_data_read, fp);
|
||||
fflush (fp);
|
||||
|
||||
dataLeft -= dataToRead;
|
||||
dataLeft -= data_to_read;
|
||||
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
|
||||
dataToRead, dataLeft);
|
||||
data_to_read, dataLeft);
|
||||
}
|
||||
while (dataLeft);
|
||||
fclose (fp);
|
||||
|
||||
return totalDataSize;
|
||||
return total_data_size;
|
||||
}
|
||||
|
||||
|
||||
|
@ -3692,7 +3709,7 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
|
|||
unsigned int *i_data_read)
|
||||
{
|
||||
unsigned int data_left = length;
|
||||
unsigned int dataToRead;
|
||||
unsigned int data_to_read;
|
||||
int status;
|
||||
unsigned char *myBuffer = buffer;
|
||||
size_t data_read;
|
||||
|
@ -3702,15 +3719,15 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
|
|||
DBG (FLOW_CONTROL, "read_large_data_block requested %u bytes\n", length);
|
||||
do
|
||||
{
|
||||
dataToRead =
|
||||
data_to_read =
|
||||
(data_left <= s->scsi_buf_size) ? data_left : s->scsi_buf_size;
|
||||
|
||||
set_R_datatype_code (readB.cmd, R_datatype_imagedata);
|
||||
set_R_window_id (readB.cmd, i_window_id);
|
||||
set_R_xfer_length (readB.cmd, dataToRead);
|
||||
set_R_xfer_length (readB.cmd, data_to_read);
|
||||
|
||||
status = do_cmd (s->connection, s->sfd, readB.cmd, readB.size,
|
||||
myBuffer, dataToRead, &data_read);
|
||||
myBuffer, data_to_read, &data_read);
|
||||
|
||||
if (status == SANE_STATUS_EOF)
|
||||
{
|
||||
|
@ -3718,6 +3735,14 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
|
|||
data_read = s->i_transfer_length;
|
||||
data_left = 0;
|
||||
}
|
||||
else if (status == SANE_STATUS_DEVICE_BUSY)
|
||||
{
|
||||
/* temporary lack of data?
|
||||
* try again.
|
||||
*/
|
||||
data_read = 0;
|
||||
usleep(100000L);
|
||||
}
|
||||
else if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
/* denotes error */
|
||||
|
@ -3762,7 +3787,7 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
|
|||
* scanner.
|
||||
*/
|
||||
static int
|
||||
identifyScanner (struct fujitsu *s)
|
||||
identify_scanner (struct fujitsu *s)
|
||||
{
|
||||
char vendor[9];
|
||||
char product[17];
|
||||
|
@ -3773,7 +3798,7 @@ identifyScanner (struct fujitsu *s)
|
|||
|
||||
vendor[8] = product[0x10] = version[4] = 0;
|
||||
|
||||
doInquiry (s); /* get inquiry */
|
||||
do_inquiry (s); /* get inquiry */
|
||||
if (get_IN_periph_devtype (s->buffer) != IN_periph_devtype_scanner)
|
||||
{
|
||||
DBG (5, "The device at \"%s\" is not a scanner.\n", s->devicename);
|
||||
|
@ -3897,7 +3922,7 @@ identifyScanner (struct fujitsu *s)
|
|||
/* no info about the 3093DG, seems to have trouble when trying to
|
||||
* alternate read in linear mode.
|
||||
*/
|
||||
s->can_read_alternate = 0;
|
||||
s->can_read_alternate = SANE_FALSE;
|
||||
|
||||
s->ipc_present = (strchr (s->productName, 'i')) ? 1 : 0;
|
||||
s->cmp_present = (strchr (s->productName, 'm')) ? 1 : 0;
|
||||
|
@ -3922,7 +3947,7 @@ identifyScanner (struct fujitsu *s)
|
|||
|
||||
if (!strncmp (product, "M4097D", 6))
|
||||
{
|
||||
s->can_read_alternate = 1;
|
||||
s->can_read_alternate = SANE_TRUE;
|
||||
}
|
||||
|
||||
for (i = 0; i <= res_list3[0]; i++)
|
||||
|
@ -3963,7 +3988,7 @@ identifyScanner (struct fujitsu *s)
|
|||
else if (s->model == MODEL_FI)
|
||||
{
|
||||
|
||||
s->can_read_alternate = 1;
|
||||
s->can_read_alternate = SANE_TRUE;
|
||||
s->ipc_present = (strchr ((s->productName)+3, 'i')) ? 1 : 0;
|
||||
if (!strncmp (product, "fi-4340C", 8))
|
||||
{
|
||||
|
@ -4396,7 +4421,7 @@ imprinter(struct fujitsu *s)
|
|||
} else if (s->connection == SANE_FUJITSU_SCSI) {
|
||||
DBG (10, "imprinter opening SCSI device\n");
|
||||
if (sanei_scsi_open
|
||||
(s->devicename, &sfd, scsiSenseHandler, 0) != 0) {
|
||||
(s->devicename, &sfd, scsi_sense_handler, 0) != 0) {
|
||||
DBG (5, "imprinter: open failed\n");
|
||||
return SANE_STATUS_INVAL;
|
||||
}
|
||||
|
@ -4818,10 +4843,10 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
|
|||
FILE *fp1, *fp2;
|
||||
sigset_t sigterm_set;
|
||||
struct SIGACTION act;
|
||||
time_t startTime, endTime;
|
||||
unsigned int totalDataSize = 0;
|
||||
time_t start_time, end_time;
|
||||
unsigned int total_data_size = 0;
|
||||
|
||||
(void) time (&startTime);
|
||||
(void) time (&start_time);
|
||||
|
||||
DBG (10, "reader_process started\n");
|
||||
|
||||
|
@ -4873,24 +4898,24 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
|
|||
case MODEL_3091:
|
||||
if ((scanner->color_mode == MODE_COLOR)
|
||||
&& (scanner->duplex_mode == DUPLEX_BOTH))
|
||||
totalDataSize = reader3091ColorDuplex (scanner, fp1, fp2);
|
||||
total_data_size = reader3091ColorDuplex (scanner, fp1, fp2);
|
||||
else if (scanner->color_mode == MODE_COLOR)
|
||||
totalDataSize = reader3091ColorSimplex (scanner, fp1);
|
||||
total_data_size = reader3091ColorSimplex (scanner, fp1);
|
||||
else if (scanner->duplex_mode == DUPLEX_BOTH)
|
||||
totalDataSize = reader3091GrayDuplex (scanner, fp1, fp2);
|
||||
total_data_size = reader3091GrayDuplex (scanner, fp1, fp2);
|
||||
else
|
||||
totalDataSize = readerGenericPassthrough (scanner, fp1, 0);
|
||||
total_data_size = reader_generic_passthrough (scanner, fp1, 0);
|
||||
break;
|
||||
case MODEL_3092:
|
||||
if ((scanner->color_mode == MODE_COLOR)
|
||||
&& (scanner->duplex_mode == DUPLEX_BOTH))
|
||||
totalDataSize = reader3092ColorDuplex (scanner, fp1, fp2);
|
||||
total_data_size = reader3092ColorDuplex (scanner, fp1, fp2);
|
||||
else if (scanner->color_mode == MODE_COLOR)
|
||||
totalDataSize = reader3092ColorSimplex (scanner, fp1);
|
||||
total_data_size = reader3092ColorSimplex (scanner, fp1);
|
||||
else if (scanner->duplex_mode == DUPLEX_BOTH)
|
||||
totalDataSize = reader3092GrayDuplex (scanner, fp1, fp2);
|
||||
total_data_size = reader3092GrayDuplex (scanner, fp1, fp2);
|
||||
else
|
||||
totalDataSize = readerGenericPassthrough (scanner, fp1, 0);
|
||||
total_data_size = reader_generic_passthrough (scanner, fp1, 0);
|
||||
break;
|
||||
|
||||
case MODEL_FORCE:
|
||||
|
@ -4904,19 +4929,19 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
|
|||
|
||||
if (scanner->can_read_alternate)
|
||||
{
|
||||
totalDataSize =
|
||||
total_data_size =
|
||||
reader_gray_duplex_alternate (scanner, fp1, fp2);
|
||||
}
|
||||
else
|
||||
{
|
||||
totalDataSize =
|
||||
total_data_size =
|
||||
reader_gray_duplex_sequential (scanner, fp1, fp2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
totalDataSize = readerGenericPassthrough (scanner, fp1, 0);
|
||||
total_data_size = reader_generic_passthrough (scanner, fp1, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -4924,12 +4949,12 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
|
|||
DBG (5, "reader_process: no implementation for this scanner model\n");
|
||||
}
|
||||
|
||||
(void) time (&endTime);
|
||||
if (endTime == startTime)
|
||||
endTime++;
|
||||
(void) time (&end_time);
|
||||
if (end_time == start_time)
|
||||
end_time++;
|
||||
|
||||
DBG (10, "reader_process: finished, throughput was %lu bytes/second\n",
|
||||
(u_long) totalDataSize / (endTime - startTime));
|
||||
(u_long) total_data_size / (end_time - start_time));
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -5741,7 +5766,7 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
|
|||
{
|
||||
int status;
|
||||
unsigned int data_left;
|
||||
unsigned int totalDataSize, dataToRead, dataToProcess;
|
||||
unsigned int total_data_size, data_to_read, dataToProcess;
|
||||
unsigned int green_offset, blue_offset, lookAheadSize;
|
||||
unsigned readOffset;
|
||||
unsigned char *linebuffer = 0;
|
||||
|
@ -5793,18 +5818,18 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
|
|||
|
||||
readOffset = 0;
|
||||
data_left += lookAheadSize;
|
||||
totalDataSize = data_left;
|
||||
total_data_size = data_left;
|
||||
|
||||
do
|
||||
{
|
||||
dataToRead = (data_left < largeBufferSize - readOffset)
|
||||
data_to_read = (data_left < largeBufferSize - readOffset)
|
||||
? data_left : largeBufferSize - readOffset;
|
||||
|
||||
dataToProcess = dataToRead + readOffset - lookAheadSize;
|
||||
/* if (dataToRead == data_left) dataToProcess += lookAheadSize / 2; */
|
||||
dataToProcess = data_to_read + readOffset - lookAheadSize;
|
||||
/* if (data_to_read == data_left) dataToProcess += lookAheadSize / 2; */
|
||||
|
||||
status =
|
||||
read_large_data_block (scanner, largeBuffer + readOffset, dataToRead,
|
||||
read_large_data_block (scanner, largeBuffer + readOffset, data_to_read,
|
||||
0, &i_data_read);
|
||||
|
||||
switch (status)
|
||||
|
@ -5814,8 +5839,8 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
|
|||
case SANE_STATUS_EOF:
|
||||
DBG (5, "reader_process: EOM (no more data) length = %d\n",
|
||||
scanner->i_transfer_length);
|
||||
dataToRead -= scanner->i_transfer_length;
|
||||
data_left = dataToRead;
|
||||
data_to_read -= scanner->i_transfer_length;
|
||||
data_left = data_to_read;
|
||||
break;
|
||||
default:
|
||||
DBG (MSG_ERR,
|
||||
|
@ -5894,9 +5919,9 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
|
|||
}
|
||||
fflush (fp);
|
||||
|
||||
data_left -= dataToRead;
|
||||
data_left -= data_to_read;
|
||||
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
|
||||
dataToRead, data_left);
|
||||
data_to_read, data_left);
|
||||
memcpy (largeBuffer, largeBuffer + dataToProcess, lookAheadSize);
|
||||
readOffset = lookAheadSize;
|
||||
}
|
||||
|
@ -5906,7 +5931,7 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
|
|||
free (largeBuffer);
|
||||
fclose (fp);
|
||||
|
||||
return totalDataSize;
|
||||
return total_data_size;
|
||||
}
|
||||
|
||||
|
||||
|
@ -5915,7 +5940,7 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
{
|
||||
int status;
|
||||
unsigned int data_left;
|
||||
unsigned int totalDataSize, dataToRead, dataToProcess;
|
||||
unsigned int total_data_size, data_to_read, dataToProcess;
|
||||
unsigned int green_offset, blue_offset, lookAheadSize;
|
||||
unsigned readOffset;
|
||||
unsigned int duplexStartLine, duplexEndLine;
|
||||
|
@ -6034,19 +6059,19 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
|
||||
readOffset = 0;
|
||||
data_left += lookAheadSize;
|
||||
totalDataSize = data_left;
|
||||
total_data_size = data_left;
|
||||
|
||||
do
|
||||
{
|
||||
dataToRead = (data_left < largeBufferSize - readOffset)
|
||||
data_to_read = (data_left < largeBufferSize - readOffset)
|
||||
? data_left : largeBufferSize - readOffset;
|
||||
|
||||
dataToProcess = dataToRead + readOffset - lookAheadSize;
|
||||
if (dataToRead == data_left)
|
||||
dataToProcess = data_to_read + readOffset - lookAheadSize;
|
||||
if (data_to_read == data_left)
|
||||
dataToProcess += lookAheadSize / 2;
|
||||
|
||||
status =
|
||||
read_large_data_block (scanner, largeBuffer + readOffset, dataToRead,
|
||||
read_large_data_block (scanner, largeBuffer + readOffset, data_to_read,
|
||||
0, &i_data_read);
|
||||
switch (status)
|
||||
{
|
||||
|
@ -6055,8 +6080,8 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
case SANE_STATUS_EOF:
|
||||
DBG (5, "reader_process: EOM (no more data) length = %d\n",
|
||||
scanner->i_transfer_length);
|
||||
dataToRead -= scanner->i_transfer_length;
|
||||
data_left = dataToRead;
|
||||
data_to_read -= scanner->i_transfer_length;
|
||||
data_left = data_to_read;
|
||||
break;
|
||||
default:
|
||||
DBG (MSG_ERR,
|
||||
|
@ -6214,9 +6239,9 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
|
||||
fflush (fp_front);
|
||||
|
||||
data_left -= dataToRead;
|
||||
data_left -= data_to_read;
|
||||
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
|
||||
dataToRead, data_left);
|
||||
data_to_read, data_left);
|
||||
/* FIXME: simon lai reported an overflow here! */
|
||||
memcpy (largeBuffer, largeBuffer + dataToProcess, lookAheadSize);
|
||||
readOffset = lookAheadSize;
|
||||
|
@ -6251,7 +6276,7 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
free (duplexBuffer);
|
||||
}
|
||||
|
||||
return totalDataSize;
|
||||
return total_data_size;
|
||||
|
||||
}
|
||||
|
||||
|
@ -6263,13 +6288,18 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
|
|||
|
||||
int status;
|
||||
unsigned int i_left_front, i_left_back;
|
||||
unsigned int totalDataSize, dataToRead;
|
||||
unsigned int total_data_size, data_to_read;
|
||||
unsigned int duplexBufferSize;
|
||||
unsigned char *duplexBuffer;
|
||||
unsigned char *duplexPointer;
|
||||
unsigned int largeBufferSize = 0;
|
||||
unsigned int i_data_read;
|
||||
|
||||
/*
|
||||
time_t start_time, end_time;
|
||||
(void) time (&start_time);
|
||||
*/
|
||||
|
||||
i_left_front = scanner->bytes_per_scan_line * scanner->scan_height_pixels;
|
||||
i_left_back = i_left_front;
|
||||
|
||||
|
@ -6301,15 +6331,15 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
|
|||
scanner->scsi_buf_size -
|
||||
(scanner->scsi_buf_size % scanner->bytes_per_scan_line);
|
||||
|
||||
totalDataSize = 0;
|
||||
total_data_size = 0;
|
||||
|
||||
do
|
||||
{
|
||||
dataToRead = (i_left_front < largeBufferSize)
|
||||
data_to_read = (i_left_front < largeBufferSize)
|
||||
? i_left_front : largeBufferSize;
|
||||
|
||||
DBG (5, "reader_process: read %d bytes from front side\n", dataToRead);
|
||||
status = read_large_data_block (scanner, scanner->buffer, dataToRead,
|
||||
DBG (5, "reader_process: read %d bytes from front side\n", data_to_read);
|
||||
status = read_large_data_block (scanner, scanner->buffer, data_to_read,
|
||||
0x0, &i_data_read);
|
||||
|
||||
switch (status)
|
||||
|
@ -6319,12 +6349,12 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
|
|||
case SANE_STATUS_EOF:
|
||||
DBG (5, "reader_process: EOM (no more data) length = %d\n",
|
||||
scanner->i_transfer_length);
|
||||
dataToRead -= scanner->i_transfer_length;
|
||||
i_left_front = dataToRead;
|
||||
data_to_read -= scanner->i_transfer_length;
|
||||
i_left_front = data_to_read;
|
||||
break;
|
||||
case SANE_STATUS_DEVICE_BUSY:
|
||||
DBG (5, "device busy");
|
||||
dataToRead = 0;
|
||||
data_to_read = 0;
|
||||
break;
|
||||
default:
|
||||
DBG (MSG_ERR,
|
||||
|
@ -6334,22 +6364,22 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
|
|||
return (0);
|
||||
}
|
||||
|
||||
totalDataSize += dataToRead;
|
||||
fwrite (scanner->buffer, 1, dataToRead, fp_front);
|
||||
i_left_front -= dataToRead;
|
||||
total_data_size += data_to_read;
|
||||
fwrite (scanner->buffer, 1, data_to_read, fp_front);
|
||||
i_left_front -= data_to_read;
|
||||
DBG (5,
|
||||
"reader_process_front: buffer of %d bytes read; %d bytes to go\n",
|
||||
dataToRead, i_left_front);
|
||||
data_to_read, i_left_front);
|
||||
|
||||
|
||||
/*
|
||||
* read back side
|
||||
*/
|
||||
dataToRead = (i_left_back < largeBufferSize)
|
||||
data_to_read = (i_left_back < largeBufferSize)
|
||||
? i_left_back : largeBufferSize;
|
||||
|
||||
DBG (5, "reader_process: read %d bytes from back side\n", dataToRead);
|
||||
status = read_large_data_block (scanner, scanner->buffer, dataToRead,
|
||||
DBG (5, "reader_process: read %d bytes from back side\n", data_to_read);
|
||||
status = read_large_data_block (scanner, scanner->buffer, data_to_read,
|
||||
0x80, &i_data_read);
|
||||
|
||||
switch (status)
|
||||
|
@ -6359,12 +6389,12 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
|
|||
case SANE_STATUS_EOF:
|
||||
DBG (5, "reader_process: EOM (no more data) length = %d\n",
|
||||
scanner->i_transfer_length);
|
||||
dataToRead -= scanner->i_transfer_length;
|
||||
i_left_back = dataToRead;
|
||||
data_to_read -= scanner->i_transfer_length;
|
||||
i_left_back = data_to_read;
|
||||
break;
|
||||
case SANE_STATUS_DEVICE_BUSY:
|
||||
DBG (5, "device busy");
|
||||
dataToRead = 0;
|
||||
data_to_read = 0;
|
||||
break;
|
||||
default:
|
||||
DBG (MSG_ERR,
|
||||
|
@ -6374,11 +6404,11 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
|
|||
return (0);
|
||||
}
|
||||
|
||||
totalDataSize += dataToRead;
|
||||
total_data_size += data_to_read;
|
||||
if (scanner->use_temp_file)
|
||||
{
|
||||
if ((unsigned int) fwrite (scanner->buffer, 1, dataToRead, fp_back)
|
||||
!= dataToRead)
|
||||
if ((unsigned int) fwrite (scanner->buffer, 1, data_to_read, fp_back)
|
||||
!= data_to_read)
|
||||
{
|
||||
fclose (fp_back);
|
||||
DBG (MSG_ERR,
|
||||
|
@ -6388,20 +6418,28 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
|
|||
}
|
||||
else
|
||||
{
|
||||
memcpy (duplexPointer, scanner->buffer, dataToRead);
|
||||
duplexPointer += dataToRead;
|
||||
memcpy (duplexPointer, scanner->buffer, data_to_read);
|
||||
duplexPointer += data_to_read;
|
||||
}
|
||||
|
||||
i_left_back -= dataToRead;
|
||||
i_left_back -= data_to_read;
|
||||
DBG (5,
|
||||
"reader_process_back: buffer of %d bytes read; %d bytes to go\n",
|
||||
dataToRead, i_left_back);
|
||||
data_to_read, i_left_back);
|
||||
}
|
||||
while (i_left_front > 0 || i_left_back > 0);
|
||||
|
||||
fflush (fp_front);
|
||||
fclose (fp_front);
|
||||
|
||||
/*
|
||||
(void) time (&end_time);
|
||||
if (end_time == start_time)
|
||||
end_time++;
|
||||
|
||||
DBG (1, "time to read from scanner: %lu seconds\n", (end_time - start_time));
|
||||
*/
|
||||
|
||||
if (scanner->use_temp_file)
|
||||
{
|
||||
fflush (fp_back);
|
||||
|
@ -6414,7 +6452,7 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
|
|||
free (duplexBuffer);
|
||||
}
|
||||
|
||||
return totalDataSize;
|
||||
return total_data_size;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
|
@ -6425,8 +6463,8 @@ reader_gray_duplex_sequential (struct fujitsu *scanner,
|
|||
|
||||
i_total_size = 0;
|
||||
|
||||
i_total_size += readerGenericPassthrough (scanner, fp_front, 0);
|
||||
i_total_size += readerGenericPassthrough (scanner, fp_back, 0x80);
|
||||
i_total_size += reader_generic_passthrough (scanner, fp_front, 0);
|
||||
i_total_size += reader_generic_passthrough (scanner, fp_back, 0x80);
|
||||
|
||||
return i_total_size;
|
||||
}
|
||||
|
@ -6437,7 +6475,7 @@ static unsigned int
|
|||
reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
||||
{
|
||||
int status;
|
||||
unsigned int totalDataSize, data_left, dataToRead;
|
||||
unsigned int total_data_size, data_left, data_to_read;
|
||||
unsigned int duplexStartLine, duplexEndLine;
|
||||
unsigned int duplexBufferSize;
|
||||
unsigned char *duplexBuffer;
|
||||
|
@ -6480,13 +6518,13 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
scanner->scan_height_pixels * 2 -
|
||||
scanner->duplex_raster_offset * scanner->resolution_y / 300;
|
||||
|
||||
totalDataSize = data_left;
|
||||
total_data_size = data_left;
|
||||
|
||||
do
|
||||
{
|
||||
dataToRead = (data_left < largeBufferSize) ? data_left : largeBufferSize;
|
||||
data_to_read = (data_left < largeBufferSize) ? data_left : largeBufferSize;
|
||||
|
||||
status = read_large_data_block (scanner, largeBuffer, dataToRead,
|
||||
status = read_large_data_block (scanner, largeBuffer, data_to_read,
|
||||
0, &i_data_read);
|
||||
|
||||
switch (status)
|
||||
|
@ -6496,8 +6534,8 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
case SANE_STATUS_EOF:
|
||||
DBG (5, "reader_process: EOM (no more data) length = %d\n",
|
||||
scanner->i_transfer_length);
|
||||
dataToRead -= scanner->i_transfer_length;
|
||||
data_left = dataToRead;
|
||||
data_to_read -= scanner->i_transfer_length;
|
||||
data_left = data_to_read;
|
||||
break;
|
||||
default:
|
||||
DBG (MSG_ERR,
|
||||
|
@ -6507,7 +6545,7 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
return (0);
|
||||
}
|
||||
|
||||
for (source = scanner->buffer; source < scanner->buffer + dataToRead;
|
||||
for (source = scanner->buffer; source < scanner->buffer + data_to_read;
|
||||
source += scanner->bytes_per_scan_line)
|
||||
{
|
||||
if ((lineCount < duplexStartLine) ||
|
||||
|
@ -6541,9 +6579,9 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
}
|
||||
fflush (fp_front);
|
||||
|
||||
data_left -= dataToRead;
|
||||
data_left -= data_to_read;
|
||||
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
|
||||
dataToRead, data_left);
|
||||
data_to_read, data_left);
|
||||
}
|
||||
while (data_left);
|
||||
fclose (fp_front);
|
||||
|
@ -6560,7 +6598,7 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
|
|||
free (duplexBuffer);
|
||||
}
|
||||
|
||||
return totalDataSize;
|
||||
return total_data_size;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -471,16 +471,14 @@ void sane_exit (void);
|
|||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
static void doInquiry (struct fujitsu *s);
|
||||
static void do_inquiry (struct fujitsu *s);
|
||||
|
||||
static SANE_Status attachScanner (const char *devicename,
|
||||
struct fujitsu **devp);
|
||||
|
||||
static SANE_Status scsiSenseHandler (int scsi_fd, u_char * result, void *arg);
|
||||
static SANE_Status scsi_sense_handler (int scsi_fd, u_char * result, void *arg);
|
||||
|
||||
static int identifyScanner (struct fujitsu *s);
|
||||
|
||||
static void doInquiry (struct fujitsu *s);
|
||||
static int identify_scanner (struct fujitsu *s);
|
||||
|
||||
static int
|
||||
do_cmd (Fujitsu_Connection_Type connection, int fd, unsigned char *cmd,
|
||||
|
@ -500,9 +498,9 @@ static void hexdump (int level, char *comment, unsigned char *p, int l);
|
|||
|
||||
static SANE_Status init_options (struct fujitsu *scanner);
|
||||
|
||||
static int grabScanner (struct fujitsu *s);
|
||||
static int grab_scanner (struct fujitsu *s);
|
||||
|
||||
static int freeScanner (struct fujitsu *s);
|
||||
static int free_scanner (struct fujitsu *s);
|
||||
|
||||
static int wait_scanner (struct fujitsu *s);
|
||||
|
||||
|
@ -526,7 +524,7 @@ static int setWindowParam (struct fujitsu *s);
|
|||
|
||||
static size_t maxStringSize (const SANE_String_Const strings[]);
|
||||
|
||||
static int startScan (struct fujitsu *s);
|
||||
static int start_scan (struct fujitsu *s);
|
||||
|
||||
static int reader_process (struct fujitsu *scanner, int fd1, int fd2);
|
||||
|
||||
|
@ -547,7 +545,7 @@ static unsigned int reader_gray_duplex_sequential (struct fujitsu *scanner,
|
|||
static unsigned int reader_gray_duplex_alternate (struct fujitsu *scanner,
|
||||
FILE * fd, FILE * fd2);
|
||||
|
||||
static unsigned int readerGenericPassthrough (struct fujitsu *scanner,
|
||||
static unsigned int reader_generic_passthrough (struct fujitsu *scanner,
|
||||
FILE * fd, int i_window_id);
|
||||
|
||||
static int read_large_data_block (struct fujitsu *s,
|
||||
|
|
|
@ -37,8 +37,14 @@
|
|||
:interface "SCSI"
|
||||
:model "M4097"
|
||||
:interface "SCSI"
|
||||
:model "fi-4120C"
|
||||
:interface "USB SCSI"
|
||||
:status :untested
|
||||
:comment "Probably similar to fi-4220C?"
|
||||
:model "fi-4220C"
|
||||
:interface "SCSI USB"
|
||||
:model "fi-4340C"
|
||||
:interface "SCSI USB"
|
||||
:model "ScanPartner 93GX"
|
||||
:interface "SCSI"
|
||||
|
||||
|
|
|
@ -164,11 +164,6 @@
|
|||
:status :unsupported
|
||||
:comment "Unsupported. Vendor/product unknown. Maybe similar to fi-4220C?"
|
||||
|
||||
:model "fi-4120C"
|
||||
:interface "USB SCSI"
|
||||
:status :unsupported
|
||||
:comment "Unsupported. Vendor/product: 0x04c5/0x1042. Maybe similar to fi-4220C?"
|
||||
|
||||
|
||||
;********************************************************************************************
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue