[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:
committed by
Bertrand Songis
parent
4f6931faab
commit
4faf323aed
@@ -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<QComboBox *>(QRegExp("jsmapCB_[0-9]+"))) {
|
||||
populateSourceCombo(cb);
|
||||
sticks[cb->property("channel").toUInt()] = cb;
|
||||
}
|
||||
foreach(QCheckBox *ib, findChildren<QCheckBox *>(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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user