diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-12-04 06:43:30 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2009-12-04 06:43:30 +0000 |
| commit | 41e7b60e2e6397c4f8ae91495eb74728b6f562c7 (patch) | |
| tree | 5eef9e1efca8afd3db7de140aee70bbbe731e5f6 /plugins | |
| parent | aca57a03bd7fdb0e23ea4f6d979dfe7008648195 (diff) | |
| download | pcsxr-41e7b60e2e6397c4f8ae91495eb74728b6f562c7.tar.gz | |
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@38792 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/dfinput/analog.c | 172 | ||||
| -rw-r--r-- | plugins/dfinput/cfg-gtk2.c | 174 | ||||
| -rw-r--r-- | plugins/dfinput/cfg.c | 77 | ||||
| -rw-r--r-- | plugins/dfinput/pad.c | 26 | ||||
| -rw-r--r-- | plugins/dfinput/pad.h | 11 | ||||
| -rw-r--r-- | plugins/dfinput/sdljoy.c | 1 | ||||
| -rw-r--r-- | plugins/dfinput/xkb.c | 4 |
7 files changed, 335 insertions, 130 deletions
diff --git a/plugins/dfinput/analog.c b/plugins/dfinput/analog.c index 90285220..d736f6ce 100644 --- a/plugins/dfinput/analog.c +++ b/plugins/dfinput/analog.c @@ -19,28 +19,20 @@ #include "pad.h" void InitAnalog() { -#if 0 - g.PadState[0].AnalogStatus[ANALOG_LEFT][ANALOG_X] = 128; - g.PadState[0].AnalogStatus[ANALOG_LEFT][ANALOG_Y] = 128; - g.PadState[0].AnalogStatus[ANALOG_RIGHT][ANALOG_X] = 128; - g.PadState[0].AnalogStatus[ANALOG_RIGHT][ANALOG_Y] = 128; - g.PadState[1].AnalogStatus[ANALOG_LEFT][ANALOG_X] = 128; - g.PadState[1].AnalogStatus[ANALOG_LEFT][ANALOG_Y] = 128; - g.PadState[1].AnalogStatus[ANALOG_RIGHT][ANALOG_X] = 128; - g.PadState[1].AnalogStatus[ANALOG_RIGHT][ANALOG_Y] = 128; -#else // use 127 instead of 128 fixes the FF8 "reverting" problem, but // why ALL of the protocol docs I seen as well as psemu_plugin_defs.h // say 128 is the center position? - g.PadState[0].AnalogStatus[ANALOG_LEFT][ANALOG_X] = 127; - g.PadState[0].AnalogStatus[ANALOG_LEFT][ANALOG_Y] = 127; - g.PadState[0].AnalogStatus[ANALOG_RIGHT][ANALOG_X] = 127; - g.PadState[0].AnalogStatus[ANALOG_RIGHT][ANALOG_Y] = 127; - g.PadState[1].AnalogStatus[ANALOG_LEFT][ANALOG_X] = 127; - g.PadState[1].AnalogStatus[ANALOG_LEFT][ANALOG_Y] = 127; - g.PadState[1].AnalogStatus[ANALOG_RIGHT][ANALOG_X] = 127; - g.PadState[1].AnalogStatus[ANALOG_RIGHT][ANALOG_Y] = 127; -#endif + g.PadState[0].AnalogStatus[ANALOG_LEFT][0] = 127; + g.PadState[0].AnalogStatus[ANALOG_LEFT][1] = 127; + g.PadState[0].AnalogStatus[ANALOG_RIGHT][0] = 127; + g.PadState[0].AnalogStatus[ANALOG_RIGHT][1] = 127; + g.PadState[1].AnalogStatus[ANALOG_LEFT][0] = 127; + g.PadState[1].AnalogStatus[ANALOG_LEFT][1] = 127; + g.PadState[1].AnalogStatus[ANALOG_RIGHT][0] = 127; + g.PadState[1].AnalogStatus[ANALOG_RIGHT][1] = 127; + + memset(g.PadState[0].AnalogKeyStatus, 0, sizeof(g.PadState[0].AnalogKeyStatus)); + memset(g.PadState[1].AnalogKeyStatus, 0, sizeof(g.PadState[1].AnalogKeyStatus)); } void CheckAnalog() { @@ -53,28 +45,142 @@ void CheckAnalog() { } for (j = 0; j < ANALOG_TOTAL; j++) { - for (k = 0; k < 2; k++) { - if (g.cfg.PadDef[i].AnalogDef[j][k] == 0) { + for (k = 0; k < 4; k++) { + if (g.PadState[i].AnalogKeyStatus[j][k]) { + switch (k) { + case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 255; k++; break; + case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 0; break; + case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 255; k++; break; + case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 0; break; + } continue; } - n = abs(g.cfg.PadDef[i].AnalogDef[j][k]) - 1; + switch (g.cfg.PadDef[i].AnalogDef[j][k].JoyEvType) { + case AXIS: + n = abs(g.cfg.PadDef[i].AnalogDef[j][k].J.Axis) - 1; + + if (g.cfg.PadDef[i].AnalogDef[j][k].J.Axis > 0) { + val = SDL_JoystickGetAxis(g.PadState[i].JoyDev, n); + if (val >= 0) { + val += 32767; + val /= 256; + + switch (k) { + case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = val; break; + case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 255 - val; break; + case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = val; break; + case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 255 - val; break; + } + } + } else if (g.cfg.PadDef[i].AnalogDef[j][k].J.Axis < 0) { + val = SDL_JoystickGetAxis(g.PadState[i].JoyDev, n); + if (val <= 0) { + val += 32767; + val /= 256; + + switch (k) { + case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 255 - val; break; + case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = val; break; + case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 255 - val; break; + case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = val; break; + } + } + } + break; + + case HAT: + n = (g.cfg.PadDef[i].AnalogDef[j][k].J.Hat >> 8); + + g.PadState[i].AnalogStatus[j][0] = 0; + + if (SDL_JoystickGetHat(g.PadState[i].JoyDev, n) & (g.cfg.PadDef[i].AnalogDef[j][k].J.Hat & 0xFF)) { + switch (k) { + case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 255; k++; break; + case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 0; break; + case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 255; k++; break; + case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 0; break; + } + } else { + switch (k) { + case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 127; break; + case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 127; break; + case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 127; break; + case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 127; break; + } + } + break; + + case BUTTON: + if (SDL_JoystickGetButton(g.PadState[i].JoyDev, g.cfg.PadDef[i].AnalogDef[j][k].J.Button)) { + switch (k) { + case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 255; k++; break; + case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 0; break; + case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 255; k++; break; + case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 0; break; + } + } else { + switch (k) { + case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 127; break; + case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 127; break; + case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 127; break; + case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 127; break; + } + } + break; + + default: + switch (k) { + case ANALOG_XP: g.PadState[i].AnalogStatus[j][0] = 127; break; + case ANALOG_XM: g.PadState[i].AnalogStatus[j][0] = 127; break; + case ANALOG_YP: g.PadState[i].AnalogStatus[j][1] = 127; break; + case ANALOG_YM: g.PadState[i].AnalogStatus[j][1] = 127; break; + } + break; + } + } + } + } +} + +int AnalogKeyPressed(uint16_t Key) { + int i, j, k; + + for (i = 0; i < 2; i++) { + if (g.cfg.PadDef[i].Type != PSE_PAD_TYPE_ANALOGPAD) { + continue; + } + + for (j = 0; j < ANALOG_TOTAL; j++) { + for (k = 0; k < 4; k++) { + if (g.cfg.PadDef[i].AnalogDef[j][k].Key == Key) { + g.PadState[i].AnalogKeyStatus[j][k] = 1; + return 1; + } + } + } + } + + return 0; +} - val = SDL_JoystickGetAxis(g.PadState[i].JoyDev, n); +int AnalogKeyReleased(uint16_t Key) { + int i, j, k; -#if 0 - val += 32768; -#else - val += 32767; -#endif - val /= 256; + for (i = 0; i < 2; i++) { + if (g.cfg.PadDef[i].Type != PSE_PAD_TYPE_ANALOGPAD) { + continue; + } - if (g.cfg.PadDef[i].AnalogDef[j][k] < 0) { - g.PadState[i].AnalogStatus[j][k] = 255 - val; - } else { - g.PadState[i].AnalogStatus[j][k] = val; + for (j = 0; j < ANALOG_TOTAL; j++) { + for (k = 0; k < 4; k++) { + if (g.cfg.PadDef[i].AnalogDef[j][k].Key == Key) { + g.PadState[i].AnalogKeyStatus[j][k] = 0; + return 1; } } } } + + return 0; } diff --git a/plugins/dfinput/cfg-gtk2.c b/plugins/dfinput/cfg-gtk2.c index d51034df..644269ba 100644 --- a/plugins/dfinput/cfg-gtk2.c +++ b/plugins/dfinput/cfg-gtk2.c @@ -38,10 +38,10 @@ const int DPad[DKEY_TOTAL] = { DKEY_R1, DKEY_L2, DKEY_R2, - DKEY_L3, - DKEY_R3, DKEY_SELECT, - DKEY_START + DKEY_START, + DKEY_L3, + DKEY_R3 }; const char *DPadText[DKEY_TOTAL] = { @@ -57,17 +57,21 @@ const char *DPadText[DKEY_TOTAL] = { N_("R1"), N_("L2"), N_("R2"), - N_("L3"), - N_("R3"), N_("Select"), - N_("Start") + N_("Start"), + N_("L3"), + N_("R3") }; const char *AnalogText[] = { - N_("L-Stick X"), - N_("L-Stick Y"), - N_("R-Stick X"), - N_("R-Stick Y") + N_("L-Stick Right"), + N_("L-Stick Left"), + N_("L-Stick Down"), + N_("L-Stick Up"), + N_("R-Stick Right"), + N_("R-Stick Left"), + N_("R-Stick Down"), + N_("R-Stick Up") }; static int GetSelectedKeyIndex(int padnum) { @@ -134,13 +138,42 @@ static void GetKeyDescription(char *buf, int joynum, int key) { } } -static void GetAnalogDescription(char *buf, int joynum, int analognum, int analogaxis) { - int16_t v = g.cfg.PadDef[joynum].AnalogDef[analognum][analogaxis]; +static void GetAnalogDescription(char *buf, int joynum, int analognum, int dir) { + const char *hatname[16] = {_("Centered"), _("Up"), _("Right"), _("Rightup"), + _("Down"), "", _("Rightdown"), "", _("Left"), _("Leftup"), "", "", + _("Leftdown"), "", "", ""}; - if (v == 0) { - sprintf(buf, _("(Not Set)")); - } else { - sprintf(buf, _("Joystick: Axis %d%s"), abs(v) - 1, (v < 0) ? _(" (Reversed)") : ""); + switch (g.cfg.PadDef[joynum].AnalogDef[analognum][dir].JoyEvType) { + case BUTTON: + sprintf(buf, _("Joystick: Button %d"), g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Button); + break; + + case AXIS: + sprintf(buf, _("Joystick: Axis %d%c"), abs(g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Axis) - 1, + g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Axis > 0 ? '+' : '-'); + break; + + case HAT: + sprintf(buf, _("Joystick: Hat %d %s"), (g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Hat >> 8), + hatname[g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Hat & 0x0F]); + break; + + case NONE: + default: + buf[0] = '\0'; + break; + } + + if (g.cfg.PadDef[joynum].AnalogDef[analognum][dir].Key != 0) { + if (buf[0] != '\0') { + strcat(buf, " / "); + } + + strcat(buf, _("Keyboard:")); + strcat(buf, " "); + strcat(buf, XKeysymToString(g.cfg.PadDef[joynum].AnalogDef[analognum][dir].Key)); + } else if (buf[0] == '\0') { + strcpy(buf, _("(Not Set)")); } } @@ -157,20 +190,28 @@ static void UpdateKeyList() { xml = glade_get_widget_tree(MainWindow); for (i = 0; i < 2; i++) { + int total; + + if (g.cfg.PadDef[i].Type == PSE_PAD_TYPE_ANALOGPAD) { + total = DKEY_TOTAL; + } else { + total = DKEY_TOTAL - 2; + } + widget = glade_xml_get_widget(xml, widgetname[i]); store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); - for (j = 0; j < DKEY_TOTAL; j++) { + for (j = 0; j < total; j++) { gtk_list_store_append(store, &iter); GetKeyDescription(buf, i, DPad[j]); gtk_list_store_set(store, &iter, 0, _(DPadText[j]), 1, buf, -1); } if (g.cfg.PadDef[i].Type == PSE_PAD_TYPE_ANALOGPAD) { - for (j = 0; j < 4; j++) { + for (j = 0; j < 8; j++) { gtk_list_store_append(store, &iter); - GetAnalogDescription(buf, i, j / 2, j % 2); + GetAnalogDescription(buf, i, j / 4, j % 4); gtk_list_store_set(store, &iter, 0, _(AnalogText[j]), 1, buf, -1); } } @@ -204,7 +245,7 @@ static void UpdateKey() { if (index < DKEY_TOTAL) { GetKeyDescription(buf, i, DPad[index]); } else { - GetAnalogDescription(buf, i, (index - DKEY_TOTAL) / 2, (index - DKEY_TOTAL) % 2); + GetAnalogDescription(buf, i, (index - DKEY_TOTAL) / 4, (index - DKEY_TOTAL) % 4); } g_value_init(&value, G_TYPE_STRING); @@ -286,17 +327,6 @@ static void OnThreadedToggled(GtkWidget *widget, gpointer user_data) { g.cfg.Threaded = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } -static void SysErrorMessage(gchar *primary, gchar *secondary) { - GtkWidget *message_dialog; - - message_dialog = gtk_message_dialog_new(NULL, - GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, primary, NULL); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG (message_dialog), secondary); - - gtk_dialog_run(GTK_DIALOG(message_dialog)); - gtk_widget_destroy(message_dialog); -} - static void ReadDKeyEvent(int padnum, int key) { SDL_Joystick *js; time_t t; @@ -376,44 +406,72 @@ end: } } -static void ReadAnalogEvent(int padnum, int analognum, int analogaxis) { +static void ReadAnalogEvent(int padnum, int analognum, int analogdir) { SDL_Joystick *js; time_t t; GdkEvent *ge; int i; Sint16 axis; - if (g.cfg.PadDef[padnum].DevNum < 0) { - SysErrorMessage(_("Device not set"), _("Please select a valid Joystick Device")); - return; - } - - js = SDL_JoystickOpen(g.cfg.PadDef[padnum].DevNum); - if (js == NULL) { - SysErrorMessage(_("Device open error"), _("Unable to open Joystick Device")); - return; + if (g.cfg.PadDef[padnum].DevNum >= 0) { + js = SDL_JoystickOpen(g.cfg.PadDef[padnum].DevNum); + SDL_JoystickEventState(SDL_IGNORE); + } else { + js = NULL; } t = time(NULL); while (time(NULL) < t + 10) { // check joystick events - SDL_JoystickUpdate(); - for (i = 0; i < SDL_JoystickNumAxes(js); i++) { - axis = SDL_JoystickGetAxis(js, i); - if (abs(axis) > 16383) { - g.cfg.PadDef[padnum].AnalogDef[analognum][analogaxis] = (i + 1) * (axis > 0 ? 1 : -1); - goto end1; + if (js != NULL) { + SDL_JoystickUpdate(); + + for (i = 0; i < SDL_JoystickNumButtons(js); i++) { + if (SDL_JoystickGetButton(js, i)) { + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].JoyEvType = BUTTON; + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Button = i; + goto end; + } + } + + for (i = 0; i < SDL_JoystickNumAxes(js); i++) { + axis = SDL_JoystickGetAxis(js, i); + if (abs(axis) > 16383) { + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].JoyEvType = AXIS; + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Axis = (i + 1) * (axis > 0 ? 1 : -1); + goto end; + } + } + + for (i = 0; i < SDL_JoystickNumHats(js); i++) { + axis = SDL_JoystickGetHat(js, i); + if (axis != SDL_HAT_CENTERED) { + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].JoyEvType = HAT; + + if (axis & SDL_HAT_UP) { + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_UP); + } else if (axis & SDL_HAT_DOWN) { + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_DOWN); + } else if (axis & SDL_HAT_LEFT) { + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_LEFT); + } else if (axis & SDL_HAT_RIGHT) { + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_RIGHT); + } + + goto end; + } } } // check keyboard events while ((ge = gdk_event_get()) != NULL) { if (ge->type == GDK_KEY_PRESS) { - if (ge->key.keyval == XK_Escape) { - gdk_event_free(ge); - goto end1; + if (ge->key.keyval != XK_Escape) { + g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].Key = ge->key.keyval; } + gdk_event_free(ge); + goto end; } gdk_event_free(ge); } @@ -421,8 +479,10 @@ static void ReadAnalogEvent(int padnum, int analognum, int analogaxis) { usleep(5000); } -end1: - SDL_JoystickClose(js); +end: + if (js != NULL) { + SDL_JoystickClose(js); + } } static void OnChangeClicked(GtkWidget *widget, gpointer user_data) { @@ -435,7 +495,7 @@ static void OnChangeClicked(GtkWidget *widget, gpointer user_data) { ReadDKeyEvent(pad, DPad[index]); } else { index -= DKEY_TOTAL; - ReadAnalogEvent(pad, index / 2, index % 2); + ReadAnalogEvent(pad, index / 4, index % 4); } UpdateKey(); @@ -453,7 +513,9 @@ static void OnResetClicked(GtkWidget *widget, gpointer user_data) { g.cfg.PadDef[pad].KeyDef[DPad[index]].J.Button = 0; } else { index -= DKEY_TOTAL; - g.cfg.PadDef[pad].AnalogDef[index / 2][index % 2] = 0; + g.cfg.PadDef[pad].AnalogDef[index / 4][index % 4].Key = 0; + g.cfg.PadDef[pad].AnalogDef[index / 4][index % 4].JoyEvType = NONE; + g.cfg.PadDef[pad].AnalogDef[index / 4][index % 4].J.Button = 0; } UpdateKey(); @@ -641,11 +703,7 @@ void PADabout() { GtkWidget *widget; widget = gtk_about_dialog_new(); -#ifdef EPSXE - gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(widget), "Gamepad/Keyboard Input (ePSXe)"); -#else gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(widget), "Gamepad/Keyboard Input"); -#endif gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(widget), "1.1"); gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(widget), authors); gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(widget), "http://www.codeplex.com/pcsxr/"); diff --git a/plugins/dfinput/cfg.c b/plugins/dfinput/cfg.c index 00ace414..1da137ad 100644 --- a/plugins/dfinput/cfg.c +++ b/plugins/dfinput/cfg.c @@ -218,14 +218,46 @@ void LoadConfig() { g.cfg.PadDef[current].KeyDef[DKEY_SQUARE].Key = a; g.cfg.PadDef[current].KeyDef[DKEY_SQUARE].JoyEvType = b; g.cfg.PadDef[current].KeyDef[DKEY_SQUARE].J.d = c; - } else if (strncmp(buf, "LeftAnalogX=", 12) == 0) { - g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_X] = atoi(&buf[12]); - } else if (strncmp(buf, "LeftAnalogY=", 12) == 0) { - g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_Y] = atoi(&buf[12]); - } else if (strncmp(buf, "RightAnalogX=", 13) == 0) { - g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_X] = atoi(&buf[13]); - } else if (strncmp(buf, "RightAnalogY=", 13) == 0) { - g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_Y] = atoi(&buf[13]); + } else if (strncmp(buf, "LeftAnalogXP=", 13) == 0) { + sscanf(buf, "LeftAnalogXP=%d,%d,%d", &a, &b, &c); + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XP].Key = a; + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XP].JoyEvType = b; + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XP].J.d = c; + } else if (strncmp(buf, "LeftAnalogXM=", 13) == 0) { + sscanf(buf, "LeftAnalogXM=%d,%d,%d", &a, &b, &c); + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XM].Key = a; + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XM].JoyEvType = b; + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XM].J.d = c; + } else if (strncmp(buf, "LeftAnalogYP=", 13) == 0) { + sscanf(buf, "LeftAnalogYP=%d,%d,%d", &a, &b, &c); + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YP].Key = a; + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YP].JoyEvType = b; + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YP].J.d = c; + } else if (strncmp(buf, "LeftAnalogYM=", 13) == 0) { + sscanf(buf, "LeftAnalogYM=%d,%d,%d", &a, &b, &c); + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YM].Key = a; + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YM].JoyEvType = b; + g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YM].J.d = c; + } else if (strncmp(buf, "RightAnalogXP=", 14) == 0) { + sscanf(buf, "RightAnalogXP=%d,%d,%d", &a, &b, &c); + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XP].Key = a; + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XP].JoyEvType = b; + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XP].J.d = c; + } else if (strncmp(buf, "RightAnalogXM=", 14) == 0) { + sscanf(buf, "RightAnalogXM=%d,%d,%d", &a, &b, &c); + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XM].Key = a; + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XM].JoyEvType = b; + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XM].J.d = c; + } else if (strncmp(buf, "RightAnalogYP=", 14) == 0) { + sscanf(buf, "RightAnalogYP=%d,%d,%d", &a, &b, &c); + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YP].Key = a; + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YP].JoyEvType = b; + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YP].J.d = c; + } else if (strncmp(buf, "RightAnalogYM=", 14) == 0) { + sscanf(buf, "RightAnalogYM=%d,%d,%d", &a, &b, &c); + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YM].Key = a; + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YM].JoyEvType = b; + g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YM].J.d = c; } } @@ -282,11 +314,30 @@ void SaveConfig() { g.cfg.PadDef[i].KeyDef[DKEY_CROSS].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_CROSS].J.d); fprintf(fp, "Square=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_SQUARE].Key, g.cfg.PadDef[i].KeyDef[DKEY_SQUARE].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_SQUARE].J.d); - - fprintf(fp, "LeftAnalogX=%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_X]); - fprintf(fp, "LeftAnalogY=%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_Y]); - fprintf(fp, "RightAnalogX=%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_X]); - fprintf(fp, "RightAnalogY=%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_Y]); + fprintf(fp, "LeftAnalogXP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XP].Key, + g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XP].JoyEvType, + g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XP].J.d); + fprintf(fp, "LeftAnalogXM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XM].Key, + g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XM].JoyEvType, + g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XM].J.d); + fprintf(fp, "LeftAnalogYP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YP].Key, + g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YP].JoyEvType, + g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YP].J.d); + fprintf(fp, "LeftAnalogYM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YM].Key, + g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YM].JoyEvType, + g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YM].J.d); + fprintf(fp, "RightAnalogXP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XP].Key, + g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XP].JoyEvType, + g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XP].J.d); + fprintf(fp, "RightAnalogXM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XM].Key, + g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XM].JoyEvType, + g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XM].J.d); + fprintf(fp, "RightAnalogYP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YP].Key, + g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YP].JoyEvType, + g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YP].J.d); + fprintf(fp, "RightAnalogYM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YM].Key, + g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YM].JoyEvType, + g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YM].J.d); fprintf(fp, "\n"); } diff --git a/plugins/dfinput/pad.c b/plugins/dfinput/pad.c index ca54ebca..1fdda103 100644 --- a/plugins/dfinput/pad.c +++ b/plugins/dfinput/pad.c @@ -19,11 +19,7 @@ #include "pad.h" char *PSEgetLibName(void) { -#ifdef EPSXE - return _("Gamepad/Keyboard Input (ePSXe)"); -#else return _("Gamepad/Keyboard Input"); -#endif } uint32_t PSEgetLibType(void) { @@ -125,8 +121,6 @@ static void UpdateInput(void) { CheckKeyboard(); } -#ifndef EPSXE - static uint8_t stdpar[2][8] = { {0xFF, 0x5A, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80}, {0xFF, 0x5A, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80} @@ -255,10 +249,10 @@ unsigned char PADpoll(unsigned char value) { if (g.PadState[CurPad].PadMode == 1) { CmdLen = 8; - stdpar[CurPad][4] = g.PadState[CurPad].AnalogStatus[ANALOG_RIGHT][ANALOG_X]; - stdpar[CurPad][5] = g.PadState[CurPad].AnalogStatus[ANALOG_RIGHT][ANALOG_Y]; - stdpar[CurPad][6] = g.PadState[CurPad].AnalogStatus[ANALOG_LEFT][ANALOG_X]; - stdpar[CurPad][7] = g.PadState[CurPad].AnalogStatus[ANALOG_LEFT][ANALOG_Y]; + stdpar[CurPad][4] = g.PadState[CurPad].AnalogStatus[ANALOG_RIGHT][0]; + stdpar[CurPad][5] = g.PadState[CurPad].AnalogStatus[ANALOG_RIGHT][1]; + stdpar[CurPad][6] = g.PadState[CurPad].AnalogStatus[ANALOG_LEFT][0]; + stdpar[CurPad][7] = g.PadState[CurPad].AnalogStatus[ANALOG_LEFT][1]; } else { CmdLen = 4; } @@ -329,25 +323,21 @@ unsigned char PADpoll(unsigned char value) { return buf[CurByte++]; } -#endif - static long PADreadPort(int num, PadDataS *pad) { UpdateInput(); pad->buttonStatus = (g.PadState[num].KeyStatus & g.PadState[num].JoyKeyStatus); -#ifdef EPSXE // ePSXe different from pcsx, swap bytes pad->buttonStatus = (pad->buttonStatus >> 8) | (pad->buttonStatus << 8); -#endif switch (g.cfg.PadDef[num].Type) { case PSE_PAD_TYPE_ANALOGPAD: // Analog Controller SCPH-1150 pad->controllerType = PSE_PAD_TYPE_ANALOGPAD; - pad->rightJoyX = g.PadState[num].AnalogStatus[ANALOG_RIGHT][ANALOG_X]; - pad->rightJoyY = g.PadState[num].AnalogStatus[ANALOG_RIGHT][ANALOG_Y]; - pad->leftJoyX = g.PadState[num].AnalogStatus[ANALOG_LEFT][ANALOG_X]; - pad->leftJoyY = g.PadState[num].AnalogStatus[ANALOG_LEFT][ANALOG_Y]; + pad->rightJoyX = g.PadState[num].AnalogStatus[ANALOG_RIGHT][0]; + pad->rightJoyY = g.PadState[num].AnalogStatus[ANALOG_RIGHT][1]; + pad->leftJoyX = g.PadState[num].AnalogStatus[ANALOG_LEFT][0]; + pad->leftJoyY = g.PadState[num].AnalogStatus[ANALOG_LEFT][1]; break; case PSE_PAD_TYPE_STANDARD: // Standard Pad SCPH-1080, SCPH-1150 diff --git a/plugins/dfinput/pad.h b/plugins/dfinput/pad.h index de63db69..7989e69d 100644 --- a/plugins/dfinput/pad.h +++ b/plugins/dfinput/pad.h @@ -23,8 +23,6 @@ extern "C" { #endif -//#define EPSXE 1 - #include "config.h" #include <stdio.h> @@ -93,13 +91,13 @@ typedef struct tagKeyDef { uint16_t Key; } KEYDEF; -enum { ANALOG_X = 0, ANALOG_Y }; +enum { ANALOG_XP = 0, ANALOG_XM, ANALOG_YP, ANALOG_YM }; typedef struct tagPadDef { int8_t DevNum; uint16_t Type; KEYDEF KeyDef[DKEY_TOTAL]; - int16_t AnalogDef[ANALOG_TOTAL][2]; // positive=axis+, negative=axis-, abs(Axis)-1=axis index + KEYDEF AnalogDef[ANALOG_TOTAL][4]; } PADDEF; typedef struct tagConfig { @@ -113,7 +111,8 @@ typedef struct tagPadState { uint8_t PadID; volatile uint16_t KeyStatus; volatile uint16_t JoyKeyStatus; - volatile uint8_t AnalogStatus[ANALOG_TOTAL][2]; // 0-255 where 128 is center position + volatile uint8_t AnalogStatus[ANALOG_TOTAL][2]; // 0-255 where 127 is center position + volatile uint8_t AnalogKeyStatus[ANALOG_TOTAL][4]; } PADSTATE; typedef struct tagGlobalData { @@ -156,6 +155,8 @@ void CheckKeyboard(); // analog.c functions... void InitAnalog(); void CheckAnalog(); +int AnalogKeyPressed(uint16_t Key); +int AnalogKeyReleased(uint16_t Key); // pad.c functions... char *PSEgetLibName(void); diff --git a/plugins/dfinput/sdljoy.c b/plugins/dfinput/sdljoy.c index 52d02d17..ff4ed467 100644 --- a/plugins/dfinput/sdljoy.c +++ b/plugins/dfinput/sdljoy.c @@ -55,7 +55,6 @@ void DestroySDLJoy() { void CheckJoy() { uint8_t i, j, n; - int dx, dy; SDL_JoystickUpdate(); diff --git a/plugins/dfinput/xkb.c b/plugins/dfinput/xkb.c index 4ac6f868..bfadef10 100644 --- a/plugins/dfinput/xkb.c +++ b/plugins/dfinput/xkb.c @@ -54,7 +54,7 @@ void CheckKeyboard() { } } } - if (!found) { + if (!found && !AnalogKeyPressed(Key)) { g.KeyLeftOver = Key; } return; @@ -70,7 +70,7 @@ void CheckKeyboard() { } } } - if (!found) { + if (!found && !AnalogKeyReleased(Key)) { g.KeyLeftOver = ((long)Key | 0x40000000); } break; |
