improve vibration support for Caanoo
authornotaz <notasas@gmail.com>
Thu, 1 Mar 2012 21:34:16 +0000 (23:34 +0200)
committernotaz <notasas@gmail.com>
Thu, 1 Mar 2012 21:34:16 +0000 (23:34 +0200)
..maybe, not tested much.

Makefile.caanoo
frontend/320240/haptic_s.cfg [moved from frontend/320240/haptic.txt with 100% similarity]
frontend/320240/haptic_w.cfg [new file with mode: 0644]
frontend/plat_dummy.c
frontend/plat_omap.c
frontend/plat_pollux.c
maemo/hildon.c
plugins/dfinput/main.h
plugins/dfinput/pad.c

index a937f19..290ca9c 100644 (file)
@@ -18,7 +18,8 @@ rel_caanoo: pcsx $(PLUGINS) \
                frontend/320240/caanoo.gpe frontend/320240/pcsx26.png \
                frontend/320240/pcsxb.png frontend/320240/skin \
                frontend/warm/bin/warm_2.6.24.ko frontend/320240/pollux_set \
                frontend/320240/caanoo.gpe frontend/320240/pcsx26.png \
                frontend/320240/pcsxb.png frontend/320240/skin \
                frontend/warm/bin/warm_2.6.24.ko frontend/320240/pollux_set \
-               frontend/320240/pcsx_rearmed.ini frontend/320240/haptic.txt \
+               frontend/320240/pcsx_rearmed.ini frontend/320240/haptic_w.cfg \
+               frontend/320240/haptic_s.cfg \
                readme.txt COPYING
        rm -rf out
        mkdir -p out/pcsx_rearmed/plugins
                readme.txt COPYING
        rm -rf out
        mkdir -p out/pcsx_rearmed/plugins
diff --git a/frontend/320240/haptic_w.cfg b/frontend/320240/haptic_w.cfg
new file mode 100644 (file)
index 0000000..3585a71
--- /dev/null
@@ -0,0 +1,3 @@
+0       54
+100     -126
+105     0
index 7929015..6249df5 100644 (file)
@@ -68,7 +68,7 @@ void plat_step_volume(int is_up)
 {
 }
 
 {
 }
 
-void plat_trigger_vibrate(void)
+void plat_trigger_vibrate(int is_strong)
 {
 }
 
 {
 }
 
index 998e1df..3a6a948 100644 (file)
@@ -132,7 +132,7 @@ void plat_step_volume(int is_up)
 {
 }
 
 {
 }
 
-void plat_trigger_vibrate(void)
+void plat_trigger_vibrate(int is_strong)
 {
 }
 
 {
 }
 
index d402e84..c03173e 100644 (file)
@@ -689,21 +689,22 @@ struct haptic_data {
 #define HAPTIC_SET_VIB_LEVEL   _IOW(HAPTIC_IOCTL_MAGIC, 9, unsigned int)
 
 static int hapticdev = -1;
 #define HAPTIC_SET_VIB_LEVEL   _IOW(HAPTIC_IOCTL_MAGIC, 9, unsigned int)
 
 static int hapticdev = -1;
-static struct haptic_data haptic_seq;
+static struct haptic_data haptic_seq[2];
 
 
-static int haptic_init(void)
+static int haptic_read(const char *fname, struct haptic_data *data)
 {
        int i, ret, v1, v2;
        char buf[128], *p;
        FILE *f;
 
 {
        int i, ret, v1, v2;
        char buf[128], *p;
        FILE *f;
 
-       f = fopen("haptic.txt", "r");
+       f = fopen(fname, "r");
        if (f == NULL) {
        if (f == NULL) {
-               perror("fopen(haptic.txt)");
+               fprintf("fopen(%s)", fname);
+               perror("");
                return -1;
        }
 
                return -1;
        }
 
-       for (i = 0; i < sizeof(haptic_seq.actions) / sizeof(haptic_seq.actions[0]); ) {
+       for (i = 0; i < sizeof(data->actions) / sizeof(data->actions[0]); ) {
                p = fgets(buf, sizeof(buf), f);
                if (p == NULL)
                        break;
                p = fgets(buf, sizeof(buf), f);
                if (p == NULL)
                        break;
@@ -718,17 +719,31 @@ static int haptic_init(void)
                        continue;
                }
 
                        continue;
                }
 
-               haptic_seq.actions[i].time = v1;
-               haptic_seq.actions[i].strength = v2;
+               data->actions[i].time = v1;
+               data->actions[i].strength = v2;
                i++;
        }
        fclose(f);
 
        if (i == 0) {
                i++;
        }
        fclose(f);
 
        if (i == 0) {
-               fprintf(stderr, "bad haptic.txt\n");
+               fprintf(stderr, "bad haptic file: %s\n", fname);
                return -1;
        }
                return -1;
        }
-       haptic_seq.count = i;
+       data->count = i;
+
+       return 0;
+}
+
+static int haptic_init(void)
+{
+       int ret, i;
+
+       ret = haptic_read("haptic_w.cfg", &haptic_seq[0]);
+       if (ret != 0)
+               return -1;
+       ret = haptic_read("haptic_s.cfg", &haptic_seq[1]);
+       if (ret != 0)
+               return -1;
 
        hapticdev = open("/dev/isa1200", O_RDWR | O_NONBLOCK);
        if (hapticdev == -1) {
 
        hapticdev = open("/dev/isa1200", O_RDWR | O_NONBLOCK);
        if (hapticdev == -1) {
@@ -750,7 +765,7 @@ static int haptic_init(void)
        return 0;
 }
 
        return 0;
 }
 
-void plat_trigger_vibrate(void)
+void plat_trigger_vibrate(int is_strong)
 {
        int ret;
 
 {
        int ret;
 
@@ -764,7 +779,7 @@ void plat_trigger_vibrate(void)
                }
        }
 
                }
        }
 
