From 2f9837b381dc782b1cce20ec9d2cdfed9101aea6 Mon Sep 17 00:00:00 2001 From: Dominic Radermacher Date: Sun, 25 Dec 2016 11:41:48 +0100 Subject: bugfix in botton decoding code --- src/mpd-i2c-ctrl.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/mpd-i2c-ctrl.c b/src/mpd-i2c-ctrl.c index 139bcf4..0a5d543 100644 --- a/src/mpd-i2c-ctrl.c +++ b/src/mpd-i2c-ctrl.c @@ -43,13 +43,13 @@ static const char *basename(const char *s); char *buttonlist_get(int key); void buttonlist_set(int key, const char *action); -int i2c_wr(int fd, const uint8_t *data, ssize_t len); +ssize_t i2c_wr(int fd, const uint8_t *data, size_t len); int mcp23017_init(int fd, int addr); int mcp23017_getintf(int fd); int mcp23017_waitzero(int fd); +int mcp23017_getkey(int fd); int mpd_send_cmd(int sd, const char *cmd); int mpd_playlist(int sd, const char *playlist); -int decode_key(uint16_t keycode); int handle_keypress(uint8_t key); int handle_inotify_event(int fd); @@ -80,7 +80,7 @@ void buttonlist_set(int key, const char *action) buttonlist[key]=strdup(action); } -int i2c_wr(int fd, const uint8_t *data, ssize_t len) +ssize_t i2c_wr(int fd, const uint8_t *data, size_t len) { if (write(fd, data, len) != len) { return -1; @@ -112,6 +112,10 @@ int mcp23017_init(int fd, int addr) buf[1]=0xff; buf[2]=0xff; i2c_wr(fd, buf, 3); /* interrupt if different from DEFVAL */ + buf[0]=IOCON_A; + buf[1]=0x48; /* Bank=0,Mirror=1,Seqop=0,disslw=0,haen=1,odr=0,intpol=0,0 */ + buf[2]=0x48; + i2c_wr(fd, buf, 3); /* interrupt if different from DEFVAL */ return 0; } @@ -172,9 +176,16 @@ int mpd_playlist(int sd, const char *playlist) return 0; } -int decode_key(uint16_t keycode) +int mcp23017_getkey(int fd) { - return (sizeof(uint16_t)*8)-__builtin_clz(keycode)-1; + int key=mcp23017_getintf(fd); + if (key <= 0) { /* -1 -> error, 0 -> no key pressed */ + return -1; + } + int code=ffs(key)-1; /* find first (lsb) bit set */ +// printf("got key %04x => decoded = %02x\n", key, code); + mcp23017_waitzero(fd); /* wait until keys released, clr irq */ + return code; } int handle_keypress(uint8_t key) @@ -281,6 +292,7 @@ int main(int argc, char **argv) } mpd_send_cmd(fd, argv[1]); close(fd); + exit(0); } parse_config(CONFIG_FILE); if ((inotifyFd = inotify_init()) == -1) { @@ -296,15 +308,12 @@ int main(int argc, char **argv) fprintf(stderr, "can't open '%s'\n", DEVICE); return 1; } - daemon(0,0); +// daemon(0,0); for (;;) { mcp23017_init(fd, MCP23017_ADDR); - int key=mcp23017_getintf(fd); - if (key > 0) { - uint8_t code=decode_key(key); -// printf("got key %02x => decoded = %04x\n", key, code); - handle_keypress(code); - mcp23017_waitzero(fd); /* wait until keys released, clr irq */ + int key=mcp23017_getkey(fd); + if (key >= 0) { + handle_keypress((uint8_t)key); } to.tv_sec=0; to.tv_nsec=200000000; /* 0.2 sec */ -- cgit v1.2.3