aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRomain Perier <romain.perier@gmail.com>2012-07-14 12:44:23 +0200
committerRomain Perier <romain.perier@gmail.com>2012-07-14 12:44:23 +0200
commitfe8a1449491016f3ac493b9c65be16d619fc1327 (patch)
tree3aa833704ccee47ba10c7934e01c3b2906f69319
parenteeca2d22d8b7b2142c6b4f2f25e0d91d94ac64cc (diff)
downloadandroid-input-bridge-fe8a1449491016f3ac493b9c65be16d619fc1327.tar.gz
Add support for monitoring of various input devices on the client side
-rw-r--r--aib.c51
-rw-r--r--common.c16
-rw-r--r--common.h1
3 files changed, 58 insertions, 10 deletions
diff --git a/aib.c b/aib.c
index 935dcc7..0f6129d 100644
--- a/aib.c
+++ b/aib.c
@@ -21,20 +21,23 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
+#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
+#include <errno.h>
#include "common.h"
#define BUFFERING_EVENTS_QUEUE_SIZE EVENTS_QUEUE_SIZE
static uint32_t buffer[BUFFERING_EVENTS_QUEUE_SIZE * 2];
+static struct input_event ev[BUFFERING_EVENTS_QUEUE_SIZE];
static void usage(char *progname)
{
- fprintf(stderr, "Usage: %s <hostname> <port> <inputdevice>\n", progname);
+ fprintf(stderr, "Usage: %s <hostname> <port> <device1> [device2] ... [deviceN]\n", progname);
exit(1);
}
@@ -93,11 +96,10 @@ static void send_event(int sock, struct input_event *ev)
static void wait_evdev_input(int aibd_sock, int inputdev)
{
- struct input_event *ev;
int i = 0;
- ev = malloc(sizeof(struct input_event) * BUFFERING_EVENTS_QUEUE_SIZE);
- while (read(inputdev, ev + i, sizeof(struct input_event))) {
+ while (1) {
+ read(inputdev, ev + i, sizeof(struct input_event));
D("[%lu.%04lu] type %u, code %u, value %d\n", ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type, ev[i].code, ev[i].value);
if (ev[i].type == EV_MSC)
@@ -105,18 +107,48 @@ static void wait_evdev_input(int aibd_sock, int inputdev)
if (is_ev_syn(ev + i)) {
send_event(aibd_sock, ev);
bzero(ev, sizeof(struct input_event) * BUFFERING_EVENTS_QUEUE_SIZE);
- i = 0;
- continue;
+ break;
}
i = (i + 1) % BUFFERING_EVENTS_QUEUE_SIZE;
}
}
+static void mainloop(int aibd_sock, char **devices, int len)
+{
+ int i = 0, maxfd = 0, ret = 0, *inputdevs = NULL;
+ fd_set readfds;
+
+ inputdevs = mallocx(len * sizeof(int));
+ for (i = 0; i < len; i++) {
+ inputdevs[i] = input_device_init(devices[i]);
+ D("Registering %s for events monitoring with fd %u\n", devices[i], inputdevs[i]);
+ if (inputdevs[i] > maxfd)
+ maxfd = inputdevs[i];
+ }
+
+ while (1) {
+ FD_ZERO(&readfds);
+
+ for (i = 0; i < len; i++)
+ FD_SET(inputdevs[i], &readfds);
+ do {
+ ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
+ } while (ret < 0 && errno == EINTR);
+
+ for (i = 0; i < len; i++) {
+ if (FD_ISSET(inputdevs[i], &readfds)) {
+ D("Receiving data from fd %u\n", inputdevs[i]);
+ wait_evdev_input(aibd_sock, inputdevs[i]);
+ }
+ }
+ }
+}
+
int main (int argc, char *argv[])
{
uint16_t port;
char *endptr = NULL;
- int aidd_sock, inputdev;
+ int aibd_sock;
if (argc < 4)
usage(argv[0]);
@@ -126,9 +158,8 @@ int main (int argc, char *argv[])
if (*endptr != '\0')
usage(argv[0]);
- inputdev = input_device_init(argv[3]);
- aidd_sock = _connect(argv[1], port);
- wait_evdev_input(aidd_sock, inputdev);
+ aibd_sock = _connect(argv[1], port);
+ mainloop(aibd_sock, argv + 3, argc - 3);
return 0;
}
diff --git a/common.c b/common.c
index ec08e51..bc51827 100644
--- a/common.c
+++ b/common.c
@@ -56,3 +56,19 @@ int openx(const char *pathname, int flags)
D("openx--\n");
return fd;
}
+
+void *mallocx(size_t size)
+{
+ void *buffer;
+
+ D("mallox++\n");
+
+ buffer = malloc(size);
+ if (buffer == NULL) {
+ D("errno %d\n", errno);
+ perror(APPNAME);
+ exit(1);
+ }
+ D("mallocx--\n");
+ return buffer;
+}
diff --git a/common.h b/common.h
index 87293e3..df77ad7 100644
--- a/common.h
+++ b/common.h
@@ -41,6 +41,7 @@
int socketx(int domain, int type, int protocol);
int openx(const char *pathname, int flags);
+void *mallocx(size_t size);
static inline uint8_t is_ev_syn(struct input_event *ev)
{