dahdi_maint: Minor name change for the error counters
[dahdi/tools.git] / dahdi_test.c
1 /*
2  * Written by Mark Spencer <markster@digium.com>
3  * Based on previous works, designs, and architectures conceived and
4  * written by Jim Dixon <jim@lambdatel.com>.
5  *
6  * Copyright (C) 2001 Jim Dixon / Zapata Telephony.
7  * Copyright (C) 2001-2008 Digium, Inc.
8  *
9  * All rights reserved.
10  *
11  * Primary Author: Mark Spencer <markster@digium.com>
12  * Radio Support by Jim Dixon <jim@lambdatel.com>
13  */
14
15 /*
16  * See http://www.asterisk.org for more information about
17  * the Asterisk project. Please do not directly contact
18  * any of the maintainers of this project for assistance;
19  * the project provides a web site, mailing lists and IRC
20  * channels for your use.
21  *
22  * This program is free software, distributed under the terms of
23  * the GNU General Public License Version 2 as published by the
24  * Free Software Foundation. See the LICENSE file included with
25  * this program for more details.
26  */
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <unistd.h>
31 #include <errno.h>
32 #include <string.h>
33 #include <fcntl.h>
34 #include <sys/time.h>
35 #include <sys/signal.h>
36 #include <math.h>
37 #include <getopt.h>
38
39 #include "dahdi_tools_version.h"
40
41 #define SIZE 8000
42
43 static int pass = 0;
44 static float best = 0.0;
45 static float worst = 100.0;
46 static double total = 0.0;
47 static double delay_total = 0.0;
48
49 void hup_handler(int sig)
50 {
51         printf("\n--- Results after %d passes ---\n", pass);
52         printf("Best: %.3f -- Worst: %.3f -- Average: %f, Difference: %f\n", 
53                         best, worst, pass ? total/pass : 100.00, pass ? delay_total/pass : 100);
54         exit(0);
55 }
56
57 static void usage(char *argv0)
58 {
59         char *c;
60         c = strrchr(argv0, '/');
61         if (!c)
62                 c = argv0;
63         else
64                 c++;
65         fprintf(stderr, 
66                 "Usage: %s [-c COUNT] [-v]\n"
67                 "    Valid options are:\n"
68                 "  -c COUNT    Run just COUNT cycles (otherwise: forever).\n"
69                 "  -v          More verbose output.\n"
70                 "  -h          This help text.\n"
71         , c);
72 }
73
74 int main(int argc, char *argv[])
75 {
76         int fd;
77         int res;
78         int c;
79         int count = 0;
80         int seconds = 0;
81         int curarg = 1;
82         int verbose = 0;
83         char buf[8192];
84         float score;
85         float ms;
86         struct timeval start, now;
87         fd = open("/dev/dahdi/pseudo", O_RDWR);
88         if (fd < 0) {
89                 fprintf(stderr, "Unable to open dahdi interface: %s\n", strerror(errno));
90                 exit(1);
91         }
92         
93         while ((c = getopt(argc, argv, "c:hv")) != -1) {
94                 switch(c) {
95                 case 'c':
96                         seconds = atoi(optarg);
97                         break;
98                 case 'h':
99                         usage(argv[0]);
100                         exit(0);
101                         break;
102                 case '?':
103                         usage(argv[0]);
104                         exit(1);
105                         break;
106                 case 'v':
107                         verbose++;
108                         break;
109                 }
110         }
111         while (curarg < argc) {
112                 if (!strcasecmp(argv[curarg], "-v"))
113                         verbose++;
114                 if (!strcasecmp(argv[curarg], "-c") && argc > curarg)
115                         seconds = atoi(argv[curarg + 1]);
116                 curarg++;
117         }
118         printf("Opened pseudo dahdi interface, measuring accuracy...\n");
119         signal(SIGHUP, hup_handler);
120         signal(SIGINT, hup_handler);
121         signal(SIGALRM, hup_handler);
122         /* Flush input buffer */
123         for (count = 0; count < 4; count++)
124                 res = read(fd, buf, sizeof(buf));
125         count = 0;
126         ms = 0; /* Makes the compiler happy */
127         if (seconds > 0)
128                 alarm(seconds + 1); /* This will give 'seconds' cycles */
129         for (;;) {
130                 if (count == 0)
131                         ms = 0;
132                 gettimeofday(&start, NULL);
133                 res = read(fd, buf, sizeof(buf));
134                 if (res < 0) {
135                         fprintf(stderr, "Failed to read from pseudo interface: %s\n", strerror(errno));
136                         exit(1);
137                 }
138                 count += res;
139                 gettimeofday(&now, NULL);
140                 ms += (now.tv_sec - start.tv_sec) * 8000;
141                 ms += (now.tv_usec - start.tv_usec) / 125.0;
142                 if (count >= SIZE) {
143                         double percent = 100.0 * (count - ms) / count;
144                         if (verbose) {
145                                 printf("\n%d samples in %0.3f system clock sample intervals (%.3f%%)", 
146                                                 count, ms, 100 - percent);
147                         } else if (pass > 0 && (pass % 8) == 0) {
148                                 printf("\n");
149                         }
150                         score = 100.0 - fabs(percent);
151                         if (score > best)
152                                 best = score;
153                         if (score < worst)
154                                 worst = score;
155                         if (!verbose)
156                                 printf("%.3f%% ", score);
157                         total += score;
158                         delay_total += 100 - percent;
159                         fflush(stdout);
160                         count = 0;
161                         pass++;
162                 }
163         }
164 }