iankelling.org
/
git
/
evhz
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
remove last testing date, code is stable
[evhz]
/
evhz.c
diff --git
a/evhz.c
b/evhz.c
index e3cc90cda2f6194e2c84c5813b4796481a76751b..4fd770dadc8e30ce843c5f1b8fb585c5ff2686d2 100644
(file)
--- a/
evhz.c
+++ b/
evhz.c
@@
-19,7
+19,7
@@
#include <getopt.h>
#include <unistd.h>
#include <getopt.h>
#include <unistd.h>
-#define EVENTS
5
0
+#define EVENTS
20
0
#define HZ_LIST 64
typedef struct event_s {
#define HZ_LIST 64
typedef struct event_s {
@@
-27,7
+27,7
@@
typedef struct event_s {
int hz[HZ_LIST];
int count;
int avghz;
int hz[HZ_LIST];
int count;
int avghz;
-
double prv
time;
+
unsigned long long prev_
time;
char name[128];
} event_t;
char name[128];
} event_t;
@@
-42,6
+42,7
@@
int main(int argc, char *argv[]) {
int i;
event_t events[EVENTS];
int verbose = 1;
int i;
event_t events[EVENTS];
int verbose = 1;
+ int max_event = 0;
while((optch = getopt(argc, argv, "hn")) != -1) {
switch(optch) {
while((optch = getopt(argc, argv, "hn")) != -1) {
switch(optch) {
@@
-70,12
+71,15
@@
int main(int argc, char *argv[]) {
// List input devices
for(i = 0; i < EVENTS; i++) {
// List input devices
for(i = 0; i < EVENTS; i++) {
- char device[19];
+ // 20 is needed for 3 digits of event devs under the expected format, but
+ // just give it some extra in case.
+ char device[30];
sprintf(device, "/dev/input/event%i", i);
events[i].fd = open(device, O_RDONLY);
if(events[i].fd != -1) {
sprintf(device, "/dev/input/event%i", i);
events[i].fd = open(device, O_RDONLY);
if(events[i].fd != -1) {
+ max_event = i;
ioctl(events[i].fd, EVIOCGNAME(sizeof(events[i].name)), events[i].name);
if(verbose) printf("event%i: %s\n", i, events[i].name);
}
ioctl(events[i].fd, EVIOCGNAME(sizeof(events[i].name)), events[i].name);
if(verbose) printf("event%i: %s\n", i, events[i].name);
}
@@
-86,58
+90,67
@@
int main(int argc, char *argv[]) {
FD_ZERO(&set);
FD_ZERO(&set);
- for(i = 0; i <
EVENTS
; i++) {
+ for(i = 0; i <
= max_event
; i++) {
if(events[i].fd != -1) {
FD_SET(events[i].fd, &set);
}
}
if(events[i].fd != -1) {
FD_SET(events[i].fd, &set);
}
}
- if(select(FD_SETSIZE, &set, NULL, NULL, NULL)
>
0) {
-
int bytes
;
- struct input_event event;
+ if(select(FD_SETSIZE, &set, NULL, NULL, NULL)
<=
0) {
+
continue
;
+ }
- for(i = 0; i < EVENTS; i++) {
- if(events[i].fd == -1 || !FD_ISSET(events[i].fd, &set)) {
- continue;
- }
+ int bytes;
+ struct input_event event;
- bytes = read(events[i].fd, &event, sizeof(event));
+ for(i = 0; i <= max_event; i++) {
+ if(events[i].fd == -1 || !FD_ISSET(events[i].fd, &set)) {
+ continue;
+ }
- if(bytes != sizeof(event)) {
- continue;
- }
+ bytes = read(events[i].fd, &event, sizeof(event));
+
+ if(bytes != sizeof(event)) {
+ continue;
+ }
+
+ if(event.type == EV_REL || event.type == EV_ABS) {
+ unsigned long long time, timediff;
+ unsigned hz = 0;
- if(event.type == EV_REL || event.type == EV_ABS) {
- double time;
- int hz;
+ time = (unsigned long long)event.time.tv_sec * 1000ULL;
+ time += (unsigned long long)event.time.tv_usec / 1000ULL;
- time = event.time.tv_sec * 1000 + event.time.tv_usec / 1000;
- hz = 1000 / (time - events[i].prvtime);
+ timediff = time - events[i].prev_time;
- if(hz > 0) {
-
int j
;
+ if(timediff != 0)
+
hz = 1000ULL / timediff
;
- events[i].count++;
-
events[i].hz[events[i].count & (HZ_LIST - 1)] = hz
;
+ if(hz > 0) {
+
unsigned j, maxavg
;
- events[i].avghz = 0;
+ events[i].count++;
+ events[i].hz[events[i].count & (HZ_LIST - 1)] = hz;
- for(j = 0; j < HZ_LIST; j++) {
- events[i].avghz += events[i].hz[j];
- }
+ events[i].avghz = 0;
-
events[i].avghz /
= (events[i].count > HZ_LIST) ? HZ_LIST : events[i].count;
+
maxavg
= (events[i].count > HZ_LIST) ? HZ_LIST : events[i].count;
- if(verbose) printf("%s: Latest % 5iHz, Average % 5iHz\n", events[i].name, hz, events[i].avghz);
+ for(j = 0; j < maxavg; j++) {
+ events[i].avghz += events[i].hz[j];
}
}
- events[i].prvtime = time;
+ events[i].avghz /= maxavg;
+
+ if(verbose) printf("%s: Latest % 5iHz, Average % 5iHz\n", events[i].name, hz, events[i].avghz);
}
}
+
+ events[i].prev_time = time;
}
}
}
}
}
}
- for(i = 0; i <
EVENTS
; i++) {
+ for(i = 0; i <
max_event
; i++) {
if(events[i].fd != -1) {
if (events[i].avghz != 0) {
printf("\nAverage for %s: % 5iHz\n", events[i].name, events[i].avghz);
if(events[i].fd != -1) {
if (events[i].avghz != 0) {
printf("\nAverage for %s: % 5iHz\n", events[i].name, events[i].avghz);