Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

di_test.c

Go to the documentation of this file.
00001 
00010 #include "di194.h"
00011 
00012 // Global boolean used for control-break
00013 bool do_exit;
00014 
00015 typedef enum commands_e 
00016 {
00017     DI_HELP,
00018     DI_START,
00019     DI_STOP,
00020     DI_READ,
00021     DI_READ_SINGLE,
00022     DI_RESET,
00023     DI_PROGRAM,
00024     DI_QUIT,
00025     DI_SERIAL,
00026     DI_FLUSH,
00027     DI_EMPTY_CMD,
00028     DI_INVALID_CMD
00029 } commands_t;
00030 
00031 typedef struct command_entry_s 
00032 {
00033     char       *command;
00034     char       *info;
00035     char       *usage;
00036     commands_t cmd;
00037 } command_entry_t;
00038 
00039 command_entry_t    commands[] = 
00040 {
00041     {
00042         "help",        "help",       "help command ENTER", DI_HELP
00043     },
00044     {
00045         "start",       "start DAQ",  "start ENTER", DI_START
00046     },
00047     {
00048         "stop",        "stop DAQ",   "stop ENTER", DI_STOP
00049     },
00050     {
00051         "read",        "read once",  "read ENTER", DI_READ
00052     },
00053     {
00054         "single",      "read a single value", "single ENTER", DI_READ_SINGLE
00055     },
00056     {
00057         "reset",       "reset unit", "reset ENTER", DI_RESET
00058     },
00059     {
00060         "prog",        "program unit", "prog ENTER", DI_PROGRAM
00061     },
00062     {
00063         "serial",      "read serial number", "serial ENTER", DI_SERIAL
00064     },
00065     {
00066         "flush",       "flush port buffers", "flush ENTER", DI_FLUSH
00067     },
00068     {
00069         "quit",        "quit program",  "quit ENTER", DI_QUIT
00070     }
00071     
00072 };
00073 
00074 
00075 #define CMD_TABLE_SIZE (sizeof(commands) / sizeof(command_entry_t))
00076 
00077 // ---------------------------------------------------------------------
00087 int user_loop(const int COMM_FD)
00088 {
00089     int           rc, idx;
00090     char          cmd_buf[BUFSIZ] = "";
00091     const char    prompt[] = "di-194> ";
00092     char          *input = NULL;
00093     bool          done = false;
00094     commands_t    cmd = DI_INVALID_CMD;
00095     daq_reading_t data;
00096     char          ser_buf[SERIAL_NUM_LEN + 1] = "";
00097     int           num_bits = 8;
00098 
00099     // Valid file descriptor?
00100     if(COMM_FD <= 0)
00101         return(-1);
00102 
00103     while((!done) && (!do_exit))
00104     {
00105         printf(prompt);
00106         
00107         input = fgets(cmd_buf, (BUFSIZ - 1), stdin);
00108         if(input == NULL)
00109             continue;
00110 
00111         input = strtok(cmd_buf, " \t\n");
00112         if(input != NULL)
00113         {
00114             // search command table
00115             for(idx = 0; idx < CMD_TABLE_SIZE && 
00116                     strcmp(input, commands[idx].command) != 0; idx++);
00117             
00118             if(idx >= CMD_TABLE_SIZE)
00119             {
00120                 cmd = DI_INVALID_CMD;
00121             }
00122             else
00123             {
00124                 cmd = commands[idx].cmd;
00125             }
00126         }
00127         else // Null command
00128             cmd = DI_EMPTY_CMD;
00129     
00130         // Dispatch it
00131         switch(cmd)
00132         {
00133           case DI_QUIT:
00134             done = true;
00135             break;
00136         
00137           case DI_EMPTY_CMD:
00138             break;
00139         
00140           case DI_INVALID_CMD:
00141           default:
00142             printf("Invalid command. Type 'help' for valid commands.\n");
00143             break;
00144         
00145           case DI_HELP:
00146             input = strtok(NULL, " \t\n");
00147             if(input != NULL)
00148             {
00149                 for(idx = 0; idx < CMD_TABLE_SIZE && 
00150                         strcmp(input, commands[idx].command) != 0; idx++);
00151 
00152                 if(idx >= CMD_TABLE_SIZE)
00153                     printf("No such command\n");
00154                 else
00155                 {
00156                     printf("%s\t\t%s\n\tUsage: %s\n", 
00157                            commands[idx].command,
00158                            commands[idx].info, 
00159                            commands[idx].usage);
00160                 }
00161             
00162             }
00163             else  // Just plain help; dump table
00164             {
00165                 for(idx = 0; idx < CMD_TABLE_SIZE; idx++)
00166                 {
00167                     printf("%s:\t\t%s\n", 
00168                            commands[idx].command, commands[idx].info);
00169                 }
00170                 printf("\nFor help on a specific command,");
00171                 printf(" type 'help <command>'\n");
00172             }
00173             break;
00174         
00175           case DI_START:
00176             rc = di_start(COMM_FD);
00177             if(rc != 0)
00178                 printf("Error %d on start command\n", rc);
00179             else
00180                 printf("Started OK.\n");
00181         
00182             break;
00183         
00184           case DI_STOP:
00185             rc = di_stop(COMM_FD);
00186             if(rc != 0)
00187                 printf("Error %d on stop command\n", rc);
00188             else
00189                 printf("Stopped OK.\n");
00190 
00191             break;
00192 
00193           case DI_READ:
00194             // DDT
00195             di_daq_sync(COMM_FD);
00196             
00197             rc = di_read(COMM_FD, &data, num_bits);
00198             if(rc != 0)
00199             {
00200                 printf("Error %d on read\n", rc);
00201                 break;
00202             }
00203         
00204             // got data!
00205             printf("A0: %5.2f %5.2f %5.2f %5.2f",
00206                    data.analog[0],
00207                    data.analog[1],
00208                    data.analog[2],
00209                    data.analog[3]);
00210             printf("\nD0: %1d %1d %1d\n",
00211                    data.digital[0],
00212                    data.digital[1],
00213                    data.digital[2]);
00214 
00215             break;
00216           case DI_READ_SINGLE:
00217             rc = di_read_single(COMM_FD, &data, num_bits);
00218             if(rc != 0)
00219             {
00220                 printf("Error %d on read\n", rc);
00221                 break;
00222             }
00223         
00224             // got data!
00225             printf("A0: %5.2f %5.2f %5.2f %5.2f",
00226                    data.analog[0],
00227                    data.analog[1],
00228                    data.analog[2],
00229                    data.analog[3]);
00230             printf("\nD0: %1d %1d %1d\n",
00231                    data.digital[0],
00232                    data.digital[1],
00233                    data.digital[2]);
00234             break;
00235             
00236           case DI_SERIAL:
00237             rc = di_serial_num(COMM_FD, ser_buf);
00238             if(rc != 0)
00239             {
00240                 printf("Error %d reading serial number\n", rc);
00241                 break;
00242             }
00243             
00244             printf("DI-194 serial number: '");
00245             
00246             for(idx = 0; idx < SERIAL_NUM_LEN; idx++)
00247                 printf("%c", ser_buf[idx]);
00248             printf("'\n");
00249             break;
00250 
00251           case DI_FLUSH:
00252             tcflush(COMM_FD, TCIOFLUSH);
00253             printf("Done.\n");
00254             break;
00255             
00256           case DI_RESET:
00257             rc = di_reset(COMM_FD);
00258             if(rc != 0)
00259             {
00260                 printf("Error %d on reset\n", rc);
00261                 break;
00262             }
00263             else
00264                 printf("Reset OK.\n");
00265             break;
00266         
00267           case DI_PROGRAM:
00268             rc = di_configure(COMM_FD);
00269             if(rc != 0)
00270             {
00271                 printf("Error %d on reprogram\n", rc);
00272                 break;
00273             }
00274             else
00275                 printf("Reprogrammed OK\n");
00276             break;
00277         }
00278     }
00279     
00280     printf("Closing down DI-194\n");
00281     
00282     di_stop(COMM_FD);
00283     di_close(COMM_FD);
00284     
00285     printf("Done, exiting\n");
00286     return(0);
00287 }
00288     
00289 // ---------------------------------------------------------------------
00304 void sighandler(int signal)
00305 {
00306     char    me[] = "sighandler";
00307 
00308     fprintf(stderr, "\n%s: Got signal %d, exiting\n", me, signal);
00309     fflush(stderr);
00310     
00311     do_exit = true;
00312 
00313     return;
00314 }
00315 
00316 //***********************************************************************
00337 int main(int argc, char *argv[])
00338 {
00339     char          me[] = "main";
00340     FILE          *fHandle = NULL;
00341     int           comm_fd = -1;
00342     int           num_bits = 0;
00343 
00344 
00345     // Try new routines!
00346     comm_fd = di_open(getenv("DI194_PORT"), &num_bits);
00347     if(comm_fd <= 0)
00348     {
00349         fprintf(stderr, "\n%s: Error %d opening device",
00350                 me, comm_fd);
00351         return(1);
00352     }
00353 
00354     // If supplied one arg, use as data file name
00355     if(argc == 2)
00356     {
00357         fHandle = fopen(argv[1], "w");
00358 
00359         if(fHandle == NULL)
00360             fprintf(stderr, "\n%s: unable to open %s for output",
00361          me, argv[1]);
00362     }
00363         
00364     printf("Installing signal handler.\n");
00365     do_exit = false;
00366     signal(SIGINT, sighandler);
00367 
00368     // Call main routine
00369     return(user_loop(comm_fd));
00370 }

Generated on Thu May 1 11:31:45 2003 for DI-194 driver by doxygen1.3