1
0
mirror of git://projects.qi-hardware.com/ben-wpan.git synced 2024-11-26 03:24:04 +02:00

Added burst counter mode to cntr tool, plus assorted small improvements.

- tools/cntr/cntr.c (measure): also stop if ^C is pressed while we're
  unsuccessfully trying to communicate with the device
- tools/cntr/cntr.c (main): report a usage error if an argument is given to
  -i or -r
- tools/cntr/cntr.c (arm_stop, measure): moveing open-coded arming of the
  SIGINT handler to separate function
- tools/cntr/cntr.c (count_bursts, usage, main): added burst counter mode
  (cntr -b [timeout_s])
This commit is contained in:
Werner Almesberger 2010-11-04 22:35:24 -03:00
parent 8cb17bb1b3
commit df1706fe74

View File

@ -89,7 +89,7 @@ static void identify_cntr(usb_dev_handle *dev)
} }
/* ----- measurements ------------------------------------------------------ */ /* ---- packet reception --------------------------------------------------- */
struct sample { struct sample {
@ -99,13 +99,6 @@ struct sample {
static unsigned packets = 0, crc_errors = 0, inv_errors = 0; static unsigned packets = 0, crc_errors = 0, inv_errors = 0;
static volatile int stop = 0;
static void set_stop(int sig)
{
stop = 1;
}
static int get_sample(usb_dev_handle *dev, struct sample *s) static int get_sample(usb_dev_handle *dev, struct sample *s)
@ -163,6 +156,56 @@ static int get_sample(usb_dev_handle *dev, struct sample *s)
} }
/* ---- SIGINT (Ctrl-C) ---------------------------------------------------- */
static volatile int stop = 0;
static void set_stop(int sig)
{
stop = 1;
}
static void arm_stop(void)
{
signal(SIGINT, set_stop);
}
/* ---- burst counter ------------------------------------------------------ */
static void count_bursts(usb_dev_handle *dev, double timeout)
{
struct sample start, stable, now;
arm_stop();
while (!get_sample(dev, &start));
stable = start;
while (!stop) {
while (!get_sample(dev, &now))
if (stop)
break;
if (stable.cntr != now.cntr) {
stable = now;
continue;
}
if (now.t0-stable.t1 < timeout)
continue;
if (now.cntr == start.cntr)
continue;
printf("%llu\n", (unsigned long long) now.cntr-start.cntr);
start = now;
}
}
/* ----- measurements ------------------------------------------------------ */
static void measure(usb_dev_handle *dev, double clock_dev_s, double error_goal) static void measure(usb_dev_handle *dev, double clock_dev_s, double error_goal)
{ {
struct sample start, now; struct sample start, now;
@ -171,7 +214,7 @@ static void measure(usb_dev_handle *dev, double clock_dev_s, double error_goal)
char *f_exp, *error_exp; char *f_exp, *error_exp;
int i; int i;
signal(SIGINT, set_stop); arm_stop();
/* /*
* The round-trip time for getting the first sample is one of the * The round-trip time for getting the first sample is one of the
@ -190,7 +233,9 @@ static void measure(usb_dev_handle *dev, double clock_dev_s, double error_goal)
} }
while (!stop) { while (!stop) {
usleep(100000); usleep(100000);
while (!get_sample(dev, &now)); while (!get_sample(dev, &now))
if (stop)
break;
dc = now.cntr-start.cntr; dc = now.cntr-start.cntr;
dt = (now.t0+now.t1)/2.0-(start.t0+start.t1)/2.0; dt = (now.t0+now.t1)/2.0-(start.t0+start.t1)/2.0;
f = dc/dt; f = dc/dt;
@ -248,17 +293,20 @@ static void usage(const char *name)
{ {
fprintf(stderr, fprintf(stderr,
"usage: %s [-c clock_dev] [-d] [-v] [accuracy_ppm]\n" "usage: %s [-c clock_dev] [-d] [-v] [accuracy_ppm]\n"
"%6s %s -b [-d] [-v] [timeout_s]\n"
"%6s %s -i\n" "%6s %s -i\n"
"%6s %s -r\n\n" "%6s %s -r\n\n"
" accuracy_ppm stop when specified accuracy is reached (default: never\n" " accuracy_ppm stop when specified accuracy is reached (default: never\n"
" stop)\n" " stop)\n"
" timeout_s silence period between bursts, in seconds (default: 1s )\n"
" -b count bursts separated by silence periods\n"
" -c clock_dev maximum deviation of the system clock, in seconds\n" " -c clock_dev maximum deviation of the system clock, in seconds\n"
" (default: %g s)\n" " (default: %g s)\n"
" -d debug mode. Print counter values.\n" " -d debug mode. Print counter values.\n"
" -i identify the CNTR board\n" " -i identify the CNTR board\n"
" -r reset the CNTR board\n" " -r reset the CNTR board\n"
" -v verbose reporting of communication errors\n" " -v verbose reporting of communication errors\n"
, name, "", name, "", name, DEFAULT_CLOCK_DEV_S); , name, "", name, "", name, "", name, DEFAULT_CLOCK_DEV_S);
exit(1); exit(1);
} }
@ -266,13 +314,16 @@ static void usage(const char *name)
int main(int argc, char *const *argv) int main(int argc, char *const *argv)
{ {
usb_dev_handle *dev; usb_dev_handle *dev;
int c, identify = 0, reset = 0; int c, burst = 0, identify = 0, reset = 0;
double clock_dev_s = DEFAULT_CLOCK_DEV_S; double clock_dev_s = DEFAULT_CLOCK_DEV_S;
double error_goal = 0; double error_goal = 0;
char *end; char *end;
while ((c = getopt(argc, argv, "c:dir")) != EOF) while ((c = getopt(argc, argv, "bc:dir")) != EOF)
switch (c) { switch (c) {
case 'b':
burst = 1;
break;
case 'c': case 'c':
clock_dev_s = strtod(argv[optind], &end); clock_dev_s = strtod(argv[optind], &end);
if (*end) if (*end)
@ -290,13 +341,15 @@ int main(int argc, char *const *argv)
default: default:
usage(*argv); usage(*argv);
} }
if (identify && reset) if (burst+identify+reset > 1)
usage(*argv); usage(*argv);
switch (argc-optind) { switch (argc-optind) {
case 0: case 0:
break; break;
case 1: case 1:
if (identify || reset)
usage(*argv);
error_goal = strtod(argv[optind], &end)/1000000.0; error_goal = strtod(argv[optind], &end)/1000000.0;
if (*end) if (*end)
usage(*argv); usage(*argv);
@ -321,6 +374,11 @@ int main(int argc, char *const *argv)
return 0; return 0;
} }
if (burst) {
count_bursts(dev, error_goal ? error_goal : 1);
return 0;
}
measure(dev, clock_dev_s, error_goal); measure(dev, clock_dev_s, error_goal);
return 0; return 0;