1
0
Fork 0
mirror of https://github.com/EdgeTX/edgetx.git synced 2025-07-21 15:25:12 +03:00

[Simulator] Fix and refactor Joystick configuration dialog and internal stick-to-radio axis mapping system. Stick was not always showing active in config. dialog, and mappings were sometimes wrong. (#4672)

This commit is contained in:
Max Paperno 2017-03-22 16:02:04 -04:00 committed by Bertrand Songis
parent 4f6931faab
commit 4faf323aed
5 changed files with 111 additions and 464 deletions

View file

@ -584,25 +584,9 @@ void SimulatorWidget::setupRadioWidgets()
void SimulatorWidget::setupJoysticks()
{
#ifdef JOYSTICKS
static bool joysticksEnabled = false;
if (g.jsSupport() && g.jsCtrl() > -1) {
int count=0, axe;
for (int j=0; j < MAX_JOYSTICKS; j++){
axe = g.joystick[j].stick_axe();
if (axe >= 0 && axe < MAX_JOYSTICKS) {
jsmap[axe] = j + 1;
jscal[axe][0] = g.joystick[j].stick_min();
jscal[axe][1] = g.joystick[j].stick_med();
jscal[axe][2] = g.joystick[j].stick_max();
jscal[axe][3] = g.joystick[j].stick_inv();
count++;
}
}
if (count<3) {
QMessageBox::critical(this, tr("Warning"), tr("Joystick enabled but not configured correctly"));
return;
}
bool joysticksEnabled = false;
if (g.jsSupport() && g.jsCtrl() > -1) {
if (!joystick)
joystick = new Joystick(this);
else
@ -614,24 +598,26 @@ void SimulatorWidget::setupJoysticks()
joystick->sensitivities[j] = 0;
joystick->deadzones[j] = 0;
}
//mode 1,3 -> THR on right
vJoyRight->setStickConstraint(VirtualJoystickWidget::HOLD_Y, true);
vJoyRight->setStickConstraint(VirtualJoystickWidget::HOLD_X, true);
vJoyLeft->setStickConstraint(VirtualJoystickWidget::HOLD_Y, true);
vJoyLeft->setStickConstraint(VirtualJoystickWidget::HOLD_X, true);
connect(joystick, SIGNAL(axisValueChanged(int, int)), this, SLOT(onjoystickAxisValueChanged(int, int)));
connect(joystick, &Joystick::axisValueChanged, this, &SimulatorWidget::onjoystickAxisValueChanged);
joysticksEnabled = true;
}
else {
QMessageBox::critical(this, tr("Warning"), tr("Cannot open joystick, joystick disabled"));
}
}
else if (joysticksEnabled && joystick) {
else if (joystick) {
joystick->close();
disconnect(joystick, 0, this, 0);
vJoyRight->setStickConstraint(VirtualJoystickWidget::HOLD_Y, false);
vJoyRight->setStickConstraint(VirtualJoystickWidget::HOLD_X, false);
vJoyLeft->setStickConstraint(VirtualJoystickWidget::HOLD_Y, false);
vJoyLeft->setStickConstraint(VirtualJoystickWidget::HOLD_X, false);
joystick->deleteLater();
joystick = NULL;
}
if (vJoyRight) {
vJoyRight->setStickConstraint(VirtualJoystickWidget::HOLD_X, joysticksEnabled);
vJoyRight->setStickConstraint(VirtualJoystickWidget::HOLD_Y, joysticksEnabled);
}
if (vJoyLeft) {
vJoyLeft->setStickConstraint(VirtualJoystickWidget::HOLD_X, joysticksEnabled);
vJoyLeft->setStickConstraint(VirtualJoystickWidget::HOLD_Y, joysticksEnabled);
}
#endif
}
@ -860,38 +846,46 @@ void SimulatorWidget::centerSticks()
void SimulatorWidget::onjoystickAxisValueChanged(int axis, int value)
{
#ifdef JOYSTICKS
int stick;
if (axis>=0 && axis<=8) {
stick=jsmap[axis];
int stickval;
if (value>jscal[axis][1]) {
if ((jscal[axis][2]-jscal[axis][1])==0)
return;
stickval=(1024*(value-jscal[axis][1]))/(jscal[axis][2]-jscal[axis][1]);
}
else {
if ((jscal[axis][1]-jscal[axis][0])==0)
return;
stickval=(1024*(value-jscal[axis][1]))/(jscal[axis][1]-jscal[axis][0]);
}
if (jscal[axis][3]==1) {
stickval*=-1;
}
if (stick==1 ) {
vJoyRight->setStickY(-stickval/1024.0);
}
else if (stick==2) {
vJoyRight->setStickX(stickval/1024.0);
}
else if (stick==3) {
vJoyLeft->setStickY(-stickval/1024.0);
}
else if (stick==4) {
vJoyLeft->setStickX(stickval/1024.0);
}
else if (stick >= 5 && stick < 5 + analogs.count()) {
analogs[stick-5]->setValue(stickval);
}
static const int ttlSticks = CPN_MAX_STICKS;
static const int valueRange = 1024;
if (!joystick || axis >= MAX_JOYSTICKS)
return;
int dlta;
int stick = g.joystick[axis].stick_axe();
if (stick < 0 || stick >= ttlSticks + analogs.count())
return;
int stickval = valueRange * (value - g.joystick[axis].stick_med());
if (value > g.joystick[axis].stick_med()) {
if ((dlta = g.joystick[axis].stick_max() - g.joystick[axis].stick_med()))
stickval /= dlta;
}
else if ((dlta = g.joystick[axis].stick_med() - g.joystick[axis].stick_min())) {
stickval /= dlta;
}
if (g.joystick[axis].stick_inv())
stickval *= -1;
if (stick==1 ) {
vJoyRight->setStickY(-stickval/1024.0);
}
else if (stick==2) {
vJoyRight->setStickX(stickval/1024.0);
}
else if (stick==3) {
vJoyLeft->setStickY(-stickval/1024.0);
}
else if (stick==4) {
vJoyLeft->setStickX(stickval/1024.0);
}
else if (stick > ttlSticks) {
analogs[stick-ttlSticks-1]->setValue(stickval);
}
#endif
}