X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins%2Fdfinput%2Fpad.c;h=853c8c89c32e982be1180c7e1c2aa3d73f36f1d7;hb=9766e77ddec3157cbf8b7da407b99f47467a8f72;hp=53a254a403b895a175447fcd9cc50f7a06ceddab;hpb=1cb2b455712a0c9ae814b441a5a46e24e32a808c;p=pcsx_rearmed.git diff --git a/plugins/dfinput/pad.c b/plugins/dfinput/pad.c index 53a254a4..853c8c89 100644 --- a/plugins/dfinput/pad.c +++ b/plugins/dfinput/pad.c @@ -203,22 +203,44 @@ static void do_cmd2(unsigned char value) break; } break; - - case CMD_READ_DATA_AND_VIBRATE: - if (value == 1 && CurPad == 0 && in_enable_vibration) - plat_trigger_vibrate(0); - break; } } -static void do_cmd3(unsigned char value) +static void do_vibration(unsigned char value) { - if (in_enable_vibration && CurCmd == CMD_READ_DATA_AND_VIBRATE && CurPad == 0) { - if (value >= 0xf0) - plat_trigger_vibrate(1); - else if (value > 0x40) - plat_trigger_vibrate(0); - } + int changed = 0; + int i; + + switch (CurCmd) { + case CMD_READ_DATA_AND_VIBRATE: + for (i = 0; i < 2; i++) { + if (padstate[CurPad].pad.Vib[i] == CurByte + && padstate[CurPad].pad.VibF[i] != value) { + padstate[CurPad].pad.VibF[i] = value; + changed = 1; + } + } + + if (!in_enable_vibration || !changed) + break; + + plat_trigger_vibrate(CurPad, + padstate[CurPad].pad.VibF[0], + padstate[CurPad].pad.VibF[1]); + break; + case CMD_VIBRATION_TOGGLE: + for (i = 0; i < 2; i++) { + if (padstate[CurPad].pad.Vib[i] == CurByte) + buf[CurByte] = 0; + } + if (value < 2) { + padstate[CurPad].pad.Vib[value] = CurByte; + if((padstate[CurPad].PadID & 0x0f) < (CurByte - 1) / 2) { + padstate[CurPad].PadID = (padstate[CurPad].PadID & 0xf0) + (CurByte - 1) / 2; + } + } + break; + } } #if 0 @@ -232,10 +254,9 @@ unsigned char PADpoll(unsigned char value) { #define PADpoll PADpoll_ #endif +#ifndef HAVE_LIBRETRO unsigned char PADpoll_pad(unsigned char value) { - - switch (CurByte) { - case 0: + if (CurByte == 0) { CurCmd = value; CurByte++; @@ -244,17 +265,17 @@ unsigned char PADpoll_pad(unsigned char value) { CurCmd = CMD_READ_DATA_AND_VIBRATE; return do_cmd(); - case 2: - do_cmd2(value); - break; - case 3: - do_cmd3(value); - break; } if (CurByte >= CmdLen) return 0xff; // verified + if (CurByte == 2) + do_cmd2(value); + + if (padstate[CurPad].pad.controllerType == PSE_PAD_TYPE_ANALOGPAD) + do_vibration(value); + return buf[CurByte++]; } @@ -282,3 +303,4 @@ void pad_init(void) padstate[i].PadMode = padstate[i].pad.controllerType == PSE_PAD_TYPE_ANALOGPAD; } } +#endif