Fujitsu backend v96, support hardware automatic length detection

- split sane_get_parameters into two functions
- remove unused code from get_pixelsize
- support hardware based auto length detection
- various status and comment updates
merge-requests/1/head
m. allan noah 2009-08-07 16:47:10 -04:00
rodzic 2da573949f
commit 504547028b
5 zmienionych plików z 189 dodań i 183 usunięć

Wyświetl plik

@ -1,3 +1,10 @@
2009-08-07 m. allan noah <kitno455 at gmail dot com>
* backend/fujitsu.[ch], backend/fujitsu-scsi.h: Backend v96
- split sane_get_parameters into two functions
- remove unused code from get_pixelsize
- support hardware based auto length detection
* doc/descriptions/fujitsu.desc: various status and comment updates
2009-08-07 Stéphane Voltz <stef.dev at free.fr>
* backend/genesys_gl646.c backend/genesys_devices.c:
- small fixes for hp3670 support

Wyświetl plik

@ -396,6 +396,8 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define set_MSEL_prepick(sb, val) setbitfield(sb + 0x02, 0x03, 6, val)
/*more automatic stuff with this one...*/
#define set_MSEL_awd(sb, val) setbitfield(sb + 0x02, 0x01, 7, val)
#define set_MSEL_ald(sb, val) setbitfield(sb + 0x03, 0x01, 7, val)
#define set_MSEL_overscan(sb, val) setbitfield(sb + 0x05, 0x03, 6, val)
/*buffer, prepick, overscan use these*/

Wyświetl plik

