libretro: Add rumble support
[pcsx_rearmed.git] / plugins / dfinput / pad.c
index ab55db0..348bb8f 100644 (file)
@@ -21,7 +21,7 @@
 
 #include <stdint.h>
 
-#include "../../libpcsxcore/psemu_plugin_defs.h"
+#include "psemu_plugin_defs.h"
 #include "main.h"
 
 enum {
@@ -203,14 +203,43 @@ 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();
-                       break;
        }
 }
 
+static void do_cmd3(unsigned char value)
+{
+    int i;
+    switch (CurCmd) {
+        case CMD_READ_DATA_AND_VIBRATE:
+            if (!in_enable_vibration)
+                break;
+            if (padstate[CurPad].pad.controllerType != PSE_PAD_TYPE_ANALOGPAD)
+                break;
+
+            for (i = 0; i < 2; i++) {
+                if (padstate[CurPad].pad.Vib[i] == CurByte)
+                    padstate[CurPad].pad.VibF[i] = value;
+            }
+
+            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
 #include <stdio.h>
 unsigned char PADpoll_(unsigned char value);
@@ -223,8 +252,7 @@ unsigned char PADpoll(unsigned char value) {
 #endif
 
 unsigned char PADpoll_pad(unsigned char value) {
-
-       if (CurByte == 0) {
+    if (CurByte == 0) {
                CurCmd = value;
                CurByte++;
 
@@ -233,13 +261,15 @@ unsigned char PADpoll_pad(unsigned char value) {
                        CurCmd = CMD_READ_DATA_AND_VIBRATE;
 
                return do_cmd();
-       }
+    }
+
+    if (CurByte >= CmdLen)
+        return 0xff;   // verified
 
-       if (CurByte == 2)
+    if (CurByte == 2)
                do_cmd2(value);
 
-       if (CurByte >= CmdLen)
-               return 0xff;    // verified
+    do_cmd3(value);
 
        return buf[CurByte++];
 }