From 2878658251f8d2f76be5d6faf4ea3b3a40a6f820 Mon Sep 17 00:00:00 2001 From: mungewell Date: Fri, 22 Jul 2011 05:13:49 +0000 Subject: [PATCH] 415_wheel_miscalibration Abused the pow variable to indicate the polarity of the turn direction so that the deadzone can be correctly applied. The joystick stuff now passes 0-1 to either left/right turn, which is the scaled according to the Pow and Speed sensitivity. There the scaling is the same regardless of configure/range/deadzone. Might be worth doing the same for the mouse. git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@3742 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 2b5844a16c2160852f53ccdba4e6a58f25c69747 Former-commit-id: 05fff01eaa715c0e187e6f45e191f65de66e6181 --- src/drivers/human/human.cpp | 42 +++++++++++++++++-- src/drivers/human/pref.cpp | 2 +- .../legacymenu/confscreens/joystickconfig.cpp | 22 +++++++--- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/drivers/human/human.cpp b/src/drivers/human/human.cpp index 758783944..46ed05a00 100644 --- a/src/drivers/human/human.cpp +++ b/src/drivers/human/human.cpp @@ -652,13 +652,30 @@ common_drive(const int index, tCarElt* car, tSituation *s) switch (cmd[CMD_LEFTSTEER].type) { case GFCTRL_TYPE_JOY_AXIS: - ax0 = joyInfo->ax[cmd[CMD_LEFTSTEER].val] + cmd[CMD_LEFTSTEER].deadZone; + ax0 = joyInfo->ax[cmd[CMD_LEFTSTEER].val]; + + // limit and normalise if (ax0 > cmd[CMD_LEFTSTEER].max) { ax0 = cmd[CMD_LEFTSTEER].max; } else if (ax0 < cmd[CMD_LEFTSTEER].min) { ax0 = cmd[CMD_LEFTSTEER].min; } - leftSteer = -SIGN(ax0) * cmd[CMD_LEFTSTEER].pow * pow(fabs(ax0), 1.0f / cmd[CMD_LEFTSTEER].sens) / (1.0 + cmd[CMD_LEFTSTEER].spdSens * car->_speed_x / 100.0); + ax0 = (ax0 - cmd[CMD_LEFTSTEER].min) / (cmd[CMD_LEFTSTEER].max - cmd[CMD_LEFTSTEER].min); + + // pow used to indicate the polarity of 'more turn' + if (cmd[CMD_LEFTSTEER].pow > 0) + ax0 = ax0 - cmd[CMD_LEFTSTEER].deadZone; + else + ax0 = 1 - ax0 - cmd[CMD_LEFTSTEER].deadZone; + + if (ax0 < 0) ax0 = 0; + + if (1 - cmd[CMD_LEFTSTEER].deadZone != 0) + ax0 = ax0 / (1 - cmd[CMD_LEFTSTEER].deadZone); + else + ax0 = 0; + + leftSteer = fabs(cmd[CMD_LEFTSTEER].pow) * pow(ax0, 1.0f / cmd[CMD_LEFTSTEER].sens) / (1.0 + cmd[CMD_LEFTSTEER].spdSens * car->_speed_x / 100.0); break; case GFCTRL_TYPE_MOUSE_AXIS: ax0 = mouseInfo->ax[cmd[CMD_LEFTSTEER].val] - cmd[CMD_LEFTSTEER].deadZone; @@ -723,13 +740,30 @@ common_drive(const int index, tCarElt* car, tSituation *s) switch (cmd[CMD_RIGHTSTEER].type) { case GFCTRL_TYPE_JOY_AXIS: - ax0 = joyInfo->ax[cmd[CMD_RIGHTSTEER].val] - cmd[CMD_RIGHTSTEER].deadZone; + ax0 = joyInfo->ax[cmd[CMD_RIGHTSTEER].val]; + + // limit and normalise if (ax0 > cmd[CMD_RIGHTSTEER].max) { ax0 = cmd[CMD_RIGHTSTEER].max; } else if (ax0 < cmd[CMD_RIGHTSTEER].min) { ax0 = cmd[CMD_RIGHTSTEER].min; } - rightSteer = -SIGN(ax0) * cmd[CMD_RIGHTSTEER].pow * pow(fabs(ax0), 1.0f / cmd[CMD_RIGHTSTEER].sens) / (1.0 + cmd[CMD_RIGHTSTEER].spdSens * car->_speed_x / 100.0); + ax0 = (ax0 - cmd[CMD_RIGHTSTEER].min) / (cmd[CMD_RIGHTSTEER].max - cmd[CMD_RIGHTSTEER].min); + + // pow used to indicate the polarity of 'more turn' + if (cmd[CMD_RIGHTSTEER].pow > 0) + ax0 = ax0 - cmd[CMD_RIGHTSTEER].deadZone; + else + ax0 = 1 - ax0 - cmd[CMD_RIGHTSTEER].deadZone; + + if (ax0 < 0) ax0 = 0; + + if (1 - cmd[CMD_RIGHTSTEER].deadZone != 0) + ax0 = ax0 / (1 - cmd[CMD_RIGHTSTEER].deadZone); + else + ax0 = 0; + + rightSteer = -1 * fabs(cmd[CMD_RIGHTSTEER].pow) * pow(ax0, 1.0f / cmd[CMD_RIGHTSTEER].sens) / (1.0 + cmd[CMD_RIGHTSTEER].spdSens * car->_speed_x / 100.0); break; case GFCTRL_TYPE_MOUSE_AXIS: ax0 = mouseInfo->ax[cmd[CMD_RIGHTSTEER].val] - cmd[CMD_RIGHTSTEER].deadZone; diff --git a/src/drivers/human/pref.cpp b/src/drivers/human/pref.cpp index d11e311eb..b002d1e08 100644 --- a/src/drivers/human/pref.cpp +++ b/src/drivers/human/pref.cpp @@ -192,7 +192,7 @@ HmReadPrefs(const int index) if (cmdCtrl[cmd].min > cmdCtrl[cmd].max) std::swap(cmdCtrl[cmd].min, cmdCtrl[cmd].max); - cmdCtrl[cmd].deadZone = (cmdCtrl[cmd].max - cmdCtrl[cmd].min) * cmdCtrl[cmd].deadZone; + //cmdCtrl[cmd].deadZone = (cmdCtrl[cmd].max - cmdCtrl[cmd].min) * cmdCtrl[cmd].deadZone; if (cmdCtrl[cmd].type == GFCTRL_TYPE_MOUSE_AXIS) HCtx[idx]->mouseControlUsed = 1; diff --git a/src/modules/userinterface/legacymenu/confscreens/joystickconfig.cpp b/src/modules/userinterface/legacymenu/confscreens/joystickconfig.cpp index 09e430c39..eafb99672 100644 --- a/src/modules/userinterface/legacymenu/confscreens/joystickconfig.cpp +++ b/src/modules/userinterface/legacymenu/confscreens/joystickconfig.cpp @@ -128,9 +128,15 @@ JoyCalAutomaton(void) break; case 1: axis = Cmd[CalState + CmdOffset].ref.index; - Cmd[CalState + CmdOffset].min = JoyAxis[axis]; - Cmd[CalState + CmdOffset].max = JoyAxisCenter[axis]; - Cmd[CalState + CmdOffset].pow = 1.0; + Cmd[CalState + CmdOffset].min = JoyAxisCenter[axis]; + Cmd[CalState + CmdOffset].max = JoyAxis[axis]; + + // record the polarity of the turn action + if (Cmd[CalState + CmdOffset].max >= Cmd[CalState + CmdOffset].min) + Cmd[CalState + CmdOffset].pow = 1.0; + else + Cmd[CalState + CmdOffset].pow = -1.0; + sprintf(buf, "%.2f", JoyAxis[axis]); GfuiLabelSetText(ScrHandle, LabMinId[0], buf); advanceStep(); @@ -139,7 +145,13 @@ JoyCalAutomaton(void) axis = Cmd[CalState + CmdOffset].ref.index; Cmd[CalState + CmdOffset].min = JoyAxisCenter[axis]; Cmd[CalState + CmdOffset].max = JoyAxis[axis]; - Cmd[CalState + CmdOffset].pow = 1.0; + + // record the polarity of the turn action + if (Cmd[CalState + CmdOffset].max >= Cmd[CalState + CmdOffset].min) + Cmd[CalState + CmdOffset].pow = 1.0; + else + Cmd[CalState + CmdOffset].pow = -1.0; + sprintf(buf, "%.2f", JoyAxis[axis]); GfuiLabelSetText(ScrHandle, LabMaxId[0], buf); advanceStep(); @@ -149,7 +161,7 @@ JoyCalAutomaton(void) case 5: axis = Cmd[CalState + CmdOffset].ref.index; Cmd[CalState + CmdOffset].min = JoyAxisCenter[axis]; - Cmd[CalState + CmdOffset].max = JoyAxis[axis]*1.1; + Cmd[CalState + CmdOffset].max = JoyAxis[axis]; Cmd[CalState + CmdOffset].pow = 1.2; sprintf(buf, "%.2f", JoyAxisCenter[axis]); GfuiLabelSetText(ScrHandle, LabMinId[CalState - 2], buf);