update to backend v1.0.35

merge-requests/1/head
m. allan noah 2006-07-05 22:46:42 +00:00
rodzic f9927937af
commit cdbe31d245
5 zmienionych plików z 303 dodań i 104 usunięć

Wyświetl plik

@ -1,3 +1,9 @@
2006-07-05 m. allan noah <anoah AT pfeiffer DOT edu>
* backend/fujitsu.[ch] backend/fujitsu-scsi.h: backend v1.0.35,
allow double feed detection, minor cleanups
* doc/descriptions/fujitsu.desc: version number update
2006-07-04 m. allan noah <anoah AT pfeiffer DOT edu> 2006-07-04 m. allan noah <anoah AT pfeiffer DOT edu>
* backend/fujitsu.[ch] backend/fujitsu-scsi.h: * backend/fujitsu.[ch] backend/fujitsu-scsi.h:

Wyświetl plik

@ -479,15 +479,22 @@ static scsiblk mode_select_bgB = {
#define set_MSEL_bg_back(sb, val) setbitfield(sb + 6, 1, 4, val) #define set_MSEL_bg_back(sb, val) setbitfield(sb + 6, 1, 4, val)
#define set_MSEL_bg_fb(sb, val) setbitfield(sb + 6, 1, 3, val) #define set_MSEL_bg_fb(sb, val) setbitfield(sb + 6, 1, 3, val)
/* static unsigned char mode_select_dfC[] = {
static unsigned char mode_select_dfeedC[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x38, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x38, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; };
static scsiblk mode_select_dfeedB = { static scsiblk mode_select_dfB = {
mode_select_dfeedC, sizeof (mode_select_dfeedC) mode_select_dfC, sizeof (mode_select_dfC)
}; };
*/ #define set_MSEL_df_enable(sb, val) setbitfield(sb + 6, 1, 7, val)
#define set_MSEL_df_continue(sb, val) setbitfield(sb + 6, 1, 6, val)
#define set_MSEL_df_thickness(sb, val) setbitfield(sb + 6, 1, 4, val)
#define set_MSEL_df_length(sb, val) setbitfield(sb + 6, 1, 3, val)
#define set_MSEL_df_diff(sb, val) setbitfield(sb + 6, 3, 0, val)
#define MSEL_df_diff_DEFAULT 0
#define MSEL_df_diff_10MM 1
#define MSEL_df_diff_15MM 2
#define MSEL_df_diff_20MM 3
static unsigned char mode_select_dropoutC[] = { static unsigned char mode_select_dropoutC[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

Wyświetl plik

@ -47,7 +47,7 @@
- fi-series (M. Allan Noah, Oliver Schirrmeister) - fi-series (M. Allan Noah, Oliver Schirrmeister)
The source code is divided in sections which you can easily find by The source code is divided in sections which you can easily find by
search for the tag "@@". searching for the tag "@@".
Section 1 - Init & static stuff Section 1 - Init & static stuff
Section 2 - sane_init, _get_devices, _open & friends Section 2 - sane_init, _get_devices, _open & friends
@ -69,24 +69,22 @@
- bugfix. Imprinter didn't print the first time after - bugfix. Imprinter didn't print the first time after
switching on the scanner switching on the scanner
- bugfix. reader_generic_passthrough ignored the number of bytes - bugfix. reader_generic_passthrough ignored the number of bytes
returned by the scanner. returned by the scanner
V 1.0.4, 2002-09-13, OS V 1.0.4, 2002-09-13, OS
- 3092 support (mgoppold@tbz-pariv.de) - 3092 support (mgoppold a t tbz-pariv.de)
- tested 4097 support - tested 4097 support
- changed some functions to receive compressed data - changed some functions to receive compressed data
V 1.0.4, 2003-02-13, OS V 1.0.4, 2003-02-13, OS
- fi-4220C support (ron@roncemer.com) - fi-4220C support (ron a t roncemer.com)
- SCSI over USB support (ron@roncemer.com) - SCSI over USB support (ron a t roncemer.com)
V 1.0.5, 2003-02-20, OS V 1.0.5, 2003-02-20, OS
- set availability of options THRESHOLD und VARIANCE - set availability of options THRESHOLD und VARIANCE
- option RIF is available for 3091 und 3092 - option RIF is available for 3091 and 3092
V 1.0.6, 2003-03-04, OS V 1.0.6, 2003-03-04, OS
- renamed some variables - renamed some variables
- bugfix: duplex scanning now works when disconnect is enabled - bugfix: duplex scanning now works when disconnect is enabled
in the scsi controller.
V 1.0.7, 2003-03-10, OS V 1.0.7, 2003-03-10, OS
- displays the offending byte when something is wrong in the - displays the offending byte in the window descriptor block
window descriptor block.
V 1.0.8, 2003-03-28, OS V 1.0.8, 2003-03-28, OS
- fi-4120C support, MAN - fi-4120C support, MAN
- display information about gamma in vital_product_data - display information about gamma in vital_product_data
@ -102,23 +100,21 @@
- added code to support color modes of more recent scanners - added code to support color modes of more recent scanners
V 1.0.13 2003-11-07, OS V 1.0.13 2003-11-07, OS
- Bugfix. If a scanner returned a color image - Bugfix. If a scanner returned a color image
in format rr...r gg.g bb...b the reader process crashed. in format rr...r gg...g bb...b the reader process crashed
- Bugfix. The option gamma was enabled for - Bugfix. Disable option gamma was for the fi-4120
the fi-4120. The result was an 'invalid field in parm list'-error.
V 1.0.14 2003-12-15, OS V 1.0.14 2003-12-15, OS
- Bugfix: set default threshold range to 0..255 There is a problem - Bugfix: set default threshold range to 0..255 There is a problem
with the M3093 when you are not allows to set the threshold to 0. with the M3093 when you are not allows to set the threshold to 0
- Bugfix: set the allowable x- and y-DPI values from VPD. Scanning - Bugfix: set the allowable x- and y-DPI values from VPD. Scanning
with x=100 and y=100 dpi with an fi4120 resulted in an image with x=100 and y=100 dpi with an fi4120 resulted in an image
with 100,75 dpi. with 100,75 dpi
- Bugfix: Set the default value of gamma to 0x80 for all scanners - Bugfix: Set the default value of gamma to 0x80 for all scanners
that don't have build in gamma patterns. that don't have built in gamma patterns
- Bugfix: fi-4530 and fi-4210 don't support standard paper size - Bugfix: fi-4530 and fi-4210 don't support standard paper size
spezification. Disable this option for these scanners.
V 1.0.15 2003-12-16, OS V 1.0.15 2003-12-16, OS
- Bugfix: pagewidth and pageheight where disable for the fi-4530C. - Bugfix: pagewidth and pageheight were disabled for the fi-4530C
V 1.0.16 2004-02-20, OS V 1.0.16 2004-02-20, OS
- merged the 3092-routines with the 3091-routines. - merged the 3092-routines with the 3091-routines
- inverted the image in mode color and grayscale - inverted the image in mode color and grayscale
- jpg hardware compression support (fi-4530C) - jpg hardware compression support (fi-4530C)
V 1.0.17 2004-03-04, OS V 1.0.17 2004-03-04, OS
@ -126,7 +122,7 @@
V 1.0.18 2004-06-02, OS V 1.0.18 2004-06-02, OS
- bugfix: can read duplex color now - bugfix: can read duplex color now
V 1.0.19 2004-06-28, MAN V 1.0.19 2004-06-28, MAN
- 4220 use model code not strcmp (stan@saticed.me.uk) - 4220 use model code not strcmp (stan a t saticed.me.uk)
V 1.0.20 2004-08-24, OS V 1.0.20 2004-08-24, OS
- bugfix: 3091 did not work since 15.12.2003 - bugfix: 3091 did not work since 15.12.2003
- M4099 supported (bw only) - M4099 supported (bw only)
@ -200,12 +196,15 @@
- run ghs/rs every second instead of every other - run ghs/rs every second instead of every other
V 1.0.32 2006-06-14, MAN V 1.0.32 2006-06-14, MAN
- add 4220C2 usb id - add 4220C2 usb id
V 1.0.33 2006-06-14, MAN V 1.0.33 2006-06-14, MAN (SANE v1.0.18)
- add Fi-5900 usb id and init_model section - add Fi-5900 usb id and init_model section
V 1.0.34 2006-07-04, MAN V 1.0.34 2006-07-04, MAN
- add S500 usb id - add S500 usb id
- gather more data from inq and vpd - gather more data from inq and vpd
- allow background color setting - allow background color setting
V 1.0.35 2006-07-05, MAN
- allow double feed sensor settings
- more consistent naming of global strings
SANE FLOW DIAGRAM SANE FLOW DIAGRAM
@ -265,7 +264,7 @@
#include "fujitsu.h" #include "fujitsu.h"
#define DEBUG 1 #define DEBUG 1
#define BUILD 33 #define BUILD 35
/* values for SANE_DEBUG_FUJITSU env var: /* values for SANE_DEBUG_FUJITSU env var:
- errors 5 - errors 5
@ -277,24 +276,32 @@
*/ */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
static const char source_Flatbed[] = "Flatbed"; static const char string_Flatbed[] = "Flatbed";
static const char source_ADFFront[] = "ADF Front"; static const char string_ADFFront[] = "ADF Front";
static const char source_ADFBack[] = "ADF Back"; static const char string_ADFBack[] = "ADF Back";
static const char source_ADFDuplex[] = "ADF Duplex"; static const char string_ADFDuplex[] = "ADF Duplex";
static const char mode_Lineart[] = "Lineart"; static const char string_Lineart[] = "Lineart";
static const char mode_Halftone[] = "Halftone"; static const char string_Halftone[] = "Halftone";
static const char mode_Grayscale[] = "Gray"; static const char string_Grayscale[] = "Gray";
static const char mode_Color_lineart[] = "Color Lineart"; static const char string_Color[] = "Color";
static const char mode_Color_halftone[] = "Color Halftone";
static const char mode_Color[] = "Color";
static const char color_Red[] = "Red"; static const char string_Default[] = "Default";
static const char color_Green[] = "Green";
static const char color_Blue[] = "Blue"; static const char string_Red[] = "Red";
static const char color_Default[] = "Default"; static const char string_Green[] = "Green";
static const char color_White[] = "White"; static const char string_Blue[] = "Blue";
static const char color_Black[] = "Black"; static const char string_White[] = "White";
static const char string_Black[] = "Black";
static const char string_None[] = "None";
static const char string_Thickness[] = "Thickness";
static const char string_Length[] = "Length";
static const char string_Both[] = "Both";
static const char string_10mm[] = "10mm";
static const char string_15mm[] = "15mm";
static const char string_20mm[] = "20mm";
/* Also set via config file. */ /* Also set via config file. */
static int global_buffer_size = 64 * 1024; static int global_buffer_size = 64 * 1024;
@ -906,11 +913,8 @@ init_vpd (struct fujitsu *s)
s->can_grayscale = get_IN_multilevel (buffer); s->can_grayscale = get_IN_multilevel (buffer);
DBG (15, " grayscale: %d\n", s->can_grayscale); DBG (15, " grayscale: %d\n", s->can_grayscale);
s->can_color_monochrome = get_IN_monochrome_rgb(buffer); DBG (15, " color_monochrome: %d\n", get_IN_monochrome_rgb(buffer));
DBG (15, " color_monochrome: %d\n", s->can_color_monochrome); DBG (15, " color_halftone: %d\n", get_IN_half_tone_rgb(buffer));
s->can_color_halftone = get_IN_half_tone_rgb(buffer);
DBG (15, " color_halftone: %d\n", s->can_color_halftone);
s->can_color_grayscale = get_IN_multilevel_rgb (buffer); s->can_color_grayscale = get_IN_multilevel_rgb (buffer);
DBG (15, " color_grayscale: %d\n", s->can_color_grayscale); DBG (15, " color_grayscale: %d\n", s->can_color_grayscale);
@ -1145,6 +1149,7 @@ init_model (struct fujitsu *s)
s->has_back = 0; s->has_back = 0;
s->color_interlace = COLOR_INTERLACE_3091; s->color_interlace = COLOR_INTERLACE_3091;
s->duplex_interlace = DUPLEX_INTERLACE_3091; s->duplex_interlace = DUPLEX_INTERLACE_3091;
s->has_MS_df = 0;
s->has_MS_dropout = 0; s->has_MS_dropout = 0;
s->has_SW_dropout = 1; s->has_SW_dropout = 1;
s->window_vid = 0xc0; s->window_vid = 0xc0;
@ -1163,6 +1168,7 @@ init_model (struct fujitsu *s)
s->has_back = s->has_duplex; s->has_back = s->has_duplex;
s->color_interlace = COLOR_INTERLACE_NONE; s->color_interlace = COLOR_INTERLACE_NONE;
s->duplex_interlace = DUPLEX_INTERLACE_NONE; s->duplex_interlace = DUPLEX_INTERLACE_NONE;
s->has_MS_df = 0;
s->has_MS_dropout = 0; s->has_MS_dropout = 0;
s->has_SW_dropout = 0; s->has_SW_dropout = 0;
s->window_vid = 0; s->window_vid = 0;
@ -1181,6 +1187,7 @@ init_model (struct fujitsu *s)
s->has_back = s->has_duplex; s->has_back = s->has_duplex;
s->color_interlace = COLOR_INTERLACE_RRGGBB; s->color_interlace = COLOR_INTERLACE_RRGGBB;
s->duplex_interlace = DUPLEX_INTERLACE_NONE; s->duplex_interlace = DUPLEX_INTERLACE_NONE;
s->has_MS_df = 1;
s->has_MS_dropout = 1; s->has_MS_dropout = 1;
s->has_SW_dropout = 0; s->has_SW_dropout = 0;
s->window_vid = 0; s->window_vid = 0;
@ -1200,6 +1207,7 @@ init_model (struct fujitsu *s)
s->has_back = s->has_duplex; s->has_back = s->has_duplex;
s->color_interlace = COLOR_INTERLACE_BGR; s->color_interlace = COLOR_INTERLACE_BGR;
s->duplex_interlace = DUPLEX_INTERLACE_NONE; s->duplex_interlace = DUPLEX_INTERLACE_NONE;
s->has_MS_df = 1;
s->has_MS_dropout = 1; s->has_MS_dropout = 1;
s->has_SW_dropout = 0; s->has_SW_dropout = 0;
s->window_vid = 0; s->window_vid = 0;
@ -1217,6 +1225,7 @@ init_model (struct fujitsu *s)
s->has_back = s->has_duplex; s->has_back = s->has_duplex;
s->color_interlace = COLOR_INTERLACE_BGR; s->color_interlace = COLOR_INTERLACE_BGR;
s->duplex_interlace = DUPLEX_INTERLACE_NONE; s->duplex_interlace = DUPLEX_INTERLACE_NONE;
s->has_MS_df = 1;
s->has_MS_dropout = 1; s->has_MS_dropout = 1;
s->has_SW_dropout = 0; s->has_SW_dropout = 0;
s->window_vid = 0; s->window_vid = 0;
@ -1370,16 +1379,16 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
if(option==OPT_SOURCE){ if(option==OPT_SOURCE){
i=0; i=0;
if(s->has_flatbed){ if(s->has_flatbed){
s->source_list[i++]=source_Flatbed; s->source_list[i++]=string_Flatbed;
} }
if(s->has_adf){ if(s->has_adf){
s->source_list[i++]=source_ADFFront; s->source_list[i++]=string_ADFFront;
if(s->has_back){ if(s->has_back){
s->source_list[i++]=source_ADFBack; s->source_list[i++]=string_ADFBack;
} }
if(s->has_duplex){ if(s->has_duplex){
s->source_list[i++]=source_ADFDuplex; s->source_list[i++]=string_ADFDuplex;
} }
} }
s->source_list[i]=NULL; s->source_list[i]=NULL;
@ -1398,22 +1407,16 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
if(option==OPT_MODE){ if(option==OPT_MODE){
i=0; i=0;
if(s->can_monochrome){ if(s->can_monochrome){
s->mode_list[i++]=mode_Lineart; s->mode_list[i++]=string_Lineart;
} }
if(s->can_halftone){ if(s->can_halftone){
s->mode_list[i++]=mode_Halftone; s->mode_list[i++]=string_Halftone;
} }
if(s->can_grayscale){ if(s->can_grayscale){
s->mode_list[i++]=mode_Grayscale; s->mode_list[i++]=string_Grayscale;
}
if(s->can_color_monochrome){
s->mode_list[i++]=mode_Color_lineart;
}
if(s->can_color_halftone){
s->mode_list[i++]=mode_Color_halftone;
} }
if(s->can_color_grayscale){ if(s->can_color_grayscale){
s->mode_list[i++]=mode_Color; s->mode_list[i++]=string_Color;
} }
s->mode_list[i]=NULL; s->mode_list[i]=NULL;
@ -1790,11 +1793,54 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->constraint_type = SANE_CONSTRAINT_NONE; opt->constraint_type = SANE_CONSTRAINT_NONE;
} }
/*double feed detection*/
if(option==OPT_DF_DETECT){
s->df_detect_list[0] = string_Default;
s->df_detect_list[1] = string_None;
s->df_detect_list[2] = string_Thickness;
s->df_detect_list[3] = string_Length;
s->df_detect_list[4] = string_Both;
s->df_detect_list[5] = NULL;
opt->name = "dfdetect";
opt->title = "DF detection";
opt->desc = "Enable double feed sensors";
opt->type = SANE_TYPE_STRING;
opt->constraint_type = SANE_CONSTRAINT_STRING_LIST;
opt->constraint.string_list = s->df_detect_list;
opt->size = maxStringSize (opt->constraint.string_list);
if (s->has_MS_df)
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
else
opt->cap = SANE_CAP_INACTIVE;
}
/*double feed length difference*/
if(option==OPT_DF_DIFF){
s->df_diff_list[0] = string_Default;
s->df_diff_list[1] = string_10mm;
s->df_diff_list[2] = string_15mm;
s->df_diff_list[3] = string_20mm;
s->df_diff_list[4] = NULL;
opt->name = "dfdiff";
opt->title = "DF length difference";
opt->desc = "Difference in page length to trigger double feed sensor";
opt->type = SANE_TYPE_STRING;
opt->constraint_type = SANE_CONSTRAINT_STRING_LIST;
opt->constraint.string_list = s->df_diff_list;
opt->size = maxStringSize (opt->constraint.string_list);
if (s->has_MS_df)
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
else
opt->cap = SANE_CAP_INACTIVE;
}
/*background color*/ /*background color*/
if(option==OPT_BG_COLOR){ if(option==OPT_BG_COLOR){
s->bg_color_list[0] = color_Default; s->bg_color_list[0] = string_Default;
s->bg_color_list[1] = color_White; s->bg_color_list[1] = string_White;
s->bg_color_list[2] = color_Black; s->bg_color_list[2] = string_Black;
s->bg_color_list[3] = NULL; s->bg_color_list[3] = NULL;
opt->name = "bgcolor"; opt->name = "bgcolor";
@ -1812,10 +1858,10 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
/*dropout color*/ /*dropout color*/
if(option==OPT_DROPOUT_COLOR){ if(option==OPT_DROPOUT_COLOR){
s->do_color_list[0] = color_Default; s->do_color_list[0] = string_Default;
s->do_color_list[1] = color_Red; s->do_color_list[1] = string_Red;
s->do_color_list[2] = color_Green; s->do_color_list[2] = string_Green;
s->do_color_list[3] = color_Blue; s->do_color_list[3] = string_Blue;
s->do_color_list[4] = NULL; s->do_color_list[4] = NULL;
opt->name = "dropoutcolor"; opt->name = "dropoutcolor";
@ -2227,16 +2273,16 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
case OPT_SOURCE: case OPT_SOURCE:
if(s->source == SOURCE_FLATBED){ if(s->source == SOURCE_FLATBED){
strcpy (val, source_Flatbed); strcpy (val, string_Flatbed);
} }
else if(s->source == SOURCE_ADF_FRONT){ else if(s->source == SOURCE_ADF_FRONT){
strcpy (val, source_ADFFront); strcpy (val, string_ADFFront);
} }
else if(s->source == SOURCE_ADF_BACK){ else if(s->source == SOURCE_ADF_BACK){
strcpy (val, source_ADFBack); strcpy (val, string_ADFBack);
} }
else if(s->source == SOURCE_ADF_DUPLEX){ else if(s->source == SOURCE_ADF_DUPLEX){
strcpy (val, source_ADFDuplex); strcpy (val, string_ADFDuplex);
} }
else{ else{
DBG(5,"missing option val for source\n"); DBG(5,"missing option val for source\n");
@ -2245,16 +2291,16 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
case OPT_MODE: case OPT_MODE:
if(s->mode == MODE_LINEART){ if(s->mode == MODE_LINEART){
strcpy (val, mode_Lineart); strcpy (val, string_Lineart);
} }
else if(s->mode == MODE_HALFTONE){ else if(s->mode == MODE_HALFTONE){
strcpy (val, mode_Halftone); strcpy (val, string_Halftone);
} }
else if(s->mode == MODE_GRAYSCALE){ else if(s->mode == MODE_GRAYSCALE){
strcpy (val, mode_Grayscale); strcpy (val, string_Grayscale);
} }
else if(s->mode == MODE_COLOR){ else if(s->mode == MODE_COLOR){
strcpy (val, mode_Color); strcpy (val, string_Color);
} }
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
@ -2307,16 +2353,53 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
/* Advanced Group */ /* Advanced Group */
case OPT_DF_DETECT:
switch (s->df_detect) {
case DF_DEFAULT:
strcpy (val, string_Default);
break;
case DF_NONE:
strcpy (val, string_None);
break;
case DF_THICKNESS:
strcpy (val, string_Thickness);
break;
case DF_LENGTH:
strcpy (val, string_Length);
break;
case DF_BOTH:
strcpy (val, string_Both);
break;
}
return SANE_STATUS_GOOD;
case OPT_DF_DIFF:
switch (s->df_diff) {
case DF_DEFAULT:
strcpy (val, string_Default);
break;
case DF_10MM:
strcpy (val, string_10mm);
break;
case DF_15MM:
strcpy (val, string_15mm);
break;
case DF_20MM:
strcpy (val, string_20mm);
break;
}
return SANE_STATUS_GOOD;
case OPT_BG_COLOR: case OPT_BG_COLOR:
switch (s->bg_color) { switch (s->bg_color) {
case COLOR_DEFAULT: case COLOR_DEFAULT:
strcpy (val, color_Default); strcpy (val, string_Default);
break; break;
case COLOR_WHITE: case COLOR_WHITE:
strcpy (val, color_White); strcpy (val, string_White);
break; break;
case COLOR_BLACK: case COLOR_BLACK:
strcpy (val, color_Black); strcpy (val, string_Black);
break; break;
} }
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
@ -2324,16 +2407,16 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
case OPT_DROPOUT_COLOR: case OPT_DROPOUT_COLOR:
switch (s->dropout_color) { switch (s->dropout_color) {
case COLOR_DEFAULT: case COLOR_DEFAULT:
strcpy (val, color_Default); strcpy (val, string_Default);
break; break;
case COLOR_RED: case COLOR_RED:
strcpy (val, color_Red); strcpy (val, string_Red);
break; break;
case COLOR_GREEN: case COLOR_GREEN:
strcpy (val, color_Green); strcpy (val, string_Green);
break; break;
case COLOR_BLUE: case COLOR_BLUE:
strcpy (val, color_Blue); strcpy (val, string_Blue);
break; break;
} }
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
@ -2498,13 +2581,13 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
/* Mode Group */ /* Mode Group */
case OPT_SOURCE: case OPT_SOURCE:
if (!strcmp (val, source_ADFFront)) { if (!strcmp (val, string_ADFFront)) {
tmp = SOURCE_ADF_FRONT; tmp = SOURCE_ADF_FRONT;
} }
else if (!strcmp (val, source_ADFBack)) { else if (!strcmp (val, string_ADFBack)) {
tmp = SOURCE_ADF_BACK; tmp = SOURCE_ADF_BACK;
} }
else if (!strcmp (val, source_ADFDuplex)) { else if (!strcmp (val, string_ADFDuplex)) {
tmp = SOURCE_ADF_DUPLEX; tmp = SOURCE_ADF_DUPLEX;
} }
else{ else{
@ -2519,13 +2602,13 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
case OPT_MODE: case OPT_MODE:
if (!strcmp (val, mode_Lineart)) { if (!strcmp (val, string_Lineart)) {
tmp = MODE_LINEART; tmp = MODE_LINEART;
} }
else if (!strcmp (val, mode_Halftone)) { else if (!strcmp (val, string_Halftone)) {
tmp = MODE_HALFTONE; tmp = MODE_HALFTONE;
} }
else if (!strcmp (val, mode_Grayscale)) { else if (!strcmp (val, string_Grayscale)) {
tmp = MODE_GRAYSCALE; tmp = MODE_GRAYSCALE;
} }
else{ else{
@ -2636,23 +2719,47 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
/* Advanced Group */ /* Advanced Group */
case OPT_DF_DETECT:
if (!strcmp(val, string_Default))
s->df_detect = DF_DEFAULT;
else if (!strcmp(val, string_None))
s->df_detect = DF_NONE;
else if (!strcmp(val, string_Thickness))
s->df_detect = DF_THICKNESS;
else if (!strcmp(val, string_Length))
s->df_detect = DF_LENGTH;
else if (!strcmp(val, string_Both))
s->df_detect = DF_BOTH;
return mode_select_df(s);
case OPT_DF_DIFF:
if (!strcmp(val, string_Default))
s->df_diff = DF_DEFAULT;
else if (!strcmp(val, string_10mm))
s->df_diff = DF_10MM;
else if (!strcmp(val, string_15mm))
s->df_diff = DF_15MM;
else if (!strcmp(val, string_20mm))
s->df_diff = DF_20MM;
return mode_select_df(s);
case OPT_BG_COLOR: case OPT_BG_COLOR:
if (!strcmp(val, color_Default)) if (!strcmp(val, string_Default))
s->bg_color = COLOR_DEFAULT; s->bg_color = COLOR_DEFAULT;
else if (!strcmp(val, color_White)) else if (!strcmp(val, string_White))
s->bg_color = COLOR_WHITE; s->bg_color = COLOR_WHITE;
else if (!strcmp(val, color_Black)) else if (!strcmp(val, string_Black))
s->bg_color = COLOR_BLACK; s->bg_color = COLOR_BLACK;
return mode_select_bg(s); return mode_select_bg(s);
case OPT_DROPOUT_COLOR: case OPT_DROPOUT_COLOR:
if (!strcmp(val, color_Default)) if (!strcmp(val, string_Default))
s->dropout_color = COLOR_DEFAULT; s->dropout_color = COLOR_DEFAULT;
else if (!strcmp(val, color_Red)) else if (!strcmp(val, string_Red))
s->dropout_color = COLOR_RED; s->dropout_color = COLOR_RED;
else if (!strcmp(val, color_Green)) else if (!strcmp(val, string_Green))
s->dropout_color = COLOR_GREEN; s->dropout_color = COLOR_GREEN;
else if (!strcmp(val, color_Blue)) else if (!strcmp(val, string_Blue))
s->dropout_color = COLOR_BLUE; s->dropout_color = COLOR_BLUE;
if (s->has_MS_dropout) if (s->has_MS_dropout)
return mode_select_dropout(s); return mode_select_dropout(s);
@ -2715,7 +2822,7 @@ get_hardware_status (struct fujitsu *s)
DBG (10, "get_hardware_status: start\n"); DBG (10, "get_hardware_status: start\n");
/* only run this once every couple seconds */ /* only run this once every couple seconds */
if (s->last_ghs + GHS_TIME < time(NULL)) { if (s->last_ghs < time(NULL)) {
DBG (15, "get_hardware_status: running\n"); DBG (15, "get_hardware_status: running\n");
@ -2804,6 +2911,68 @@ get_hardware_status (struct fujitsu *s)
return ret; return ret;
} }
static SANE_Status
mode_select_df (struct fujitsu *s)
{
int ret;
DBG (10, "mode_select_df: start\n");
set_MSEL_xfer_length (mode_selectB.cmd, mode_select_dfB.size);
/* clear everything for defaults */
if(s->df_detect == DF_DEFAULT){
set_MSEL_df_enable (mode_select_dfB.cmd, 0);
set_MSEL_df_continue (mode_select_dfB.cmd, 0);
set_MSEL_df_thickness (mode_select_dfB.cmd, 0);
set_MSEL_df_length (mode_select_dfB.cmd, 0);
set_MSEL_df_diff (mode_select_dfB.cmd, 0);
}
/* none, still have to enable */
else if(s->df_detect == DF_NONE){
set_MSEL_df_enable (mode_select_dfB.cmd, 1);
set_MSEL_df_continue (mode_select_dfB.cmd, 1);
set_MSEL_df_thickness (mode_select_dfB.cmd, 0);
set_MSEL_df_length (mode_select_dfB.cmd, 0);
set_MSEL_df_diff (mode_select_dfB.cmd, 0);
}
/* thickness only */
else if(s->df_detect == DF_THICKNESS){
set_MSEL_df_enable (mode_select_dfB.cmd, 1);
set_MSEL_df_continue (mode_select_dfB.cmd, 0);
set_MSEL_df_thickness (mode_select_dfB.cmd, 1);
set_MSEL_df_length (mode_select_dfB.cmd, 0);
set_MSEL_df_diff (mode_select_dfB.cmd, 0);
}
/* length only */
else if(s->df_detect == DF_LENGTH){
set_MSEL_df_enable (mode_select_dfB.cmd, 1);
set_MSEL_df_continue (mode_select_dfB.cmd, 0);
set_MSEL_df_thickness (mode_select_dfB.cmd, 0);
set_MSEL_df_length (mode_select_dfB.cmd, 1);
set_MSEL_df_diff (mode_select_dfB.cmd, s->df_diff);
}
/* thickness and length */
else{
set_MSEL_df_enable (mode_select_dfB.cmd, 1);
set_MSEL_df_continue (mode_select_dfB.cmd, 0);
set_MSEL_df_thickness (mode_select_dfB.cmd, 1);
set_MSEL_df_length (mode_select_dfB.cmd, 1);
set_MSEL_df_diff (mode_select_dfB.cmd, s->df_diff);
}
ret = do_cmd (
s, 1, 0,
mode_selectB.cmd, mode_selectB.size,
mode_select_dfB.cmd, mode_select_dfB.size,
NULL, 0
);
DBG (10, "mode_select_df: finish\n");
return ret;
}
static SANE_Status static SANE_Status
mode_select_bg (struct fujitsu *s) mode_select_bg (struct fujitsu *s)
{ {

Wyświetl plik

@ -36,6 +36,8 @@ enum fujitsu_Option
OPT_RIF, OPT_RIF,
OPT_ADVANCED_GROUP, OPT_ADVANCED_GROUP,
OPT_DF_DETECT,
OPT_DF_DIFF,
OPT_BG_COLOR, OPT_BG_COLOR,
OPT_DROPOUT_COLOR, OPT_DROPOUT_COLOR,
OPT_SLEEP_TIME, OPT_SLEEP_TIME,
@ -136,8 +138,6 @@ struct fujitsu
int can_monochrome; int can_monochrome;
int can_halftone; int can_halftone;
int can_grayscale; int can_grayscale;
int can_color_monochrome;
int can_color_halftone;
int can_color_grayscale; int can_color_grayscale;
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
@ -217,14 +217,15 @@ struct fujitsu
/*int has_MS_prepick; /*int has_MS_prepick;
int has_MS_sleep; int has_MS_sleep;
int has_MS_background; int has_MS_background;*/
int has_MS_multifeed;*/ int has_MS_df;
int has_SW_dropout; /* dropout color specified in set window data */
int has_MS_dropout; /* dropout color specified in mode select data */ int has_MS_dropout; /* dropout color specified in mode select data */
int has_SW_dropout; /* dropout color specified in set window data */
/*int has_MS_buffered; /*int has_MS_buffered;
int has_MS_paperlen;*/ int has_MS_paperlen;*/
int reverse_by_mode[6]; /* mode specific */ int reverse_by_mode[6]; /* mode specific */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
/* changeable SANE_Option structs provide our interface to frontend. */ /* changeable SANE_Option structs provide our interface to frontend. */
/* some options require lists of strings or numbers, we keep them here */ /* some options require lists of strings or numbers, we keep them here */
@ -258,6 +259,8 @@ struct fujitsu
/*ipc group*/ /*ipc group*/
/*advanced group*/ /*advanced group*/
SANE_String_Const df_detect_list[6];
SANE_String_Const df_diff_list[5];
SANE_String_Const bg_color_list[4]; SANE_String_Const bg_color_list[4];
SANE_String_Const do_color_list[5]; SANE_String_Const do_color_list[5];
SANE_String_Const lamp_color_list[5]; SANE_String_Const lamp_color_list[5];
@ -294,6 +297,8 @@ struct fujitsu
int gamma; /* not currently user settable */ int gamma; /* not currently user settable */
/*advanced group*/ /*advanced group*/
int df_detect;
int df_diff;
int bg_color; int bg_color;
int dropout_color; int dropout_color;
int lamp_color; int lamp_color;
@ -408,7 +413,17 @@ struct fujitsu
#define DUPLEX_INTERLACE_NONE 0 #define DUPLEX_INTERLACE_NONE 0
#define DUPLEX_INTERLACE_3091 1 #define DUPLEX_INTERLACE_3091 1
#define GHS_TIME 0 /* seconds passed before calling GHS */ #define DF_NONE 1
#define DF_THICKNESS 2
#define DF_LENGTH 3
#define DF_BOTH 4
/* these are same as df scsi data to make code easier */
#define DF_DEFAULT 0
#define DF_10MM 1
#define DF_15MM 2
#define DF_20MM 3
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
#define MM_PER_INCH 25.4 #define MM_PER_INCH 25.4
@ -513,6 +528,8 @@ static SANE_Status do_cancel (struct fujitsu *scanner);
static SANE_Status scanner_control (struct fujitsu *s, int function); static SANE_Status scanner_control (struct fujitsu *s, int function);
static SANE_Status mode_select_df(struct fujitsu *s);
static SANE_Status mode_select_dropout(struct fujitsu *s); static SANE_Status mode_select_dropout(struct fujitsu *s);
static SANE_Status mode_select_bg(struct fujitsu *s); static SANE_Status mode_select_bg(struct fujitsu *s);

Wyświetl plik

@ -11,7 +11,7 @@
:backend "fujitsu" ; name of backend :backend "fujitsu" ; name of backend
:url "http://www2.pfeiffer.edu/~anoah/fujitsu/" :url "http://www2.pfeiffer.edu/~anoah/fujitsu/"
:version "1.0.34" ; version of backend :version "1.0.35" ; version of backend
:manpage "sane-fujitsu" ; name of manpage (if it exists) :manpage "sane-fujitsu" ; name of manpage (if it exists)
:comment "Backend re-written for SANE release 1.0.18, see sane-fujitsu manpage" :comment "Backend re-written for SANE release 1.0.18, see sane-fujitsu manpage"
:devicetype :scanner ; start of a list of devices.... :devicetype :scanner ; start of a list of devices....