Skip to content

Commit 71e8c16

Browse files
committed
Optional nanosecond timestamp logging
1 parent 76b5891 commit 71e8c16

File tree

1 file changed

+35
-12
lines changed

1 file changed

+35
-12
lines changed

candump.c

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ static void print_usage(void)
128128
fprintf(stderr, "Options:\n");
129129
fprintf(stderr, " -t <type> (timestamp: (a)bsolute/(d)elta/(z)ero/(A)bsolute w date)\n");
130130
fprintf(stderr, " -H (read hardware timestamps instead of system timestamps)\n");
131+
fprintf(stderr, " -N (log nanosecond timestamps instead of microseconds)\n");
131132
fprintf(stderr, " -c (increment color mode level)\n");
132133
fprintf(stderr, " -i (binary output - may exceed 80 chars/line)\n");
133134
fprintf(stderr, " -a (enable additional ASCII output)\n");
@@ -220,16 +221,22 @@ static int idx2dindex(int ifidx, int socket)
220221
return i;
221222
}
222223

223-
static int sprint_timestamp(char *ts_buffer, const char timestamp,
224+
static int sprint_timestamp(char *ts_buffer, const char timestamp, unsigned char use_ns,
224225
const struct timespec *ts, struct timespec *const last_ts)
225226
{
226227
int numchars = 0;
227228

228229
switch (timestamp) {
229230
case 'a': /* absolute with timestamp */
230-
numchars = sprintf(ts_buffer, "(%010llu.%09llu) ",
231-
(unsigned long long)ts->tv_sec,
232-
(unsigned long long)ts->tv_nsec);
231+
if (use_ns) {
232+
numchars = sprintf(ts_buffer, "(%010llu.%09llu) ",
233+
(unsigned long long)ts->tv_sec,
234+
(unsigned long long)ts->tv_nsec);
235+
} else {
236+
numchars = sprintf(ts_buffer, "(%010llu.%06llu) ",
237+
(unsigned long long)ts->tv_sec,
238+
(unsigned long long)ts->tv_nsec / 1000);
239+
}
233240
break;
234241

235242
case 'A': /* absolute with date */
@@ -239,8 +246,13 @@ static int sprint_timestamp(char *ts_buffer, const char timestamp,
239246

240247
tm = *localtime(&ts->tv_sec);
241248
strftime(timestring, 24, "%Y-%m-%d %H:%M:%S", &tm);
242-
numchars = sprintf(ts_buffer, "(%s.%09llu) ", timestring,
243-
(unsigned long long)ts->tv_nsec);
249+
if (use_ns) {
250+
numchars = sprintf(ts_buffer, "(%s.%09llu) ", timestring,
251+
(unsigned long long)ts->tv_nsec);
252+
} else {
253+
numchars = sprintf(ts_buffer, "(%s.%06llu) ", timestring,
254+
(unsigned long long)ts->tv_nsec / 1000);
255+
}
244256
}
245257
break;
246258

@@ -257,9 +269,15 @@ static int sprint_timestamp(char *ts_buffer, const char timestamp,
257269
diff.tv_sec--, diff.tv_nsec += 1000000000;
258270
if (diff.tv_sec < 0)
259271
diff.tv_sec = diff.tv_nsec = 0;
260-
numchars = sprintf(ts_buffer, "(%03llu.%09llu) ",
261-
(unsigned long long)diff.tv_sec,
262-
(unsigned long long)diff.tv_nsec);
272+
if (use_ns) {
273+
numchars = sprintf(ts_buffer, "(%03llu.%09llu) ",
274+
(unsigned long long)diff.tv_sec,
275+
(unsigned long long)diff.tv_nsec);
276+
} else {
277+
numchars = sprintf(ts_buffer, "(%03llu.%06llu) ",
278+
(unsigned long long)diff.tv_sec,
279+
(unsigned long long)diff.tv_nsec / 1000);
280+
}
263281

264282
if (timestamp == 'd')
265283
*last_ts = *ts; /* update for delta calculation */
@@ -288,6 +306,7 @@ int main(int argc, char **argv)
288306
unsigned char timestamp = 0;
289307
unsigned char logtimestamp = 'a';
290308
unsigned char hwtimestamp = 0;
309+
unsigned char use_ns = 0;
291310
unsigned char down_causes_exit = 1;
292311
unsigned char dropmonitor = 0;
293312
unsigned char extra_msg_info = 0;
@@ -339,7 +358,7 @@ int main(int argc, char **argv)
339358

340359
progname = basename(argv[0]);
341360

342-
while ((opt = getopt(argc, argv, "t:HciaSs:lf:Ln:r:Dde8xT:h?")) != -1) {
361+
while ((opt = getopt(argc, argv, "t:HNciaSs:lf:Ln:r:Dde8xT:h?")) != -1) {
343362
switch (opt) {
344363
case 't':
345364
timestamp = optarg[0];
@@ -359,6 +378,10 @@ int main(int argc, char **argv)
359378
hwtimestamp = 1;
360379
break;
361380

381+
case 'N':
382+
use_ns = 1;
383+
break;
384+
362385
case 'c':
363386
color++;
364387
break;
@@ -834,7 +857,7 @@ int main(int argc, char **argv)
834857
/* build common log format output */
835858
if ((log) || ((logfrmt) && (silent == SILENT_OFF))) {
836859

837-
alen = sprint_timestamp(afrbuf, logtimestamp,
860+
alen = sprint_timestamp(afrbuf, logtimestamp, use_ns,
838861
&ts, &last_ts);
839862

840863
alen += sprintf(afrbuf + alen, "%*s ",
@@ -864,7 +887,7 @@ int main(int argc, char **argv)
864887

865888
/* print (colored) long CAN frame style to stdout */
866889
alen = sprintf(afrbuf, " %s", (color > 2) ? col_on[idx % MAXCOL] : "");
867-
alen += sprint_timestamp(afrbuf + alen, timestamp, &ts, &last_ts);
890+
alen += sprint_timestamp(afrbuf + alen, timestamp, use_ns, &ts, &last_ts);
868891
alen += sprintf(afrbuf + alen, " %s%*s",
869892
(color && (color < 3)) ? col_on[idx % MAXCOL] : "",
870893
max_devname_len, devname[idx]);

0 commit comments

Comments
 (0)