Commit a42d06be authored by Tomasz Wlostowski's avatar Tomasz Wlostowski Committed by Alessandro Rubini

tools: less information in human-readable status, some fixes [WIP]

parent 303b79c6
...@@ -146,7 +146,7 @@ void parse_default(struct fdelay_pulse *p) ...@@ -146,7 +146,7 @@ void parse_default(struct fdelay_pulse *p)
memset(p, 0, sizeof(*p)); memset(p, 0, sizeof(*p));
memset(&t_width, 0, sizeof(&t_width)); memset(&t_width, 0, sizeof(&t_width));
p->mode = FD_OUT_MODE_PULSE; p->mode = FD_OUT_MODE_PULSE;
p->rep = -1; /* infinite */ p->rep = -1; /* 1 pulse */
/* Default settings are for 10Hz, 1us width */ /* Default settings are for 10Hz, 1us width */
p->loop.coarse = COARSE_PER_SEC / 10; p->loop.coarse = COARSE_PER_SEC / 10;
...@@ -347,14 +347,14 @@ int main(int argc, char **argv) ...@@ -347,14 +347,14 @@ int main(int argc, char **argv)
p.end = ts_add(p.start, t_width); p.end = ts_add(p.start, t_width);
/* In delay mode, default is one pulse only; recover if wrong */ /* In delay mode, default is one pulse only; recover if wrong */
if (p.mode == FD_OUT_MODE_PULSE && p.rep <= 0) if (p.mode == FD_OUT_MODE_DELAY && p.rep <= 0)
p.rep = 1; p.rep = 1;
/* Done. Report verbosely and activate the information we parsed */ /* Done. Report verbosely and activate the information we parsed */
channel = FDELAY_OUTPUT_USER_TO_HW(channel); channel = FDELAY_OUTPUT_USER_TO_HW(channel);
if (verbose) { if (verbose) {
tools_report_action(channel, &p, TOOLS_UMODE_USER); report_output_config(channel, &p, TOOLS_UMODE_USER);
tools_report_action(channel, &p, TOOLS_UMODE_RAW); // tools_report_action(channel, &p, TOOLS_UMODE_RAW);
} }
if (fdelay_config_pulse(b, channel, &p) < 0) { if (fdelay_config_pulse(b, channel, &p) < 0) {
fprintf(stderr, "%s: fdelay_config_pulse(): %s\n", fprintf(stderr, "%s: fdelay_config_pulse(): %s\n",
......
...@@ -12,7 +12,8 @@ void help(char *name) ...@@ -12,7 +12,8 @@ void help(char *name)
{ {
fprintf(stderr, "fmc-fdelay-status: reports channel programming\n"); fprintf(stderr, "fmc-fdelay-status: reports channel programming\n");
fprintf(stderr, "Use: \"%s [-i <index>] [-d <dev>]\"\n", name); fprintf(stderr, "Use: \"%s [-i <index>] [-d <dev>] [-r]\"\n", name);
fprintf(stderr, "-r: display raw device configuration");
exit(1); exit(1);
} }
...@@ -68,10 +69,10 @@ int main(int argc, char **argv) ...@@ -68,10 +69,10 @@ int main(int argc, char **argv)
argv[0], ch, strerror(errno)); argv[0], ch, strerror(errno));
} }
/* pass hw number again, as the function is low-level */ /* pass hw number again, as the function is low-level */
tools_report_action(FDELAY_OUTPUT_USER_TO_HW(ch), report_output_config(FDELAY_OUTPUT_USER_TO_HW(ch),
&p, TOOLS_UMODE_USER); &p, TOOLS_UMODE_USER);
tools_report_action(FDELAY_OUTPUT_USER_TO_HW(ch), // tools_report_action(FDELAY_OUTPUT_USER_TO_HW(ch),
&p, TOOLS_UMODE_RAW); // &p, TOOLS_UMODE_RAW);
} }
fdelay_close(b); fdelay_close(b);
fdelay_exit(); fdelay_exit();
......
...@@ -11,6 +11,6 @@ extern int tools_need_help(int argc, char **argv); ...@@ -11,6 +11,6 @@ extern int tools_need_help(int argc, char **argv);
#define TOOLS_UMODE_FLOAT 2 #define TOOLS_UMODE_FLOAT 2
extern void tools_report_time(char *name, struct fdelay_time *t, int umode); extern void tools_report_time(char *name, struct fdelay_time *t, int umode);
extern void tools_report_action(int channel, struct fdelay_pulse *p, int umode); extern void report_output_config(int channel, struct fdelay_pulse *p, int umode);
extern void help(char *name); /* This is mandatory in all tools */ extern void help(char *name); /* This is mandatory in all tools */
...@@ -54,10 +54,10 @@ void tools_report_time(char *name, struct fdelay_time *t, int umode) ...@@ -54,10 +54,10 @@ void tools_report_time(char *name, struct fdelay_time *t, int umode)
t->coarse * 8000ULL + t->coarse * 8000ULL +
t->frac * 8000ULL / 4096ULL; t->frac * 8000ULL / 4096ULL;
printf(" %s ", name); printf("%s ", name);
switch(umode) { switch(umode) {
case TOOLS_UMODE_USER: case TOOLS_UMODE_USER:
printf ("time %10llu:%03llu,%03llu,%03llu,%03llu ps\n", printf ("%10llu:%03llu,%03llu,%03llu,%03llu ps\n",
(long long)(t->utc), (long long)(t->utc),
(picoseconds / (1000LL * 1000 * 1000)), (picoseconds / (1000LL * 1000 * 1000)),
(picoseconds / (1000LL * 1000) % 1000), (picoseconds / (1000LL * 1000) % 1000),
...@@ -65,34 +65,95 @@ void tools_report_time(char *name, struct fdelay_time *t, int umode) ...@@ -65,34 +65,95 @@ void tools_report_time(char *name, struct fdelay_time *t, int umode)
(picoseconds % 1000LL)); (picoseconds % 1000LL));
break; break;
case TOOLS_UMODE_FLOAT: case TOOLS_UMODE_FLOAT:
printf ("time %10llu.%012llu\n", (long long)(t->utc), printf ("float %10llu.%012llu\n", (long long)(t->utc),
picoseconds); picoseconds);
break; break;
case TOOLS_UMODE_RAW: case TOOLS_UMODE_RAW:
printf(" raw utc %10lli, coarse %9li, frac %9li\n", printf("raw utc %10lli, coarse %9li, frac %9li\n",
(long long)t->utc, (long)t->coarse, (long)t->frac); (long long)t->utc, (long)t->coarse, (long)t->frac);
break; break;
} }
} }
void tools_report_action(int channel, struct fdelay_pulse *p, int umode) static struct fdelay_time fd_ts_sub(struct fdelay_time a, struct fdelay_time b)
{ {
char *mode; struct fdelay_time rv;
char s[80]; int f, c = 0;
int64_t u = 0;
if (p->mode == FD_OUT_MODE_DISABLED) mode = "disable";
else if (p->mode == FD_OUT_MODE_PULSE) mode = "pulse"; f = a.frac - b.frac;
else if (p->mode == FD_OUT_MODE_DELAY) mode = "delay"; if(f < 0)
else if (p->mode == 0x80) mode = "already-triggered"; {
else { f += 4096;
sprintf(s, "%i (0x%04x)", p->mode, p->mode); c--;
mode = s; }
c += a.coarse - b.coarse;
if(c < 0)
{
c += 125 * 1000 * 1000;
u--;
} }
printf("Channel %i, mode %s, repeat %i %s\n", u += a.utc - b.utc;
FDELAY_OUTPUT_HW_TO_USER(channel), mode, rv.utc = u;
p->rep, p->rep == -1 ? "(infinite)" : ""); rv.coarse = c;
tools_report_time("start", &p->start, umode); rv.frac = f;
tools_report_time("end ", &p->end, umode); return rv;
tools_report_time("loop ", &p->loop, umode); }
static void report_output_config_human(int channel, struct fdelay_pulse *p)
{
struct fdelay_time width;
printf("Channel %i: ", FDELAY_OUTPUT_HW_TO_USER(channel));
int m = p->mode & 0x7f;
switch(m)
{
case FD_OUT_MODE_DISABLED:
printf("disabled\n");
return;
case FD_OUT_MODE_PULSE:
printf("pulse generator mode");
break;
case FD_OUT_MODE_DELAY:
printf("delay mode");
break;
default:
printf("unknown mode\n");
return;
}
if(p->mode & 0x80)
printf("(triggered) ");
tools_report_time(m == FD_OUT_MODE_DELAY ? "\n delay: " : "\n start at: ",
&p->start, TOOLS_UMODE_USER);
width = fd_ts_sub(p->end, p->start);
tools_report_time(" pulse width: ", &width, TOOLS_UMODE_USER);
if(p->rep != 1)
{
printf(" repeat: ");
if(p->rep == -1)
printf("infinite\n");
else
printf("%d times\n", p->rep);
tools_report_time(" period: ", &p->loop, TOOLS_UMODE_USER);
}
}
void report_output_config(int channel, struct fdelay_pulse *p, int umode)
{
switch(umode)
{
case TOOLS_UMODE_USER:
report_output_config_human(channel, p);
default:
break;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment