zoom/pc/zoom.c

105 lines
1.9 KiB
C

#include <stdio.h>
#include <string.h>
#ifndef __USE_ISOC99
#define __USE_ISOC99
#endif
#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)
if (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;
}
int zoom_write_dac(int fd, int dac)
{
char s[128];
sprintf(s, "v%04x", dac);
zputs(s);
if (verify_prompt(fd) < 0)
return -1;
return last_dac;
}
/* Run mode: */
void zoomrun_trigger_calibrate(int fd)
{
char c = 'c';
write(fd, &c, 1);
drain_timeout(fd, 0);
}