Setting effects memory to 0. gsoc2008_force_feedback
authorEdgar Simo <bobbens@gmail.com>
Tue, 01 Jul 2008 14:09:53 +0000
branchgsoc2008_force_feedback
changeset 2483 9d52368ebcf5
parent 2482 b51ad78812d5
child 2484 666472fd4cb0
Setting effects memory to 0. Added SDL_HapticSetGain().
include/SDL_haptic.h
src/haptic/SDL_haptic.c
src/haptic/SDL_syshaptic.h
src/haptic/linux/SDL_syshaptic.c
--- a/include/SDL_haptic.h	Tue Jul 01 11:21:36 2008 +0000
+++ b/include/SDL_haptic.h	Tue Jul 01 14:09:53 2008 +0000
@@ -232,11 +232,15 @@
 
 /*
  * Creates a new haptic effect on the device.
+ *
+ * Returns the id of the effect on success, -1 on failure.
  */
 extern DECLSPEC int SDL_HapticNewEffect(SDL_Haptic * haptic, SDL_HapticEffect * effect);
 
 /*
  * Runs the haptic effect on it's assosciated haptic device.
+ *
+ * Returns 0 on success or -1 on failure.
  */
 extern DECLSPEC int SDL_HapticRunEffect(SDL_Haptic * haptic, int effect);
 
@@ -245,6 +249,13 @@
  */
 extern DECLSPEC void SDL_HapticDestroyEffect(SDL_Haptic * haptic, int effect);
 
+/*
+ * Sets the global gain of the device.  Gain should be between 0 and 100.
+ *
+ * Returns 0 on success or -1 on failure.
+ */
+extern DECLSPEC int SDL_HapticSetGain(SDL_Haptic * haptic, int gain);
+
 
 /* Ends C function definitions when using C++ */
 #ifdef __cplusplus
--- a/src/haptic/SDL_haptic.c	Tue Jul 01 11:21:36 2008 +0000
+++ b/src/haptic/SDL_haptic.c	Tue Jul 01 14:09:53 2008 +0000
@@ -324,4 +324,26 @@
    SDL_SYS_HapticDestroyEffect(haptic, &haptic->effects[effect]);
 }
 
+/*
+ * Sets the global gain of the device.
+ */
+int
+SDL_HapticSetGain(SDL_Haptic * haptic, int gain )
+{
+   if (!ValidHaptic(&haptic)) {
+      return -1;
+   }
 
+   if ((gain < 0) || (gain > 100)) {
+      SDL_SetError("Haptic gain must be between 0 and 100.");
+      return -1;
+   }
+
+   if (SDL_SYS_HapticSetGain(haptic,gain) < 0) {
+      return -1;
+   }
+
+   return 0;
+}
+
+
--- a/src/haptic/SDL_syshaptic.h	Tue Jul 01 11:21:36 2008 +0000
+++ b/src/haptic/SDL_syshaptic.h	Tue Jul 01 14:09:53 2008 +0000
@@ -58,5 +58,6 @@
       struct haptic_effect * effect);
 extern void SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic,
       struct haptic_effect * effect);
+extern int SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain);
 
 
--- a/src/haptic/linux/SDL_syshaptic.c	Tue Jul 01 11:21:36 2008 +0000
+++ b/src/haptic/linux/SDL_syshaptic.c	Tue Jul 01 14:09:53 2008 +0000
@@ -35,7 +35,6 @@
 #include <fcntl.h>
 #include <linux/limits.h>
 #include <string.h>
-#include <errno.h>
 
 
 #define MAX_HAPTICS  32
@@ -222,6 +221,9 @@
       SDL_OutOfMemory();
       goto open_err;
    }
+   /* Clear the memory */
+   SDL_memset(haptic->effects, 0,
+         sizeof(struct haptic_effect) * haptic->neffects);
 
    return 0;
 
@@ -435,6 +437,7 @@
    return 0;
 }
 
+
 /*
  * Creates a new haptic effect.
  */
@@ -461,8 +464,7 @@
 
    /* Upload the effect */
    if (ioctl(haptic->hwdata->fd, EVIOCSFF, linux_effect) < 0) {
-      SDL_SetError("Error uploading effect to the haptic device: %s",
-            strerror(errno));
+      SDL_SetError("Error uploading effect to the haptic device.");
       return -1;
    }
 
@@ -506,4 +508,24 @@
 }
 
 
+/*
+ * Sets the gain.
+ */
+int
+SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
+{
+   struct input_event ie;
+
+   ie.type = EV_FF;
+   ie.code = FF_GAIN;
+   ie.value = (0xFFFFUL * gain) / 100;
+   printf("%d\n",ie.value);
+
+   if (write(haptic->hwdata->fd, &ie, sizeof(ie)) == -1) {
+      SDL_SetError("Error setting gain.");
+   }
+
+}
+
+
 #endif /* SDL_HAPTIC_LINUX */