7434 lines
298 KiB
C++
7434 lines
298 KiB
C++
#include "modeledit.h"
|
|
#include "ui_modeledit.h"
|
|
#include "helpers.h"
|
|
#include "edge.h"
|
|
#include "node.h"
|
|
#include "expodialog.h"
|
|
#include "mixerdialog.h"
|
|
#include "simulatordialog.h"
|
|
#include "xsimulatordialog.h"
|
|
#include "modelconfigdialog.h"
|
|
#include <assert.h>
|
|
#include <QtGui>
|
|
#include <QApplication>
|
|
|
|
#define BC_BIT_RUD (0x01)
|
|
#define BC_BIT_ELE (0x02)
|
|
#define BC_BIT_THR (0x04)
|
|
#define BC_BIT_AIL (0x08)
|
|
#define BC_BIT_P1 (0x10)
|
|
#define BC_BIT_P2 (0x20)
|
|
#define BC_BIT_P3 (0x40)
|
|
#define BC_BIT_P4 (0x80)
|
|
#define BC_BIT_REA (0x80)
|
|
#define BC_BIT_REB (0x100)
|
|
|
|
#define RUD (1)
|
|
#define ELE (2)
|
|
#define THR (3)
|
|
#define AIL (4)
|
|
|
|
#define GFX_MARGIN 16
|
|
|
|
ModelEdit::ModelEdit(RadioData &radioData, uint8_t id, bool openWizard, bool isNew, QWidget *parent) :
|
|
QDialog(parent),
|
|
redrawCurve(true),
|
|
openWizard(openWizard),
|
|
isNew(isNew),
|
|
ui(new Ui::ModelEdit),
|
|
radioData(radioData),
|
|
id_model(id),
|
|
g_model(radioData.models[id]),
|
|
g_eeGeneral(radioData.generalSettings)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
setupMixerListWidget();
|
|
setupExposListWidget();
|
|
|
|
QSettings settings("companion9x", "companion9x");
|
|
ui->tabWidget->setCurrentIndex(settings.value("modelEditTab", 0).toInt());
|
|
|
|
QRegExp rx(CHAR_FOR_NAMES_REGEX);
|
|
ui->modelNameLE->setValidator(new QRegExpValidator(rx, this));
|
|
ui->phase0Name->setValidator(new QRegExpValidator(rx, this));
|
|
ui->phase1Name->setValidator(new QRegExpValidator(rx, this));
|
|
ui->phase2Name->setValidator(new QRegExpValidator(rx, this));
|
|
ui->phase3Name->setValidator(new QRegExpValidator(rx, this));
|
|
ui->phase4Name->setValidator(new QRegExpValidator(rx, this));
|
|
ui->phase5Name->setValidator(new QRegExpValidator(rx, this));
|
|
ui->phase6Name->setValidator(new QRegExpValidator(rx, this));
|
|
ui->phase7Name->setValidator(new QRegExpValidator(rx, this));
|
|
ui->phase8Name->setValidator(new QRegExpValidator(rx, this));
|
|
ui->cname_LE->setValidator(new QRegExpValidator(rx, this));
|
|
#ifdef PHONON
|
|
phononLock=false;
|
|
clickObject = new Phonon::MediaObject(this);
|
|
clickOutput = new Phonon::AudioOutput(Phonon::NoCategory, this);
|
|
Phonon::createPath(clickObject, clickOutput);
|
|
connect(clickObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(mediaPlayer_state(Phonon::State,Phonon::State)));
|
|
#endif
|
|
|
|
tabModelEditSetup();
|
|
tabPhases();
|
|
tabExpos();
|
|
tabMixes();
|
|
tabLimits();
|
|
tabCurves();
|
|
tabCustomSwitches();
|
|
selectedSwitch=0;
|
|
int telTab=10;
|
|
int fswTab=9;
|
|
|
|
if (GetEepromInterface()->getCapability(FSSwitch)) {
|
|
ui->tabSafetySwitches->setDisabled(true);
|
|
ui->tabWidget->removeTab(8);
|
|
telTab--;
|
|
fswTab--;
|
|
} else {
|
|
tabSafetySwitches();
|
|
}
|
|
|
|
if (GetEepromInterface()->getCapability(CustomFunctions)==0 ) {
|
|
ui->tabCustomFunctions->setDisabled(true);
|
|
ui->tabWidget->removeTab(fswTab);
|
|
telTab--;
|
|
} else {
|
|
tabCustomFunctions();
|
|
selectedFunction=0;
|
|
}
|
|
tabTemplates();
|
|
tabHeli();
|
|
if (GetEepromInterface()->getCapability(Telemetry) & TM_HASTELEMETRY) {
|
|
tabTelemetry();
|
|
} else {
|
|
ui->tabTelemetry->setDisabled(true);
|
|
ui->tabWidget->removeTab(telTab);
|
|
}
|
|
ui->tabWidget->setCurrentIndex(0);
|
|
ui->curvePreview->setMinimumWidth(240);
|
|
ui->curvePreview->setMinimumHeight(240);
|
|
resizeEvent();
|
|
QTimer::singleShot(0, this, SLOT(shrink()));
|
|
if (openWizard) {
|
|
QTimer::singleShot(1, this, SLOT(wizard()));
|
|
}
|
|
}
|
|
|
|
ModelEdit::~ModelEdit()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
|
|
float ModelEdit::getBarStep(int barId)
|
|
{
|
|
switch (barId-1) {
|
|
case TELEMETRY_SOURCE_TX_BATT:
|
|
return 0.1;
|
|
break;
|
|
case TELEMETRY_SOURCE_TIMER1:
|
|
case TELEMETRY_SOURCE_TIMER2:
|
|
return 3;
|
|
break;
|
|
case TELEMETRY_SOURCE_A1:
|
|
case TELEMETRY_SOURCE_A1_MIN:
|
|
return (ui->a1RatioSB->value()/255);
|
|
break;
|
|
case TELEMETRY_SOURCE_A2:
|
|
case TELEMETRY_SOURCE_A2_MIN:
|
|
return (ui->a2RatioSB->value()/255);
|
|
break;
|
|
case TELEMETRY_SOURCE_ALT:
|
|
case TELEMETRY_SOURCE_GPS_ALT:
|
|
case TELEMETRY_SOURCE_ALT_MAX:
|
|
case TELEMETRY_SOURCE_ALT_MIN:
|
|
return 8;
|
|
break;
|
|
case TELEMETRY_SOURCE_RPM:
|
|
case TELEMETRY_SOURCE_RPM_MAX:
|
|
return 50;
|
|
break;
|
|
case TELEMETRY_SOURCE_CELLS_SUM:
|
|
case TELEMETRY_SOURCE_VFAS:
|
|
return 0.1;
|
|
break;
|
|
case TELEMETRY_SOURCE_CELL:
|
|
return 0.02;
|
|
break;
|
|
case TELEMETRY_SOURCE_HDG:
|
|
return 2;
|
|
break;
|
|
case TELEMETRY_SOURCE_DIST:
|
|
case TELEMETRY_SOURCE_DIST_MAX:
|
|
return 8;
|
|
break;
|
|
case TELEMETRY_SOURCE_CURRENT_MAX:
|
|
case TELEMETRY_SOURCE_CURRENT:
|
|
return 0.5;
|
|
break;
|
|
case TELEMETRY_SOURCE_POWER:
|
|
return 5;
|
|
break;
|
|
case TELEMETRY_SOURCE_CONSUMPTION:
|
|
return 20;
|
|
break;
|
|
case TELEMETRY_SOURCE_SPEED:
|
|
case TELEMETRY_SOURCE_SPEED_MAX:
|
|
if (g_model.frsky.imperial==1) {
|
|
return 1;
|
|
} else {
|
|
return 1.852;
|
|
}
|
|
break;
|
|
default:
|
|
return 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ModelEdit::setupExposListWidget()
|
|
{
|
|
ExposlistWidget = new MixersList(this, true);
|
|
QPushButton * qbUp = new QPushButton(this);
|
|
QPushButton * qbDown = new QPushButton(this);
|
|
QPushButton * qbClear = new QPushButton(this);
|
|
|
|
qbUp->setText(tr("Move Up"));
|
|
qbUp->setIcon(QIcon(":/images/moveup.png"));
|
|
qbUp->setShortcut(QKeySequence(tr("Ctrl+Up")));
|
|
qbDown->setText(tr("Move Down"));
|
|
qbDown->setIcon(QIcon(":/images/movedown.png"));
|
|
qbDown->setShortcut(QKeySequence(tr("Ctrl+Down")));
|
|
qbClear->setText(tr("Clear Expo Settings"));
|
|
qbClear->setIcon(QIcon(":/images/clear.png"));
|
|
|
|
ui->exposLayout->addWidget(ExposlistWidget,1,1,1,3);
|
|
ui->exposLayout->addWidget(qbUp,2,1);
|
|
ui->exposLayout->addWidget(qbClear,2,2);
|
|
ui->exposLayout->addWidget(qbDown,2,3);
|
|
|
|
connect(ExposlistWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(expolistWidget_customContextMenuRequested(QPoint)));
|
|
connect(ExposlistWidget,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(expolistWidget_doubleClicked(QModelIndex)));
|
|
connect(ExposlistWidget,SIGNAL(mimeDropped(int,const QMimeData*,Qt::DropAction)),this,SLOT(mimeExpoDropped(int,const QMimeData*,Qt::DropAction)));
|
|
|
|
connect(qbUp,SIGNAL(pressed()),SLOT(moveExpoUp()));
|
|
connect(qbDown,SIGNAL(pressed()),SLOT(moveExpoDown()));
|
|
connect(qbClear,SIGNAL(pressed()),SLOT(clearExpos()));
|
|
|
|
connect(ExposlistWidget,SIGNAL(keyWasPressed(QKeyEvent*)), this, SLOT(expolistWidget_KeyPress(QKeyEvent*)));
|
|
}
|
|
|
|
void ModelEdit::setupMixerListWidget()
|
|
{
|
|
MixerlistWidget = new MixersList(this, false); // TODO enum
|
|
QPushButton * qbUp = new QPushButton(this);
|
|
QPushButton * qbDown = new QPushButton(this);
|
|
QPushButton * qbClear = new QPushButton(this);
|
|
|
|
qbUp->setText(tr("Move Up"));
|
|
qbUp->setIcon(QIcon(":/images/moveup.png"));
|
|
qbUp->setShortcut(QKeySequence(tr("Ctrl+Up")));
|
|
qbDown->setText(tr("Move Down"));
|
|
qbDown->setIcon(QIcon(":/images/movedown.png"));
|
|
qbDown->setShortcut(QKeySequence(tr("Ctrl+Down")));
|
|
qbClear->setText(tr("Clear Mixes"));
|
|
qbClear->setIcon(QIcon(":/images/clear.png"));
|
|
|
|
ui->mixersLayout->addWidget(MixerlistWidget,1,1,1,3);
|
|
ui->mixersLayout->addWidget(qbUp,2,1);
|
|
ui->mixersLayout->addWidget(qbClear,2,2);
|
|
ui->mixersLayout->addWidget(qbDown,2,3);
|
|
|
|
connect(MixerlistWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(mixerlistWidget_customContextMenuRequested(QPoint)));
|
|
connect(MixerlistWidget,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(mixerlistWidget_doubleClicked(QModelIndex)));
|
|
connect(MixerlistWidget,SIGNAL(mimeDropped(int,const QMimeData*,Qt::DropAction)),this,SLOT(mimeMixerDropped(int,const QMimeData*,Qt::DropAction)));
|
|
|
|
connect(qbUp,SIGNAL(pressed()),SLOT(moveMixUp()));
|
|
connect(qbDown,SIGNAL(pressed()),SLOT(moveMixDown()));
|
|
connect(qbClear,SIGNAL(pressed()),SLOT(clearMixes()));
|
|
|
|
connect(MixerlistWidget,SIGNAL(keyWasPressed(QKeyEvent*)), this, SLOT(mixerlistWidget_KeyPress(QKeyEvent*)));
|
|
}
|
|
|
|
void ModelEdit::resizeEvent(QResizeEvent *event)
|
|
{
|
|
|
|
if(ui->curvePreview->scene())
|
|
{
|
|
QRect qr = ui->curvePreview->contentsRect();
|
|
ui->curvePreview->scene()->setSceneRect(GFX_MARGIN, GFX_MARGIN, qr.width()-GFX_MARGIN*2, qr.height()-GFX_MARGIN*2);
|
|
drawCurve();
|
|
}
|
|
|
|
QDialog::resizeEvent(event);
|
|
|
|
}
|
|
|
|
void ModelEdit::applyBaseTemplate()
|
|
{
|
|
clearMixes(false);
|
|
applyTemplate(0);
|
|
updateSettings();
|
|
tabMixes();
|
|
}
|
|
|
|
void ModelEdit::updateSettings()
|
|
{
|
|
radioData.models[id_model] = g_model;
|
|
emit modelValuesChanged();
|
|
}
|
|
|
|
void ModelEdit::on_tabWidget_currentChanged(int index)
|
|
{
|
|
QSettings settings("companion9x", "companion9x");
|
|
settings.setValue("modelEditTab",index);//ui->tabWidget->currentIndex());
|
|
resizeEvent();
|
|
}
|
|
|
|
void ModelEdit::fssldValueChanged()
|
|
{
|
|
if (fsLock)
|
|
return;
|
|
fsLock=true;
|
|
QSpinBox * fssb1[] = { ui->fsm1SB_1, ui->fsm1SB_2,ui->fsm1SB_3,ui->fsm1SB_4,ui->fsm1SB_5,ui->fsm1SB_6,ui->fsm1SB_7,ui->fsm1SB_8,
|
|
ui->fsm1SB_9, ui->fsm1SB_10,ui->fsm1SB_11,ui->fsm1SB_12,ui->fsm1SB_13,ui->fsm1SB_14,ui->fsm1SB_15,ui->fsm1SB_16, NULL };
|
|
QSpinBox * fssb2[] = { ui->fsm2SB_1, ui->fsm2SB_2,ui->fsm2SB_3,ui->fsm2SB_4,ui->fsm2SB_5,ui->fsm2SB_6,ui->fsm2SB_7,ui->fsm2SB_8,
|
|
ui->fsm2SB_9, ui->fsm2SB_10,ui->fsm2SB_11,ui->fsm2SB_12,ui->fsm2SB_13,ui->fsm2SB_14,ui->fsm2SB_15,ui->fsm2SB_16, NULL };
|
|
QSlider *sl = qobject_cast<QSlider*>(sender());
|
|
int fsId=sl->objectName().mid(sl->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
int moduleid=sl->objectName().mid(3,1).toInt();
|
|
if (moduleid==1) {
|
|
fssb1[fsId]->setValue(sl->value());
|
|
} else {
|
|
fssb2[fsId]->setValue(sl->value());
|
|
}
|
|
fsLock=false;
|
|
}
|
|
|
|
void ModelEdit::fssbValueChanged()
|
|
{
|
|
if (fsLock)
|
|
return;
|
|
fsLock=true;
|
|
QSlider * fssld1[] = { ui->fsm1SL_1, ui->fsm1SL_2,ui->fsm1SL_3,ui->fsm1SL_4,ui->fsm1SL_5,ui->fsm1SL_6,ui->fsm1SL_7,ui->fsm1SL_8,
|
|
ui->fsm1SL_9, ui->fsm1SL_10,ui->fsm1SL_11,ui->fsm1SL_12,ui->fsm1SL_13,ui->fsm1SL_14,ui->fsm1SL_15,ui->fsm1SL_16, NULL };
|
|
QSlider * fssld2[] = { ui->fsm2SL_1, ui->fsm2SL_2,ui->fsm2SL_3,ui->fsm2SL_4,ui->fsm2SL_5,ui->fsm2SL_6,ui->fsm2SL_7,ui->fsm2SL_8,
|
|
ui->fsm2SL_9, ui->fsm2SL_10,ui->fsm2SL_11,ui->fsm2SL_12,ui->fsm2SL_13,ui->fsm2SL_14,ui->fsm2SL_15,ui->fsm2SL_16, NULL };
|
|
QSpinBox *sb = qobject_cast<QSpinBox*>(sender());
|
|
int fsId=sb->objectName().mid(sb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
int moduleid=sb->objectName().mid(3,1).toInt();
|
|
if (moduleid==1) {
|
|
fssld1[fsId]->setValue(sb->value());
|
|
} else {
|
|
fssld2[fsId]->setValue(sb->value());
|
|
}
|
|
fsLock=false;
|
|
}
|
|
|
|
void ModelEdit::fssldEdited()
|
|
{
|
|
QSlider *sl = qobject_cast<QSlider*>(sender());
|
|
int fsId=sl->objectName().mid(sl->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
int moduleid=sl->objectName().mid(3,1).toInt();
|
|
if (moduleid==1) {
|
|
g_model.moduleData[0].failsafeChannels[fsId]=sl->value();
|
|
} else {
|
|
g_model.moduleData[1].failsafeChannels[fsId]=sl->value();
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::fssbEdited()
|
|
{
|
|
QSpinBox *sb = qobject_cast<QSpinBox*>(sender());
|
|
int fsId=sb->objectName().mid(sb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
int moduleid=sb->objectName().mid(3,1).toInt();
|
|
if (moduleid==1) {
|
|
g_model.moduleData[0].failsafeChannels[fsId]=sb->value();
|
|
} else {
|
|
g_model.moduleData[1].failsafeChannels[fsId]=sb->value();
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::tabModelEditSetup()
|
|
{
|
|
//name
|
|
QLabel * pmsl[] = {ui->swwarn_label, ui->swwarn0_label, ui->swwarn4_label, NULL};
|
|
QCheckBox * pmchkb[] = {ui->swwarn1_ChkB,ui->swwarn2_ChkB,ui->swwarn3_ChkB,ui->swwarn5_ChkB,ui->swwarn6_ChkB, NULL};
|
|
QSlider * tpmsld[] = {ui->chkSA, ui->chkSB, ui->chkSC, ui->chkSD, ui->chkSE, ui->chkSF, ui->chkSG, NULL};
|
|
QSlider * fssld1[] = { ui->fsm1SL_1, ui->fsm1SL_2,ui->fsm1SL_3,ui->fsm1SL_4,ui->fsm1SL_5,ui->fsm1SL_6,ui->fsm1SL_7,ui->fsm1SL_8,
|
|
ui->fsm1SL_9, ui->fsm1SL_10,ui->fsm1SL_11,ui->fsm1SL_12,ui->fsm1SL_13,ui->fsm1SL_14,ui->fsm1SL_15,ui->fsm1SL_16, NULL };
|
|
QSlider * fssld2[] = { ui->fsm2SL_1, ui->fsm2SL_2,ui->fsm2SL_3,ui->fsm2SL_4,ui->fsm2SL_5,ui->fsm2SL_6,ui->fsm2SL_7,ui->fsm2SL_8,
|
|
ui->fsm2SL_9, ui->fsm2SL_10,ui->fsm2SL_11,ui->fsm2SL_12,ui->fsm2SL_13,ui->fsm2SL_14,ui->fsm2SL_15,ui->fsm2SL_16, NULL };
|
|
QSpinBox * fssb1[] = { ui->fsm1SB_1, ui->fsm1SB_2,ui->fsm1SB_3,ui->fsm1SB_4,ui->fsm1SB_5,ui->fsm1SB_6,ui->fsm1SB_7,ui->fsm1SB_8,
|
|
ui->fsm1SB_9, ui->fsm1SB_10,ui->fsm1SB_11,ui->fsm1SB_12,ui->fsm1SB_13,ui->fsm1SB_14,ui->fsm1SB_15,ui->fsm1SB_16, NULL };
|
|
QSpinBox * fssb2[] = { ui->fsm2SB_1, ui->fsm2SB_2,ui->fsm2SB_3,ui->fsm2SB_4,ui->fsm2SB_5,ui->fsm2SB_6,ui->fsm2SB_7,ui->fsm2SB_8,
|
|
ui->fsm2SB_9, ui->fsm2SB_10,ui->fsm2SB_11,ui->fsm2SB_12,ui->fsm2SB_13,ui->fsm2SB_14,ui->fsm2SB_15,ui->fsm2SB_16, NULL };
|
|
if (IS_TARANIS(GetEepromInterface()->getBoard())) {
|
|
ui->modelNameLE->setMaxLength(12);
|
|
} else {
|
|
ui->modelNameLE->setMaxLength(10);
|
|
}
|
|
ui->modelNameLE->setText(g_model.name);
|
|
fsLock=true;
|
|
if (GetEepromInterface()->getCapability(NumModules)<2) {
|
|
ui->rf2_GB->hide();
|
|
}
|
|
|
|
if (!GetEepromInterface()->getCapability(HasFailsafe)) {
|
|
ui->FSGB_1 ->hide();
|
|
ui->FSGB_2->hide();
|
|
ui->ModelSetupTab->setTabEnabled(1,0);
|
|
} else {
|
|
if (GetEepromInterface()->getCapability(HasFailsafe)<32) {
|
|
ui->FSGB_2->hide();
|
|
}
|
|
|
|
for (int i=0; fssld1[i]; i++) {
|
|
fssld1[i]->setValue(g_model.moduleData[0].failsafeChannels[i]);
|
|
fssld2[i]->setValue(g_model.moduleData[1].failsafeChannels[i]);
|
|
fssb1[i]->setValue(g_model.moduleData[0].failsafeChannels[i]);
|
|
fssb2[i]->setValue(g_model.moduleData[1].failsafeChannels[i]);
|
|
connect(fssld1[i],SIGNAL(valueChanged(int)),this,SLOT(fssldValueChanged()));
|
|
connect(fssld2[i],SIGNAL(valueChanged(int)),this,SLOT(fssldValueChanged()));
|
|
connect(fssb1[i],SIGNAL(valueChanged(int)),this,SLOT(fssbValueChanged()));
|
|
connect(fssb2[i],SIGNAL(valueChanged(int)),this,SLOT(fssbValueChanged()));
|
|
connect(fssld1[i],SIGNAL(sliderReleased()),this,SLOT(fssldEdited()));
|
|
connect(fssld2[i],SIGNAL(sliderReleased()),this,SLOT(fssldEdited()));
|
|
connect(fssb1[i],SIGNAL(editingFinished()),this,SLOT(fssbEdited()));
|
|
connect(fssb2[i],SIGNAL(editingFinished()),this,SLOT(fssbEdited()));
|
|
}
|
|
}
|
|
fsLock=false;
|
|
//timer1 mode direction value
|
|
populateTimerSwitchCB(ui->timer1ModeCB,g_model.timers[0].mode,GetEepromInterface()->getCapability(TimerTriggerB));
|
|
int min = g_model.timers[0].val/60;
|
|
int sec = g_model.timers[0].val%60;
|
|
ui->timer1ValTE->setTime(QTime(0,min,sec));
|
|
ui->timer1DirCB->setCurrentIndex(g_model.timers[0].dir);
|
|
if (!GetEepromInterface()->getCapability(ModelVoice)) {
|
|
ui->modelVoice_SB->hide();
|
|
ui->modelVoice_label->hide();
|
|
} else {
|
|
ui->modelVoice_SB->setValue(g_model.modelVoice+260);
|
|
}
|
|
if (!GetEepromInterface()->getCapability(PerModelThrottleInvert)) {
|
|
ui->label_thrrev->hide();
|
|
ui->thrrevChkB->hide();
|
|
} else {
|
|
ui->thrrevChkB->setChecked(g_model.throttleReversed);
|
|
}
|
|
if (!GetEepromInterface()->getCapability(ModelImage)) {
|
|
ui->modelImage_CB->hide();
|
|
ui->modelImage_label->hide();
|
|
ui->modelImage_image->hide();
|
|
} else {
|
|
modelImageLock=true;
|
|
QStringList items;
|
|
items.append("");
|
|
QSettings settings("companion9x", "companion9x");
|
|
QString path=settings.value("sdPath", ".").toString();
|
|
path.append("/BMP/");
|
|
QDir qd(path);
|
|
int vml= GetEepromInterface()->getCapability(VoicesMaxLength)+4;
|
|
if (qd.exists()) {
|
|
QStringList filters;
|
|
filters << "*.bmp" << "*.bmp";
|
|
foreach ( QString file, qd.entryList(filters, QDir::Files) ) {
|
|
QFileInfo fi(file);
|
|
QString temp=fi.completeBaseName();
|
|
if (!items.contains(temp) && temp.length()<=vml) {
|
|
items.append(temp);
|
|
}
|
|
}
|
|
}
|
|
if (!items.contains(g_model.bitmap)) {
|
|
items.append(g_model.bitmap);
|
|
}
|
|
items.sort();
|
|
ui->modelImage_CB->clear();
|
|
foreach ( QString file, items ) {
|
|
ui->modelImage_CB->addItem(file);
|
|
if (file==g_model.bitmap) {
|
|
ui->modelImage_CB->setCurrentIndex(ui->modelImage_CB->count()-1);
|
|
QString fileName=path;
|
|
fileName.append(g_model.bitmap);
|
|
fileName.append(".bmp");
|
|
QImage image(fileName);
|
|
if (image.isNull()) {
|
|
fileName=path;
|
|
fileName.append(g_model.bitmap);
|
|
fileName.append(".BMP");
|
|
image.load(fileName);
|
|
}
|
|
if (!image.isNull()) {
|
|
ui->modelImage_image->setPixmap(QPixmap::fromImage(image.scaled( 64,32)));;
|
|
}
|
|
}
|
|
}
|
|
modelImageLock=false;
|
|
}
|
|
|
|
if (!GetEepromInterface()->getCapability(pmSwitchMask)) {
|
|
for (int i=0; pmsl[i]; i++) {
|
|
pmsl[i]->hide();
|
|
}
|
|
for (int i=0; pmchkb[i]; i++) {
|
|
pmchkb[i]->hide();
|
|
}
|
|
ui->tswwarn0_CB->hide();
|
|
for (int i=0; tpmsld[i]; i++) {
|
|
tpmsld[i]->hide();
|
|
}
|
|
ui->swwarn0_line->hide();
|
|
ui->swwarn0_line->hide();
|
|
ui->swwarn0_CB->hide();
|
|
ui->swwarn4_CB->hide();
|
|
ui->swwarn_line0->hide();
|
|
ui->swwarn_line1->hide();
|
|
ui->swwarn_line2->hide();
|
|
ui->swwarn_line3->hide();
|
|
ui->swwarn_line4->hide();
|
|
ui->swwarn_line5->hide();
|
|
ui->tswwarn0_label->hide();
|
|
ui->tswwarn1_label->hide();
|
|
ui->tswwarn2_label->hide();
|
|
ui->tswwarn3_label->hide();
|
|
ui->tswwarn4_label->hide();
|
|
ui->tswwarn5_label->hide();
|
|
ui->tswwarn6_label->hide();
|
|
ui->tswwarn7_label->hide();
|
|
} else {
|
|
if (GetEepromInterface()->getCapability(Pots)==3) {
|
|
ui->swwarn0_CB->setCurrentIndex(g_model.switchWarningStates & 0x01);
|
|
ui->swwarn1_ChkB->setChecked(checkbit(g_model.switchWarningStates, 1));
|
|
ui->swwarn2_ChkB->setChecked(checkbit(g_model.switchWarningStates, 2));
|
|
ui->swwarn3_ChkB->setChecked(checkbit(g_model.switchWarningStates, 3));
|
|
ui->swwarn4_CB->setCurrentIndex((g_model.switchWarningStates & 0x30)>>4);
|
|
ui->swwarn5_ChkB->setChecked(checkbit(g_model.switchWarningStates, 6));
|
|
ui->swwarn6_ChkB->setChecked(checkbit(g_model.switchWarningStates, 7));
|
|
for (int i=0; pmchkb[i]; i++) {
|
|
connect(pmchkb[i], SIGNAL(stateChanged(int)),this,SLOT(startupSwitchEdited()));
|
|
}
|
|
connect(ui->swwarn0_CB,SIGNAL(currentIndexChanged(int)),this,SLOT(startupSwitchEdited()));
|
|
connect(ui->swwarn4_CB,SIGNAL(currentIndexChanged(int)),this,SLOT(startupSwitchEdited()));
|
|
} else {
|
|
ui->tswwarn0_CB->setCurrentIndex(g_model.switchWarningStates & 0x01);
|
|
uint16_t switchstate=(g_model.switchWarningStates>>1);
|
|
ui->chkSA->setValue(switchstate & 0x3);
|
|
switchstate >>= 2;
|
|
ui->chkSB->setValue(switchstate & 0x3);
|
|
switchstate >>= 2;
|
|
ui->chkSC->setValue(switchstate & 0x3);
|
|
switchstate >>= 2;
|
|
ui->chkSD->setValue(switchstate & 0x3);
|
|
switchstate >>= 2;
|
|
ui->chkSE->setValue(switchstate & 0x3);
|
|
switchstate >>= 2;
|
|
ui->chkSF->setValue((switchstate & 0x3)/2);
|
|
switchstate >>= 2;
|
|
ui->chkSG->setValue(switchstate & 0x3);
|
|
connect(ui->tswwarn0_CB,SIGNAL(currentIndexChanged(int)),this,SLOT(startupSwitchEdited()));
|
|
for (int i=0; tpmsld[i]; i++) {
|
|
connect(tpmsld[i], SIGNAL(valueChanged(int)),this,SLOT(startupSwitchEdited()));
|
|
}
|
|
}
|
|
}
|
|
int ppmmax=GetEepromInterface()->getCapability(PPMFrameLength);
|
|
if (ppmmax>0) {
|
|
ui->ppmFrameLengthDSB->setMaximum(ppmmax);
|
|
}
|
|
if (!GetEepromInterface()->getCapability(InstantTrimSW)) {
|
|
ui->instantTrim_label->hide();
|
|
ui->instantTrim_CB->setDisabled(true);
|
|
ui->instantTrim_CB->hide();
|
|
} else {
|
|
switchEditLock=true;
|
|
int found=false;
|
|
for (int i=0; i< C9X_MAX_CUSTOM_FUNCTIONS; i++) {
|
|
if (g_model.funcSw[i].func==FuncInstantTrim) {
|
|
populateSwitchCB(ui->instantTrim_CB,g_model.funcSw[i].swtch,POPULATE_MSWITCHES & POPULATE_ONOFF);
|
|
found=true;
|
|
break;
|
|
}
|
|
}
|
|
if (found==false) {
|
|
populateSwitchCB(ui->instantTrim_CB,RawSwitch(),POPULATE_MSWITCHES & POPULATE_ONOFF);
|
|
}
|
|
switchEditLock=false;
|
|
}
|
|
if (GetEepromInterface()->getCapability(NoTimerDirs)) {
|
|
ui->timer1DirCB->hide();
|
|
ui->timer2DirCB->hide();
|
|
}
|
|
if (GetEepromInterface()->getCapability(NoThrExpo)) {
|
|
ui->label_thrExpo->hide();
|
|
ui->thrExpoChkB->hide();
|
|
}
|
|
if (!(GetEepromInterface()->getCapability(ExtendedTrims)>0)) {
|
|
ui->extendedTrimsChkB->hide();
|
|
ui->extendedTrims_label->hide();
|
|
}
|
|
if (!GetEepromInterface()->getCapability(HasTTrace)) {
|
|
ui->label_ttrace->hide();
|
|
ui->ttraceCB->hide();
|
|
} else {
|
|
populateTTraceCB(ui->ttraceCB,g_model.thrTraceSrc);
|
|
}
|
|
if (GetEepromInterface()->getCapability(RotaryEncoders)==0) {
|
|
ui->bcREaChkB->hide();
|
|
ui->bcREbChkB->hide();
|
|
}
|
|
if (GetEepromInterface()->getCapability(Pots)==3) {
|
|
ui->tswwarn0_CB->hide();
|
|
ui->tswwarn0_label->hide();
|
|
ui->tswwarn1_label->hide();
|
|
ui->tswwarn2_label->hide();
|
|
ui->tswwarn3_label->hide();
|
|
ui->tswwarn4_label->hide();
|
|
ui->tswwarn5_label->hide();
|
|
ui->tswwarn6_label->hide();
|
|
ui->tswwarn7_label->hide();
|
|
ui->chkSA->hide();
|
|
ui->chkSB->hide();
|
|
ui->chkSC->hide();
|
|
ui->chkSD->hide();
|
|
ui->chkSE->hide();
|
|
ui->chkSF->hide();
|
|
ui->chkSG->hide();
|
|
this->layout()->removeItem(ui->TaranisSwitchStartup);
|
|
ui->bcP4ChkB->hide();
|
|
} else {
|
|
ui->swwarn0_CB->hide();
|
|
ui->swwarn0_label->hide();
|
|
ui->swwarn0_line->hide();
|
|
ui->swwarn1_ChkB->hide();
|
|
ui->swwarn1_line->hide();
|
|
ui->swwarn2_ChkB->hide();
|
|
ui->swwarn3_ChkB->hide();
|
|
ui->swwarn4_CB->hide();
|
|
ui->swwarn4_label->hide();
|
|
ui->swwarn5_ChkB->hide();
|
|
ui->swwarn6_ChkB->hide();
|
|
ui->swwarn_line0->hide();
|
|
ui->swwarn_line1->hide();
|
|
ui->swwarn_line2->hide();
|
|
ui->swwarn_line3->hide();
|
|
ui->swwarn_line4->hide();
|
|
ui->swwarn_line5->hide();
|
|
this->layout()->removeItem(ui->StockSwitchStartup);
|
|
ui->bcP1ChkB->setText(tr("S1"));
|
|
ui->bcP2ChkB->setText(tr("S2"));
|
|
ui->bcP3ChkB->setText(tr("LS"));
|
|
}
|
|
|
|
if (!GetEepromInterface()->getCapability(PerModelThrottleWarning)) {
|
|
ui->thrwarnChkB->setDisabled(true);
|
|
ui->thrwarnChkB->hide();
|
|
ui->thrwarnLabel->hide();
|
|
} else {
|
|
switchEditLock=true;
|
|
ui->thrwarnChkB->setChecked(g_model.disableThrottleWarning);
|
|
switchEditLock=false;
|
|
}
|
|
if (!GetEepromInterface()->getCapability(TimerTriggerB)) {
|
|
ui->timer1ModeBCB->hide();
|
|
ui->timer1ModeB_label->hide();
|
|
ui->timer2ModeBCB->hide();
|
|
ui->timer2ModeB_label->hide();
|
|
} else {
|
|
populateTimerSwitchBCB(ui->timer1ModeBCB,g_model.timers[0].modeB,GetEepromInterface()->getCapability(TimerTriggerB));
|
|
populateTimerSwitchBCB(ui->timer2ModeBCB,g_model.timers[1].modeB,GetEepromInterface()->getCapability(TimerTriggerB));
|
|
}
|
|
|
|
int index=0;
|
|
int selindex;
|
|
int selindex2;
|
|
protocolEditLock=true;
|
|
protocol2EditLock=true;
|
|
ui->protocolCB->clear();
|
|
for (int i=0; i<PROTO_LAST; i++) {
|
|
if (GetEepromInterface()->isAvailable((Protocol)i)) {
|
|
ui->protocolCB->addItem(getProtocolStr(i), (QVariant)i);
|
|
if (g_model.moduleData[0].protocol == i) {
|
|
selindex = index;
|
|
}
|
|
index++;
|
|
}
|
|
}
|
|
if (GetEepromInterface()->getCapability(NumModules)>1) {
|
|
index=0;
|
|
ui->protocolCB_2->clear();
|
|
for (int i=0; i<PROTO_LAST; ++i) {
|
|
if (GetEepromInterface()->isAvailable((Protocol)i, 1)) {
|
|
ui->protocolCB_2->addItem(getProtocolStr(i), (QVariant)i);
|
|
if (g_model.moduleData[1].protocol == i) {
|
|
selindex2 = index;
|
|
}
|
|
index++;
|
|
}
|
|
}
|
|
}
|
|
if (GetEepromInterface()->getCapability(ModelTrainerEnable)) {
|
|
trainerEditLock=true;
|
|
if (!(g_model.trainerMode||g_model.traineron)) {
|
|
ui->protocolCB_3->setCurrentIndex(0);
|
|
ui->label_PPM_3->hide();
|
|
ui->ppmDelaySB_3->hide();
|
|
ui->label_PPMCH_3->hide();
|
|
ui->label_pulsePol_3->hide();
|
|
ui->pulsePolCB_3->hide();
|
|
ui->numChannelsSB_3->hide();
|
|
ui->label_ppmFrameLength_3->hide();
|
|
ui->ppmFrameLengthDSB_3->hide();
|
|
ui->label_numChannelsStart_3->hide();
|
|
ui->numChannelsStart_3->hide();
|
|
} else {
|
|
ui->protocolCB_3->setCurrentIndex(1);
|
|
ui->label_PPM_3->show();
|
|
ui->ppmDelaySB_3->show();
|
|
ui->label_PPMCH_3->show();
|
|
ui->label_pulsePol_3->show();
|
|
ui->pulsePolCB_3->show();
|
|
ui->numChannelsSB_3->show();
|
|
ui->label_ppmFrameLength_3->show();
|
|
ui->ppmFrameLengthDSB_3->show();
|
|
ui->label_numChannelsStart_3->show();
|
|
ui->numChannelsStart_3->show();
|
|
}
|
|
trainerEditLock=false;
|
|
on_protocolCB_3_currentIndexChanged(g_model.traineron||g_model.trainerMode);
|
|
} else {
|
|
ui->rf3_GB->hide();
|
|
}
|
|
|
|
ui->label_PPM->hide();
|
|
ui->ppmDelaySB->hide();
|
|
ui->label_PPMCH->hide();
|
|
ui->label_pulsePol->hide();
|
|
ui->pulsePolCB->hide();
|
|
ui->numChannelsSB->hide();
|
|
ui->label_ppmFrameLength->hide();
|
|
ui->ppmFrameLengthDSB->hide();
|
|
ui->label_DSM->hide();
|
|
ui->DSM_Type->hide();
|
|
ui->label_PXX->hide();
|
|
ui->pxxRxNum->hide();
|
|
ui->label_numChannelsStart->hide();
|
|
ui->numChannelsStart->hide();
|
|
ui->pxxRxNum->setEnabled(false);
|
|
ui->protocolCB->setCurrentIndex(selindex);
|
|
protocolEditLock=false;
|
|
on_protocolCB_currentIndexChanged(selindex);
|
|
if (GetEepromInterface()->getCapability(NumModules)>1) {
|
|
ui->label_PPM_2->hide();
|
|
ui->ppmDelaySB_2->hide();
|
|
ui->label_PPMCH_2->hide();
|
|
ui->label_pulsePol_2->hide();
|
|
ui->pulsePolCB_2->hide();
|
|
ui->numChannelsSB_2->hide();
|
|
ui->label_ppmFrameLength_2->hide();
|
|
ui->ppmFrameLengthDSB_2->hide();
|
|
ui->label_DSM_2->hide();
|
|
ui->DSM_Type_2->hide();
|
|
ui->label_PXX_2->hide();
|
|
ui->pxxRxNum_2->hide();
|
|
ui->label_numChannelsStart_2->hide();
|
|
ui->numChannelsStart_2->hide();
|
|
ui->pxxRxNum_2->setEnabled(false);
|
|
ui->protocolCB_2->setCurrentIndex(selindex2);
|
|
protocol2EditLock=false;
|
|
on_protocolCB_2_currentIndexChanged(selindex2);
|
|
}
|
|
|
|
//timer2 mode direction value
|
|
if (GetEepromInterface()->getCapability(Timers)<2) {
|
|
ui->timer2DirCB->hide();
|
|
ui->timer2ValTE->hide();
|
|
ui->timer2DirCB->hide();
|
|
ui->timer2ModeCB->hide();
|
|
ui->timer2ModeBCB->hide();
|
|
ui->timer2ModeB_label->hide();
|
|
ui->label_timer2->hide();
|
|
} else {
|
|
populateTimerSwitchCB(ui->timer2ModeCB,g_model.timers[1].mode,GetEepromInterface()->getCapability(TimerTriggerB));
|
|
min = g_model.timers[1].val/60;
|
|
sec = g_model.timers[1].val%60;
|
|
ui->timer2ValTE->setTime(QTime(0,min,sec));
|
|
ui->timer2DirCB->setCurrentIndex(g_model.timers[1].dir);
|
|
}
|
|
if (!GetEepromInterface()->getCapability(PermTimers)) {
|
|
ui->timer1Perm->hide();
|
|
ui->timer2Perm->hide();
|
|
ui->timer1PermValue->hide();
|
|
ui->timer2PermValue->hide();
|
|
} else {
|
|
int sign=1;
|
|
int pvalue=g_model.timers[0].pvalue;
|
|
if (pvalue<0) {
|
|
pvalue=-pvalue;
|
|
sign=-1;
|
|
}
|
|
int hours=pvalue/3600;
|
|
pvalue-=hours*3600;
|
|
int minutes = pvalue/60;
|
|
int seconds = pvalue%60;
|
|
ui->timer1PermValue->setText(QString(" %1(%2:%3:%4)").arg(sign<0 ? "-" :" ").arg(hours,2,10,QLatin1Char('0')).arg(minutes,2,10,QLatin1Char('0')).arg(seconds,2,10,QLatin1Char('0')));
|
|
// QString QString::arg ( int a, int fieldWidth = 0, int base = 10, const QChar & fillChar = QLatin1Char( ' ' ) ) const
|
|
sign=1;
|
|
pvalue=g_model.timers[1].pvalue;
|
|
if (pvalue<0) {
|
|
pvalue=-pvalue;
|
|
sign=-1;
|
|
}
|
|
hours=pvalue/3600;
|
|
pvalue-=hours*3600;
|
|
minutes = pvalue/60;
|
|
seconds = pvalue%60;
|
|
ui->timer2PermValue->setText(QString(" %1(%2:%3:%4)").arg(sign<0 ? "-" :" ").arg(hours,2,10,QLatin1Char('0')).arg(minutes,2,10,QLatin1Char('0')).arg(seconds,2,10,QLatin1Char('0')));
|
|
ui->timer1Perm->setChecked(g_model.timers[0].persistent);
|
|
ui->timer2Perm->setChecked(g_model.timers[1].persistent);
|
|
}
|
|
if (!GetEepromInterface()->getCapability(minuteBeep)) {
|
|
ui->timer1Minute->hide();
|
|
ui->timer2Minute->hide();
|
|
} else {
|
|
ui->timer1Minute->setChecked(g_model.timers[0].minuteBeep);
|
|
ui->timer2Minute->setChecked(g_model.timers[1].minuteBeep);
|
|
}
|
|
|
|
if (!GetEepromInterface()->getCapability(countdownBeep)) {
|
|
ui->timer1CountDownBeep->hide();
|
|
ui->timer2CountDownBeep->hide();
|
|
} else {
|
|
ui->timer1CountDownBeep->setChecked(g_model.timers[0].countdownBeep);
|
|
ui->timer2CountDownBeep->setChecked(g_model.timers[1].countdownBeep);
|
|
}
|
|
|
|
//trim inc, thro trim, thro expo, instatrim
|
|
ui->trimIncCB->setCurrentIndex(g_model.trimInc);
|
|
ui->thrExpoChkB->setChecked(g_model.thrExpo);
|
|
ui->thrTrimChkB->setChecked(g_model.thrTrim);
|
|
|
|
//center beep
|
|
ui->bcRUDChkB->setChecked(g_model.beepANACenter & BC_BIT_RUD);
|
|
ui->bcELEChkB->setChecked(g_model.beepANACenter & BC_BIT_ELE);
|
|
ui->bcTHRChkB->setChecked(g_model.beepANACenter & BC_BIT_THR);
|
|
ui->bcAILChkB->setChecked(g_model.beepANACenter & BC_BIT_AIL);
|
|
ui->bcP1ChkB->setChecked(g_model.beepANACenter & BC_BIT_P1);
|
|
ui->bcP2ChkB->setChecked(g_model.beepANACenter & BC_BIT_P2);
|
|
ui->bcP3ChkB->setChecked(g_model.beepANACenter & BC_BIT_P3);
|
|
ui->bcP4ChkB->setChecked(g_model.beepANACenter & BC_BIT_P4);
|
|
ui->bcREaChkB->setChecked(g_model.beepANACenter & BC_BIT_REA);
|
|
ui->bcREbChkB->setChecked(g_model.beepANACenter & BC_BIT_REB);
|
|
|
|
// PPM settings fields
|
|
ui->ppmDelaySB->setEnabled(g_model.moduleData[0].protocol == PPM);
|
|
ui->pulsePolCB->setCurrentIndex(g_model.moduleData[0].ppmPulsePol);
|
|
ui->ppmDelaySB->setEnabled(g_model.moduleData[0].protocol == PPM);
|
|
ui->ppmDelaySB->setValue(g_model.moduleData[0].ppmDelay);
|
|
// TODO? ui->numChannelsSB->setEnabled(g_model.moduleData[0].protocol == PPM);
|
|
|
|
ui->extendedLimitsChkB->setChecked(g_model.extendedLimits);
|
|
ui->T2ThrTrgChkB->setChecked(g_model.t2throttle);
|
|
if (!GetEepromInterface()->getCapability(Timer2ThrTrig)) {
|
|
ui->T2ThrTrg->hide();
|
|
ui->T2ThrTrgChkB->hide();
|
|
}
|
|
ui->ppmFrameLengthDSB->setValue(22.5+((double)g_model.moduleData[0].ppmFrameLength)*0.5);
|
|
if (!GetEepromInterface()->getCapability(PPMExtCtrl)) {
|
|
ui->ppmFrameLengthDSB->hide();
|
|
ui->label_ppmFrameLength->hide();
|
|
}
|
|
switch (g_model.moduleData[0].protocol) {
|
|
case PXX_DJT:
|
|
case PXX_XJT_X16:
|
|
case PXX_XJT_D8:
|
|
case PXX_XJT_LR12:
|
|
ui->pxxRxNum->setMinimum(0);
|
|
ui->pxxRxNum->setValue((g_model.modelId));
|
|
break;
|
|
case DSM2:
|
|
if (!GetEepromInterface()->getCapability(DSM2Indexes)) {
|
|
ui->pxxRxNum->setValue(1);
|
|
}
|
|
else {
|
|
ui->pxxRxNum->setMinimum(0);
|
|
ui->pxxRxNum->setValue((g_model.modelId));
|
|
}
|
|
ui->numChannelsSB->setValue(8);
|
|
break;
|
|
default:
|
|
ui->label_DSM->hide();
|
|
ui->DSM_Type->hide();
|
|
ui->DSM_Type->setEnabled(false);
|
|
ui->label_PXX->hide();
|
|
ui->pxxRxNum->hide();
|
|
ui->pxxRxNum->setEnabled(false);
|
|
ui->numChannelsSB->setValue(g_model.moduleData[0].channelsCount);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ModelEdit::on_modelVoice_SB_editingFinished()
|
|
{
|
|
g_model.modelVoice=ui->modelVoice_SB->value()-260;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer1Perm_toggled(bool checked)
|
|
{
|
|
g_model.timers[0].persistent=checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer2Perm_toggled(bool checked)
|
|
{
|
|
g_model.timers[1].persistent=checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer1Minute_toggled(bool checked)
|
|
{
|
|
g_model.timers[0].minuteBeep=checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer2Minute_toggled(bool checked)
|
|
{
|
|
g_model.timers[1].minuteBeep=checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer1CountDownBeep_toggled(bool checked)
|
|
{
|
|
g_model.timers[0].countdownBeep=checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer2CountDownBeep_toggled(bool checked)
|
|
{
|
|
g_model.timers[1].countdownBeep=checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::displayOnePhaseOneTrim(unsigned int phase_idx, unsigned int chn, QComboBox *trimUse, QSpinBox *trimVal, QSlider *trimSlider)
|
|
{
|
|
PhaseData *phase = &g_model.phaseData[phase_idx];
|
|
int trim = phase->trim[chn];
|
|
if (trimUse) populateTrimUseCB(trimUse, phase_idx);
|
|
if (phase->trimRef[chn] >= 0) {
|
|
if (trimUse) trimUse->setCurrentIndex(1 + phase->trimRef[chn] - (phase->trimRef[chn] >= (int)phase_idx ? 1 : 0));
|
|
trim = g_model.phaseData[g_model.getTrimFlightPhase(chn, phase_idx)].trim[chn];
|
|
trimVal->setEnabled(false);
|
|
trimSlider->setEnabled(false);
|
|
} else {
|
|
trimVal->setEnabled(true);
|
|
trimSlider->setEnabled(true);
|
|
if (trimUse) trimUse->setCurrentIndex(0);
|
|
}
|
|
int trimsMax = GetEepromInterface()->getCapability(ExtendedTrims);
|
|
if (trimsMax == 0 || !g_model.extendedTrims) {
|
|
trimsMax = 125;
|
|
}
|
|
/*else if (trimsMax == 500)
|
|
trimSlider->setTickInterval(50);*/
|
|
trimSlider->setRange(-trimsMax, +trimsMax);
|
|
trimVal->setRange(-trimsMax, +trimsMax);
|
|
trimVal->setValue(trim);
|
|
trimSlider->setValue(trim);
|
|
if (chn == 2 && g_eeGeneral.throttleReversed)
|
|
trimSlider->setInvertedAppearance(true);
|
|
}
|
|
|
|
void ModelEdit::displayOnePhase(unsigned int phase_idx, QLineEdit *name, QComboBox *sw, QDoubleSpinBox *fadeIn, QDoubleSpinBox *fadeOut,
|
|
QComboBox *trim1Use, QSpinBox *trim1, QLabel *trim1Label, QSlider *trim1Slider,
|
|
QComboBox *trim2Use, QSpinBox *trim2, QLabel *trim2Label, QSlider *trim2Slider,
|
|
QComboBox *trim3Use, QSpinBox *trim3, QLabel *trim3Label, QSlider *trim3Slider,
|
|
QComboBox *trim4Use, QSpinBox *trim4, QLabel *trim4Label, QSlider *trim4Slider,
|
|
QLabel *gv1Label, QComboBox *gv1Use,QSpinBox *gv1Value,
|
|
QLabel *gv2Label, QComboBox *gv2Use,QSpinBox *gv2Value,
|
|
QLabel *gv3Label, QComboBox *gv3Use,QSpinBox *gv3Value,
|
|
QLabel *gv4Label, QComboBox *gv4Use,QSpinBox *gv4Value,
|
|
QLabel *gv5Label, QComboBox *gv5Use,QSpinBox *gv5Value,
|
|
QLabel *re1Label, QComboBox *re1Use,QSpinBox *re1Value,
|
|
QLabel *re2Label, QComboBox *re2Use,QSpinBox *re2Value,bool doConnect=false)
|
|
{
|
|
phasesLock=true;
|
|
PhaseData *phase = &g_model.phaseData[phase_idx];
|
|
if (IS_TARANIS(GetEepromInterface()->getBoard())) {
|
|
if (name) name->setMaxLength(10);
|
|
} else {
|
|
if (name) name->setMaxLength(6);
|
|
}
|
|
|
|
if (name) name->setText(phase->name);
|
|
if (sw) populateSwitchCB(sw, phase->swtch);
|
|
|
|
int scale=GetEepromInterface()->getCapability(SlowScale);
|
|
float range=GetEepromInterface()->getCapability(SlowRange);
|
|
int fades=GetEepromInterface()->getCapability(FlightPhasesHaveFades);
|
|
if (fades && fadeIn) {
|
|
fadeIn->setEnabled(true);
|
|
fadeOut->setEnabled(true);
|
|
fadeIn->setMaximum(range/scale);
|
|
fadeIn->setSingleStep(1.0/scale);
|
|
fadeIn->setDecimals((scale==1 ? 0 :1) );
|
|
if (fadeIn) {
|
|
fadeIn->setValue((double)phase->fadeIn/scale);
|
|
}
|
|
fadeOut->setMaximum(range/scale);
|
|
fadeOut->setSingleStep(1.0/scale);
|
|
fadeOut->setDecimals((scale==1 ? 0 :1));
|
|
if (fadeOut) {
|
|
fadeOut->setValue((double)phase->fadeOut/scale);
|
|
}
|
|
} else if ( fadeIn ) {
|
|
fadeIn->setDisabled(true);
|
|
fadeOut->setDisabled(true);
|
|
}
|
|
displayOnePhaseOneTrim(phase_idx, CONVERT_MODE(1)-1, trim1Use, trim1, trim1Slider);
|
|
displayOnePhaseOneTrim(phase_idx, CONVERT_MODE(2)-1, trim2Use, trim2, trim2Slider);
|
|
displayOnePhaseOneTrim(phase_idx, CONVERT_MODE(3)-1, trim3Use, trim3, trim3Slider);
|
|
displayOnePhaseOneTrim(phase_idx, CONVERT_MODE(4)-1, trim4Use, trim4, trim4Slider);
|
|
|
|
if (gv1Use) {
|
|
populateGvarUseCB(gv1Use, phase_idx);
|
|
if (phase->gvars[0]>1024) {
|
|
gv1Use->setCurrentIndex(phase->gvars[0]-1024);
|
|
}
|
|
}
|
|
gv1Value->setMinimum(-1024);
|
|
gv1Value->setMaximum(1024);
|
|
if (phase->gvars[0]<1024) {
|
|
gv1Value->setValue(phase->gvars[0]);
|
|
gv1Value->setEnabled(true);
|
|
} else {
|
|
uint index=phase->gvars[0]-1025;
|
|
if (index>=phase_idx) {
|
|
index++;
|
|
}
|
|
PhaseData *phasegvar = &g_model.phaseData[index];
|
|
gv1Value->setValue(phasegvar->gvars[0]);
|
|
gv1Value->setDisabled(true);
|
|
}
|
|
if (gv2Use) {
|
|
populateGvarUseCB(gv2Use, phase_idx);
|
|
if (phase->gvars[1]>1024) {
|
|
gv2Use->setCurrentIndex(phase->gvars[1]-1024);
|
|
}
|
|
}
|
|
gv2Value->setMinimum(-1024);
|
|
gv2Value->setMaximum(1024);
|
|
if (phase->gvars[1]<1024) {
|
|
gv2Value->setValue(phase->gvars[1]);
|
|
gv2Value->setEnabled(true);
|
|
} else {
|
|
uint index=phase->gvars[1]-1025;
|
|
if (index>=phase_idx) {
|
|
index++;
|
|
}
|
|
PhaseData *phasegvar = &g_model.phaseData[index];
|
|
gv2Value->setValue(phasegvar->gvars[1]);
|
|
gv2Value->setDisabled(true);
|
|
}
|
|
if (gv3Use) {
|
|
populateGvarUseCB(gv3Use, phase_idx);
|
|
if (phase->gvars[2]>1024) {
|
|
gv3Use->setCurrentIndex(phase->gvars[2]-1024);
|
|
}
|
|
}
|
|
gv3Value->setMinimum(-1024);
|
|
gv3Value->setMaximum(1024);
|
|
if (phase->gvars[2]<1024) {
|
|
gv3Value->setValue(phase->gvars[2]);
|
|
gv3Value->setEnabled(true);
|
|
} else {
|
|
uint index=phase->gvars[2]-1025;
|
|
if (index>=phase_idx) {
|
|
index++;
|
|
}
|
|
PhaseData *phasegvar = &g_model.phaseData[index];
|
|
gv3Value->setValue(phasegvar->gvars[2]);
|
|
gv3Value->setDisabled(true);
|
|
}
|
|
if (gv4Use) {
|
|
populateGvarUseCB(gv4Use, phase_idx);
|
|
if (phase->gvars[3]>1024) {
|
|
gv4Use->setCurrentIndex(phase->gvars[3]-1024);
|
|
}
|
|
}
|
|
gv4Value->setMinimum(-1024);
|
|
gv4Value->setMaximum(1024);
|
|
if (phase->gvars[3]<1024) {
|
|
gv4Value->setValue(phase->gvars[3]);
|
|
gv4Value->setEnabled(true);
|
|
} else {
|
|
uint index=phase->gvars[3]-1025;
|
|
if (index>=phase_idx) {
|
|
index++;
|
|
}
|
|
PhaseData *phasegvar = &g_model.phaseData[index];
|
|
gv4Value->setValue(phasegvar->gvars[3]);
|
|
gv4Value->setDisabled(true);
|
|
}
|
|
if (gv5Use) {
|
|
populateGvarUseCB(gv5Use, phase_idx);
|
|
if (phase->gvars[4]>1024) {
|
|
gv5Use->setCurrentIndex(phase->gvars[4]-1024);
|
|
}
|
|
}
|
|
gv5Value->setMinimum(-1024);
|
|
gv5Value->setMaximum(1024);
|
|
if (phase->gvars[4]<1024) {
|
|
gv5Value->setValue(phase->gvars[4]);
|
|
gv5Value->setEnabled(true);
|
|
} else {
|
|
uint index=phase->gvars[4]-1025;
|
|
if (index>=phase_idx) {
|
|
index++;
|
|
}
|
|
PhaseData *phasegvar = &g_model.phaseData[index];
|
|
gv5Value->setValue(phasegvar->gvars[4]);
|
|
gv5Value->setDisabled(true);
|
|
}
|
|
if (re1Value) {
|
|
re1Value->setMinimum(-1024);
|
|
re1Value->setMaximum(1024);
|
|
}
|
|
if (re2Value) {
|
|
re2Value->setMinimum(-1024);
|
|
re2Value->setMaximum(1024);
|
|
}
|
|
if (re1Use) {
|
|
populateGvarUseCB(re1Use, phase_idx);
|
|
if (phase->rotaryEncoders[0]>1024) {
|
|
re1Use->setCurrentIndex(phase->rotaryEncoders[0]-1024);
|
|
}
|
|
}
|
|
if (phase->rotaryEncoders[0]<1024) {
|
|
re1Value->setValue(phase->rotaryEncoders[0]);
|
|
re1Value->setEnabled(true);
|
|
} else {
|
|
uint index=phase->rotaryEncoders[0]-1025;
|
|
if (index>=phase_idx) {
|
|
index++;
|
|
}
|
|
PhaseData *phasegvar = &g_model.phaseData[index];
|
|
re1Value->setValue(phasegvar->rotaryEncoders[0]);
|
|
re1Value->setDisabled(true);
|
|
}
|
|
if (re2Use) {
|
|
populateGvarUseCB(re2Use, phase_idx);
|
|
if (phase->rotaryEncoders[0]>1024) {
|
|
re1Use->setCurrentIndex(phase->rotaryEncoders[0]-1024);
|
|
}
|
|
}
|
|
if (phase->rotaryEncoders[1]<1024) {
|
|
re2Value->setValue(phase->rotaryEncoders[1]);
|
|
re2Value->setEnabled(true);
|
|
} else {
|
|
uint index=phase->rotaryEncoders[1]-1025;
|
|
if (index>=phase_idx) {
|
|
index++;
|
|
}
|
|
PhaseData *phasegvar = &g_model.phaseData[index];
|
|
re2Value->setValue(phasegvar->rotaryEncoders[1]);
|
|
re2Value->setDisabled(true);
|
|
}
|
|
if (GetEepromInterface()->getCapability(RotaryEncoders)<2) {
|
|
if (re2Label)
|
|
re2Label->hide();
|
|
if (re2Use)
|
|
re2Use->hide();
|
|
re2Value->hide();
|
|
}
|
|
if (GetEepromInterface()->getCapability(RotaryEncoders)<1) {
|
|
if (re1Label)
|
|
re1Label->hide();
|
|
if (re1Use)
|
|
re1Use->hide();
|
|
re1Value->hide();
|
|
}
|
|
QString labels[] = { tr("Rud"), tr("Ele"), tr("Thr"), tr("Ail") };
|
|
if (trim1Label) {
|
|
trim1Label->setText(labels[CONVERT_MODE(1)-1]);
|
|
trim2Label->setText(labels[CONVERT_MODE(2)-1]);
|
|
trim3Label->setText(labels[CONVERT_MODE(3)-1]);
|
|
trim4Label->setText(labels[CONVERT_MODE(4)-1]);
|
|
}
|
|
// the connects
|
|
if (doConnect) {
|
|
connect(name, SIGNAL(editingFinished()), this, SLOT(phaseName_editingFinished()));
|
|
if (sw!=NULL) {
|
|
connect(sw,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseSwitch_currentIndexChanged()));
|
|
connect(trim1Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseTrimUse_currentIndexChanged()));
|
|
connect(trim2Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseTrimUse_currentIndexChanged()));
|
|
connect(trim3Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseTrimUse_currentIndexChanged()));
|
|
connect(trim4Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseTrimUse_currentIndexChanged()));
|
|
}
|
|
if (gv1Use) connect(gv1Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseGVUse_currentIndexChanged()));
|
|
if (gv2Use) connect(gv2Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseGVUse_currentIndexChanged()));
|
|
if (gv3Use) connect(gv3Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseGVUse_currentIndexChanged()));
|
|
if (gv4Use) connect(gv4Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseGVUse_currentIndexChanged()));
|
|
if (gv5Use) connect(gv5Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseGVUse_currentIndexChanged()));
|
|
if (re1Use) connect(re1Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseREUse_currentIndexChanged()));
|
|
if (re2Use) connect(re2Use,SIGNAL(currentIndexChanged(int)),this,SLOT(phaseREUse_currentIndexChanged()));
|
|
connect(gv1Value,SIGNAL(editingFinished()),this,SLOT(phaseGVValue_editingFinished()));
|
|
connect(gv2Value,SIGNAL(editingFinished()),this,SLOT(phaseGVValue_editingFinished()));
|
|
connect(gv3Value,SIGNAL(editingFinished()),this,SLOT(phaseGVValue_editingFinished()));
|
|
connect(gv4Value,SIGNAL(editingFinished()),this,SLOT(phaseGVValue_editingFinished()));
|
|
connect(gv5Value,SIGNAL(editingFinished()),this,SLOT(phaseGVValue_editingFinished()));
|
|
connect(re1Value,SIGNAL(editingFinished()),this,SLOT(phaseREValue_editingFinished()));
|
|
connect(re2Value,SIGNAL(editingFinished()),this,SLOT(phaseREValue_editingFinished()));
|
|
|
|
connect(fadeIn,SIGNAL(editingFinished()),this,SLOT(phaseFadeIn_editingFinished()));
|
|
connect(fadeOut,SIGNAL(editingFinished()),this,SLOT(phaseFadeOut_editingFinished()));
|
|
connect(trim1,SIGNAL(valueChanged(int)),this,SLOT(phaseTrim_valueChanged()));
|
|
connect(trim2,SIGNAL(valueChanged(int)),this,SLOT(phaseTrim_valueChanged()));
|
|
connect(trim3,SIGNAL(valueChanged(int)),this,SLOT(phaseTrim_valueChanged()));
|
|
connect(trim4,SIGNAL(valueChanged(int)),this,SLOT(phaseTrim_valueChanged()));
|
|
connect(trim1Slider,SIGNAL(valueChanged(int)),this,SLOT(phaseTrimSlider_valueChanged()));
|
|
connect(trim2Slider,SIGNAL(valueChanged(int)),this,SLOT(phaseTrimSlider_valueChanged()));
|
|
connect(trim3Slider,SIGNAL(valueChanged(int)),this,SLOT(phaseTrimSlider_valueChanged()));
|
|
connect(trim4Slider,SIGNAL(valueChanged(int)),this,SLOT(phaseTrimSlider_valueChanged()));
|
|
phasesLock=false;
|
|
}
|
|
}
|
|
|
|
void ModelEdit::tabPhases()
|
|
{
|
|
QSpinBox * tmp[9][5]={
|
|
{ui->phase0GV1Value,ui->phase0GV2Value,ui->phase0GV3Value,ui->phase0GV4Value,ui->phase0GV5Value} ,
|
|
{ui->phase1GV1Value,ui->phase1GV2Value,ui->phase1GV3Value,ui->phase1GV4Value,ui->phase1GV5Value} ,
|
|
{ui->phase2GV1Value,ui->phase2GV2Value,ui->phase2GV3Value,ui->phase2GV4Value,ui->phase2GV5Value} ,
|
|
{ui->phase3GV1Value,ui->phase3GV2Value,ui->phase3GV3Value,ui->phase3GV4Value,ui->phase3GV5Value} ,
|
|
{ui->phase4GV1Value,ui->phase4GV2Value,ui->phase4GV3Value,ui->phase4GV4Value,ui->phase4GV5Value} ,
|
|
{ui->phase5GV1Value,ui->phase5GV2Value,ui->phase5GV3Value,ui->phase5GV4Value,ui->phase5GV5Value} ,
|
|
{ui->phase6GV1Value,ui->phase6GV2Value,ui->phase6GV3Value,ui->phase6GV4Value,ui->phase6GV5Value} ,
|
|
{ui->phase7GV1Value,ui->phase7GV2Value,ui->phase7GV3Value,ui->phase7GV4Value,ui->phase7GV5Value} ,
|
|
{ui->phase8GV1Value,ui->phase8GV2Value,ui->phase8GV3Value,ui->phase8GV4Value,ui->phase8GV5Value}
|
|
};
|
|
|
|
QSpinBox * tmp2[9][2]={
|
|
{ui->phase0RE1Value,ui->phase0RE2Value} ,
|
|
{ui->phase1RE1Value,ui->phase1RE2Value} ,
|
|
{ui->phase2RE1Value,ui->phase2RE2Value} ,
|
|
{ui->phase3RE1Value,ui->phase3RE2Value} ,
|
|
{ui->phase4RE1Value,ui->phase4RE2Value} ,
|
|
{ui->phase5RE1Value,ui->phase5RE2Value} ,
|
|
{ui->phase6RE1Value,ui->phase6RE2Value} ,
|
|
{ui->phase7RE1Value,ui->phase7RE2Value} ,
|
|
{ui->phase8RE1Value,ui->phase8RE2Value} ,
|
|
};
|
|
|
|
memcpy(gvarsSB, tmp, sizeof(gvarsSB));
|
|
memcpy(reSB, tmp2, sizeof(reSB));
|
|
|
|
phasesLock = true;
|
|
int gvars=0;
|
|
if (GetEepromInterface()->getCapability(HasVariants)) {
|
|
if (GetCurrentFirmwareVariant() & GVARS_VARIANT)
|
|
gvars=1;
|
|
} else {
|
|
gvars=GetEepromInterface()->getCapability(Gvars);
|
|
}
|
|
if (!GetEepromInterface()->getCapability(RotaryEncoders)) {
|
|
ui->phase0reGB->hide();
|
|
ui->phase1reGB->hide();
|
|
ui->phase2reGB->hide();
|
|
ui->phase3reGB->hide();
|
|
ui->phase4reGB->hide();
|
|
ui->phase5reGB->hide();
|
|
ui->phase6reGB->hide();
|
|
ui->phase7reGB->hide();
|
|
ui->phase8reGB->hide();
|
|
}
|
|
if (!GetEepromInterface()->getCapability(GvarsFlightPhases) || gvars==0) {
|
|
if (!GetEepromInterface()->getCapability(Gvars) || gvars==0) {
|
|
ui->phase0gvGB->hide();
|
|
}
|
|
ui->phase1gvGB->hide();
|
|
ui->phase2gvGB->hide();
|
|
ui->phase3gvGB->hide();
|
|
ui->phase4gvGB->hide();
|
|
ui->phase5gvGB->hide();
|
|
ui->phase6gvGB->hide();
|
|
ui->phase7gvGB->hide();
|
|
ui->phase8gvGB->hide();
|
|
}
|
|
|
|
if (!GetEepromInterface()->getCapability(GvarsAreNamed)) {
|
|
ui->phase0GV1Name->hide();
|
|
ui->phase0GV2Name->hide();
|
|
ui->phase0GV3Name->hide();
|
|
ui->phase0GV4Name->hide();
|
|
ui->phase0GV5Name->hide();
|
|
ui->phase0GV6Name->hide();
|
|
ui->phase0GV7Name->hide();
|
|
}
|
|
|
|
if (GetEepromInterface()->getCapability(Gvars) && gvars==1) {
|
|
if (!GetEepromInterface()->getCapability(GvarsHaveSources)) {
|
|
ui->phase0GV1Source->hide();
|
|
ui->phase0GV2Source->hide();
|
|
ui->phase0GV3Source->hide();
|
|
ui->phase0GV4Source->hide();
|
|
ui->phase0GV5Source->hide();
|
|
ui->phase0GV6Source->hide();
|
|
ui->phase0GV7Source->hide();
|
|
} else {
|
|
populateGvSourceCB(ui->phase0GV1Source, g_model.gvsource[0]);
|
|
populateGvSourceCB(ui->phase0GV2Source, g_model.gvsource[1]);
|
|
populateGvSourceCB(ui->phase0GV3Source, g_model.gvsource[2]);
|
|
populateGvSourceCB(ui->phase0GV4Source, g_model.gvsource[3]);
|
|
populateGvSourceCB(ui->phase0GV5Source, g_model.gvsource[4]);
|
|
connect(ui->phase0GV1Source,SIGNAL(currentIndexChanged(int)),this,SLOT(GVSource_currentIndexChanged()));
|
|
connect(ui->phase0GV2Source,SIGNAL(currentIndexChanged(int)),this,SLOT(GVSource_currentIndexChanged()));
|
|
connect(ui->phase0GV3Source,SIGNAL(currentIndexChanged(int)),this,SLOT(GVSource_currentIndexChanged()));
|
|
connect(ui->phase0GV4Source,SIGNAL(currentIndexChanged(int)),this,SLOT(GVSource_currentIndexChanged()));
|
|
connect(ui->phase0GV5Source,SIGNAL(currentIndexChanged(int)),this,SLOT(GVSource_currentIndexChanged()));
|
|
}
|
|
if (IS_TARANIS(GetEepromInterface()->getBoard())) {
|
|
ui->phase0GV1Name->setMaxLength(10);
|
|
ui->phase0GV2Name->setMaxLength(10);
|
|
ui->phase0GV3Name->setMaxLength(10);
|
|
ui->phase0GV4Name->setMaxLength(10);
|
|
ui->phase0GV5Name->setMaxLength(10);
|
|
} else {
|
|
ui->phase0GV1Name->setMaxLength(6);
|
|
ui->phase0GV2Name->setMaxLength(6);
|
|
ui->phase0GV3Name->setMaxLength(6);
|
|
ui->phase0GV4Name->setMaxLength(6);
|
|
ui->phase0GV5Name->setMaxLength(6);
|
|
}
|
|
|
|
ui->phase0GV1Name->setText(g_model.gvars_names[0]);
|
|
ui->phase0GV2Name->setText(g_model.gvars_names[1]);
|
|
ui->phase0GV3Name->setText(g_model.gvars_names[2]);
|
|
ui->phase0GV4Name->setText(g_model.gvars_names[3]);
|
|
ui->phase0GV5Name->setText(g_model.gvars_names[4]);
|
|
connect(ui->phase0GV1Name,SIGNAL(editingFinished()),this,SLOT(GVName_editingFinished()));
|
|
connect(ui->phase0GV2Name,SIGNAL(editingFinished()),this,SLOT(GVName_editingFinished()));
|
|
connect(ui->phase0GV3Name,SIGNAL(editingFinished()),this,SLOT(GVName_editingFinished()));
|
|
connect(ui->phase0GV4Name,SIGNAL(editingFinished()),this,SLOT(GVName_editingFinished()));
|
|
connect(ui->phase0GV5Name,SIGNAL(editingFinished()),this,SLOT(GVName_editingFinished()));
|
|
}
|
|
if (gvars) {
|
|
if (GetEepromInterface()->getCapability(GvarsNum)<7) {
|
|
ui->phase0GV6Name->hide();
|
|
ui->phase0GV7Name->hide();
|
|
ui->phase0GV6Source->hide();
|
|
ui->phase0GV7Source->hide();
|
|
ui->phase0GV6Value->hide();
|
|
ui->phase0GV7Value->hide();
|
|
ui->phase0GV6_Label->hide();
|
|
ui->phase0GV7_Label->hide();
|
|
} else {
|
|
populateGvSourceCB(ui->phase0GV6Source, g_model.gvsource[5]);
|
|
populateGvSourceCB(ui->phase0GV7Source, g_model.gvsource[6]);
|
|
connect(ui->phase0GV6Source,SIGNAL(currentIndexChanged(int)),this,SLOT(GVSource_currentIndexChanged()));
|
|
connect(ui->phase0GV7Source,SIGNAL(currentIndexChanged(int)),this,SLOT(GVSource_currentIndexChanged()));
|
|
ui->phase0GV6Name->setText(g_model.gvars_names[5]);
|
|
ui->phase0GV7Name->setText(g_model.gvars_names[6]);
|
|
connect(ui->phase0GV6Name,SIGNAL(editingFinished()),this,SLOT(GVName_editingFinished()));
|
|
connect(ui->phase0GV7Name,SIGNAL(editingFinished()),this,SLOT(GVName_editingFinished()));
|
|
ui->phase0GV6Value->setValue(g_model.phaseData[0].gvars[5]);
|
|
ui->phase0GV7Value->setValue(g_model.phaseData[0].gvars[6]);
|
|
connect(ui->phase0GV6Value,SIGNAL(editingFinished()),this,SLOT(phaseGVValue_editingFinished()));
|
|
connect(ui->phase0GV7Value,SIGNAL(editingFinished()),this,SLOT(phaseGVValue_editingFinished()));
|
|
}
|
|
}
|
|
|
|
displayOnePhase(0, ui->phase0Name, NULL, ui->phase0FadeIn, ui->phase0FadeOut, NULL, ui->phase0Trim1Value, ui->phase0Trim1Label, ui->phase0Trim1Slider, NULL, ui->phase0Trim2Value, ui->phase0Trim2Label, ui->phase0Trim2Slider, NULL, ui->phase0Trim3Value, ui->phase0Trim3Label, ui->phase0Trim3Slider, NULL, ui->phase0Trim4Value, ui->phase0Trim4Label, ui->phase0Trim4Slider, ui->phase0GV1_Label, NULL , ui->phase0GV1Value, ui->phase0GV2_Label, NULL , ui->phase0GV2Value, ui->phase0GV3_Label, NULL , ui->phase0GV3Value, ui->phase0GV4_Label, NULL , ui->phase0GV4Value, ui->phase0GV5_Label, NULL , ui->phase0GV5Value,ui->phase0REA_Label,NULL, ui->phase0RE1Value,ui->phase0REB_Label, NULL, ui->phase0RE2Value, true);
|
|
displayOnePhase(1, ui->phase1Name, ui->phase1Switch, ui->phase1FadeIn, ui->phase1FadeOut, ui->phase1Trim1Use, ui->phase1Trim1Value, ui->phase1Trim1Label, ui->phase1Trim1Slider, ui->phase1Trim2Use, ui->phase1Trim2Value, ui->phase1Trim2Label, ui->phase1Trim2Slider, ui->phase1Trim3Use, ui->phase1Trim3Value, ui->phase1Trim3Label, ui->phase1Trim3Slider, ui->phase1Trim4Use, ui->phase1Trim4Value, ui->phase1Trim4Label, ui->phase1Trim4Slider, ui->phase1GV1_Label, ui->phase1GV1Use, ui->phase1GV1Value, ui->phase1GV2_Label, ui->phase1GV2Use, ui->phase1GV2Value, ui->phase1GV3_Label, ui->phase1GV3Use, ui->phase1GV3Value, ui->phase1GV4_Label, ui->phase1GV4Use, ui->phase1GV4Value, ui->phase1GV5_Label, ui->phase1GV5Use, ui->phase1GV5Value,ui->phase1REA_Label, ui->phase1RE1Use, ui->phase1RE1Value,ui->phase1REB_Label, ui->phase1RE2Use, ui->phase1RE2Value, true);
|
|
displayOnePhase(2, ui->phase2Name, ui->phase2Switch, ui->phase2FadeIn, ui->phase2FadeOut, ui->phase2Trim1Use, ui->phase2Trim1Value, ui->phase2Trim1Label, ui->phase2Trim1Slider, ui->phase2Trim2Use, ui->phase2Trim2Value, ui->phase2Trim2Label, ui->phase2Trim2Slider, ui->phase2Trim3Use, ui->phase2Trim3Value, ui->phase2Trim3Label, ui->phase2Trim3Slider, ui->phase2Trim4Use, ui->phase2Trim4Value, ui->phase2Trim4Label, ui->phase2Trim4Slider, ui->phase2GV1_Label, ui->phase2GV1Use, ui->phase2GV1Value, ui->phase2GV2_Label, ui->phase2GV2Use, ui->phase2GV2Value, ui->phase2GV3_Label, ui->phase2GV3Use, ui->phase2GV3Value, ui->phase2GV4_Label, ui->phase2GV4Use, ui->phase2GV4Value, ui->phase2GV5_Label, ui->phase2GV5Use, ui->phase2GV5Value,ui->phase2REA_Label, ui->phase2RE1Use, ui->phase2RE1Value,ui->phase2REB_Label, ui->phase2RE2Use, ui->phase2RE2Value, true);
|
|
displayOnePhase(3, ui->phase3Name, ui->phase3Switch, ui->phase3FadeIn, ui->phase3FadeOut, ui->phase3Trim1Use, ui->phase3Trim1Value, ui->phase3Trim1Label, ui->phase3Trim1Slider, ui->phase3Trim2Use, ui->phase3Trim2Value, ui->phase3Trim2Label, ui->phase3Trim2Slider, ui->phase3Trim3Use, ui->phase3Trim3Value, ui->phase3Trim3Label, ui->phase3Trim3Slider, ui->phase3Trim4Use, ui->phase3Trim4Value, ui->phase3Trim4Label, ui->phase3Trim4Slider, ui->phase3GV1_Label, ui->phase3GV1Use, ui->phase3GV1Value, ui->phase3GV2_Label, ui->phase3GV2Use, ui->phase3GV2Value, ui->phase3GV3_Label, ui->phase3GV3Use, ui->phase3GV3Value, ui->phase3GV4_Label, ui->phase3GV4Use, ui->phase3GV4Value, ui->phase3GV5_Label, ui->phase3GV5Use, ui->phase3GV5Value,ui->phase3REA_Label, ui->phase3RE1Use, ui->phase3RE1Value,ui->phase3REB_Label, ui->phase3RE2Use, ui->phase3RE2Value, true);
|
|
displayOnePhase(4, ui->phase4Name, ui->phase4Switch, ui->phase4FadeIn, ui->phase4FadeOut, ui->phase4Trim1Use, ui->phase4Trim1Value, ui->phase4Trim1Label, ui->phase4Trim1Slider, ui->phase4Trim2Use, ui->phase4Trim2Value, ui->phase4Trim2Label, ui->phase4Trim2Slider, ui->phase4Trim3Use, ui->phase4Trim3Value, ui->phase4Trim3Label, ui->phase4Trim3Slider, ui->phase4Trim4Use, ui->phase4Trim4Value, ui->phase4Trim4Label, ui->phase4Trim4Slider, ui->phase4GV1_Label, ui->phase4GV1Use, ui->phase4GV1Value, ui->phase4GV2_Label, ui->phase4GV2Use, ui->phase4GV2Value, ui->phase4GV3_Label, ui->phase4GV3Use, ui->phase4GV3Value, ui->phase4GV4_Label, ui->phase4GV4Use, ui->phase4GV4Value, ui->phase4GV5_Label, ui->phase4GV5Use, ui->phase4GV5Value,ui->phase4REA_Label, ui->phase4RE1Use, ui->phase4RE1Value,ui->phase4REB_Label, ui->phase4RE2Use, ui->phase4RE2Value, true);
|
|
displayOnePhase(5, ui->phase5Name, ui->phase5Switch, ui->phase5FadeIn, ui->phase5FadeOut, ui->phase5Trim1Use, ui->phase5Trim1Value, ui->phase5Trim1Label, ui->phase5Trim1Slider, ui->phase5Trim2Use, ui->phase5Trim2Value, ui->phase5Trim2Label, ui->phase5Trim2Slider, ui->phase5Trim3Use, ui->phase5Trim3Value, ui->phase5Trim3Label, ui->phase5Trim3Slider, ui->phase5Trim4Use, ui->phase5Trim4Value, ui->phase5Trim4Label, ui->phase5Trim4Slider, ui->phase5GV1_Label, ui->phase5GV1Use, ui->phase5GV1Value, ui->phase5GV2_Label, ui->phase5GV2Use, ui->phase5GV2Value, ui->phase5GV3_Label, ui->phase5GV3Use, ui->phase5GV3Value, ui->phase5GV4_Label, ui->phase5GV4Use, ui->phase5GV4Value, ui->phase5GV5_Label, ui->phase5GV5Use, ui->phase5GV5Value,ui->phase5REA_Label, ui->phase5RE1Use, ui->phase5RE1Value,ui->phase5REB_Label, ui->phase5RE2Use, ui->phase5RE2Value, true);
|
|
displayOnePhase(6, ui->phase6Name, ui->phase6Switch, ui->phase6FadeIn, ui->phase6FadeOut, ui->phase6Trim1Use, ui->phase6Trim1Value, ui->phase6Trim1Label, ui->phase6Trim1Slider, ui->phase6Trim2Use, ui->phase6Trim2Value, ui->phase6Trim2Label, ui->phase6Trim2Slider, ui->phase6Trim3Use, ui->phase6Trim3Value, ui->phase6Trim3Label, ui->phase6Trim3Slider, ui->phase6Trim4Use, ui->phase6Trim4Value, ui->phase6Trim4Label, ui->phase6Trim4Slider, ui->phase6GV1_Label, ui->phase6GV1Use, ui->phase6GV1Value, ui->phase6GV2_Label, ui->phase6GV2Use, ui->phase6GV2Value, ui->phase6GV3_Label, ui->phase6GV3Use, ui->phase6GV3Value, ui->phase6GV4_Label, ui->phase6GV4Use, ui->phase6GV4Value, ui->phase6GV5_Label, ui->phase6GV5Use, ui->phase6GV5Value,ui->phase6REA_Label, ui->phase6RE1Use, ui->phase6RE1Value,ui->phase6REB_Label, ui->phase6RE2Use, ui->phase6RE2Value, true);
|
|
displayOnePhase(7, ui->phase7Name, ui->phase7Switch, ui->phase7FadeIn, ui->phase7FadeOut, ui->phase7Trim1Use, ui->phase7Trim1Value, ui->phase7Trim1Label, ui->phase7Trim1Slider, ui->phase7Trim2Use, ui->phase7Trim2Value, ui->phase7Trim2Label, ui->phase7Trim2Slider, ui->phase7Trim3Use, ui->phase7Trim3Value, ui->phase7Trim3Label, ui->phase7Trim3Slider, ui->phase7Trim4Use, ui->phase7Trim4Value, ui->phase7Trim4Label, ui->phase7Trim4Slider, ui->phase7GV1_Label, ui->phase7GV1Use, ui->phase7GV1Value, ui->phase7GV2_Label, ui->phase7GV2Use, ui->phase7GV2Value, ui->phase7GV3_Label, ui->phase7GV3Use, ui->phase7GV3Value, ui->phase7GV4_Label, ui->phase7GV4Use, ui->phase7GV4Value, ui->phase7GV5_Label, ui->phase7GV5Use, ui->phase7GV5Value,ui->phase7REA_Label, ui->phase7RE1Use, ui->phase7RE1Value,ui->phase7REB_Label, ui->phase7RE2Use, ui->phase7RE2Value, true);
|
|
displayOnePhase(8, ui->phase8Name, ui->phase8Switch, ui->phase8FadeIn, ui->phase8FadeOut, ui->phase8Trim1Use, ui->phase8Trim1Value, ui->phase8Trim1Label, ui->phase8Trim1Slider, ui->phase8Trim2Use, ui->phase8Trim2Value, ui->phase8Trim2Label, ui->phase8Trim2Slider, ui->phase8Trim3Use, ui->phase8Trim3Value, ui->phase8Trim3Label, ui->phase8Trim3Slider, ui->phase8Trim4Use, ui->phase8Trim4Value, ui->phase8Trim4Label, ui->phase8Trim4Slider, ui->phase8GV1_Label, ui->phase8GV1Use, ui->phase8GV1Value, ui->phase8GV2_Label, ui->phase8GV2Use, ui->phase8GV2Value, ui->phase8GV3_Label, ui->phase8GV3Use, ui->phase8GV3Value, ui->phase8GV4_Label, ui->phase8GV4Use, ui->phase8GV4Value, ui->phase8GV5_Label, ui->phase8GV5Use, ui->phase8GV5Value,ui->phase8REA_Label, ui->phase8RE1Use, ui->phase8RE1Value,ui->phase8REB_Label, ui->phase8RE2Use, ui->phase8RE2Value, true);
|
|
|
|
QSlider * tmpsliders[9][4]={
|
|
{ui->phase0Trim1Slider,ui->phase0Trim2Slider,ui->phase0Trim3Slider,ui->phase0Trim4Slider},
|
|
{ui->phase1Trim1Slider,ui->phase1Trim2Slider,ui->phase1Trim3Slider,ui->phase1Trim4Slider},
|
|
{ui->phase2Trim1Slider,ui->phase2Trim2Slider,ui->phase2Trim3Slider,ui->phase2Trim4Slider},
|
|
{ui->phase3Trim1Slider,ui->phase3Trim2Slider,ui->phase3Trim3Slider,ui->phase3Trim4Slider},
|
|
{ui->phase4Trim1Slider,ui->phase4Trim2Slider,ui->phase4Trim3Slider,ui->phase4Trim4Slider},
|
|
{ui->phase5Trim1Slider,ui->phase5Trim2Slider,ui->phase5Trim3Slider,ui->phase5Trim4Slider},
|
|
{ui->phase6Trim1Slider,ui->phase6Trim2Slider,ui->phase6Trim3Slider,ui->phase6Trim4Slider},
|
|
{ui->phase7Trim1Slider,ui->phase7Trim2Slider,ui->phase7Trim3Slider,ui->phase7Trim4Slider},
|
|
{ui->phase8Trim1Slider,ui->phase8Trim2Slider,ui->phase8Trim3Slider,ui->phase8Trim4Slider}
|
|
};
|
|
QSpinBox * tmpspinbox[9][4]={
|
|
{ui->phase0Trim1Value,ui->phase0Trim2Value,ui->phase0Trim3Value,ui->phase0Trim4Value},
|
|
{ui->phase1Trim1Value,ui->phase1Trim2Value,ui->phase1Trim3Value,ui->phase1Trim4Value},
|
|
{ui->phase2Trim1Value,ui->phase2Trim2Value,ui->phase2Trim3Value,ui->phase2Trim4Value},
|
|
{ui->phase3Trim1Value,ui->phase3Trim2Value,ui->phase3Trim3Value,ui->phase3Trim4Value},
|
|
{ui->phase4Trim1Value,ui->phase4Trim2Value,ui->phase4Trim3Value,ui->phase4Trim4Value},
|
|
{ui->phase5Trim1Value,ui->phase5Trim2Value,ui->phase5Trim3Value,ui->phase5Trim4Value},
|
|
{ui->phase6Trim1Value,ui->phase6Trim2Value,ui->phase6Trim3Value,ui->phase6Trim4Value},
|
|
{ui->phase7Trim1Value,ui->phase7Trim2Value,ui->phase7Trim3Value,ui->phase7Trim4Value},
|
|
{ui->phase8Trim1Value,ui->phase8Trim2Value,ui->phase8Trim3Value,ui->phase8Trim4Value}
|
|
};
|
|
memcpy(phasesTrimSliders,tmpsliders,sizeof(phasesTrimSliders));
|
|
memcpy(phasesTrimValues,tmpspinbox,sizeof(phasesTrimValues));
|
|
|
|
int phases = GetEepromInterface()->getCapability(FlightPhases);
|
|
if (phases < 9) {
|
|
ui->phase8->setDisabled(true);
|
|
ui->phases->removeTab(8);
|
|
}
|
|
if (phases < 8) {
|
|
ui->phase7->setDisabled(true);
|
|
ui->phases->removeTab(7);
|
|
}
|
|
if (phases < 7) {
|
|
ui->phase6->setDisabled(true);
|
|
ui->phases->removeTab(6);
|
|
}
|
|
if (phases < 6) {
|
|
ui->phase5->setDisabled(true);
|
|
ui->phases->removeTab(5);
|
|
}
|
|
if (phases < 5) {
|
|
ui->phase4->setDisabled(true);
|
|
ui->phases->removeTab(4);
|
|
}
|
|
if (phases < 4) {
|
|
ui->phase3->setDisabled(true);
|
|
ui->phases->removeTab(3);
|
|
}
|
|
if (phases < 3) {
|
|
ui->phase2->setDisabled(true);
|
|
ui->phases->removeTab(2);
|
|
}
|
|
if (phases < 2) {
|
|
ui->phase1->setDisabled(true);
|
|
ui->phases->removeTab(1);
|
|
ui->phase0Name->setDisabled(true);
|
|
ui->phase0FadeIn->setDisabled(true);
|
|
ui->phase0FadeOut->setDisabled(true);
|
|
}
|
|
if ( GetEepromInterface()->getCapability(FlightPhasesAreNamed) ) {
|
|
for (int i=0; i < phases; i++) {
|
|
QString PhaseName=g_model.phaseData[i].name;
|
|
QString TabName;
|
|
if (i==0) {
|
|
TabName.append(QObject::tr("Flight Mode 0 (Default)"));
|
|
} else {
|
|
TabName.append(QObject::tr("FM %1").arg(i));
|
|
}
|
|
if (!PhaseName.isEmpty()) {
|
|
TabName.append(" (");
|
|
TabName.append(PhaseName);
|
|
TabName.append(")");
|
|
}
|
|
ui->phases->setTabText(i,TabName);
|
|
}
|
|
} else {
|
|
QLineEdit * tmp[]= { ui->phase0Name,ui->phase1Name,ui->phase2Name,ui->phase3Name,ui->phase4Name,ui->phase5Name,ui->phase6Name,ui->phase7Name,ui->phase8Name};
|
|
QLabel * tmp2[] = { ui->label_fm0name,ui->label_fm1name,ui->label_fm2name,ui->label_fm3name,ui->label_fm4name,ui->label_fm5name,ui->label_fm6name,ui->label_fm7name,ui->label_fm8name};
|
|
for (int i=0; i < phases; i++) {
|
|
tmp[i]->hide();
|
|
tmp2[i]->hide();
|
|
}
|
|
}
|
|
ui->phases->setCurrentIndex(0);
|
|
phasesLock = false;
|
|
}
|
|
|
|
void ModelEdit::on_phases_currentChanged(int index)
|
|
{
|
|
phasesLock = true;
|
|
switch(index) {
|
|
case 1:
|
|
displayOnePhase(1, NULL, NULL, NULL, NULL, NULL, ui->phase1Trim1Value, NULL, ui->phase1Trim1Slider, NULL, ui->phase1Trim2Value, NULL, ui->phase1Trim2Slider, NULL, ui->phase1Trim3Value, NULL, ui->phase1Trim3Slider, NULL, ui->phase1Trim4Value, NULL, ui->phase1Trim4Slider, NULL, NULL, ui->phase1GV1Value, NULL, NULL, ui->phase1GV2Value, NULL, NULL, ui->phase1GV3Value, NULL, NULL, ui->phase1GV4Value, NULL, NULL, ui->phase1GV5Value,NULL,NULL, ui->phase1RE1Value,NULL,NULL, ui->phase1RE2Value);
|
|
break;
|
|
case 2:
|
|
displayOnePhase(2, NULL, NULL, NULL, NULL, NULL, ui->phase2Trim1Value, NULL, ui->phase2Trim1Slider, NULL, ui->phase2Trim2Value, NULL, ui->phase2Trim2Slider, NULL, ui->phase2Trim3Value, NULL, ui->phase2Trim3Slider, NULL, ui->phase2Trim4Value, NULL, ui->phase2Trim4Slider, NULL, NULL, ui->phase2GV1Value, NULL, NULL, ui->phase2GV2Value, NULL, NULL, ui->phase2GV3Value, NULL, NULL, ui->phase2GV4Value, NULL, NULL, ui->phase2GV5Value,NULL,NULL, ui->phase2RE1Value,NULL,NULL, ui->phase2RE2Value);
|
|
break;
|
|
case 3:
|
|
displayOnePhase(3, NULL, NULL, NULL, NULL, NULL, ui->phase3Trim1Value, NULL, ui->phase3Trim1Slider, NULL, ui->phase3Trim2Value, NULL, ui->phase3Trim2Slider, NULL, ui->phase3Trim3Value, NULL, ui->phase3Trim3Slider, NULL, ui->phase3Trim4Value, NULL, ui->phase3Trim4Slider, NULL, NULL, ui->phase3GV1Value, NULL, NULL, ui->phase3GV2Value, NULL, NULL, ui->phase3GV3Value, NULL, NULL, ui->phase3GV4Value, NULL, NULL, ui->phase3GV5Value,NULL,NULL, ui->phase3RE1Value,NULL,NULL, ui->phase3RE2Value);
|
|
break;
|
|
case 4:
|
|
displayOnePhase(4, NULL, NULL, NULL, NULL, NULL, ui->phase4Trim1Value, NULL, ui->phase4Trim1Slider, NULL, ui->phase4Trim2Value, NULL, ui->phase4Trim2Slider, NULL, ui->phase4Trim3Value, NULL, ui->phase4Trim3Slider, NULL, ui->phase4Trim4Value, NULL, ui->phase4Trim4Slider, NULL, NULL, ui->phase4GV1Value, NULL, NULL, ui->phase4GV2Value, NULL, NULL, ui->phase4GV3Value, NULL, NULL, ui->phase4GV4Value, NULL, NULL, ui->phase4GV5Value,NULL,NULL, ui->phase4RE1Value,NULL,NULL, ui->phase4RE2Value);
|
|
break;
|
|
case 5:
|
|
displayOnePhase(5, NULL, NULL, NULL, NULL, NULL, ui->phase5Trim1Value, NULL, ui->phase5Trim1Slider, NULL, ui->phase5Trim2Value, NULL, ui->phase5Trim2Slider, NULL, ui->phase5Trim3Value, NULL, ui->phase5Trim3Slider, NULL, ui->phase5Trim4Value, NULL, ui->phase5Trim4Slider, NULL, NULL, ui->phase5GV1Value, NULL, NULL, ui->phase5GV2Value, NULL, NULL, ui->phase5GV3Value, NULL, NULL, ui->phase5GV4Value, NULL, NULL, ui->phase5GV5Value,NULL,NULL, ui->phase5RE1Value,NULL,NULL, ui->phase5RE2Value);
|
|
break;
|
|
case 6:
|
|
displayOnePhase(6, NULL, NULL, NULL, NULL, NULL, ui->phase6Trim1Value, NULL, ui->phase6Trim1Slider, NULL, ui->phase6Trim2Value, NULL, ui->phase6Trim2Slider, NULL, ui->phase6Trim3Value, NULL, ui->phase6Trim3Slider, NULL, ui->phase6Trim4Value, NULL, ui->phase6Trim4Slider, NULL, NULL, ui->phase6GV1Value, NULL, NULL, ui->phase6GV2Value, NULL, NULL, ui->phase6GV3Value, NULL, NULL, ui->phase6GV4Value, NULL, NULL, ui->phase6GV5Value,NULL,NULL, ui->phase6RE1Value,NULL,NULL, ui->phase6RE2Value);
|
|
break;
|
|
case 7:
|
|
displayOnePhase(7, NULL, NULL, NULL, NULL, NULL, ui->phase7Trim1Value, NULL, ui->phase7Trim1Slider, NULL, ui->phase7Trim2Value, NULL, ui->phase7Trim2Slider, NULL, ui->phase7Trim3Value, NULL, ui->phase7Trim3Slider, NULL, ui->phase7Trim4Value, NULL, ui->phase7Trim4Slider, NULL, NULL, ui->phase7GV1Value, NULL, NULL, ui->phase7GV2Value, NULL, NULL, ui->phase7GV3Value, NULL, NULL, ui->phase7GV4Value, NULL, NULL, ui->phase7GV5Value,NULL,NULL, ui->phase7RE1Value,NULL,NULL, ui->phase7RE2Value);
|
|
break;
|
|
case 8:
|
|
displayOnePhase(8, NULL, NULL, NULL, NULL, NULL, ui->phase8Trim1Value, NULL, ui->phase8Trim1Slider, NULL, ui->phase8Trim2Value, NULL, ui->phase8Trim2Slider, NULL, ui->phase8Trim3Value, NULL, ui->phase8Trim3Slider, NULL, ui->phase8Trim4Value, NULL, ui->phase8Trim4Slider, NULL, NULL, ui->phase8GV1Value, NULL, NULL, ui->phase8GV2Value, NULL, NULL, ui->phase8GV3Value, NULL, NULL, ui->phase8GV4Value, NULL, NULL, ui->phase8GV5Value,NULL,NULL, ui->phase8RE1Value,NULL,NULL, ui->phase8RE2Value);
|
|
break;
|
|
}
|
|
phasesLock = false;
|
|
}
|
|
|
|
void ModelEdit::tabExpos()
|
|
{
|
|
// curDest -> destination channel
|
|
// i -> mixer number
|
|
QByteArray qba;
|
|
ExposlistWidget->clear();
|
|
int curDest = -1;
|
|
|
|
for(int i=0; i<C9X_MAX_EXPOS; i++) {
|
|
ExpoData *md = &g_model.expoData[i];
|
|
|
|
if (md->mode==0) break;
|
|
QString str = "";
|
|
while(curDest<(int)md->chn-1) {
|
|
curDest++;
|
|
str = getStickStr(curDest);
|
|
qba.clear();
|
|
qba.append((quint8)-curDest-1);
|
|
QListWidgetItem *itm = new QListWidgetItem(str);
|
|
itm->setData(Qt::UserRole,qba);
|
|
ExposlistWidget->addItem(itm);
|
|
}
|
|
|
|
if(curDest!=(int)md->chn) {
|
|
str = getStickStr(md->chn);
|
|
curDest = md->chn;
|
|
} else {
|
|
str = " ";
|
|
}
|
|
|
|
switch (md->mode) {
|
|
case (1): str += " <-"; break;
|
|
case (2): str += " ->"; break;
|
|
default: str += " "; break;
|
|
};
|
|
|
|
str += tr("Weight") + getGVarString(md->weight).rightJustified(6, ' ');
|
|
if (!GetEepromInterface()->getCapability(ExpoIsCurve)) {
|
|
if (md->expo!=0)
|
|
str += " " + tr("Expo") + getGVarString(md->expo, true).rightJustified(7, ' ');
|
|
} else {
|
|
if (md->curveMode==0 && md->curveParam!=0)
|
|
str += " " + tr("Expo") + getGVarString(md->curveParam, true).rightJustified(7, ' ');
|
|
}
|
|
if (GetEepromInterface()->getCapability(FlightPhases)) {
|
|
if(md->phases) {
|
|
if (md->phases!=(unsigned int)(1<<GetEepromInterface()->getCapability(FlightPhases))-1) {
|
|
int mask=1;
|
|
int first=0;
|
|
for (int i=0; i<GetEepromInterface()->getCapability(FlightPhases);i++) {
|
|
if (!(md->phases & mask)) {
|
|
first++;
|
|
}
|
|
mask <<=1;
|
|
}
|
|
if (first>1) {
|
|
str += " " + tr("Flight modes") + QString("(");
|
|
} else {
|
|
str += " " + tr("Flight mode") + QString("(");
|
|
}
|
|
mask=1;
|
|
first=1;
|
|
for (int i=0; i<GetEepromInterface()->getCapability(FlightPhases);i++) {
|
|
if (!(md->phases & mask)) {
|
|
if (!first) {
|
|
str += QString(", ")+ QString("%1").arg(getPhaseName(i+1, g_model.phaseData[i].name));
|
|
} else {
|
|
str += QString("%1").arg(getPhaseName(i+1,g_model.phaseData[i].name));
|
|
first=0;
|
|
}
|
|
}
|
|
mask <<=1;
|
|
}
|
|
str += QString(")");
|
|
} else {
|
|
str += tr("DISABLED")+QString(" !!!");
|
|
}
|
|
}
|
|
}
|
|
if (md->swtch.type != SWITCH_TYPE_NONE) str += " " + tr("Switch") + QString("(%1)").arg(md->swtch.toString());
|
|
if (md->curveMode)
|
|
if (md->curveParam) str += " " + tr("Curve") + QString("(%1)").arg(getCurveStr(md->curveParam));
|
|
if (GetEepromInterface()->getCapability(HasExpoNames)) {
|
|
QString ExpoName;
|
|
ExpoName.append(md->name);
|
|
if (!ExpoName.isEmpty()) {
|
|
str+=QString("(%1)").arg(ExpoName);
|
|
}
|
|
}
|
|
qba.clear();
|
|
qba.append((quint8)i);
|
|
qba.append((const char*)md, sizeof(ExpoData));
|
|
QListWidgetItem *itm = new QListWidgetItem(str);
|
|
itm->setData(Qt::UserRole,qba); // expo number
|
|
ExposlistWidget->addItem(itm); //(str);
|
|
}
|
|
|
|
while(curDest<NUM_STICKS-1) {
|
|
curDest++;
|
|
QString str = getStickStr(curDest);
|
|
qba.clear();
|
|
qba.append((quint8)-curDest-1);
|
|
QListWidgetItem *itm = new QListWidgetItem(str);
|
|
itm->setData(Qt::UserRole,qba); // add new expo
|
|
ExposlistWidget->addItem(itm);
|
|
}
|
|
}
|
|
|
|
void ModelEdit::exposEdited()
|
|
{
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::tabMixes()
|
|
{
|
|
// curDest -> destination channel4
|
|
// i -> mixer number
|
|
QByteArray qba;
|
|
MixerlistWidget->clear();
|
|
unsigned int curDest = 0;
|
|
int i;
|
|
unsigned int outputs = GetEepromInterface()->getCapability(Outputs);
|
|
int showNames=ui->showNames_Ckb->isChecked();
|
|
for(i=0; i<GetEepromInterface()->getCapability(Mixes); i++) {
|
|
MixData *md = &g_model.mixData[i];
|
|
if ((md->destCh==0) || (md->destCh>outputs+(unsigned int)GetEepromInterface()->getCapability(ExtraChannels))) continue;
|
|
QString str = "";
|
|
while(curDest<(md->destCh-1)) {
|
|
curDest++;
|
|
if (curDest > outputs) {
|
|
str = tr("X%1 ").arg(curDest-outputs);
|
|
} else {
|
|
str = tr("CH%1%2").arg(curDest/10).arg(curDest%10);
|
|
if (GetEepromInterface()->getCapability(HasChNames) && showNames) {
|
|
QString name=g_model.limitData[curDest-1].name;
|
|
if (!name.isEmpty()) {
|
|
name.append(" ");
|
|
str=name.left(6);
|
|
}
|
|
}
|
|
}
|
|
qba.clear();
|
|
qba.append((quint8)-curDest);
|
|
QListWidgetItem *itm = new QListWidgetItem(str);
|
|
itm->setData(Qt::UserRole,qba);
|
|
MixerlistWidget->addItem(itm);
|
|
}
|
|
|
|
if (md->destCh > outputs) {
|
|
str = tr("X%1 ").arg(md->destCh-outputs);
|
|
} else {
|
|
str = tr("CH%1%2").arg(md->destCh/10).arg(md->destCh%10);
|
|
str.append(" ");
|
|
if (GetEepromInterface()->getCapability(HasChNames) && showNames) {
|
|
QString name=g_model.limitData[md->destCh-1].name;
|
|
if (!name.isEmpty()) {
|
|
name.append(" ");
|
|
str=name.left(6);
|
|
}
|
|
}
|
|
}
|
|
if (curDest != md->destCh) {
|
|
curDest = md->destCh;
|
|
} else {
|
|
str.fill(' ');
|
|
}
|
|
|
|
switch(md->mltpx) {
|
|
case (1): str += " *"; break;
|
|
case (2): str += " R"; break;
|
|
default: str += " "; break;
|
|
};
|
|
|
|
str += " " + getGVarString(md->weight, true).rightJustified(6, ' ');
|
|
str += md->srcRaw.toString();
|
|
unsigned int fpCount = GetEepromInterface()->getCapability(FlightPhases);
|
|
if (GetEepromInterface()->getCapability(FlightPhases)) {
|
|
if(md->phases) {
|
|
if (md->phases!=(unsigned int)(1<<fpCount)-1) {
|
|
int mask=1;
|
|
int first=0;
|
|
for (unsigned int i=0; i<fpCount; i++) {
|
|
if (!(md->phases & mask)) {
|
|
first++;
|
|
}
|
|
mask <<=1;
|
|
}
|
|
if (first>1) {
|
|
str += " " + tr("Flight modes") + QString("(");
|
|
} else {
|
|
str += " " + tr("Flight mode") + QString("(");
|
|
}
|
|
mask=1;
|
|
first=1;
|
|
for (unsigned int i=0; i<fpCount; i++) {
|
|
if (!(md->phases & mask)) {
|
|
if (!first) {
|
|
str += QString(", ")+ QString("%1").arg(getPhaseName(i+1, g_model.phaseData[i].name));
|
|
}
|
|
else {
|
|
str += QString("%1").arg(getPhaseName(i+1,g_model.phaseData[i].name));
|
|
first=0;
|
|
}
|
|
}
|
|
mask <<=1;
|
|
}
|
|
str += QString(")");
|
|
} else {
|
|
str += tr("DISABLED")+QString(" !!!");
|
|
}
|
|
}
|
|
}
|
|
if(md->swtch.type != SWITCH_TYPE_NONE) str += " " + tr("Switch") + QString("(%1)").arg(md->swtch.toString());
|
|
if(md->carryTrim>0) {
|
|
str += " " +tr("No Trim");
|
|
} else if (md->carryTrim<0) {
|
|
str += " " + RawSource(SOURCE_TYPE_TRIM, (-(md->carryTrim)-1)).toString();
|
|
}
|
|
if(md->noExpo) {
|
|
str += " " +tr("No DR/Expo");
|
|
}
|
|
if (GetEepromInterface()->getCapability(MixFmTrim) && md->enableFmTrim==1) {
|
|
if (md->sOffset) str += " " + tr("FMTrim") + QString("(%1%)").arg(md->sOffset);
|
|
} else {
|
|
if (md->sOffset) str += " " + tr("Offset") + getGVarString(md->sOffset);
|
|
}
|
|
if (md->differential) str += " " + tr("Diff") + getGVarString(md->differential);
|
|
if (md->curve) str += " " + tr("Curve") + QString("(%1)").arg(getCurveStr(md->curve));
|
|
int scale=GetEepromInterface()->getCapability(SlowScale);
|
|
if (scale==0)
|
|
scale=1;
|
|
if (md->delayDown || md->delayUp)
|
|
str += tr(" Delay(u%1:d%2)").arg((double)md->delayUp/scale).arg((double)md->delayDown/scale);
|
|
if (md->speedDown || md->speedUp)
|
|
str += tr(" Slow(u%1:d%2)").arg((double)md->speedUp/scale).arg((double)md->speedDown/scale);
|
|
if (md->mixWarn) str += tr(" Warn(%1)").arg(md->mixWarn);
|
|
if (GetEepromInterface()->getCapability(HasMixerNames)) {
|
|
QString MixerName;
|
|
MixerName.append(md->name);
|
|
if (!MixerName.isEmpty()) {
|
|
str+=QString("(%1)").arg(MixerName);
|
|
}
|
|
}
|
|
qba.clear();
|
|
qba.append((quint8)i);
|
|
qba.append((const char*)md, sizeof(MixData));
|
|
QListWidgetItem *itm = new QListWidgetItem(str);
|
|
itm->setData(Qt::UserRole,qba); // mix number
|
|
MixerlistWidget->addItem(itm);//(str);
|
|
}
|
|
|
|
while(curDest<outputs+GetEepromInterface()->getCapability(ExtraChannels)) {
|
|
curDest++;
|
|
QString str;
|
|
|
|
if (curDest > outputs) {
|
|
str = tr("X%1 ").arg(curDest-outputs);
|
|
} else {
|
|
str = tr("CH%1%2").arg(curDest/10).arg(curDest%10);
|
|
if (GetEepromInterface()->getCapability(HasChNames) && showNames) {
|
|
QString name=g_model.limitData[curDest-1].name;
|
|
if (!name.isEmpty()) {
|
|
name.append(" ");
|
|
str=name.left(6);
|
|
}
|
|
}
|
|
}
|
|
qba.clear();
|
|
qba.append((quint8)-curDest);
|
|
QListWidgetItem *itm = new QListWidgetItem(str);
|
|
itm->setData(Qt::UserRole,qba); // add new mixer
|
|
MixerlistWidget->addItem(itm);
|
|
}
|
|
}
|
|
|
|
void ModelEdit::mixesEdited()
|
|
{
|
|
updateSettings();
|
|
}
|
|
|
|
|
|
void ModelEdit::tabHeli()
|
|
{
|
|
updateHeliTab();
|
|
|
|
connect(ui->swashTypeCB,SIGNAL(currentIndexChanged(int)),this,SLOT(heliEdited()));
|
|
connect(ui->swashCollectiveCB,SIGNAL(currentIndexChanged(int)),this,SLOT(heliEdited()));
|
|
connect(ui->swashRingValSB,SIGNAL(editingFinished()),this,SLOT(heliEdited()));
|
|
connect(ui->swashInvertELE,SIGNAL(stateChanged(int)),this,SLOT(heliEdited()));
|
|
connect(ui->swashInvertAIL,SIGNAL(stateChanged(int)),this,SLOT(heliEdited()));
|
|
connect(ui->swashInvertCOL,SIGNAL(stateChanged(int)),this,SLOT(heliEdited()));
|
|
}
|
|
|
|
void ModelEdit::updateHeliTab()
|
|
{
|
|
heliEditLock = true;
|
|
|
|
ui->swashTypeCB->setCurrentIndex(g_model.swashRingData.type);
|
|
populateSourceCB(ui->swashCollectiveCB, g_model.swashRingData.collectiveSource, POPULATE_SOURCES | POPULATE_SWITCHES | POPULATE_TRIMS);
|
|
ui->swashRingValSB->setValue(g_model.swashRingData.value);
|
|
ui->swashInvertELE->setChecked(g_model.swashRingData.invertELE);
|
|
ui->swashInvertAIL->setChecked(g_model.swashRingData.invertAIL);
|
|
ui->swashInvertCOL->setChecked(g_model.swashRingData.invertCOL);
|
|
|
|
heliEditLock = false;
|
|
}
|
|
|
|
void ModelEdit::heliEdited()
|
|
{
|
|
if(heliEditLock) return;
|
|
g_model.swashRingData.type = ui->swashTypeCB->currentIndex();
|
|
g_model.swashRingData.collectiveSource = ui->swashCollectiveCB->itemData(ui->swashCollectiveCB->currentIndex()).toInt();
|
|
g_model.swashRingData.value = ui->swashRingValSB->value();
|
|
g_model.swashRingData.invertELE = ui->swashInvertELE->isChecked();
|
|
g_model.swashRingData.invertAIL = ui->swashInvertAIL->isChecked();
|
|
g_model.swashRingData.invertCOL = ui->swashInvertCOL->isChecked();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::tabLimits()
|
|
{
|
|
limitEditLock=true;
|
|
int chnames=GetEepromInterface()->getCapability(HasChNames);
|
|
QRegExp rx(CHAR_FOR_NAMES_REGEX);
|
|
foreach(QLineEdit *le, findChildren<QLineEdit *>(QRegExp("CHName_[0-9]+"))) {
|
|
int len=le->objectName().mid(le->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
if (chnames ) {
|
|
QString name=g_model.limitData[len].name;
|
|
if (name.trimmed().isEmpty()) {
|
|
le->setText(tr("CH %1").arg(len+1));
|
|
} else {
|
|
le->setText(name);
|
|
}
|
|
le->setValidator(new QRegExpValidator(rx, this));
|
|
le->setEnabled(true);
|
|
le->setReadOnly(false);
|
|
connect(le, SIGNAL(editingFinished()), this, SLOT(limitNameEdited()));
|
|
} else {
|
|
le->setText(tr("CH %1").arg(len+1));
|
|
le->setDisabled(true);
|
|
le->setReadOnly(true);
|
|
}
|
|
}
|
|
limitEditLock=false;
|
|
foreach(QDoubleSpinBox *sb, findChildren<QDoubleSpinBox *>(QRegExp("offsetDSB_[0-9]+"))) {
|
|
int sbn=sb->objectName().mid(sb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
sb->setValue(g_model.limitData[sbn].offset/10.0);
|
|
connect(sb, SIGNAL(editingFinished()), this, SLOT(limitOffsetEdited()));
|
|
}
|
|
|
|
foreach(QSpinBox *sb, findChildren<QSpinBox *>(QRegExp("minSB_[0-9]+"))) {
|
|
int sbn=sb->objectName().mid(sb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
sb->setValue(g_model.limitData[sbn].min);
|
|
connect(sb, SIGNAL(editingFinished()), this, SLOT(limitEdited()));
|
|
}
|
|
|
|
foreach(QSpinBox *sb, findChildren<QSpinBox *>(QRegExp("maxSB_[0-9]+"))) {
|
|
int sbn=sb->objectName().mid(sb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
sb->setValue(g_model.limitData[sbn].max);
|
|
connect(sb, SIGNAL(editingFinished()), this, SLOT(limitEdited()));
|
|
}
|
|
|
|
foreach(QComboBox *cb, findChildren<QComboBox *>(QRegExp("chInvCB_[0-9]+"))) {
|
|
int cbn=cb->objectName().mid(cb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
cb->setCurrentIndex((g_model.limitData[cbn].revert) ? 1 : 0);
|
|
connect(cb, SIGNAL(currentIndexChanged(int)), this, SLOT(limitInvEdited()));
|
|
}
|
|
if (GetEepromInterface()->getCapability(PPMCenter)) {
|
|
foreach(QSpinBox *sb, findChildren<QSpinBox *>(QRegExp("ppmcenter_[0-9]+"))) {
|
|
int sbn=sb->objectName().mid(sb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
sb->setValue(g_model.limitData[sbn].ppmCenter+1500);
|
|
connect(sb, SIGNAL(editingFinished()), this, SLOT(ppmcenterEdited()));
|
|
}
|
|
} else {
|
|
foreach(QSpinBox *sb, findChildren<QSpinBox *>(QRegExp("ppmcenter_[0-9]+"))) {
|
|
sb->hide();
|
|
}
|
|
ui->ppmc_label1->hide();
|
|
ui->ppmc_label2->hide();
|
|
}
|
|
|
|
if (GetEepromInterface()->getCapability(SYMLimits)) {
|
|
foreach(QCheckBox *ckb, findChildren<QCheckBox *>(QRegExp("symckb_[0-9]+"))) {
|
|
int ckbn=ckb->objectName().mid(ckb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
ckb->setChecked(g_model.limitData[ckbn].symetrical);
|
|
connect(ckb, SIGNAL(toggled(bool)), this, SLOT(limitSymEdited()));
|
|
}
|
|
} else {
|
|
foreach(QCheckBox *ckb, findChildren<QCheckBox *>(QRegExp("symckb_[0-9]+"))) {
|
|
ckb->hide();
|
|
}
|
|
ui->label_sym01->hide();
|
|
ui->label_sym02->hide();
|
|
}
|
|
|
|
if (GetEepromInterface()->getCapability(Outputs)<17) {
|
|
ui->limitGB2->hide();
|
|
}
|
|
setLimitMinMax();
|
|
}
|
|
|
|
void ModelEdit::updateCurvesTab()
|
|
{
|
|
ControlCurveSignal(true);
|
|
foreach(QCheckBox *ChkB, findChildren<QCheckBox *>(QRegExp("plotCB_[0-9]+"))) {
|
|
int ChkBn=ChkB->objectName().mid(ChkB->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
ChkB->setChecked(plot_curve[ChkBn]);
|
|
}
|
|
ControlCurveSignal(false);
|
|
}
|
|
|
|
|
|
void ModelEdit::tabCurves()
|
|
{
|
|
QSpinBox* tmpy[17] = {
|
|
ui->curvePt01_y, ui->curvePt02_y, ui->curvePt03_y, ui->curvePt04_y, ui->curvePt05_y,
|
|
ui->curvePt06_y, ui->curvePt07_y, ui->curvePt08_y, ui->curvePt09_y, ui->curvePt10_y,
|
|
ui->curvePt11_y, ui->curvePt12_y, ui->curvePt13_y, ui->curvePt14_y, ui->curvePt15_y,
|
|
ui->curvePt16_y, ui->curvePt17_y };
|
|
QSpinBox* tmpx[17] = {
|
|
ui->curvePt01_x, ui->curvePt02_x, ui->curvePt03_x, ui->curvePt04_x, ui->curvePt05_x,
|
|
ui->curvePt06_x, ui->curvePt07_x, ui->curvePt08_x, ui->curvePt09_x, ui->curvePt10_x,
|
|
ui->curvePt11_x, ui->curvePt12_x, ui->curvePt13_x, ui->curvePt14_x, ui->curvePt15_x,
|
|
ui->curvePt16_x, ui->curvePt17_x };
|
|
|
|
QPushButton * editb[16]= {
|
|
ui->curveEdit_1,ui->curveEdit_2,ui->curveEdit_3,ui->curveEdit_4,
|
|
ui->curveEdit_5,ui->curveEdit_6,ui->curveEdit_7,ui->curveEdit_8,
|
|
ui->curveEdit_9,ui->curveEdit_10,ui->curveEdit_11,ui->curveEdit_12,
|
|
ui->curveEdit_13,ui->curveEdit_14,ui->curveEdit_15,ui->curveEdit_16 };
|
|
|
|
QPushButton * resetb[16]= {
|
|
ui->resetCurve_1,ui->resetCurve_2,ui->resetCurve_3,ui->resetCurve_4,
|
|
ui->resetCurve_5,ui->resetCurve_6,ui->resetCurve_7,ui->resetCurve_8,
|
|
ui->resetCurve_9,ui->resetCurve_10,ui->resetCurve_11,ui->resetCurve_12,
|
|
ui->resetCurve_13,ui->resetCurve_14,ui->resetCurve_15,ui->resetCurve_16 };
|
|
|
|
QCheckBox * plotcb[16]= {
|
|
ui->plotCB_1,ui->plotCB_2,ui->plotCB_3,ui->plotCB_4,
|
|
ui->plotCB_5,ui->plotCB_6,ui->plotCB_7,ui->plotCB_8,
|
|
ui->plotCB_9,ui->plotCB_10,ui->plotCB_11,ui->plotCB_12,
|
|
ui->plotCB_13,ui->plotCB_14,ui->plotCB_15,ui->plotCB_16 };
|
|
|
|
memcpy(spny, tmpy, sizeof(spny));
|
|
memcpy(spnx, tmpx, sizeof(spnx));
|
|
int numcurves=GetEepromInterface()->getCapability(NumCurves);
|
|
if (numcurves==0) {
|
|
numcurves=16;
|
|
}
|
|
|
|
if (!GetEepromInterface()->getCapability(CustomCurves)){
|
|
ui->curvetype_CB->setDisabled(true);
|
|
int count=0;
|
|
for (int i=0; i< GetEepromInterface()->getCapability(NumCurves3); i++) {
|
|
g_model.curves[count].count=3;
|
|
g_model.curves[count].custom=false;
|
|
count++;
|
|
}
|
|
for (int i=0; i< GetEepromInterface()->getCapability(NumCurves5); i++) {
|
|
g_model.curves[count].count=5;
|
|
g_model.curves[count].custom=false;
|
|
count++;
|
|
}
|
|
for (int i=0; i< GetEepromInterface()->getCapability(NumCurves9); i++) {
|
|
g_model.curves[count].count=9;
|
|
g_model.curves[count].custom=false;
|
|
count++;
|
|
}
|
|
for (int i=count; i< 16; i++) {
|
|
editb[i]->hide();
|
|
plotcb[i]->hide();
|
|
resetb[i]->hide();
|
|
}
|
|
|
|
} else {
|
|
ui->curvetype_CB->setEnabled(true);
|
|
}
|
|
if (!GetEepromInterface()->getCapability(HasCvNames)){
|
|
ui->cname_LE->hide();
|
|
ui->cname_label->hide();
|
|
} else {
|
|
ui->cname_LE->setText(g_model.curves[0].name);
|
|
}
|
|
|
|
for (int i=numcurves; i<16;i++) {
|
|
editb[i]->hide();
|
|
resetb[i]->hide();
|
|
plotcb[i]->hide();
|
|
}
|
|
|
|
|
|
for (int i=0; i<16;i++) {
|
|
plot_curve[i]=FALSE;
|
|
}
|
|
redrawCurve=true;
|
|
drawing=false;
|
|
#ifdef __APPLE__
|
|
ui->curveEdit_1->setStyleSheet("color: #00007f;");
|
|
ui->curveEdit_2->setStyleSheet("color: #007f00;");
|
|
ui->curveEdit_3->setStyleSheet("color: #7f0000;");
|
|
ui->curveEdit_4->setStyleSheet("color: #007f7f;");
|
|
ui->curveEdit_5->setStyleSheet("color: #7f007f;");
|
|
ui->curveEdit_6->setStyleSheet("color: #7f7f00;");
|
|
ui->curveEdit_7->setStyleSheet("color: #7f7f7f;");
|
|
ui->curveEdit_8->setStyleSheet("color: #0000ff;");
|
|
ui->curveEdit_9->setStyleSheet("color: #007fff;");
|
|
ui->curveEdit_10->setStyleSheet("color: #7f00ff;");
|
|
ui->curveEdit_11->setStyleSheet("color: #00ff00;");
|
|
ui->curveEdit_12->setStyleSheet("color: #00ff7f;");
|
|
ui->curveEdit_13->setStyleSheet("color: #7fff00;");
|
|
ui->curveEdit_14->setStyleSheet("color: #ff0000;");
|
|
ui->curveEdit_15->setStyleSheet("color: #ff007f;");
|
|
ui->curveEdit_16->setStyleSheet("color: #ff7f00;");
|
|
#else
|
|
ui->curveEdit_1->setStyleSheet("background-color: #00007f; color: white;");
|
|
ui->curveEdit_2->setStyleSheet("background-color: #007f00; color: white;");
|
|
ui->curveEdit_3->setStyleSheet("background-color: #7f0000; color: white;");
|
|
ui->curveEdit_4->setStyleSheet("background-color: #007f7f; color: white;");
|
|
ui->curveEdit_5->setStyleSheet("background-color: #7f007f; color: white;");
|
|
ui->curveEdit_6->setStyleSheet("background-color: #7f7f00; color: white;");
|
|
ui->curveEdit_7->setStyleSheet("background-color: #7f7f7f; color: white;");
|
|
ui->curveEdit_8->setStyleSheet("background-color: #0000ff; color: white;");
|
|
ui->curveEdit_9->setStyleSheet("background-color: #007fff; color: white;");
|
|
ui->curveEdit_10->setStyleSheet("background-color: #7f00ff; color: white;");
|
|
ui->curveEdit_11->setStyleSheet("background-color: #00ff00; color: white;");
|
|
ui->curveEdit_12->setStyleSheet("background-color: #00ff7f; color: white;");
|
|
ui->curveEdit_13->setStyleSheet("background-color: #7fff00; color: white;");
|
|
ui->curveEdit_14->setStyleSheet("background-color: #ff0000; color: white;");
|
|
ui->curveEdit_15->setStyleSheet("background-color: #ff007f; color: white;");
|
|
ui->curveEdit_16->setStyleSheet("background-color: #ff7f00; color: white;");
|
|
#endif
|
|
updateCurvesTab();
|
|
|
|
QGraphicsScene *scene = new QGraphicsScene(ui->curvePreview);
|
|
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
|
|
ui->curvePreview->setScene(scene);
|
|
currentCurve = 0;
|
|
|
|
connect(ui->clearMixesPB,SIGNAL(pressed()),this,SLOT(clearCurves()));
|
|
|
|
foreach(QSpinBox *sb, findChildren<QSpinBox *>(QRegExp("curvePt[0-9]+"))) {
|
|
connect(sb, SIGNAL(valueChanged(int)), this, SLOT(curvePointEdited()));
|
|
}
|
|
|
|
foreach(QPushButton *pb, findChildren<QPushButton *>(QRegExp("resetCurve_[0-9]+"))) {
|
|
connect(pb, SIGNAL(clicked()), this, SLOT(resetCurve()));
|
|
}
|
|
|
|
foreach(QPushButton *pb, findChildren<QPushButton *>(QRegExp("curveEdit_[0-9]+"))) {
|
|
connect(pb, SIGNAL(clicked()), this, SLOT(editCurve()));
|
|
}
|
|
|
|
foreach(QCheckBox *ChkB, findChildren<QCheckBox *>(QRegExp("plotCB_[0-9]+"))) {
|
|
connect(ChkB, SIGNAL(toggled(bool)), this, SLOT(plotCurve(bool)));
|
|
}
|
|
setCurrentCurve(currentCurve);
|
|
ui->ca_coeff_SB->hide();
|
|
ui->ca_coeff_label->hide();
|
|
ui->ca_ymid_SB->hide();
|
|
ui->ca_ymid_label->hide();
|
|
}
|
|
|
|
void ModelEdit::on_ca_ctype_CB_currentIndexChanged()
|
|
{
|
|
int index=ui->ca_ctype_CB->currentIndex();
|
|
switch (index) {
|
|
case 0:
|
|
ui->ca_coeff_SB->hide();
|
|
ui->ca_coeff_label->hide();
|
|
ui->ca_ymid_SB->hide();
|
|
ui->ca_ymid_label->hide();
|
|
ui->ca_ymin_SB->show();
|
|
ui->ca_ymin_label->show();
|
|
ui->ca_ymin_SB->setValue(-100);
|
|
ui->ca_ymax_SB->setValue(100);
|
|
break;
|
|
case 1:
|
|
ui->ca_coeff_SB->show();
|
|
ui->ca_coeff_label->show();
|
|
ui->ca_ymid_SB->hide();
|
|
ui->ca_ymid_label->hide();
|
|
ui->ca_ymin_SB->show();
|
|
ui->ca_ymin_label->show();
|
|
ui->ca_ymin_SB->setValue(-100);
|
|
ui->ca_ymax_SB->setValue(100);
|
|
break;
|
|
case 2:
|
|
ui->ca_coeff_SB->show();
|
|
ui->ca_coeff_label->show();
|
|
ui->ca_ymid_SB->hide();
|
|
ui->ca_ymid_label->hide();
|
|
ui->ca_ymin_SB->hide();
|
|
ui->ca_ymin_label->hide();
|
|
ui->ca_ymax_SB->setValue(100);
|
|
break;
|
|
case 3:
|
|
ui->ca_coeff_SB->show();
|
|
ui->ca_coeff_label->show();
|
|
ui->ca_ymid_SB->show();
|
|
ui->ca_ymid_label->show();
|
|
ui->ca_ymin_SB->hide();
|
|
ui->ca_ymin_label->hide();
|
|
ui->ca_ymid_SB->setValue(0);
|
|
ui->ca_ymax_SB->setValue(100);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ModelEdit::on_ca_apply_PB_clicked()
|
|
{
|
|
int index=ui->ca_ctype_CB->currentIndex();
|
|
float x;
|
|
int y;
|
|
int invert=0;
|
|
float a;
|
|
if (index==0) {
|
|
a=(ui->ca_ymax_SB->value()-ui->ca_ymin_SB->value())/200.0;
|
|
int numpoints=g_model.curves[currentCurve].count;
|
|
for (int i=0; i<numpoints; i++) {
|
|
if (g_model.curves[currentCurve].custom) {
|
|
x=(g_model.curves[currentCurve].points[i].x+100);
|
|
} else {
|
|
x=(200.0/(numpoints-1))*i;
|
|
}
|
|
y=ui->ca_ymin_SB->value()+a*x;
|
|
switch (ui->ca_side_CB->currentIndex()) {
|
|
case 0:
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
break;
|
|
case 1:
|
|
if (x>=100) {
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (x<100) {
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
} else if (index==1) {
|
|
int numpoints=g_model.curves[currentCurve].count;
|
|
for (int i=0; i<numpoints; i++) {
|
|
if (g_model.curves[currentCurve].custom) {
|
|
x=((g_model.curves[currentCurve].points[i].x)+100)/2.0;
|
|
} else {
|
|
x=(100.0/(numpoints-1))*i;
|
|
}
|
|
a=ui->ca_coeff_SB->value();
|
|
if (a>=0) {
|
|
y=round(c9xexpou(x,a)*(ui->ca_ymax_SB->value()-ui->ca_ymin_SB->value())/100.0+ui->ca_ymin_SB->value());
|
|
} else {
|
|
a=-a;
|
|
x=100-x;
|
|
y=round((100.0-c9xexpou(x,a))*(ui->ca_ymax_SB->value()-ui->ca_ymin_SB->value())/100.0+ui->ca_ymin_SB->value());
|
|
}
|
|
switch (ui->ca_side_CB->currentIndex()) {
|
|
case 0:
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
break;
|
|
case 1:
|
|
if (x>=50) {
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (x<50) {
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
} else if (index==2) {
|
|
int numpoints=g_model.curves[currentCurve].count;
|
|
for (int i=0; i<numpoints; i++) {
|
|
if (g_model.curves[currentCurve].custom) {
|
|
x=(g_model.curves[currentCurve].points[i].x);
|
|
} else {
|
|
x=-100.0+(200.0/(numpoints-1))*i;
|
|
}
|
|
a=ui->ca_coeff_SB->value();
|
|
if (x<0) {
|
|
x=-x;
|
|
invert=1;
|
|
} else {
|
|
invert=0;
|
|
}
|
|
if (a>=0) {
|
|
y=round(c9xexpou(x,a)*(ui->ca_ymax_SB->value()/100.0));
|
|
} else {
|
|
a=-a;
|
|
x=100-x;
|
|
y=round((100.0-c9xexpou(x,a))*(ui->ca_ymax_SB->value()/100.0));
|
|
}
|
|
switch (ui->ca_side_CB->currentIndex()) {
|
|
case 0:
|
|
if (invert==1) {
|
|
g_model.curves[currentCurve].points[i].y=-y;
|
|
} else {
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (invert==0) {
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (invert==1) {
|
|
g_model.curves[currentCurve].points[i].y=-y;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
} else if (index==3) {
|
|
int numpoints=g_model.curves[currentCurve].count;
|
|
for (int i=0; i<numpoints; i++) {
|
|
if (g_model.curves[currentCurve].custom) {
|
|
x=(g_model.curves[currentCurve].points[i].x);
|
|
} else {
|
|
x=-100.0+(200.0/(numpoints-1))*i;
|
|
}
|
|
int pos=(x>=0);
|
|
a=ui->ca_coeff_SB->value();
|
|
if (x<0) {
|
|
x=-x;
|
|
}
|
|
if (a>=0) {
|
|
y=round(c9xexpou(x,a)*((ui->ca_ymax_SB->value()-ui->ca_ymid_SB->value())/100.0)+ui->ca_ymid_SB->value());
|
|
} else {
|
|
a=-a;
|
|
x=100-x;
|
|
y=round((100.0-c9xexpou(x,a))*((ui->ca_ymax_SB->value()-ui->ca_ymid_SB->value())/100.0)+ui->ca_ymid_SB->value());
|
|
}
|
|
switch (ui->ca_side_CB->currentIndex()) {
|
|
case 0:
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
break;
|
|
case 1:
|
|
if (pos) {
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!pos) {
|
|
g_model.curves[currentCurve].points[i].y=y;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
updateSettings();
|
|
setCurrentCurve(currentCurve);
|
|
drawCurve();
|
|
}
|
|
|
|
void ModelEdit::limitSymEdited()
|
|
{
|
|
QCheckBox *ckb = qobject_cast<QCheckBox*>(sender());
|
|
int limitId=ckb->objectName().mid(ckb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
g_model.limitData[limitId].symetrical = (ckb->checkState() ? 1 : 0);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::limitNameEdited()
|
|
{
|
|
if(limitEditLock) return;
|
|
limitEditLock=true;
|
|
QLineEdit *le = qobject_cast<QLineEdit*>(sender());
|
|
int limitId=le->objectName().mid(le->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
int i=0;
|
|
if (le->text()==tr("CH %1").arg(limitId+1)) {
|
|
le->setText("");
|
|
}
|
|
for (i=0; i<le->text().toAscii().length(); i++) {
|
|
g_model.limitData[limitId].name[i]=le->text().toAscii().at(i);
|
|
}
|
|
if (le->text().trimmed().isEmpty()) {
|
|
le->setText(tr("CH %1").arg(limitId+1));
|
|
}
|
|
g_model.limitData[limitId].name[i]=0;
|
|
updateSettings();
|
|
tabMixes();
|
|
limitEditLock=false;
|
|
}
|
|
|
|
|
|
void ModelEdit::limitOffsetEdited()
|
|
{
|
|
QDoubleSpinBox *dsb = qobject_cast<QDoubleSpinBox*>(sender());
|
|
int limitId=dsb->objectName().mid(dsb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
g_model.limitData[limitId].offset = round(dsb->value()*10);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::limitEdited()
|
|
{
|
|
QSpinBox *sb = qobject_cast<QSpinBox*>(sender());
|
|
int limitId=sb->objectName().mid(sb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
if (sb->objectName().indexOf("max")!=-1) {
|
|
g_model.limitData[limitId].max = sb->value();
|
|
}
|
|
else {
|
|
g_model.limitData[limitId].min = sb->value();
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::limitInvEdited()
|
|
{
|
|
QComboBox *cb = qobject_cast<QComboBox*>(sender());
|
|
int limitId=cb->objectName().mid(cb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
g_model.limitData[limitId].revert = cb->currentIndex();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::ppmcenterEdited()
|
|
{
|
|
QSpinBox *sb = qobject_cast<QSpinBox*>(sender());
|
|
int limitId=sb->objectName().mid(sb->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
g_model.limitData[limitId].ppmCenter = sb->value()-1500;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::startupSwitchEdited()
|
|
{
|
|
if (GetEepromInterface()->getCapability(Pots)==3) {
|
|
uint8_t i= 0;
|
|
i|=(uint8_t)ui->swwarn0_CB->currentIndex();
|
|
if (i==1) {
|
|
ui->swwarn1_ChkB->setDisabled(true) ;
|
|
ui->swwarn2_ChkB->setDisabled(true) ;
|
|
ui->swwarn3_ChkB->setDisabled(true) ;
|
|
ui->swwarn4_CB->setDisabled(true) ;
|
|
ui->swwarn5_ChkB->setDisabled(true) ;
|
|
ui->swwarn6_ChkB->setDisabled(true) ;
|
|
} else {
|
|
ui->swwarn1_ChkB->setEnabled(true) ;
|
|
ui->swwarn2_ChkB->setEnabled(true) ;
|
|
ui->swwarn3_ChkB->setEnabled(true) ;
|
|
ui->swwarn4_CB->setEnabled(true) ;
|
|
ui->swwarn5_ChkB->setEnabled(true) ;
|
|
ui->swwarn6_ChkB->setEnabled(true) ;
|
|
i|=(ui->swwarn1_ChkB->isChecked() ? 1 : 0)<<1;
|
|
i|=(ui->swwarn2_ChkB->isChecked() ? 1 : 0)<<2;
|
|
i|=(ui->swwarn3_ChkB->isChecked() ? 1 : 0)<<3;
|
|
i|=((uint8_t)ui->swwarn4_CB->currentIndex() & 0x03)<<4;
|
|
i|=(ui->swwarn5_ChkB->isChecked() ? 1 : 0)<<6;
|
|
i|=(ui->swwarn6_ChkB->isChecked() ? 1 : 0)<<7;
|
|
}
|
|
g_model.switchWarningStates=i;
|
|
} else {
|
|
uint16_t i= 0;
|
|
i|=(uint16_t)ui->tswwarn0_CB->currentIndex();
|
|
if (i==1) {
|
|
ui->chkSA->setDisabled(true);
|
|
ui->chkSB->setDisabled(true);
|
|
ui->chkSC->setDisabled(true);
|
|
ui->chkSD->setDisabled(true);
|
|
ui->chkSE->setDisabled(true);
|
|
ui->chkSF->setDisabled(true);
|
|
ui->chkSG->setDisabled(true);
|
|
} else {
|
|
ui->chkSA->setEnabled(true);
|
|
ui->chkSB->setEnabled(true);
|
|
ui->chkSC->setEnabled(true);
|
|
ui->chkSD->setEnabled(true);
|
|
ui->chkSE->setEnabled(true);
|
|
ui->chkSF->setEnabled(true);
|
|
ui->chkSG->setEnabled(true);
|
|
i|=(((uint16_t)ui->chkSA->value())<<1);
|
|
i|=(((uint16_t)ui->chkSB->value())<<3);
|
|
i|=(((uint16_t)ui->chkSC->value())<<5);
|
|
i|=(((uint16_t)ui->chkSD->value())<<7);
|
|
i|=(((uint16_t)ui->chkSE->value())<<9);
|
|
i|=(((uint16_t)ui->chkSF->value())<<12);
|
|
i|=(((uint16_t)ui->chkSG->value())<<13);
|
|
}
|
|
g_model.switchWarningStates=i;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::setCurrentCurve(int curveId)
|
|
{
|
|
currentCurve = curveId;
|
|
curvesLock=true;
|
|
QString ss = "QSpinBox { background-color:rgb(255, 255, 127);}";
|
|
for (int i=0; i<g_model.curves[currentCurve].count;i++) {
|
|
spny[i]->show();
|
|
spny[i]->setValue(g_model.curves[currentCurve].points[i].y);
|
|
if (!g_model.curves[currentCurve].custom || i==0 || i==(g_model.curves[currentCurve].count-1)) {
|
|
spnx[i]->hide();
|
|
if (i==0) {
|
|
spnx[i]->setValue(-100);
|
|
}
|
|
if (i==(g_model.curves[currentCurve].count-1)) {
|
|
spnx[i]->setValue(100);
|
|
}
|
|
} else {
|
|
spnx[i]->show();
|
|
spnx[i]->setMaximum(g_model.curves[currentCurve].points[i+1].x-1);
|
|
spnx[i]->setMinimum(g_model.curves[currentCurve].points[i-1].x+1);
|
|
spnx[i]->setValue(g_model.curves[currentCurve].points[i].x);
|
|
}
|
|
}
|
|
for (int i=g_model.curves[currentCurve].count; i<17;i++) {
|
|
spny[i]->hide();
|
|
spnx[i]->hide();
|
|
}
|
|
int index=0;
|
|
if (g_model.curves[currentCurve].count==3) {
|
|
index=0;
|
|
} else if (g_model.curves[currentCurve].count==5) {
|
|
index=2;
|
|
} else if (g_model.curves[currentCurve].count==9) {
|
|
index=4;
|
|
} else if (g_model.curves[currentCurve].count==17) {
|
|
index=6;
|
|
}
|
|
if (g_model.curves[currentCurve].custom) {
|
|
index++;
|
|
}
|
|
if (!GetEepromInterface()->getCapability(HasCvNames)){
|
|
ui->cname_LE->hide();
|
|
ui->cname_label->hide();
|
|
} else {
|
|
ui->cname_LE->setText(g_model.curves[currentCurve].name);
|
|
}
|
|
|
|
ui->curvetype_CB->setCurrentIndex(index);
|
|
curvesLock=false;
|
|
}
|
|
|
|
void ModelEdit::curvePointEdited()
|
|
{
|
|
if (curvesLock) {
|
|
return;
|
|
}
|
|
/* for (int i=1; i< g_model.curves[currentCurve].count-1; i++) {
|
|
if (g_model.curves[currentCurve].points[i].x>(100-g_model.curves[currentCurve].count+i)) {
|
|
g_model.curves[currentCurve].points[i].x=(100-g_model.curves[currentCurve].count+i);
|
|
}
|
|
if (g_model.curves[currentCurve].points[i].x<=g_model.curves[currentCurve].points[i-1].x) {
|
|
spnx[i]->setValue(spnx[i-1]->value()+1);
|
|
}
|
|
}
|
|
*/
|
|
for (int i=0; i< 17; i++) {
|
|
g_model.curves[currentCurve].points[i].x=spnx[i]->value();
|
|
g_model.curves[currentCurve].points[i].y=spny[i]->value();
|
|
}
|
|
if (redrawCurve)
|
|
drawCurve();
|
|
updateSettings();
|
|
}
|
|
|
|
|
|
void ModelEdit::setSwitchWidgetVisibility(int i)
|
|
{
|
|
RawSource source=RawSource(g_model.customSw[i].val1);
|
|
switch (getCSFunctionFamily(g_model.customSw[i].func))
|
|
{
|
|
case CS_FAMILY_VOFS:
|
|
cswitchSource1[i]->setVisible(true);
|
|
cswitchSource2[i]->setVisible(false);
|
|
cswitchValue[i]->setVisible(false);
|
|
cswitchOffset[i]->setVisible(true);
|
|
populateSourceCB(cswitchSource1[i], source, POPULATE_SOURCES | (GetEepromInterface()->getCapability(ExtraTrims) ? POPULATE_TRIMS : 0) | POPULATE_SWITCHES | POPULATE_TELEMETRY | (GetEepromInterface()->getCapability(GvarsInCS) ? POPULATE_GVARS : 0));
|
|
cswitchOffset[i]->setDecimals(source.getDecimals(g_model));
|
|
cswitchOffset[i]->setSingleStep(source.getStep(g_model));
|
|
if (g_model.customSw[i].func>CS_FN_ELESS && g_model.customSw[i].func<CS_FN_VEQUAL) {
|
|
cswitchOffset[i]->setMinimum(source.getStep(g_model)*-127);
|
|
cswitchOffset[i]->setMaximum(source.getStep(g_model)*127);
|
|
cswitchOffset[i]->setValue(source.getStep(g_model)*g_model.customSw[i].val2);
|
|
} else {
|
|
cswitchOffset[i]->setMinimum(source.getMin(g_model));
|
|
cswitchOffset[i]->setMaximum(source.getMax(g_model));
|
|
cswitchOffset[i]->setValue(source.getStep(g_model)*(g_model.customSw[i].val2+source.getRawOffset(g_model))+source.getOffset(g_model));
|
|
}
|
|
break;
|
|
case CS_FAMILY_VBOOL:
|
|
cswitchSource1[i]->setVisible(true);
|
|
cswitchSource2[i]->setVisible(true);
|
|
cswitchValue[i]->setVisible(false);
|
|
cswitchOffset[i]->setVisible(false);
|
|
populateSwitchCB(cswitchSource1[i], RawSwitch(g_model.customSw[i].val1));
|
|
populateSwitchCB(cswitchSource2[i], RawSwitch(g_model.customSw[i].val2));
|
|
break;
|
|
case CS_FAMILY_VCOMP:
|
|
cswitchSource1[i]->setVisible(true);
|
|
cswitchSource2[i]->setVisible(true);
|
|
cswitchValue[i]->setVisible(false);
|
|
cswitchOffset[i]->setVisible(false);
|
|
populateSourceCB(cswitchSource1[i], RawSource(g_model.customSw[i].val1), POPULATE_SOURCES | (GetEepromInterface()->getCapability(ExtraTrims) ? POPULATE_TRIMS : 0) | POPULATE_SWITCHES | POPULATE_TELEMETRY | (GetEepromInterface()->getCapability(GvarsInCS) ? POPULATE_GVARS : 0));
|
|
populateSourceCB(cswitchSource2[i], RawSource(g_model.customSw[i].val2), POPULATE_SOURCES | (GetEepromInterface()->getCapability(ExtraTrims) ? POPULATE_TRIMS : 0) | POPULATE_SWITCHES | POPULATE_TELEMETRY | (GetEepromInterface()->getCapability(GvarsInCS) ? POPULATE_GVARS : 0));
|
|
break;
|
|
case CS_FAMILY_TIMERS:
|
|
cswitchSource1[i]->setVisible(false);
|
|
cswitchSource2[i]->setVisible(false);
|
|
cswitchValue[i]->setVisible(true);
|
|
cswitchOffset[i]->setVisible(true);
|
|
cswitchOffset[i]->setDecimals(1);
|
|
cswitchOffset[i]->setMinimum(0.1);
|
|
cswitchOffset[i]->setMaximum(175);
|
|
float value=ValToTim(g_model.customSw[i].val2);
|
|
cswitchOffset[i]->setSingleStep(0.1);
|
|
if (value>60) {
|
|
cswitchOffset[i]->setSingleStep(1);
|
|
} else if (value>2) {
|
|
cswitchOffset[i]->setSingleStep(0.5);
|
|
}
|
|
cswitchOffset[i]->setValue(value);
|
|
|
|
cswitchValue[i]->setDecimals(1);
|
|
cswitchValue[i]->setMinimum(0.1);
|
|
cswitchValue[i]->setMaximum(175);
|
|
value=ValToTim(g_model.customSw[i].val1);
|
|
cswitchValue[i]->setSingleStep(0.1);
|
|
if (value>60) {
|
|
cswitchValue[i]->setSingleStep(1);
|
|
} else if (value>2) {
|
|
cswitchValue[i]->setSingleStep(0.5);
|
|
}
|
|
cswitchValue[i]->setValue(value);
|
|
break;
|
|
}
|
|
cswitchAnd[i]->setVisible(true);
|
|
populateSwitchCB(cswitchAnd[i], RawSwitch(g_model.customSw[i].andsw), POPULATE_AND_SWITCHES);
|
|
if (GetEepromInterface()->getCapability(CustomSwitchesExt)) {
|
|
cswitchDuration[i]->setVisible(true);
|
|
cswitchDuration[i]->setValue(g_model.customSw[i].duration/2.0);
|
|
cswitchDelay[i]->setVisible(true);
|
|
cswitchDelay[i]->setValue(g_model.customSw[i].delay/2.0);
|
|
}
|
|
}
|
|
|
|
void ModelEdit::updateSwitchesTab()
|
|
{
|
|
switchEditLock = true;
|
|
int num_csw=GetEepromInterface()->getCapability(CustomSwitches);
|
|
for (int i=0; i< num_csw; i++) {
|
|
populateCSWCB(csw[i], g_model.customSw[i].func);
|
|
setSwitchWidgetVisibility(i);
|
|
}
|
|
switchEditLock = false;
|
|
}
|
|
|
|
void ModelEdit::tabCustomSwitches()
|
|
{
|
|
switchEditLock = true;
|
|
QComboBox* tmpcsw[C9X_NUM_CSW] = {ui->cswitchFunc_1, ui->cswitchFunc_2, ui->cswitchFunc_3, ui->cswitchFunc_4,
|
|
ui->cswitchFunc_5, ui->cswitchFunc_6, ui->cswitchFunc_7, ui->cswitchFunc_8,
|
|
ui->cswitchFunc_9, ui->cswitchFunc_10, ui->cswitchFunc_11, ui->cswitchFunc_12,
|
|
ui->cswitchFunc_13, ui->cswitchFunc_14, ui->cswitchFunc_15, ui->cswitchFunc_16,
|
|
ui->cswitchFunc_17, ui->cswitchFunc_18, ui->cswitchFunc_19, ui->cswitchFunc_20,
|
|
ui->cswitchFunc_21, ui->cswitchFunc_22, ui->cswitchFunc_23, ui->cswitchFunc_24,
|
|
ui->cswitchFunc_25, ui->cswitchFunc_26, ui->cswitchFunc_27, ui->cswitchFunc_28,
|
|
ui->cswitchFunc_29, ui->cswitchFunc_30, ui->cswitchFunc_31, ui->cswitchFunc_32 };
|
|
QLabel* cswlabel[C9X_NUM_CSW] = { ui->cswlabel_01, ui->cswlabel_02, ui->cswlabel_03, ui->cswlabel_04,
|
|
ui->cswlabel_05, ui->cswlabel_06, ui->cswlabel_07, ui->cswlabel_08,
|
|
ui->cswlabel_09, ui->cswlabel_10, ui->cswlabel_11, ui->cswlabel_12,
|
|
ui->cswlabel_13, ui->cswlabel_14, ui->cswlabel_15, ui->cswlabel_16,
|
|
ui->cswlabel_17, ui->cswlabel_18, ui->cswlabel_19, ui->cswlabel_20,
|
|
ui->cswlabel_21, ui->cswlabel_22, ui->cswlabel_23, ui->cswlabel_24,
|
|
ui->cswlabel_25, ui->cswlabel_26, ui->cswlabel_27, ui->cswlabel_28,
|
|
ui->cswlabel_29, ui->cswlabel_30, ui->cswlabel_31, ui->cswlabel_32};
|
|
|
|
memcpy(csw, tmpcsw, sizeof(csw));
|
|
int num_csw=GetEepromInterface()->getCapability(CustomSwitches);
|
|
for(int i=0; i<16; i++) {
|
|
if (i<num_csw) {
|
|
tmpcsw[i]->setProperty("index",i);
|
|
cswitchSource1[i] = new QComboBox(this);
|
|
cswitchSource1[i]->setProperty("index",i);
|
|
connect(cswitchSource1[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_21->addWidget(cswitchSource1[i],i+1,2);
|
|
cswitchSource1[i]->setVisible(false);
|
|
cswitchValue[i] = new QDoubleSpinBox(this);
|
|
cswitchValue[i]->setMaximum(125);
|
|
cswitchValue[i]->setMinimum(-125);
|
|
cswitchValue[i]->setAccelerated(true);
|
|
cswitchValue[i]->setDecimals(0);
|
|
cswitchValue[i]->setProperty("index",i);
|
|
connect(cswitchValue[i],SIGNAL(editingFinished()),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_21->addWidget(cswitchValue[i],i+1,2);
|
|
cswitchValue[i]->setVisible(false);
|
|
|
|
cswitchSource2[i] = new QComboBox(this);
|
|
cswitchSource2[i]->setProperty("index",i);
|
|
connect(cswitchSource2[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_21->addWidget(cswitchSource2[i],i+1,3);
|
|
cswitchSource2[i]->setVisible(false);
|
|
|
|
cswitchOffset[i] = new QDoubleSpinBox(this);
|
|
cswitchOffset[i]->setProperty("index",i);
|
|
cswitchOffset[i]->setMaximum(125);
|
|
cswitchOffset[i]->setMinimum(-125);
|
|
cswitchOffset[i]->setAccelerated(true);
|
|
cswitchOffset[i]->setDecimals(0);
|
|
connect(cswitchOffset[i],SIGNAL(editingFinished()),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_21->addWidget(cswitchOffset[i],i+1,3);
|
|
cswitchOffset[i]->setVisible(false);
|
|
cswitchAnd[i] = new QComboBox(this);
|
|
cswitchAnd[i]->setProperty("index",i);
|
|
connect(cswitchAnd[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_21->addWidget(cswitchAnd[i],i+1,4);
|
|
cswitchAnd[i]->setVisible(false);
|
|
if (GetEepromInterface()->getCapability(CustomSwitchesExt)) {
|
|
cswitchDuration[i] = new QDoubleSpinBox(this);
|
|
cswitchDuration[i]->setProperty("index",i);
|
|
cswitchDuration[i]->setSingleStep(0.5);
|
|
cswitchDuration[i]->setMaximum(50);
|
|
cswitchDuration[i]->setMinimum(0);
|
|
cswitchDuration[i]->setAccelerated(true);
|
|
cswitchDuration[i]->setDecimals(1);
|
|
connect(cswitchDuration[i],SIGNAL(editingFinished()),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_21->addWidget(cswitchDuration[i],i+1,5);
|
|
cswitchDuration[i]->setVisible(false);
|
|
|
|
cswitchDelay[i] = new QDoubleSpinBox(this);
|
|
cswitchDelay[i]->setProperty("index",i);
|
|
cswitchDelay[i]->setSingleStep(0.5);
|
|
cswitchDelay[i]->setMaximum(50);
|
|
cswitchDelay[i]->setMinimum(0);
|
|
cswitchDelay[i]->setAccelerated(true);
|
|
cswitchDelay[i]->setDecimals(1);
|
|
connect(cswitchDelay[i],SIGNAL(editingFinished()),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_21->addWidget(cswitchDelay[i],i+1,6);
|
|
cswitchDelay[i]->setVisible(false);
|
|
} else {
|
|
ui->cswCol3->hide();
|
|
ui->cswCol4->hide();
|
|
}
|
|
connect(cswlabel[i],SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(csw_customContextMenuRequested(QPoint)));
|
|
} else {
|
|
csw[i]->hide();
|
|
cswlabel[i]->hide();
|
|
}
|
|
}
|
|
if (num_csw>16) {
|
|
for(int i=16; i<32; i++) {
|
|
if (i<=num_csw) {
|
|
tmpcsw[i]->setProperty("index",i);
|
|
cswitchSource1[i] = new QComboBox(this);
|
|
cswitchSource1[i]->setProperty("index",i);
|
|
connect(cswitchSource1[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_22->addWidget(cswitchSource1[i],i-15,2);
|
|
cswitchSource1[i]->setVisible(false);
|
|
cswitchValue[i] = new QDoubleSpinBox(this);
|
|
cswitchValue[i]->setProperty("index",i);
|
|
cswitchValue[i]->setMaximum(125);
|
|
cswitchValue[i]->setMinimum(-125);
|
|
cswitchValue[i]->setAccelerated(true);
|
|
cswitchValue[i]->setDecimals(0);
|
|
connect(cswitchValue[i],SIGNAL(editingFinished()),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_22->addWidget(cswitchValue[i],i-15,2);
|
|
cswitchValue[i]->setVisible(false);
|
|
|
|
cswitchSource2[i] = new QComboBox(this);
|
|
cswitchSource2[i]->setProperty("index",i);
|
|
connect(cswitchSource2[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_22->addWidget(cswitchSource2[i],i-15,3);
|
|
cswitchSource2[i]->setVisible(false);
|
|
|
|
cswitchOffset[i] = new QDoubleSpinBox(this);
|
|
cswitchOffset[i]->setProperty("index",i);
|
|
cswitchOffset[i]->setMaximum(125);
|
|
cswitchOffset[i]->setMinimum(-125);
|
|
cswitchOffset[i]->setAccelerated(true);
|
|
cswitchOffset[i]->setDecimals(0);
|
|
connect(cswitchOffset[i],SIGNAL(editingFinished()),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_22->addWidget(cswitchOffset[i],i-15,3);
|
|
cswitchOffset[i]->setVisible(false);
|
|
cswitchAnd[i] = new QComboBox(this);
|
|
cswitchAnd[i]->setProperty("index",i);
|
|
connect(cswitchAnd[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_22->addWidget(cswitchAnd[i],i-15,4);
|
|
cswitchAnd[i]->setVisible(false);
|
|
if (GetEepromInterface()->getCapability(CustomSwitchesExt)) {
|
|
cswitchDuration[i] = new QDoubleSpinBox(this);
|
|
cswitchDuration[i]->setProperty("index",i);
|
|
cswitchDuration[i]->setSingleStep(0.5);
|
|
cswitchDuration[i]->setMaximum(50);
|
|
cswitchDuration[i]->setMinimum(0);
|
|
cswitchDuration[i]->setAccelerated(true);
|
|
cswitchDuration[i]->setDecimals(1);
|
|
connect(cswitchDuration[i],SIGNAL(editingFinished()),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_22->addWidget(cswitchDuration[i],i-15,5);
|
|
cswitchDuration[i]->setVisible(false);
|
|
|
|
cswitchDelay[i] = new QDoubleSpinBox(this);
|
|
cswitchDelay[i]->setProperty("index",i);
|
|
cswitchDelay[i]->setSingleStep(0.5);
|
|
cswitchDelay[i]->setMaximum(50);
|
|
cswitchDelay[i]->setMinimum(0);
|
|
cswitchDelay[i]->setAccelerated(true);
|
|
cswitchDelay[i]->setDecimals(1);
|
|
connect(cswitchDelay[i],SIGNAL(editingFinished()),this,SLOT(customSwitchesEdited()));
|
|
ui->gridLayout_22->addWidget(cswitchDelay[i],i-15,6);
|
|
cswitchDelay[i]->setVisible(false);
|
|
} else {
|
|
ui->cswCol3_2->hide();
|
|
ui->cswCol4_2->hide();
|
|
}
|
|
connect(cswlabel[i],SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(csw_customContextMenuRequested(QPoint)));
|
|
} else {
|
|
csw[i]->hide();
|
|
cswlabel[i]->hide();
|
|
}
|
|
}
|
|
} else {
|
|
ui->cswitchGB2->hide();
|
|
}
|
|
updateSwitchesTab();
|
|
//connects
|
|
for (int i=0; i<num_csw; i++) {
|
|
connect(csw[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customSwitchesEdited()));
|
|
}
|
|
switchEditLock = false;
|
|
}
|
|
|
|
void ModelEdit::tabCustomFunctions()
|
|
{
|
|
switchEditLock = true;
|
|
int num_fsw = GetEepromInterface()->getCapability(CustomFunctions);
|
|
|
|
QStringList paramarmList;
|
|
if (!GetEepromInterface()->getCapability(VoicesAsNumbers)) {
|
|
for (int i=0; i<num_fsw; i++) {
|
|
if (g_model.funcSw[i].func==FuncPlayPrompt || g_model.funcSw[i].func==FuncBackgroundMusic) {
|
|
QString temp = g_model.funcSw[i].paramarm;
|
|
if (!temp.isEmpty()) {
|
|
if (!paramarmList.contains(temp)) {
|
|
paramarmList.append(temp);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
QSettings settings("companion9x", "companion9x");
|
|
QString path=settings.value("sdPath", ".").toString();
|
|
path.append("/SOUNDS/");
|
|
QString lang=radioData.generalSettings.ttsLanguage;
|
|
if (lang.isEmpty())
|
|
lang="en";
|
|
path.append(lang);
|
|
QDir qd(path);
|
|
int vml= GetEepromInterface()->getCapability(VoicesMaxLength)+4;
|
|
if (qd.exists()) {
|
|
QStringList filters;
|
|
filters << "*.wav" << "*.WAV";
|
|
foreach ( QString file, qd.entryList(filters, QDir::Files) ) {
|
|
QFileInfo fi(file);
|
|
QString temp=fi.completeBaseName();
|
|
if (!paramarmList.contains(temp) && temp.length()<=vml) {
|
|
paramarmList.append(temp);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i=0; i<num_fsw; i++) {
|
|
AssignFunc func = g_model.funcSw[i].func;
|
|
QGridLayout *layout = i >= 16 ? ui->fswitchlayout2 : ui->fswitchlayout1;
|
|
|
|
fswLabel[i] = new QLabel(this);
|
|
fswLabel[i]->setFrameStyle(QFrame::Panel | QFrame::Raised);
|
|
fswLabel[i]->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Fixed);
|
|
fswLabel[i]->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
fswLabel[i]->setMouseTracking(true);
|
|
fswLabel[i]->setProperty("FunctionId", i+1);
|
|
fswLabel[i]->setText(tr("CF%1").arg(i+1));
|
|
layout->addWidget(fswLabel[i],(i%16)+1,0);
|
|
connect(fswLabel[i],SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(fsw_customContextMenuRequested(QPoint)));
|
|
|
|
fswtchSwtch[i] = new QComboBox(this);
|
|
fswtchSwtch[i]->setProperty("functionIndex", i);
|
|
connect(fswtchSwtch[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customFunctionEdited()));
|
|
layout->addWidget(fswtchSwtch[i],(i%16)+1,1);
|
|
populateSwitchCB(fswtchSwtch[i], g_model.funcSw[i].swtch, POPULATE_MSWITCHES|POPULATE_ONOFF);
|
|
|
|
fswtchFunc[i] = new QComboBox(this);
|
|
fswtchFunc[i]->setProperty("functionIndex", i);
|
|
connect(fswtchFunc[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customFunctionEdited()));
|
|
layout->addWidget(fswtchFunc[i],(i%16)+1,2);
|
|
populateFuncCB(fswtchFunc[i], g_model.funcSw[i].func);
|
|
|
|
QHBoxLayout *paramLayout = new QHBoxLayout();
|
|
layout->addLayout(paramLayout, (i%16)+1, 3);
|
|
|
|
fswtchGVmode[i] = new QComboBox(this);
|
|
fswtchGVmode[i]->setProperty("functionIndex", i);
|
|
connect(fswtchGVmode[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customFunctionEdited()));
|
|
paramLayout->addWidget(fswtchGVmode[i]);
|
|
populateGVmodeCB(fswtchGVmode[i], g_model.funcSw[i].adjustMode);
|
|
|
|
fswtchParamGV[i] = new QCheckBox(this);
|
|
fswtchParamGV[i]->setProperty("functionIndex", i);
|
|
fswtchParamGV[i]->setText("GV");
|
|
fswtchParamGV[i]->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
|
|
connect(fswtchParamGV[i],SIGNAL(stateChanged(int)),this,SLOT(customFunctionEdited()));
|
|
paramLayout->addWidget(fswtchParamGV[i]);
|
|
|
|
fswtchParam[i] = new QDoubleSpinBox(this);
|
|
fswtchParam[i]->setProperty("functionIndex", i);
|
|
fswtchParam[i]->setAccelerated(true);
|
|
fswtchParam[i]->setDecimals(0);
|
|
connect(fswtchParam[i],SIGNAL(editingFinished()),this,SLOT(customFunctionEdited()));
|
|
paramLayout->addWidget(fswtchParam[i]);
|
|
|
|
fswtchParamT[i] = new QComboBox(this);
|
|
fswtchParamT[i]->setProperty("functionIndex", i);
|
|
paramLayout->addWidget(fswtchParamT[i]);
|
|
populateFuncParamCB(fswtchParamT[i], func, g_model.funcSw[i].param, g_model.funcSw[i].adjustMode);
|
|
connect(fswtchParamT[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customFunctionEdited()));
|
|
|
|
fswtchParamArmT[i] = new QComboBox(this);
|
|
fswtchParamArmT[i]->setProperty("functionIndex", i);
|
|
populateFuncParamArmTCB(fswtchParamArmT[i],&g_model, g_model.funcSw[i].paramarm, paramarmList);
|
|
fswtchParamArmT[i]->setEditable(true);
|
|
paramLayout->addWidget(fswtchParamArmT[i]);
|
|
|
|
connect(fswtchParamArmT[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customFunctionEdited()));
|
|
connect(fswtchParamArmT[i],SIGNAL(editTextChanged ( const QString)),this,SLOT(customFunctionEdited()));
|
|
|
|
#ifdef PHONON
|
|
playBT[i] = new QPushButton(this);
|
|
playBT[i]->setObjectName(QString("play_%1").arg(i));
|
|
playBT[i]->setIcon(QIcon(":/images/play.png"));
|
|
paramLayout->addWidget(playBT[i]);
|
|
connect(playBT[i],SIGNAL(pressed()),this,SLOT(playMusic()));
|
|
#endif
|
|
|
|
QHBoxLayout *repeatLayout = new QHBoxLayout();
|
|
layout->addLayout(repeatLayout, (i%16)+1, 4);
|
|
|
|
fswtchRepeat[i] = new QComboBox(this);
|
|
fswtchRepeat[i]->setProperty("functionIndex", i);
|
|
connect(fswtchRepeat[i],SIGNAL(currentIndexChanged(int)),this,SLOT(customFunctionEdited()));
|
|
repeatLayout->addWidget(fswtchRepeat[i],(i%16)+1);
|
|
populateRepeatCB(fswtchRepeat[i], g_model.funcSw[i].repeatParam);
|
|
|
|
fswtchEnable[i] = new QCheckBox(this);
|
|
fswtchEnable[i]->setProperty("functionIndex", i);
|
|
fswtchEnable[i]->setText(tr("ON"));
|
|
repeatLayout->addWidget(fswtchEnable[i],(i%16)+1);
|
|
fswtchEnable[i]->setChecked(g_model.funcSw[i].enabled);
|
|
connect(fswtchEnable[i],SIGNAL(stateChanged(int)),this,SLOT(customFunctionEdited()));
|
|
|
|
refreshCustomFunction(i);
|
|
}
|
|
|
|
if (num_fsw <= 16) {
|
|
ui->FSwitchGB2->hide();
|
|
}
|
|
|
|
switchEditLock = false;
|
|
}
|
|
|
|
void ModelEdit::tabSafetySwitches()
|
|
{
|
|
for(int i=0; i<NUM_SAFETY_CHNOUT; i++)
|
|
{
|
|
safetySwitchSwtch[i] = new QComboBox(this);
|
|
populateSwitchCB(safetySwitchSwtch[i],g_model.safetySw[i].swtch);
|
|
ui->grid_tabSafetySwitches->addWidget(safetySwitchSwtch[i],i+1,1);
|
|
connect(safetySwitchSwtch[i],SIGNAL(currentIndexChanged(int)),this,SLOT(safetySwitchesEdited()));
|
|
|
|
safetySwitchValue[i] = new QSpinBox(this);
|
|
safetySwitchValue[i]->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
|
safetySwitchValue[i]->setMaximum(125);
|
|
safetySwitchValue[i]->setMinimum(-125);
|
|
safetySwitchValue[i]->setAccelerated(true);
|
|
safetySwitchValue[i]->setValue(g_model.safetySw[i].val);
|
|
ui->grid_tabSafetySwitches->addWidget(safetySwitchValue[i],i+1,2);
|
|
connect(safetySwitchValue[i],SIGNAL(editingFinished()),this,SLOT(safetySwitchesEdited()));
|
|
}
|
|
}
|
|
|
|
void ModelEdit::customFieldEdited()
|
|
{
|
|
if (telemetryLock) return;
|
|
int cols=GetEepromInterface()->getCapability(TelemetryColsCSFields);
|
|
if (cols==0) cols=2;
|
|
|
|
for (int i=0; i<GetEepromInterface()->getCapability(TelemetryCSFields); i++) {
|
|
int screen=i/(4*cols);
|
|
int r=((i%(4*cols))%4);
|
|
int c=((i%(4*cols))/4);
|
|
if (g_model.frsky.screens[screen].type==0) {
|
|
g_model.frsky.screens[screen].body.lines[r].source[c]=csf[i]->currentIndex();
|
|
}
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::customSwitchesEdited()
|
|
{
|
|
if(switchEditLock) return;
|
|
|
|
switchEditLock = true;
|
|
int i=-1;
|
|
QString indextext=sender()->property("index").toString();
|
|
if (!indextext.isEmpty()) {
|
|
i=indextext.toInt();
|
|
} else {
|
|
// should not happen
|
|
switchEditLock = false;
|
|
return;
|
|
}
|
|
bool chAr;
|
|
float value, step;
|
|
int newval;
|
|
chAr = (getCSFunctionFamily(g_model.customSw[i].func) != getCSFunctionFamily(csw[i]->itemData(csw[i]->currentIndex()).toInt()));
|
|
g_model.customSw[i].func = csw[i]->itemData(csw[i]->currentIndex()).toInt();
|
|
if(chAr) {
|
|
if (getCSFunctionFamily(g_model.customSw[i].func)==CS_FAMILY_TIMERS) {
|
|
g_model.customSw[i].val1 = -119;
|
|
g_model.customSw[i].val2 = -119;
|
|
} else {
|
|
g_model.customSw[i].val1 = 0;
|
|
g_model.customSw[i].val2 = 0;
|
|
}
|
|
g_model.customSw[i].andsw = 0;
|
|
setSwitchWidgetVisibility(i);
|
|
}
|
|
if (GetEepromInterface()->getCapability(CustomSwitchesExt)) {
|
|
g_model.customSw[i].duration= (uint8_t)round(cswitchDuration[i]->value()*2);
|
|
g_model.customSw[i].delay= (uint8_t)round(cswitchDelay[i]->value()*2);
|
|
}
|
|
RawSource source;
|
|
switch (getCSFunctionFamily(g_model.customSw[i].func))
|
|
{
|
|
case (CS_FAMILY_VOFS):
|
|
if (g_model.customSw[i].val1 != cswitchSource1[i]->itemData(cswitchSource1[i]->currentIndex()).toInt()) {
|
|
source=RawSource(g_model.customSw[i].val1);
|
|
g_model.customSw[i].val1 = cswitchSource1[i]->itemData(cswitchSource1[i]->currentIndex()).toInt();
|
|
RawSource newSource = RawSource(g_model.customSw[i].val1);
|
|
if (newSource.type == SOURCE_TYPE_TELEMETRY) {
|
|
if (g_model.customSw[i].func>CS_FN_ELESS && g_model.customSw[i].func<CS_FN_VEQUAL) {
|
|
g_model.customSw[i].val2 = 0;
|
|
} else {
|
|
g_model.customSw[i].val2 = -128;
|
|
}
|
|
} else {
|
|
if (g_model.customSw[i].func>CS_FN_ELESS && g_model.customSw[i].func<CS_FN_VEQUAL) {
|
|
g_model.customSw[i].val2 = (cswitchOffset[i]->value()/source.getStep(g_model));
|
|
} else {
|
|
g_model.customSw[i].val2 = ((cswitchOffset[i]->value()-source.getOffset(g_model))/source.getStep(g_model))-source.getRawOffset(g_model);
|
|
}
|
|
}
|
|
setSwitchWidgetVisibility(i);
|
|
} else {
|
|
source=RawSource(g_model.customSw[i].val1);
|
|
if (g_model.customSw[i].func>CS_FN_ELESS && g_model.customSw[i].func<CS_FN_VEQUAL) {
|
|
g_model.customSw[i].val2 = (cswitchOffset[i]->value()/source.getStep(g_model));
|
|
cswitchOffset[i]->setValue(g_model.customSw[i].val2*source.getStep(g_model));
|
|
} else {
|
|
g_model.customSw[i].val2 = ((cswitchOffset[i]->value()-source.getOffset(g_model))/source.getStep(g_model))-source.getRawOffset(g_model);
|
|
cswitchOffset[i]->setValue((g_model.customSw[i].val2 +source.getRawOffset(g_model))*source.getStep(g_model)+source.getOffset(g_model));
|
|
}
|
|
}
|
|
break;
|
|
case (CS_FAMILY_TIMERS): {
|
|
value=cswitchOffset[i]->value();
|
|
newval=TimToVal(value);
|
|
if (newval>g_model.customSw[i].val2) {
|
|
if (value >=60) {
|
|
value=round(value);
|
|
step=1;
|
|
} else if (value>=2) {
|
|
value=(round(value*2.0)/2);
|
|
step=0.5;
|
|
} else {
|
|
step=0.1;
|
|
}
|
|
} else {
|
|
if (value <=2) {
|
|
step=0.1;
|
|
} else if (value<=60) {
|
|
value=(round(value*2.0)/2);
|
|
step=0.5;
|
|
} else {
|
|
value=round(value);
|
|
step=1;
|
|
}
|
|
}
|
|
g_model.customSw[i].val2=TimToVal(value);
|
|
value=ValToTim(g_model.customSw[i].val2);
|
|
cswitchOffset[i]->setValue(value);
|
|
cswitchOffset[i]->setSingleStep(step);
|
|
|
|
value=cswitchValue[i]->value();
|
|
newval=TimToVal(value);
|
|
if (newval>g_model.customSw[i].val1) {
|
|
if (value >=60) {
|
|
value=round(value);
|
|
step=1;
|
|
} else if (value>=2) {
|
|
value=(round(value*2.0)/2);
|
|
step=0.5;
|
|
} else {
|
|
step=0.1;
|
|
}
|
|
} else {
|
|
if (value <=2) {
|
|
step=0.1;
|
|
} else if (value<=60) {
|
|
value=(round(value*2.0)/2);
|
|
step=0.5;
|
|
} else {
|
|
value=round(value);
|
|
step=1;
|
|
}
|
|
}
|
|
g_model.customSw[i].val1=TimToVal(value);
|
|
value=ValToTim(g_model.customSw[i].val1);
|
|
cswitchValue[i]->setValue(value);
|
|
cswitchValue[i]->setSingleStep(step);
|
|
break;
|
|
}
|
|
case (CS_FAMILY_VBOOL):
|
|
case (CS_FAMILY_VCOMP):
|
|
g_model.customSw[i].val1 = cswitchSource1[i]->itemData(cswitchSource1[i]->currentIndex()).toInt();
|
|
g_model.customSw[i].val2 = cswitchSource2[i]->itemData(cswitchSource2[i]->currentIndex()).toInt();
|
|
break;
|
|
}
|
|
g_model.customSw[i].andsw = cswitchAnd[i]->itemData(cswitchAnd[i]->currentIndex()).toInt();
|
|
updateSettings();
|
|
switchEditLock = false;
|
|
}
|
|
|
|
#ifdef PHONON
|
|
|
|
void ModelEdit::mediaPlayer_state(Phonon::State newState, Phonon::State oldState)
|
|
{
|
|
if (phononLock)
|
|
return;
|
|
phononLock=true;
|
|
if ((newState==Phonon::StoppedState || newState==Phonon::PausedState) && oldState==Phonon::PlayingState) {
|
|
clickObject->stop();
|
|
clickObject->clearQueue();
|
|
clickObject->clear();
|
|
for (int i=0; i<GetEepromInterface()->getCapability(CustomFunctions); i++) {
|
|
playBT[i]->setObjectName(QString("play_%1").arg(i));
|
|
playBT[i]->setIcon(QIcon(":/images/play.png"));
|
|
}
|
|
}
|
|
if (newState==Phonon::ErrorState) {
|
|
clickObject->stop();
|
|
clickObject->clearQueue();
|
|
clickObject->clear();
|
|
for (int i=0; i<GetEepromInterface()->getCapability(CustomFunctions); i++) {
|
|
playBT[i]->setObjectName(QString("play_%1").arg(i));
|
|
playBT[i]->setIcon(QIcon(":/images/play.png"));
|
|
}
|
|
}
|
|
|
|
phononLock=false;
|
|
}
|
|
#endif
|
|
|
|
void ModelEdit::playMusic()
|
|
{
|
|
QPushButton *playButton = qobject_cast<QPushButton*>(sender());
|
|
int index=playButton->objectName().mid(5,2).toInt();
|
|
QString function=playButton->objectName().left(4);
|
|
QSettings settings("companion9x", "companion9x");
|
|
QString path=settings.value("sdPath", ".").toString();
|
|
QDir qd(path);
|
|
QString track;
|
|
if (qd.exists()) {
|
|
if (GetEepromInterface()->getCapability(VoicesAsNumbers)) {
|
|
track=path+QString("/%1.wav").arg(int(fswtchParam[index]->value()),4,10,(const QChar)'0');
|
|
} else {
|
|
path.append("/SOUNDS/");
|
|
QString lang=radioData.generalSettings.ttsLanguage;
|
|
if (lang.isEmpty())
|
|
lang="en";
|
|
path.append(lang);
|
|
if (fswtchParamArmT[index]->currentText()!="----") {
|
|
track=path+"/"+fswtchParamArmT[index]->currentText()+".wav";
|
|
}
|
|
}
|
|
QFile file(track);
|
|
if (!file.exists()) {
|
|
QMessageBox::critical(this, tr("Error"), tr("Unable to find sound file %1!").arg(track));
|
|
track.clear();
|
|
}
|
|
#ifdef PHONON
|
|
if (function=="play" && !track.isEmpty()) {
|
|
clickObject->clear();
|
|
clickObject->setCurrentSource(Phonon::MediaSource(track));
|
|
clickObject->play();
|
|
playBT[index]->setObjectName(QString("stop_%1").arg(index));
|
|
playBT[index]->setIcon(QIcon(":/images/stop.png"));
|
|
} else {
|
|
clickObject->stop();
|
|
clickObject->clear();
|
|
playBT[index]->setObjectName(QString("play_%1").arg(index));
|
|
playBT[index]->setIcon(QIcon(":/images/play.png"));
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#define CUSTOM_FUNCTION_NUMERIC_PARAM (1<<0)
|
|
#define CUSTOM_FUNCTION_SOURCE_PARAM (1<<1)
|
|
#define CUSTOM_FUNCTION_FILE_PARAM (1<<2)
|
|
#define CUSTOM_FUNCTION_GV_MODE (1<<3)
|
|
#define CUSTOM_FUNCTION_GV_TOOGLE (1<<4)
|
|
#define CUSTOM_FUNCTION_ENABLE (1<<5)
|
|
#define CUSTOM_FUNCTION_REPEAT (1<<6)
|
|
#define CUSTOM_FUNCTION_PLAY (1<<7)
|
|
|
|
void ModelEdit::customFunctionEdited()
|
|
{
|
|
if (switchEditLock) return;
|
|
switchEditLock = true;
|
|
|
|
int index = sender()->property("functionIndex").toInt();
|
|
refreshCustomFunction(index, true);
|
|
|
|
updateSettings();
|
|
switchEditLock = false;
|
|
}
|
|
|
|
void ModelEdit::refreshCustomFunction(int i, bool modified)
|
|
{
|
|
unsigned int widgetsMask = 0;
|
|
if (modified) {
|
|
g_model.funcSw[i].swtch = RawSwitch(fswtchSwtch[i]->itemData(fswtchSwtch[i]->currentIndex()).toInt());
|
|
g_model.funcSw[i].func = (AssignFunc)fswtchFunc[i]->currentIndex();
|
|
g_model.funcSw[i].enabled =fswtchEnable[i]->isChecked();
|
|
g_model.funcSw[i].repeatParam = (AssignFunc)fswtchRepeat[i]->currentIndex();
|
|
g_model.funcSw[i].adjustMode = (AssignFunc)fswtchGVmode[i]->currentIndex();
|
|
}
|
|
|
|
int index = fswtchFunc[i]->currentIndex();
|
|
|
|
if (index>=FuncSafetyCh1 && index<=FuncSafetyCh16) {
|
|
fswtchParam[i]->setDecimals(0);
|
|
fswtchParam[i]->setSingleStep(1);
|
|
fswtchParam[i]->setMinimum(-125);
|
|
fswtchParam[i]->setMaximum(125);
|
|
if (modified) {
|
|
g_model.funcSw[i].param = fswtchParam[i]->value();
|
|
}
|
|
fswtchParam[i]->setValue(g_model.funcSw[i].param);
|
|
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM + CUSTOM_FUNCTION_ENABLE;
|
|
} else if (index==FuncLogs) {
|
|
fswtchParam[i]->setDecimals(1);
|
|
fswtchParam[i]->setMinimum(0);
|
|
fswtchParam[i]->setMaximum(25.5);
|
|
fswtchParam[i]->setSingleStep(0.1);
|
|
if (modified) g_model.funcSw[i].param = fswtchParam[i]->value()*10.0;
|
|
fswtchParam[i]->setValue(g_model.funcSw[i].param/10.0);
|
|
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM + CUSTOM_FUNCTION_ENABLE;
|
|
} else if (index>=FuncAdjustGV1 && index<=FuncAdjustGV5) {
|
|
if (modified) g_model.funcSw[i].adjustMode = fswtchGVmode[i]->currentIndex();
|
|
widgetsMask |= CUSTOM_FUNCTION_GV_MODE + CUSTOM_FUNCTION_ENABLE;
|
|
if (g_model.funcSw[i].adjustMode==0) {
|
|
if (modified) g_model.funcSw[i].param = fswtchParam[i]->value();
|
|
fswtchParam[i]->setDecimals(0);
|
|
fswtchParam[i]->setSingleStep(1);
|
|
fswtchParam[i]->setMinimum(-125);
|
|
fswtchParam[i]->setMaximum(125);
|
|
fswtchParam[i]->setValue(g_model.funcSw[i].param);
|
|
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM;
|
|
} else {
|
|
if (modified) g_model.funcSw[i].param = fswtchParamT[i]->itemData(fswtchParamT[i]->currentIndex()).toInt();
|
|
populateFuncParamCB(fswtchParamT[i], index, g_model.funcSw[i].param, g_model.funcSw[i].adjustMode);
|
|
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
|
|
}
|
|
} else if (index==FuncReset) {
|
|
if (modified) g_model.funcSw[i].param = (uint8_t)fswtchParamT[i]->currentIndex();
|
|
populateFuncParamCB(fswtchParamT[i], index, g_model.funcSw[i].param);
|
|
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
|
|
} else if (index==FuncVolume) {
|
|
if (modified) g_model.funcSw[i].param = fswtchParamT[i]->itemData(fswtchParamT[i]->currentIndex()).toInt();
|
|
populateFuncParamCB(fswtchParamT[i], index, g_model.funcSw[i].param);
|
|
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM + CUSTOM_FUNCTION_ENABLE;
|
|
} else if (index==FuncPlaySound || index==FuncPlayHaptic || index==FuncPlayValue || index==FuncPlayPrompt || index==FuncPlayBoth || index==FuncBackgroundMusic) {
|
|
if (modified) g_model.funcSw[i].repeatParam = fswtchRepeat[i]->itemData(fswtchRepeat[i]->currentIndex()).toInt();
|
|
if (index != FuncBackgroundMusic) {
|
|
if (GetEepromInterface()->getCapability(HasFuncRepeat)) {
|
|
widgetsMask |= CUSTOM_FUNCTION_REPEAT;
|
|
}
|
|
}
|
|
if (index==FuncPlayValue) {
|
|
if (modified) g_model.funcSw[i].param = fswtchParamT[i]->itemData(fswtchParamT[i]->currentIndex()).toInt();
|
|
populateFuncParamCB(fswtchParamT[i], index, g_model.funcSw[i].param);
|
|
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM + CUSTOM_FUNCTION_REPEAT;
|
|
} else if (index==FuncPlayPrompt || index==FuncPlayBoth) {
|
|
if (GetEepromInterface()->getCapability(VoicesAsNumbers)) {
|
|
fswtchParam[i]->setDecimals(0);
|
|
fswtchParam[i]->setSingleStep(1);
|
|
fswtchParam[i]->setMinimum(0);
|
|
if (index==FuncPlayPrompt) {
|
|
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM + CUSTOM_FUNCTION_REPEAT + CUSTOM_FUNCTION_GV_TOOGLE;
|
|
} else {
|
|
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM + CUSTOM_FUNCTION_REPEAT;
|
|
fswtchParamGV[i]->setChecked(false);
|
|
}
|
|
fswtchParam[i]->setMaximum(index==FuncPlayBoth ? 254 : 255);
|
|
if (modified) {
|
|
if (fswtchParamGV[i]->isChecked()) {
|
|
fswtchParam[i]->setMinimum(1);
|
|
g_model.funcSw[i].param = std::min(fswtchParam[i]->value(),5.0)+(fswtchParamGV[i]->isChecked() ? 250 : 0);
|
|
} else {
|
|
g_model.funcSw[i].param = fswtchParam[i]->value();
|
|
}
|
|
}
|
|
if (g_model.funcSw[i].param>250 && (index!=FuncPlayBoth)) {
|
|
fswtchParamGV[i]->setChecked(true);
|
|
fswtchParam[i]->setValue(g_model.funcSw[i].param-250);
|
|
fswtchParam[i]->setMaximum(5);
|
|
} else {
|
|
fswtchParamGV[i]->setChecked(false);
|
|
fswtchParam[i]->setValue(g_model.funcSw[i].param);
|
|
}
|
|
if (g_model.funcSw[i].param < 251)
|
|
widgetsMask |= CUSTOM_FUNCTION_PLAY;
|
|
} else {
|
|
widgetsMask |= CUSTOM_FUNCTION_FILE_PARAM;
|
|
if (modified) {
|
|
memset(g_model.funcSw[i].paramarm, 0, sizeof(g_model.funcSw[i].paramarm));
|
|
int vml=GetEepromInterface()->getCapability(VoicesMaxLength);
|
|
if (fswtchParamArmT[i]->currentText() != "----") {
|
|
widgetsMask |= CUSTOM_FUNCTION_PLAY;
|
|
for (int j=0; j<std::min(fswtchParamArmT[i]->currentText().length(),vml); j++) {
|
|
g_model.funcSw[i].paramarm[j] = fswtchParamArmT[i]->currentText().toAscii().at(j);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if (index==FuncBackgroundMusic) {
|
|
widgetsMask |= CUSTOM_FUNCTION_FILE_PARAM;
|
|
if (modified) {
|
|
memset(g_model.funcSw[i].paramarm, 0, sizeof(g_model.funcSw[i].paramarm));
|
|
int vml=GetEepromInterface()->getCapability(VoicesMaxLength);
|
|
if (fswtchParamArmT[i]->currentText() != "----") {
|
|
widgetsMask |= CUSTOM_FUNCTION_PLAY;
|
|
for (int j=0; j<std::min(fswtchParamArmT[i]->currentText().length(),vml); j++) {
|
|
g_model.funcSw[i].paramarm[j] = fswtchParamArmT[i]->currentText().toAscii().at(j);
|
|
}
|
|
}
|
|
}
|
|
} else if (index==FuncPlaySound) {
|
|
if (modified) g_model.funcSw[i].param = (uint8_t)fswtchParamT[i]->currentIndex();
|
|
populateFuncParamCB(fswtchParamT[i], index, g_model.funcSw[i].param);
|
|
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
|
|
} else if (index==FuncPlayHaptic) {
|
|
if (modified) g_model.funcSw[i].param = (uint8_t)fswtchParamT[i]->currentIndex();
|
|
populateFuncParamCB(fswtchParamT[i], index, g_model.funcSw[i].param);
|
|
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
|
|
}
|
|
} else if (g_model.funcSw[i].swtch.type!=SWITCH_TYPE_NONE) {
|
|
if (modified) g_model.funcSw[i].param = fswtchParam[i]->value();
|
|
fswtchParam[i]->setDecimals(0);
|
|
fswtchParam[i]->setSingleStep(1);
|
|
fswtchParam[i]->setValue(g_model.funcSw[i].param);
|
|
if (index<=FuncInstantTrim) {
|
|
widgetsMask |= CUSTOM_FUNCTION_ENABLE;
|
|
}
|
|
}
|
|
|
|
fswtchParam[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_NUMERIC_PARAM);
|
|
fswtchParamGV[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_GV_TOOGLE);
|
|
fswtchParamT[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_SOURCE_PARAM);
|
|
fswtchParamArmT[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_FILE_PARAM);
|
|
fswtchEnable[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_ENABLE);
|
|
if (!(widgetsMask & CUSTOM_FUNCTION_ENABLE)) fswtchEnable[i]->setChecked(false);
|
|
fswtchRepeat[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_REPEAT);
|
|
fswtchGVmode[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_GV_MODE);
|
|
#ifdef PHONON
|
|
playBT[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_PLAY);
|
|
#endif
|
|
}
|
|
|
|
void ModelEdit::tabTelemetry()
|
|
{
|
|
QSettings settings("companion9x", "companion9x");
|
|
QString firmware_id = settings.value("firmware", default_firmware_variant.id).toString();
|
|
float a1ratio;
|
|
float a2ratio;
|
|
|
|
QGroupBox* barsgb[3] = { ui->CS1Bars, ui->CS2Bars, ui->CS3Bars };
|
|
QGroupBox* numsgb[3] = { ui->CS1Nums, ui->CS2Nums, ui->CS3Nums };
|
|
|
|
QComboBox* barscb[12] = { ui->telBarCS1B1_CB, ui->telBarCS1B2_CB, ui->telBarCS1B3_CB, ui->telBarCS1B4_CB,
|
|
ui->telBarCS2B1_CB, ui->telBarCS2B2_CB, ui->telBarCS2B3_CB, ui->telBarCS2B4_CB,
|
|
ui->telBarCS3B1_CB, ui->telBarCS3B2_CB, ui->telBarCS3B3_CB, ui->telBarCS3B4_CB};
|
|
QDoubleSpinBox* minsb[12] = { ui->telMinCS1SB1, ui->telMinCS1SB2, ui->telMinCS1SB3, ui->telMinCS1SB4,
|
|
ui->telMinCS2SB1, ui->telMinCS2SB2, ui->telMinCS2SB3, ui->telMinCS2SB4,
|
|
ui->telMinCS3SB1, ui->telMinCS3SB2, ui->telMinCS3SB3, ui->telMinCS3SB4};
|
|
QDoubleSpinBox* maxsb[12] = { ui->telMaxCS1SB1, ui->telMaxCS1SB2, ui->telMaxCS1SB3, ui->telMaxCS1SB4,
|
|
ui->telMaxCS2SB1, ui->telMaxCS2SB2, ui->telMaxCS2SB3, ui->telMaxCS2SB4,
|
|
ui->telMaxCS3SB1, ui->telMaxCS3SB2, ui->telMaxCS3SB3, ui->telMaxCS3SB4};
|
|
QComboBox* tmp[36] = { ui->telemetryCS1F1_CB, ui->telemetryCS1F2_CB, ui->telemetryCS1F3_CB, ui->telemetryCS1F4_CB, ui->telemetryCS1F5_CB, ui->telemetryCS1F6_CB, ui->telemetryCS1F7_CB, ui->telemetryCS1F8_CB, ui->telemetryCS1F9_CB, ui->telemetryCS1F10_CB, ui->telemetryCS1F11_CB, ui->telemetryCS1F12_CB,
|
|
ui->telemetryCS2F1_CB, ui->telemetryCS2F2_CB, ui->telemetryCS2F3_CB, ui->telemetryCS2F4_CB, ui->telemetryCS2F5_CB, ui->telemetryCS2F6_CB, ui->telemetryCS2F7_CB, ui->telemetryCS2F8_CB, ui->telemetryCS2F9_CB, ui->telemetryCS2F10_CB, ui->telemetryCS2F11_CB, ui->telemetryCS2F12_CB,
|
|
ui->telemetryCS3F1_CB, ui->telemetryCS3F2_CB, ui->telemetryCS3F3_CB, ui->telemetryCS3F4_CB, ui->telemetryCS3F5_CB, ui->telemetryCS3F6_CB, ui->telemetryCS3F7_CB, ui->telemetryCS3F8_CB, ui->telemetryCS3F9_CB, ui->telemetryCS3F10_CB, ui->telemetryCS3F11_CB, ui->telemetryCS3F12_CB};
|
|
|
|
memcpy(barsGB, barsgb, sizeof(barsGB));
|
|
memcpy(numsGB, numsgb, sizeof(numsGB));
|
|
memcpy(barsCB, barscb, sizeof(barsCB));
|
|
memcpy(maxSB, maxsb, sizeof(maxSB));
|
|
memcpy(minSB, minsb, sizeof(minSB));
|
|
memcpy(csf, tmp, sizeof(csf));
|
|
|
|
telemetryLock=true;
|
|
ui->telemetryCSType1->setCurrentIndex(g_model.frsky.screens[0].type);
|
|
ui->telemetryCSType2->setCurrentIndex(g_model.frsky.screens[1].type);
|
|
ui->telemetryCSType3->setCurrentIndex(g_model.frsky.screens[2].type);
|
|
|
|
for (int i=0; i<3; i++) {
|
|
bool isNum = (g_model.frsky.screens[i].type==0);
|
|
barsGB[i]->setVisible(!isNum);
|
|
numsGB[i]->setVisible(isNum);
|
|
}
|
|
|
|
connect(ui->telemetryCSType1,SIGNAL(currentIndexChanged(int)),this,SLOT(ScreenTypeCBcurrentIndexChanged(int)));
|
|
connect(ui->telemetryCSType2,SIGNAL(currentIndexChanged(int)),this,SLOT(ScreenTypeCBcurrentIndexChanged(int)));
|
|
connect(ui->telemetryCSType3,SIGNAL(currentIndexChanged(int)),this,SLOT(ScreenTypeCBcurrentIndexChanged(int)));
|
|
|
|
//frsky Settings
|
|
if (!GetEepromInterface()->getCapability(TelemetryRSSIModel) ) {
|
|
ui->RSSIGB->hide();
|
|
}
|
|
ui->rssiAlarm1SB->setValue(g_model.frsky.rssiAlarms[0].value);
|
|
ui->rssiAlarm2SB->setValue(g_model.frsky.rssiAlarms[1].value);
|
|
ui->rssiAlarm1CB->setCurrentIndex(g_model.frsky.rssiAlarms[0].level);
|
|
ui->rssiAlarm2CB->setCurrentIndex(g_model.frsky.rssiAlarms[1].level);
|
|
|
|
if (!GetEepromInterface()->getCapability(HasAltitudeSel)) {
|
|
ui->AltitudeGPS_ChkB->hide();
|
|
} else {
|
|
ui->AltitudeGPS_ChkB->setChecked(g_model.frsky.FrSkyGpsAlt);
|
|
}
|
|
int varioCap=GetEepromInterface()->getCapability(HasVario);
|
|
// if (IS_TARANIS(GetEepromInterface()->getBoard())) {
|
|
if (false) {
|
|
ui->AltitudeToolbar_ChkB->setChecked(g_model.frsky.altitudeDisplayed);
|
|
} else {
|
|
ui->AltitudeToolbar_ChkB->hide();
|
|
}
|
|
if (!varioCap) {
|
|
ui->varioLimitMax_DSB->hide();
|
|
ui->varioLimitMinOff_ChkB->hide();
|
|
ui->varioLimitMin_DSB->hide();
|
|
ui->varioLimitCenterMin_DSB->hide();
|
|
ui->varioLimitCenterMax_DSB->hide();
|
|
ui->varioLimit_label->hide();
|
|
ui->VarioLabel_1->hide();
|
|
ui->VarioLabel_2->hide();
|
|
ui->VarioLabel_3->hide();
|
|
ui->VarioLabel_4->hide();
|
|
ui->varioSourceCB->hide();
|
|
ui->varioSource_label->hide();
|
|
} else {
|
|
if (!GetEepromInterface()->getCapability(HasVarioSink)) {
|
|
ui->varioLimitMinOff_ChkB->hide();
|
|
ui->varioLimitMin_DSB->hide();
|
|
ui->varioLimitCenterMin_DSB->hide();
|
|
ui->VarioLabel_1->hide();
|
|
ui->VarioLabel_2->hide();
|
|
}
|
|
ui->varioLimitMin_DSB->setValue(g_model.frsky.varioMin-10);
|
|
ui->varioLimitMax_DSB->setValue(g_model.frsky.varioMax+10);
|
|
ui->varioLimitCenterMax_DSB->setValue((g_model.frsky.varioCenterMax/10.0)+0.5);
|
|
ui->varioSourceCB->setCurrentIndex(g_model.frsky.varioSource);
|
|
if (g_model.frsky.varioCenterMin==-16) {
|
|
ui->varioLimitMinOff_ChkB->setChecked(true);
|
|
ui->varioLimitCenterMin_DSB->setValue(-2.0);
|
|
ui->varioLimitCenterMin_DSB->setDisabled(true);
|
|
} else {
|
|
ui->varioLimitMinOff_ChkB->setChecked(false);
|
|
ui->varioLimitCenterMin_DSB->setValue((g_model.frsky.varioCenterMin/10.0)-0.5);
|
|
}
|
|
int mask=1;
|
|
for (int i=0; i< ui->varioSourceCB->count(); i++) {
|
|
if (!(varioCap&mask)) {
|
|
QModelIndex index = ui->varioSourceCB->model()->index(i, 0);
|
|
QVariant v(0);
|
|
ui->varioSourceCB->model()->setData(index, v, Qt::UserRole - 1);
|
|
}
|
|
mask <<=1;
|
|
}
|
|
}
|
|
|
|
if (!(GetEepromInterface()->getCapability(HasAltitudeSel)||GetEepromInterface()->getCapability(HasVario))) {
|
|
ui->altimetryGB->hide();
|
|
}
|
|
if (GetEepromInterface()->getCapability(NoTelemetryProtocol)) {
|
|
g_model.frsky.usrProto=1;
|
|
ui->frskyProtoCB->setDisabled(true);
|
|
} else {
|
|
ui->frskyProtoCB->setEnabled(true);
|
|
}
|
|
|
|
if (GetEepromInterface()->getCapability(TelemetryCSFields)==0) {
|
|
ui->groupBox_5->hide();
|
|
} else {
|
|
if (GetEepromInterface()->getCapability(TelemetryCSFields)==8) {
|
|
ui->tabCsView->removeTab(1);
|
|
ui->tabCsView->removeTab(2);
|
|
}
|
|
if (GetEepromInterface()->getCapability(TelemetryCSFields)==16) {
|
|
ui->tabCsView->removeTab(2);
|
|
}
|
|
int cols=GetEepromInterface()->getCapability(TelemetryColsCSFields);
|
|
if (cols==0) cols=2;
|
|
for (int screen=0; screen<(GetEepromInterface()->getCapability(TelemetryCSFields)/(4*cols)); screen++) {
|
|
for (int c=0; c<cols; c++) {
|
|
for (int r=0; r<4; r++) {
|
|
int index=screen*12+c*4+r;
|
|
if (g_model.frsky.screens[screen].type==0) {
|
|
populateCustomScreenFieldCB(csf[index], g_model.frsky.screens[screen].body.lines[r].source[c], (r<4), g_model.frsky.usrProto);
|
|
} else {
|
|
populateCustomScreenFieldCB(csf[index], 0, (r<4), g_model.frsky.usrProto);
|
|
}
|
|
connect(csf[index],SIGNAL(currentIndexChanged(int)),this,SLOT(customFieldEdited()));
|
|
}
|
|
}
|
|
for (int c=cols; c<3; c++) {
|
|
for (int r=0; r<4; r++) {
|
|
int index=screen*12+c*4+r;
|
|
csf[index]->hide();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!GetEepromInterface()->getCapability(TelemetryUnits)) {
|
|
ui->frskyUnitsCB->setDisabled(true);
|
|
int index=0;
|
|
if (firmware_id.contains("imperial")) {
|
|
index=1;
|
|
}
|
|
ui->frskyUnitsCB->setCurrentIndex(index);
|
|
}
|
|
if ((GetEepromInterface()->getCapability(Telemetry)&TM_HASWSHH)) {
|
|
ui->frskyProtoCB->addItem(tr("Winged Shadow How High"));
|
|
} else {
|
|
ui->frskyProtoCB->addItem(tr("Winged Shadow How High (not supported)"));
|
|
}
|
|
ui->a1UnitCB->setCurrentIndex(g_model.frsky.channels[0].type);
|
|
if (g_model.frsky.channels[0].type==0 || g_model.frsky.channels[0].type==1 || g_model.frsky.channels[0].type==2) {
|
|
a1ratio=(g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier)/10.0;
|
|
ui->a1RatioSB->setDecimals(1);
|
|
ui->a1RatioSB->setMaximum(25.5*GetEepromInterface()->getCapability(TelemetryMaxMultiplier));
|
|
} else {
|
|
a1ratio=g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier;
|
|
ui->a1RatioSB->setDecimals(0);
|
|
ui->a1RatioSB->setMaximum(255*GetEepromInterface()->getCapability(TelemetryMaxMultiplier));
|
|
}
|
|
ui->a1RatioSB->setValue(a1ratio);
|
|
|
|
updateA1Fields();
|
|
|
|
if (g_model.frsky.channels[1].type==0 || g_model.frsky.channels[1].type==1 || g_model.frsky.channels[1].type==2) {
|
|
a2ratio=(g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier)/10.0;
|
|
ui->a2RatioSB->setDecimals(1);
|
|
ui->a2RatioSB->setMaximum(25.5*GetEepromInterface()->getCapability(TelemetryMaxMultiplier));
|
|
} else {
|
|
a2ratio=g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier;
|
|
ui->a2RatioSB->setDecimals(0);
|
|
ui->a2RatioSB->setMaximum(255*GetEepromInterface()->getCapability(TelemetryMaxMultiplier));
|
|
}
|
|
ui->a2RatioSB->setValue(a2ratio);
|
|
updateA2Fields();
|
|
|
|
ui->a11LevelCB->setCurrentIndex(g_model.frsky.channels[0].alarms[0].level);
|
|
ui->a11GreaterCB->setCurrentIndex(g_model.frsky.channels[0].alarms[0].greater);
|
|
ui->a12LevelCB->setCurrentIndex(g_model.frsky.channels[0].alarms[1].level);
|
|
ui->a12GreaterCB->setCurrentIndex(g_model.frsky.channels[0].alarms[1].greater);
|
|
ui->a2UnitCB->setCurrentIndex(g_model.frsky.channels[1].type);
|
|
ui->a21LevelCB->setCurrentIndex(g_model.frsky.channels[1].alarms[0].level);
|
|
ui->a21GreaterCB->setCurrentIndex(g_model.frsky.channels[1].alarms[0].greater);
|
|
ui->a22LevelCB->setCurrentIndex(g_model.frsky.channels[1].alarms[1].level);
|
|
ui->a22GreaterCB->setCurrentIndex(g_model.frsky.channels[1].alarms[1].greater);
|
|
if (!(GetEepromInterface()->getCapability(Telemetry)&TM_HASOFFSET)) {
|
|
ui->a1CalibSB->hide();
|
|
ui->a2CalibSB->hide();
|
|
ui->a1CalibLabel->hide();
|
|
ui->a2CalibLabel->hide();
|
|
} else {
|
|
ui->label_A1Max->setText(tr("Range"));
|
|
ui->label_A2Max->setText(tr("Range"));
|
|
}
|
|
ui->frskyProtoCB->setCurrentIndex(g_model.frsky.usrProto);
|
|
ui->frskyUnitsCB->setCurrentIndex(g_model.frsky.imperial);
|
|
ui->frskyBladesCB->setCurrentIndex(g_model.frsky.blades);
|
|
ui->frskyCurrentCB->setCurrentIndex(g_model.frsky.currentSource);
|
|
ui->frskyVoltCB->setCurrentIndex(g_model.frsky.voltsSource);
|
|
|
|
for (int screen=0; screen<2;screen++) {
|
|
for (int rows=0; rows<4; rows++) {
|
|
for (int cols=0; cols<3; cols++) {
|
|
int index=screen*12+cols*4+rows;
|
|
populateCustomScreenFieldCB(csf[index], g_model.frsky.screens[screen].body.lines[rows].source[cols], (rows<4), g_model.frsky.usrProto);
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int j=0; j<12; j++) {
|
|
int screen = j/4;
|
|
int field = j%4;
|
|
populateCustomScreenFieldCB(barsCB[j], g_model.frsky.screens[screen].body.bars[field].source, false, g_model.frsky.usrProto);
|
|
switch (g_model.frsky.screens[screen].body.bars[field].source-1) {
|
|
case TELEMETRY_SOURCE_TX_BATT:
|
|
case TELEMETRY_SOURCE_A1:
|
|
case TELEMETRY_SOURCE_A1_MIN:
|
|
case TELEMETRY_SOURCE_A2:
|
|
case TELEMETRY_SOURCE_A2_MIN:
|
|
case TELEMETRY_SOURCE_CELLS_SUM:
|
|
case TELEMETRY_SOURCE_VFAS:
|
|
case TELEMETRY_SOURCE_CURRENT_MAX:
|
|
case TELEMETRY_SOURCE_CURRENT:
|
|
minsb[j]->setDecimals(1);
|
|
maxsb[j]->setDecimals(1);
|
|
break;
|
|
case TELEMETRY_SOURCE_CELL:
|
|
minsb[j]->setDecimals(2);
|
|
maxsb[j]->setDecimals(2);
|
|
break;
|
|
default:
|
|
minsb[j]->setDecimals(0);
|
|
maxsb[j]->setDecimals(0);
|
|
}
|
|
minsb[j]->setMinimum(getBarValue(g_model.frsky.screens[screen].body.bars[field].source, 0, &g_model.frsky));
|
|
minsb[j]->setMaximum(getBarValue(g_model.frsky.screens[screen].body.bars[field].source, 255, &g_model.frsky));
|
|
minsb[j]->setSingleStep(getBarStep(g_model.frsky.screens[screen].body.bars[field].source));
|
|
minsb[j]->setValue(getBarValue(g_model.frsky.screens[screen].body.bars[field].source, g_model.frsky.screens[screen].body.bars[field].barMin, &g_model.frsky));
|
|
maxsb[j]->setMinimum(getBarValue(g_model.frsky.screens[screen].body.bars[field].source, 0, &g_model.frsky));
|
|
maxsb[j]->setMaximum(getBarValue(g_model.frsky.screens[screen].body.bars[field].source, 255, &g_model.frsky));
|
|
maxsb[j]->setSingleStep(getBarStep(g_model.frsky.screens[screen].body.bars[field].source));
|
|
maxsb[j]->setValue(getBarValue(g_model.frsky.screens[screen].body.bars[field].source, (255-g_model.frsky.screens[screen].body.bars[field].barMax), &g_model.frsky));
|
|
|
|
if (g_model.frsky.screens[screen].body.bars[field].source==0 || g_model.frsky.screens[screen].type==0) {
|
|
minsb[j]->setDisabled(true);
|
|
maxsb[j]->setDisabled(true);
|
|
}
|
|
connect(barsCB[j],SIGNAL(currentIndexChanged(int)),this,SLOT(telBarCBcurrentIndexChanged(int)));
|
|
connect(maxSB[j],SIGNAL(editingFinished()),this,SLOT(telMaxSBeditingFinished()));
|
|
connect(minSB[j],SIGNAL(editingFinished()),this,SLOT(telMinSBeditingFinished()));
|
|
}
|
|
telemetryLock=false;
|
|
}
|
|
|
|
void ModelEdit::updateA1Fields()
|
|
{
|
|
float a1ratio,a11value, a12value;
|
|
if (g_model.frsky.channels[0].ratio==0) {
|
|
ui->a11ValueSB->setMinimum(0);
|
|
ui->a11ValueSB->setMaximum(0);
|
|
ui->a12ValueSB->setMinimum(0);
|
|
ui->a12ValueSB->setMaximum(0);
|
|
ui->a1CalibSB->setMinimum(0);
|
|
ui->a1CalibSB->setMaximum(0);
|
|
ui->a1CalibSB->setValue(0);
|
|
ui->a11ValueSB->setValue(0);
|
|
ui->a12ValueSB->setValue(0);
|
|
return;
|
|
}
|
|
|
|
if (g_model.frsky.channels[0].type==0 || g_model.frsky.channels[0].type==1 || g_model.frsky.channels[0].type==2) {
|
|
a1ratio=(g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier)/10.0;
|
|
ui->a11ValueSB->setDecimals(2);
|
|
ui->a11ValueSB->setSingleStep(a1ratio/255.0);
|
|
ui->a12ValueSB->setDecimals(2);
|
|
ui->a12ValueSB->setSingleStep(a1ratio/255.0);
|
|
ui->a11ValueSB->setMinimum((g_model.frsky.channels[0].ratio*1.0*g_model.frsky.channels[0].offset)/2550.0);
|
|
ui->a11ValueSB->setMaximum(a1ratio+(g_model.frsky.channels[0].ratio*1.0*g_model.frsky.channels[0].offset)/2550.0);
|
|
ui->a12ValueSB->setMinimum((g_model.frsky.channels[0].offset*1.0*g_model.frsky.channels[0].ratio)/2550.0);
|
|
ui->a12ValueSB->setMaximum(a1ratio+(g_model.frsky.channels[0].offset*1.0*g_model.frsky.channels[0].ratio)/2550.0);
|
|
} else {
|
|
a1ratio=g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier;
|
|
ui->a11ValueSB->setDecimals(2);
|
|
ui->a11ValueSB->setSingleStep(a1ratio/255.0);
|
|
ui->a12ValueSB->setDecimals(2);
|
|
ui->a12ValueSB->setSingleStep(a1ratio/255.0);
|
|
ui->a11ValueSB->setMinimum((g_model.frsky.channels[0].offset*1.0*g_model.frsky.channels[0].ratio)/255.0);
|
|
ui->a11ValueSB->setMaximum(a1ratio+(g_model.frsky.channels[0].offset*1.0*g_model.frsky.channels[0].ratio)/255.0);
|
|
ui->a12ValueSB->setMinimum((g_model.frsky.channels[0].offset*1.0*g_model.frsky.channels[0].ratio)/255.0);
|
|
ui->a12ValueSB->setMaximum(a1ratio+(g_model.frsky.channels[0].offset*1.0*g_model.frsky.channels[0].ratio)/255.0);
|
|
}
|
|
ui->a1CalibSB->setDecimals(2);
|
|
ui->a1CalibSB->setMaximum((a1ratio*127)/255.0);
|
|
ui->a1CalibSB->setMinimum((-a1ratio*128)/255.0);
|
|
ui->a1CalibSB->setSingleStep(a1ratio/255.0);
|
|
ui->a1CalibSB->setValue((g_model.frsky.channels[0].offset*a1ratio)/255);
|
|
a11value=a1ratio*(g_model.frsky.channels[0].alarms[0].value/255.0+g_model.frsky.channels[0].offset/255.0);
|
|
a12value=a1ratio*(g_model.frsky.channels[0].alarms[1].value/255.0+g_model.frsky.channels[0].offset/255.0);;
|
|
ui->a11ValueSB->setValue(a11value);
|
|
ui->a12ValueSB->setValue(a12value);
|
|
}
|
|
|
|
void ModelEdit::updateA2Fields()
|
|
{
|
|
float a2ratio,a21value, a22value;
|
|
if (g_model.frsky.channels[1].ratio==0) {
|
|
ui->a21ValueSB->setMinimum(0);
|
|
ui->a21ValueSB->setMaximum(0);
|
|
ui->a22ValueSB->setMinimum(0);
|
|
ui->a22ValueSB->setMaximum(0);
|
|
ui->a2CalibSB->setMinimum(0);
|
|
ui->a2CalibSB->setMaximum(0);
|
|
ui->a2CalibSB->setValue(0);
|
|
ui->a21ValueSB->setValue(0);
|
|
ui->a22ValueSB->setValue(0);
|
|
return;
|
|
}
|
|
if (g_model.frsky.channels[1].type==0) {
|
|
a2ratio=g_model.frsky.channels[1].ratio/10.0;
|
|
ui->a21ValueSB->setDecimals(2);
|
|
ui->a21ValueSB->setSingleStep(a2ratio/255.0);
|
|
ui->a22ValueSB->setDecimals(2);
|
|
ui->a22ValueSB->setSingleStep(a2ratio/255.0);
|
|
ui->a21ValueSB->setMinimum((g_model.frsky.channels[1].offset*1.0*g_model.frsky.channels[1].ratio)/2550.0);
|
|
ui->a21ValueSB->setMaximum(a2ratio+(g_model.frsky.channels[1].offset*1.0*g_model.frsky.channels[1].ratio)/2550.0);
|
|
ui->a22ValueSB->setMinimum((g_model.frsky.channels[1].offset*1.0*g_model.frsky.channels[1].ratio*1.0)/2550.0);
|
|
ui->a22ValueSB->setMaximum(a2ratio+(g_model.frsky.channels[1].offset*1.0*g_model.frsky.channels[1].ratio)/2550.0);
|
|
} else {
|
|
a2ratio=g_model.frsky.channels[1].ratio;
|
|
ui->a21ValueSB->setDecimals(2);
|
|
ui->a21ValueSB->setSingleStep(a2ratio/255.0);
|
|
ui->a22ValueSB->setDecimals(2);
|
|
ui->a22ValueSB->setSingleStep(a2ratio/255.0);
|
|
ui->a21ValueSB->setMinimum((g_model.frsky.channels[1].offset*1.0*g_model.frsky.channels[1].ratio)/255.0);
|
|
ui->a21ValueSB->setMaximum(a2ratio+(g_model.frsky.channels[1].offset*1.0*g_model.frsky.channels[1].ratio)/255.0);
|
|
ui->a22ValueSB->setMinimum((g_model.frsky.channels[1].offset*1.0*g_model.frsky.channels[1].ratio)/255.0);
|
|
ui->a22ValueSB->setMaximum(a2ratio+(g_model.frsky.channels[1].offset*1.0*g_model.frsky.channels[1].ratio)/255.0);
|
|
}
|
|
ui->a2CalibSB->setDecimals(2);
|
|
ui->a2CalibSB->setMaximum((a2ratio*127)/255.0);
|
|
ui->a2CalibSB->setMinimum((-a2ratio*128)/255.0);
|
|
ui->a2CalibSB->setSingleStep(a2ratio/255.0);
|
|
ui->a2CalibSB->setValue((g_model.frsky.channels[1].offset*a2ratio)/255.0);
|
|
a21value=a2ratio*(g_model.frsky.channels[1].alarms[0].value/255.0+g_model.frsky.channels[1].offset/255.0);
|
|
a22value=a2ratio*(g_model.frsky.channels[1].alarms[1].value/255.0+g_model.frsky.channels[1].offset/255.0);
|
|
ui->a21ValueSB->setValue(a21value);
|
|
ui->a22ValueSB->setValue(a22value);
|
|
}
|
|
|
|
void ModelEdit::tabTemplates()
|
|
{
|
|
ui->templateList->clear();
|
|
ui->templateList->addItem(tr("Simple 4-CH"));
|
|
ui->templateList->addItem(tr("T-Cut"));
|
|
ui->templateList->addItem(tr("Sticky T-Cut"));
|
|
ui->templateList->addItem(tr("V-Tail"));
|
|
ui->templateList->addItem(tr("Elevon\\Delta"));
|
|
ui->templateList->addItem(tr("Heli Setup"));
|
|
ui->templateList->addItem(tr("Heli Setup with gyro gain control"));
|
|
ui->templateList->addItem(tr("Gyro gain control"));
|
|
ui->templateList->addItem(tr("Heli Setup (Futaba's channel assignment style)"));
|
|
ui->templateList->addItem(tr("Heli Setup with gyro gain control (Futaba's channel assignment style)"));
|
|
ui->templateList->addItem(tr("Gyro gain control (Futaba's channel assignment style)"));
|
|
ui->templateList->addItem(tr("Servo Test"));
|
|
ui->templateList->addItem(tr("MultiCopter"));
|
|
ui->templateList->addItem(tr("Use Model Config Wizard"));
|
|
}
|
|
|
|
void ModelEdit::on_modelNameLE_editingFinished()
|
|
{
|
|
int length=ui->modelNameLE->maxLength();
|
|
strncpy(g_model.name, ui->modelNameLE->text().toAscii(), length);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_modelImage_CB_currentIndexChanged(int index)
|
|
{
|
|
if (modelImageLock)
|
|
return;
|
|
strncpy(g_model.bitmap, ui->modelImage_CB->currentText().toAscii(), GetEepromInterface()->getCapability(VoicesMaxLength));
|
|
QSettings settings("companion9x", "companion9x");
|
|
QString path=settings.value("sdPath", ".").toString();
|
|
path.append("/BMP/");
|
|
QDir qd(path);
|
|
if (qd.exists()) {
|
|
QString fileName=path;
|
|
fileName.append(g_model.bitmap);
|
|
fileName.append(".bmp");
|
|
QImage image(fileName);
|
|
if (image.isNull()) {
|
|
fileName=path;
|
|
fileName.append(g_model.bitmap);
|
|
fileName.append(".BMP");
|
|
image.load(fileName);
|
|
}
|
|
if (!image.isNull()) {
|
|
ui->modelImage_image->setPixmap(QPixmap::fromImage(image.scaled( 64,32)));;
|
|
} else {
|
|
ui->modelImage_image->clear();
|
|
}
|
|
} else {
|
|
ui->modelImage_image->clear();
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseName_editingFinished()
|
|
{
|
|
QLineEdit *lineEdit = qobject_cast<QLineEdit*>(sender());
|
|
int phase = lineEdit->objectName().mid(5,1).toInt();
|
|
QString PhaseName=lineEdit->text();
|
|
QString TabName;
|
|
if (phase==0) {
|
|
TabName.append(QObject::tr("Flight Mode 0 (Default)"));
|
|
} else {
|
|
TabName.append(QObject::tr("FM %1").arg(phase));
|
|
}
|
|
|
|
if (!PhaseName.isEmpty()) {
|
|
TabName.append(" (");
|
|
TabName.append(PhaseName);
|
|
TabName.append(")");
|
|
}
|
|
ui->phases->setTabText(phase,TabName);
|
|
int length=lineEdit->maxLength();
|
|
strncpy(g_model.phaseData[phase].name, lineEdit->text().toAscii(), length);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseSwitch_currentIndexChanged()
|
|
{
|
|
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
|
|
int phase = comboBox->objectName().mid(5,1).toInt();
|
|
g_model.phaseData[phase].swtch = RawSwitch(comboBox->itemData(comboBox->currentIndex()).toInt());
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseFadeIn_editingFinished()
|
|
{
|
|
QDoubleSpinBox *spinBox = qobject_cast<QDoubleSpinBox*>(sender());
|
|
int phase = spinBox->objectName().mid(5,1).toInt();
|
|
int scale=GetEepromInterface()->getCapability(SlowScale);
|
|
g_model.phaseData[phase].fadeIn = round(spinBox->value()*scale);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseFadeOut_editingFinished()
|
|
{
|
|
QDoubleSpinBox *spinBox = qobject_cast<QDoubleSpinBox*>(sender());
|
|
int phase = spinBox->objectName().mid(5,1).toInt();
|
|
int scale=GetEepromInterface()->getCapability(SlowScale);
|
|
g_model.phaseData[phase].fadeOut = round(spinBox->value()*scale);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer1ModeCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.timers[0].mode = TimerMode(ui->timer1ModeCB->itemData(index).toInt());
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer1DirCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.timers[0].dir = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer1ValTE_editingFinished()
|
|
{
|
|
g_model.timers[0].val = ui->timer1ValTE->time().minute()*60 + ui->timer1ValTE->time().second();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer1ModeBCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.timers[0].modeB = ui->timer1ModeBCB->itemData(index).toInt();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer2ModeCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.timers[1].mode = TimerMode(ui->timer2ModeCB->itemData(index).toInt());
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer2DirCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.timers[1].dir = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer2ValTE_editingFinished()
|
|
{
|
|
g_model.timers[1].val = ui->timer2ValTE->time().minute()*60 + ui->timer2ValTE->time().second();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_timer2ModeBCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.timers[1].modeB = ui->timer2ModeBCB->itemData(index).toInt();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_trimIncCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.trimInc = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_ttraceCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.thrTraceSrc = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_pulsePolCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.moduleData[0].ppmPulsePol = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_pulsePolCB_2_currentIndexChanged(int index)
|
|
{
|
|
g_model.moduleData[1].ppmPulsePol = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_pulsePolCB_3_currentIndexChanged(int index)
|
|
{
|
|
g_model.moduleData[2].ppmPulsePol = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_protocolCB_currentIndexChanged(int index)
|
|
{
|
|
if (!protocolEditLock) {
|
|
protocolEditLock=true;
|
|
|
|
g_model.moduleData[0].protocol=(Protocol)ui->protocolCB->itemData(index).toInt();
|
|
int protocol=g_model.moduleData[0].protocol;
|
|
// g_model.protocol = (Protocol)index;
|
|
if (protocol==PXX_XJT_D8 || protocol==OFF) {
|
|
ui->FSGB_1->hide();
|
|
} else {
|
|
ui->fsm1CB->setCurrentIndex(g_model.moduleData[0].failsafeMode);
|
|
on_fsm1CB_currentIndexChanged(g_model.moduleData[0].failsafeMode);
|
|
ui->FSGB_1->show();
|
|
}
|
|
updateSettings();
|
|
|
|
ui->ppmDelaySB->setEnabled(!protocol);
|
|
ui->numChannelsSB->setEnabled(!protocol);
|
|
|
|
if (GetEepromInterface()->getCapability(HasPPMStart)) {
|
|
ui->numChannelsSB->setSingleStep(1);
|
|
} else {
|
|
ui->numChannelsSB->setSingleStep(2);
|
|
}
|
|
|
|
switch (protocol) {
|
|
case OFF:
|
|
ui->label_PPM->hide();
|
|
ui->ppmDelaySB->hide();
|
|
ui->label_PPMCH->hide();
|
|
ui->label_pulsePol->hide();
|
|
ui->pulsePolCB->hide();
|
|
ui->numChannelsSB->hide();
|
|
ui->label_ppmFrameLength->hide();
|
|
ui->ppmFrameLengthDSB->hide();
|
|
ui->label_DSM->hide();
|
|
ui->DSM_Type->hide();
|
|
ui->label_PXX->hide();
|
|
ui->pxxRxNum->hide();
|
|
ui->label_numChannelsStart->hide();
|
|
ui->numChannelsStart->hide();
|
|
break;
|
|
case PXX_XJT_X16:
|
|
case PXX_XJT_D8:
|
|
case PXX_XJT_LR12:
|
|
case PXX_DJT:
|
|
ui->label_PPM->hide();
|
|
ui->ppmDelaySB->hide();
|
|
ui->ppmDelaySB->setEnabled(false);
|
|
ui->label_PPMCH->show();
|
|
ui->label_pulsePol->hide();
|
|
ui->pulsePolCB->hide();
|
|
ui->numChannelsSB->show();
|
|
ui->numChannelsSB->setEnabled(true);
|
|
ui->label_ppmFrameLength->hide();
|
|
ui->ppmFrameLengthDSB->hide();
|
|
ui->ppmFrameLengthDSB->setEnabled(false);
|
|
ui->label_DSM->hide();
|
|
ui->DSM_Type->hide();
|
|
ui->DSM_Type->setEnabled(false);
|
|
ui->label_PXX->show();
|
|
ui->pxxRxNum->setMinimum(0);
|
|
ui->pxxRxNum->show();
|
|
ui->pxxRxNum->setEnabled(true);
|
|
ui->pxxRxNum->setValue((g_model.moduleData[0].channelsCount-8)/2+1);
|
|
ui->label_numChannelsStart->show();
|
|
ui->numChannelsStart->show();
|
|
ui->numChannelsStart->setValue(g_model.moduleData[0].channelsStart+1);
|
|
ui->numChannelsSB->setMinimum(g_model.moduleData[0].channelsStart+4);
|
|
ui->numChannelsSB->setValue(g_model.moduleData[0].channelsStart+g_model.moduleData[0].channelsCount);
|
|
break;
|
|
case LP45:
|
|
case DSM2:
|
|
case DSMX:
|
|
ui->label_pulsePol->hide();
|
|
ui->pulsePolCB->hide();
|
|
ui->label_PPM->hide();
|
|
ui->ppmDelaySB->hide();
|
|
ui->ppmDelaySB->setEnabled(false);
|
|
ui->label_PPMCH->hide();
|
|
ui->label_numChannelsStart->hide();
|
|
ui->numChannelsStart->hide();
|
|
ui->numChannelsSB->hide();
|
|
ui->numChannelsSB->setEnabled(false);
|
|
ui->label_ppmFrameLength->hide();
|
|
ui->ppmFrameLengthDSB->hide();
|
|
ui->ppmFrameLengthDSB->setEnabled(false);
|
|
if (!GetEepromInterface()->getCapability(DSM2Indexes)) {
|
|
ui->label_PXX->hide();
|
|
ui->pxxRxNum->hide();
|
|
ui->pxxRxNum->setEnabled(false);
|
|
}
|
|
else {
|
|
ui->pxxRxNum->setMinimum(0);
|
|
ui->pxxRxNum->setValue(g_model.modelId);
|
|
ui->label_PXX->show();
|
|
ui->pxxRxNum->show();
|
|
ui->pxxRxNum->setEnabled(true);
|
|
}
|
|
ui->DSM_Type->setEnabled(false);
|
|
ui->label_DSM->hide();
|
|
ui->DSM_Type->hide();
|
|
break;
|
|
default:
|
|
if (GetEepromInterface()->getCapability(HasPPMStart)) {
|
|
ui->label_numChannelsStart->show();
|
|
ui->numChannelsStart->show();
|
|
}
|
|
else {
|
|
ui->label_numChannelsStart->hide();
|
|
ui->numChannelsStart->hide();
|
|
}
|
|
ui->numChannelsStart->setValue(g_model.moduleData[0].channelsStart+1);
|
|
ui->numChannelsSB->setMinimum(g_model.moduleData[0].channelsStart+4);
|
|
ui->numChannelsSB->setValue(g_model.moduleData[0].channelsStart + g_model.moduleData[0].channelsCount);
|
|
ui->label_pulsePol->show();
|
|
ui->pulsePolCB->show();
|
|
ui->label_DSM->hide();
|
|
ui->DSM_Type->hide();
|
|
ui->DSM_Type->setEnabled(false);
|
|
ui->label_PXX->hide();
|
|
ui->pxxRxNum->hide();
|
|
ui->pxxRxNum->setEnabled(false);
|
|
ui->label_PPM->show();
|
|
ui->ppmDelaySB->show();
|
|
ui->ppmDelaySB->setEnabled(true);
|
|
ui->label_PPMCH->show();
|
|
ui->numChannelsSB->show();
|
|
ui->numChannelsSB->setEnabled(true);
|
|
ui->ppmFrameLengthDSB->setEnabled(true);
|
|
ui->ppmFrameLengthDSB->setMinimum(g_model.moduleData[0].channelsCount*(g_model.extendedLimits ? 2.250 :2)+3.5);
|
|
if (GetEepromInterface()->getCapability(PPMExtCtrl)) {
|
|
ui->ppmFrameLengthDSB->show();
|
|
ui->label_ppmFrameLength->show();
|
|
}
|
|
|
|
break;
|
|
}
|
|
protocolEditLock=false;
|
|
}
|
|
}
|
|
|
|
void ModelEdit::on_protocolCB_2_currentIndexChanged(int index)
|
|
{
|
|
if (!protocol2EditLock) {
|
|
protocol2EditLock=true;
|
|
|
|
g_model.moduleData[1].protocol=(Protocol)ui->protocolCB_2->itemData(index).toInt();
|
|
int protocol=g_model.moduleData[1].protocol;
|
|
if (protocol==PXX_XJT_X16 || protocol==PXX_XJT_LR12) {
|
|
ui->FSGB_2->show();
|
|
ui->fsm2CB->setCurrentIndex(g_model.moduleData[1].failsafeMode);
|
|
on_fsm2CB_currentIndexChanged(g_model.moduleData[1].failsafeMode);
|
|
} else {
|
|
ui->FSGB_2->hide();
|
|
}
|
|
// g_model.protocol = (Protocol)index;
|
|
updateSettings();
|
|
|
|
ui->ppmDelaySB_2->setEnabled(!protocol);
|
|
ui->numChannelsSB_2->setEnabled(!protocol);
|
|
|
|
if (GetEepromInterface()->getCapability(HasPPMStart)) {
|
|
ui->numChannelsSB_2->setSingleStep(1);
|
|
} else {
|
|
ui->numChannelsSB_2->setSingleStep(2);
|
|
}
|
|
|
|
switch (protocol) {
|
|
case OFF:
|
|
ui->label_PPM_2->hide();
|
|
ui->ppmDelaySB_2->hide();
|
|
ui->label_PPMCH_2->hide();
|
|
ui->label_pulsePol_2->hide();
|
|
ui->pulsePolCB_2->hide();
|
|
ui->numChannelsSB_2->hide();
|
|
ui->label_ppmFrameLength_2->hide();
|
|
ui->ppmFrameLengthDSB_2->hide();
|
|
ui->label_DSM_2->hide();
|
|
ui->DSM_Type_2->hide();
|
|
ui->label_PXX_2->hide();
|
|
ui->pxxRxNum_2->hide();
|
|
ui->label_numChannelsStart_2->hide();
|
|
ui->numChannelsStart_2->hide();
|
|
break;
|
|
case PXX_XJT_X16:
|
|
case PXX_XJT_D8:
|
|
case PXX_XJT_LR12:
|
|
case PXX_DJT:
|
|
ui->label_PPM_2->hide();
|
|
ui->ppmDelaySB_2->hide();
|
|
ui->ppmDelaySB_2->setEnabled(false);
|
|
ui->label_PPMCH_2->show();
|
|
ui->label_pulsePol_2->hide();
|
|
ui->pulsePolCB_2->hide();
|
|
ui->numChannelsSB_2->show();
|
|
ui->numChannelsSB_2->setEnabled(true);
|
|
ui->label_ppmFrameLength_2->hide();
|
|
ui->ppmFrameLengthDSB_2->hide();
|
|
ui->ppmFrameLengthDSB_2->setEnabled(false);
|
|
ui->label_DSM_2->hide();
|
|
ui->DSM_Type_2->hide();
|
|
ui->DSM_Type_2->setEnabled(false);
|
|
ui->label_PXX_2->show();
|
|
ui->pxxRxNum_2->setMinimum(0);
|
|
ui->pxxRxNum_2->show();
|
|
ui->pxxRxNum_2->setEnabled(true);
|
|
ui->pxxRxNum_2->setValue(g_model.modelId);
|
|
ui->label_numChannelsStart_2->show();
|
|
ui->numChannelsStart_2->show();
|
|
ui->numChannelsStart_2->setValue(g_model.moduleData[1].channelsStart+1);
|
|
ui->numChannelsSB_2->setMinimum(g_model.moduleData[1].channelsStart+4);
|
|
ui->numChannelsSB_2->setValue(g_model.moduleData[1].channelsStart+g_model.moduleData[1].channelsCount);
|
|
break;
|
|
case LP45:
|
|
case DSM2:
|
|
case DSMX:
|
|
ui->label_pulsePol_2->hide();
|
|
ui->pulsePolCB_2->hide();
|
|
ui->label_PPM_2->hide();
|
|
ui->ppmDelaySB_2->hide();
|
|
ui->ppmDelaySB_2->setEnabled(false);
|
|
ui->label_PPMCH_2->hide();
|
|
ui->numChannelsSB_2->hide();
|
|
ui->numChannelsSB_2->setEnabled(false);
|
|
ui->label_ppmFrameLength_2->hide();
|
|
ui->ppmFrameLengthDSB_2->hide();
|
|
ui->ppmFrameLengthDSB_2->setEnabled(false);
|
|
if (!GetEepromInterface()->getCapability(DSM2Indexes)) {
|
|
ui->label_PXX_2->hide();
|
|
ui->pxxRxNum_2->hide();
|
|
ui->pxxRxNum_2->setEnabled(false);
|
|
} else {
|
|
ui->pxxRxNum_2->setMinimum(0);
|
|
ui->pxxRxNum_2->setValue(g_model.modelId);
|
|
ui->label_PXX_2->show();
|
|
ui->pxxRxNum_2->show();
|
|
ui->pxxRxNum_2->setEnabled(true);
|
|
}
|
|
ui->DSM_Type_2->setEnabled(false);
|
|
ui->label_DSM_2->hide();
|
|
ui->DSM_Type_2->hide();
|
|
break;
|
|
default:
|
|
if (GetEepromInterface()->getCapability(HasPPMStart)) {
|
|
ui->label_numChannelsStart_2->show();
|
|
ui->numChannelsStart_2->show();
|
|
} else {
|
|
ui->label_numChannelsStart_2->hide();
|
|
ui->numChannelsStart_2->hide();
|
|
}
|
|
ui->numChannelsStart_2->setValue(g_model.moduleData[1].channelsStart+1);
|
|
ui->numChannelsSB_2->setMinimum(g_model.moduleData[1].channelsStart+4);
|
|
ui->numChannelsSB_2->setValue(g_model.moduleData[1].channelsStart+g_model.moduleData[1].channelsCount);
|
|
ui->label_pulsePol_2->show();
|
|
ui->pulsePolCB_2->show();
|
|
ui->pulsePolCB_2->setCurrentIndex(g_model.moduleData[1].ppmPulsePol);
|
|
ui->label_DSM_2->hide();
|
|
ui->DSM_Type_2->hide();
|
|
ui->DSM_Type_2->setEnabled(false);
|
|
ui->label_PXX_2->hide();
|
|
ui->pxxRxNum_2->hide();
|
|
ui->pxxRxNum_2->setEnabled(false);
|
|
ui->label_PPM_2->show();
|
|
ui->ppmDelaySB_2->show();
|
|
ui->ppmDelaySB_2->setEnabled(true);
|
|
ui->ppmDelaySB_2->setValue(g_model.moduleData[1].ppmDelay);
|
|
ui->label_PPMCH_2->show();
|
|
ui->numChannelsSB_2->show();
|
|
ui->numChannelsSB_2->setEnabled(true);
|
|
ui->ppmFrameLengthDSB_2->setEnabled(true);
|
|
ui->ppmFrameLengthDSB_2->setMinimum(g_model.moduleData[1].channelsCount*(g_model.extendedLimits ? 2.250 :2)+3.5);
|
|
if (GetEepromInterface()->getCapability(PPMExtCtrl)) {
|
|
ui->ppmFrameLengthDSB_2->show();
|
|
ui->label_ppmFrameLength_2->show();
|
|
ui->ppmFrameLengthDSB_2->setValue(g_model.moduleData[1].ppmFrameLength/2.0+22.5);
|
|
}
|
|
break;
|
|
}
|
|
protocol2EditLock=false;
|
|
}
|
|
}
|
|
|
|
void ModelEdit::on_protocolCB_3_currentIndexChanged(int index)
|
|
{
|
|
if (!trainerEditLock) {
|
|
trainerEditLock=true;
|
|
|
|
g_model.moduleData[2].protocol=ui->protocolCB_3->currentIndex();
|
|
g_model.trainerMode=ui->protocolCB_3->currentIndex();
|
|
updateSettings();
|
|
switch (index) {
|
|
case 0:
|
|
ui->label_PPM_3->hide();
|
|
ui->ppmDelaySB_3->hide();
|
|
ui->label_PPMCH_3->hide();
|
|
ui->label_pulsePol_3->hide();
|
|
ui->pulsePolCB_3->hide();
|
|
ui->numChannelsSB_3->hide();
|
|
ui->label_ppmFrameLength_3->hide();
|
|
ui->ppmFrameLengthDSB_3->hide();
|
|
ui->label_numChannelsStart_3->hide();
|
|
ui->numChannelsStart_3->hide();
|
|
break;
|
|
default:
|
|
ui->label_PPM_3->show();
|
|
ui->ppmDelaySB_3->show();
|
|
ui->label_PPMCH_3->show();
|
|
ui->label_pulsePol_3->show();
|
|
ui->pulsePolCB_3->show();
|
|
ui->numChannelsSB_3->show();
|
|
ui->label_ppmFrameLength_3->show();
|
|
ui->ppmFrameLengthDSB_3->show();
|
|
ui->label_numChannelsStart_3->show();
|
|
ui->numChannelsStart_3->show();
|
|
ui->numChannelsStart_3->setValue(g_model.moduleData[2].channelsStart+1);
|
|
ui->numChannelsSB_3->setMinimum(g_model.moduleData[2].channelsStart+4);
|
|
ui->numChannelsSB_3->setValue(g_model.moduleData[2].channelsStart+g_model.moduleData[2].channelsCount);
|
|
ui->pulsePolCB_3->setCurrentIndex(g_model.moduleData[2].ppmPulsePol);
|
|
ui->ppmDelaySB_3->setValue(g_model.moduleData[2].ppmDelay);
|
|
ui->ppmFrameLengthDSB_3->setMinimum(g_model.moduleData[2].channelsCount*(g_model.extendedLimits ? 2.250 :2)+3.5);
|
|
if (GetEepromInterface()->getCapability(PPMExtCtrl)) {
|
|
ui->ppmFrameLengthDSB_3->show();
|
|
ui->label_ppmFrameLength_3->show();
|
|
ui->ppmFrameLengthDSB_3->setValue(g_model.moduleData[2].ppmFrameLength/2.0+22.5);
|
|
}
|
|
break;
|
|
}
|
|
trainerEditLock=false;
|
|
}
|
|
}
|
|
|
|
|
|
void ModelEdit::on_numChannelsSB_editingFinished()
|
|
{
|
|
// TODO only accept valid values
|
|
g_model.moduleData[0].channelsCount = 1+ui->numChannelsSB->value()-ui->numChannelsStart->value();
|
|
ui->ppmFrameLengthDSB->setMinimum(g_model.moduleData[0].channelsCount*(g_model.extendedLimits ? 2.250 :2)+3.5);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_numChannelsSB_2_editingFinished()
|
|
{
|
|
// TODO only accept valid values
|
|
g_model.moduleData[1].channelsCount = 1+ui->numChannelsSB_2->value()-ui->numChannelsStart_2->value();
|
|
ui->ppmFrameLengthDSB_2->setMinimum(g_model.moduleData[1].channelsCount*(g_model.extendedLimits ? 2.250 :2.0)+3.5);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_numChannelsSB_3_editingFinished()
|
|
{
|
|
// TODO only accept valid values
|
|
g_model.moduleData[2].channelsCount = 1+ui->numChannelsSB_3->value()-ui->numChannelsStart_3->value();
|
|
ui->ppmFrameLengthDSB_3->setMinimum(g_model.moduleData[2].channelsCount*(g_model.extendedLimits ? 2.250 :2)+3.5);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_numChannelsStart_editingFinished()
|
|
{
|
|
// TODO only accept valid values
|
|
g_model.moduleData[0].channelsStart = ui->numChannelsStart->value()-1;
|
|
ui->numChannelsSB->setMinimum(g_model.moduleData[0].channelsStart+4);
|
|
ui->numChannelsSB->setValue(g_model.moduleData[0].channelsStart+g_model.moduleData[0].channelsCount);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_numChannelsStart_2_editingFinished()
|
|
{
|
|
// TODO only accept valid values
|
|
g_model.moduleData[1].channelsStart = ui->numChannelsStart_2->value()-1;
|
|
ui->numChannelsSB_2->setMinimum(g_model.moduleData[1].channelsStart+4);
|
|
ui->numChannelsSB_2->setValue(g_model.moduleData[1].channelsStart+g_model.moduleData[1].channelsCount);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_numChannelsStart_3_editingFinished()
|
|
{
|
|
// TODO only accept valid values
|
|
g_model.moduleData[2].channelsStart = ui->numChannelsStart_3->value()-1;
|
|
ui->numChannelsSB_3->setMinimum(g_model.moduleData[2].channelsStart+4);
|
|
ui->numChannelsSB_3->setValue(g_model.moduleData[2].channelsStart+g_model.moduleData[2].channelsCount);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_ppmDelaySB_editingFinished()
|
|
{
|
|
if(protocolEditLock) return;
|
|
// TODO only accept valid values
|
|
g_model.moduleData[0].ppmDelay = ui->ppmDelaySB->value();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_ppmDelaySB_2_editingFinished()
|
|
{
|
|
if(protocol2EditLock) return;
|
|
// TODO only accept valid values
|
|
g_model.moduleData[1].ppmDelay = ui->ppmDelaySB_2->value();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_ppmDelaySB_3_editingFinished()
|
|
{
|
|
if(trainerEditLock) return;
|
|
// TODO only accept valid values
|
|
g_model.moduleData[2].ppmDelay = ui->ppmDelaySB_3->value();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_DSM_Type_currentIndexChanged(int index)
|
|
{
|
|
if(protocolEditLock) return;
|
|
// g_model.moduleData[0].channelsCount = (index*2)+8;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_DSM_Type_2_currentIndexChanged(int index)
|
|
{
|
|
if(protocol2EditLock) return;
|
|
// g_model.moduleData[1].channelsCount = (index*2)+8;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_pxxRxNum_editingFinished()
|
|
{
|
|
if(protocolEditLock)
|
|
return;
|
|
|
|
if (!GetEepromInterface()->getCapability(DSM2Indexes)) {
|
|
// g_model.moduleData[0].channelsCount = (ui->pxxRxNum->value()-1)*2+8;
|
|
} else {
|
|
g_model.modelId = ui->pxxRxNum->value();
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_pxxRxNum_2_editingFinished()
|
|
{
|
|
if(protocol2EditLock)
|
|
return;
|
|
|
|
/* if (!GetEepromInterface()->getCapability(DSM2Indexes)) {
|
|
g_model.moduleData[1].channelsCount = (ui->pxxRxNum_2->value()-1)*2+8;
|
|
} */
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_ppmFrameLengthDSB_editingFinished()
|
|
{
|
|
g_model.moduleData[0].ppmFrameLength = (ui->ppmFrameLengthDSB->value()-22.5)/0.5;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_ppmFrameLengthDSB_2_editingFinished()
|
|
{
|
|
g_model.moduleData[1].ppmFrameLength = (ui->ppmFrameLengthDSB_2->value()-22.5)/0.5;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_ppmFrameLengthDSB_3_editingFinished()
|
|
{
|
|
g_model.moduleData[2].ppmFrameLength = (ui->ppmFrameLengthDSB_3->value()-22.5)/0.5;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_fsm1CB_currentIndexChanged(int index)
|
|
{
|
|
QSpinBox * fssb[] = { ui->fsm1SB_1, ui->fsm1SB_2,ui->fsm1SB_3,ui->fsm1SB_4,ui->fsm1SB_5,ui->fsm1SB_6,ui->fsm1SB_7,ui->fsm1SB_8,
|
|
ui->fsm1SB_9, ui->fsm1SB_10,ui->fsm1SB_11,ui->fsm1SB_12,ui->fsm1SB_13,ui->fsm1SB_14,ui->fsm1SB_15,ui->fsm1SB_16, NULL };
|
|
QSlider * fssld[] = { ui->fsm1SL_1, ui->fsm1SL_2,ui->fsm1SL_3,ui->fsm1SL_4,ui->fsm1SL_5,ui->fsm1SL_6,ui->fsm1SL_7,ui->fsm1SL_8,
|
|
ui->fsm1SL_9, ui->fsm1SL_10,ui->fsm1SL_11,ui->fsm1SL_12,ui->fsm1SL_13,ui->fsm1SL_14,ui->fsm1SL_15,ui->fsm1SL_16, NULL };
|
|
g_model.moduleData[0].failsafeMode=index;
|
|
for (int i=0; fssb[i]; i++) {
|
|
if (index==1) {
|
|
fssb[i]->setEnabled(true);
|
|
fssld[i]->setEnabled(true);
|
|
} else {
|
|
fssb[i]->setDisabled(true);
|
|
fssld[i]->setDisabled(true);
|
|
}
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_fsm2CB_currentIndexChanged(int index)
|
|
{
|
|
QSpinBox * fssb[] = { ui->fsm2SB_1, ui->fsm2SB_2,ui->fsm2SB_3,ui->fsm2SB_4,ui->fsm2SB_5,ui->fsm2SB_6,ui->fsm2SB_7,ui->fsm2SB_8,
|
|
ui->fsm2SB_9, ui->fsm2SB_10,ui->fsm2SB_11,ui->fsm2SB_12,ui->fsm2SB_13,ui->fsm2SB_14,ui->fsm2SB_15,ui->fsm2SB_16, NULL };
|
|
QSlider * fssld[] = { ui->fsm2SL_1, ui->fsm2SL_2,ui->fsm2SL_3,ui->fsm2SL_4,ui->fsm2SL_5,ui->fsm2SL_6,ui->fsm2SL_7,ui->fsm2SL_8,
|
|
ui->fsm2SL_9, ui->fsm2SL_10,ui->fsm2SL_11,ui->fsm2SL_12,ui->fsm2SL_13,ui->fsm2SL_14,ui->fsm2SL_15,ui->fsm2SL_16, NULL };
|
|
g_model.moduleData[1].failsafeMode=index;
|
|
for (int i=0; fssb[i]; i++) {
|
|
if (index==1) {
|
|
fssb[i]->setEnabled(true);
|
|
fssld[i]->setEnabled(true);
|
|
} else {
|
|
fssb[i]->setDisabled(true);
|
|
fssld[i]->setDisabled(true);
|
|
}
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_instantTrim_CB_currentIndexChanged(int index)
|
|
{
|
|
if(switchEditLock) return;
|
|
bool found=false;
|
|
for (int i=0; i< C9X_MAX_CUSTOM_FUNCTIONS; i++) {
|
|
if (g_model.funcSw[i].func==FuncInstantTrim) {
|
|
g_model.funcSw[i].swtch = RawSwitch(ui->instantTrim_CB->itemData(ui->instantTrim_CB->currentIndex()).toInt());
|
|
found=true;
|
|
}
|
|
}
|
|
if (found==false) {
|
|
for (int i=0; i< C9X_MAX_CUSTOM_FUNCTIONS; i++) {
|
|
if (g_model.funcSw[i].swtch==RawSwitch()) {
|
|
g_model.funcSw[i].swtch = RawSwitch(ui->instantTrim_CB->itemData(ui->instantTrim_CB->currentIndex()).toInt());
|
|
g_model.funcSw[i].func = FuncInstantTrim;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a1UnitCB_currentIndexChanged(int index) {
|
|
float a1ratio;
|
|
g_model.frsky.channels[0].type=index;
|
|
switch (index) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
ui->a1RatioSB->setDecimals(1);
|
|
ui->a1RatioSB->setMaximum(25.5*GetEepromInterface()->getCapability(TelemetryMaxMultiplier));
|
|
a1ratio=(g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier)/10.0;
|
|
break;
|
|
default:
|
|
ui->a1RatioSB->setDecimals(0);
|
|
ui->a1RatioSB->setMaximum(255*GetEepromInterface()->getCapability(TelemetryMaxMultiplier));
|
|
a1ratio=(g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier);
|
|
break;
|
|
}
|
|
ui->a1RatioSB->setValue(a1ratio);
|
|
updateA1Fields();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a1RatioSB_valueChanged()
|
|
{
|
|
if (telemetryLock) return;
|
|
if (g_model.frsky.channels[0].type==0 || g_model.frsky.channels[0].type==1 || g_model.frsky.channels[0].type==2) {
|
|
g_model.frsky.channels[0].multiplier = findmult(ui->a1RatioSB->value(), 25.5);
|
|
float singlestep =(1<<g_model.frsky.channels[0].multiplier)/10.0;
|
|
telemetryLock=true;
|
|
ui->a1RatioSB->setSingleStep(singlestep);
|
|
ui->a1RatioSB->setValue(round(ui->a1RatioSB->value()/singlestep)*singlestep);
|
|
telemetryLock=false;
|
|
} else {
|
|
g_model.frsky.channels[0].multiplier = findmult(ui->a1RatioSB->value(), 255);
|
|
float singlestep =(1<<g_model.frsky.channels[0].multiplier);
|
|
telemetryLock=true;
|
|
ui->a1RatioSB->setSingleStep(singlestep);
|
|
ui->a1RatioSB->setValue(round(ui->a1RatioSB->value()/singlestep)*singlestep);
|
|
telemetryLock=false;
|
|
}
|
|
}
|
|
|
|
void ModelEdit::on_a1RatioSB_editingFinished()
|
|
{
|
|
float a1ratio, a1calib, a11value,a12value;
|
|
if (telemetryLock) return;
|
|
if (g_model.frsky.channels[0].type==0 || g_model.frsky.channels[0].type==1 || g_model.frsky.channels[0].type==2) {
|
|
g_model.frsky.channels[0].multiplier = findmult(ui->a1RatioSB->value(), 25.5);
|
|
ui->a1CalibSB->setSingleStep((1<<g_model.frsky.channels[0].multiplier)/10.0);
|
|
ui->a11ValueSB->setSingleStep((1<<g_model.frsky.channels[0].multiplier)/10.0);
|
|
ui->a12ValueSB->setSingleStep((1<<g_model.frsky.channels[0].multiplier)/10.0);
|
|
g_model.frsky.channels[0].ratio = ((int)(round(ui->a1RatioSB->value()*10))/(1 <<g_model.frsky.channels[0].multiplier));
|
|
} else {
|
|
g_model.frsky.channels[0].multiplier = findmult(ui->a1RatioSB->value(), 255);
|
|
ui->a1CalibSB->setSingleStep(1<<g_model.frsky.channels[0].multiplier);
|
|
ui->a11ValueSB->setSingleStep(1<<g_model.frsky.channels[0].multiplier);
|
|
ui->a12ValueSB->setSingleStep(1<<g_model.frsky.channels[0].multiplier);
|
|
g_model.frsky.channels[0].ratio = (ui->a1RatioSB->value()/(1 << g_model.frsky.channels[0].multiplier));
|
|
}
|
|
ui->a1CalibSB->setMaximum((ui->a1RatioSB->value()*127)/255);
|
|
ui->a1CalibSB->setMinimum((ui->a1RatioSB->value()*-128)/255);
|
|
ui->a11ValueSB->setMaximum(ui->a1RatioSB->value());
|
|
ui->a12ValueSB->setMaximum(ui->a1RatioSB->value());
|
|
repaint();
|
|
a1ratio=g_model.frsky.channels[0].ratio * (1 << g_model.frsky.channels[0].multiplier);
|
|
a1calib=ui->a1CalibSB->value();
|
|
a11value=ui->a11ValueSB->value();
|
|
a12value=ui->a12ValueSB->value();
|
|
if (g_model.frsky.channels[0].type==0) {
|
|
a1calib*=10;
|
|
a11value*=10;
|
|
a12value*=10;
|
|
}
|
|
if (a1calib>0) {
|
|
if (a1calib>((a1ratio*127)/255)) {
|
|
g_model.frsky.channels[0].offset=127;
|
|
} else {
|
|
g_model.frsky.channels[0].offset=round(a1calib*255/a1ratio);
|
|
}
|
|
}
|
|
if (a1calib<0) {
|
|
if (a1calib<((a1ratio*-128)/255)) {
|
|
g_model.frsky.channels[0].offset=-128;
|
|
} else {
|
|
g_model.frsky.channels[0].offset=round(a1calib*255/a1ratio);
|
|
}
|
|
}
|
|
g_model.frsky.channels[0].alarms[0].value=round((a11value*255-g_model.frsky.channels[0].offset*(g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier))/(g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier));
|
|
g_model.frsky.channels[0].alarms[1].value=round((a12value*255-g_model.frsky.channels[0].offset*(g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier))/(g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier));
|
|
updateA1Fields();
|
|
telBarUpdate();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a1CalibSB_editingFinished()
|
|
{
|
|
float a1ratio,a1calib,a11value,a12value;
|
|
if (g_model.frsky.channels[0].type==0 || g_model.frsky.channels[0].type==1 || g_model.frsky.channels[0].type==2) {
|
|
a1ratio=(g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier)/10.0;
|
|
} else {
|
|
a1ratio=g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier;
|
|
}
|
|
if (a1ratio!=0) {
|
|
g_model.frsky.channels[0].offset = round((255*ui->a1CalibSB->value()/a1ratio));
|
|
a1calib=a1ratio*g_model.frsky.channels[0].offset/255.0;
|
|
a11value=ui->a11ValueSB->value();
|
|
a12value=ui->a12ValueSB->value();
|
|
if (a11value<a1calib) {
|
|
a11value=a1calib;
|
|
} else if (a11value>(a1ratio+a1calib)) {
|
|
a11value=a1ratio+a1calib;
|
|
}
|
|
if (a12value<a1calib) {
|
|
a12value=a1calib;
|
|
} else if (a12value>(a1ratio+a1calib)) {
|
|
a12value=a1ratio+a1calib;
|
|
}
|
|
g_model.frsky.channels[0].alarms[0].value=round(((a11value-a1calib)*255)/a1ratio);
|
|
g_model.frsky.channels[0].alarms[1].value=round(((a12value-a1calib)*255)/a1ratio);
|
|
} else {
|
|
g_model.frsky.channels[0].offset=0;
|
|
g_model.frsky.channels[0].alarms[0].value=0;
|
|
g_model.frsky.channels[0].alarms[1].value=0;
|
|
}
|
|
updateA1Fields();
|
|
telBarUpdate();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a11LevelCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.channels[0].alarms[0].level = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_frskyUnitsCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.imperial=index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_frskyBladesCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.blades=index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_frskyCurrentCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.currentSource=index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_frskyVoltCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.voltsSource=index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_frskyProtoCB_currentIndexChanged(int index)
|
|
{
|
|
if (telemetryLock) return;
|
|
int bindex[12];
|
|
telemetryLock=true;
|
|
for (int i=0; i<12; i++) {
|
|
bindex[i]=barsCB[i]->currentIndex();
|
|
g_model.frsky.usrProto=index;
|
|
populateCustomScreenFieldCB(barsCB[i], bindex[i], false, g_model.frsky.usrProto);
|
|
}
|
|
if (!GetEepromInterface()->getCapability(TelemetryCSFields)) {
|
|
ui->groupBox_5->hide();
|
|
} else {
|
|
for (int screen=0; screen<2;screen++) {
|
|
for (int rows=0; rows<4; rows++) {
|
|
for (int cols=0; cols<3; cols++) {
|
|
int index=screen*12+cols*4+rows;
|
|
populateCustomScreenFieldCB(csf[index], g_model.frsky.screens[screen].body.lines[rows].source[cols], (rows<4), g_model.frsky.usrProto);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
telemetryLock=false;
|
|
if (index==0) {
|
|
for (int i=0; i<12; i++) {
|
|
if (bindex[i]>2) {
|
|
barsCB[i]->setCurrentIndex(0);
|
|
} else {
|
|
barsCB[i]->setCurrentIndex(bindex[i]);
|
|
}
|
|
}
|
|
} else if (index==2) {
|
|
for (int i=0; i<12; i++) {
|
|
if (bindex[i]>3) {
|
|
barsCB[i]->setCurrentIndex(0);
|
|
} else {
|
|
barsCB[i]->setCurrentIndex(bindex[i]);
|
|
}
|
|
}
|
|
} else {
|
|
for (int i=0; i<12; i++) {
|
|
barsCB[i]->setCurrentIndex(bindex[i]);
|
|
}
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a11GreaterCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.channels[0].alarms[0].greater = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a11ValueSB_editingFinished()
|
|
{
|
|
float a1ratio, a1calib, a11value;
|
|
a1ratio=g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier;
|
|
a1calib=g_model.frsky.channels[0].offset;
|
|
a11value=ui->a11ValueSB->value();
|
|
if (g_model.frsky.channels[0].type==0) {
|
|
a1ratio/=10;
|
|
}
|
|
if (a11value<((a1calib*a1ratio)/255)) {
|
|
g_model.frsky.channels[0].alarms[0].value=0;
|
|
} else if (a11value>(a1ratio+(a1calib*a1ratio)/255)) {
|
|
g_model.frsky.channels[0].alarms[0].value=255;
|
|
} else {
|
|
g_model.frsky.channels[0].alarms[0].value = round((a11value-((a1calib*a1ratio)/255))/a1ratio*255);
|
|
}
|
|
updateA1Fields();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a12LevelCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.channels[0].alarms[1].level = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a12GreaterCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.channels[0].alarms[1].greater = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a12ValueSB_editingFinished()
|
|
{
|
|
float a1ratio, a1calib, a12value;
|
|
a1ratio=g_model.frsky.channels[0].ratio<<g_model.frsky.channels[0].multiplier;
|
|
a1calib=g_model.frsky.channels[0].offset;
|
|
a12value=ui->a12ValueSB->value();
|
|
if (g_model.frsky.channels[0].type==0) {
|
|
a1ratio/=10;
|
|
}
|
|
if (a12value<((a1calib*a1ratio)/255)) {
|
|
g_model.frsky.channels[0].alarms[1].value=0;
|
|
} else if (a12value>(a1ratio+(a1calib*a1ratio)/255)) {
|
|
g_model.frsky.channels[0].alarms[1].value=255;
|
|
} else {
|
|
g_model.frsky.channels[0].alarms[1].value = round((a12value-((a1calib*a1ratio)/255))/a1ratio*255);
|
|
}
|
|
updateA1Fields();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a2UnitCB_currentIndexChanged(int index) {
|
|
float a2ratio;
|
|
g_model.frsky.channels[1].type=index;
|
|
switch (index) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
ui->a2RatioSB->setDecimals(1);
|
|
ui->a2RatioSB->setMaximum(25.5*GetEepromInterface()->getCapability(TelemetryMaxMultiplier));
|
|
a2ratio=(g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier)/10.0;
|
|
break;
|
|
default:
|
|
ui->a2RatioSB->setDecimals(0);
|
|
ui->a2RatioSB->setMaximum(255*GetEepromInterface()->getCapability(TelemetryMaxMultiplier));
|
|
a2ratio=g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier;
|
|
break;
|
|
}
|
|
ui->a2RatioSB->setValue(a2ratio);
|
|
updateA2Fields();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a2RatioSB_valueChanged()
|
|
{
|
|
if (telemetryLock) return;
|
|
if (g_model.frsky.channels[1].type==0 || g_model.frsky.channels[1].type==1 || g_model.frsky.channels[1].type==2) {
|
|
g_model.frsky.channels[1].multiplier = findmult(ui->a2RatioSB->value(), 25.5);
|
|
float singlestep =(1<<g_model.frsky.channels[1].multiplier)/10.0;
|
|
telemetryLock=true;
|
|
ui->a2RatioSB->setSingleStep(singlestep);
|
|
ui->a2RatioSB->setValue(round(ui->a2RatioSB->value()/singlestep)*singlestep);
|
|
telemetryLock=false;
|
|
} else {
|
|
g_model.frsky.channels[1].multiplier = findmult(ui->a2RatioSB->value(), 255);
|
|
float singlestep =(1<<g_model.frsky.channels[1].multiplier);
|
|
telemetryLock=true;
|
|
ui->a2RatioSB->setSingleStep(singlestep);
|
|
ui->a2RatioSB->setValue(round(ui->a2RatioSB->value()/singlestep)*singlestep);
|
|
telemetryLock=false;
|
|
}
|
|
}
|
|
|
|
void ModelEdit::on_a2RatioSB_editingFinished()
|
|
{
|
|
float a2ratio, a2calib, a21value,a22value;
|
|
if (telemetryLock) return;
|
|
if (g_model.frsky.channels[1].type==0 || g_model.frsky.channels[1].type==1 || g_model.frsky.channels[1].type==2) {
|
|
g_model.frsky.channels[1].multiplier = findmult(ui->a2RatioSB->value(), 25.5);
|
|
ui->a2CalibSB->setSingleStep((1<<g_model.frsky.channels[1].multiplier)/10.0);
|
|
ui->a21ValueSB->setSingleStep((1<<g_model.frsky.channels[1].multiplier)/10.0);
|
|
ui->a22ValueSB->setSingleStep((1<<g_model.frsky.channels[1].multiplier)/10.0);
|
|
g_model.frsky.channels[1].ratio = ((round(ui->a2RatioSB->value()*10))/(1 << g_model.frsky.channels[1].multiplier));
|
|
} else {
|
|
g_model.frsky.channels[1].multiplier = findmult(ui->a2RatioSB->value(), 255);
|
|
ui->a2CalibSB->setSingleStep(1<<g_model.frsky.channels[1].multiplier);
|
|
ui->a21ValueSB->setSingleStep(1<<g_model.frsky.channels[1].multiplier);
|
|
ui->a22ValueSB->setSingleStep(1<<g_model.frsky.channels[1].multiplier);
|
|
g_model.frsky.channels[1].ratio = (ui->a2RatioSB->value()/(1 << g_model.frsky.channels[1].multiplier));
|
|
}
|
|
ui->a2CalibSB->setMaximum((ui->a2RatioSB->value()*127)/255);
|
|
ui->a2CalibSB->setMinimum((ui->a2RatioSB->value()*-128)/255);
|
|
ui->a21ValueSB->setMaximum(ui->a2RatioSB->value());
|
|
ui->a22ValueSB->setMaximum(ui->a2RatioSB->value());
|
|
repaint();
|
|
a2ratio=g_model.frsky.channels[1].ratio * (1 << g_model.frsky.channels[1].multiplier);
|
|
a2calib=ui->a2CalibSB->value();
|
|
a21value=ui->a21ValueSB->value();
|
|
a22value=ui->a22ValueSB->value();
|
|
if (g_model.frsky.channels[1].type==0 || g_model.frsky.channels[1].type==1 || g_model.frsky.channels[1].type==2) {
|
|
a2calib*=10;
|
|
a21value*=10;
|
|
a22value*=10;
|
|
}
|
|
if (a2calib>0) {
|
|
if (a2calib>((a2ratio*127)/255)) {
|
|
g_model.frsky.channels[1].offset=127;
|
|
} else {
|
|
g_model.frsky.channels[1].offset=round(a2calib*255/a2ratio);
|
|
}
|
|
}
|
|
if (a2calib<0) {
|
|
if (a2calib<((a2ratio*-128)/255)) {
|
|
g_model.frsky.channels[1].offset=-128;
|
|
} else {
|
|
g_model.frsky.channels[1].offset=round(a2calib*255/a2ratio);
|
|
}
|
|
}
|
|
g_model.frsky.channels[1].alarms[0].value=round((a21value*255-g_model.frsky.channels[1].offset*(g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier))/(g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier));
|
|
g_model.frsky.channels[1].alarms[1].value=round((a22value*255-g_model.frsky.channels[1].offset*(g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier))/(g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier));
|
|
updateA2Fields();
|
|
telBarUpdate();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a2CalibSB_editingFinished()
|
|
{
|
|
float a2ratio,a2calib,a21value,a22value;
|
|
if (g_model.frsky.channels[1].type==0 || g_model.frsky.channels[1].type==1 || g_model.frsky.channels[1].type==2) {
|
|
a2ratio=(g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier)/10.0;
|
|
} else {
|
|
a2ratio=g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier;
|
|
}
|
|
if (a2ratio!=0) {
|
|
g_model.frsky.channels[1].offset = round((255*ui->a2CalibSB->value()/a2ratio));
|
|
a2calib=a2ratio*g_model.frsky.channels[1].offset/255.0;
|
|
a21value=ui->a21ValueSB->value();
|
|
a22value=ui->a22ValueSB->value();
|
|
if (a21value<a2calib) {
|
|
a21value=a2calib;
|
|
} else if (a21value>(a2ratio+a2calib)) {
|
|
a21value=a2ratio+a2calib;
|
|
}
|
|
if (a22value<a2calib) {
|
|
a22value=a2calib;
|
|
} else if (a22value>(a2ratio+a2calib)) {
|
|
a22value=a2ratio+a2calib;
|
|
}
|
|
g_model.frsky.channels[1].alarms[0].value=round(((a21value-a2calib)*255)/a2ratio);
|
|
g_model.frsky.channels[1].alarms[1].value=round(((a22value-a2calib)*255)/a2ratio);
|
|
} else {
|
|
g_model.frsky.channels[1].offset=0;
|
|
g_model.frsky.channels[1].alarms[0].value=0;
|
|
g_model.frsky.channels[1].alarms[1].value=0;
|
|
}
|
|
updateA2Fields();
|
|
telBarUpdate();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a21LevelCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.channels[1].alarms[0].level = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a21GreaterCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.channels[1].alarms[0].greater = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a21ValueSB_editingFinished()
|
|
{
|
|
float a2ratio, a2calib, a21value;
|
|
a2ratio=g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier;
|
|
a2calib=g_model.frsky.channels[1].offset;
|
|
a21value=ui->a21ValueSB->value();
|
|
if (g_model.frsky.channels[1].type==0) {
|
|
a2ratio/=10;
|
|
}
|
|
if (a21value<((a2calib*a2ratio)/255)) {
|
|
g_model.frsky.channels[1].alarms[0].value=0;
|
|
} else if (a21value>(a2ratio+(a2calib*a2ratio)/255)) {
|
|
g_model.frsky.channels[1].alarms[0].value=255;
|
|
} else {
|
|
g_model.frsky.channels[1].alarms[0].value = round((a21value-((a2calib*a2ratio)/255))/a2ratio*255);
|
|
}
|
|
updateA2Fields();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a22LevelCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.channels[1].alarms[1].level = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a22GreaterCB_currentIndexChanged(int index)
|
|
{
|
|
g_model.frsky.channels[1].alarms[1].greater = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_a22ValueSB_editingFinished()
|
|
{
|
|
float a2ratio, a2calib, a22value;
|
|
a2ratio=g_model.frsky.channels[1].ratio<<g_model.frsky.channels[1].multiplier;
|
|
a2calib=g_model.frsky.channels[1].offset;
|
|
a22value=ui->a22ValueSB->value();
|
|
if (g_model.frsky.channels[1].type==0) {
|
|
a2ratio/=10;
|
|
}
|
|
if (a22value<((a2calib*a2ratio)/255)) {
|
|
g_model.frsky.channels[1].alarms[1].value=0;
|
|
} else if (a22value>(a2ratio+(a2calib*a2ratio)/255)) {
|
|
g_model.frsky.channels[1].alarms[1].value=255;
|
|
} else {
|
|
g_model.frsky.channels[1].alarms[1].value = round((a22value-((a2calib*a2ratio)/255))/a2ratio*255);
|
|
}
|
|
updateA2Fields();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_rssiAlarm1CB_currentIndexChanged(int index) {
|
|
if (telemetryLock) return;
|
|
g_model.frsky.rssiAlarms[0].level=index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_rssiAlarm2CB_currentIndexChanged(int index) {
|
|
if (telemetryLock) return;
|
|
g_model.frsky.rssiAlarms[1].level=index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_rssiAlarm1SB_editingFinished() {
|
|
if (telemetryLock) return;
|
|
g_model.frsky.rssiAlarms[0].value=(ui->rssiAlarm1SB->value());
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_rssiAlarm2SB_editingFinished() {
|
|
if (telemetryLock) return;
|
|
g_model.frsky.rssiAlarms[1].value=(ui->rssiAlarm2SB->value());
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_AltitudeGPS_ChkB_toggled(bool checked)
|
|
{
|
|
if (telemetryLock) return;
|
|
g_model.frsky.FrSkyGpsAlt = checked;
|
|
updateSettings();
|
|
//AltitudeGPS_CB
|
|
}
|
|
|
|
void ModelEdit::on_showNames_Ckb_toggled(bool checked)
|
|
{
|
|
tabMixes();
|
|
}
|
|
void ModelEdit::on_varioSourceCB_currentIndexChanged(int index)
|
|
{
|
|
if (telemetryLock) return;
|
|
g_model.frsky.varioSource = index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_varioLimitMin_DSB_editingFinished()
|
|
{
|
|
if (telemetryLock) return;
|
|
g_model.frsky.varioMin= round(ui->varioLimitMin_DSB->value()+10);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_varioLimitMax_DSB_editingFinished()
|
|
{
|
|
if (telemetryLock) return;
|
|
g_model.frsky.varioMax= round(ui->varioLimitMax_DSB->value()-10);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_varioLimitCenterMin_DSB_editingFinished()
|
|
{
|
|
if (telemetryLock) return;
|
|
if (ui->varioLimitCenterMin_DSB->value()>ui->varioLimitCenterMax_DSB->value()) {
|
|
ui->varioLimitCenterMax_DSB->setValue(ui->varioLimitCenterMin_DSB->value());
|
|
}
|
|
g_model.frsky.varioCenterMin= round((ui->varioLimitCenterMin_DSB->value()+0.5)*10);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_varioLimitMinOff_ChkB_toggled(bool checked)
|
|
{
|
|
if (telemetryLock) return;
|
|
g_model.frsky.varioCenterMin = -16;
|
|
if (!checked) {
|
|
telemetryLock=true;
|
|
ui->varioLimitCenterMin_DSB->setValue(-2.0);
|
|
ui->varioLimitCenterMin_DSB->setEnabled(true);
|
|
telemetryLock=false;
|
|
} else {
|
|
ui->varioLimitCenterMin_DSB->setValue(-2.0);
|
|
ui->varioLimitCenterMin_DSB->setDisabled(true);
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_varioLimitCenterMax_DSB_editingFinished()
|
|
{
|
|
if (telemetryLock) return;
|
|
if (ui->varioLimitCenterMin_DSB->value()>ui->varioLimitCenterMax_DSB->value()) {
|
|
ui->varioLimitCenterMax_DSB->setValue(ui->varioLimitCenterMin_DSB->value());
|
|
}
|
|
g_model.frsky.varioCenterMax= round((ui->varioLimitCenterMax_DSB->value()-0.5)*10);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::telBarUpdate()
|
|
{
|
|
int index;
|
|
telemetryLock=true;
|
|
for (int i=0; i<12; i++) {
|
|
int screen=i/4;
|
|
index=barsCB[i]->currentIndex();
|
|
if (index==TELEMETRY_SOURCE_A1 || index==TELEMETRY_SOURCE_A1 || index==TELEMETRY_SOURCE_A1_MIN || index==TELEMETRY_SOURCE_A2_MIN) {
|
|
minSB[i]->setMinimum(getBarValue(index, 0, &g_model.frsky));
|
|
minSB[i]->setMaximum(getBarValue(index, 255, &g_model.frsky));
|
|
minSB[i]->setSingleStep(getBarStep(index));
|
|
maxSB[i]->setMinimum(getBarValue(index, 0, &g_model.frsky));
|
|
maxSB[i]->setMaximum(getBarValue(index, 255, &g_model.frsky));
|
|
maxSB[i]->setSingleStep(getBarStep(index));
|
|
minSB[i]->setValue(getBarValue(index, g_model.frsky.screens[screen].body.bars[i%4].barMin, &g_model.frsky));
|
|
maxSB[i]->setValue(getBarValue(index, 255-g_model.frsky.screens[screen].body.bars[i%4].barMax, &g_model.frsky));
|
|
}
|
|
}
|
|
telemetryLock=false;
|
|
}
|
|
|
|
void ModelEdit::ScreenTypeCBcurrentIndexChanged(int index)
|
|
{
|
|
if (telemetryLock) return;
|
|
|
|
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
|
|
int screen = comboBox->objectName().right(1).toInt() -1;
|
|
telemetryLock=true;
|
|
g_model.frsky.screens[screen].type=index;
|
|
|
|
for (int i=0; i<3; i++) {
|
|
bool isNum = (g_model.frsky.screens[i].type==0);
|
|
barsGB[i]->setVisible(!isNum);
|
|
numsGB[i]->setVisible(isNum);
|
|
}
|
|
|
|
telemetryLock=false;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::telBarCBcurrentIndexChanged(int index)
|
|
{
|
|
if (telemetryLock) return;
|
|
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
|
|
int screenId = comboBox->objectName().mid(8,1).toInt() - 1;
|
|
int barId = comboBox->objectName().mid(10,1).toInt() - 1;
|
|
int bar=barId+screenId*4;
|
|
g_model.frsky.screens[screenId].body.bars[barId].source=index;
|
|
telemetryLock=true;
|
|
if (index==0) {
|
|
g_model.frsky.screens[screenId].body.bars[barId].barMin=0;
|
|
g_model.frsky.screens[screenId].body.bars[barId].barMax=0;
|
|
minSB[bar]->setDisabled(true);
|
|
maxSB[bar]->setDisabled(true);
|
|
} else {
|
|
minSB[bar]->setEnabled(true);
|
|
maxSB[bar]->setEnabled(true);
|
|
}
|
|
switch (index-1) {
|
|
case TELEMETRY_SOURCE_TX_BATT:
|
|
case TELEMETRY_SOURCE_A1:
|
|
case TELEMETRY_SOURCE_A1_MIN:
|
|
case TELEMETRY_SOURCE_A2:
|
|
case TELEMETRY_SOURCE_A2_MIN:
|
|
case TELEMETRY_SOURCE_CELLS_SUM:
|
|
case TELEMETRY_SOURCE_VFAS:
|
|
case TELEMETRY_SOURCE_CURRENT_MAX:
|
|
case TELEMETRY_SOURCE_CURRENT:
|
|
minSB[bar]->setDecimals(1);
|
|
maxSB[bar]->setDecimals(1);
|
|
break;
|
|
case TELEMETRY_SOURCE_CELL:
|
|
minSB[bar]->setDecimals(2);
|
|
maxSB[bar]->setDecimals(2);
|
|
break;
|
|
default:
|
|
minSB[bar]->setDecimals(0);
|
|
maxSB[bar]->setDecimals(0);
|
|
}
|
|
minSB[bar]->setMinimum(getBarValue(index, 0, &g_model.frsky));
|
|
minSB[bar]->setMaximum(getBarValue(index, 255, &g_model.frsky));
|
|
minSB[bar]->setSingleStep(getBarStep(index));
|
|
maxSB[bar]->setMinimum(getBarValue(index, 0, &g_model.frsky));
|
|
maxSB[bar]->setMaximum(getBarValue(index, 255, &g_model.frsky));
|
|
maxSB[bar]->setSingleStep(getBarStep(index));
|
|
minSB[bar]->setValue(getBarValue(index, g_model.frsky.screens[screenId].body.bars[barId].barMin, &g_model.frsky));
|
|
maxSB[bar]->setValue(getBarValue(index, 255-g_model.frsky.screens[screenId].body.bars[barId].barMax, &g_model.frsky));
|
|
telemetryLock=false;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::telMinSBeditingFinished()
|
|
{
|
|
if (telemetryLock) return;
|
|
QDoubleSpinBox *spinBox = qobject_cast<QDoubleSpinBox*>(sender());
|
|
int screenId = spinBox->objectName().mid(8,1).toInt() - 1;
|
|
int barId = spinBox->objectName().right(1).toInt() - 1;
|
|
int minId = barId+screenId*4;
|
|
telemetryLock=true;
|
|
if (g_model.frsky.screens[screenId].body.bars[barId].source==TELEMETRY_SOURCE_A1 || g_model.frsky.screens[screenId].body.bars[barId].source==TELEMETRY_SOURCE_A1_MIN) {
|
|
g_model.frsky.screens[screenId].body.bars[barId].barMin=round((minSB[minId]->value()-ui->a1CalibSB->value())/getBarStep(g_model.frsky.screens[screenId].body.bars[barId].source));
|
|
} else if (g_model.frsky.screens[screenId].body.bars[minId].source==TELEMETRY_SOURCE_A2 || g_model.frsky.screens[screenId].body.bars[minId].source==TELEMETRY_SOURCE_A2_MIN) {
|
|
g_model.frsky.screens[screenId].body.bars[barId].barMin=round((minSB[minId]->value()-ui->a2CalibSB->value())/getBarStep(g_model.frsky.screens[screenId].body.bars[barId].source));
|
|
} else {
|
|
g_model.frsky.screens[screenId].body.bars[barId].barMin=round((minSB[minId]->value()-getBarValue(g_model.frsky.screens[screenId].body.bars[barId].source, 0, &g_model.frsky))/getBarStep(g_model.frsky.screens[screenId].body.bars[barId].source));
|
|
}
|
|
spinBox->setValue(getBarValue(g_model.frsky.screens[screenId].body.bars[barId].source, g_model.frsky.screens[screenId].body.bars[barId].barMin, &g_model.frsky));
|
|
if (maxSB[minId]->value()<minSB[minId]->value()) {
|
|
g_model.frsky.screens[screenId].body.bars[minId].barMax=(255-g_model.frsky.screens[screenId].body.bars[barId].barMin+1);
|
|
maxSB[minId]->setValue(getBarValue(g_model.frsky.screens[screenId].body.bars[barId].source, 255-g_model.frsky.screens[screenId].body.bars[barId].barMax, &g_model.frsky));
|
|
}
|
|
maxSB[minId]->setMinimum(getBarValue(g_model.frsky.screens[screenId].body.bars[barId].source, (g_model.frsky.screens[screenId].body.bars[barId].barMin+1), &g_model.frsky));
|
|
telemetryLock=false;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::telMaxSBeditingFinished()
|
|
{
|
|
if (telemetryLock) return;
|
|
QDoubleSpinBox *spinBox = qobject_cast<QDoubleSpinBox*>(sender());
|
|
int screenId = spinBox->objectName().mid(8,1).toInt() - 1;
|
|
int barId = spinBox->objectName().right(1).toInt() - 1;
|
|
telemetryLock=true;
|
|
if (g_model.frsky.screens[screenId].body.bars[barId].source==5) {
|
|
g_model.frsky.screens[screenId].body.bars[barId].barMax = (255-round((spinBox->value()-ui->a1CalibSB->value())/getBarStep(g_model.frsky.screens[screenId].body.bars[barId].source)));
|
|
} else if (g_model.frsky.screens[screenId].body.bars[barId].source==6) {
|
|
g_model.frsky.screens[screenId].body.bars[barId].barMax = (255-round((spinBox->value()-ui->a2CalibSB->value())/getBarStep(g_model.frsky.screens[screenId].body.bars[barId].source)));
|
|
} else {
|
|
g_model.frsky.screens[screenId].body.bars[barId].barMax = (255-round((spinBox->value()-getBarValue(g_model.frsky.screens[screenId].body.bars[barId].source, 0, &g_model.frsky))/getBarStep(g_model.frsky.screens[screenId].body.bars[barId].source) ));
|
|
}
|
|
spinBox->setValue(getBarValue(g_model.frsky.screens[screenId].body.bars[barId].source, (255-g_model.frsky.screens[screenId].body.bars[barId].barMax), &g_model.frsky));
|
|
telemetryLock=false;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_thrTrimChkB_toggled(bool checked)
|
|
{
|
|
g_model.thrTrim = checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_thrExpoChkB_toggled(bool checked)
|
|
{
|
|
g_model.thrExpo = checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_AltitudeToolbar_ChkB_toggled(bool checked)
|
|
{
|
|
g_model.frsky.altitudeDisplayed = checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcRUDChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_RUD;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_RUD;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcELEChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_ELE;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_ELE;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcTHRChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_THR;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_THR;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcAILChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_AIL;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_AIL;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcP1ChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_P1;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_P1;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcP2ChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_P2;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_P2;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcP3ChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_P3;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_P3;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcP4ChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_P4;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_P4;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcREaChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_REA;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_REA;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_bcREbChkB_toggled(bool checked)
|
|
{
|
|
if(checked) {
|
|
g_model.beepANACenter |= BC_BIT_REB;
|
|
} else {
|
|
g_model.beepANACenter &= ~BC_BIT_REB;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseGVValue_editingFinished()
|
|
{
|
|
if (phasesLock) return;
|
|
QSpinBox *spinBox = qobject_cast<QSpinBox*>(sender());
|
|
int phase = spinBox->objectName().mid(5,1).toInt();
|
|
int gvar = spinBox->objectName().mid(8,1).toInt()-1;
|
|
g_model.phaseData[phase].gvars[gvar] = spinBox->value();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::GVName_editingFinished()
|
|
{
|
|
if (phasesLock) return;
|
|
QLineEdit *lineedit = qobject_cast<QLineEdit*>(sender());
|
|
int gvar = lineedit->objectName().mid(8,1).toInt()-1;
|
|
memset(&g_model.gvars_names[gvar],0,sizeof(g_model.gvars_names[gvar]));
|
|
const char * le=lineedit->text().toAscii();
|
|
strncpy(g_model.gvars_names[gvar], le, sizeof(g_model.gvars_names[gvar])-1);
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::GVSource_currentIndexChanged()
|
|
{
|
|
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
|
|
int gvar = comboBox->objectName().mid(8,1).toInt()-1;
|
|
int index=comboBox->currentIndex();
|
|
g_model.gvsource[gvar]=index;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseGVUse_currentIndexChanged()
|
|
{
|
|
if (phasesLock) return;
|
|
phasesLock=true;
|
|
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
|
|
int phase = comboBox->objectName().mid(5,1).toInt();
|
|
int gvar = comboBox->objectName().mid(8,1).toInt()-1;
|
|
int index=comboBox->currentIndex();
|
|
if (index == 0) {
|
|
int value=g_model.phaseData[phase].gvars[gvar];
|
|
if (value>1024) {
|
|
value=0;
|
|
}
|
|
gvarsSB[phase][gvar]->setValue(value);
|
|
gvarsSB[phase][gvar]->setEnabled(true);
|
|
g_model.phaseData[phase].gvars[gvar]=value;
|
|
} else {
|
|
g_model.phaseData[phase].gvars[gvar]=1024+index;
|
|
int value=gvarsSB[index+(index>phase ?0 :-1)][gvar]->value();
|
|
gvarsSB[phase][gvar]->setValue(value);
|
|
gvarsSB[phase][gvar]->setDisabled(true);
|
|
}
|
|
phasesLock=false;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseREValue_editingFinished()
|
|
{
|
|
if (phasesLock) return;
|
|
QSpinBox *spinBox = qobject_cast<QSpinBox*>(sender());
|
|
int phase = spinBox->objectName().mid(5,1).toInt();
|
|
int gvar = spinBox->objectName().mid(8,1).toInt()-1;
|
|
g_model.phaseData[phase].rotaryEncoders[gvar] = spinBox->value();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseREUse_currentIndexChanged()
|
|
{
|
|
if (phasesLock) return;
|
|
phasesLock=true;
|
|
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
|
|
int phase = comboBox->objectName().mid(5,1).toInt();
|
|
int re = comboBox->objectName().mid(8,1).toInt()-1;
|
|
int index=comboBox->currentIndex();
|
|
if (index == 0) {
|
|
int value=g_model.phaseData[phase].rotaryEncoders[re];
|
|
if (value>1024) {
|
|
value=0;
|
|
}
|
|
reSB[phase][re]->setValue(value);
|
|
reSB[phase][re]->setEnabled(true);
|
|
g_model.phaseData[phase].rotaryEncoders[re]=value;
|
|
} else {
|
|
g_model.phaseData[phase].rotaryEncoders[re]=1024+index;
|
|
int value=reSB[index+(index>phase ?0 :-1)][re]->value();
|
|
reSB[phase][re]->setValue(value);
|
|
reSB[phase][re]->setDisabled(true) ;
|
|
}
|
|
phasesLock=false;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseTrimUse_currentIndexChanged()
|
|
{
|
|
if (phasesLock) return;
|
|
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
|
|
int phase = comboBox->objectName().mid(5,1).toInt();
|
|
int trim = comboBox->objectName().mid(10,1).toInt();
|
|
|
|
int chn = CONVERT_MODE(trim)-1;
|
|
int index=comboBox->currentIndex();
|
|
|
|
if (index == 0) {
|
|
g_model.phaseData[phase].trim[chn] = g_model.phaseData[g_model.getTrimFlightPhase(chn, phase)].trim[chn];
|
|
g_model.phaseData[phase].trimRef[chn] = -1;
|
|
} else {
|
|
g_model.phaseData[phase].trim[chn] = 0;
|
|
g_model.phaseData[phase].trimRef[chn] = index - 1 + (index > (int)phase ? 1 : 0);
|
|
}
|
|
|
|
phasesLock = true;
|
|
displayOnePhaseOneTrim(phase, chn, NULL, phasesTrimValues[phase][trim-1], phasesTrimSliders[phase][trim-1]);
|
|
phasesLock = false;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseTrim_valueChanged()
|
|
{
|
|
if (phasesLock) return;
|
|
QSpinBox *spinBox = qobject_cast<QSpinBox*>(sender());
|
|
int phase = spinBox->objectName().mid(5,1).toInt();
|
|
int trim = spinBox->objectName().mid(10,1).toInt();
|
|
|
|
int chn = CONVERT_MODE(trim)-1;
|
|
g_model.phaseData[phase].trim[chn] = spinBox->value();
|
|
phasesLock=true;
|
|
phasesTrimSliders[phase][trim-1]->setValue(spinBox->value());
|
|
phasesLock=false;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::phaseTrimSlider_valueChanged()
|
|
{
|
|
if (phasesLock) return;
|
|
QSlider *slider = qobject_cast<QSlider*>(sender());
|
|
int phase = slider->objectName().mid(5,1).toInt();
|
|
int trim = slider->objectName().mid(10,1).toInt();
|
|
|
|
int chn = CONVERT_MODE(trim)-1;
|
|
g_model.phaseData[phase].trim[chn] = slider->value();
|
|
phasesLock=true;
|
|
phasesTrimValues[phase][trim-1]->setValue(slider->value());
|
|
phasesLock=false;
|
|
updateSettings();
|
|
}
|
|
|
|
QSpinBox *ModelEdit::getNodeSB(int i) // get the SpinBox that corresponds to the selected node
|
|
{
|
|
return spny[i];
|
|
}
|
|
|
|
QSpinBox *ModelEdit::getNodeSBX(int i) // get the SpinBox that corresponds to the selected node
|
|
{
|
|
return spnx[i];
|
|
}
|
|
|
|
void ModelEdit::drawCurve()
|
|
{
|
|
|
|
if (drawing)
|
|
return;
|
|
drawing=true;
|
|
curvesLock=true;
|
|
int k,i;
|
|
QColor * plot_color[16];
|
|
|
|
plot_color[0]=new QColor(0,0,127);
|
|
plot_color[1]=new QColor(0,127,0);
|
|
plot_color[2]=new QColor(127,0,0);
|
|
plot_color[3]=new QColor(0,127,127);
|
|
plot_color[4]=new QColor(127,0,127);
|
|
plot_color[5]=new QColor(127,127,0);
|
|
plot_color[6]=new QColor(127,127,127);
|
|
plot_color[7]=new QColor(0,0,255);
|
|
plot_color[8]=new QColor(0,127,255);
|
|
plot_color[9]=new QColor(127,0,255);
|
|
plot_color[10]=new QColor(0,255,0);
|
|
plot_color[11]=new QColor(0,255,127);
|
|
plot_color[12]=new QColor(127,255,0);
|
|
plot_color[13]=new QColor(255,0,0);
|
|
plot_color[14]=new QColor(255,0,127);
|
|
plot_color[15]=new QColor(255,127,0);
|
|
|
|
if(currentCurve<0 || currentCurve>15) return;
|
|
|
|
Node *nodel = 0;
|
|
Node *nodex = 0;
|
|
|
|
QGraphicsScene *scene = ui->curvePreview->scene();
|
|
QPen pen;
|
|
QColor color;
|
|
scene->clear();
|
|
|
|
qreal width = scene->sceneRect().width();
|
|
qreal height = scene->sceneRect().height();
|
|
|
|
qreal centerX = scene->sceneRect().left() + width/2; //center X
|
|
qreal centerY = scene->sceneRect().top() + height/2; //center Y
|
|
|
|
QGraphicsSimpleTextItem *ti;
|
|
ti = scene->addSimpleText(tr("Editing curve %1").arg(currentCurve+1));
|
|
ti->setPos(3,3);
|
|
|
|
scene->addLine(centerX,GFX_MARGIN,centerX,height+GFX_MARGIN);
|
|
scene->addLine(GFX_MARGIN,centerY,width+GFX_MARGIN,centerY);
|
|
pen.setWidth(2);
|
|
pen.setStyle(Qt::SolidLine);
|
|
int numcurves=GetEepromInterface()->getCapability(NumCurves);
|
|
if (numcurves==0) {
|
|
numcurves=16;
|
|
}
|
|
|
|
for(k=0; k<numcurves; k++) {
|
|
pen.setColor(*plot_color[k]);
|
|
if ((currentCurve!=k) && (plot_curve[k])) {
|
|
int numpoints=g_model.curves[k].count;
|
|
for(i=0; i<(numpoints-1); i++) {
|
|
if (!g_model.curves[k].custom) {
|
|
scene->addLine(GFX_MARGIN + i*width/(numpoints-1),centerY - (qreal)g_model.curves[k].points[i].y*height/200,GFX_MARGIN + (i+1)*width/(numpoints-1),centerY - (qreal)g_model.curves[k].points[i+1].y*height/200,pen);
|
|
} else {
|
|
scene->addLine(centerX + (qreal)g_model.curves[k].points[i].x*width/200,centerY - (qreal)g_model.curves[k].points[i].y*height/200,centerX + (qreal)g_model.curves[k].points[i+1].x*width/200,centerY - (qreal)g_model.curves[k].points[i+1].y*height/200,pen);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int numpoints=g_model.curves[currentCurve].count;
|
|
|
|
for(int i=0; i<numpoints; i++) {
|
|
nodel = nodex;
|
|
nodex = new Node(getNodeSB(i),getNodeSBX(i));
|
|
nodex->setColor(*plot_color[currentCurve]);
|
|
if (!g_model.curves[currentCurve].custom) {
|
|
nodex->setFixedX(true);
|
|
nodex->setPos(GFX_MARGIN + i*width/(numpoints-1),centerY - (qreal)g_model.curves[currentCurve].points[i].y*height/200);
|
|
} else {
|
|
if (i>0 && i<(numpoints-1)) {
|
|
nodex->setFixedX(false);
|
|
nodex->setMinX(g_model.curves[currentCurve].points[i-1].x+1);
|
|
nodex->setMaxX(g_model.curves[currentCurve].points[i+1].x-1);
|
|
spnx[i]->setMaximum(g_model.curves[currentCurve].points[i+1].x-1);
|
|
spnx[i]->setMinimum(g_model.curves[currentCurve].points[i-1].x+1);
|
|
} else {
|
|
nodex->setFixedX(true);
|
|
}
|
|
nodex->setPos(centerX + (qreal)g_model.curves[currentCurve].points[i].x*width/200,centerY - (qreal)g_model.curves[currentCurve].points[i].y*height/200);
|
|
}
|
|
scene->addItem(nodex);
|
|
if(i>0) scene->addItem(new Edge(nodel, nodex));
|
|
}
|
|
curvesLock=false;
|
|
drawing=false;
|
|
}
|
|
|
|
|
|
bool ModelEdit::gm_insertMix(int idx)
|
|
{
|
|
if (idx<0 || idx>=GetEepromInterface()->getCapability(Mixes) || g_model.mixData[GetEepromInterface()->getCapability(Mixes)-1].destCh > 0) {
|
|
QMessageBox::information(this, "Companion", tr("Not enough available mixers!"));
|
|
return false;
|
|
}
|
|
|
|
int i = g_model.mixData[idx].destCh;
|
|
memmove(&g_model.mixData[idx+1],&g_model.mixData[idx],
|
|
(GetEepromInterface()->getCapability(Mixes)-(idx+1))*sizeof(MixData) );
|
|
memset(&g_model.mixData[idx],0,sizeof(MixData));
|
|
g_model.mixData[idx].srcRaw = RawSource(SOURCE_TYPE_NONE);
|
|
g_model.mixData[idx].destCh = i;
|
|
g_model.mixData[idx].weight = 100;
|
|
return true;
|
|
}
|
|
|
|
void ModelEdit::gm_deleteMix(int index)
|
|
{
|
|
memmove(&g_model.mixData[index],&g_model.mixData[index+1],
|
|
(GetEepromInterface()->getCapability(Mixes)-(index+1))*sizeof(MixData));
|
|
memset(&g_model.mixData[GetEepromInterface()->getCapability(Mixes)-1],0,sizeof(MixData));
|
|
}
|
|
|
|
void ModelEdit::gm_openMix(int index)
|
|
{
|
|
if(index<0 || index>=GetEepromInterface()->getCapability(Mixes)) return;
|
|
|
|
MixData mixd(g_model.mixData[index]);
|
|
updateSettings();
|
|
tabMixes();
|
|
|
|
MixerDialog *g = new MixerDialog(this, &mixd, g_eeGeneral.stickMode);
|
|
if(g->exec()) {
|
|
g_model.mixData[index] = mixd;
|
|
updateSettings();
|
|
tabMixes();
|
|
} else {
|
|
if (mixInserted) {
|
|
gm_deleteMix(index);
|
|
}
|
|
mixInserted=false;
|
|
updateSettings();
|
|
tabMixes();
|
|
}
|
|
}
|
|
|
|
int ModelEdit::getMixerIndex(unsigned int dch)
|
|
{
|
|
int i = 0;
|
|
while ((g_model.mixData[i].destCh<=dch) && (g_model.mixData[i].destCh) && (i<GetEepromInterface()->getCapability(Mixes))) i++;
|
|
if(i==GetEepromInterface()->getCapability(Mixes)) return -1;
|
|
return i;
|
|
}
|
|
|
|
bool ModelEdit::gm_insertExpo(int idx)
|
|
{
|
|
if (idx<0 || idx>=C9X_MAX_EXPOS || g_model.expoData[C9X_MAX_EXPOS-1].mode > 0) {
|
|
QMessageBox::information(this, "Companion", tr("Not enough available expos!"));
|
|
return false;
|
|
}
|
|
|
|
int chn = g_model.expoData[idx].chn;
|
|
memmove(&g_model.expoData[idx+1],&g_model.expoData[idx],
|
|
(C9X_MAX_EXPOS-(idx+1))*sizeof(ExpoData) );
|
|
memset(&g_model.expoData[idx],0,sizeof(ExpoData));
|
|
g_model.expoData[idx].chn = chn;
|
|
g_model.expoData[idx].weight = 100;
|
|
g_model.expoData[idx].mode = 3 /* TODO enum */;
|
|
return true;
|
|
}
|
|
|
|
void ModelEdit::gm_deleteExpo(int index)
|
|
{
|
|
memmove(&g_model.expoData[index],&g_model.expoData[index+1],
|
|
(C9X_MAX_EXPOS-(index+1))*sizeof(ExpoData));
|
|
memset(&g_model.expoData[C9X_MAX_EXPOS-1],0,sizeof(ExpoData));
|
|
}
|
|
|
|
void ModelEdit::gm_openExpo(int index)
|
|
{
|
|
if(index<0 || index>=C9X_MAX_EXPOS) return;
|
|
|
|
ExpoData mixd(g_model.expoData[index]);
|
|
updateSettings();
|
|
tabExpos();
|
|
|
|
ExpoDialog *g = new ExpoDialog(this, &mixd, g_eeGeneral.stickMode);
|
|
if(g->exec()) {
|
|
g_model.expoData[index] = mixd;
|
|
updateSettings();
|
|
tabExpos();
|
|
} else {
|
|
if (expoInserted) {
|
|
gm_deleteExpo(index);
|
|
}
|
|
expoInserted=false;
|
|
updateSettings();
|
|
tabExpos();
|
|
}
|
|
}
|
|
|
|
int ModelEdit::getExpoIndex(unsigned int dch)
|
|
{
|
|
unsigned int i = 0;
|
|
while (g_model.expoData[i].chn<=dch && g_model.expoData[i].mode && i<C9X_MAX_EXPOS) i++;
|
|
if(i==C9X_MAX_EXPOS) return -1;
|
|
return i;
|
|
}
|
|
|
|
void ModelEdit::mixerlistWidget_doubleClicked(QModelIndex index)
|
|
{
|
|
int idx= MixerlistWidget->item(index.row())->data(Qt::UserRole).toByteArray().at(0);
|
|
if (idx<0) {
|
|
int i = -idx;
|
|
idx = getMixerIndex(i); //get mixer index to insert
|
|
if (!gm_insertMix(idx))
|
|
return;
|
|
g_model.mixData[idx].destCh = i;
|
|
mixInserted=true;
|
|
} else {
|
|
mixInserted=false;
|
|
}
|
|
gm_openMix(idx);
|
|
}
|
|
|
|
|
|
void ModelEdit::expolistWidget_doubleClicked(QModelIndex index)
|
|
{
|
|
expoOpen(ExposlistWidget->item(index.row()));
|
|
}
|
|
|
|
void ModelEdit::exposDeleteList(QList<int> list)
|
|
{
|
|
qSort(list.begin(), list.end());
|
|
|
|
int iDec = 0;
|
|
foreach(int idx, list) {
|
|
gm_deleteExpo(idx-iDec);
|
|
iDec++;
|
|
}
|
|
}
|
|
|
|
void ModelEdit::mixersDeleteList(QList<int> list)
|
|
{
|
|
qSort(list.begin(), list.end());
|
|
|
|
int iDec = 0;
|
|
foreach(int idx, list) {
|
|
gm_deleteMix(idx-iDec);
|
|
iDec++;
|
|
}
|
|
}
|
|
|
|
QList<int> ModelEdit::createMixListFromSelected()
|
|
{
|
|
QList<int> list;
|
|
foreach(QListWidgetItem *item, MixerlistWidget->selectedItems()) {
|
|
int idx= item->data(Qt::UserRole).toByteArray().at(0);
|
|
if(idx>=0 && idx<GetEepromInterface()->getCapability(Mixes)) list << idx;
|
|
}
|
|
return list;
|
|
}
|
|
|
|
QList<int> ModelEdit::createExpoListFromSelected()
|
|
{
|
|
QList<int> list;
|
|
foreach(QListWidgetItem *item, ExposlistWidget->selectedItems()) {
|
|
int idx= item->data(Qt::UserRole).toByteArray().at(0);
|
|
if(idx>=0 && idx<C9X_MAX_EXPOS) list << idx;
|
|
}
|
|
return list;
|
|
}
|
|
|
|
// TODO duplicated code
|
|
void ModelEdit::setSelectedByMixList(QList<int> list)
|
|
{
|
|
for(int i=0; i<MixerlistWidget->count(); i++) {
|
|
int t = MixerlistWidget->item(i)->data(Qt::UserRole).toByteArray().at(0);
|
|
if(list.contains(t))
|
|
MixerlistWidget->item(i)->setSelected(true);
|
|
}
|
|
}
|
|
|
|
void ModelEdit::setSelectedByExpoList(QList<int> list)
|
|
{
|
|
for(int i=0; i<ExposlistWidget->count(); i++) {
|
|
int t = ExposlistWidget->item(i)->data(Qt::UserRole).toByteArray().at(0);
|
|
if(list.contains(t))
|
|
ExposlistWidget->item(i)->setSelected(true);
|
|
}
|
|
}
|
|
|
|
void ModelEdit::mixersDelete(bool ask)
|
|
{
|
|
QMessageBox::StandardButton ret = QMessageBox::No;
|
|
|
|
if(ask)
|
|
ret = QMessageBox::warning(this, "Companion",
|
|
tr("Delete Selected Mixes?"),
|
|
QMessageBox::Yes | QMessageBox::No);
|
|
|
|
|
|
if ((ret == QMessageBox::Yes) || (!ask)) {
|
|
mixersDeleteList(createMixListFromSelected());
|
|
updateSettings();
|
|
tabMixes();
|
|
}
|
|
}
|
|
|
|
void ModelEdit::mixersCut()
|
|
{
|
|
mixersCopy();
|
|
mixersDelete(false);
|
|
}
|
|
|
|
void ModelEdit::mixersCopy()
|
|
{
|
|
|
|
QList<int> list = createMixListFromSelected();
|
|
|
|
QByteArray mxData;
|
|
foreach(int idx, list) {
|
|
mxData.append((char*)&g_model.mixData[idx],sizeof(MixData));
|
|
}
|
|
|
|
QMimeData *mimeData = new QMimeData;
|
|
mimeData->setData("application/x-companion9x-mix", mxData);
|
|
QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard);
|
|
}
|
|
|
|
void ModelEdit::exposDelete(bool ask)
|
|
{
|
|
QMessageBox::StandardButton ret = QMessageBox::No;
|
|
|
|
if(ask)
|
|
ret = QMessageBox::warning(this, "Companion",
|
|
tr("Delete Selected Expos?"),
|
|
QMessageBox::Yes | QMessageBox::No);
|
|
|
|
|
|
if ((ret == QMessageBox::Yes) || (!ask)) {
|
|
exposDeleteList(createExpoListFromSelected());
|
|
updateSettings();
|
|
tabExpos();
|
|
}
|
|
}
|
|
|
|
void ModelEdit::exposCut()
|
|
{
|
|
exposCopy();
|
|
exposDelete(false);
|
|
}
|
|
|
|
void ModelEdit::exposCopy()
|
|
{
|
|
QList<int> list = createExpoListFromSelected();
|
|
|
|
QByteArray mxData;
|
|
foreach(int idx, list) {
|
|
mxData.append((char*)&g_model.expoData[idx],sizeof(ExpoData));
|
|
}
|
|
|
|
QMimeData *mimeData = new QMimeData;
|
|
mimeData->setData("application/x-companion9x-expo", mxData);
|
|
QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard);
|
|
}
|
|
|
|
void ModelEdit::mimeExpoDropped(int index, const QMimeData *data, Qt::DropAction /*action*/)
|
|
{
|
|
int idx = ExposlistWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0);
|
|
pasteExpoMimeData(data, idx);
|
|
}
|
|
|
|
void ModelEdit::mimeMixerDropped(int index, const QMimeData *data, Qt::DropAction /*action*/)
|
|
{
|
|
int idx= MixerlistWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0);
|
|
pasteMixerMimeData(data, idx);
|
|
}
|
|
|
|
void ModelEdit::pasteMixerMimeData(const QMimeData * mimeData, int destIdx)
|
|
{
|
|
if(mimeData->hasFormat("application/x-companion9x-mix")) {
|
|
int idx; // mixer index
|
|
int dch;
|
|
|
|
if(destIdx<0) {
|
|
dch = -destIdx;
|
|
idx = getMixerIndex(dch) - 1; //get mixer index to insert
|
|
} else {
|
|
idx = destIdx;
|
|
dch = g_model.mixData[idx].destCh;
|
|
}
|
|
|
|
QByteArray mxData = mimeData->data("application/x-companion9x-mix");
|
|
|
|
int i = 0;
|
|
while(i<mxData.size()) {
|
|
idx++;
|
|
if(idx==GetEepromInterface()->getCapability(Mixes)) break;
|
|
|
|
if (!gm_insertMix(idx))
|
|
break;
|
|
MixData *md = &g_model.mixData[idx];
|
|
memcpy(md,mxData.mid(i,sizeof(MixData)).constData(),sizeof(MixData));
|
|
md->destCh = dch;
|
|
i += sizeof(MixData);
|
|
}
|
|
|
|
updateSettings();
|
|
tabMixes();
|
|
}
|
|
}
|
|
#include <iostream>
|
|
#include <QtGui/qwidget.h>
|
|
void ModelEdit::pasteExpoMimeData(const QMimeData * mimeData, int destIdx)
|
|
{
|
|
if (mimeData->hasFormat("application/x-companion9x-expo")) {
|
|
int idx; // mixer index
|
|
int dch;
|
|
|
|
if (destIdx < 0) {
|
|
dch = -destIdx - 1;
|
|
idx = getExpoIndex(dch) - 1; //get expo index to insert
|
|
} else {
|
|
idx = destIdx;
|
|
dch = g_model.expoData[idx].chn;
|
|
}
|
|
|
|
QByteArray mxData = mimeData->data("application/x-companion9x-expo");
|
|
|
|
int i = 0;
|
|
while (i < mxData.size()) {
|
|
idx++;
|
|
if (!gm_insertExpo(idx))
|
|
break;
|
|
ExpoData *md = &g_model.expoData[idx];
|
|
memcpy(md, mxData.mid(i, sizeof(ExpoData)).constData(), sizeof(ExpoData));
|
|
md->chn = dch;
|
|
i += sizeof(ExpoData);
|
|
}
|
|
|
|
updateSettings();
|
|
tabExpos();
|
|
}
|
|
}
|
|
|
|
void ModelEdit::mixersPaste()
|
|
{
|
|
const QClipboard *clipboard = QApplication::clipboard();
|
|
const QMimeData *mimeData = clipboard->mimeData();
|
|
QListWidgetItem *item = MixerlistWidget->currentItem();
|
|
if (item)
|
|
pasteMixerMimeData(mimeData, item->data(Qt::UserRole).toByteArray().at(0));
|
|
}
|
|
|
|
void ModelEdit::mixersDuplicate()
|
|
{
|
|
mixersCopy();
|
|
mixersPaste();
|
|
}
|
|
|
|
void ModelEdit::exposPaste()
|
|
{
|
|
const QClipboard *clipboard = QApplication::clipboard();
|
|
const QMimeData *mimeData = clipboard->mimeData();
|
|
QListWidgetItem *item = ExposlistWidget->currentItem();
|
|
if (item)
|
|
pasteExpoMimeData(mimeData, item->data(Qt::UserRole).toByteArray().at(0));
|
|
}
|
|
|
|
void ModelEdit::exposDuplicate()
|
|
{
|
|
exposCopy();
|
|
exposPaste();
|
|
}
|
|
|
|
void ModelEdit::mixerOpen()
|
|
{
|
|
int idx = MixerlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0);
|
|
if(idx<0) {
|
|
int i = -idx;
|
|
idx = getMixerIndex(i); //get mixer index to insert
|
|
if (!gm_insertMix(idx))
|
|
return;
|
|
g_model.mixData[idx].destCh = i;
|
|
mixInserted=true;
|
|
} else {
|
|
mixInserted=false;
|
|
}
|
|
|
|
gm_openMix(idx);
|
|
}
|
|
|
|
void ModelEdit::mixerAdd()
|
|
{
|
|
if (!MixerlistWidget->currentItem())
|
|
return;
|
|
int index = MixerlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0);
|
|
|
|
if(index<0) { // if empty then return relavent index
|
|
int i = -index;
|
|
index = getMixerIndex(i); //get mixer index to insert
|
|
if (!gm_insertMix(index))
|
|
return;
|
|
g_model.mixData[index].destCh = i;
|
|
mixInserted=true;
|
|
} else {
|
|
index++;
|
|
if (!gm_insertMix(index))
|
|
return;
|
|
g_model.mixData[index].destCh = g_model.mixData[index-1].destCh;
|
|
mixInserted=true;
|
|
}
|
|
gm_openMix(index);
|
|
}
|
|
|
|
void ModelEdit::expoOpen(QListWidgetItem *item)
|
|
{
|
|
if (!item)
|
|
item = ExposlistWidget->currentItem();
|
|
|
|
int idx = item->data(Qt::UserRole).toByteArray().at(0);
|
|
if (idx<0) {
|
|
int ch = -idx-1;
|
|
idx = getExpoIndex(ch); // get expo index to insert
|
|
if (!gm_insertExpo(idx))
|
|
return;
|
|
g_model.expoData[idx].chn = ch;
|
|
expoInserted=true;
|
|
} else {
|
|
expoInserted=false;
|
|
}
|
|
gm_openExpo(idx);
|
|
}
|
|
|
|
void ModelEdit::expoAdd()
|
|
{
|
|
int index = ExposlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0);
|
|
|
|
if(index<0) { // if empty then return relevant index
|
|
expoOpen();
|
|
} else {
|
|
index++;
|
|
if (!gm_insertExpo(index))
|
|
return;
|
|
g_model.expoData[index].chn = g_model.expoData[index-1].chn;
|
|
}
|
|
gm_openExpo(index);
|
|
}
|
|
|
|
void ModelEdit::mixerlistWidget_customContextMenuRequested(QPoint pos)
|
|
{
|
|
QPoint globalPos = MixerlistWidget->mapToGlobal(pos);
|
|
|
|
const QClipboard *clipboard = QApplication::clipboard();
|
|
const QMimeData *mimeData = clipboard->mimeData();
|
|
bool hasData = mimeData->hasFormat("application/x-companion9x-mix");
|
|
|
|
QMenu contextMenu;
|
|
contextMenu.addAction(QIcon(":/images/add.png"), tr("&Add"),this,SLOT(mixerAdd()),tr("Ctrl+A"));
|
|
contextMenu.addAction(QIcon(":/images/edit.png"), tr("&Edit"),this,SLOT(mixerOpen()),tr("Enter"));
|
|
contextMenu.addSeparator();
|
|
contextMenu.addAction(QIcon(":/images/clear.png"), tr("&Delete"),this,SLOT(mixersDelete()),tr("Delete"));
|
|
contextMenu.addAction(QIcon(":/images/copy.png"), tr("&Copy"),this,SLOT(mixersCopy()),tr("Ctrl+C"));
|
|
contextMenu.addAction(QIcon(":/images/cut.png"), tr("&Cut"),this,SLOT(mixersCut()),tr("Ctrl+X"));
|
|
contextMenu.addAction(QIcon(":/images/paste.png"), tr("&Paste"),this,SLOT(mixersPaste()),tr("Ctrl+V"))->setEnabled(hasData);
|
|
contextMenu.addAction(QIcon(":/images/duplicate.png"), tr("Du&plicate"),this,SLOT(mixersDuplicate()),tr("Ctrl+U"));
|
|
contextMenu.addSeparator();
|
|
contextMenu.addAction(QIcon(":/images/moveup.png"), tr("Move Up"),this,SLOT(moveMixUp()),tr("Ctrl+Up"));
|
|
contextMenu.addAction(QIcon(":/images/movedown.png"), tr("Move Down"),this,SLOT(moveMixDown()),tr("Ctrl+Down"));
|
|
|
|
contextMenu.exec(globalPos);
|
|
}
|
|
|
|
void ModelEdit::expolistWidget_customContextMenuRequested(QPoint pos)
|
|
{
|
|
QPoint globalPos = ExposlistWidget->mapToGlobal(pos);
|
|
|
|
const QClipboard *clipboard = QApplication::clipboard();
|
|
const QMimeData *mimeData = clipboard->mimeData();
|
|
bool hasData = mimeData->hasFormat("application/x-companion9x-expo");
|
|
|
|
QMenu contextMenu;
|
|
contextMenu.addAction(QIcon(":/images/add.png"), tr("&Add"),this,SLOT(expoAdd()),tr("Ctrl+A"));
|
|
contextMenu.addAction(QIcon(":/images/edit.png"), tr("&Edit"),this,SLOT(expoOpen()),tr("Enter"));
|
|
contextMenu.addSeparator();
|
|
contextMenu.addAction(QIcon(":/images/clear.png"), tr("&Delete"),this,SLOT(exposDelete()),tr("Delete"));
|
|
contextMenu.addAction(QIcon(":/images/copy.png"), tr("&Copy"),this,SLOT(exposCopy()),tr("Ctrl+C"));
|
|
contextMenu.addAction(QIcon(":/images/cut.png"), tr("&Cut"),this,SLOT(exposCut()),tr("Ctrl+X"));
|
|
contextMenu.addAction(QIcon(":/images/paste.png"), tr("&Paste"),this,SLOT(exposPaste()),tr("Ctrl+V"))->setEnabled(hasData);
|
|
contextMenu.addAction(QIcon(":/images/duplicate.png"), tr("Du&plicate"),this,SLOT(exposDuplicate()),tr("Ctrl+U"));
|
|
contextMenu.addSeparator();
|
|
contextMenu.addAction(QIcon(":/images/moveup.png"), tr("Move Up"),this,SLOT(moveExpoUp()),tr("Ctrl+Up"));
|
|
contextMenu.addAction(QIcon(":/images/movedown.png"), tr("Move Down"),this,SLOT(moveExpoDown()),tr("Ctrl+Down"));
|
|
|
|
contextMenu.exec(globalPos);
|
|
}
|
|
|
|
void ModelEdit::cswPaste()
|
|
{
|
|
const QClipboard *clipboard = QApplication::clipboard();
|
|
const QMimeData *mimeData = clipboard->mimeData();
|
|
if (mimeData->hasFormat("application/x-companion9x-csw")) {
|
|
QByteArray cswData = mimeData->data("application/x-companion9x-csw");
|
|
|
|
CustomSwData *csw = &g_model.customSw[selectedSwitch];
|
|
memcpy(csw, cswData.mid(0, sizeof(CustomSwData)).constData(), sizeof(CustomSwData));
|
|
updateSettings();
|
|
updateSelectedSwitch();
|
|
}
|
|
}
|
|
|
|
void ModelEdit::cswDelete()
|
|
{
|
|
g_model.customSw[selectedSwitch].clear();
|
|
updateSettings();
|
|
updateSelectedSwitch();
|
|
}
|
|
|
|
void ModelEdit::cswCopy()
|
|
{
|
|
QByteArray cswData;
|
|
cswData.append((char*)&g_model.customSw[selectedSwitch],sizeof(CustomSwData));
|
|
QMimeData *mimeData = new QMimeData;
|
|
mimeData->setData("application/x-companion9x-csw", cswData);
|
|
QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard);
|
|
}
|
|
|
|
void ModelEdit::updateSelectedSwitch()
|
|
{
|
|
switchEditLock = true;
|
|
populateCSWCB(csw[selectedSwitch], g_model.customSw[selectedSwitch].func);
|
|
setSwitchWidgetVisibility(selectedSwitch);
|
|
switchEditLock = false;
|
|
}
|
|
|
|
void ModelEdit::cswCut()
|
|
{
|
|
cswCopy();
|
|
cswDelete();
|
|
}
|
|
|
|
void ModelEdit::csw_customContextMenuRequested(QPoint pos)
|
|
{
|
|
QLabel *label = (QLabel *)sender();
|
|
if (!label)
|
|
return;
|
|
QString name=label->objectName();
|
|
if (!name.startsWith("cswlabel"))
|
|
return;
|
|
selectedSwitch=name.mid(9,2).toInt()-1;
|
|
|
|
QPoint globalPos = label->mapToGlobal(pos);
|
|
|
|
const QClipboard *clipboard = QApplication::clipboard();
|
|
const QMimeData *mimeData = clipboard->mimeData();
|
|
bool hasData = mimeData->hasFormat("application/x-companion9x-csw");
|
|
|
|
QMenu contextMenu;
|
|
contextMenu.addAction(QIcon(":/images/clear.png"), tr("&Delete"),this,SLOT(cswDelete()),tr("Delete"));
|
|
contextMenu.addAction(QIcon(":/images/copy.png"), tr("&Copy"),this,SLOT(cswCopy()),tr("Ctrl+C"));
|
|
contextMenu.addAction(QIcon(":/images/cut.png"), tr("&Cut"),this,SLOT(cswCut()),tr("Ctrl+X"));
|
|
contextMenu.addAction(QIcon(":/images/paste.png"), tr("&Paste"),this,SLOT(cswPaste()),tr("Ctrl+V"))->setEnabled(hasData);
|
|
|
|
contextMenu.exec(globalPos);
|
|
}
|
|
|
|
void ModelEdit::fsw_customContextMenuRequested(QPoint pos)
|
|
{
|
|
QLabel *label = (QLabel *)sender();
|
|
if (!label)
|
|
return;
|
|
int fsw=label->property("FunctionId").toInt();
|
|
if (!(fsw>0 && fsw<=32))
|
|
return;
|
|
selectedFunction=fsw-1;
|
|
|
|
QPoint globalPos = label->mapToGlobal(pos);
|
|
|
|
const QClipboard *clipboard = QApplication::clipboard();
|
|
const QMimeData *mimeData = clipboard->mimeData();
|
|
bool hasData = mimeData->hasFormat("application/x-companion9x-fsw");
|
|
|
|
QMenu contextMenu;
|
|
contextMenu.addAction(QIcon(":/images/clear.png"), tr("&Delete"),this,SLOT(fswDelete()),tr("Delete"));
|
|
contextMenu.addAction(QIcon(":/images/copy.png"), tr("&Copy"),this,SLOT(fswCopy()),tr("Ctrl+C"));
|
|
contextMenu.addAction(QIcon(":/images/cut.png"), tr("&Cut"),this,SLOT(fswCut()),tr("Ctrl+X"));
|
|
contextMenu.addAction(QIcon(":/images/paste.png"), tr("&Paste"),this,SLOT(fswPaste()),tr("Ctrl+V"))->setEnabled(hasData);
|
|
|
|
contextMenu.exec(globalPos);
|
|
}
|
|
|
|
void ModelEdit::fswPaste()
|
|
{
|
|
const QClipboard *clipboard = QApplication::clipboard();
|
|
const QMimeData *mimeData = clipboard->mimeData();
|
|
if (mimeData->hasFormat("application/x-companion9x-fsw")) {
|
|
QByteArray fswData = mimeData->data("application/x-companion9x-fsw");
|
|
|
|
FuncSwData *fsw = &g_model.funcSw[selectedFunction];
|
|
memcpy(fsw, fswData.mid(0, sizeof(FuncSwData)).constData(), sizeof(FuncSwData));
|
|
updateSettings();
|
|
tabCustomFunctions();
|
|
}
|
|
}
|
|
|
|
void ModelEdit::fswDelete()
|
|
{
|
|
g_model.funcSw[selectedFunction].clear();
|
|
updateSettings();
|
|
tabCustomFunctions();
|
|
}
|
|
|
|
void ModelEdit::fswCopy()
|
|
{
|
|
QByteArray fswData;
|
|
fswData.append((char*)&g_model.funcSw[selectedFunction],sizeof(FuncSwData));
|
|
QMimeData *mimeData = new QMimeData;
|
|
mimeData->setData("application/x-companion9x-fsw", fswData);
|
|
QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard);
|
|
}
|
|
|
|
void ModelEdit::fswCut()
|
|
{
|
|
fswCopy();
|
|
fswDelete();
|
|
}
|
|
|
|
void ModelEdit::mixerlistWidget_KeyPress(QKeyEvent *event)
|
|
{
|
|
if(event->matches(QKeySequence::SelectAll)) mixerAdd(); //Ctrl A
|
|
if(event->matches(QKeySequence::Delete)) mixersDelete();
|
|
if(event->matches(QKeySequence::Copy)) mixersCopy();
|
|
if(event->matches(QKeySequence::Cut)) mixersCut();
|
|
if(event->matches(QKeySequence::Paste)) mixersPaste();
|
|
if(event->matches(QKeySequence::Underline)) mixersDuplicate();
|
|
|
|
if(event->key()==Qt::Key_Return || event->key()==Qt::Key_Enter) mixerOpen();
|
|
if(event->matches(QKeySequence::MoveToNextLine))
|
|
MixerlistWidget->setCurrentRow(MixerlistWidget->currentRow()+1);
|
|
if(event->matches(QKeySequence::MoveToPreviousLine))
|
|
MixerlistWidget->setCurrentRow(MixerlistWidget->currentRow()-1);
|
|
}
|
|
|
|
void ModelEdit::expolistWidget_KeyPress(QKeyEvent *event)
|
|
{
|
|
if(event->matches(QKeySequence::SelectAll)) expoAdd(); //Ctrl A
|
|
if(event->matches(QKeySequence::Delete)) exposDelete();
|
|
if(event->matches(QKeySequence::Copy)) exposCopy();
|
|
if(event->matches(QKeySequence::Cut)) exposCut();
|
|
if(event->matches(QKeySequence::Paste)) exposPaste();
|
|
if(event->matches(QKeySequence::Underline)) exposDuplicate();
|
|
|
|
if(event->key()==Qt::Key_Return || event->key()==Qt::Key_Enter) expoOpen();
|
|
if(event->matches(QKeySequence::MoveToNextLine))
|
|
ExposlistWidget->setCurrentRow(ExposlistWidget->currentRow()+1);
|
|
if(event->matches(QKeySequence::MoveToPreviousLine))
|
|
ExposlistWidget->setCurrentRow(ExposlistWidget->currentRow()-1);
|
|
}
|
|
|
|
int ModelEdit::gm_moveMix(int idx, bool dir) //true=inc=down false=dec=up
|
|
{
|
|
if(idx>GetEepromInterface()->getCapability(Mixes) || (idx==0 && !dir) || (idx==GetEepromInterface()->getCapability(Mixes) && dir)) return idx;
|
|
|
|
int tdx = dir ? idx+1 : idx-1;
|
|
MixData &src=g_model.mixData[idx];
|
|
MixData &tgt=g_model.mixData[tdx];
|
|
|
|
unsigned int outputs = GetEepromInterface()->getCapability(Outputs);
|
|
if((src.destCh==0) || (src.destCh>outputs) || (tgt.destCh>outputs)) return idx;
|
|
|
|
if(tgt.destCh!=src.destCh) {
|
|
if ((dir) && (src.destCh<outputs)) src.destCh++;
|
|
if ((!dir) && (src.destCh>0)) src.destCh--;
|
|
return idx;
|
|
}
|
|
|
|
//flip between idx and tgt
|
|
MixData temp;
|
|
memcpy(&temp,&src,sizeof(MixData));
|
|
memcpy(&src,&tgt,sizeof(MixData));
|
|
memcpy(&tgt,&temp,sizeof(MixData));
|
|
return tdx;
|
|
}
|
|
|
|
void ModelEdit::moveMixUp()
|
|
{
|
|
QList<int> list = createMixListFromSelected();
|
|
QList<int> highlightList;
|
|
foreach(int idx, list) {
|
|
highlightList << gm_moveMix(idx, false);
|
|
}
|
|
updateSettings();
|
|
tabMixes();
|
|
setSelectedByMixList(highlightList);
|
|
}
|
|
|
|
void ModelEdit::moveMixDown()
|
|
{
|
|
QList<int> list = createMixListFromSelected();
|
|
QList<int> highlightList;
|
|
foreach(int idx, list) {
|
|
highlightList << gm_moveMix(idx, true);
|
|
}
|
|
updateSettings();
|
|
tabMixes();
|
|
setSelectedByMixList(highlightList);
|
|
}
|
|
|
|
int ModelEdit::gm_moveExpo(int idx, bool dir) //true=inc=down false=dec=up
|
|
{
|
|
if(idx>C9X_MAX_EXPOS || (idx==C9X_MAX_EXPOS && dir)) return idx;
|
|
|
|
int tdx = dir ? idx+1 : idx-1;
|
|
ExpoData temp;
|
|
temp.clear();
|
|
ExpoData &src=g_model.expoData[idx];
|
|
ExpoData &tgt=g_model.expoData[tdx];
|
|
if (!dir && tdx<0 && src.chn>0) {
|
|
src.chn--;
|
|
return idx;
|
|
} else if (!dir && tdx<0) {
|
|
return idx;
|
|
}
|
|
|
|
if(memcmp(&src,&temp,sizeof(ExpoData))==0) return idx;
|
|
bool tgtempty=(memcmp(&tgt,&temp,sizeof(ExpoData))==0 ? 1:0);
|
|
if(tgt.chn!=src.chn || tgtempty) {
|
|
if ((dir) && (src.chn<(NUM_STICKS-1))) src.chn++;
|
|
if ((!dir) && (src.chn>0)) src.chn--;
|
|
return idx;
|
|
}
|
|
|
|
//flip between idx and tgt
|
|
memcpy(&temp,&src,sizeof(ExpoData));
|
|
memcpy(&src,&tgt,sizeof(ExpoData));
|
|
memcpy(&tgt,&temp,sizeof(ExpoData));
|
|
return tdx;
|
|
}
|
|
|
|
void ModelEdit::moveExpoUp()
|
|
{
|
|
QList<int> list = createExpoListFromSelected();
|
|
QList<int> highlightList;
|
|
foreach(int idx, list) {
|
|
highlightList << gm_moveExpo(idx, false);
|
|
}
|
|
updateSettings();
|
|
tabExpos();
|
|
setSelectedByExpoList(highlightList);
|
|
}
|
|
|
|
void ModelEdit::moveExpoDown()
|
|
{
|
|
QList<int> list = createExpoListFromSelected();
|
|
QList<int> highlightList;
|
|
foreach(int idx, list) {
|
|
highlightList << gm_moveExpo(idx, true);
|
|
}
|
|
updateSettings();
|
|
tabExpos();
|
|
setSelectedByExpoList(highlightList);
|
|
}
|
|
|
|
void ModelEdit::launchSimulation()
|
|
{
|
|
if (GetEepromInterface()->getSimulator()) {
|
|
RadioData *simuData = new RadioData;
|
|
*simuData = radioData;
|
|
simuData->models[id_model] = g_model;
|
|
if (GetEepromInterface()->getCapability(SimulatorType)) {
|
|
xsimulatorDialog sd(this);
|
|
sd.loadParams(*simuData, id_model);
|
|
sd.exec();
|
|
} else {
|
|
simulatorDialog sd(this);
|
|
sd.loadParams(*simuData, id_model);
|
|
sd.exec();
|
|
}
|
|
} else {
|
|
QMessageBox::warning(NULL,
|
|
QObject::tr("Warning"),
|
|
QObject::tr("Simulator for this firmware is not yet available"));
|
|
}
|
|
}
|
|
|
|
void ModelEdit::on_pushButton_clicked()
|
|
{
|
|
launchSimulation();
|
|
}
|
|
|
|
void ModelEdit::resetCurve()
|
|
{
|
|
QPushButton *button = (QPushButton *)sender();
|
|
int btn=button->objectName().mid(button->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
if (btn!=currentCurve) {
|
|
int res = QMessageBox::question(this, "Companion",tr("Are you sure you want to delete curve %1 ?").arg(btn+1),QMessageBox::Yes | QMessageBox::No);
|
|
if (res == QMessageBox::No) {
|
|
return;
|
|
}
|
|
}
|
|
memset(g_model.curves[btn].name,0,sizeof(g_model.curves[btn].name));
|
|
ui->cname_LE->clear();
|
|
g_model.curves[btn].count=5;
|
|
g_model.curves[btn].custom=false;
|
|
curvesLock=true;
|
|
for (int i=0; i<17; i++) {
|
|
g_model.curves[btn].points[i].x=0;
|
|
g_model.curves[btn].points[i].y=0;
|
|
spnx[i]->setMinimum(-100);
|
|
spnx[i]->setMaximum(100);
|
|
spnx[i]->setValue(0);
|
|
spny[i]->setValue(0);
|
|
}
|
|
curvesLock=false;
|
|
updateCurvesTab();
|
|
if (btn==currentCurve) {
|
|
ui->curvetype_CB->setCurrentIndex(2);
|
|
}
|
|
updateSettings();
|
|
drawCurve();
|
|
}
|
|
|
|
void ModelEdit::editCurve()
|
|
{
|
|
QPushButton *button = (QPushButton *)sender();
|
|
int btn=button->objectName().mid(button->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
setCurrentCurve(btn);
|
|
drawCurve();
|
|
}
|
|
|
|
void ModelEdit::plotCurve(bool checked)
|
|
{
|
|
QCheckBox *chk = (QCheckBox *)sender();
|
|
int btn=chk->objectName().mid(chk->objectName().lastIndexOf("_")+1).toInt()-1;
|
|
plot_curve[btn] = checked;
|
|
drawCurve();
|
|
}
|
|
|
|
void ModelEdit::on_T2ThrTrgChkB_toggled(bool checked)
|
|
{
|
|
g_model.t2throttle = checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_extendedLimitsChkB_toggled(bool checked)
|
|
{
|
|
g_model.extendedLimits = checked;
|
|
setLimitMinMax();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_thrwarnChkB_toggled(bool checked)
|
|
{
|
|
if (switchEditLock)
|
|
return;
|
|
g_model.disableThrottleWarning = checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_thrrevChkB_toggled(bool checked)
|
|
{
|
|
g_model.throttleReversed = checked;
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_extendedTrimsChkB_toggled(bool checked)
|
|
{
|
|
g_model.extendedTrims = checked;
|
|
tabPhases();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::setLimitMinMax()
|
|
{
|
|
on_numChannelsSB_editingFinished();
|
|
on_numChannelsSB_2_editingFinished();
|
|
on_numChannelsSB_3_editingFinished();
|
|
int v = g_model.extendedLimits ? 125 : 100;
|
|
foreach(QSpinBox *sb, findChildren<QSpinBox *>(QRegExp("minSB_[0-9]+"))) {
|
|
sb->setMaximum(25);
|
|
sb->setMinimum(-v);
|
|
}
|
|
foreach(QSpinBox *sb, findChildren<QSpinBox *>(QRegExp("maxSB_[0-9]+"))) {
|
|
sb->setMaximum(v);
|
|
sb->setMinimum(-25);
|
|
}
|
|
}
|
|
|
|
|
|
void ModelEdit::safetySwitchesEdited()
|
|
{
|
|
for(int i=0; i<NUM_SAFETY_CHNOUT; i++) {
|
|
g_model.safetySw[i].swtch = RawSwitch(safetySwitchSwtch[i]->itemData(safetySwitchSwtch[i]->currentIndex()).toInt());
|
|
g_model.safetySw[i].val = safetySwitchValue[i]->value();
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
|
|
|
|
void ModelEdit::on_templateList_doubleClicked(QModelIndex index)
|
|
{
|
|
QString text = ui->templateList->item(index.row())->text();
|
|
if (index.row()==13) {
|
|
uint64_t result=0xffffffff;
|
|
modelConfigDialog *mcw = new modelConfigDialog(radioData, &result, this);
|
|
mcw->exec();
|
|
if (result!=0xffffffff) {
|
|
applyNumericTemplate(result);
|
|
updateSettings();
|
|
tabMixes();
|
|
}
|
|
} else {
|
|
int res = QMessageBox::question(this,tr("Apply Template?"),tr("Apply template \"%1\"?").arg(text),QMessageBox::Yes | QMessageBox::No);
|
|
if(res!=QMessageBox::Yes) return;
|
|
applyTemplate(index.row());
|
|
updateSettings();
|
|
tabMixes();
|
|
}
|
|
}
|
|
|
|
|
|
MixData* ModelEdit::setDest(uint8_t dch)
|
|
{
|
|
uint8_t i = 0;
|
|
while ((g_model.mixData[i].destCh<=dch) && (g_model.mixData[i].destCh) && (i<GetEepromInterface()->getCapability(Mixes))) i++;
|
|
if(i==GetEepromInterface()->getCapability(Mixes)) return &g_model.mixData[0];
|
|
|
|
memmove(&g_model.mixData[i+1],&g_model.mixData[i],
|
|
(GetEepromInterface()->getCapability(Mixes)-(i+1))*sizeof(MixData) );
|
|
memset(&g_model.mixData[i],0,sizeof(MixData));
|
|
g_model.mixData[i].destCh = dch;
|
|
return &g_model.mixData[i];
|
|
}
|
|
|
|
void ModelEdit::clearExpos(bool ask)
|
|
{
|
|
if(ask) {
|
|
int res = QMessageBox::question(this,tr("Clear Expos?"),tr("Really clear all the expos?"),QMessageBox::Yes | QMessageBox::No);
|
|
if(res!=QMessageBox::Yes) return;
|
|
}
|
|
memset(g_model.expoData,0,sizeof(g_model.expoData)); //clear all expos
|
|
updateSettings();
|
|
tabExpos();
|
|
}
|
|
|
|
void ModelEdit::clearMixes(bool ask)
|
|
{
|
|
if(ask) {
|
|
int res = QMessageBox::question(this,tr("Clear Mixes?"),tr("Really clear all the mixes?"),QMessageBox::Yes | QMessageBox::No);
|
|
if(res!=QMessageBox::Yes) return;
|
|
}
|
|
memset(g_model.mixData,0,sizeof(g_model.mixData)); //clear all mixes
|
|
updateSettings();
|
|
tabMixes();
|
|
}
|
|
|
|
void ModelEdit::clearCurves(bool ask)
|
|
{
|
|
if(ask) {
|
|
int res = QMessageBox::question(this,tr("Clear Curves?"),tr("Really clear all the curves?"),QMessageBox::Yes | QMessageBox::No);
|
|
if(res!=QMessageBox::Yes) return;
|
|
}
|
|
curvesLock=true;
|
|
if (!GetEepromInterface()->getCapability(CustomCurves)){
|
|
ui->curvetype_CB->setDisabled(true);
|
|
int count=0;
|
|
for (int j=0; j< GetEepromInterface()->getCapability(NumCurves3); j++) {
|
|
g_model.curves[count].count=3;
|
|
g_model.curves[count].custom=false;
|
|
memset(g_model.curves[j].name,0,sizeof(g_model.curves[j].name));
|
|
for (int i=0; i<17; i++) {
|
|
g_model.curves[count].points[i].x=0;
|
|
g_model.curves[count].points[i].y=0;
|
|
}
|
|
count++;
|
|
}
|
|
for (int j=0; j< GetEepromInterface()->getCapability(NumCurves5); j++) {
|
|
g_model.curves[count].count=5;
|
|
g_model.curves[count].custom=false;
|
|
memset(g_model.curves[j].name,0,sizeof(g_model.curves[j].name));
|
|
for (int i=0; i<17; i++) {
|
|
g_model.curves[count].points[i].x=0;
|
|
g_model.curves[count].points[i].y=0;
|
|
}
|
|
count++;
|
|
}
|
|
for (int j=0; j< GetEepromInterface()->getCapability(NumCurves9); j++) {
|
|
g_model.curves[count].count=9;
|
|
g_model.curves[count].custom=false;
|
|
memset(g_model.curves[j].name,0,sizeof(g_model.curves[j].name));
|
|
for (int i=0; i<17; i++) {
|
|
g_model.curves[count].points[i].x=0;
|
|
g_model.curves[count].points[i].y=0;
|
|
}
|
|
count++;
|
|
}
|
|
for (int j=count; j<16; j++) {
|
|
g_model.curves[j].count=5;
|
|
g_model.curves[j].custom=false;
|
|
memset(g_model.curves[j].name,0,sizeof(g_model.curves[j].name));
|
|
for (int i=0; i<17; i++) {
|
|
g_model.curves[j].points[i].x=0;
|
|
g_model.curves[j].points[i].y=0;
|
|
}
|
|
}
|
|
} else {
|
|
for (int j=0; j<16; j++) {
|
|
g_model.curves[j].count=5;
|
|
g_model.curves[j].custom=false;
|
|
memset(g_model.curves[j].name,0,sizeof(g_model.curves[j].name));
|
|
for (int i=0; i<17; i++) {
|
|
g_model.curves[j].points[i].x=0;
|
|
g_model.curves[j].points[i].y=0;
|
|
}
|
|
}
|
|
}
|
|
for (int i=0; i<17; i++) {
|
|
spnx[i]->setMinimum(-100);
|
|
spnx[i]->setMaximum(100);
|
|
spnx[i]->setValue(0);
|
|
spny[i]->setValue(0);
|
|
}
|
|
currentCurve=0;
|
|
curvesLock=false;
|
|
if (GetEepromInterface()->getCapability(NumCurves3)>0) {
|
|
ui->curvetype_CB->setCurrentIndex(0);
|
|
} else {
|
|
ui->curvetype_CB->setCurrentIndex(2);
|
|
}
|
|
ui->cname_LE->clear();
|
|
updateSettings();
|
|
drawCurve();
|
|
}
|
|
|
|
void ModelEdit::setCurve(uint8_t c, int8_t ar[])
|
|
{
|
|
int len=sizeof(ar)/sizeof(int8_t);
|
|
if (GetEepromInterface()->getCapability(CustomCurves)) {
|
|
if (GetEepromInterface()->getCapability(NumCurves)>c) {
|
|
if (len<9) {
|
|
g_model.curves[c].count=5;
|
|
g_model.curves[c].custom=false;
|
|
for (int i=0; i< 5; i++) {
|
|
g_model.curves[c].points[i].y=ar[i];
|
|
}
|
|
} else {
|
|
g_model.curves[c].count=5;
|
|
g_model.curves[c].custom=false;
|
|
for (int i=0; i< 5; i++) {
|
|
g_model.curves[c].points[i].y=ar[i];
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (len<9) {
|
|
g_model.curves[c].count=5;
|
|
g_model.curves[c].custom=false;
|
|
for (int i=0; i< 5; i++) {
|
|
g_model.curves[c].points[i].y=ar[i];
|
|
}
|
|
} else {
|
|
g_model.curves[c+8].count=5;
|
|
g_model.curves[c+8].custom=false;
|
|
for (int i=0; i< 5; i++) {
|
|
g_model.curves[c+8].points[i].y=ar[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ModelEdit::setSwitch(unsigned int idx, unsigned int func, int v1, int v2)
|
|
{
|
|
g_model.customSw[idx-1].func = func;
|
|
g_model.customSw[idx-1].val1 = v1;
|
|
g_model.customSw[idx-1].val2 = v2;
|
|
}
|
|
|
|
void ModelEdit::applyNumericTemplate(uint64_t tpl)
|
|
{
|
|
clearCurves(false);
|
|
clearExpos(false);
|
|
clearMixes(false);
|
|
int8_t heli_ar1[] = {-100, -20, 30, 70, 90};
|
|
int8_t heli_ar2[] = {80, 70, 60, 70, 100};
|
|
int8_t heli_ar3[] = {100, 90, 80, 90, 100};
|
|
int8_t heli_ar4[] = {-30, -15, 0, 50, 100};
|
|
int8_t heli_ar5[] = {-100, -50, 0, 50, 100};
|
|
bool rx[10];
|
|
for (int i=0; i<10 ; i++) {
|
|
rx[i]=false;
|
|
}
|
|
int thrsw=GetEepromInterface()->getCapability(GetThrSwitch);
|
|
MixData *md = &g_model.mixData[0];
|
|
uint8_t spo2ch=(tpl & 0x0F);
|
|
tpl>>=4;
|
|
uint8_t spo1ch=(tpl & 0x0F);
|
|
tpl>>=4;
|
|
uint8_t fla2ch=(tpl & 0x0F);
|
|
tpl>>=4;
|
|
uint8_t fla1ch=(tpl & 0x0F);
|
|
tpl>>=4;
|
|
uint8_t rud2ch=(tpl & 0x0F);
|
|
tpl>>=4;
|
|
uint8_t ele2ch=(tpl & 0x0F);
|
|
tpl>>=4;
|
|
uint8_t ail2ch=(tpl & 0x0F);
|
|
tpl>>=4;
|
|
uint8_t chstyle=(tpl & 0x03);
|
|
tpl>>=2;
|
|
uint8_t gyro=(tpl & 0x03);
|
|
tpl>>=2;
|
|
uint8_t tailtype=(tpl & 0x03);
|
|
tpl>>=2;
|
|
uint8_t swashtype=(tpl & 0x07);
|
|
tpl>>=3;
|
|
uint8_t ruddertype=(tpl & 0x03);
|
|
tpl>>=2;
|
|
uint8_t spoilertype=(tpl & 0x3);
|
|
tpl>>=2;
|
|
uint8_t flaptype=(tpl & 0x03);
|
|
tpl>>=2;
|
|
uint8_t ailerontype=(tpl & 0x03);
|
|
tpl>>=2;
|
|
uint8_t enginetype=(tpl & 0x03);
|
|
tpl>>=2;
|
|
uint8_t modeltype=(tpl & 0x03);
|
|
|
|
#define ICC(x) icc[(x)-1]
|
|
uint8_t icc[4] = {0};
|
|
for(uint8_t i=1; i<=4; i++) //generate inverse array
|
|
for(uint8_t j=1; j<=4; j++) if(CC(i)==j) icc[j-1]=i;
|
|
|
|
int ailerons;
|
|
int flaps;
|
|
int throttle;
|
|
int spoilers;
|
|
int elevators;
|
|
int rudders;
|
|
int sign;
|
|
uint8_t rxch;
|
|
switch (modeltype) {
|
|
case 0:
|
|
ailerons=ailerontype;
|
|
flaps=flaptype;
|
|
throttle=1;
|
|
switch (tailtype) {
|
|
case 0:
|
|
case 1:
|
|
rudders=1;
|
|
elevators=1;
|
|
break;
|
|
case 2:
|
|
rudders=1;
|
|
elevators=2;
|
|
break;
|
|
}
|
|
rxch=ICC(STK_RUD);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("RUD").toAscii().data(),6);
|
|
if (tailtype==1) {
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
}
|
|
rx[rxch-1]=true;
|
|
rxch=ICC(STK_ELE);
|
|
if (tailtype==1) {
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("RUD").toAscii().data(),6);
|
|
}
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
rxch=ICC(STK_THR);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("THR").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
if (ail2ch > 0) {
|
|
rx[ail2ch-1]=true;
|
|
}
|
|
if (ele2ch > 0) {
|
|
rx[ele2ch-1]=true;
|
|
}
|
|
if (fla1ch > 0) {
|
|
rx[fla1ch-1]=true;
|
|
}
|
|
if (fla2ch > 0) {
|
|
rx[fla2ch-1]=true;
|
|
}
|
|
if (ailerons>0) {
|
|
rxch=ICC(STK_AIL);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
}
|
|
if (ailerons>1) {
|
|
if (ail2ch==0) {
|
|
for (int j=0; j<10 ; j++) {
|
|
if (!rx[j]) {
|
|
md=setDest(j+1); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL2").toAscii().data(),6);
|
|
rx[j]=true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
md=setDest(ail2ch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL2").toAscii().data(),6);
|
|
}
|
|
}
|
|
if (elevators>1) {
|
|
if (ele2ch==0) {
|
|
for (int j=0; j<10 ; j++) {
|
|
if (!rx[j]) {
|
|
md=setDest(j+1); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-100; md->swtch=RawSwitch();;strncpy(md->name, tr("ELE2").toAscii().data(),6);
|
|
rx[j]=true;
|
|
break;
|
|
}
|
|
}
|
|
}else{
|
|
md=setDest(ele2ch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-100; md->swtch=RawSwitch();;strncpy(md->name, tr("ELE2").toAscii().data(),6);
|
|
}
|
|
}
|
|
if (flaps>0) {
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_AIL);strncpy(md->name, tr("FLAPS").toAscii().data(),6); md->speedUp=4; md->speedDown=4;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_AIL);strncpy(md->name, tr("FLAPS").toAscii().data(),6); md->speedUp=4; md->speedDown=4;
|
|
}
|
|
sign=-1;
|
|
for (uint8_t i=0; i< flaps; i++) {
|
|
sign*=-1;
|
|
int index;
|
|
if (i==0) {
|
|
index=fla1ch;
|
|
} else {
|
|
index=fla2ch;
|
|
}
|
|
if (index==0) {
|
|
for (int j=0; j<10 ; j++) {
|
|
if (!rx[j]) {
|
|
md=setDest(j+1); md->srcRaw=RawSource(SOURCE_TYPE_CH, 10); md->weight=100*sign; md->sOffset=0; md->swtch=RawSwitch();strncpy(md->name, tr("FLAP%1").arg(i+1).toAscii().data(),6);
|
|
rx[j]=true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
md=setDest(index); md->srcRaw=RawSource(SOURCE_TYPE_CH, 10); md->weight=100*sign; md->sOffset=0; md->swtch=RawSwitch();strncpy(md->name, tr("FLAP%1").arg(i+1).toAscii().data(),6);
|
|
}
|
|
}
|
|
break;
|
|
case 1:
|
|
setCurve(CURVE5(1),heli_ar1);
|
|
setCurve(CURVE5(2),heli_ar2);
|
|
setCurve(CURVE5(3),heli_ar3);
|
|
setCurve(CURVE5(4),heli_ar4);
|
|
setCurve(CURVE5(5),heli_ar5);
|
|
setCurve(CURVE5(6),heli_ar5);
|
|
switch (swashtype) {
|
|
case 0:
|
|
g_model.swashRingData.type = HELI_SWASH_TYPE_90;
|
|
break;
|
|
case 1:
|
|
g_model.swashRingData.type = HELI_SWASH_TYPE_120;
|
|
break;
|
|
case 2:
|
|
g_model.swashRingData.type = HELI_SWASH_TYPE_120X;
|
|
break;
|
|
case 3:
|
|
g_model.swashRingData.type = HELI_SWASH_TYPE_140;
|
|
break;
|
|
case 4:
|
|
g_model.swashRingData.type = HELI_SWASH_TYPE_NONE;
|
|
break;
|
|
}
|
|
g_model.swashRingData.collectiveSource = RawSource(SOURCE_TYPE_CH, 10);
|
|
|
|
if (chstyle==0) {
|
|
if (swashtype!=4) {
|
|
md=setDest(1); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 0); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
md=setDest(2); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 1); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL").toAscii().data(),6);
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 2); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("PITCH").toAscii().data(),6);
|
|
} else {
|
|
md=setDest(1); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
md=setDest(2); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL").toAscii().data(),6);
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_CH, 10); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("PITCH").toAscii().data(),6);
|
|
}
|
|
md=setDest(4); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("RUD").toAscii().data(),6);
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(1); md->carryTrim=TRIM_OFF;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(2); md->carryTrim=TRIM_OFF;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(3); md->carryTrim=TRIM_OFF;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,thrsw); md->mltpx=MLTPX_REP;
|
|
switch (gyro) {
|
|
case 1:
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=30; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA);strncpy(md->name, tr("GYRO").toAscii().data(),6);
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-30; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA);strncpy(md->name, tr("GYRO").toAscii().data(),6);
|
|
break;
|
|
case 2:
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight= 50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA); md->sOffset=100;strncpy(md->name, tr("GYRO").toAscii().data(),6);
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=-50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA); md->sOffset=100;strncpy(md->name, tr("GYRO").toAscii().data(),6);
|
|
break;
|
|
}
|
|
} else {
|
|
if (swashtype!=4) {
|
|
md=setDest(1); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 1); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL").toAscii().data(),6);
|
|
md=setDest(2); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 0); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 2); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("PITCH").toAscii().data(),6);
|
|
} else {
|
|
md=setDest(1); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL").toAscii().data(),6);
|
|
md=setDest(2); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_CH, 10); md->weight= 100; md->swtch=RawSwitch();strncpy(md->name, tr("PITCH").toAscii().data(),6);
|
|
}
|
|
md=setDest(4); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("RUD").toAscii().data(),6);
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(1); md->carryTrim=TRIM_OFF;
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(2); md->carryTrim=TRIM_OFF;
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(3); md->carryTrim=TRIM_OFF;
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,thrsw); md->mltpx=MLTPX_REP;
|
|
switch (gyro) {
|
|
case 1:
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=30; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA);strncpy(md->name, tr("GYRO").toAscii().data(),6);
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-30; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA);strncpy(md->name, tr("GYRO").toAscii().data(),6);
|
|
break;
|
|
case 2:
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight= 50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA); md->sOffset=100;strncpy(md->name, tr("GYRO").toAscii().data(),6);
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=-50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA); md->sOffset=100;strncpy(md->name, tr("GYRO").toAscii().data(),6);
|
|
break;
|
|
}
|
|
}
|
|
// collective
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(4); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(5); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(6); md->carryTrim=TRIM_OFF;
|
|
break;
|
|
case 2:
|
|
ailerons=ailerontype;
|
|
flaps=flaptype;
|
|
spoilers=spoilertype;
|
|
throttle=enginetype;
|
|
switch (tailtype) {
|
|
case 0:
|
|
case 1:
|
|
rudders=1;
|
|
elevators=1;
|
|
break;
|
|
case 2:
|
|
rudders=1;
|
|
elevators=2;
|
|
break;
|
|
}
|
|
if (throttle==1) {
|
|
rxch=ICC(STK_THR);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("THR").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
}
|
|
rxch=ICC(STK_RUD);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("RUD").toAscii().data(),6);
|
|
if (tailtype==1) {
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-100; md->swtch=RawSwitch();strncpy(md->name, tr("RUD").toAscii().data(),6);
|
|
}
|
|
rx[rxch-1]=true;
|
|
rxch=ICC(STK_ELE);
|
|
if (tailtype==1) {
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=-100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
}
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
if (ail2ch > 0) {
|
|
rx[ail2ch-1]=true;
|
|
}
|
|
if (ele2ch > 0) {
|
|
rx[ele2ch-1]=true;
|
|
}
|
|
if (fla1ch > 0) {
|
|
rx[fla1ch-1]=true;
|
|
}
|
|
if (fla2ch > 0) {
|
|
rx[fla2ch-1]=true;
|
|
}
|
|
if (spo1ch > 0) {
|
|
rx[spo1ch-1]=true;
|
|
}
|
|
if (spo2ch > 0) {
|
|
rx[spo2ch-1]=true;
|
|
}
|
|
|
|
if (ailerons>0) {
|
|
rxch=ICC(STK_AIL);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
}
|
|
if (ailerons>1) {
|
|
if (ail2ch==0) {
|
|
for (int j=0; j<10 ; j++) {
|
|
if (!rx[j]) {
|
|
md=setDest(j+1); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL2").toAscii().data(),6);
|
|
rx[j]=true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
md=setDest(ail2ch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL2").toAscii().data(),6);
|
|
}
|
|
}
|
|
if (elevators>1) {
|
|
if (ele2ch==0) {
|
|
for (int j=0; j<10 ; j++) {
|
|
if (!rx[j]) {
|
|
md=setDest(j+1); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE2").toAscii().data(),6);
|
|
rx[j]=true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
md=setDest(ele2ch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE2").toAscii().data(),6);
|
|
}
|
|
}
|
|
if (flaps>0) {
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_AIL);strncpy(md->name, tr("FLAPS").toAscii().data(),6);md->speedUp=4; md->speedDown=4;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_AIL);strncpy(md->name, tr("FLAPS").toAscii().data(),6);md->speedUp=4; md->speedDown=4;
|
|
}
|
|
sign=-1;
|
|
for (uint8_t i=0; i< flaps; i++) {
|
|
sign*=-1;
|
|
int index;
|
|
if (i==0) {
|
|
index=fla1ch;
|
|
} else {
|
|
index=fla2ch;
|
|
}
|
|
if (index==0) {
|
|
for (int j=0; j<10 ; j++) {
|
|
if (!rx[j]) {
|
|
md=setDest(j+1); md->srcRaw=RawSource(SOURCE_TYPE_CH, 10); md->weight=100*sign; md->sOffset=0; md->swtch=RawSwitch();strncpy(md->name, tr("FLAP%1").arg(i+1).toAscii().data(),6);
|
|
rx[j]=true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
md=setDest(index); md->srcRaw=RawSource(SOURCE_TYPE_CH, 10); md->weight=100*sign; md->sOffset=0; md->swtch=RawSwitch();strncpy(md->name, tr("FLAP%1").arg(i+1).toAscii().data(),6);
|
|
}
|
|
}
|
|
if (spoilers>0) {
|
|
md=setDest(12); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA);strncpy(md->name, tr("SPOIL").toAscii().data(),6); md->speedUp=4;;md->speedDown=4;
|
|
md=setDest(12); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA);strncpy(md->name, tr("SPOIL").toAscii().data(),6);md->speedUp=4;md->speedDown=4;
|
|
}
|
|
sign=-1;
|
|
for (uint8_t i=0; i< spoilers; i++) {
|
|
sign*=-1;
|
|
int index;
|
|
if (i==0) {
|
|
index=spo1ch;
|
|
} else {
|
|
index=spo2ch;
|
|
}
|
|
if (index==0) {
|
|
for (int j=0; j<10 ; j++) {
|
|
if (!rx[j]) {
|
|
md=setDest(j+1); md->srcRaw=RawSource(SOURCE_TYPE_CH, 11); md->weight=100*sign; md->sOffset=0; md->swtch=RawSwitch();strncpy(md->name, tr("SPOIL%1").arg(i+1).toAscii().data(),6);
|
|
rx[j]=true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
md=setDest(index); md->srcRaw=RawSource(SOURCE_TYPE_CH, 11); md->weight=100*sign; md->sOffset=0; md->swtch=RawSwitch();strncpy(md->name, tr("SPOIL%1").arg(i+1).toAscii().data(),6);
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
flaps=flaptype;
|
|
throttle=enginetype;
|
|
rudders=ruddertype;
|
|
if (throttle==1) {
|
|
rxch=ICC(STK_THR);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("THR").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
}
|
|
rxch=ICC(STK_ELE);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("ELE").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
rxch=ICC(STK_AIL);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL").toAscii().data(),6);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("AIL").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
if (rudders>0) {
|
|
rxch=ICC(STK_RUD);
|
|
md=setDest(rxch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();strncpy(md->name, tr("RUD").toAscii().data(),6);
|
|
rx[rxch-1]=true;
|
|
}
|
|
if (rud2ch > 0) {
|
|
rx[rud2ch-1]=true;
|
|
}
|
|
if (fla1ch > 0) {
|
|
rx[fla1ch-1]=true;
|
|
}
|
|
if (fla2ch > 0) {
|
|
rx[fla2ch-1]=true;
|
|
}
|
|
if (rudders>1) {
|
|
if (rud2ch==0) {
|
|
for (int j=0; j<10 ; j++) {
|
|
if (!rx[j]) {
|
|
md=setDest(j+1); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=-100; md->swtch=RawSwitch();strncpy(md->name, tr("RUD2").toAscii().data(),6);
|
|
rx[j]=true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
md=setDest(rud2ch); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=-100; md->swtch=RawSwitch();strncpy(md->name, tr("RUD2").toAscii().data(),6);
|
|
}
|
|
}
|
|
if (flaps>0) {
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_AIL);strncpy(md->name, tr("FLAPS").toAscii().data(),6); md->sOffset=0; md->speedUp=4;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_AIL);strncpy(md->name, tr("FLAPS").toAscii().data(),6); md->sOffset=0; md->speedUp=4;
|
|
}
|
|
sign=-1;
|
|
for (uint8_t i=0; i< flaps; i++) {
|
|
sign*=-1;
|
|
int index;
|
|
if (i==0) {
|
|
index=fla1ch;
|
|
} else {
|
|
index=fla2ch;
|
|
}
|
|
if (index==0) {
|
|
for (int j=0; j<10 ; j++) {
|
|
if (!rx[j]) {
|
|
md=setDest(j+1); md->srcRaw=RawSource(SOURCE_TYPE_CH, 10); md->weight=100*sign; md->sOffset=0; md->speedUp=4; md->speedDown=4; md->swtch=RawSwitch();strncpy(md->name, tr("FLAP%1").arg(i+1).toAscii().data(),6);
|
|
rx[j]=true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
md=setDest(index); md->srcRaw=RawSource(SOURCE_TYPE_CH, 10); md->weight=100*sign; md->sOffset=0; md->speedUp=4; md->speedDown=4; md->swtch=RawSwitch();strncpy(md->name, tr("FLAP%1").arg(i+1).toAscii().data(),6);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
updateHeliTab();
|
|
updateCurvesTab();
|
|
if (modeltype==1 && swashtype!=4) {
|
|
ui->tabWidget->setCurrentIndex(1);
|
|
} else {
|
|
ui->tabWidget->setCurrentIndex(4);
|
|
}
|
|
resizeEvent();
|
|
}
|
|
|
|
void ModelEdit::applyTemplate(uint8_t idx)
|
|
{
|
|
int8_t heli_ar1[] = {-100, -20, 30, 70, 90};
|
|
int8_t heli_ar2[] = {80, 70, 60, 70, 100};
|
|
int8_t heli_ar3[] = {100, 90, 80, 90, 100};
|
|
int8_t heli_ar4[] = {-30, -15, 0, 50, 100};
|
|
int8_t heli_ar5[] = {-100, -50, 0, 50, 100};
|
|
|
|
int thrsw=GetEepromInterface()->getCapability(GetThrSwitch);
|
|
MixData *md = &g_model.mixData[0];
|
|
|
|
//CC(STK) -> vSTK
|
|
//ICC(vSTK) -> STK
|
|
#define ICC(x) icc[(x)-1]
|
|
uint8_t icc[4] = {0};
|
|
for(uint8_t i=1; i<=4; i++) //generate inverse array
|
|
for(uint8_t j=1; j<=4; j++) if(CC(i)==j) icc[j-1]=i;
|
|
|
|
|
|
uint8_t j = 0;
|
|
|
|
//Simple 4-Ch
|
|
if(idx==j++) {
|
|
if (md->destCh)
|
|
clearMixes();
|
|
md=setDest(ICC(STK_RUD)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_ELE)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_THR)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_AIL)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();
|
|
}
|
|
|
|
//T-Cut
|
|
if(idx==j++) {
|
|
md=setDest(ICC(STK_THR)); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,thrsw); md->mltpx=MLTPX_REP;
|
|
}
|
|
|
|
//sticky t-cut
|
|
if(idx==j++) {
|
|
md=setDest(ICC(STK_THR)); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_VIRTUAL, 12); md->mltpx=MLTPX_REP;
|
|
md=setDest(14); md->srcRaw=RawSource(SOURCE_TYPE_CH, 13); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(14); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_VIRTUAL, 11); md->mltpx=MLTPX_REP;
|
|
md=setDest(14); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,thrsw); md->mltpx=MLTPX_REP;
|
|
setSwitch(0xB, CS_FN_VNEG, RawSource(SOURCE_TYPE_STICK, 2).toValue(), -99);
|
|
setSwitch(0xC, CS_FN_VPOS, RawSource(SOURCE_TYPE_CH, 13).toValue(), 0);
|
|
updateSwitchesTab();
|
|
}
|
|
|
|
//V-Tail
|
|
if(idx==j++) {
|
|
clearMixes();
|
|
md=setDest(ICC(STK_THR)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_AIL)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_RUD)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_RUD)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_ELE)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_ELE)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight= 100; md->swtch=RawSwitch();
|
|
}
|
|
|
|
//Elevon\\Delta
|
|
if(idx==j++) {
|
|
clearMixes();
|
|
md=setDest(ICC(STK_THR)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_RUD)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_ELE)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_ELE)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_AIL)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-100; md->swtch=RawSwitch();
|
|
md=setDest(ICC(STK_AIL)); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=100; md->swtch=RawSwitch();
|
|
}
|
|
|
|
//Heli Setup
|
|
if(idx==j++) {
|
|
clearMixes(); //This time we want a clean slate
|
|
clearCurves();
|
|
|
|
// Set up Mixes
|
|
// 3 cyclic channels
|
|
md=setDest(1); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 0); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(2); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 1); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 2); md->weight= 100; md->swtch=RawSwitch();
|
|
|
|
// rudder
|
|
md=setDest(4); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();
|
|
|
|
// throttle
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(1); md->carryTrim=TRIM_OFF;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(2); md->carryTrim=TRIM_OFF;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(3); md->carryTrim=TRIM_OFF;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,thrsw); md->mltpx=MLTPX_REP;
|
|
|
|
// gyro gain
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=30; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA);
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-30; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA);
|
|
|
|
// collective
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(4); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(5); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(6); md->carryTrim=TRIM_OFF;
|
|
|
|
g_model.swashRingData.type = HELI_SWASH_TYPE_120;
|
|
g_model.swashRingData.collectiveSource = RawSource(SOURCE_TYPE_CH, 10);
|
|
|
|
// set up Curves
|
|
setCurve(CURVE5(1),heli_ar1);
|
|
setCurve(CURVE5(2),heli_ar2);
|
|
setCurve(CURVE5(3),heli_ar3);
|
|
setCurve(CURVE5(4),heli_ar4);
|
|
setCurve(CURVE5(5),heli_ar5);
|
|
setCurve(CURVE5(6),heli_ar5);
|
|
|
|
// make sure curves are redrawn
|
|
updateHeliTab();
|
|
updateCurvesTab();
|
|
resizeEvent();
|
|
}
|
|
|
|
//Heli Setup gyro gain control
|
|
if(idx==j++) {
|
|
clearMixes(); //This time we want a clean slate
|
|
clearCurves();
|
|
|
|
// Set up Mixes
|
|
// 3 cyclic channels
|
|
md=setDest(1); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 0); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(2); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 1); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 2); md->weight= 100; md->swtch=RawSwitch();
|
|
|
|
// rudder
|
|
md=setDest(4); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();
|
|
|
|
// throttle
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(1); md->carryTrim=TRIM_OFF;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(2); md->carryTrim=TRIM_OFF;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(3); md->carryTrim=TRIM_OFF;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,thrsw); md->mltpx=MLTPX_REP;
|
|
|
|
// gyro gain
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight= 50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA); md->sOffset=100;
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=-50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA); md->sOffset=100;
|
|
|
|
// collective
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(4); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(5); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(6); md->carryTrim=TRIM_OFF;
|
|
|
|
g_model.swashRingData.type = HELI_SWASH_TYPE_120;
|
|
g_model.swashRingData.collectiveSource = RawSource(SOURCE_TYPE_CH, 10);
|
|
|
|
// set up Curves
|
|
setCurve(CURVE5(1),heli_ar1);
|
|
setCurve(CURVE5(2),heli_ar2);
|
|
setCurve(CURVE5(3),heli_ar3);
|
|
setCurve(CURVE5(4),heli_ar4);
|
|
setCurve(CURVE5(5),heli_ar5);
|
|
setCurve(CURVE5(6),heli_ar5);
|
|
|
|
// make sure curves are redrawn
|
|
updateHeliTab();
|
|
updateCurvesTab();
|
|
resizeEvent();
|
|
}
|
|
|
|
// gyro gain control
|
|
if(idx==j++) {
|
|
int res = QMessageBox::question(this,tr("Clear Mixes?"),tr("Really clear existing mixes on CH6?"),QMessageBox::Yes | QMessageBox::No);
|
|
if(res!=QMessageBox::Yes) return;
|
|
// first clear mix on ch6
|
|
bool found=true;
|
|
while (found) {
|
|
found=false;
|
|
for (int i=0; i< GetEepromInterface()->getCapability(Mixes); i++) {
|
|
if (g_model.mixData[i].destCh==6) {
|
|
gm_deleteMix(i);
|
|
found=true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight= 50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA); md->sOffset=100;
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=-50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA); md->sOffset=100;
|
|
}
|
|
|
|
//Heli Setup futaba style
|
|
if(idx==j++) {
|
|
clearMixes(); //This time we want a clean slate
|
|
clearCurves();
|
|
|
|
// Set up Mixes
|
|
// 3 cyclic channels
|
|
md=setDest(1); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 1); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(2); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 0); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 2); md->weight= 100; md->swtch=RawSwitch();
|
|
|
|
// rudder
|
|
md=setDest(4); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();
|
|
|
|
// throttle
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(1); md->carryTrim=TRIM_OFF;
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(2); md->carryTrim=TRIM_OFF;
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(3); md->carryTrim=TRIM_OFF;
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,thrsw); md->mltpx=MLTPX_REP;
|
|
|
|
// gyro gain
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=30; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA);
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-30; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA);
|
|
|
|
// collective
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(4); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(5); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(6); md->carryTrim=TRIM_OFF;
|
|
|
|
g_model.swashRingData.type = HELI_SWASH_TYPE_120;
|
|
g_model.swashRingData.collectiveSource = RawSource(SOURCE_TYPE_CH, 10);
|
|
|
|
// set up Curves
|
|
setCurve(CURVE5(1),heli_ar1);
|
|
setCurve(CURVE5(2),heli_ar2);
|
|
setCurve(CURVE5(3),heli_ar3);
|
|
setCurve(CURVE5(4),heli_ar4);
|
|
setCurve(CURVE5(5),heli_ar5);
|
|
setCurve(CURVE5(6),heli_ar5);
|
|
|
|
// make sure curves are redrawn
|
|
updateHeliTab();
|
|
updateCurvesTab();
|
|
resizeEvent();
|
|
}
|
|
|
|
// Heli setup futaba style with gyro gain control
|
|
if(idx==j++) {
|
|
clearMixes(); //This time we want a clean slate
|
|
clearCurves();
|
|
|
|
// Set up Mixes
|
|
// 3 cyclic channels
|
|
md=setDest(1); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 1); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(2); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 0); md->weight= 100; md->swtch=RawSwitch();
|
|
md=setDest(6); md->srcRaw=RawSource(SOURCE_TYPE_CYC, 2); md->weight= 100; md->swtch=RawSwitch();
|
|
|
|
// rudder
|
|
md=setDest(4); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch();
|
|
|
|
// throttle
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(1); md->carryTrim=TRIM_OFF;
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(2); md->carryTrim=TRIM_OFF;
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight= 100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(3); md->carryTrim=TRIM_OFF;
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,thrsw); md->mltpx=MLTPX_REP;
|
|
|
|
// gyro gain
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight= 50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA); md->sOffset=100;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=-50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA); md->sOffset=100;
|
|
|
|
// collective
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID0); md->curve=CV(4); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID1); md->curve=CV(5); md->carryTrim=TRIM_OFF;
|
|
md=setDest(11); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_ID2); md->curve=CV(6); md->carryTrim=TRIM_OFF;
|
|
|
|
g_model.swashRingData.type = HELI_SWASH_TYPE_120;
|
|
g_model.swashRingData.collectiveSource = RawSource(SOURCE_TYPE_CH, 10);
|
|
|
|
// set up Curves
|
|
setCurve(CURVE5(1),heli_ar1);
|
|
setCurve(CURVE5(2),heli_ar2);
|
|
setCurve(CURVE5(3),heli_ar3);
|
|
setCurve(CURVE5(4),heli_ar4);
|
|
setCurve(CURVE5(5),heli_ar5);
|
|
setCurve(CURVE5(6),heli_ar5);
|
|
|
|
// make sure curves are redrawn
|
|
updateHeliTab();
|
|
updateCurvesTab();
|
|
resizeEvent();
|
|
}
|
|
|
|
// gyro gain control futaba style
|
|
if(idx==j++) {
|
|
int res = QMessageBox::question(this,tr("Clear Mixes?"),tr("Really clear existing mixes on CH5?"),QMessageBox::Yes | QMessageBox::No);
|
|
if(res!=QMessageBox::Yes) return;
|
|
// first clear mix on ch6
|
|
bool found=true;
|
|
while (found) {
|
|
found=false;
|
|
for (int i=0; i< GetEepromInterface()->getCapability(Mixes); i++) {
|
|
if (g_model.mixData[i].destCh==5) {
|
|
gm_deleteMix(i);
|
|
found=true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight= 50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,-DSW_GEA); md->sOffset=100;
|
|
md=setDest(5); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 5); md->weight=-50; md->swtch=RawSwitch(SWITCH_TYPE_SWITCH,DSW_GEA); md->sOffset=100;
|
|
}
|
|
|
|
//Servo Test
|
|
if(idx==j++) {
|
|
md=setDest(15); md->srcRaw=RawSource(SOURCE_TYPE_CH, 15); md->weight= 100; md->speedUp = 8; md->speedDown = 8; md->swtch=RawSwitch();
|
|
md=setDest(16); md->srcRaw=RawSource(SOURCE_TYPE_CUSTOM_SWITCH, 0); md->weight= 110; md->swtch=RawSwitch();
|
|
md=setDest(16); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight=-110; md->swtch=RawSwitch(SWITCH_TYPE_VIRTUAL, 2); md->mltpx=MLTPX_REP;
|
|
md=setDest(16); md->srcRaw=RawSource(SOURCE_TYPE_MAX); md->weight= 110; md->swtch=RawSwitch(SWITCH_TYPE_VIRTUAL, 3); md->mltpx=MLTPX_REP;
|
|
setSwitch(1, CS_FN_LESS, RawSource(SOURCE_TYPE_CH, 14).toValue(), RawSource(SOURCE_TYPE_CH, 15).toValue());
|
|
setSwitch(2, CS_FN_VPOS, RawSource(SOURCE_TYPE_CH, 14).toValue(), 105);
|
|
setSwitch(3, CS_FN_VNEG, RawSource(SOURCE_TYPE_CH, 14).toValue(), -105);
|
|
|
|
// redraw switches tab
|
|
updateSwitchesTab();
|
|
}
|
|
|
|
//MultiCopter
|
|
if(idx==j++) {
|
|
if (md->destCh)
|
|
clearMixes();
|
|
md=setDest(1); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 3); md->weight=50; md->swtch=RawSwitch(); //CH1 AIL
|
|
md=setDest(2); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 1); md->weight=-50; md->swtch=RawSwitch(); //CH2 ELE
|
|
md=setDest(3); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 2); md->weight=100; md->swtch=RawSwitch(); //CH3 THR
|
|
md=setDest(4); md->srcRaw=RawSource(SOURCE_TYPE_STICK, 0); md->weight=100; md->swtch=RawSwitch(); //CH4 RUD
|
|
}
|
|
}
|
|
|
|
void ModelEdit::ControlCurveSignal(bool flag)
|
|
{
|
|
foreach(QSpinBox *sb, findChildren<QSpinBox *>(QRegExp("curvePt[0-9]+"))) {
|
|
sb->blockSignals(flag);
|
|
}
|
|
}
|
|
|
|
void ModelEdit::shrink() {
|
|
#if defined __APPLE__
|
|
QSettings settings("companion9x", "companion9x");
|
|
QPoint pos = settings.value("mepos", QPoint(0, 0)).toPoint();
|
|
QSize size = settings.value("mesize", QSize(800, 625)).toSize();
|
|
move(pos);
|
|
resize(size);
|
|
# else
|
|
const int height = QApplication::desktop()->height();
|
|
QSettings settings("companion9x", "companion9x");
|
|
QPoint pos = settings.value("mepos", QPoint(100, 100)).toPoint();
|
|
QSize size = settings.value("mesize", QSize(800, 625)).toSize();
|
|
if (size.height() < height) {
|
|
move(pos);
|
|
resize(size);
|
|
} else {
|
|
resize(0,0);
|
|
}
|
|
#endif
|
|
ui->curvePreview->repaint();
|
|
}
|
|
|
|
void ModelEdit::on_cname_LE_editingFinished() {
|
|
if (GetEepromInterface()->getCapability(HasCvNames)) {
|
|
int i=0;
|
|
for (i=0; i<ui->cname_LE->text().toAscii().length(); i++) {
|
|
g_model.curves[currentCurve].name[i]=ui->cname_LE->text().toAscii().at(i);
|
|
}
|
|
g_model.curves[currentCurve].name[i]=0;
|
|
}
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::on_curvetype_CB_currentIndexChanged(int index) {
|
|
if (curvesLock)
|
|
return;
|
|
int numcurves=GetEepromInterface()->getCapability(NumCurves);
|
|
if (numcurves==0) {
|
|
numcurves=16;
|
|
}
|
|
int numpoint[]={3,3,5,5,9,9,17,17};
|
|
bool custom[]={false,true,false,true,false,true,false,true};
|
|
int currpoints=g_model.curves[currentCurve].count;
|
|
bool currcustom=g_model.curves[currentCurve].custom;
|
|
curvesLock=true;
|
|
int totalpoints=0;
|
|
for (int i=0; i< numcurves; i++) {
|
|
if (i!=currentCurve) {
|
|
totalpoints+=g_model.curves[i].count;
|
|
if (g_model.curves[i].custom) {
|
|
totalpoints+=g_model.curves[i].count-2;
|
|
}
|
|
}
|
|
}
|
|
totalpoints+=numpoint[index];
|
|
if (currcustom) {
|
|
totalpoints+=numpoint[index]-2;
|
|
}
|
|
int fwpoints=GetEepromInterface()->getCapability(NumCurvePoints);
|
|
if (fwpoints!=0) {
|
|
if (fwpoints<totalpoints) {
|
|
QMessageBox::warning(this, "Companion", tr("Not enough free points in eeprom to store the curve."));
|
|
int oldindex=0;
|
|
if (currpoints==3) {
|
|
oldindex=0;
|
|
} else if (currpoints==5) {
|
|
oldindex=2;
|
|
} else if (currpoints==9) {
|
|
oldindex=4;
|
|
} else if (currpoints==17) {
|
|
oldindex=6;
|
|
}
|
|
if (currcustom) {
|
|
index++;
|
|
}
|
|
ui->curvetype_CB->setCurrentIndex(oldindex);
|
|
curvesLock=false;
|
|
return;
|
|
}
|
|
}
|
|
// let's be sure that for standard curves X values are set correctly.
|
|
if (!currcustom) {
|
|
for (int i=0; i< currpoints; i++) {
|
|
spnx[i]->setMinimum(-100);
|
|
spnx[i]->setMaximum(100);
|
|
spnx[i]->setValue(-100+((200*i)/(currpoints-1)));
|
|
}
|
|
}
|
|
if (numpoint[index]==currpoints) {
|
|
for (int i=0; i< currpoints; i++) {
|
|
spnx[i]->setMinimum(-100);
|
|
spnx[i]->setMaximum(100);
|
|
spnx[i]->setValue(-100+((200*i)/(currpoints-1)));
|
|
}
|
|
for (int i=currpoints; i< 17; i++) {
|
|
spnx[i]->setMinimum(-100);
|
|
spnx[i]->setMaximum(100);
|
|
spnx[i]->setValue(0);
|
|
spny[i]->setValue(0);
|
|
}
|
|
} else if (numpoint[index]>currpoints) {
|
|
for (int i=0; i< 17; i++) {
|
|
g_model.curves[currentCurve].points[i].x=spnx[i]->value();
|
|
g_model.curves[currentCurve].points[i].y=spny[i]->value();
|
|
spnx[i]->setMinimum(-100);
|
|
spnx[i]->setMaximum(100);
|
|
}
|
|
int currintervals=currpoints-1;
|
|
int diffpoints=numpoint[index]-currpoints;
|
|
int skip=diffpoints/currintervals;
|
|
for (int i=0; i< currpoints; i++) {
|
|
if (custom[index]) {
|
|
spnx[i+(skip*i)]->setValue(g_model.curves[currentCurve].points[i].x);
|
|
} else {
|
|
spnx[i+(skip*i)]->setValue(-100+(200*i)/currintervals);
|
|
}
|
|
spny[i+(skip*i)]->setValue(g_model.curves[currentCurve].points[i].y);
|
|
if (i>0) {
|
|
int diffx=spnx[i+(skip*i)]->value()-spnx[(i-1)+(skip*(i-1))]->value();
|
|
int diffy=spny[i+(skip*i)]->value()-spny[(i-1)+(skip*(i-1))]->value();
|
|
for (int j=1; j<= skip; j++) {
|
|
spny[(i-1)+skip*(i-1)+j]->setValue(spny[(i-1)+(skip*(i-1))]->value()+((diffy*j)/(skip+1)));
|
|
spnx[(i-1)+skip*(i-1)+j]->setValue(spnx[(i-1)+(skip*(i-1))]->value()+((diffx*j)/(skip+1)));
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
int intervals=numpoint[index]-1;
|
|
int diffpoints=currpoints-numpoint[index];
|
|
int skip=diffpoints/intervals;
|
|
for (int i=0; i< numpoint[index]; i++) {
|
|
spnx[i]->setMinimum(-100);
|
|
spnx[i]->setMaximum(100);
|
|
if (custom[index]) {
|
|
spnx[i]->setValue(spnx[i+skip*i]->value());
|
|
} else {
|
|
spnx[i]->setValue(-100+(200*i)/intervals);
|
|
}
|
|
spny[i]->setValue(spny[i+skip*i]->value());
|
|
}
|
|
for (int i=numpoint[index]; i< 17; i++) {
|
|
spnx[i]->setValue(0);
|
|
spny[i]->setValue(0);
|
|
}
|
|
}
|
|
curvesLock=false;
|
|
for (int i=0; i< 17; i++) {
|
|
g_model.curves[currentCurve].points[i].x=spnx[i]->value();
|
|
g_model.curves[currentCurve].points[i].y=spny[i]->value();
|
|
}
|
|
g_model.curves[currentCurve].count=numpoint[index];
|
|
g_model.curves[currentCurve].custom=custom[index];
|
|
setCurrentCurve(currentCurve);
|
|
if (redrawCurve)
|
|
drawCurve();
|
|
updateSettings();
|
|
}
|
|
|
|
void ModelEdit::closeEvent(QCloseEvent *event)
|
|
{
|
|
QSettings settings("companion9x", "companion9x");
|
|
settings.setValue("mepos", pos());
|
|
settings.setValue("mesize", size());
|
|
event->accept();
|
|
}
|
|
|
|
void ModelEdit::wizard()
|
|
{
|
|
uint64_t result=0xffffffff;
|
|
modelConfigDialog *mcw = new modelConfigDialog(radioData, &result, this);
|
|
mcw->exec();
|
|
if (result!=0xffffffff) {
|
|
applyNumericTemplate(result);
|
|
updateSettings();
|
|
tabMixes();
|
|
} else if (this->isNew) {
|
|
memset(&g_model, 0, sizeof(ModelData));
|
|
accept();
|
|
}
|
|
}
|