aboutsummaryrefslogtreecommitdiff
path: root/backend/device.h
blob: 739429e9dd37247a2fcc60aaad5963cd5c485f5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
/*  device.h -- physical device representation
 *  Copyright (C) 2008, 2009, 2014  SEIKO EPSON CORPORATION
 *
 *  License: GPLv2+|iscan
 *  Authors: AVASYS CORPORATION
 *
 *  This file is part of the SANE backend distributed with Image Scan!
 *
 *  Image Scan!'s SANE backend 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;
 *  either version 2 of the License or at your option any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *  You ought to have received a copy of the GNU General Public License
 *  along with this package.  If not, see <http://www.gnu.org/licenses/>.
 *
 *
 *  Linking Image Scan!'s SANE backend statically or dynamically with
 *  other modules is making a combined work based on this SANE backend.
 *  Thus, the terms and conditions of the GNU General Public License
 *  cover the whole combination.
 *
 *  As a special exception, the copyright holders of Image Scan!'s SANE
 *  backend give you permission to link Image Scan!'s SANE backend with
 *  SANE frontends that communicate with Image Scan!'s SANE backend
 *  solely through the SANE Application Programming Interface,
 *  regardless of the license terms of these SANE frontends, and to
 *  copy and distribute the resulting combined work under terms of your
 *  choice, provided that every copy of the combined work is
 *  accompanied by a complete copy of the source code of Image Scan!'s
 *  SANE backend (the version of Image Scan!'s SANE backend used to
 *  produce the combined work), being distributed under the terms of
 *  the GNU General Public License plus this exception.  An independent
 *  module is a module which is not derived from or based on Image
 *  Scan!'s SANE backend.
 *
 *  As a special exception, the copyright holders of Image Scan!'s SANE
 *  backend give you permission to link Image Scan!'s SANE backend with
 *  independent modules that communicate with Image Scan!'s SANE
 *  backend solely through the "Interpreter" interface, regardless of
 *  the license terms of these independent modules, and to copy and
 *  distribute the resulting combined work under terms of your choice,
 *  provided that every copy of the combined work is accompanied by a
 *  complete copy of the source code of Image Scan!'s SANE backend (the
 *  version of Image Scan!'s SANE backend used to produce the combined
 *  work), being distributed under the terms of the GNU General Public
 *  License plus this exception.  An independent module is a module
 *  which is not derived from or based on Image Scan!'s SANE backend.
 *
 *  Note that people who make modified versions of Image Scan!'s SANE
 *  backend are not obligated to grant special exceptions for their
 *  modified versions; it is their choice whether to do so.  The GNU
 *  General Public License gives permission to release a modified
 *  version without this exception; this exception also makes it
 *  possible to release a modified version which carries forward this
 *  exception.
 */


#ifndef device_h_included
#define device_h_included

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif


#include "channel.h"
#include "extension.h"

#define DEVNAME_LENGTH	16


typedef struct
{
  char *level;

  unsigned char request_identity;
  unsigned char request_identity2;	/* new request identity command for Dx command level */
  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 */
} EpsonCmdRec, *EpsonCmd;

typedef struct
{
  SANE_Int   last;
  SANE_Int   size;
  SANE_Word *list;
  SANE_Bool  deep;
} resolution_info;

typedef struct
{
  int modelID;

  double color_profile[4][9];
} EpsonScanHardRec, *EpsonScanHard;


/*! Software abstraction of the \e physical device.
 */
struct device
{
  struct channel *channel;      /*<! for all device I/O */

  char  cmd_lvl[2+1];           /* +1 for string termination */
  char  version[4+1];           /* +1 for string termination */
  char *fw_name;                /*!< model name reported by firmware */

  SANE_Byte status;             /*!< info block status byte  */
  SANE_Byte ext_status;
  SANE_Byte fsf_status;
  SANE_Byte fsi_cap_1;
  SANE_Byte fsi_cap_2;
  SANE_Byte fsi_cap_3;

  const extension *src;         /*!< current document source */
  fbf_extension   *fbf;         /*!< \c NULL if not available */
  adf_extension   *adf;         /*!< \c NULL if not available */
  tpu_extension   *tpu;         /*!< \c NULL if not available */

  /*! \brief Selectable scan sources.
   *  A \c NULL terminated list of up to three scan sources.  Which
   *  ones are listed depends on device capabilities.
   */
  SANE_String_Const sources[4];

  resolution_info resolution;   /* full-blown list */
  resolution_info res;          /* advertised list */
  SANE_Int max_x;               /* in pixels */
  SANE_Int max_y;

  SANE_Int  optical_res;        /* resolution in pixels per inch */
  SANE_Byte sensor_info;
  SANE_Byte scan_order;
  SANE_Byte line_dist_x;
  SANE_Byte line_dist_y;
  resolution_info res_x;
  resolution_info res_y;


  SANE_Int level;
  SANE_Range dpi_range;

  SANE_Range matrix_range;

  const int       *gamma_type;
  const SANE_Bool *gamma_user_defined;

  const int       *color_type;
  const SANE_Bool *color_user_defined;

  SANE_Bool color_shuffle;	/* does this scanner need color shuffling */
  SANE_Int maxDepth;		/* max. color depth */

  SANE_Int max_line_distance;

  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_Int doctype;

  unsigned int productID;

  EpsonCmd cmd;
  const EpsonScanHardRec *scan_hard;

  SANE_Bool using_fs; /*! determines whether to use fs commands */

  SANE_Bool block_mode;
  uint32_t  image_block_size;
  uint32_t  final_block_size;
  uint32_t  block_total;        /* does NOT include final block! */
  uint32_t  block_count;

  unsigned char param_buf[64]; /*! holds the FS W parameter buffer */

  SANE_Int scan_width_limit;

  SANE_Int base_res;  /*! resolution at which the max scan area is defined */

  SANE_Int old_max; /*! used to restore after limiting resolutions */

  SANE_Int polling_time;

  bool uses_locking;
  bool is_locked;
};

typedef struct device device;

device *dev_dtor (device *hw);

SANE_Status dev_request_extended_status (device *hw);
SANE_Status dev_load_paper (device *hw);
SANE_Status dev_eject_paper (device *hw);
SANE_Status dev_open (device *hw);

/* FS W/S related functions */
SANE_Status dev_log_scanning_parameter (device *hw);
SANE_Status dev_set_scanning_parameter (device *hw,
                                        byte cmd,
                                        const byte* param);
SANE_Status dev_set_scanning_resolution (device *hw, SANE_Int x_dpi,
                                         SANE_Int y_dpi);
SANE_Status dev_set_scanning_area (device *hw,
                                   SANE_Int left, SANE_Int top,
                                   SANE_Int width, SANE_Int height);
SANE_Status dev_set_option_unit (device *hw, byte adf_mode);

/* other */

/*! supports workarounds to temporarily limit resolution lists */
void dev_limit_res (device *self, SANE_Constraint_Type type, int limit);

/*! restore original resolution list after it has been limited */
void dev_restore_res (device *self, SANE_Constraint_Type type);

bool dev_force_cancel (device *self);

SANE_Status dev_lock (device *hw);
SANE_Status dev_unlock (device *hw);

SANE_Status dev_clean (device *hw);
SANE_Status dev_calibrate (device *hw);

#endif  /* !defined (device_h_included) */