#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 #include #include #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(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(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(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(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; iisAvailable((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; iisAvailable((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; imode==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<getCapability(FlightPhases))-1) { int mask=1; int first=0; for (int i=0; igetCapability(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; igetCapability(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(curDestsetData(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; igetCapability(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<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; iphases & 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(curDestgetCapability(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(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(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(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(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(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(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(QRegExp("ppmcenter_[0-9]+"))) { sb->hide(); } ui->ppmc_label1->hide(); ui->ppmc_label2->hide(); } if (GetEepromInterface()->getCapability(SYMLimits)) { foreach(QCheckBox *ckb, findChildren(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(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(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(QRegExp("curvePt[0-9]+"))) { connect(sb, SIGNAL(valueChanged(int)), this, SLOT(curvePointEdited())); } foreach(QPushButton *pb, findChildren(QRegExp("resetCurve_[0-9]+"))) { connect(pb, SIGNAL(clicked()), this, SLOT(resetCurve())); } foreach(QPushButton *pb, findChildren(QRegExp("curveEdit_[0-9]+"))) { connect(pb, SIGNAL(clicked()), this, SLOT(editCurve())); } foreach(QCheckBox *ChkB, findChildren(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; ica_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; ica_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; ica_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=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(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(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; itext().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(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(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(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(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; ishow(); 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].funcsetMinimum(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 (isetProperty("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; igetCapability(CustomFunctions); QStringList paramarmList; if (!GetEepromInterface()->getCapability(VoicesAsNumbers)) { for (int i=0; igetCapability(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= 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; igrid_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; igetCapability(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].funcCS_FN_ELESS && g_model.customSw[i].funcvalue()/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].funcvalue()/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; igetCapability(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; igetCapability(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(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; jcurrentText().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; jcurrentText().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; chide(); } } } } 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<a1RatioSB->setDecimals(1); ui->a1RatioSB->setMaximum(25.5*GetEepromInterface()->getCapability(TelemetryMaxMultiplier)); } else { a1ratio=g_model.frsky.channels[0].ratio<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<a2RatioSB->setDecimals(1); ui->a2RatioSB->setMaximum(25.5*GetEepromInterface()->getCapability(TelemetryMaxMultiplier)); } else { a2ratio=g_model.frsky.channels[1].ratio<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<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<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(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(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(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(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<a1RatioSB->setDecimals(0); ui->a1RatioSB->setMaximum(255*GetEepromInterface()->getCapability(TelemetryMaxMultiplier)); a1ratio=(g_model.frsky.channels[0].ratio<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<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<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<a11ValueSB->setSingleStep((1<a12ValueSB->setSingleStep((1<a1RatioSB->value()*10))/(1 <a1RatioSB->value(), 255); ui->a1CalibSB->setSingleStep(1<a11ValueSB->setSingleStep(1<a12ValueSB->setSingleStep(1<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<a1CalibSB->value()/a1ratio)); a1calib=a1ratio*g_model.frsky.channels[0].offset/255.0; a11value=ui->a11ValueSB->value(); a12value=ui->a12ValueSB->value(); if (a11value(a1ratio+a1calib)) { a11value=a1ratio+a1calib; } 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<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<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<a2RatioSB->setDecimals(0); ui->a2RatioSB->setMaximum(255*GetEepromInterface()->getCapability(TelemetryMaxMultiplier)); a2ratio=g_model.frsky.channels[1].ratio<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<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<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<a21ValueSB->setSingleStep((1<a22ValueSB->setSingleStep((1<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<a21ValueSB->setSingleStep(1<a22ValueSB->setSingleStep(1<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<a2CalibSB->value()/a2ratio)); a2calib=a2ratio*g_model.frsky.channels[1].offset/255.0; a21value=ui->a21ValueSB->value(); a22value=ui->a22ValueSB->value(); if (a21value(a2ratio+a2calib)) { a21value=a2ratio+a2calib; } 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<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<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(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(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(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()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(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(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(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(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(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(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(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(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(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(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; kaddLine(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; isetColor(*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) && (igetCapability(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 && iitem(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 list) { qSort(list.begin(), list.end()); int iDec = 0; foreach(int idx, list) { gm_deleteExpo(idx-iDec); iDec++; } } void ModelEdit::mixersDeleteList(QList list) { qSort(list.begin(), list.end()); int iDec = 0; foreach(int idx, list) { gm_deleteMix(idx-iDec); iDec++; } } QList ModelEdit::createMixListFromSelected() { QList list; foreach(QListWidgetItem *item, MixerlistWidget->selectedItems()) { int idx= item->data(Qt::UserRole).toByteArray().at(0); if(idx>=0 && idxgetCapability(Mixes)) list << idx; } return list; } QList ModelEdit::createExpoListFromSelected() { QList list; foreach(QListWidgetItem *item, ExposlistWidget->selectedItems()) { int idx= item->data(Qt::UserRole).toByteArray().at(0); if(idx>=0 && idx list) { for(int i=0; icount(); 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 list) { for(int i=0; icount(); 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 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 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(igetCapability(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 #include 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.destCh0)) 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 list = createMixListFromSelected(); QList highlightList; foreach(int idx, list) { highlightList << gm_moveMix(idx, false); } updateSettings(); tabMixes(); setSelectedByMixList(highlightList); } void ModelEdit::moveMixDown() { QList list = createMixListFromSelected(); QList 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 list = createExpoListFromSelected(); QList highlightList; foreach(int idx, list) { highlightList << gm_moveExpo(idx, false); } updateSettings(); tabExpos(); setSelectedByExpoList(highlightList); } void ModelEdit::moveExpoDown() { QList list = createExpoListFromSelected(); QList 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(QRegExp("minSB_[0-9]+"))) { sb->setMaximum(25); sb->setMinimum(-v); } foreach(QSpinBox *sb, findChildren(QRegExp("maxSB_[0-9]+"))) { sb->setMaximum(v); sb->setMinimum(-25); } } void ModelEdit::safetySwitchesEdited() { for(int i=0; iitemData(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) && (igetCapability(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(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; icname_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 (fwpointscurvetype_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(); } }