@ -438,6 +438,10 @@
- do color deinterlacing after reading from scanner, before buffering
v95 2009-06-02, MAN
- scanner_control_ric should return a subset of the possible errors
v96 2009-08-07, MAN
- split sane_get_parameters into two functions
- remove unused code from get_pixelsize
- support hardware based auto length detection
SANE FLOW DIAGRAM
@ -498,7 +502,7 @@
#include "fujitsu.h"
#define DEBUG 1
#define BUILD 95
#define BUILD 96
/* values for SANE_DEBUG_FUJITSU env var:
- errors 5
@ -2166,9 +2170,9 @@ init_interlace (struct fujitsu *s)
s->mode=MODE_COLOR;
/* load our own private copy of scan params */
ret = sane_get_parameters ((SANE_Handle) s, &s->params);
ret = update_params(s);
if (ret != SANE_STATUS_GOOD) {
DBG (5, "init_interlace: ERROR: cannot get params\n");
DBG (5, "init_interlace: ERROR: cannot update params\n");
return ret;
}
@ -3228,6 +3232,23 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->constraint_type = SANE_CONSTRAINT_NONE;
}
/*automatic length detection */
if(option==OPT_ALD){
opt->name = "ald";
opt->title = "Auto length detection";
opt->desc = "Scanner detects paper lower edge. May confuse some frontends.";
opt->type = SANE_TYPE_BOOL;
opt->unit = SANE_UNIT_NONE;
opt->constraint_type = SANE_CONSTRAINT_NONE;
if (s->has_MS_auto){
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
}
else
opt->cap = SANE_CAP_INACTIVE;
}
/*image compression*/
if(option==OPT_COMPRESS){
i=0;
@ -4323,6 +4344,10 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
return SANE_STATUS_GOOD;
/* Advanced Group */
case OPT_ALD:
*val_p = s->ald;
return SANE_STATUS_GOOD;
case OPT_COMPRESS:
if(s->compress == COMP_JPEG){
strcpy (val, string_JPEG);
@ -4944,6 +4969,11 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
return SANE_STATUS_GOOD;
/* Advanced Group */
case OPT_ALD:
s->ald = val_c;
*info |= SANE_INFO_RELOAD_OPTIONS;
return mode_select_auto(s);
case OPT_COMPRESS:
if (!strcmp (val, string_JPEG)) {
tmp = COMP_JPEG;
@ -5046,12 +5076,9 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
s->overscan = MSEL_ON;
else if (!strcmp(val, string_Off))
s->overscan = MSEL_OFF;
if (s->has_MS_auto){
*info |= SANE_INFO_RELOAD_OPTIONS;
return mode_select_overscan(s);
}
else
return SANE_STATUS_GOOD;
*info |= SANE_INFO_RELOAD_OPTIONS;
return mode_select_auto(s);
case OPT_SLEEP_TIME:
s->sleep_time = val_c;
@ -5727,7 +5754,7 @@ mode_select_prepick (struct fujitsu *s)
}
static SANE_Status
mode_select_overscan (struct fujitsu *s)
mode_select_auto (struct fujitsu *s)
{
SANE_Status ret = SANE_STATUS_GOOD;
@ -5738,7 +5765,7 @@ mode_select_overscan (struct fujitsu *s)
size_t outLen = MSEL_header_len + MSEL_data_min_len;
unsigned char * page = out+MSEL_header_len;
DBG (10, "mode_select_overscan: start\n");
DBG (10, "mode_select_auto: start\n");
memset(cmd,0,cmdLen);
set_SCSI_opcode(cmd, MODE_SELECT_code);
@ -5750,6 +5777,7 @@ mode_select_overscan (struct fujitsu *s)
set_MSEL_page_len(page, MSEL_data_min_len-2);
set_MSEL_overscan(page, s->overscan);
set_MSEL_ald(page, s->ald);
ret = do_cmd (
s, 1, 0,
@ -5758,7 +5786,7 @@ mode_select_overscan (struct fujitsu *s)
NULL, NULL
);
DBG (10, "mode_select_overscan: finish\n");
DBG (10, "mode_select_auto: finish\n");
return ret;
}
@ -5788,106 +5816,120 @@ mode_select_overscan (struct fujitsu *s)
SANE_Status
sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
{
SANE_Status ret = SANE_STATUS_GOOD;
struct fujitsu *s = (struct fujitsu *) handle;
SANE_Status ret = SANE_STATUS_GOOD;
struct fujitsu *s = (struct fujitsu *) handle;
DBG (10, "sane_get_parameters: start\n");
DBG (10, "sane_get_parameters: start\n");
/* started? get param data from struct */
if(s->started){
DBG (15, "sane_get_parameters: started, copying to caller\n");
params->format = s->params.format;
params->last_frame = s->params.last_frame;
params->lines = s->params.lines;
params->depth = s->params.depth;
params->pixels_per_line = s->params.pixels_per_line;
params->bytes_per_line = s->params.bytes_per_line;
/* not started? update param data from user settings */
if(!s->started){
ret = update_params(s);
if(ret)
return ret;
}
params->format = s->params.format;
params->last_frame = s->params.last_frame;
params->lines = s->params.lines;
params->depth = s->params.depth;
params->pixels_per_line = s->params.pixels_per_line;
params->bytes_per_line = s->params.bytes_per_line;
if(s->ald){
params->lines = -1;
}
DBG (10, "sane_get_parameters: finish\n");
return ret;
}
/* get param data from user settings, store in private copy */
SANE_Status
update_params (struct fujitsu * s)
{
SANE_Status ret = SANE_STATUS_GOOD;
SANE_Parameters * params = &(s->params);
DBG (15, "update_params: start\n");
/* this backend only sends single frame images */
params->last_frame = 1;
/* initial ppl from user settings */
params->pixels_per_line = s->resolution_x * (s->br_x - s->tl_x) / 1200;
/* some scanners require even number of bytes in each transfer block,
* so we round to even # of total lines, to ensure last block is even */
params->lines = s->resolution_y * (s->br_y - s->tl_y) / 1200;
params->lines -= params->lines % 2;
if (s->mode == MODE_COLOR) {
params->depth = 8;
#ifdef SANE_FRAME_JPEG
/* jpeg requires 8x8 squares */
if(s->compress == COMP_JPEG){
params->format = SANE_FRAME_JPEG;
params->pixels_per_line -= params->pixels_per_line % 8;
params->lines -= params->lines % 8;
}
/* not started? get param data from user settings */
else {
DBG (15, "sane_get_parameters: not started, updating\n");
/* this backend only sends single frame images */
params->last_frame = 1;
/* initial ppl from user settings */
params->pixels_per_line = s->resolution_x * (s->br_x - s->tl_x) / 1200;
/* some scanners require even number of bytes in each transfer block,
* so we round to even # of total lines, to ensure last block is even */
params->lines = s->resolution_y * (s->br_y - s->tl_y) / 1200;
params->lines -= params->lines % 2;
if (s->mode == MODE_COLOR) {
params->depth = 8;
#ifdef SANE_FRAME_JPEG
/* jpeg requires 8x8 squares */
if(s->compress == COMP_JPEG){
params->format = SANE_FRAME_JPEG;
params->pixels_per_line -= params->pixels_per_line % 8;
params->lines -= params->lines % 8;
}
else{
else{
#endif
params->format = SANE_FRAME_RGB;
params->pixels_per_line
-= params->pixels_per_line % s->ppl_mod_by_mode[s->mode];
params->format = SANE_FRAME_RGB;
params->pixels_per_line
-= params->pixels_per_line % s->ppl_mod_by_mode[s->mode];
#ifdef SANE_FRAME_JPEG
}
#endif
params->bytes_per_line = params->pixels_per_line * 3;
}
else if (s->mode == MODE_GRAYSCALE) {
params->depth = 8;
#ifdef SANE_FRAME_JPEG
/* jpeg requires 8x8 squares */
if(s->compress == COMP_JPEG){
params->format = SANE_FRAME_JPEG;
params->pixels_per_line -= params->pixels_per_line % 8;
params->lines -= params->lines % 8;
}
else{
#endif
params->format = SANE_FRAME_GRAY;
params->pixels_per_line
-= params->pixels_per_line % s->ppl_mod_by_mode[s->mode];
#ifdef SANE_FRAME_JPEG
}
#endif
params->bytes_per_line = params->pixels_per_line;
}
else {
params->depth = 1;
params->format = SANE_FRAME_GRAY;
params->pixels_per_line
-= params->pixels_per_line % s->ppl_mod_by_mode[s->mode];
params->bytes_per_line = params->pixels_per_line / 8;
}
}
#endif
DBG(15,"sane_get_parameters: x: max=%d, page=%d, gpw=%d, res=%d\n",
s->max_x, s->page_width, get_page_width(s), s->resolution_x);
params->bytes_per_line = params->pixels_per_line * 3;
}
else if (s->mode == MODE_GRAYSCALE) {
params->depth = 8;
DBG(15,"sane_get_parameters: y: max=%d, page=%d, gph=%d, res=%d\n",
s->max_y, s->page_height, get_page_height(s), s->resolution_y);
#ifdef SANE_FRAME_JPEG
/* jpeg requires 8x8 squares */
if(s->compress == COMP_JPEG){
params->format = SANE_FRAME_JPEG;
params->pixels_per_line -= params->pixels_per_line % 8;
params->lines -= params->lines % 8;
}
else{
#endif
params->format = SANE_FRAME_GRAY;
params->pixels_per_line
-= params->pixels_per_line % s->ppl_mod_by_mode[s->mode];
#ifdef SANE_FRAME_JPEG
}
#endif
DBG(15,"sane_get_parameters: area: tlx=%d, brx=%d, tly=%d, bry=%d\n",
s->tl_x, s->br_x, s->tl_y, s->br_y);
params->bytes_per_line = params->pixels_per_line;
}
else {
params->depth = 1;
params->format = SANE_FRAME_GRAY;
params->pixels_per_line
-= params->pixels_per_line % s->ppl_mod_by_mode[s->mode];
params->bytes_per_line = params->pixels_per_line / 8;
}
DBG (15, "sane_get_parameters: params: ppl=%d, Bpl=%d, lines=%d\n",
params->pixels_per_line, params->bytes_per_line, params->lines);
DBG(15,"update_params: x: max=%d, page=%d, gpw=%d, res=%d\n",
s->max_x, s->page_width, get_page_width(s), s->resolution_x);
DBG (15, "sane_get_parameters: params: format=%d, depth=%d, last=%d\n",
params->format, params->depth, params->last_frame);
DBG(15,"update_params: y: max=%d, page=%d, gph=%d, res=%d\n",
s->max_y, s->page_height, get_page_height(s), s->resolution_y);
DBG (10, "sane_get_parameters: finish\n");
return ret;
DBG(15,"update_params: area: tlx=%d, brx=%d, tly=%d, bry=%d\n",
s->tl_x, s->br_x, s->tl_y, s->br_y);
DBG (15, "update_params: params: ppl=%d, Bpl=%d, lines=%d\n",
params->pixels_per_line, params->bytes_per_line, params->lines);
DBG (15, "update_params: params: format=%d, depth=%d, last=%d\n",
params->format, params->depth, params->last_frame);
DBG (10, "update_params: finish\n");
return ret;
}
/*
@ -5939,9 +5981,9 @@ sane_start (SANE_Handle handle)
}
/* load our own private copy of scan params */
ret = sane_get_parameters ((SANE_Handle) s, &s->params);
ret = update_params(s);
if (ret != SANE_STATUS_GOOD) {
DBG (5, "sane_start: ERROR: cannot get params\n");
DBG (5, "sane_start: ERROR: cannot update params\n");
return ret;
}
@ -5959,6 +6001,13 @@ sane_start (SANE_Handle handle)
}
}
/* enable overscan/auto detection */
ret = mode_select_auto(s);
if (ret != SANE_STATUS_GOOD) {
DBG (5, "sane_start: ERROR: cannot mode_select_auto\n");
return ret;
}
/* set window command */
ret = set_window(s);
if (ret != SANE_STATUS_GOOD) {
@ -6599,7 +6648,7 @@ get_pixelsize(struct fujitsu *s)
s->params.pixels_per_line = get_PSIZE_num_x(in);
s->params.lines = get_PSIZE_num_y(in);
/* bytes per line differs by mode */
if (s->mode == MODE_COLOR) {
s->params.bytes_per_line = s->params.pixels_per_line * 3;
@ -6616,61 +6665,6 @@ get_pixelsize(struct fujitsu *s)
}
#if 0
/* if READ pixelsize fails, we attempt to guess */
else {
int dir = 1;
/* adjust x data in a loop */
while(1){
/* binary and jpeg must have width in multiple of 8 pixels */
/* plus, some larger scanners require even bytes per line */
/* so change the scan width and try again */
if(
((params->depth == 1 || params->format == SANE_FRAME_JPEG)
&& params->pixels_per_line % 8)
|| (s->even_scan_line && params->bytes_per_line % 8)
){
/* dont round up larger than current max width */
if(s->br_x >= pw){
dir = -1;
}
s->br_x += dir;
}
else{
break;
}
}
DBG(15,"sane_get_parameters: adj: tlx=%d, brx=%d, pixx=%d\n",
s->tl_x, s->br_x, (s->resolution_x * (s->br_x - s->tl_x) / 1200));
dir = 1;
/* adjust y data in a loop */
while(1){
/* jpeg must have length in multiple of 8 pixels */
/* so change the user's scan length and try again */
if( params->format == SANE_FRAME_JPEG && params->lines % 8 ){
/* dont round up larger than current max length */
if(s->br_y >= ph){
dir = -1;
}
s->br_y += dir;
}
else{
break;
}
}
DBG(15,"sane_get_parameters: adj: tly=%d, bry=%d, pixy=%d\n",
s->tl_y, s->br_y, (s->resolution_y * (s->br_y - s->tl_y) / 1200));
}
#endif
DBG (10, "get_pixelsize: finish\n");
return ret;

Wyświetl plik

@ -62,6 +62,7 @@ enum fujitsu_Option
OPT_VARIANCE,
OPT_ADVANCED_GROUP,
OPT_ALD,
OPT_COMPRESS,
OPT_COMPRESS_ARG,
OPT_DF_ACTION,
@ -449,6 +450,7 @@ struct fujitsu
int variance;
/*advanced group*/
int ald;
int compress;
int compress_arg;
int df_action;
@ -752,7 +754,7 @@ static SANE_Status mode_select_buff (struct fujitsu *s);
static SANE_Status mode_select_prepick (struct fujitsu *s);
static SANE_Status mode_select_overscan (struct fujitsu *s);
static SANE_Status mode_select_auto (struct fujitsu *s);
static SANE_Status set_sleep_mode(struct fujitsu *s);
@ -765,6 +767,7 @@ static SANE_Status endorser (struct fujitsu *s);
static SANE_Status set_window (struct fujitsu *s);
static SANE_Status get_pixelsize(struct fujitsu *s);
static SANE_Status update_params (struct fujitsu *s);
static SANE_Status start_scan (struct fujitsu *s);
static SANE_Status check_for_cancel(struct fujitsu *s);

Wyświetl plik

@ -12,7 +12,7 @@
:backend "fujitsu" ; name of backend
:url "http://www.thebility.com/fujitsu/"
:version "95" ; version of backend
:version "96" ; version of backend
:manpage "sane-fujitsu" ; name of manpage (if it exists)
:comment "Backend updated for SANE release 1.0.20, see sane-fujitsu manpage"
:devicetype :scanner ; start of a list of devices....
@ -103,11 +103,6 @@
:usbid "0x04c5" "0x10e1"
:comment "small, recent, discontinued"
:model "fi-6000NS"
:interface "Ethernet"
:status :untested
:comment "small, recent, discontinued, integrated touchscreen and keyboard"
;==================================================
; CURRENT MODELS, SMALL
:model "ScanSnap S510"
@ -128,6 +123,11 @@
:usbid "0x04c5" "0x1097"
:comment "small, current"
:model "fi-6000NS"
:interface "Ethernet"
:status :untested
:comment "small, current, integrated touchscreen and keyboard"
:model "fi-6010N"
:interface "Ethernet"
:status :untested
@ -232,6 +232,12 @@
:status :complete
:comment "medium, recent, discontinued"
:model "fi-5530C"
:interface "SCSI USB"
:status :complete
:usbid "0x04c5" "0x10e2"
:comment "medium, recent, discontinued"
;==================================================
; CURRENT MODELS, MEDIUM
:model "fi-4340C"
@ -240,12 +246,6 @@
:status :complete
:comment "medium, current"
:model "fi-5530C"
:interface "SCSI USB"
:status :complete
:usbid "0x04c5" "0x10e2"
:comment "medium, current"
:model "fi-5530C2"
:interface "SCSI USB"
:status :complete
@ -254,15 +254,15 @@
:model "fi-6140"
:interface "SCSI USB"
:status :complete
:status :good
:usbid "0x04c5" "0x114d"
:comment "medium, current"
:comment "medium, current, Autocrop and Autodeskew not supported"
:model "fi-6240"
:interface "SCSI USB"
:status :complete
:status :good
:usbid "0x04c5" "0x114e"
:comment "medium, current"
:comment "medium, current, Autocrop and Autodeskew not supported"
;==================================================
; DISCONTINUED OLDER MODELS, BIG
@ -323,23 +323,23 @@
:status :complete
:comment "big, recent, discontinued"
;==================================================
; CURRENT MODELS, BIG
:model "fi-4860C2"
:interface "SCSI"
:status :complete
:comment "big, current"
:model "fi-5650C"
:interface "SCSI USB"
:usbid "0x04c5" "0x10ad"
:status :complete
:comment "big, current"
:comment "big, recent, discontinued"
:model "fi-5750C"
:interface "SCSI USB"
:usbid "0x04c5" "0x1095"
:status :complete
:comment "big, recent, discontinued"
;==================================================
; CURRENT MODELS, BIG
:model "fi-4860C2"
:interface "SCSI"
:status :complete
:comment "big, current"
:model "fi-5900C"