kopia lustrzana https://gitlab.com/sane-project/backends
* backend/canon_dr.[ch], backend/canon_dr-cmd.h: backend v8
- rename read/send_counter to read/send_panel - enable control panel during init - add options for all buttons - call TUR twice in wait_scanner(), even if first succeeds - disable rif - enable brightness/contrast/threshold options * doc/descriptions/canon_dr.desc, doc/sane-canon_dr.man: backend v8merge-requests/1/head
rodzic
93daeb670f
commit
8e38974a3e
22
ChangeLog
22
ChangeLog
|
@ -1,11 +1,21 @@
|
||||||
2008-12-06 Louis Lagendijk <llagendijk-guest at users.alioth.debian.org>
|
2008-12-07 m. allan noah <kitno455 a t gmail d o t com>
|
||||||
* replaced getlogin/getenv by getpwuid(geteuid)
|
* backend/canon_dr.[ch], backend/canon_dr-cmd.h: backend v8
|
||||||
|
- rename read/send_counter to read/send_panel
|
||||||
|
- enable control panel during init
|
||||||
|
- add options for all buttons
|
||||||
|
- call TUR twice in wait_scanner(), even if first succeeds
|
||||||
|
- disable rif
|
||||||
|
- enable brightness/contrast/threshold options
|
||||||
|
* doc/descriptions/canon_dr.desc, doc/sane-canon_dr.man: backend v8
|
||||||
|
|
||||||
2008-12-06 Louis Lagendijk <llagendijk-guest at users.alioth.debian.org>
|
2008-12-06 Louis Lagendijk <llagendijk-guest at users.alioth.debian.org>
|
||||||
* backend/pixma_bjnp.c pixma_bjnp_private.h
|
* replaced getlogin/getenv by getpwuid(geteuid)
|
||||||
On Ubuntu getlogin() returns NULL. So we noew first try getlogin()
|
|
||||||
and if that fails, we try getenv("USER") and if that fails we use
|
2008-12-06 Louis Lagendijk <llagendijk-guest at users.alioth.debian.org>
|
||||||
a defaul user string
|
* backend/pixma_bjnp.c pixma_bjnp_private.h
|
||||||
|
On Ubuntu getlogin() returns NULL. So we noew first try getlogin()
|
||||||
|
and if that fails, we try getenv("USER") and if that fails we use
|
||||||
|
a defaul user string
|
||||||
|
|
||||||
2008-12-03 Stéphane Voltz <stef.dev@free.fr>
|
2008-12-03 Stéphane Voltz <stef.dev@free.fr>
|
||||||
* backend/rts8891.c backend/rts8891_low.c: possible fix for
|
* backend/rts8891.c backend/rts8891_low.c: possible fix for
|
||||||
|
|
|
@ -202,28 +202,41 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
|
||||||
#define GET_WINDOW_code 0x25
|
#define GET_WINDOW_code 0x25
|
||||||
#define GET_WINDOW_len 0
|
#define GET_WINDOW_len 0
|
||||||
|
|
||||||
|
/* ==================================================================== */
|
||||||
|
/* READ/SEND page codes */
|
||||||
|
#define SR_datatype_image 0x00
|
||||||
|
#define SR_datatype_lut 0x83
|
||||||
|
#define SR_datatype_panel 0x84
|
||||||
|
#define SR_datatype_counters 0x8c
|
||||||
|
#define SR_datatype_endorser 0x90
|
||||||
|
|
||||||
/* ==================================================================== */
|
/* ==================================================================== */
|
||||||
/* READ */
|
/* READ */
|
||||||
#define READ_code 0x28
|
#define READ_code 0x28
|
||||||
#define READ_len 10
|
#define READ_len 10
|
||||||
|
|
||||||
#define set_R_datatype_code(sb, val) sb[0x02] = val
|
#define set_R_datatype_code(sb, val) sb[0x02] = val
|
||||||
#define R_datatype_imagedata 0x00
|
|
||||||
#define R_datatype_pixelsize 0x80
|
|
||||||
#define R_datatype_counter 0x84
|
|
||||||
#define set_R_window_id(sb, val) sb[0x05] = val
|
|
||||||
#define set_R_xfer_length(sb, val) putnbyte(sb + 0x06, val, 3)
|
#define set_R_xfer_length(sb, val) putnbyte(sb + 0x06, val, 3)
|
||||||
|
|
||||||
/*pixelsize*/
|
/*image needs no macros?*/
|
||||||
#define R_PSIZE_len 0x18
|
|
||||||
#define get_PSIZE_num_x(in) getnbyte(in + 0x00, 4)
|
|
||||||
#define get_PSIZE_num_y(in) getnbyte(in + 0x04, 4)
|
|
||||||
#define get_PSIZE_paper_w(in) getnbyte(in + 0x08, 4)
|
|
||||||
#define get_PSIZE_paper_l(in) getnbyte(in + 0x0C, 4)
|
|
||||||
|
|
||||||
/*counter*/
|
/*lut unread?*/
|
||||||
#define R_COUNTER_len 0x08
|
|
||||||
#define get_R_COUNTER_count(in) getnbyte(in + 0x04, 4)
|
/*panel*/
|
||||||
|
#define R_PANEL_len 0x08
|
||||||
|
#define get_R_PANEL_start(in) getbitfield(in, 1, 7)
|
||||||
|
#define get_R_PANEL_stop(in) getbitfield(in, 1, 6)
|
||||||
|
#define get_R_PANEL_new_file(in) getbitfield(in+1, 1, 0)
|
||||||
|
#define get_R_PANEL_count_only(in) getbitfield(in+1, 1, 1)
|
||||||
|
#define get_R_PANEL_bypass_mode(in) getbitfield(in+1, 1, 2)
|
||||||
|
#define get_R_PANEL_enable_led(in) getbitfield(in+2, 1, 0)
|
||||||
|
#define get_R_PANEL_counter(in) getnbyte(in + 0x04, 4)
|
||||||
|
|
||||||
|
/*counters*/
|
||||||
|
#define R_COUNTERS_len 0x80
|
||||||
|
#define get_R_COUNTERS_scans(in) getnbyte(in + 0x04, 4)
|
||||||
|
|
||||||
|
/*endorser unread?*/
|
||||||
|
|
||||||
/* ==================================================================== */
|
/* ==================================================================== */
|
||||||
/* SEND */
|
/* SEND */
|
||||||
|
@ -231,40 +244,18 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
|
||||||
#define SEND_len 10
|
#define SEND_len 10
|
||||||
|
|
||||||
#define set_S_xfer_datatype(sb, val) sb[0x02] = (unsigned char)val
|
#define set_S_xfer_datatype(sb, val) sb[0x02] = (unsigned char)val
|
||||||
/*#define S_datatype_imagedatai 0x00
|
#define set_S_xfer_id(sb, val) putnbyte(sb + 4, val, 2)
|
||||||
#define S_datatype_halftone_mask 0x02
|
#define set_S_xfer_length(sb, val) putnbyte(sb + 6, val, 3)
|
||||||
#define S_datatype_gamma_function 0x03*/
|
|
||||||
#define S_datatype_lut_data 0x83
|
|
||||||
#define S_datatype_counter 0x84
|
|
||||||
/*#define S_datatype_jpg_q_table 0x88*/
|
|
||||||
#define S_datatype_endorser_data 0x90
|
|
||||||
/*#define S_EX_datatype_lut 0x01
|
|
||||||
#define S_EX_datatype_shading_data 0xa0
|
|
||||||
#define S_user_reg_gamma 0xc0
|
|
||||||
#define S_device_internal_info 0x03
|
|
||||||
#define set_S_datatype_qual_upper(sb, val) sb[0x04] = (unsigned char)val
|
|
||||||
#define S_DQ_none 0x00
|
|
||||||
#define S_DQ_Rcomp 0x06
|
|
||||||
#define S_DQ_Gcomp 0x07
|
|
||||||
#define S_DQ_Bcomp 0x08
|
|
||||||
#define S_DQ_Reg1 0x01
|
|
||||||
#define S_DQ_Reg2 0x02
|
|
||||||
#define S_DQ_Reg3 0x03*/
|
|
||||||
#define set_S_xfer_id(sb, val) putnbyte(sb + 4, val, 2)
|
|
||||||
#define set_S_xfer_length(sb, val) putnbyte(sb + 6, val, 3)
|
|
||||||
|
|
||||||
/*lut*/
|
/*lut*/
|
||||||
#define S_lut_header_len 0x0a
|
|
||||||
#define set_S_lut_order(sb, val) putnbyte(sb + 2, val, 1)
|
|
||||||
#define S_lut_order_single 0x10
|
|
||||||
#define set_S_lut_ssize(sb, val) putnbyte(sb + 4, val, 2)
|
|
||||||
#define set_S_lut_dsize(sb, val) putnbyte(sb + 6, val, 2)
|
|
||||||
#define S_lut_data_min_len 256
|
|
||||||
#define S_lut_data_max_len 1024
|
|
||||||
|
|
||||||
/*counter*/
|
/*panel*/
|
||||||
#define S_COUNTER_len 0x08
|
#define S_PANEL_len 0x08
|
||||||
#define set_S_COUNTER_count(sb,val) putnbyte(sb + 0x04, val, 4)
|
#define set_S_PANEL_enable_led(in,val) setbitfield(in+2, 1, 0, val)
|
||||||
|
#define set_S_PANEL_counter(sb,val) putnbyte(sb + 0x04, val, 4)
|
||||||
|
|
||||||
|
/*counters*/
|
||||||
|
/*endorser*/
|
||||||
|
|
||||||
/* ==================================================================== */
|
/* ==================================================================== */
|
||||||
/* OBJECT_POSITION */
|
/* OBJECT_POSITION */
|
||||||
|
@ -316,8 +307,10 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
|
||||||
|
|
||||||
/* for DF page */
|
/* for DF page */
|
||||||
#define set_SSM_DF_unk1(sb, val) setbitfield(sb+7, 1, 5, val)
|
#define set_SSM_DF_unk1(sb, val) setbitfield(sb+7, 1, 5, val)
|
||||||
|
#define set_SSM_DF_staple(sb, val) setbitfield(sb+7, 1, 4, val)
|
||||||
#define set_SSM_DF_len(sb, val) setbitfield(sb+7, 1, 0, val)
|
#define set_SSM_DF_len(sb, val) setbitfield(sb+7, 1, 0, val)
|
||||||
#define set_SSM_DF_thick(sb, val) setbitfield(sb+7, 1, 2, val)
|
#define set_SSM_DF_thick(sb, val) setbitfield(sb+7, 1, 2, val)
|
||||||
|
#define set_SSM_DF_textdir(sb, val) setbitfield(sb+9, 0xf, 0, val)
|
||||||
|
|
||||||
/* for DUPLEX page */
|
/* for DUPLEX page */
|
||||||
#define set_SSM_BUFF_duplex(sb, val) sb[0x06] = val
|
#define set_SSM_BUFF_duplex(sb, val) sb[0x06] = val
|
||||||
|
|
|
@ -102,6 +102,13 @@
|
||||||
- rename buffer option to buffermode to avoid conflict with scanimage
|
- rename buffer option to buffermode to avoid conflict with scanimage
|
||||||
- send ssm_do and ssm_df during sane_start
|
- send ssm_do and ssm_df during sane_start
|
||||||
- improve sense_handler output
|
- improve sense_handler output
|
||||||
|
v8 2008-12-07, MAN
|
||||||
|
- rename read/send_counter to read/send_panel
|
||||||
|
- enable control panel during init
|
||||||
|
- add options for all buttons
|
||||||
|
- call TUR twice in wait_scanner(), even if first succeeds
|
||||||
|
- disable rif
|
||||||
|
- enable brightness/contrast/threshold options
|
||||||
|
|
||||||
SANE FLOW DIAGRAM
|
SANE FLOW DIAGRAM
|
||||||
|
|
||||||
|
@ -162,7 +169,7 @@
|
||||||
#include "canon_dr.h"
|
#include "canon_dr.h"
|
||||||
|
|
||||||
#define DEBUG 1
|
#define DEBUG 1
|
||||||
#define BUILD 7
|
#define BUILD 8
|
||||||
|
|
||||||
/* values for SANE_DEBUG_CANON_DR env var:
|
/* values for SANE_DEBUG_CANON_DR env var:
|
||||||
- errors 5
|
- errors 5
|
||||||
|
@ -544,6 +551,15 @@ attach_one (const char *device_name, int connType)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* enable/read the buttons */
|
||||||
|
ret = init_panel (s);
|
||||||
|
if (ret != SANE_STATUS_GOOD) {
|
||||||
|
disconnect_fd(s);
|
||||||
|
free (s);
|
||||||
|
DBG (5, "attach_one: model failed\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* sets SANE option 'values' to good defaults */
|
/* sets SANE option 'values' to good defaults */
|
||||||
ret = init_user (s);
|
ret = init_user (s);
|
||||||
if (ret != SANE_STATUS_GOOD) {
|
if (ret != SANE_STATUS_GOOD) {
|
||||||
|
@ -607,6 +623,7 @@ connect_fd (struct scanner *s)
|
||||||
else if (s->connection == CONNECTION_USB) {
|
else if (s->connection == CONNECTION_USB) {
|
||||||
DBG (15, "connect_fd: opening USB device\n");
|
DBG (15, "connect_fd: opening USB device\n");
|
||||||
ret = sanei_usb_open (s->device_name, &(s->fd));
|
ret = sanei_usb_open (s->device_name, &(s->fd));
|
||||||
|
ret = sanei_usb_clear_halt(s->fd);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
DBG (15, "connect_fd: opening SCSI device\n");
|
DBG (15, "connect_fd: opening SCSI device\n");
|
||||||
|
@ -880,13 +897,17 @@ init_model (struct scanner *s)
|
||||||
s->reverse_by_mode[MODE_COLOR] = 0;
|
s->reverse_by_mode[MODE_COLOR] = 0;
|
||||||
|
|
||||||
s->can_color = 1;
|
s->can_color = 1;
|
||||||
s->has_rif = 1;
|
s->has_rif = 0;
|
||||||
s->has_adf = 1;
|
s->has_adf = 1;
|
||||||
s->has_duplex = 1;
|
s->has_duplex = 1;
|
||||||
s->has_buffer = 1;
|
s->has_buffer = 1;
|
||||||
s->has_back = 0;
|
s->has_back = 0;
|
||||||
s->has_comp_JPEG = 0;
|
s->has_comp_JPEG = 0;
|
||||||
|
|
||||||
|
s->brightness_steps = 255;
|
||||||
|
s->contrast_steps = 255;
|
||||||
|
s->threshold_steps = 255;
|
||||||
|
|
||||||
/* convert to 1200dpi units */
|
/* convert to 1200dpi units */
|
||||||
s->max_x = s->max_x_basic * 1200 / s->basic_x_res;
|
s->max_x = s->max_x_basic * 1200 / s->basic_x_res;
|
||||||
s->max_y = s->max_y_basic * 1200 / s->basic_y_res;
|
s->max_y = s->max_y_basic * 1200 / s->basic_y_res;
|
||||||
|
@ -912,6 +933,24 @@ init_model (struct scanner *s)
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function enables the buttons and preloads the current panel values
|
||||||
|
*/
|
||||||
|
static SANE_Status
|
||||||
|
init_panel (struct scanner *s)
|
||||||
|
{
|
||||||
|
SANE_Status ret = SANE_STATUS_GOOD;
|
||||||
|
|
||||||
|
DBG (10, "init_panel: start\n");
|
||||||
|
|
||||||
|
ret = read_panel(s);
|
||||||
|
ret = send_panel(s);
|
||||||
|
|
||||||
|
DBG (10, "init_panel: finish\n");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* set good default user values.
|
* set good default user values.
|
||||||
* struct is already initialized to 0.
|
* struct is already initialized to 0.
|
||||||
|
@ -1710,6 +1749,51 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
||||||
opt->constraint_type = SANE_CONSTRAINT_NONE;
|
opt->constraint_type = SANE_CONSTRAINT_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(option==OPT_START){
|
||||||
|
opt->name = "start";
|
||||||
|
opt->title = "Start button";
|
||||||
|
opt->desc = "Big green button";
|
||||||
|
opt->type = SANE_TYPE_BOOL;
|
||||||
|
opt->unit = SANE_UNIT_NONE;
|
||||||
|
opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(option==OPT_STOP){
|
||||||
|
opt->name = "stop";
|
||||||
|
opt->title = "Stop button";
|
||||||
|
opt->desc = "Little orange button";
|
||||||
|
opt->type = SANE_TYPE_BOOL;
|
||||||
|
opt->unit = SANE_UNIT_NONE;
|
||||||
|
opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(option==OPT_NEWFILE){
|
||||||
|
opt->name = "newfile";
|
||||||
|
opt->title = "New File button";
|
||||||
|
opt->desc = "New File button";
|
||||||
|
opt->type = SANE_TYPE_BOOL;
|
||||||
|
opt->unit = SANE_UNIT_NONE;
|
||||||
|
opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(option==OPT_COUNTONLY){
|
||||||
|
opt->name = "countonly";
|
||||||
|
opt->title = "Count Only button";
|
||||||
|
opt->desc = "Count Only button";
|
||||||
|
opt->type = SANE_TYPE_BOOL;
|
||||||
|
opt->unit = SANE_UNIT_NONE;
|
||||||
|
opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(option==OPT_BYPASSMODE){
|
||||||
|
opt->name = "bypassmode";
|
||||||
|
opt->title = "Bypass Mode button";
|
||||||
|
opt->desc = "Bypass Mode button";
|
||||||
|
opt->type = SANE_TYPE_BOOL;
|
||||||
|
opt->unit = SANE_UNIT_NONE;
|
||||||
|
opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
|
||||||
|
}
|
||||||
|
|
||||||
if(option==OPT_COUNTER){
|
if(option==OPT_COUNTER){
|
||||||
opt->name = "counter";
|
opt->name = "counter";
|
||||||
opt->title = "Counter";
|
opt->title = "Counter";
|
||||||
|
@ -1723,7 +1807,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
||||||
s->counter_range.quant=1;
|
s->counter_range.quant=1;
|
||||||
|
|
||||||
if (s->has_counter)
|
if (s->has_counter)
|
||||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT;
|
||||||
else
|
else
|
||||||
opt->cap = SANE_CAP_INACTIVE;
|
opt->cap = SANE_CAP_INACTIVE;
|
||||||
}
|
}
|
||||||
|
@ -1947,8 +2031,35 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
/* Sensor Group */
|
/* Sensor Group */
|
||||||
|
case OPT_START:
|
||||||
|
read_panel(s);
|
||||||
|
*val_p = s->panel_start;
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
|
case OPT_STOP:
|
||||||
|
read_panel(s);
|
||||||
|
*val_p = s->panel_stop;
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
|
case OPT_NEWFILE:
|
||||||
|
read_panel(s);
|
||||||
|
*val_p = s->panel_new_file;
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
|
case OPT_COUNTONLY:
|
||||||
|
read_panel(s);
|
||||||
|
*val_p = s->panel_count_only;
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
|
case OPT_BYPASSMODE:
|
||||||
|
read_panel(s);
|
||||||
|
*val_p = s->panel_bypass_mode;
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
case OPT_COUNTER:
|
case OPT_COUNTER:
|
||||||
return read_counter (s,val_p);
|
read_panel(s);
|
||||||
|
*val_p = s->panel_counter;
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2188,7 +2299,8 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
|
|
||||||
/* Sensor Group */
|
/* Sensor Group */
|
||||||
case OPT_COUNTER:
|
case OPT_COUNTER:
|
||||||
return send_counter(s,val_c);
|
s->panel_counter = val_c;
|
||||||
|
return send_panel(s);
|
||||||
}
|
}
|
||||||
} /* else */
|
} /* else */
|
||||||
|
|
||||||
|
@ -2375,65 +2487,73 @@ ssm_do (struct scanner *s)
|
||||||
}
|
}
|
||||||
|
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
read_counter(struct scanner *s,SANE_Word * val_p)
|
read_panel(struct scanner *s)
|
||||||
{
|
{
|
||||||
SANE_Status ret=SANE_STATUS_GOOD;
|
SANE_Status ret=SANE_STATUS_GOOD;
|
||||||
|
|
||||||
unsigned char cmd[READ_len];
|
unsigned char cmd[READ_len];
|
||||||
size_t cmdLen = READ_len;
|
size_t cmdLen = READ_len;
|
||||||
|
|
||||||
unsigned char in[R_COUNTER_len];
|
unsigned char in[R_PANEL_len];
|
||||||
size_t inLen = R_COUNTER_len;
|
size_t inLen = R_PANEL_len;
|
||||||
|
|
||||||
DBG (10, "read_counter: start\n");
|
DBG (10, "read_panel: start\n");
|
||||||
|
|
||||||
memset(cmd,0,cmdLen);
|
/* only run this once every second */
|
||||||
set_SCSI_opcode(cmd, READ_code);
|
if (s->last_panel < time(NULL)) {
|
||||||
set_R_datatype_code (cmd, R_datatype_counter);
|
|
||||||
set_R_xfer_length (cmd, inLen);
|
DBG (15, "read_panel: running\n");
|
||||||
|
memset(cmd,0,cmdLen);
|
||||||
ret = do_cmd (
|
set_SCSI_opcode(cmd, READ_code);
|
||||||
s, 1, 0,
|
set_R_datatype_code (cmd, SR_datatype_panel);
|
||||||
cmd, cmdLen,
|
set_R_xfer_length (cmd, inLen);
|
||||||
NULL, 0,
|
|
||||||
in, &inLen
|
ret = do_cmd (
|
||||||
);
|
s, 1, 0,
|
||||||
|
cmd, cmdLen,
|
||||||
if (ret == SANE_STATUS_GOOD || ret == SANE_STATUS_EOF) {
|
NULL, 0,
|
||||||
DBG(15, "read_counter: got GOOD/EOF, returning GOOD\n");
|
in, &inLen
|
||||||
*val_p = get_R_COUNTER_count(in);
|
);
|
||||||
ret = SANE_STATUS_GOOD;
|
|
||||||
}
|
if (ret == SANE_STATUS_GOOD || ret == SANE_STATUS_EOF) {
|
||||||
else {
|
s->last_panel = time(NULL);
|
||||||
DBG(5, "read_counter: error, status = %d\n",ret);
|
s->panel_start = get_R_PANEL_start(in);
|
||||||
*val_p = -1;
|
s->panel_stop = get_R_PANEL_stop(in);
|
||||||
|
s->panel_new_file = get_R_PANEL_new_file(in);
|
||||||
|
s->panel_count_only = get_R_PANEL_count_only(in);
|
||||||
|
s->panel_bypass_mode = get_R_PANEL_bypass_mode(in);
|
||||||
|
s->panel_enable_led = get_R_PANEL_enable_led(in);
|
||||||
|
s->panel_counter = get_R_PANEL_counter(in);
|
||||||
|
ret = SANE_STATUS_GOOD;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG (10, "read_counter: finish\n");
|
DBG (10, "read_panel: finish\n");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
send_counter(struct scanner *s,SANE_Word val)
|
send_panel(struct scanner *s)
|
||||||
{
|
{
|
||||||
SANE_Status ret=SANE_STATUS_GOOD;
|
SANE_Status ret=SANE_STATUS_GOOD;
|
||||||
|
|
||||||
unsigned char cmd[SEND_len];
|
unsigned char cmd[SEND_len];
|
||||||
size_t cmdLen = SEND_len;
|
size_t cmdLen = SEND_len;
|
||||||
|
|
||||||
unsigned char out[S_COUNTER_len];
|
unsigned char out[S_PANEL_len];
|
||||||
size_t outLen = S_COUNTER_len;
|
size_t outLen = S_PANEL_len;
|
||||||
|
|
||||||
DBG (10, "send_counter: start\n");
|
DBG (10, "send_panel: start\n");
|
||||||
|
|
||||||
memset(cmd,0,cmdLen);
|
memset(cmd,0,cmdLen);
|
||||||
set_SCSI_opcode(cmd, SEND_code);
|
set_SCSI_opcode(cmd, SEND_code);
|
||||||
set_S_xfer_datatype (cmd, S_datatype_counter);
|
set_S_xfer_datatype (cmd, SR_datatype_panel);
|
||||||
set_S_xfer_length (cmd, outLen);
|
set_S_xfer_length (cmd, outLen);
|
||||||
|
|
||||||
memset(out,0,outLen);
|
memset(out,0,outLen);
|
||||||
set_S_COUNTER_count(out,val);
|
set_S_PANEL_enable_led(out,1);
|
||||||
|
set_S_PANEL_counter(out,s->panel_counter);
|
||||||
|
|
||||||
ret = do_cmd (
|
ret = do_cmd (
|
||||||
s, 1, 0,
|
s, 1, 0,
|
||||||
|
@ -2442,12 +2562,11 @@ send_counter(struct scanner *s,SANE_Word val)
|
||||||
NULL, NULL
|
NULL, NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
if (ret == SANE_STATUS_GOOD || ret == SANE_STATUS_EOF) {
|
if (ret == SANE_STATUS_EOF) {
|
||||||
DBG(15, "send_counter: got GOOD/EOF, returning GOOD\n");
|
|
||||||
ret = SANE_STATUS_GOOD;
|
ret = SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG (10, "send_counter: finish %d\n", ret);
|
DBG (10, "send_panel: finish %d\n", ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -3174,7 +3293,7 @@ read_from_scanner(struct scanner *s, int side)
|
||||||
|
|
||||||
memset(cmd,0,cmdLen);
|
memset(cmd,0,cmdLen);
|
||||||
set_SCSI_opcode(cmd, READ_code);
|
set_SCSI_opcode(cmd, READ_code);
|
||||||
set_R_datatype_code (cmd, R_datatype_imagedata);
|
set_R_datatype_code (cmd, SR_datatype_image);
|
||||||
|
|
||||||
set_R_xfer_length (cmd, inLen);
|
set_R_xfer_length (cmd, inLen);
|
||||||
|
|
||||||
|
@ -4018,6 +4137,13 @@ wait_scanner(struct scanner *s)
|
||||||
NULL, NULL
|
NULL, NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ret = do_cmd (
|
||||||
|
s, 0, 1,
|
||||||
|
cmd, cmdLen,
|
||||||
|
NULL, 0,
|
||||||
|
NULL, NULL
|
||||||
|
);
|
||||||
|
|
||||||
if (ret != SANE_STATUS_GOOD) {
|
if (ret != SANE_STATUS_GOOD) {
|
||||||
DBG(5,"WARNING: Brain-dead scanner. Hitting with stick\n");
|
DBG(5,"WARNING: Brain-dead scanner. Hitting with stick\n");
|
||||||
ret = do_cmd (
|
ret = do_cmd (
|
||||||
|
|
|
@ -1,26 +1,6 @@
|
||||||
#ifndef CANON_DR_H
|
#ifndef CANON_DR_H
|
||||||
#define CANON_DR_H
|
#define CANON_DR_H
|
||||||
|
|
||||||
#if V_MINOR == 0
|
|
||||||
#define SANE_NAME_STANDARD "standard"
|
|
||||||
#define SANE_TITLE_STANDARD SANE_I18N("Standard")
|
|
||||||
#define SANE_DESC_STANDARD SANE_I18N("Source, mode and resolution options")
|
|
||||||
#define SANE_NAME_GEOMETRY "geometry"
|
|
||||||
#define SANE_TITLE_GEOMETRY SANE_I18N("Geometry")
|
|
||||||
#define SANE_DESC_GEOMETRY SANE_I18N("Scan area and media size options")
|
|
||||||
#define SANE_NAME_PAGE_WIDTH "page-width"
|
|
||||||
#define SANE_TITLE_PAGE_WIDTH SANE_I18N("Page width")
|
|
||||||
#define SANE_DESC_PAGE_WIDTH \
|
|
||||||
SANE_I18N("Specifies the width of the media. Required for automatic " \
|
|
||||||
"centering of sheet-fed scans.")
|
|
||||||
#define SANE_NAME_PAGE_HEIGHT "page-height"
|
|
||||||
#define SANE_TITLE_PAGE_HEIGHT SANE_I18N("Page height")
|
|
||||||
#define SANE_DESC_PAGE_HEIGHT \
|
|
||||||
SANE_I18N("Specifies the height of the media.")
|
|
||||||
#define SANE_NAME_ENHANCEMENT "enhancement"
|
|
||||||
#define SANE_TITLE_ENHANCEMENT SANE_I18N("Enhancement")
|
|
||||||
#define SANE_DESC_ENHANCEMENT SANE_I18N("Image modification options")
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Part of SANE - Scanner Access Now Easy.
|
* Part of SANE - Scanner Access Now Easy.
|
||||||
* Please see opening comment in canon_dr.c
|
* Please see opening comment in canon_dr.c
|
||||||
|
@ -66,6 +46,11 @@ enum scanner_Option
|
||||||
|
|
||||||
/*sensor group*/
|
/*sensor group*/
|
||||||
OPT_SENSOR_GROUP,
|
OPT_SENSOR_GROUP,
|
||||||
|
OPT_START,
|
||||||
|
OPT_STOP,
|
||||||
|
OPT_NEWFILE,
|
||||||
|
OPT_COUNTONLY,
|
||||||
|
OPT_BYPASSMODE,
|
||||||
OPT_COUNTER,
|
OPT_COUNTER,
|
||||||
|
|
||||||
/* must come last: */
|
/* must come last: */
|
||||||
|
@ -278,10 +263,21 @@ struct scanner
|
||||||
int fds[2];
|
int fds[2];
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
/* values which used by the command and data sending functions (scsi/usb)*/
|
/* values used by the command and data sending functions (scsi/usb) */
|
||||||
int fd; /* The scanner device file descriptor. */
|
int fd; /* The scanner device file descriptor. */
|
||||||
size_t rs_info;
|
size_t rs_info;
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
/* values used to hold hardware or control panel status */
|
||||||
|
|
||||||
|
time_t last_panel;
|
||||||
|
int panel_start;
|
||||||
|
int panel_stop;
|
||||||
|
int panel_new_file;
|
||||||
|
int panel_count_only;
|
||||||
|
int panel_bypass_mode;
|
||||||
|
int panel_enable_led;
|
||||||
|
int panel_counter;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CONNECTION_SCSI 0 /* SCSI interface */
|
#define CONNECTION_SCSI 0 /* SCSI interface */
|
||||||
|
@ -403,6 +399,7 @@ static SANE_Status sense_handler (int scsi_fd, u_char * result, void *arg);
|
||||||
static SANE_Status init_inquire (struct scanner *s);
|
static SANE_Status init_inquire (struct scanner *s);
|
||||||
static SANE_Status init_vpd (struct scanner *s);
|
static SANE_Status init_vpd (struct scanner *s);
|
||||||
static SANE_Status init_model (struct scanner *s);
|
static SANE_Status init_model (struct scanner *s);
|
||||||
|
static SANE_Status init_panel (struct scanner *s);
|
||||||
static SANE_Status init_user (struct scanner *s);
|
static SANE_Status init_user (struct scanner *s);
|
||||||
static SANE_Status init_options (struct scanner *s);
|
static SANE_Status init_options (struct scanner *s);
|
||||||
|
|
||||||
|
@ -442,8 +439,8 @@ int get_page_height (struct scanner *s);
|
||||||
|
|
||||||
static SANE_Status set_window (struct scanner *s);
|
static SANE_Status set_window (struct scanner *s);
|
||||||
|
|
||||||
static SANE_Status read_counter(struct scanner *s, SANE_Word *);
|
static SANE_Status read_panel(struct scanner *s);
|
||||||
static SANE_Status send_counter(struct scanner *s, SANE_Word);
|
static SANE_Status send_panel(struct scanner *s);
|
||||||
|
|
||||||
static SANE_Status start_scan (struct scanner *s);
|
static SANE_Status start_scan (struct scanner *s);
|
||||||
|
|
||||||
|
|
|
@ -83,13 +83,13 @@
|
||||||
:interface "USB SCSI"
|
:interface "USB SCSI"
|
||||||
:usbid "0x04a9" "0x160b"
|
:usbid "0x04a9" "0x160b"
|
||||||
:status :good
|
:status :good
|
||||||
:comment "Simplex, duplex, dropout-color, multifeed detection and JPEG working, imprinter unsupported"
|
:comment "Simplex, duplex, all resolutions, binary/ht/gray, async mode, dropout-color, multifeed detection, buttons and gray JPEG working, imprinter unsupported"
|
||||||
|
|
||||||
:model "DR-9080C"
|
:model "DR-9080C"
|
||||||
:interface "USB SCSI"
|
:interface "USB SCSI"
|
||||||
:usbid "0x04a9" "0x1603"
|
:usbid "0x04a9" "0x1603"
|
||||||
:status :good
|
:status :good
|
||||||
:comment "Simplex, duplex, dropout-color, multifeed detection and JPEG working, imprinter unsupported"
|
:comment "Simplex, duplex, all resolutions, binary/ht/gray/color, async mode, dropout-color, multifeed detection, buttons and gray JPEG working, imprinter unsupported, color JPEG broken"
|
||||||
|
|
||||||
:model "DR-X10C"
|
:model "DR-X10C"
|
||||||
:interface "USB SCSI"
|
:interface "USB SCSI"
|
||||||
|
|
|
@ -10,10 +10,10 @@ The
|
||||||
library implements a SANE (Scanner Access Now Easy) backend which
|
library implements a SANE (Scanner Access Now Easy) backend which
|
||||||
provides access to some Canon DR-series scanners.
|
provides access to some Canon DR-series scanners.
|
||||||
|
|
||||||
This document describes backend version 3, slated to ship with SANE 1.1.0.
|
This document describes backend version 8, slated to ship with SANE 1.1.0.
|
||||||
|
|
||||||
.SH SUPPORTED HARDWARE
|
.SH SUPPORTED HARDWARE
|
||||||
This version has only been tested with the DR\-9080C and DR\-7580C. Please see
|
This version has only been tested with the DR\-9080C and DR\-7580. Please see
|
||||||
http://www.sane\-project.org/sane\-supported\-devices.html for a more recent
|
http://www.sane\-project.org/sane\-supported\-devices.html for a more recent
|
||||||
list.
|
list.
|
||||||
|
|
||||||
|
@ -56,9 +56,7 @@ coordinates when using ADF and to detect double feed errors.
|
||||||
.RE
|
.RE
|
||||||
.PP
|
.PP
|
||||||
Other options will be available based on the capabilities of the scanner:
|
Other options will be available based on the capabilities of the scanner:
|
||||||
machines with IPC or DTC will have additional enhancement options, those
|
enhancement, compression, buttons and sensors, etc.
|
||||||
with CMP will have compression options, those with a printer will have a
|
|
||||||
group of endorser options.
|
|
||||||
|
|
||||||
Use 'scanimage \-\-help' to get a list, but be aware that some options may
|
Use 'scanimage \-\-help' to get a list, but be aware that some options may
|
||||||
be settable only when another option has been set, and that advanced options
|
be settable only when another option has been set, and that advanced options
|
||||||
|
@ -74,7 +72,7 @@ are identical to the default configuration file shipped with SANE.
|
||||||
.PP
|
.PP
|
||||||
Scanners can be specified in the configuration file in 4 ways:
|
Scanners can be specified in the configuration file in 4 ways:
|
||||||
.PP
|
.PP
|
||||||
"scsi CANON DR"
|
"scsi CANON"
|
||||||
.RS
|
.RS
|
||||||
Requests backend to search all scsi busses in the system for a device
|
Requests backend to search all scsi busses in the system for a device
|
||||||
which reports itself to be a scanner made by 'CANON', with a model name
|
which reports itself to be a scanner made by 'CANON', with a model name
|
||||||
|
|
Ładowanie…
Reference in New Issue