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:
parent
4f6931faab
commit
4faf323aed
5 changed files with 111 additions and 464 deletions
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue