sane-project-backends/backend/epson2.h

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