summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominic Radermacher <dominic.radermacher@gmail.com>2016-12-25 11:41:48 +0100
committerDominic Radermacher <dominic.radermacher@gmail.com>2016-12-25 11:41:48 +0100
commit2f9837b381dc782b1cce20ec9d2cdfed9101aea6 (patch)
tree883ce35c4fdb8cff246edb246fe8099b8a8866a5
parentc5b84db649a4cbf493b95b1539bef32cf8d29e43 (diff)
bugfix in botton decoding code
-rw-r--r--src/mpd-i2c-ctrl.c33
1 files 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 */