From cca522c1979472507ba3b19b129a59db4962f933 Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Tue, 14 Apr 2020 01:31:00 +0200 Subject: [PATCH] multi event handling prototype --- .macrod.c.swp | Bin 12288 -> 16384 bytes macrod.c | 92 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 66 insertions(+), 26 deletions(-) diff --git a/.macrod.c.swp b/.macrod.c.swp index d1b5c36474d044fe768fcd6068a7ef164ceca85f..625182203ab6aff2e8b8bb9d7d72890c4157630e 100644 GIT binary patch literal 16384 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 z b!PVO2jpjHe^415)cgD%L(j1E1oz) delta 980 zcmY+?Pe@cj9Ki9}b+vu|Y0bYGNu#3f)7AA)RwT9+28v{bOk#kzIh;fbsvYsEGga}kw!tYm zBrO9&MDAONP$9UHBE(ml5KEZDByOW09@L^7xky9;Ojz44#4_IFDIVb=uA>hgG@%h$ zSd9~6C62v~F}Q=#9}cNX+1u@WI#j7YGUZNlSkO_(PNM4FXOkf0Oa1;^v!slJW2fW5J z%wP(IlXMRd{s-=22qCn>hZdA!FG?-b_bld!U@)jomhHk$3*+!4IU^`EztMBv-zkgB z*)r3uPl7Wi%9bo9O?}^=r0QMiyM^ZSN_%sASHQ4)J-V!@kOjrM><=$i>$$xNLes)E z!p-eBn%c^RnziR;H8%weX)o3fN~crS7#C!>-v|V@=B4NbX`6XP|MUDtyTMwaTJ?03 zP*?N}^;j>7_Pb?;q`t?lzUg|JrUe4Ni$+6_^t;0c(VR~2X7q=iX?4hAhxB&qYBaAl z!q?fN*79m1H+HSM^3R%`PBoRE98)e>X)NR PxeG2UYvFTcb*}ycZPCEb diff --git a/macrod.c b/macrod.c index d2ee133..a1cfb7e 100644 --- a/macrod.c +++ b/macrod.c @@ -1,3 +1,4 @@ +/* Standard stuff */ #include #include #include @@ -9,6 +10,10 @@ #include #include #include +/* Polling */ +#include +/* Signaling */ +#include #ifdef __linux__ #include @@ -22,56 +27,86 @@ struct pressed_buffer { unsigned int size; }; +int term = 0; // Received SIGTERM flag + int pressBufferAdd (struct pressed_buffer*, unsigned short); int pressBufferRemove (struct pressed_buffer*, unsigned short); +void termHandler (int signum); int main (void) // remember getopt() to automaically parse options { - int fd; - fd = open("/dev/input/event0", O_RDONLY); // TEST: O_NONBLOCK - if (!fd) { + term = 0; + struct sigaction action; + memset(&action, 0, sizeof(action)); + action.sa_handler = termHandler; + sigaction(SIGINT, &action, NULL); + + struct pollfd fds[2]; + + fds[0].events = POLLIN; + fds[0].fd = open("/dev/input/event0", O_RDONLY); // TEST: O_NONBLOCK + if (!fds[0].fd) { + fputs(strerror(errno), stderr); + exit(errno); + } + + fds[1].events = POLLIN; + fds[1].fd = open("/dev/input/event3", O_RDONLY); + if (!fds[1].fd) { fputs(strerror(errno), stderr); exit(errno); } - //int f2 = open("/dev/input/event3", O_RDONLY); - //struct input_event ev; - struct input_event event; struct pressed_buffer pb = {NULL, 0}; // Pressed keys buffer + ssize_t rb; // Read bits - while (1) { - /* Use polling poll(2) to wait por a file dscriptor to become ready for reading. + while (poll(fds, 2, -1) != -1 || !term) { + /* Use poll(2) to wait por a file dscriptor to become ready for reading. * NOTE: this could use select(2) but I don't know how */ - //fread(&event, sizeof(struct input_event), 1, fp); + static int i; + static int prev_size; + + prev_size = pb.size; + for (i = 0; i < 2; i++) { + if (fds[i].revents == fds[i].events) { - ssize_t rb; - rb = read(fd, &event, sizeof(struct input_event)); - if (rb != sizeof(struct input_event)) continue; + rb = read(fds[i].fd, &event, sizeof(struct input_event)); + if (rb != sizeof(struct input_event)) continue; - if (event.type == EV_KEY) { - - switch (event.value) { - case (0): // Key release - pressBufferRemove(&pb, event.code); - break; - case (1): // Key press - pressBufferAdd(&pb, event.code); - break; + if (event.type == EV_KEY) { + switch (event.value) { + /* Key released */ + case (0): + pressBufferRemove(&pb, event.code); + break; + /* Key pressed */ + case (1): + pressBufferAdd(&pb, event.code); + break; + } + } } - + } + + if (pb.size != prev_size) { printf("Pressed keys: "); for (int i = 0; i < pb.size; i++) printf("%d ", pb.buf[i]); putchar('\n'); } + } - if (close(fd) == -1) { - fputs(strerror(errno), stderr); - exit(errno); - } + if (!term) + fputs("An error occured\n", stderr); + for (int i = 0; i < 2; i++) { + if (close(fds[i].fd) == -1) { + fputs(strerror(errno), stderr); + exit(errno); + } + } return 0; } @@ -123,3 +158,8 @@ int pressBufferRemove (struct pressed_buffer *pb, unsigned short key) return 1; } + +void termHandler (int signum) { + fputs("Received interrupt signal, exiting gracefully...\n", stderr); + term = 1; +}