From 4faf323aed34e1f9775b1bd805d5adfb53936b6d Mon Sep 17 00:00:00 2001 From: Max Paperno Date: Wed, 22 Mar 2017 16:02:04 -0400 Subject: [PATCH] [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) --- companion/src/simulation/joystickdialog.cpp | 90 +++-- companion/src/simulation/joystickdialog.h | 3 +- companion/src/simulation/joystickdialog.ui | 364 +------------------ companion/src/simulation/simulatorwidget.cpp | 116 +++--- companion/src/simulation/simulatorwidget.h | 2 - 5 files changed, 111 insertions(+), 464 deletions(-) diff --git a/companion/src/simulation/joystickdialog.cpp b/companion/src/simulation/joystickdialog.cpp index 76a08e5c2..77cd14ef0 100644 --- a/companion/src/simulation/joystickdialog.cpp +++ b/companion/src/simulation/joystickdialog.cpp @@ -21,6 +21,8 @@ #include "joystickdialog.h" #include "ui_joystickdialog.h" +#include "constants.h" + joystickDialog::joystickDialog(QWidget *parent, int stick) : QDialog(parent), ui(new Ui::joystickDialog), @@ -43,6 +45,7 @@ joystickDialog::joystickDialog(QWidget *parent, int stick) : memcpy(jscal, jscaltmp, sizeof (jscal)); foreach(QComboBox *cb, findChildren(QRegExp("jsmapCB_[0-9]+"))) { + populateSourceCombo(cb); sticks[cb->property("channel").toUInt()] = cb; } foreach(QCheckBox *ib, findChildren(QRegExp("ChInv_[0-9]+"))) { @@ -62,7 +65,7 @@ joystickDialog::joystickDialog(QWidget *parent, int stick) : sliders[i]->setMinimum(jscal[i][0]); sliders[i]->setMaximum(jscal[i][2]); invert[i]->setChecked(g.joystick[i].stick_inv()); - sticks[i]->setCurrentIndex(g.joystick[i].stick_axe() + 1); + sticks[i]->setCurrentIndex(sticks[i]->findData(g.joystick[i].stick_axe())); } ui->backButton->setEnabled(false); @@ -72,7 +75,13 @@ joystickDialog::joystickDialog(QWidget *parent, int stick) : if (stick < 0) stick = g.jsCtrl(); - loadJoysticks(stick); + if (loadJoysticks(stick)) { + joystickSetEnabled(ui->joystickChkB->isChecked()); + joystickOpen(ui->joystickCB->currentIndex()); + } + else { + joystickSetEnabled(false); + } loadStep(); connect(joystick, SIGNAL(axisValueChanged(int, int)), this, SLOT(onjoystickAxisValueChanged(int, int))); @@ -85,7 +94,26 @@ joystickDialog::~joystickDialog() delete ui; } -void joystickDialog::loadJoysticks(int stick) +void joystickDialog::populateSourceCombo(QComboBox * cb) +{ + int i; + const QString axes[] = { + tr("Left Horizontal"), + tr("Left Vertical"), + tr("Right Vertical"), + tr("Right Horizontal") + }; + cb->clear(); + cb->addItem(tr("Not Assigned"), -1); + for (i=0; i < 4; ++i) { + cb->addItem(axes[i] % tr(" Stick"), i); + } + for (; i < CPN_MAX_STICKS + CPN_MAX_POTS; ++i) { + cb->addItem(tr("Knob/Slider %1").arg(i - CPN_MAX_STICKS + 1), i); + } +} + +bool joystickDialog::loadJoysticks(int stick) { QStringList joystickNames; bool found = false; @@ -101,23 +129,19 @@ void joystickDialog::loadJoysticks(int stick) joystick->close(); } ui->joystickCB->insertItems(0, joystickNames); - if (found && stick < joystickNames.size()) + if (found && stick < joystickNames.size()) { ui->joystickCB->setCurrentIndex(stick); - else if (!found) - ui->joystickCB->setCurrentIndex(0); - - joystickSetEnabled(found && ui->joystickChkB->isChecked()); + } + else if (!found) { + joystickSetEnabled(false); + } + return found; } void joystickDialog::joystickOpen(int stick) { - if (stick == -1 || !ui->joystickChkB->isChecked() || !ui->joystickCB->isEnabled()) { - ui->calibrationWidget->setDisabled(true); + if (stick < 0) return; - } - - ui->calibrationWidget->setEnabled(true); - ui->nextButton->setEnabled(true); joystick = new Joystick(this, 1, false, 0); if (joystick && joystick->open(stick)) { @@ -138,8 +162,6 @@ void joystickDialog::joystickSetEnabled(bool enable) ui->calibrationWidget->setEnabled(enable); ui->nextButton->setEnabled(enable && step < 4); ui->backButton->setEnabled(enable && step); - if (enable) - joystickOpen(ui->joystickCB->currentIndex()); } void joystickDialog::onjoystickAxisValueChanged(int axis, int value) @@ -229,6 +251,9 @@ void joystickDialog::on_okButton_clicked() g.jsSupport(ui->joystickChkB->isChecked()); g.jsCtrl(ui->joystickCB->currentIndex()); + if (joystick) + joystick->close(); + if (!g.jsSupport() || g.jsCtrl() < 0) { this->accept(); return; @@ -241,31 +266,20 @@ void joystickDialog::on_okButton_clicked() return; } - int stickAssignments[MAX_JOYSTICKS] = {0}; - for (int i = 0; i < MAX_JOYSTICKS; ++i) { - stick = sticks[i]->currentIndex() - 1; - if (stick >= 0 && stick < MAX_JOYSTICKS && ++stickAssignments[stick] > 1) { - QMessageBox::critical(this, tr("Error"), tr("Duplicated stick assignment!")); - return; + stick = sticks[i]->currentData().toInt(); + if (stick < 0) { + g.joystick[i].stick_axe(-1); + } + else { + g.joystick[i].stick_axe(stick); + g.joystick[i].stick_max(jscal[i][2]); + g.joystick[i].stick_med(jscal[i][1]); + g.joystick[i].stick_min(jscal[i][0]); + g.joystick[i].stick_inv(invert[i]->isChecked() ); + qDebug() << "joystick mapping " << sticks[i]->objectName() << "stick:" << i << "axe:" << stick; } } - joystick->close(); - - for (int i = 0; i < MAX_JOYSTICKS; ++i) - g.joystick[i].remove(); - - for (int i = 0; i < MAX_JOYSTICKS; ++i) { - stick = sticks[i]->currentIndex() - 1; - qDebug() << "joystick mapping " << sticks[i]->objectName() << "axe:" << i << "stick:" << stick; - if (stick >= 0 && stick < MAX_JOYSTICKS) { - g.joystick[stick].stick_axe( i ); - g.joystick[stick].stick_max( jscal[i][2] ); - g.joystick[stick].stick_med( jscal[i][1] ); - g.joystick[stick].stick_min( jscal[i][0] ); - g.joystick[stick].stick_inv( invert[i]->isChecked() ); - } - } this->accept(); } diff --git a/companion/src/simulation/joystickdialog.h b/companion/src/simulation/joystickdialog.h index 8c6fb5555..cdb85593a 100644 --- a/companion/src/simulation/joystickdialog.h +++ b/companion/src/simulation/joystickdialog.h @@ -53,7 +53,8 @@ class joystickDialog : public QDialog bool started; private slots: - void loadJoysticks(int stick = -1); + void populateSourceCombo(QComboBox * cb); + bool loadJoysticks(int stick = -1); void joystickOpen(int stick); void joystickSetEnabled(bool enable); void onjoystickAxisValueChanged(int axis, int value); diff --git a/companion/src/simulation/joystickdialog.ui b/companion/src/simulation/joystickdialog.ui index d52c6ceb5..eb2be2965 100644 --- a/companion/src/simulation/joystickdialog.ui +++ b/companion/src/simulation/joystickdialog.ui @@ -6,8 +6,8 @@ 0 0 - 473 - 335 + 554 + 351 @@ -90,51 +90,6 @@ 1 - - - Not Assigned - - - - - Right Vertical - - - - - Right Horizontal - - - - - Left Vertical - - - - - Left Horizontal - - - - - P1 - - - - - P2 - - - - - P3/LS - - - - - RS - - @@ -155,51 +110,6 @@ 2 - - - Not Assigned - - - - - Right Vertical - - - - - Right Horizontal - - - - - Left Vertical - - - - - Left Horizontal - - - - - P1 - - - - - P2 - - - - - P3/LS - - - - - RS - - @@ -241,51 +151,6 @@ 0 - - - Not Assigned - - - - - Right Vertical - - - - - Right Horizontal - - - - - Left Vertical - - - - - Left Horizontal - - - - - P1 - - - - - P2 - - - - - P3/LS - - - - - RS - - @@ -348,51 +213,6 @@ 4 - - - Not Assigned - - - - - Right Vertical - - - - - Right Horizontal - - - - - Left Vertical - - - - - Left Horizontal - - - - - P1 - - - - - P2 - - - - - P3/LS - - - - - RS - - @@ -434,51 +254,6 @@ 3 - - - Not Assigned - - - - - Right Vertical - - - - - Right Horizontal - - - - - Left Vertical - - - - - Left Horizontal - - - - - P1 - - - - - P2 - - - - - P3/LS - - - - - RS - - @@ -520,51 +295,6 @@ 5 - - - Not Assigned - - - - - Right Vertical - - - - - Right Horizontal - - - - - Left Vertical - - - - - Left Horizontal - - - - - P1 - - - - - P2 - - - - - P3/LS - - - - - RS - - @@ -620,51 +350,6 @@ 6 - - - Not Assigned - - - - - Right Vertical - - - - - Right Horizontal - - - - - Left Vertical - - - - - Left Horizontal - - - - - P1 - - - - - P2 - - - - - P3/LS - - - - - RS - - @@ -713,51 +398,6 @@ 7 - - - Not Assigned - - - - - Right Vertical - - - - - Right Horizontal - - - - - Left Vertical - - - - - Left Horizontal - - - - - P1 - - - - - P2 - - - - - P3/LS - - - - - RS - - diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index cdb23f3d9..0becb63e9 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -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 } diff --git a/companion/src/simulation/simulatorwidget.h b/companion/src/simulation/simulatorwidget.h index 78c5d311b..727200252 100644 --- a/companion/src/simulation/simulatorwidget.h +++ b/companion/src/simulation/simulatorwidget.h @@ -137,8 +137,6 @@ class SimulatorWidget : public QWidget #ifdef JOYSTICKS Joystick *joystick; - int jscal[8][4]; - int jsmap[8]; #endif private slots: