]> rtime.felk.cvut.cz Git - can-utils.git/blobdiff - canbusload.c
can-calc-bit-timing: add support for rcar_can
[can-utils.git] / canbusload.c
index 36f3423e0aca9f24d6e7883c9e6fced729532d3d..8f6b10dc2ccb878a17e7035cda20906e971e0833 100644 (file)
@@ -1,7 +1,3 @@
-/*
- *  $Id$
- */
-
 /*
  * canbusload.c
  *
@@ -41,7 +37,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  * DAMAGE.
  *
- * Send feedback to <socketcan-users@lists.berlios.de>
+ * Send feedback to <linux-can@vger.kernel.org>
  *
  */
 
@@ -65,6 +61,7 @@
 #include <linux/can/raw.h>
 
 #include "terminal.h"
+#include "canframelen.h"
 
 #define MAXSOCK 16    /* max. number of CAN interfaces given on the cmdline */
 
@@ -88,6 +85,7 @@ static unsigned char redraw;
 static unsigned char timestamp;
 static unsigned char color;
 static unsigned char bargraph;
+static enum cfl_mode mode = CFL_WORSTCASE;
 static char *prg;
 
 void print_usage(char *prg)
@@ -98,20 +96,23 @@ void print_usage(char *prg)
        fprintf(stderr, "         -c (colorize lines)\n");
        fprintf(stderr, "         -b (show bargraph in %d%% resolution)\n", PERCENTRES);
        fprintf(stderr, "         -r (redraw the terminal - similar to top)\n");
+       fprintf(stderr, "         -i (ignore bitstuffing in bandwidth calculation)\n");
+       fprintf(stderr, "         -e (exact calculation of stuffed bits)\n");
        fprintf(stderr, "\n");
        fprintf(stderr, "Up to %d CAN interfaces with mandatory bitrate can be specified on the \n", MAXSOCK);
        fprintf(stderr, "commandline in the form: <ifname>@<bitrate>\n\n");
        fprintf(stderr, "The bitrate is mandatory as it is needed to know the CAN bus bitrate to\n");
        fprintf(stderr, "calcultate the bus load percentage based on the received CAN frames.\n");
+       fprintf(stderr, "Due to the bitstuffing estimation the calculated busload may exceed 100%%.\n");
        fprintf(stderr, "For each given interface the data is presented in one line which contains:\n\n");
        fprintf(stderr, "(interface) (received CAN frames) (used bits total) (used bits for payload)\n");
        fprintf(stderr, "\nExample:\n");
        fprintf(stderr, "\nuser$> canbusload can0@100000 can1@500000 can2@500000 can3@500000 -r -t -b -c\n\n");
-       fprintf(stderr, "%s 2008-05-27 15:18:49\n", prg);
-       fprintf(stderr, " can0@100000  805  74491  36656  74%%  |XXXXXXXXXXXXXX......|\n");
-       fprintf(stderr, " can1@500000  796  75140  37728  15%%  |XXX.................|\n");
-       fprintf(stderr, " can2@500000    0      0      0   0%%  |....................|\n");
-       fprintf(stderr, " can3@500000   47   4633   2424   0%%  |....................|\n");
+       fprintf(stderr, "%s 2014-02-01 21:13:16 (worst case bitstuffing)\n", prg);
+       fprintf(stderr, " can0@100000   805   74491  36656  74%% |XXXXXXXXXXXXXX......|\n");
+       fprintf(stderr, " can1@500000   796   75140  37728  15%% |XXX.................|\n");
+       fprintf(stderr, " can2@500000     0       0      0   0%% |....................|\n");
+       fprintf(stderr, " can3@500000    47    4633   2424   0%% |....................|\n");
        fprintf(stderr, "\n");
 }
 
@@ -138,7 +139,7 @@ void printstats(int signo)
 
                localtime_r(&currtime, &now);
 
-               printf("%s %04d-%02d-%02d %02d:%02d:%02d\n",
+               printf("%s %04d-%02d-%02d %02d:%02d:%02d ",
                       prg,
                       now.tm_year + 1900,
                       now.tm_mon + 1,
@@ -146,6 +147,28 @@ void printstats(int signo)
                       now.tm_hour,
                       now.tm_min,
                       now.tm_sec);
+
+               switch (mode) {
+
+               case CFL_NO_BITSTUFFING:
+                       /* plain bit calculation without bitstuffing */
+                       printf("(ignore bitstuffing)\n");
+                       break;
+
+               case CFL_WORSTCASE:
+                       /* worst case estimation - see above */
+                       printf("(worst case bitstuffing)\n");
+                       break;
+
+               case CFL_EXACT:
+                       /* exact calculation of stuffed bits based on frame content and CRC */
+                       printf("(exact bitstuffing)\n");
+                       break;
+
+               default:
+                       printf("(unknown bitstuffing)\n");
+                       break;
+               }
        }
 
        for (i=0; i<currmax; i++) {
@@ -162,7 +185,7 @@ void printstats(int signo)
                else
                        percent = 0;
 
-               printf(" %*s@%-*d %4d %6d %6d %3d%%",
+               printf(" %*s@%-*d %5d %7d %6d %3d%%",
                       max_devname_len, stat[i].devname,
                       max_bitrate_len, stat[i].bitrate,
                       stat[i].recv_frames,
@@ -172,7 +195,10 @@ void printstats(int signo)
 
                if (bargraph) {
 
-                       printf("  |");
+                       printf(" |");
+
+                       if (percent > 100)
+                               percent = 100;
 
                        for (j=0; j < NUMBAR; j++){
                                if (j < percent/PERCENTRES)
@@ -195,6 +221,7 @@ void printstats(int signo)
        }
 
        printf("\n");
+       fflush(stdout);
 
        alarm(1);
 }
@@ -220,7 +247,7 @@ int main(int argc, char **argv)
 
        prg = basename(argv[0]);
 
-       while ((opt = getopt(argc, argv, "rtbch?")) != -1) {
+       while ((opt = getopt(argc, argv, "rtbcieh?")) != -1) {
                switch (opt) {
                case 'r':
                        redraw = 1;
@@ -238,6 +265,14 @@ int main(int argc, char **argv)
                        color = 1;
                        break;
 
+               case 'i':
+                       mode = CFL_NO_BITSTUFFING;
+                       break;
+
+               case 'e':
+                       mode = CFL_EXACT;
+                       break;
+
                default:
                        print_usage(prg);
                        exit(1);
@@ -365,11 +400,8 @@ int main(int argc, char **argv)
 
                                stat[i].recv_frames++;
                                stat[i].recv_bits_payload += frame.can_dlc*8;
-                               stat[i].recv_bits_total += frame.can_dlc*8;
-                               if (frame.can_id & CAN_EFF_FLAG)
-                                       stat[i].recv_bits_total += 67;
-                               else
-                                       stat[i].recv_bits_total += 47;
+                               stat[i].recv_bits_total += can_frame_length((struct canfd_frame*)&frame,
+                                                                           mode, sizeof(frame));
                        }
                }
        }