• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * epsonds.c - Epson ESC/I-2 driver.
3  *
4  * Copyright (C) 2015 Tower Technologies
5  * Author: Alessandro Zummo <a.zummo@towertech.it>
6  *
7  * This file is part of the SANE package.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation, version 2.
12  */
13 
14 #ifndef epsonds_h
15 #define epsonds_h
16 
17 #undef BACKEND_NAME
18 #define BACKEND_NAME epsonds
19 #define DEBUG_NOT_STATIC
20 
21 #define mode_params epsonds_mode_params
22 #define source_list epsonds_source_list
23 
24 #ifdef HAVE_SYS_IOCTL_H
25 #include <sys/ioctl.h>
26 #endif
27 
28 #ifdef HAVE_STDDEF_H
29 #include <stddef.h>
30 #endif
31 
32 #ifdef HAVE_STDLIB_H
33 #include <stdlib.h>
34 #endif
35 
36 #ifdef NEED_SYS_TYPES_H
37 #include <sys/types.h>
38 #endif
39 
40 #include <string.h> /* for memset and memcpy */
41 #include <stdio.h>
42 
43 #include "sane/sane.h"
44 #include "sane/sanei_backend.h"
45 #include "sane/sanei_debug.h"
46 #include "sane/sanei_usb.h"
47 #include "sane/sanei_jpeg.h"
48 
49 #define EPSONDS_CONFIG_FILE "epsonds.conf"
50 
51 #ifndef PATH_MAX
52 #define PATH_MAX (1024)
53 #endif
54 
55 #ifndef XtNumber
56 #define XtNumber(x)  (sizeof(x) / sizeof(x[0]))
57 #define XtOffset(p_type, field)  ((size_t)&(((p_type)NULL)->field))
58 #define XtOffsetOf(s_type, field)  XtOffset(s_type*, field)
59 #endif
60 
61 #define ACK	0x06
62 #define NAK	0x15
63 #define	FS	0x1C
64 
65 #define FBF_STR SANE_I18N("Flatbed")
66 #define TPU_STR SANE_I18N("Transparency Unit")
67 #define ADF_STR SANE_I18N("Automatic Document Feeder")
68 
69 #define STRING_FLATBED SANE_I18N("Flatbed")
70 #define STRING_ADFFRONT SANE_I18N("ADF Front")
71 #define STRING_ADFDUPLEX SANE_I18N("ADF Duplex")
72 
73 enum {
74 	OPT_NUM_OPTS = 0,
75 	OPT_STANDARD_GROUP,
76 	OPT_SOURCE,
77 	OPT_MODE,
78 	OPT_DEPTH,
79 	OPT_RESOLUTION,
80 	OPT_GEOMETRY_GROUP,
81 	OPT_TL_X,
82 	OPT_TL_Y,
83 	OPT_BR_X,
84 	OPT_BR_Y,
85 	OPT_EQU_GROUP,
86 	OPT_EJECT,
87 	OPT_LOAD,
88 	OPT_ADF_SKEW,
89 	OPT_ADF_CRP,
90 	NUM_OPTIONS
91 };
92 
93 typedef enum
94 {	/* hardware connection to the scanner */
95 	SANE_EPSONDS_NODEV,	/* default, no HW specified yet */
96 	SANE_EPSONDS_USB,	/* USB interface */
97 	SANE_EPSONDS_NET	/* network interface */
98 } epsonds_conn_type;
99 
100 /* hardware description */
101 
102 struct epsonds_device
103 {
104 	struct epsonds_device *next;
105 
106 	epsonds_conn_type connection;
107 
108 	char *name;
109 	char *model;
110 
111 	unsigned int model_id;
112 
113 	SANE_Device sane;
114 	SANE_Range *x_range;
115 	SANE_Range *y_range;
116 	SANE_Range dpi_range;
117 	SANE_Byte alignment;
118 
119 
120 	SANE_Int *res_list;		/* list of resolutions */
121 	SANE_Int *depth_list;
122 	SANE_Int max_depth;		/* max. color depth */
123 
124 	SANE_Bool has_raw;		/* supports RAW format */
125 
126 	SANE_Bool has_mono;  /*supprt M001*/
127 
128 	SANE_Bool has_fb;		/* flatbed */
129 	SANE_Range fbf_x_range;	        /* x range */
130 	SANE_Range fbf_y_range;	        /* y range */
131 	SANE_Byte fbf_alignment;	/* left, center, right */
132 	SANE_Bool fbf_has_skew;		/* supports skew correction */
133 
134 	SANE_Bool has_adf;		/* adf */
135 	SANE_Range adf_x_range;	        /* x range */
136 	SANE_Range adf_y_range;	        /* y range */
137 	SANE_Bool adf_is_duplex;	/* supports duplex mode */
138 	SANE_Bool adf_singlepass;	/* supports single pass duplex */
139 	SANE_Bool adf_has_skew;		/* supports skew correction */
140 	SANE_Bool adf_has_load;		/* supports load command */
141 	SANE_Bool adf_has_eject;	/* supports eject command */
142 	SANE_Byte adf_alignment;	/* left, center, right */
143 	SANE_Byte adf_has_dfd;		/* supports double feed detection */
144 
145 	SANE_Byte adf_has_crp;		/* supports crp */
146 
147 	SANE_Bool has_tpu;		/* tpu */
148 	SANE_Range tpu_x_range;	        /* transparency unit x range */
149 	SANE_Range tpu_y_range;	        /* transparency unit y range */
150 
151 	SANE_Int lut_id;
152 };
153 
154 typedef struct epsonds_device epsonds_device;
155 
156 typedef struct ring_buffer
157 {
158 	SANE_Byte *ring, *wp, *rp, *end;
159 	SANE_Int fill, size;
160 
161 } ring_buffer;
162 
163 /* an instance of a scanner */
164 
165 struct epsonds_scanner
166 {
167 	struct epsonds_scanner *next;
168 	struct epsonds_device *hw;
169 
170 	int fd;
171 
172 	SANE_Option_Descriptor opt[NUM_OPTIONS];
173 	Option_Value val[NUM_OPTIONS];
174 	SANE_Parameters params;
175 
176 	size_t bsz;		/* transfer buffer size */
177 	SANE_Byte *buf, *line_buffer;
178 	ring_buffer *current, front, back;
179 
180 	SANE_Bool eof, scanning, canceling, locked, backside, mode_jpeg;
181 
182 	SANE_Int left, top, pages, dummy;
183 
184 	SANE_Int width_front, height_front;
185 	SANE_Int width_back , height_back;
186 	SANE_Int width_temp, height_temp;
187 
188 	/* jpeg stuff */
189 
190 	djpeg_dest_ptr jdst;
191 	struct jpeg_decompress_struct jpeg_cinfo;
192 	struct jpeg_error_mgr jpeg_err;
193 	SANE_Bool jpeg_header_seen;
194 
195 	/* network buffers */
196 	unsigned char *netbuf, *netptr;
197 	size_t netlen;
198 
199 	SANE_Byte *frontJpegBuf, *backJpegBuf;
200 	SANE_Int   frontJpegBufLen, backJpegBufLen;
201 	SANE_Int   acquirePage;
202 
203 	SANE_Int   isflatbedScan;
204 	SANE_Int   isDuplexScan;
205 
206 	SANE_Int   needToConvertBW;
207 
208 	SANE_Int   scanEnd;
209  };
210 
211 typedef struct epsonds_scanner epsonds_scanner;
212 
213 struct mode_param
214 {
215 	int color;
216 	int flags;
217 	int dropout_mask;
218 	int depth;
219 };
220 
221 enum {
222 	MODE_BINARY, MODE_GRAY, MODE_COLOR
223 };
224 
225 #endif
226