00001
00010 #include "di194.h"
00011
00012
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
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
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
00128 cmd = DI_EMPTY_CMD;
00129
00130
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
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
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
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
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
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
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
00369 return(user_loop(comm_fd));
00370 }