kopia lustrzana https://gitlab.com/sane-project/backends
426 wiersze
12 KiB
C
426 wiersze
12 KiB
C
/*
|
|
* epson2.h - SANE library for Epson scanners.
|
|
*
|
|
* Based on Kazuhiro Sasayama previous
|
|
* Work on epson.[ch] file from the SANE package.
|
|
* Please see those files for original copyrights.
|
|
*
|
|
* Copyright (C) 2006 Tower Technologies
|
|
* Author: Alessandro Zummo <a.zummo@towertech.it>
|
|
*
|
|
* This file is part of the SANE package.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation, version 2.
|
|
*/
|
|
|
|
#ifndef epson2_h
|
|
#define epson2_h
|
|
|
|
#undef BACKEND_NAME
|
|
#define BACKEND_NAME epson2
|
|
#define DEBUG_NOT_STATIC
|
|
|
|
#ifdef HAVE_SYS_IOCTL_H
|
|
#include <sys/ioctl.h>
|
|
#endif
|
|
|
|
#ifdef HAVE_STDDEF_H
|
|
#include <stddef.h>
|
|
#endif
|
|
|
|
#ifdef HAVE_STDLIB_H
|
|
#include <stdlib.h>
|
|
#endif
|
|
|
|
#ifdef NEED_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
|
|
#include <string.h> /* for memset and memcpy */
|
|
#include <stdio.h>
|
|
|
|
#include "sane/sane.h"
|
|
#include "sane/sanei_backend.h"
|
|
#include "sane/sanei_debug.h"
|
|
|
|
#ifdef __GNUC__
|
|
#define __func__ __FUNCTION__
|
|
#else
|
|
#define __func__ "(undef)"
|
|
/* I cast my vote for C99... :) */
|
|
#endif
|
|
|
|
#define EPSON2_CONFIG_FILE "epson2.conf"
|
|
|
|
#ifndef PATH_MAX
|
|
#define PATH_MAX (1024)
|
|
#endif
|
|
|
|
#ifndef XtNumber
|
|
#define XtNumber(x) (sizeof(x) / sizeof(x[0]))
|
|
#define XtOffset(p_type, field) ((size_t)&(((p_type)NULL)->field))
|
|
#define XtOffsetOf(s_type, field) XtOffset(s_type*, field)
|
|
#endif
|
|
|
|
#define NUM_OF_HEX_ELEMENTS (16) /* number of hex numbers per line for data dump */
|
|
#define DEVICE_NAME_LEN (16) /* length of device name in extended status */
|
|
|
|
|
|
/* string constants for GUI elements that are not defined SANE-wide */
|
|
|
|
#define SANE_NAME_GAMMA_CORRECTION "gamma-correction"
|
|
#define SANE_TITLE_GAMMA_CORRECTION SANE_I18N("Gamma Correction")
|
|
#define SANE_DESC_GAMMA_CORRECTION SANE_I18N("Selects the gamma correction value from a list of pre-defined devices or the user defined table, which can be downloaded to the scanner")
|
|
|
|
#define SANE_EPSON_FOCUS_NAME "focus-position"
|
|
#define SANE_EPSON_FOCUS_TITLE SANE_I18N("Focus Position")
|
|
#define SANE_EPSON_FOCUS_DESC SANE_I18N("Sets the focus position to either the glass or 2.5mm above the glass")
|
|
#define SANE_EPSON_WAIT_FOR_BUTTON_NAME "wait-for-button"
|
|
#define SANE_EPSON_WAIT_FOR_BUTTON_TITLE SANE_I18N("Wait for Button")
|
|
#define SANE_EPSON_WAIT_FOR_BUTTON_DESC SANE_I18N("After sending the scan command, wait until the button on the scanner is pressed to actually start the scan process.");
|
|
|
|
/* misc constants */
|
|
|
|
#define LINES_SHUFFLE_MAX 17 /* 2 x 8 lines plus 1 */
|
|
#define SANE_EPSON_MAX_RETRIES 14 /* warmup max retry */
|
|
#define CMD_SIZE_EXT_STATUS 42
|
|
|
|
/* NOTE: you can find these codes with "man ascii". */
|
|
#define STX 0x02
|
|
#define ACK 0x06
|
|
#define NAK 0x15
|
|
#define CAN 0x18
|
|
#define ESC 0x1B
|
|
#define PF 0x19
|
|
#define FS 0x1C
|
|
|
|
#define S_ACK "\006"
|
|
#define S_CAN "\030"
|
|
|
|
/* status bits */
|
|
|
|
#define STATUS_FER 0x80 /* fatal error */
|
|
#define STATUS_NOT_READY 0x40 /* scanner is in use on another interface */
|
|
#define STATUS_AREA_END 0x20 /* area end */
|
|
#define STATUS_OPTION 0x10 /* option installed */
|
|
#define STATUS_EXT_COMMANDS 0x02 /* scanners supports extended commands */
|
|
#define STATUS_RESERVED 0x01 /* this should be always 0 */
|
|
|
|
#define EXT_STATUS_FER 0x80 /* fatal error */
|
|
#define EXT_STATUS_FBF 0x40 /* flat bed scanner */
|
|
#define EXT_STATUS_ADFT 0x20 /* page type ADF */
|
|
#define EXT_STATUS_ADFS 0x10 /* ADF is duplex capable */
|
|
#define EXT_STATUS_ADFO 0x08 /* ADF loads from the first sheet (page type only) */
|
|
#define EXT_STATUS_LID 0x04 /* lid is open */
|
|
#define EXT_STATUS_WU 0x02 /* warming up */
|
|
#define EXT_STATUS_PB 0x01 /* scanner has a push button */
|
|
|
|
#define EXT_STATUS_IST 0x80 /* option detected */
|
|
#define EXT_STATUS_EN 0x40 /* option enabled */
|
|
#define EXT_STATUS_ERR 0x20 /* other error */
|
|
#define EXT_STATUS_PE 0x08 /* no paper */
|
|
#define EXT_STATUS_PJ 0x04 /* paper jam */
|
|
#define EXT_STATUS_OPN 0x02 /* cover open */
|
|
|
|
#define EXT_IDTY_CAP1_DLF 0x80
|
|
#define EXT_IDTY_CAP1_NOTFBF 0x40 /* not a flat bed scanner */
|
|
#define EXT_IDTY_CAP1_ADFT 0x20 /* page type ADF ? */
|
|
#define EXT_IDTY_CAP1_ADFS 0x10 /* ADF is duplex capable */
|
|
#define EXT_IDTY_CAP1_ADFO 0x08 /* ADF loads from the first sheet (page type only) */
|
|
#define EXT_IDTY_CAP1_LID 0x04 /* lid type option ? */
|
|
#define EXT_IDTY_CAP1_TPIR 0x02 /* TPU with infrared */
|
|
#define EXT_IDTY_CAP1_PB 0x01 /* scanner has a push button */
|
|
|
|
#define EXT_IDTY_CAP2_AFF 0x04 /* auto form feed */
|
|
#define EXT_IDTY_CAP2_DFD 0x08 /* double feed detection */
|
|
#define EXT_IDTY_CAP2_ADFAS 0x10 /* ADF with auto scan support */
|
|
|
|
#define FSF_STATUS_MAIN_FER 0x80 /* system error */
|
|
#define FSF_STATUS_MAIN_NR 0x40 /* not ready */
|
|
#define FSF_STATUS_MAIN_WU 0x02 /* warming up */
|
|
#define FSF_STATUS_MAIN_CWU 0x01 /* warm up can be cancelled (?) */
|
|
|
|
#define FSF_STATUS_ADF_IST 0x80 /* installed */
|
|
#define FSF_STATUS_ADF_EN 0x40 /* enabled */
|
|
#define FSF_STATUS_ADF_ERR 0x20 /* system error */
|
|
#define FSF_STATUS_ADF_PE 0x08 /* paper empty */
|
|
#define FSF_STATUS_ADF_PJ 0x04 /* paper jam */
|
|
#define FSF_STATUS_ADF_OPN 0x02 /* cover open */
|
|
#define FSF_STATUS_ADF_PAG 0x01 /* duplex */
|
|
|
|
#define FSF_STATUS_TPU_IST 0x80 /* installed */
|
|
#define FSF_STATUS_TPU_EN 0x40 /* enabled */
|
|
#define FSF_STATUS_TPU_ERR 0x20 /* system error */
|
|
#define FSF_STATUS_TPU_OPN 0x02 /* cover open */
|
|
|
|
#define FSF_STATUS_MAIN2_ERR 0x20 /* system error */
|
|
#define FSF_STATUS_MAIN2_PE 0x08 /* paper empty */
|
|
#define FSF_STATUS_MAIN2_PJ 0x04 /* paper jam */
|
|
#define FSF_STATUS_MAIN2_OPN 0x02 /* cover open */
|
|
|
|
#define FSG_STATUS_FER 0x80
|
|
#define FSG_STATUS_NOT_READY 0x40 /* in use via other interface */
|
|
#define FSG_STATUS_CANCEL_REQ 0x10 /* cancel request from scanner */
|
|
|
|
#define EPSON_LEVEL_A1 0
|
|
#define EPSON_LEVEL_A2 1
|
|
#define EPSON_LEVEL_B1 2
|
|
#define EPSON_LEVEL_B2 3
|
|
#define EPSON_LEVEL_B3 4
|
|
#define EPSON_LEVEL_B4 5
|
|
#define EPSON_LEVEL_B5 6
|
|
#define EPSON_LEVEL_B6 7
|
|
#define EPSON_LEVEL_B7 8
|
|
#define EPSON_LEVEL_B8 9
|
|
#define EPSON_LEVEL_F5 10
|
|
#define EPSON_LEVEL_D1 11
|
|
#define EPSON_LEVEL_D7 12
|
|
#define EPSON_LEVEL_D8 13
|
|
|
|
/* there is also a function level "A5", which I'm igoring here until somebody can
|
|
* convince me that this is still needed. The A5 level was for the GT-300, which
|
|
* was (is) a monochrome only scanner. So if somebody really wants to use this
|
|
* scanner with SANE get in touch with me and we can work something out - khk
|
|
*/
|
|
|
|
#define EPSON_LEVEL_DEFAULT EPSON_LEVEL_B3
|
|
|
|
struct EpsonCmd
|
|
{
|
|
char *level;
|
|
|
|
unsigned char request_identity;
|
|
unsigned char request_identity2; /* new request identity level Dx */
|
|
unsigned char request_status;
|
|
unsigned char request_condition;
|
|
unsigned char set_color_mode;
|
|
unsigned char start_scanning;
|
|
unsigned char set_data_format;
|
|
unsigned char set_resolution;
|
|
unsigned char set_zoom;
|
|
unsigned char set_scan_area;
|
|
unsigned char set_bright;
|
|
SANE_Range bright_range;
|
|
unsigned char set_gamma;
|
|
unsigned char set_halftoning;
|
|
unsigned char set_color_correction;
|
|
unsigned char initialize_scanner;
|
|
unsigned char set_speed; /* B4 and later */
|
|
unsigned char set_lcount;
|
|
unsigned char mirror_image; /* B5 and later */
|
|
unsigned char set_gamma_table; /* B4 and later */
|
|
unsigned char set_outline_emphasis; /* B4 and later */
|
|
unsigned char set_dither; /* B4 and later */
|
|
unsigned char set_color_correction_coefficients; /* B3 and later */
|
|
unsigned char request_extended_status; /* get extended status from scanner */
|
|
unsigned char control_an_extension; /* for extension control */
|
|
unsigned char eject; /* for extension control */
|
|
unsigned char feed;
|
|
unsigned char request_push_button_status;
|
|
unsigned char control_auto_area_segmentation;
|
|
unsigned char set_film_type; /* for extension control */
|
|
unsigned char set_exposure_time; /* F5 only */
|
|
unsigned char set_bay; /* F5 only */
|
|
unsigned char set_threshold;
|
|
unsigned char set_focus_position; /* B8 only */
|
|
unsigned char request_focus_position; /* B8 only */
|
|
unsigned char request_extended_identity;
|
|
unsigned char request_scanner_status;
|
|
};
|
|
|
|
enum {
|
|
OPT_NUM_OPTS = 0,
|
|
OPT_MODE_GROUP,
|
|
OPT_MODE,
|
|
OPT_BIT_DEPTH,
|
|
OPT_HALFTONE,
|
|
OPT_DROPOUT,
|
|
OPT_BRIGHTNESS,
|
|
OPT_SHARPNESS,
|
|
OPT_GAMMA_CORRECTION,
|
|
OPT_COLOR_CORRECTION,
|
|
OPT_RESOLUTION,
|
|
OPT_THRESHOLD,
|
|
OPT_ADVANCED_GROUP,
|
|
OPT_MIRROR,
|
|
OPT_AAS,
|
|
OPT_GAMMA_VECTOR_R,
|
|
OPT_GAMMA_VECTOR_G,
|
|
OPT_GAMMA_VECTOR_B,
|
|
OPT_WAIT_FOR_BUTTON,
|
|
OPT_CCT_GROUP,
|
|
OPT_CCT_MODE,
|
|
OPT_CCT_PROFILE,
|
|
OPT_PREVIEW_GROUP,
|
|
OPT_PREVIEW,
|
|
OPT_GEOMETRY_GROUP,
|
|
OPT_TL_X,
|
|
OPT_TL_Y,
|
|
OPT_BR_X,
|
|
OPT_BR_Y,
|
|
OPT_EQU_GROUP,
|
|
OPT_SOURCE,
|
|
OPT_AUTO_EJECT,
|
|
OPT_FILM_TYPE,
|
|
OPT_FOCUS,
|
|
OPT_BAY,
|
|
OPT_EJECT,
|
|
OPT_ADF_MODE,
|
|
NUM_OPTIONS
|
|
};
|
|
|
|
typedef enum
|
|
{ /* hardware connection to the scanner */
|
|
SANE_EPSON_NODEV, /* default, no HW specified yet */
|
|
SANE_EPSON_SCSI, /* SCSI interface */
|
|
SANE_EPSON_PIO, /* parallel interface */
|
|
SANE_EPSON_USB, /* USB interface */
|
|
SANE_EPSON_NET /* network interface */
|
|
} Epson_Connection_Type;
|
|
|
|
struct epson_profile
|
|
{
|
|
unsigned int model;
|
|
double cct[4][9];
|
|
};
|
|
|
|
enum {
|
|
CCTP_REFLECTIVE = 0, CCTP_COLORNEG,
|
|
CCTP_MONONEG, CCTP_COLORPOS
|
|
};
|
|
|
|
struct epson_profile_map
|
|
{
|
|
char *name;
|
|
unsigned int id;
|
|
};
|
|
|
|
extern const struct epson_profile epson_cct_profiles[];
|
|
extern const struct epson_profile_map epson_cct_models[];
|
|
|
|
/* hardware description */
|
|
|
|
struct Epson_Device
|
|
{
|
|
struct Epson_Device *next;
|
|
|
|
char *name;
|
|
char *model;
|
|
|
|
unsigned int model_id;
|
|
|
|
SANE_Device sane;
|
|
SANE_Int level;
|
|
SANE_Range dpi_range;
|
|
|
|
SANE_Range *x_range; /* x range w/out extension */
|
|
SANE_Range *y_range; /* y range w/out extension */
|
|
|
|
SANE_Range fbf_x_range; /* flattbed x range */
|
|
SANE_Range fbf_y_range; /* flattbed y range */
|
|
SANE_Range adf_x_range; /* autom. document feeder x range */
|
|
SANE_Range adf_y_range; /* autom. document feeder y range */
|
|
SANE_Range tpu_x_range; /* transparency unit x range */
|
|
SANE_Range tpu_y_range; /* transparency unit y range */
|
|
SANE_Range tpu2_x_range; /* transparency unit 2 x range */
|
|
SANE_Range tpu2_y_range; /* transparency unit 2 y range */
|
|
|
|
Epson_Connection_Type connection;
|
|
|
|
SANE_Int *res_list; /* list of resolutions */
|
|
SANE_Int res_list_size; /* number of entries in this list */
|
|
SANE_Int last_res; /* last selected resolution */
|
|
SANE_Int last_res_preview; /* last selected preview resolution */
|
|
|
|
SANE_Word *resolution_list; /* for display purposes we store a second copy */
|
|
|
|
SANE_Bool extension; /* extension is installed */
|
|
SANE_Int use_extension; /* use the installed extension */
|
|
SANE_Bool TPU; /* TPU is installed */
|
|
SANE_Bool TPU2; /* TPU2 is installed */
|
|
SANE_Bool ADF; /* ADF is installed */
|
|
SANE_Bool duplex; /* does the ADF handle duplex scanning */
|
|
SANE_Bool focusSupport; /* does this scanner have support for "set focus position" ? */
|
|
SANE_Bool color_shuffle; /* does this scanner need color shuffling */
|
|
|
|
SANE_Int maxDepth; /* max. color depth */
|
|
SANE_Word *depth_list;
|
|
|
|
SANE_Int optical_res; /* optical resolution */
|
|
SANE_Int max_line_distance;
|
|
|
|
SANE_Bool need_double_vertical;
|
|
SANE_Bool need_color_reorder;
|
|
SANE_Bool need_reset_on_source_change;
|
|
|
|
SANE_Bool wait_for_button; /* do we have to wait until the scanner button is pressed? */
|
|
|
|
SANE_Bool extended_commands;
|
|
|
|
struct EpsonCmd *cmd;
|
|
const struct epson_profile *cct_profile;
|
|
};
|
|
|
|
typedef struct Epson_Device Epson_Device;
|
|
|
|
/* an instance of a scanner */
|
|
|
|
struct Epson_Scanner
|
|
{
|
|
struct Epson_Scanner *next;
|
|
struct Epson_Device *hw;
|
|
|
|
int fd;
|
|
|
|
SANE_Option_Descriptor opt[NUM_OPTIONS];
|
|
Option_Value val[NUM_OPTIONS];
|
|
SANE_Parameters params;
|
|
|
|
SANE_Bool block;
|
|
SANE_Bool eof;
|
|
SANE_Byte *buf, *end, *ptr;
|
|
SANE_Bool canceling;
|
|
SANE_Word gamma_table[3][256];
|
|
SANE_Word cct_table[9];
|
|
SANE_Int retry_count;
|
|
|
|
/* buffer lines for color shuffling */
|
|
SANE_Byte *line_buffer[LINES_SHUFFLE_MAX];
|
|
SANE_Int color_shuffle_line; /* current line number for color shuffling */
|
|
SANE_Int line_distance; /* current line distance */
|
|
SANE_Int current_output_line; /* line counter when color shuffling */
|
|
SANE_Int lines_written; /* debug variable */
|
|
|
|
SANE_Int left, top, lcount;
|
|
SANE_Bool focusOnGlass;
|
|
SANE_Byte currentFocusPosition;
|
|
|
|
/* network buffers */
|
|
unsigned char *netbuf, *netptr;
|
|
size_t netlen;
|
|
|
|
/* extended image data handshaking */
|
|
SANE_Int ext_block_len;
|
|
SANE_Int ext_last_len;
|
|
SANE_Int ext_blocks;
|
|
SANE_Int ext_counter;
|
|
};
|
|
|
|
typedef struct Epson_Scanner Epson_Scanner;
|
|
|
|
struct mode_param
|
|
{
|
|
int color;
|
|
int flags;
|
|
int dropout_mask;
|
|
int depth;
|
|
};
|
|
|
|
enum {
|
|
MODE_BINARY, MODE_GRAY, MODE_COLOR, MODE_INFRARED
|
|
};
|
|
|
|
#endif
|