Haptic: Fix the saturation and deadband parameters' available range.
authorRyan C. Gordon <icculus@icculus.org>
Sat, 16 Aug 2014 16:47:42 -0400
changeset 9070 8973a237f360
parent 9069 16b5dda99337
child 9071 8e04e17c7af3
Haptic: Fix the saturation and deadband parameters' available range. There was a misconception that Linux's saturation and deadband parameters - on which the corresponding SDL parameters were based - use only half of the possible range. Thanks, Elias! Partially fixes Bugzilla #2686.
include/SDL_haptic.h
src/haptic/darwin/SDL_syshaptic.c
src/haptic/linux/SDL_syshaptic.c
src/haptic/windows/SDL_dinputhaptic.c
test/testhaptic.c
--- a/include/SDL_haptic.h	Sat Aug 16 16:42:55 2014 -0400
+++ b/include/SDL_haptic.h	Sat Aug 16 16:47:42 2014 -0400
@@ -604,11 +604,11 @@
     Uint16 interval;        /**< How soon it can be triggered again after button. */
 
     /* Condition */
-    Uint16 right_sat[3];    /**< Level when joystick is to the positive side. */
-    Uint16 left_sat[3];     /**< Level when joystick is to the negative side. */
+    Uint16 right_sat[3];    /**< Level when joystick is to the positive side; max 0xFFFF. */
+    Uint16 left_sat[3];     /**< Level when joystick is to the negative side; max 0xFFFF. */
     Sint16 right_coeff[3];  /**< How fast to increase the force towards the positive side. */
     Sint16 left_coeff[3];   /**< How fast to increase the force towards the negative side. */
-    Uint16 deadband[3];     /**< Size of the dead zone. */
+    Uint16 deadband[3];     /**< Size of the dead zone; max 0xFFFF: whole axis-range when 0-centered. */
     Sint16 center[3];       /**< Position of the dead zone. */
 } SDL_HapticCondition;
 
--- a/src/haptic/darwin/SDL_syshaptic.c	Sat Aug 16 16:42:55 2014 -0400
+++ b/src/haptic/darwin/SDL_syshaptic.c	Sat Aug 16 16:47:42 2014 -0400
@@ -924,10 +924,10 @@
             condition[i].lNegativeCoefficient =
                 CONVERT(hap_condition->left_coeff[i]);
             condition[i].dwPositiveSaturation =
-                CCONVERT(hap_condition->right_sat[i]);
+                CCONVERT(hap_condition->right_sat[i] / 2);
             condition[i].dwNegativeSaturation =
-                CCONVERT(hap_condition->left_sat[i]);
-            condition[i].lDeadBand = CCONVERT(hap_condition->deadband[i]);
+                CCONVERT(hap_condition->left_sat[i] / 2);
+            condition[i].lDeadBand = CCONVERT(hap_condition->deadband[i] / 2);
         }
         dest->cbTypeSpecificParams = sizeof(FFCONDITION) * dest->cAxes;
         dest->lpvTypeSpecificParams = condition;
--- a/src/haptic/linux/SDL_syshaptic.c	Sat Aug 16 16:42:55 2014 -0400
+++ b/src/haptic/linux/SDL_syshaptic.c	Sat Aug 16 16:47:42 2014 -0400
@@ -847,20 +847,18 @@
 
         /* Condition */
         /* X axis */
-        dest->u.condition[0].right_saturation =
-            CLAMP(condition->right_sat[0]);
-        dest->u.condition[0].left_saturation = CLAMP(condition->left_sat[0]);
+        dest->u.condition[0].right_saturation = condition->right_sat[0];
+        dest->u.condition[0].left_saturation = condition->left_sat[0];
         dest->u.condition[0].right_coeff = condition->right_coeff[0];
         dest->u.condition[0].left_coeff = condition->left_coeff[0];
-        dest->u.condition[0].deadband = CLAMP(condition->deadband[0]);
+        dest->u.condition[0].deadband = condition->deadband[0];
         dest->u.condition[0].center = condition->center[0];
         /* Y axis */
-        dest->u.condition[1].right_saturation =
-            CLAMP(condition->right_sat[1]);
-        dest->u.condition[1].left_saturation = CLAMP(condition->left_sat[1]);
+        dest->u.condition[1].right_saturation = condition->right_sat[1];
+        dest->u.condition[1].left_saturation = condition->left_sat[1];
         dest->u.condition[1].right_coeff = condition->right_coeff[1];
         dest->u.condition[1].left_coeff = condition->left_coeff[1];
-        dest->u.condition[1].deadband = CLAMP(condition->deadband[1]);
+        dest->u.condition[1].deadband = condition->deadband[1];
         dest->u.condition[1].center = condition->center[1];
 
         /*
--- a/src/haptic/windows/SDL_dinputhaptic.c	Sat Aug 16 16:42:55 2014 -0400
+++ b/src/haptic/windows/SDL_dinputhaptic.c	Sat Aug 16 16:47:42 2014 -0400
@@ -763,10 +763,10 @@
             condition[i].lNegativeCoefficient =
                 CONVERT(hap_condition->left_coeff[i]);
             condition[i].dwPositiveSaturation =
-                CONVERT(hap_condition->right_sat[i]);
+                CONVERT(hap_condition->right_sat[i] / 2);
             condition[i].dwNegativeSaturation =
-                CONVERT(hap_condition->left_sat[i]);
-            condition[i].lDeadBand = CONVERT(hap_condition->deadband[i]);
+                CONVERT(hap_condition->left_sat[i] / 2);
+            condition[i].lDeadBand = CONVERT(hap_condition->deadband[i] / 2);
         }
         dest->cbTypeSpecificParams = sizeof(DICONDITION) * dest->cAxes;
         dest->lpvTypeSpecificParams = condition;
--- a/test/testhaptic.c	Sat Aug 16 16:42:55 2014 -0400
+++ b/test/testhaptic.c	Sat Aug 16 16:47:42 2014 -0400
@@ -172,8 +172,8 @@
         efx[nefx].type = SDL_HAPTIC_SPRING;
         efx[nefx].condition.length = 5000;
         for (i = 0; i < SDL_HapticNumAxes(haptic); i++) {
-            efx[nefx].condition.right_sat[i] = 0x7FFF;
-            efx[nefx].condition.left_sat[i] = 0x7FFF;
+            efx[nefx].condition.right_sat[i] = 0xFFFF;
+            efx[nefx].condition.left_sat[i] = 0xFFFF;
             efx[nefx].condition.right_coeff[i] = 0x2000;
             efx[nefx].condition.left_coeff[i] = 0x2000;
             efx[nefx].condition.center[i] = 0x1000;     /* Displace the center for it to move. */
@@ -191,10 +191,11 @@
         efx[nefx].type = SDL_HAPTIC_INERTIA;
         efx[nefx].condition.length = 5000;
         for (i = 0; i < SDL_HapticNumAxes(haptic); i++) {
-            efx[nefx].condition.right_sat[i] = 0x7FFF;
-            efx[nefx].condition.left_sat[i] = 0x7FFF;
+            efx[nefx].condition.right_sat[i] = 0xFFFF;
+            efx[nefx].condition.left_sat[i] = 0xFFFF;
             efx[nefx].condition.right_coeff[i] = 0x2000;
             efx[nefx].condition.left_coeff[i] = 0x2000;
+            efx[nefx].condition.deadband[i] = 0x1000;    /* 1/16th of axis-range around the center is 'dead'. */
         }
         id[nefx] = SDL_HapticNewEffect(haptic, &efx[nefx]);
         if (id[nefx] < 0) {