1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <ctype.h>
4 #include <string.h>
5 #include "dc20_hif.h"
6
7 #define VERSION_STRING "(Version 2.11 / Oct 98)"
8
9 #define FULL_FEATURED 1
10
11 char filename[80]= "";
12 int com_nr= 1;
13 long baud= 9600;
14 int save_no= 0;
15 int max_fcnt= 100;
16 int video_mode= 0;
17
show_error(int error)18 void show_error(int error)
19 {
20 switch (error)
21 {
22 case ERR_DATA_WRONG: printf(" Wrong data received!"); break;
23 case ERR_NO_DATA: printf(" No data received!"); break;
24 case ERR_NO_CAMERA: printf(" Camera not found!"); break;
25 case ERR_PACKET_WRONG: printf(" Wrong data packet received!"); break;
26 case ERR_NO_RESPONSE: printf(" No response from camera!"); break;
27 case ERR_IMPOSSIBLE: printf(" Impossible!"); break;
28 case ERR_DATA_SAVE: printf(" Data save error!"); break;
29 case ERR_USER_BREAK: printf(" User Break!"); break;
30 case ERR_NO_DC25_SUPP: printf(" Command for DC25 not supported!"); break;
31 default: printf(" Error: %2X", error);
32 }
33 }
34
show_status(int full)35 void show_status(int full)
36 {
37 if (full)
38 {
39 printf("\nDC%02X camera with %ld baud at %s detected.",
40 dc_type, baud, com_dev);
41 }
42
43 if (sts_res == RES_LOW)
44 printf("\nResolution: low");
45 else
46 printf("\nResolution: high");
47 if (sts_bat)
48 printf("\nBattery: down");
49 else
50 printf("\nBattery: good");
51 printf("\n%2d photos taken \n%2d photos free", sts_pic_cnt, sts_pic_rem);
52 }
53
program_exit(int exit_code)54 void program_exit(int exit_code)
55 {
56 close_dc20();
57
58 printf("\n\nLook at my 'DC20 Secrets' site!\n");
59 printf("http://home.t-online.de/home/Oliver.Hartmann/dc20secr.htm\n");
60 exit(exit_code);
61 }
62
usage(void)63 void usage(void)
64 {
65 printf("\nKodak DC20/DC25 RS-232 Terminal at %ld baud ", baud);
66 printf("\n\n");
67 printf("written by Oliver.Hartmann@t-online.de ");
68 printf(VERSION_STRING);
69 printf(" \n\n");
70 printf("DC20term [-Bxxxxx] [-Cx] [-Vx]\n");
71 printf(" | | |---- take x photos in video mode \n");
72 printf(" | |----COM-Port x (<1>, 2, 3, 4) \n");
73 printf(" |----Baud xxxxx (<9600>,19200,38400,57600,115200)\n");
74 }
75
help(void)76 void help(void)
77 {
78 printf("\n");
79 printf("COMMANDS: \n");
80 printf(" D - Download Pictures \n");
81 printf(" E - Erase Camera Memory\n");
82 printf(" P - Take Picture \n");
83 printf(" Q - Quit \n");
84 printf(" R - Toggle Resolution \n");
85 printf(" S - Show DC20 Status \n");
86 printf(" T - Load Thumbnails \n");
87 printf(" X - Download Pictures and Exit \n");
88 }
89
cmdline(int argc,char * argv[])90 void cmdline(int argc, char *argv[])
91 {
92 int i;
93 char *ptr;
94
95 for(i=argc-1;i>0;i--)
96 {
97 ptr = argv[i];
98 if (*ptr == '-')
99 {
100 ptr++;
101 switch(*ptr)
102 {
103 case 'c':
104 case 'C': com_nr= atoi(++ptr);
105 break;
106 case 'b':
107 case 'B': baud= atol(++ptr);
108 break;
109 case 'n':
110 case 'N': max_fcnt= atoi(++ptr);
111 if (max_fcnt < 0)
112 max_fcnt= 100;
113 if (max_fcnt < 10)
114 max_fcnt*= 100;
115 break;
116 case 'v':
117 case 'V': video_mode= atoi(++ptr);
118 if (video_mode <= 0)
119 video_mode= 1;
120 if (video_mode > 999)
121 video_mode= 999;
122 break;
123 case 'h':
124 case 'H':
125 case '?': usage();
126 program_exit(0);
127 break;
128 default: break;
129 }
130 }
131 else
132 sscanf(ptr, "%s", filename);
133 }
134 }
135
main(int argc,char * argv[])136 void main(int argc, char *argv[])
137 {
138 int fcnt=0, i, error= 0;
139 int first_cnt = -1;
140 char key, fname[127];
141 FILE *ofp;
142 static int img_inf[MAX_PICT][5];
143
144 cmdline(argc, argv);
145
146 remove("dc2tga.cmd");
147
148 usage();
149
150 if (!video_mode)
151 help();
152
153 if ((error= init_dc20(com_nr, baud)) != 0)
154 {
155 printf("\nCamera not found at %s!", com_dev);
156 printf("\nCheck the -C option and if camera is ON.");
157 program_exit(-1);
158 }
159
160 if ((error= get_status()) != 0)
161 {
162 show_error(error);
163 program_exit(-1);
164 }
165 else
166 show_status(0);
167
168 if (video_mode)
169 {
170 #if FULL_FEATURED
171 if (error == 0)
172 {
173 if (sts_pic_cnt > 0)
174 {
175 printf("\n\nThe camera memory isn't empty - Erase it and start again!");
176 program_exit(1);
177 }
178 for (fcnt= 999; fcnt>0; fcnt--)
179 {
180 sprintf(fname, "dc_%03d.dc2", fcnt);
181 if((ofp=fopen(fname,"rb")) != NULL)
182 {
183 fclose(ofp); /* found last used name */
184 break;
185 }
186 }
187 /* video sequence *****************************************/
188 for (i= 1; i <= video_mode; i++)
189 {
190 if ((error= take_picture()) != 0)
191 show_error(error);
192
193 if (fcnt == 999)
194 printf("\nNo free filename found!");
195
196 sprintf(fname, "dc_%03d.dc2", ++fcnt);
197 if((ofp=fopen(fname,"rb")) != NULL)
198 {
199 fclose(ofp);
200 printf(" Filename already exists!");
201 program_exit(1);
202 }
203 if ((ofp= fopen(fname, "wb")) == NULL)
204 {
205 printf(" Can't open file!");
206 program_exit(1);
207 }
208 printf("\n");
209
210 if ((error= download_picture(1, ofp)) != 0)
211 show_error(error);
212 else
213 {
214 if (!save_no)
215 save_no= fcnt;
216 printf("\nPicture %d saved as %s", i, fname);
217 }
218 fclose(ofp);
219 if (error)
220 {
221 remove(fname);
222 program_exit(1);
223 }
224
225 if ((error= erase_dc20_memory()) != 0)
226 {
227 show_error(error);
228 program_exit(1);
229 }
230 }
231 program_exit(0);
232 }
233 else
234 program_exit(1);
235 #else
236 printf("\n\nVideo Mode not available in this evaluation copy!");
237 program_exit(0);
238 #endif
239 }
240
241 printf("\n: ");
242
243 for(;;)
244 {
245 int dpic= 0;
246 fflush(stdout);
247 key= toupper(getchar());
248 switch (key)
249 {
250 case '1':
251 case '2':
252 case '3':
253 case '4':
254 case '5':
255 case '6':
256 case '7':
257 case '8':
258 case 'D':
259 case 'X': for (fcnt= max_fcnt; fcnt>0; fcnt--)
260 {
261 sprintf(fname, "dc_%03d.dc2", fcnt);
262 if((ofp=fopen(fname,"rb")) != NULL)
263 {
264 if (first_cnt < 0)
265 first_cnt= fcnt+1;
266 fclose(ofp); /* found last used name */
267 break;
268 }
269 sprintf(fname, "dc_%03d.img", fcnt);
270 if((ofp=fopen(fname,"rb")) != NULL)
271 {
272 if (first_cnt < 0)
273 first_cnt= fcnt+1;
274 fclose(ofp); /* found last used name */
275 break;
276 }
277 }
278 if ((error= get_status()) != 0)
279 {
280 show_error(error);
281 break;
282 }
283 dpic= (int) key - 48;
284 if ( (dpic > 0) && (dpic < 9) )
285 i= dpic;
286 else
287 {
288 i= 1;
289 dpic= 0;
290 }
291 for ( ; i<= sts_pic_cnt; i++)
292 {
293 sprintf(fname, "dc_%03d.dc2", ++fcnt);
294 if((ofp=fopen(fname,"rb")) != NULL)
295 {
296 fclose(ofp);
297 printf(" Filename already exists!");
298 break;
299 }
300 if ((ofp= fopen(fname, "wb")) == NULL)
301 {
302 printf(" Can't open file!");
303 break;
304 }
305 printf("\n");
306 if ((error= download_picture(i, ofp)) != 0)
307 show_error(error);
308 else
309 {
310 if (!save_no)
311 save_no= fcnt;
312 printf("\nPicture %d saved as %s", i, fname);
313 }
314 fclose(ofp);
315 if (error)
316 {
317 remove(fname);
318 break;
319 }
320 if (dpic)
321 break;
322 }
323 if (key == 'X')
324 {
325 #if FULL_FEATURED
326 if (first_cnt > 0)
327 {
328 if((ofp=fopen("dc2tga.cmd","wt")) != NULL)
329 {
330 fprintf(ofp, "-x%d -a\n", first_cnt);
331 fclose(ofp);
332 }
333 }
334 program_exit(0); /* Quit */
335 #else
336 printf("\nNot available in this evaluation copy!");
337 #endif
338 }
339 break;
340 case 'Q': program_exit(0); /* Quit */
341 break;
342 case 'E': if ((error= erase_dc20_memory()) != 0)
343 show_error(error);
344 else
345 show_status(0);
346 break;
347 case 'P': if ((error= take_picture()) != 0)
348 show_error(error);
349 else
350 show_status(0);
351 break;
352 case 'R': if ((error= toggle_resolution()) != 0)
353 show_error(error);
354 else
355 show_status(0);
356 break;
357 case 'S': if ((error= get_status()) != 0)
358 {
359 show_error(error);
360 break;
361 }
362 else
363 show_status(1);
364
365 if ((error= load_image_infos(img_inf)) != 0)
366 show_error(error);
367 else
368 for (i= 1; i<= sts_pic_cnt; i++)
369 {
370 int s;
371 char f[8];
372
373 if (i > MAX_PICT)
374 break;
375
376 if (img_inf[i][0] < 7)
377 strcpy(f, "f/4 ");
378 else
379 strcpy(f, "f/11");
380 if (img_inf[i][3] < 18)
381 s= 30;
382 else if (img_inf[i][3] < 26)
383 s= 60;
384 else if (img_inf[i][3] < 33)
385 s= 125;
386 else if (img_inf[i][3] < 40)
387 s= 250;
388 else if (img_inf[i][3] < 48)
389 s= 500;
390 else if (img_inf[i][3] < 56)
391 s= 1000;
392 else if (img_inf[i][3] < 62)
393 s= 2000;
394 else if (img_inf[i][3] < 67)
395 s= 4000;
396 else
397 s= 8000;
398 printf("\nPicture %2d: %s 1/%d", i, f, s);
399 if (img_inf[i][4] == 0)
400 printf(" (high res)");
401 else
402 printf(" (low res)");
403 }
404 break;
405 case 'T': if ((ofp= fopen("thumbnls.dc2", "wb")) == NULL)
406 {
407 printf(" Can't open file!");
408 break;
409 }
410 printf("\n");
411 if ((error= load_thumbnails(ofp)) != 0)
412 show_error(error);
413 else
414 printf("\nAll thumbnails saved in thumbnls.dc2");
415 fclose(ofp);
416 break;
417 case 0xA: printf("\n: ");
418 break;
419 case 0x0:
420 case 0xD:
421 case 32:
422 break;
423 default: help();
424 }
425 }
426 }
427