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
This commit is contained in:
mungewell 2011-07-22 05:13:49 +00:00
parent 3c26f3b749
commit 2878658251
3 changed files with 56 additions and 10 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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);