HW/OpticalInstruments/FastCameras/ExilimFX1/EXF1_software/exf1ctrl.c

//
// ExF1Ctrl ver. 0.1. 
//
// This program can be used to interface the Casio EX-F1 over USB. 
// Firmware rev. 2.00 is required. This version is available here:
// http://support.casio.com/download.php?rgn=4&cid=001&pid=573
//
// Written by Jens Skovgaard Olsen (info@feischmeckerfoosball.com)
// 

#include "exf1ctrl.h"

int change_status(int status, int code, int device_num)
{
    FILE *file;
    char *dev_name = malloc(1000);
    sprintf(dev_name, "STATUS_%i", device_num+1);
    file = fopen(dev_name ,"w"); /* apend file (add text to
    a file or create a file if it does not exist.*/
    fprintf(file,"%i",code); /*writes*/
    fclose(file);
    if(status == 1)
        exit(code);
}



int main(int argc, char** argv)
{
   char input[64], com, name[32], tname[32];
   int arg, nargs, addr, val, i;
   float arg1, arg2;
   /*
   printf(" \n");
   printf(" ********************************************************************\n");
   printf(" *                                                                  *\n");
   printf(" *  ExF1Ctrl ver. 0.1                                               *\n");
   printf(" *  -----------------                                               *\n");
   printf(" *  This program is able to interface to the Casio EX-F1 over USB.  *\n");
   printf(" *  Firmware rev. 2.00 is required and the camera must be put in    *\n");
   printf(" *  remote control mode before being connected to the host.         *\n");
   printf(" *  --                                                              *\n");
   printf(" *  Jens Skovgaard Olsen                                            *\n");
   printf(" *  info@feinschmeckerfoosball.com                                  *\n");
   printf(" *                                                                  *\n");
   printf(" ********************************************************************\n");
   printf(" \n");
   printf(" Hint: a [x] sets aperture (x = 1-10).\n");
   printf("          1: F2.7 (default).\n");
   printf("          2: F3.0.\n");
   printf("          3: F3.3.\n");
   printf("          4: F3.8.\n");
   printf("          5: F4.2.\n");
   printf("          6: F4.7.\n");
   printf("          7: F5.3.\n");
   printf("          8: F6.0.\n");
   printf("          9: F6.7.\n");
   printf("         10: F7.5.\n");
   printf(" \n");
   printf(" Hint: c [x] sets mode / movie mode (x = 1-9).\n");
   printf("          1: Single shot (default).\n");
   printf("          2: Continuous shutter.\n");
   printf("          3: Prerecord still image.\n");
   printf("          4: Movie (STD).\n");
   printf("          5: Prerecord movie (STD).\n");
   printf("          6: Movie (HD).\n");
   printf("          7: Prerecord movie (HD).\n");
   printf("          8: Movie (HS).\n");
   printf("          9: Prerecord movie (HS).\n");
   printf("\n");
   printf(" Hint: e [x] sets exposure (x = 1-4).\n");
   printf("          1: M.\n");
   printf("          2: Auto (default).\n");
   printf("          3: A.\n");
   printf("          4: S.\n");
   printf("\n");
   printf(" Hint: f [x] sets focus (x = 1-4).\n");
   printf("          1: Auto (default).\n");	
   printf("          2: Macro.\n");
   printf("          3: Infinity.\n");
   printf("          4: Manual.\n");
   printf("\n");
   printf(" Hint: h activates half press.\n");
   printf("\n");
   printf(" Hint: i [x] sets iso (x = 1-6).\n");
   printf("          1: Auto (default).\n");
   printf("          2: 100.\n");
   printf("          3: 200.\n");
   printf("          4: 400.\n");
   printf("          5: 800.\n");
   printf("          6: 1600.\n");
   printf("\n");
   printf(" Hint: q quits this program.\n");
   printf("\n");
   printf(" Hint: m [x [y]] records a x second long movie called y.\n");
   printf("\n");
   printf(" Hint: s [x [y [z]]] activates shutter and stores a picture called x\n");
   printf("       and a thumbnail called y. If the continous shutter is enabled\n");
   printf("       (modes 2 and 3), z determines the shutter duration.\n");
   printf("\n");
   printf(" Hint: v [x [y]] focus y steps. x=in focuses in and x=out focuses out.\n");
   printf("       Continous focus is used if y is not defined.\n");
   printf("\n");
   printf(" Hint: z [x [y]] zooms y steps. x=in zooms in and x=out zooms out.\n");
   printf("       Continous zoom is used if y is not defined.\n");
   printf("\n");
   printf("\n");
   printf("> Initializing camera... \n");
   fflush(stdout);
	*/
   
//!!! vyber cisla zarizeni
   int device_num;
   if( argc > 1) {

      
	device_num = argv[1][0]-'0'-1;
   }
   else
       device_num = 0;

/*    printf( "%c \n" , argv[2][0] );*/

// zapise na disk zpravu o tom, že to nastavuje foťák
    change_status(0, 1, device_num);



    if( argc == 3 &&  argv[2][0]=='r') {
        printf("Cleaning\n");
        if (!init_camera(device_num))
                change_status(1, 0, device_num);
            exit_camera();
            change_status(1, 0, device_num);
    }
//     char * dev_name[1];
//     
//        
//        printf(dev_name);
//        printf("\n");
// //        strcpy(dev_name);
//         printf( strcat("-", dev_name));
//    
   
   if (!init_camera(device_num))
     change_status(1, 0, device_num);
   
   printf("Camera started\n");
   
   
   while (1)
   {
      printf("> ");
      
      gets(input);
      sscanf(input, "%c", &com);
      
      switch (com) {
	case 'S':
	    nargs = sscanf(input, "%c %f %f", &com, &arg1, &arg2);
            printf("> HS video config ... \n");
	    setup_HS_movie(arg1, arg2);
            change_status(0,0, device_num); //nastaveni bylo dokonceno !!!!
	    break;
         case 'a':
            nargs = sscanf(input, "%c %d", &com, &arg);
            printf("> Configuring aperture... \n");
            switch (arg) {
               case 1:
                 setup_aperture(DATA_APERTURE_F2_7);
                 break;
               case 2:
                 setup_aperture(DATA_APERTURE_F3_0);
                 break;
               case 3:
                 setup_aperture(DATA_APERTURE_F3_3);
                 break;
               case 4:
                 setup_aperture(DATA_APERTURE_F3_8);
                 break;
               case 5:
                 setup_aperture(DATA_APERTURE_F4_2);
                 break;
               case 6:
                 setup_aperture(DATA_APERTURE_F4_7);
                 break;
               case 7:
                 setup_aperture(DATA_APERTURE_F5_3);
                 break;
               case 8:
                 setup_aperture(DATA_APERTURE_F6_0);
                 break;
               case 9:
                 setup_aperture(DATA_APERTURE_F6_7);
                 break;
               case 10:
                 setup_aperture(DATA_APERTURE_F7_5);
                 break;
               default:
                 printf("> Unknown aperture setting. \n");
            }
            break;

         case 'c': 
            nargs = sscanf(input, "%c %d", &com, &arg);
            printf("> Configuring shutter mode / movie mode... \n");
            switch (arg) {
                case 1:
                    setup_shutter(SHUTTER_NORMAL, FALSE);
                    break;
                case 2:
                    setup_shutter(SHUTTER_CONTINOUS, FALSE);
                    break;
                case 3:
                    setup_shutter(SHUTTER_NORMAL, TRUE);
                    break;
                case 4:
                    setup_movie(MOVIE_STD, FALSE);
                    break;
                case 5:
                    setup_movie(MOVIE_STD, TRUE);
                    break;
                case 6:
                    setup_movie(MOVIE_HD, FALSE);
                    break; 
                case 7:
                    setup_movie(MOVIE_HD, TRUE);
                    break; 
                case 8:
                    setup_movie(MOVIE_HS, FALSE);
                    break; 
                case 9:
                    setup_movie(MOVIE_HS, TRUE);
                    break;
                default:
                    printf("> This mode is yet to be supported. \n");
            }
            break; 

          case 'e':
            nargs = sscanf(input, "%c %d", &com, &arg);
            printf("> Configuring exposure... \n");
            switch (arg) {
               case 1:
                 setup_exposure(DATA_EXPOSURE_M);
                 break;
               case 2:
                 setup_exposure(DATA_EXPOSURE_AUTO);
                 break;
               case 3:
                 setup_exposure(DATA_EXPOSURE_A);
                 break;
               case 4:
                 setup_exposure(DATA_EXPOSURE_S);
                 break;
               default:
                 printf("> Unknown focus setting. \n");
            }
            break; 

          case 'f':
            nargs = sscanf(input, "%c %d", &com, &arg);
            printf("> Configuring focus... \n");
            switch (arg) {
               case 1:
                 setup_focus(DATA_FOCUS_AF);
                 break;
               case 2:
                 setup_focus(DATA_FOCUS_MACRO);
                 break;
               case 3:
                 setup_focus(DATA_FOCUS_INFINITY);
                 break;
               case 4:
                 setup_focus(DATA_FOCUS_MANUAL);
                 break;
               default:
                 printf("> Unknown exposure setting. \n");
            }
            break;

         case 'h':
            printf("> Half press... \n");
            half_shutter(); 
            break; 
            
         case 'i':
            nargs = sscanf(input, "%c %d", &com, &arg);
            printf("> Configuring ISO... \n");
            switch (arg) {
               case 1:
                 setup_iso(DATA_IS0_AUTO);
                 break;
               case 2:
                 setup_iso(DATA_IS0_100);
                 break;
               case 3:
                 setup_iso(DATA_IS0_200);
                 break;                 
               case 4:
                 setup_iso(DATA_IS0_400);
                 break;
               case 5:
                 setup_iso(DATA_IS0_800);
                 break;
               case 6:
                 setup_iso(DATA_IS0_1600);
                 break;
               default:
                 printf("> Unknown ISO setting. \n");
            }
            break; 
            
         case 'm':
            nargs = sscanf(input, "%c %d %s", &com, &arg, &name);
            printf("> Recording... \n");

            if (nargs == 3) 
	    {
		char *dev_name = malloc(1000);
		sprintf(dev_name, "%s-%i.MOV", name, device_num+1);
		movie(dev_name , arg);
	    }
            else if (nargs == 2) 
               movie("CIMG001.MOV", arg);
            else 
               movie("CIMG001.MOV", -1);
            break; 
            
         case 'q':
            exit_camera();
            change_status(1, 0, device_num);
            
         case 's':
            nargs = sscanf(input, "%c %s %s %d", &com, &name, &tname, &arg);
            printf("> Taking picture... \n");
            switch (nargs) {
                case 1: 
                    shutter("CIMG001.jpg", "CIMG001_thumb.jpg", -1);
                    break; 
                case 2: 
                    shutter(strcat(name,".jpg"), strcat(name, "_thumb.jpg"), -1);     
                    break; 
                case 3:
                    shutter(strcat(name,".jpg"), strcat(tname,".jpg"), -1);
                    break; 
                case 4:
                    shutter(strcat(name,".jpg"), strcat(tname,".jpg"), arg);
                    break; 
            }
            break;

         case 'v':
            nargs = sscanf(input, "%c %s %d", &com, &name, &arg);
            printf("> Focusing... \n");

            switch (nargs) {
                case 1:
                    focus(TRUE, TRUE);
                    break;
                case 2:
                    if (strcmp(name, "in") == 0)
                        focus(TRUE, TRUE);
                    else if (strcmp(name, "out") == 0)
                        focus(FALSE, TRUE);
                    else
                        printf("> Unrecognized parameter: %s!\n", name);
                    break;
                case 3:
                    if (strcmp(name, "in") == 0)
                        for (i=0; i<arg; i++)
                            focus(TRUE, FALSE);
                    else if (strcmp(name, "out") == 0)
                        for (i=0; i<arg; i++)
                            focus(FALSE, FALSE);
                    else
                        printf("> Unrecognized parameter: %s!\n", name);
                    break;
            }
            break;

         case 'x':
            nargs = sscanf(input, "%c %x %x", &com, &addr, &val);
            if (nargs == 3) {
               printf("> Setting property 0x%X to 0x%X... \n", addr, val);
               exf1Cmd(CMD_WRITE, addr, val);
            }
            else
               printf("> Three arguments required... \n");
            break;

         case 'z':
            nargs = sscanf(input, "%c %s %d", &com, &name, &arg);
            printf("> Zooming... \n");

            switch (nargs) {
                case 1:
                    zoom(TRUE, TRUE);
                    break;
                case 2:
                    if (strcmp(name, "in") == 0)
                        zoom(TRUE, TRUE);
                    else if (strcmp(name, "out") == 0)
                        zoom(FALSE, TRUE);
                    else
                        printf("> Unrecognized parameter: %s!\n", name);
                    break;
                case 3:
                    if (strcmp(name, "in") == 0)
                        for (i=0; i<arg; i++)
                            zoom(TRUE, FALSE);
                    else if (strcmp(name, "out") == 0)
                        for (i=0; i<arg; i++)
                            zoom(FALSE, FALSE);
                    else
                        printf("> Unrecognized parameter: %s!\n", name);
                    break;
            }
            break;

         default: 
            printf("> Unrecognized command: %s \n", input);   
            break; 
            
      }
   }
    
   change_status(1, 0, device_num);
}