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