-       ioctl(hapticdev, HAPTIC_PLAY_PATTERN, &haptic_seq);
+       ioctl(hapticdev, HAPTIC_PLAY_PATTERN, &haptic_seq[!!is_strong]);
 }
 
 /* Wiz stuff */
 }
 
 /* Wiz stuff */
index 0399909..08949ff 100644 (file)
@@ -262,7 +262,7 @@ void plat_step_volume(int is_up)
 {
 }
 
 {
 }
 
-void plat_trigger_vibrate(void)
+void plat_trigger_vibrate(int is_strong)
 {
 }
 
 {
 }
 
index 3492170..8e2d5ae 100644 (file)
@@ -27,4 +27,4 @@ extern void pl_update_gun(int *xn, int *xres, int *y, int *in);
 
 /* vibration trigger to frontend */
 extern int in_enable_vibration;
 
 /* vibration trigger to frontend */
 extern int in_enable_vibration;
-extern void plat_trigger_vibrate(void);
+extern void plat_trigger_vibrate(int is_strong);
index ab55db0..a8019b9 100644 (file)
@@ -206,11 +206,21 @@ static void do_cmd2(unsigned char value)
 
                case CMD_READ_DATA_AND_VIBRATE:
                        if (value == 1 && CurPad == 0 && in_enable_vibration)
 
                case CMD_READ_DATA_AND_VIBRATE:
                        if (value == 1 && CurPad == 0 && in_enable_vibration)
-                               plat_trigger_vibrate();
+                               plat_trigger_vibrate(0);
                        break;
        }
 }
 
                        break;
        }
 }
 
+static void do_cmd3(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);
+       }
+}
+
 #if 0
 #include <stdio.h>
 unsigned char PADpoll_(unsigned char value);
 #if 0
 #include <stdio.h>
 unsigned char PADpoll_(unsigned char value);
@@ -224,7 +234,8 @@ unsigned char PADpoll(unsigned char value) {
 
 unsigned char PADpoll_pad(unsigned char value) {
 
 
 unsigned char PADpoll_pad(unsigned char value) {
 
-       if (CurByte == 0) {
+       switch (CurByte) {
+       case 0:
                CurCmd = value;
                CurByte++;
 
                CurCmd = value;
                CurByte++;
 
@@ -233,10 +244,13 @@ unsigned char PADpoll_pad(unsigned char value) {
                        CurCmd = CMD_READ_DATA_AND_VIBRATE;
 
                return do_cmd();
                        CurCmd = CMD_READ_DATA_AND_VIBRATE;
 
                return do_cmd();
-       }
-
-       if (CurByte == 2)
+       case 2:
                do_cmd2(value);
                do_cmd2(value);
+               break;
+       case 3:
+               do_cmd3(value);
+               break;
+       }
 
        if (CurByte >= CmdLen)
                return 0xff;    // verified
 
        if (CurByte >= CmdLen)
                return 0xff;    // verified