fujitsu backend v122

- add support for object_position halt
- call object_position halt in check_for_cancel when requested
merge-requests/1/head
m. allan noah 2014-10-28 19:19:46 -04:00
rodzic 6fa10f308a
commit 41c31ac0e9
3 zmienionych plików z 63 dodań i 27 usunięć

Wyświetl plik

@ -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 */

Wyświetl plik

@ -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;

Wyświetl plik

@ -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);