# HG changeset patch # User Emmanuel Gil Peyrot # Date 1424624993 -3600 # Node ID 73c20831be0ad2db545d0991089240c1e9b616cf # Parent 61bb81a9a440e124305e454084cc95a87160f69c Replace DS input with 3DS, for now disable axis input. diff --git a/ds.c b/ds.c --- a/ds.c +++ b/ds.c @@ -7,6 +7,18 @@ #include +#define maybe_do_uinput(button, uinput_button) \ +do { \ + if (!previous.button && ds->button) { \ + printf("Button " #uinput_button " pressed.\n"); \ + do_uinput(uinput_fd, uinput_button, 1, EV_KEY); \ + } else if (previous.button && !ds->button) { \ + printf("Button " #uinput_button " released.\n"); \ + do_uinput(uinput_fd, uinput_button, 0, EV_KEY); \ + } \ +} while(0) + + /* Throws events according to ds keys status */ @@ -14,67 +26,33 @@ void ds_process_evt(ds_t* ds, int uinput static ds_t previous; - /* Fear the evil copy/paste!! */ - - /* BUTTONS: */ - if( !previous.A && ds->A ) /* pressed */ - do_uinput(uinput_fd, BTN_A, 1, EV_KEY); - else if( previous.A && !ds->A ) /* released */ - do_uinput(uinput_fd, BTN_A, 0, EV_KEY); - - - if( !previous.B && ds->B ) - do_uinput(uinput_fd, BTN_B, 1, EV_KEY); - else if( previous.B && !ds->B ) - do_uinput(uinput_fd, BTN_B, 0, EV_KEY); - - - if( !previous.X && ds->X ) - do_uinput(uinput_fd, BTN_X, 1, EV_KEY); - else if( previous.X && !ds->X ) - do_uinput(uinput_fd, BTN_X, 0, EV_KEY); - - - if( !previous.Y && ds->Y ) - do_uinput(uinput_fd, BTN_Y, 1, EV_KEY); - else if( previous.Y && !ds->Y ) - do_uinput(uinput_fd, BTN_Y, 0, EV_KEY); - - - if( !previous.L && ds->L ) - do_uinput(uinput_fd, BTN_TL, 1, EV_KEY); - else if( (previous.L) && !(ds->L) ) - do_uinput(uinput_fd, BTN_TL, 0, EV_KEY); - - - if( !previous.R && ds->R ) - do_uinput(uinput_fd, BTN_TR, 1, EV_KEY); - else if( previous.R && !ds->R ) - do_uinput(uinput_fd, BTN_TR, 0, EV_KEY); - - - if( !previous.Start && ds->Start ) - do_uinput(uinput_fd, BTN_START, 1, EV_KEY); - else if( previous.Start && !ds->Start ) - do_uinput(uinput_fd, BTN_START, 0, EV_KEY); - - - if( !previous.Select && ds->Select ) - do_uinput(uinput_fd, BTN_SELECT, 1, EV_KEY); - else if( previous.Select && !ds->Select ) - do_uinput(uinput_fd, BTN_SELECT, 0, EV_KEY); - + maybe_do_uinput(a, BTN_A); + maybe_do_uinput(b, BTN_B); + maybe_do_uinput(x, BTN_X); + maybe_do_uinput(y, BTN_Y); + maybe_do_uinput(l, BTN_TL); + maybe_do_uinput(r, BTN_TR); + maybe_do_uinput(zl, BTN_TL2); + maybe_do_uinput(zr, BTN_TR2); + maybe_do_uinput(start, BTN_START); + maybe_do_uinput(select, BTN_SELECT); + maybe_do_uinput(up, BTN_DPAD_UP); + maybe_do_uinput(down, BTN_DPAD_DOWN); + maybe_do_uinput(left, BTN_DPAD_LEFT); + maybe_do_uinput(right, BTN_DPAD_RIGHT); /* DIRECTIONS */ + /* if(previous.aX != ds->aX) do_uinput(uinput_fd, ABS_X, ds->aX, EV_ABS); if(previous.aY != ds->aY) do_uinput(uinput_fd, ABS_Y, ds->aY, EV_ABS); + */ - memcpy(&previous, ds, sizeof(ds_t)); + previous.hex = ds->hex; return; } diff --git a/ds.h b/ds.h --- a/ds.h +++ b/ds.h @@ -5,18 +5,37 @@ /* Describe Device */ -typedef struct ds_s{ - uint8_t A:1; /* Pressed or held buttons */ - uint8_t B:1; - uint8_t X:1; - uint8_t Y:1; - uint8_t L:1; - uint8_t R:1; - uint8_t Start:1; - uint8_t Select:1; - uint8_t aX; - uint8_t aY; -} __attribute__((packed)) ds_t; +typedef union { + uint32_t hex; + struct { + uint32_t a:1; /* Pressed or held buttons */ + uint32_t b:1; + uint32_t select:1; + uint32_t start:1; + uint32_t right:1; + uint32_t left:1; + uint32_t up:1; + uint32_t down:1; + uint32_t r:1; + uint32_t l:1; + uint32_t x:1; + uint32_t y:1; + uint32_t padding1:2; + uint32_t zl:1; + uint32_t zr:1; + uint32_t padding2:4; + uint32_t touch:1; + uint32_t padding3:3; + uint32_t c_right:1; + uint32_t c_left:1; + uint32_t c_up:1; + uint32_t c_down:1; + uint32_t circle_right:1; + uint32_t circle_left:1; + uint32_t circle_up:1; + uint32_t circle_down:1; + } __attribute__((packed)); +} ds_t; /* diff --git a/uinput.c b/uinput.c --- a/uinput.c +++ b/uinput.c @@ -10,7 +10,7 @@ #include -#define DS_NAME "NintendoDS Wireless Gamepad" +#define DS_NAME "Nintendo 3DS" /* Not found these values... but it's not important! */ #define DS_VENDOR 0xdead @@ -59,8 +59,8 @@ int init_uinput_device(void){ dev.absmax[ABS_Y] = DS_MAX_Y; dev.absmin[ABS_Y] = DS_MIN_Y; - dev.absfuzz[ABS_X] = 4; - dev.absflat[ABS_X] = 2; + dev.absfuzz[ABS_Y] = 4; + dev.absflat[ABS_Y] = 2; if(write(fd, &dev, sizeof(dev)) < (ssize_t)sizeof(dev)){ @@ -76,8 +76,14 @@ int init_uinput_device(void){ if( ioctl(fd, UI_SET_KEYBIT, BTN_Y) ) return -1; if( ioctl(fd, UI_SET_KEYBIT, BTN_TL) ) return -1; if( ioctl(fd, UI_SET_KEYBIT, BTN_TR) ) return -1; + if( ioctl(fd, UI_SET_KEYBIT, BTN_TL2) ) return -1; + if( ioctl(fd, UI_SET_KEYBIT, BTN_TR2) ) return -1; if( ioctl(fd, UI_SET_KEYBIT, BTN_START) ) return -1; if( ioctl(fd, UI_SET_KEYBIT, BTN_SELECT)) return -1; + if( ioctl(fd, UI_SET_KEYBIT, BTN_DPAD_UP)) return -1; + if( ioctl(fd, UI_SET_KEYBIT, BTN_DPAD_DOWN)) return -1; + if( ioctl(fd, UI_SET_KEYBIT, BTN_DPAD_LEFT)) return -1; + if( ioctl(fd, UI_SET_KEYBIT, BTN_DPAD_RIGHT)) return -1; /* D-Pad [-0xFFFF - 0xFFFF] */ if( ioctl(fd, UI_SET_EVBIT, EV_ABS) ) return -1;