cangen: add option for absolute timeouts
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>pull/389/head
parent
df232c845a
commit
f55ea38d14
31
cangen.c
31
cangen.c
|
|
@ -148,6 +148,7 @@ static void print_usage(char *prg)
|
||||||
fprintf(stderr, "Usage: %s [options] <CAN interface>\n", prg);
|
fprintf(stderr, "Usage: %s [options] <CAN interface>\n", prg);
|
||||||
fprintf(stderr, "Options:\n");
|
fprintf(stderr, "Options:\n");
|
||||||
fprintf(stderr, " -g <ms> (gap in milli seconds - default: %d ms)\n", DEFAULT_GAP);
|
fprintf(stderr, " -g <ms> (gap in milli seconds - default: %d ms)\n", DEFAULT_GAP);
|
||||||
|
fprintf(stderr, " -a (use absolute time for gap)");
|
||||||
fprintf(stderr, " -e (generate extended frame mode (EFF) CAN frames)\n");
|
fprintf(stderr, " -e (generate extended frame mode (EFF) CAN frames)\n");
|
||||||
fprintf(stderr, " -f (generate CAN FD CAN frames)\n");
|
fprintf(stderr, " -f (generate CAN FD CAN frames)\n");
|
||||||
fprintf(stderr, " -b (generate CAN FD CAN frames with bitrate switch (BRS))\n");
|
fprintf(stderr, " -b (generate CAN FD CAN frames with bitrate switch (BRS))\n");
|
||||||
|
|
@ -232,8 +233,9 @@ int main(int argc, char **argv)
|
||||||
int i;
|
int i;
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
|
|
||||||
struct timespec ts;
|
struct timespec ts, ts_gap;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
|
int clock_nanosleep_flags = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* set seed value for pseudo random numbers */
|
/* set seed value for pseudo random numbers */
|
||||||
|
|
@ -244,13 +246,17 @@ int main(int argc, char **argv)
|
||||||
signal(SIGHUP, sigterm);
|
signal(SIGHUP, sigterm);
|
||||||
signal(SIGINT, sigterm);
|
signal(SIGINT, sigterm);
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "g:efbER8mI:L:D:p:n:ixc:vh?")) != -1) {
|
while ((opt = getopt(argc, argv, "g:aefbER8mI:L:D:p:n:ixc:vh?")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
|
||||||
case 'g':
|
case 'g':
|
||||||
gap = strtod(optarg, NULL);
|
gap = strtod(optarg, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'a':
|
||||||
|
clock_nanosleep_flags = TIMER_ABSTIME;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'e':
|
case 'e':
|
||||||
extended = 1;
|
extended = 1;
|
||||||
break;
|
break;
|
||||||
|
|
@ -363,8 +369,7 @@ int main(int argc, char **argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ts.tv_sec = gap / 1000;
|
ts_gap = double_to_timespec(gap / 1000);
|
||||||
ts.tv_nsec = (long)(((long long)(gap * 1000000)) % 1000000000LL);
|
|
||||||
|
|
||||||
/* recognize obviously missing commandline option */
|
/* recognize obviously missing commandline option */
|
||||||
if (id_mode == MODE_FIX && frame.can_id > 0x7FF && !extended) {
|
if (id_mode == MODE_FIX && frame.can_id > 0x7FF && !extended) {
|
||||||
|
|
@ -451,6 +456,16 @@ int main(int argc, char **argv)
|
||||||
fds.events = POLLOUT;
|
fds.events = POLLOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (clock_nanosleep_flags == TIMER_ABSTIME) {
|
||||||
|
ret = clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||||
|
if (ret) {
|
||||||
|
perror("clock_gettime");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ts = ts_gap;
|
||||||
|
}
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
frame.flags = 0;
|
frame.flags = 0;
|
||||||
|
|
||||||
|
|
@ -529,9 +544,15 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
if ((ts.tv_sec || ts.tv_nsec) &&
|
if ((ts.tv_sec || ts.tv_nsec) &&
|
||||||
burst_sent_count >= burst_count) {
|
burst_sent_count >= burst_count) {
|
||||||
if (nanosleep(&ts, NULL))
|
if (clock_nanosleep_flags == TIMER_ABSTIME)
|
||||||
|
ts = timespec_add(ts, ts_gap);
|
||||||
|
|
||||||
|
ret = clock_nanosleep(CLOCK_MONOTONIC, clock_nanosleep_flags, &ts, NULL);
|
||||||
|
if (ret != 0 && ret != EINTR) {
|
||||||
|
perror("clock_nanosleep");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
printf(" %s ", argv[optind]);
|
printf(" %s ", argv[optind]);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue