struct histogram histogram;
-int can_frame_sprintf(char *buf, struct can_frame *frame)
-{
- char datastr[17];
- int i;
- for (i=0; i<8; i++)
- sprintf(&datastr[i*2], "%02x", frame->data[i]);
- sprintf(buf, "id=0x%x, len=%d, data=%s",
- frame->can_id, frame->can_dlc, datastr);
+void sprint_canframe(char *buf , struct can_frame *cf, int sep) {
+ /* documentation see lib.h */
+
+ int i,offset;
+ int dlc = (cf->can_dlc > 8)? 8 : cf->can_dlc;
+
+ if (cf->can_id & CAN_ERR_FLAG) {
+ sprintf(buf, "%08X#", cf->can_id & (CAN_ERR_MASK|CAN_ERR_FLAG));
+ offset = 9;
+ } else if (cf->can_id & CAN_EFF_FLAG) {
+ sprintf(buf, "%08X#", cf->can_id & CAN_EFF_MASK);
+ offset = 9;
+ } else {
+ sprintf(buf, "%03X#", cf->can_id & CAN_SFF_MASK);
+ offset = 4;
+ }
+
+ if (cf->can_id & CAN_RTR_FLAG) /* there are no ERR frames with RTR */
+ sprintf(buf+offset, "R");
+ else
+ for (i = 0; i < dlc; i++) {
+ sprintf(buf+offset, "%02X", cf->data[i]);
+ offset += 2;
+ if (sep && (i+1 < dlc))
+ sprintf(buf+offset++, ".");
+ }
}
static inline struct msg_info *frame2info(struct can_frame *frame)
static long num = 0;
char sent[64], received[64];
- can_frame_sprintf(sent, &mi->sent);
- can_frame_sprintf(received, &mi->received);
+ sprint_canframe(sent, &mi->sent, true);
+ sprint_canframe(received, &mi->received, true);
#define S(ts) tstamp_str(local, &ts)
#define DIFF(a, b) (timespec_subtract(&diff, &b, &a), S(diff))
if (num_interfaces == 2)
- fprintf(f, "%ld: %s [%s] -> %s (%s) [%s] = %s (%s)\n",
+ fprintf(f, "%ld: %s %s -> %s (%s) %s = %s (%s)\n",
num, S(mi->ts_sent), sent, S(mi->ts_rx_final_kern), S(mi->ts_rx_final), received,
DIFF(mi->ts_sent, mi->ts_rx_final_kern),
DIFF(mi->ts_sent, mi->ts_rx_final));
else
- fprintf(f, "%ld: %s [%s] -> %s (%s) -> %s (%s) [%s] = %s (%s), %s (%s)\n",
+ fprintf(f, "%ld: %s %s -> %s (%s) -> %s (%s) %s = %s (%s), %s (%s)\n",
num, S(mi->ts_sent), sent,
S(mi->ts_rx_onwire_kern), S(mi->ts_rx_onwire),
S(mi->ts_rx_final_kern), S(mi->ts_rx_final), received,
MEMSET_ZERO(frame);
i = curr_msg+1;
- while (msg_infos[i].id != 0 && i != curr_msg) {
+ while (msg_infos[i].id != -1 && i != curr_msg) {
i++;
if (i >= MAX_INFOS)
i = 0;
void msg_info_free(struct msg_info *mi)
{
- mi->id = 0;
+ mi->id = -1;
}
static inline void get_next_timeout(struct timespec *timeout)
{
pthread_t thread;
sigset_t set;
- int ret;
+ int ret, i;
parse_options(argc, argv);
signal(SIGINT, term_handler);
signal(SIGTERM, term_handler);
+ for (i=0; i<MAX_INFOS; i++)
+ msg_infos[i].id = -1;
+
if (opt.histogram) {
histogram_init(&histogram, 5000000, 1);
}