cangen: add option for absolute timeouts

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
pull/389/head
Marc Kleine-Budde 2022-03-27 20:45:08 +02:00
parent df232c845a
commit f55ea38d14
1 changed files with 26 additions and 5 deletions

View File

@ -148,6 +148,7 @@ static void print_usage(char *prg)
fprintf(stderr, "Usage: %s [options] <CAN interface>\n", prg);
fprintf(stderr, "Options:\n");
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, " -f (generate CAN FD CAN frames)\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;
struct ifreq ifr;
struct timespec ts;
struct timespec ts, ts_gap;
struct timeval now;
int clock_nanosleep_flags = 0;
int ret;
/* set seed value for pseudo random numbers */
@ -244,13 +246,17 @@ int main(int argc, char **argv)
signal(SIGHUP, 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) {
case 'g':
gap = strtod(optarg, NULL);
break;
case 'a':
clock_nanosleep_flags = TIMER_ABSTIME;
break;
case 'e':
extended = 1;
break;
@ -363,8 +369,7 @@ int main(int argc, char **argv)
return 1;
}
ts.tv_sec = gap / 1000;
ts.tv_nsec = (long)(((long long)(gap * 1000000)) % 1000000000LL);
ts_gap = double_to_timespec(gap / 1000);
/* recognize obviously missing commandline option */
if (id_mode == MODE_FIX && frame.can_id > 0x7FF && !extended) {
@ -451,6 +456,16 @@ int main(int argc, char **argv)
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) {
frame.flags = 0;
@ -529,8 +544,14 @@ int main(int argc, char **argv)
if ((ts.tv_sec || ts.tv_nsec) &&
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;
}
}
if (verbose) {