• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /***************************************************************************
2  * SANE - Scanner Access Now Easy.
3 
4    dc25.h
5 
6    6/1/98
7 
8    This file (C) 1998 Peter Fales
9 
10    This file is part of the SANE package.
11 
12    This program is free software; you can redistribute it and/or
13    modify it under the terms of the GNU General Public License as
14    published by the Free Software Foundation; either version 2 of the
15    License, or (at your option) any later version.
16 
17    This program is distributed in the hope that it will be useful, but
18    WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20    General Public License for more details.
21 
22    You should have received a copy of the GNU General Public License
23    along with this program.  If not, see <https://www.gnu.org/licenses/>.
24 
25    As a special exception, the authors of SANE give permission for
26    additional uses of the libraries contained in this release of SANE.
27 
28    The exception is that, if you link a SANE library with other files
29    to produce an executable, this does not by itself cause the
30    resulting executable to be covered by the GNU General Public
31    License.  Your use of that executable is in no way restricted on
32    account of linking the SANE library code into it.
33 
34    This exception does not, however, invalidate any other reasons why
35    the executable file might be covered by the GNU General Public
36    License.
37 
38    If you submit changes to SANE to the maintainers to be included in
39    a subsequent release, you agree by submitting the changes that
40    those changes may be distributed with this exception intact.
41 
42    If you write modifications of your own for SANE, it is your choice
43    whether to permit this exception to apply to your modifications.
44    If you do not wish that, delete this exception notice.
45 
46  ***************************************************************************
47 
48    This file implements a SANE backend for the Kodak DC-25 (and
49    probably the DC-20) digital cameras.  THIS IS EXTREMELY ALPHA CODE!
50    USE AT YOUR OWN RISK!!
51 
52    (feedback to:  dc25-devel@fales-lorenz.net)
53 
54    This backend is based heavily on the dc20ctrl package by Ugo
55    Paternostro <paterno@dsi.unifi.it>.  I've attached his header below:
56 
57  ***************************************************************************
58 
59  *	Copyright (C) 1998 Ugo Paternostro <paterno@dsi.unifi.it>
60  *
61  *	This file is part of the dc20ctrl package. The complete package can be
62  *	downloaded from:
63  *	    http://aguirre.dsi.unifi.it/~paterno/binaries/dc20ctrl.tar.gz
64  *
65  *	This package is derived from the dc20 package, built by Karl Hakimian
66  *	<hakimian@aha.com> that you can find it at ftp.eecs.wsu.edu in the
67  *	/pub/hakimian directory. The complete URL is:
68  *	    ftp://ftp.eecs.wsu.edu/pub/hakimian/dc20.tar.gz
69  *
70  *	This package also includes a slightly modified version of the Comet to ppm
71  *	conversion routine written by YOSHIDA Hideki <hideki@yk.rim.or.jp>
72  *
73  *	This program is free software; you can redistribute it and/or modify
74  *	it under the terms of the GNU General Public License as published
75  *	the Free Software Foundation; either version 2 of the License, or
76  *	(at your option) any later version.
77  *
78  *	This program is distributed in the hope that it will be useful,
79  *	but WITHOUT ANY WARRANTY; without even the implied warranty of
80  *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
81  *	GNU General Public License for more details.
82  *
83  *	You should have received a copy of the GNU General Public License
84  *	along with this program; if not, write to the Free Software
85  *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
86  *
87 
88  ***************************************************************************/
89 
90 #include <stdio.h>
91 #include <stdlib.h>
92 #include <unistd.h>
93 #include <fcntl.h>
94 #include <termios.h>
95 #include <string.h>
96 
97 #ifndef TRUE
98 #define TRUE	(1==1)
99 #endif
100 
101 #ifndef FALSE
102 #define FALSE	(!TRUE)
103 #endif
104 
105 #ifndef NULL
106 #define NULL	0L
107 #endif
108 
109 typedef struct dc20_info_s {
110 	unsigned char model;
111 	unsigned char ver_major;
112 	unsigned char ver_minor;
113 	int pic_taken;
114 	int pic_left;
115 	struct {
116 		unsigned int low_res:1;
117 		unsigned int low_batt:1;
118 	} flags;
119 } Dc20Info, *Dc20InfoPtr;
120 
121 static Dc20Info *get_info (int);
122 
123 #define INIT_PCK	{0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A}
124 /*                               ^^^^^^^^^^
125  *                               Baud rate: (see pkt_speed structure)
126  *                                 0x96 0x00 -> 9600 baud
127  *                                 0x19 0x20 -> 19200 baud
128  *                                 0x38 0x40 -> 38400 baud
129  *                                 0x57 0x60 -> 57600 baud
130  *                                 0x11 0x52 -> 115200 baud
131  */
132 #define INFO_PCK	{0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A}
133 #define SHOOT_PCK	{0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A}
134 #define ERASE_PCK	{0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A}
135 #define RES_PCK		{0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A}
136 /*                               ^^^^
137  *                               Resolution: 0x00 = high, 0x01 = low
138  */
139 #define THUMBS_PCK	{0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A}
140 /*                                     ^^^^
141  *                                     Thumbnail number
142  */
143 #define PICS_PCK	{0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A}
144 /*                                     ^^^^
145  *                                     Picture number
146  */
147 
148 struct pkt_speed {
149 	speed_t          baud;
150 	unsigned char    pkt_code[2];
151 };
152 
153 #define DEFAULT_TTY_BAUD B38400
154 
155 #define HIGH_RES		0
156 #define LOW_RES			1
157 
158 /*
159  *	Image parameters
160  */
161 
162 #define LOW_CAMERA_HEADER	256
163 #define HIGH_CAMERA_HEADER	512
164 #define CAMERA_HEADER(r)	( (r) ? LOW_CAMERA_HEADER : HIGH_CAMERA_HEADER )
165 
166 #define LOW_WIDTH			256
167 #define HIGH_WIDTH			512
168 #define WIDTH(r)			( (r) ? LOW_WIDTH : HIGH_WIDTH )
169 
170 #define HEIGHT				243
171 
172 #define LEFT_MARGIN			1
173 
174 #define LOW_RIGHT_MARGIN	5
175 #define HIGH_RIGHT_MARGIN	10
176 #define RIGHT_MARGIN(r)		( (r) ? LOW_RIGHT_MARGIN : HIGH_RIGHT_MARGIN )
177 
178 #define TOP_MARGIN			1
179 
180 #define BOTTOM_MARGIN		1
181 
182 #define BLOCK_SIZE			1024
183 
184 #define LOW_BLOCKS			61
185 #define HIGH_BLOCKS			122
186 #define BLOCKS(r)			( (r) ? LOW_BLOCKS : HIGH_BLOCKS )
187 
188 #define	LOW_IMAGE_SIZE		( LOW_BLOCKS * BLOCK_SIZE )
189 #define HIGH_IMAGE_SIZE		( HIGH_BLOCKS * BLOCK_SIZE )
190 #define IMAGE_SIZE(r)		( (r) ? LOW_IMAGE_SIZE : HIGH_IMAGE_SIZE )
191 #define MAX_IMAGE_SIZE		( HIGH_IMAGE_SIZE )
192 
193 /*
194  *	Comet file
195  */
196 
197 #define COMET_MAGIC			"COMET"
198 #define COMET_HEADER_SIZE	128
199 #define COMET_EXT			"cmt"
200 
201 /*
202  *	Pixmap structure
203  */
204 
205 struct pixmap {
206 	int				 width;
207 	int				 height;
208 	int				 components;
209 	unsigned char	*planes;
210 };
211 
212 /*
213  *	Rotations
214  */
215 
216 #define ROT_STRAIGHT	0x00
217 #define ROT_LEFT		0x01
218 #define ROT_RIGHT		0x02
219 #define ROT_HEADDOWN	0x03
220 
221 #define ROT_MASK		0x03
222 
223 /*
224  *	File formats
225  */
226 
227 #define SAVE_RAW		0x01
228 #define SAVE_GREYSCALE		0x02
229 #define SAVE_24BITS		0x04
230 #define SAVE_FILES		0x07
231 #define SAVE_FORMATS		0x38
232 #define SAVE_ADJASPECT		0x80
233 
234 /*
235  *	External definitions
236  */
237 
238 extern char		*__progname;		/* Defined in /usr/lib/crt0.o */
239 
240 
241 
242 #include <sys/types.h>
243 
244 FILE * sanei_config_open (const char *filename);
245 
246 char *sanei_config_read (char *str, int n, FILE * stream);
247 
248 static int init_dc20 (char *, speed_t);
249 
250 static void close_dc20 (int);
251 
252 static int read_data (int fd, unsigned char *buf, int sz);
253 
254 static int end_of_data (int fd);
255 
256 static int set_pixel_rgb (struct pixmap *, int, int, unsigned char, unsigned char, unsigned char);
257 
258 static struct pixmap *alloc_pixmap (int x, int y, int d);
259 
260 static void free_pixmap (struct pixmap *p);
261 
262 static int zoom_x (struct pixmap *source, struct pixmap *dest);
263 
264 static int zoom_y (struct pixmap *source, struct pixmap *dest);
265 
266 static int comet_to_pixmap (unsigned char *, struct pixmap *);
267