kopia lustrzana https://gitlab.com/sane-project/backends
fujitsu backend v122
- add support for object_position halt - call object_position halt in check_for_cancel when requestedmerge-requests/1/head
rodzic
6fa10f308a
commit
41c31ac0e9
|
@ -377,6 +377,8 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
|
|||
#define get_IN_read_size(in) getbitfield(in+0x78, 1, 6)
|
||||
#define get_IN_start_end_ms(in) getbitfield(in+0x78, 1, 5)
|
||||
|
||||
#define get_IN_op_halt(in) getbitfield(in+0x7a, 1, 7)
|
||||
|
||||
/* some scanners need evpd inquiry data manipulated */
|
||||
#define set_IN_page_length(in,val) in[0x04]=val
|
||||
|
||||
|
@ -694,9 +696,10 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
|
|||
#define OBJECT_POSITION_code 0x31
|
||||
#define OBJECT_POSITION_len 10
|
||||
|
||||
#define set_OP_autofeed(b,val) setbitfield(b+0x01, 0x07, 0, val)
|
||||
#define set_OP_action(b,val) setbitfield(b+0x01, 0x07, 0, val)
|
||||
#define OP_Discharge 0x00
|
||||
#define OP_Feed 0x01
|
||||
#define OP_Halt 0x04
|
||||
|
||||
/* ==================================================================== */
|
||||
/* SET_SUBWINDOW */
|
||||
|
|
|
@ -560,6 +560,9 @@
|
|||
- simplify jpeg ifdefs
|
||||
- add offtimer option for more recent scanners
|
||||
- don't print 0 length line in hexdump
|
||||
v122 2014-10-28, MAN
|
||||
- add support for object_position halt
|
||||
- call object_position halt in check_for_cancel when requested
|
||||
|
||||
SANE FLOW DIAGRAM
|
||||
|
||||
|
@ -609,7 +612,7 @@
|
|||
#include "fujitsu.h"
|
||||
|
||||
#define DEBUG 1
|
||||
#define BUILD 121
|
||||
#define BUILD 122
|
||||
|
||||
/* values for SANE_DEBUG_FUJITSU env var:
|
||||
- errors 5
|
||||
|
@ -1701,6 +1704,9 @@ init_vpd (struct fujitsu *s)
|
|||
s->has_off_mode = get_IN_erp_lot6_supp(in);
|
||||
DBG (15, " ErP Lot6 (power off timer): %d\n", s->has_off_mode);
|
||||
DBG (15, " sync next feed: %d\n", get_IN_sync_next_feed(in));
|
||||
|
||||
s->has_op_halt = get_IN_op_halt(in);
|
||||
DBG (15, " object postion halt: %d\n", s->has_op_halt);
|
||||
}
|
||||
|
||||
ret = SANE_STATUS_GOOD;
|
||||
|
@ -3975,6 +3981,18 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
}
|
||||
|
||||
/*halt scanner feeder when cancelling*/
|
||||
if(option==OPT_HALT_ON_CANCEL){
|
||||
opt->name = "halt-on-cancel";
|
||||
opt->title = "Halt on Cancel";
|
||||
opt->desc = "Request driver to halt the paper feed instead of eject during a cancel.";
|
||||
opt->type = SANE_TYPE_BOOL;
|
||||
if (s->has_op_halt)
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
|
||||
else
|
||||
opt->cap = SANE_CAP_INACTIVE;
|
||||
}
|
||||
|
||||
/* "Endorser" group ------------------------------------------------------ */
|
||||
if(option==OPT_ENDORSER_GROUP){
|
||||
opt->name = "endorser-options";
|
||||
|
@ -4944,6 +4962,10 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
|||
*val_p = SANE_FIX(s->swskip);
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_HALT_ON_CANCEL:
|
||||
*val_p = s->halt_on_cancel;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
/* Endorser Group */
|
||||
case OPT_ENDORSER:
|
||||
*val_p = s->u_endorser;
|
||||
|
@ -5580,6 +5602,10 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
|||
s->swskip = SANE_UNFIX(val_c);
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_HALT_ON_CANCEL:
|
||||
s->halt_on_cancel = val_c;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
/* Endorser Group */
|
||||
case OPT_ENDORSER:
|
||||
s->u_endorser = val_c;
|
||||
|
@ -6897,7 +6923,7 @@ sane_start (SANE_Handle handle)
|
|||
s->jpeg_front_rst = 0;
|
||||
s->jpeg_back_rst = 0;
|
||||
|
||||
ret = object_position (s, SANE_TRUE);
|
||||
ret = object_position (s, OP_Feed);
|
||||
if (ret != SANE_STATUS_GOOD) {
|
||||
DBG (5, "sane_start: ERROR: cannot load page\n");
|
||||
goto errors;
|
||||
|
@ -7648,31 +7674,23 @@ get_pixelsize(struct fujitsu *s, int actual)
|
|||
* Issues the SCSI OBJECT POSITION command if an ADF is in use.
|
||||
*/
|
||||
static SANE_Status
|
||||
object_position (struct fujitsu *s, int i_load)
|
||||
object_position (struct fujitsu *s, int action)
|
||||
{
|
||||
SANE_Status ret = SANE_STATUS_GOOD;
|
||||
|
||||
unsigned char cmd[OBJECT_POSITION_len];
|
||||
size_t cmdLen = OBJECT_POSITION_len;
|
||||
|
||||
DBG (10, "object_position: start\n");
|
||||
DBG (10, "object_position: start %d\n", action);
|
||||
|
||||
if (s->source == SOURCE_FLATBED) {
|
||||
if (s->source == SOURCE_FLATBED && action < OP_Halt) {
|
||||
DBG (10, "object_position: flatbed no-op\n");
|
||||
return SANE_STATUS_GOOD;
|
||||
}
|
||||
|
||||
memset(cmd,0,cmdLen);
|
||||
set_SCSI_opcode(cmd, OBJECT_POSITION_code);
|
||||
|
||||
if (i_load) {
|
||||
DBG (15, "object_position: load\n");
|
||||
set_OP_autofeed (cmd, OP_Feed);
|
||||
}
|
||||
else {
|
||||
DBG (15, "object_position: eject\n");
|
||||
set_OP_autofeed (cmd, OP_Discharge);
|
||||
}
|
||||
set_OP_action (cmd, action);
|
||||
|
||||
ret = do_cmd (
|
||||
s, 1, 0,
|
||||
|
@ -7741,22 +7759,30 @@ check_for_cancel(struct fujitsu *s)
|
|||
{
|
||||
SANE_Status ret=SANE_STATUS_GOOD;
|
||||
|
||||
DBG (10, "check_for_cancel: start\n");
|
||||
DBG (10, "check_for_cancel: start %d %d\n",s->started,s->cancelled);
|
||||
|
||||
if(s->started && s->cancelled){
|
||||
|
||||
/* halt scan */
|
||||
if(s->halt_on_cancel){
|
||||
DBG (15, "check_for_cancel: halting\n");
|
||||
ret = object_position (s, OP_Halt);
|
||||
}
|
||||
/* cancel scan */
|
||||
else{
|
||||
DBG (15, "check_for_cancel: cancelling\n");
|
||||
|
||||
/* cancel scan */
|
||||
ret = scanner_control(s, SC_function_cancel);
|
||||
if (ret == SANE_STATUS_GOOD) {
|
||||
ret = SANE_STATUS_CANCELLED;
|
||||
}
|
||||
else{
|
||||
DBG (5, "check_for_cancel: ERROR: cannot cancel\n");
|
||||
}
|
||||
}
|
||||
|
||||
s->started = 0;
|
||||
s->cancelled = 0;
|
||||
if (ret == SANE_STATUS_GOOD || ret == SANE_STATUS_CANCELLED) {
|
||||
ret = SANE_STATUS_CANCELLED;
|
||||
}
|
||||
else{
|
||||
DBG (5, "check_for_cancel: ERROR: cannot cancel\n");
|
||||
}
|
||||
|
||||
s->started = 0;
|
||||
s->cancelled = 0;
|
||||
}
|
||||
else if(s->cancelled){
|
||||
DBG (15, "check_for_cancel: already cancelled\n");
|
||||
|
@ -9129,6 +9155,10 @@ sense_handler (int fd, unsigned char * sensed_data, void *arg)
|
|||
DBG (5, "Medium error: Stop button\n");
|
||||
return SANE_STATUS_NO_DOCS;
|
||||
}
|
||||
if (0x22 == ascq) {
|
||||
DBG (5, "Medium error: scanning halted\n");
|
||||
return SANE_STATUS_CANCELLED;
|
||||
}
|
||||
if (0x30 == ascq) {
|
||||
DBG (5, "Medium error: Not enough paper\n");
|
||||
return SANE_STATUS_NO_DOCS;
|
||||
|
|
|
@ -91,6 +91,7 @@ enum fujitsu_Option
|
|||
OPT_SWDESPECK,
|
||||
OPT_SWCROP,
|
||||
OPT_SWSKIP,
|
||||
OPT_HALT_ON_CANCEL,
|
||||
|
||||
OPT_ENDORSER_GROUP,
|
||||
OPT_ENDORSER,
|
||||
|
@ -269,6 +270,7 @@ struct fujitsu
|
|||
int has_comp_JPG1;
|
||||
int has_comp_JPG2;
|
||||
int has_comp_JPG3;
|
||||
int has_op_halt;
|
||||
|
||||
/*FIXME: more endorser data? */
|
||||
int endorser_type_f;
|
||||
|
@ -493,6 +495,7 @@ struct fujitsu
|
|||
int swdespeck;
|
||||
int swcrop;
|
||||
double swskip;
|
||||
int halt_on_cancel;
|
||||
|
||||
/*endorser group*/
|
||||
int u_endorser;
|
||||
|
@ -785,7 +788,7 @@ do_usb_cmd(struct fujitsu *s, int runRS, int shortTime,
|
|||
|
||||
static SANE_Status wait_scanner (struct fujitsu *s);
|
||||
|
||||
static SANE_Status object_position (struct fujitsu *s, int i_load);
|
||||
static SANE_Status object_position (struct fujitsu *s, int action);
|
||||
|
||||
static SANE_Status scanner_control (struct fujitsu *s, int function);
|
||||
static SANE_Status scanner_control_ric (struct fujitsu *s, int bytes, int side);
|
||||
|
|
Ładowanie…
Reference in New Issue