/* Test DAC for stability etc */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "serial-util.h" #include "gpib.h" #include "zoom.h" #include #include "mt19937ar.h" void write_random(int zoom, int gpib); #define info(x...) fprintf(stderr,x) int g_quit = 0; void handle_sig(int sig) { g_quit = 1; } int main(int argc, char *argv[]) { char *zoomdev=strdup("/dev/serial/by-id/usb-FTDI_" "FT232R_USB_UART_A6007wc5-if00-port0"); char *gpibdev=strdup("/dev/serial/by-id/usb-Prologix_" "Prologix_GPIB-USB_Controller_PXQQY20G-if00-port0"); int getopt_index; int zoom, gpib; unsigned long seed = 1337; static struct option long_opts[] = { { "zoom-device", required_argument, NULL, 'Z' }, { "gpib-device", required_argument, NULL, 'G' }, { "seed", required_argument, NULL, 's' }, { "help", no_argument, NULL, 'h' }, { 0, 0, 0, 0} }; int help=0; char c; while ((c = getopt_long(argc, argv, "Z:G:s:h?", long_opts, &getopt_index)) != -1) { switch(c) { case 'Z': free(zoomdev); zoomdev = strdup(optarg); break; case 'G': free(gpibdev); gpibdev = strdup(optarg); break; case 's': seed = atol(optarg); if(seed == 0) errx(1, "invalid seed: %s", optarg); break; case 'h': case '?': default: help = 1; break; } } if (help) { fprintf(stderr, "Zoom Nilm DC Test\n"); fprintf(stderr, "usage: %s [options]\n\n", *argv); fprintf(stderr, " -Z, --zoom-device %-14s " "zoom NILM serial port\n", "/dev/xxx" /*zoomdev*/); fprintf(stderr, " -G, --gpib-device %-14s " "GPIB serial port\n", "/dev/xxx" /*gpibdev*/); fprintf(stderr, " -s, --seed %-16ld random seed\n", seed); fprintf(stderr, " -h, --help " "this help\n"); return 1; } signal(SIGINT, handle_sig); info("Initializing twister with seed %ld\n", seed); init_genrand(seed); info("Opening Zoom NILM device %s\n", zoomdev); if ((zoom = serial_open(zoomdev, 115200)) == -1) err(1, "failed to open zoom device %s", zoomdev); info("Opening GPIB device %s\n", gpibdev); if ((gpib = serial_open(gpibdev, 9600)) == -1) err(1, "failed to open gpib device %s", gpibdev); /* do it */ write_random(zoom, gpib); close(zoom); close(gpib); return 0; } void write_random(int zoom, int gpib) { int dac; double meas; struct timeval now; info("Initializing Zoom NILM\n"); if (zoom_init_nozero(zoom) < 0) goto fail; info("Initializing GPIB\n"); if (gpib_init(gpib) < 0) goto fail; info("Initializing Keithley\n"); if (gpib_addr(gpib, 23) < 0) goto fail; if (keithley2002_init_volts(gpib) < 0) goto fail; if (isnan(keithley2002_read(gpib))) goto fail; info("Running\n"); while (!g_quit) { dac = genrand_int32() & 0x3ff; zoom_write_dac(zoom, dac); gettimeofday(&now, NULL); meas = keithley2002_read(gpib); printf("%ld.%06ld %d %.12f\n", now.tv_sec, now.tv_usec, dac, meas); fflush(stdout); } safecleanup: return; fail: info("Failed\n"); goto safecleanup; }