- #include <stdio.h>
- #include <string.h>
- #define __USE_ISOC99
- #include <math.h>
- #include "zoom.h"
- #include "serial-util.h"
-
- #define zputs(s) do { if (safewrite(fd, s, strlen(s)) != strlen(s)) return -1; } while(0)
- #define zputc(ch) do { const char ____c = ch; if (safewrite(fd, &____c, 1) != 1) return -1; } while(0)
-
- static int last_dac, last_adc;
-
- static int verify_prompt(int fd)
- {
- char s[128];
- int dac1, dac2, adc1, adc2;
- if (fdgets(s, 128, fd, 1000) == NULL)
- return -1;
- chomp(s);
- if (sscanf(s, "%x %d %x %d", &dac1, &dac2, &adc1, &adc2) != 4)
- return -1;
- if (dac1 != dac2 || adc1 != adc2)
- return -1;
- last_dac = dac1;
- last_adc = adc1;
- return 0;
- }
-
- int zoom_init_real(int fd, int dozero)
- {
- zputs(dozero ? "00000000" : " ");
- drain(fd);
- zputc(dozero ? '0' : ' ');
- if (verify_prompt(fd) < 0)
- return -1;
- return 0;
- }
-
- int zoom_zero_start(int fd)
- {
- char s[128];
- zputc('z');
- if (fdgets(s, 128, fd, 1000) == NULL)
- return -1;
- chomp(s);
- if (strcmp(s, "zeroing input...") != 0)
- return -1;
- return 0;
- }
-
- int zoom_zero_stop(int fd)
- {
- zputc(' ');
- if (verify_prompt(fd) < 0)
- return -1;
- return last_dac;
- }
-
- int zoom_sweep(int fd, int dac[ZOOM_SWEEP_COUNT], int adc[ZOOM_SWEEP_COUNT])
- {
- char s[128];
- int i;
- char c;
- zputc('s');
- if (fdgets(s, 128, fd, 1000) == NULL)
- return -1;
- if (strncmp(s, "sweep around", 12) != 0)
- return -1;
- for (i = 0; i < ZOOM_SWEEP_COUNT; i++) {
- if (fdgets(s, 128, fd, 1000) == NULL)
- return -1;
- chomp(s);
- if (sscanf(s, "%d %d%c", &dac[i], &adc[i], &c) != 2)
- return -2;
- }
- if (verify_prompt(fd) < 0)
- return -3;
- return 0;
- }
-
- /* Run mode: */
-
- void zoomrun_trigger_calibrate(int fd)
- {
- char c = 'c';
- write(fd, &c, 1);
- drain_timeout(fd, 0);
- }
|