From ed05174fc8d3b29c42554ae597d5967b116a56dc Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 23 Aug 2015 09:22:11 +0200 Subject: [PATCH 1/6] PrintDialog / CompareDialog refactoring --- companion/src/CMakeLists.txt | 1 + companion/src/comparedialog.cpp | 1089 +---------------- companion/src/comparedialog.h | 82 +- companion/src/eeprominterface.cpp | 84 +- companion/src/eeprominterface.h | 40 +- .../src/firmwares/er9x/er9xinterface.cpp | 4 +- companion/src/firmwares/er9x/er9xinterface.h | 4 +- .../firmwares/ersky9x/ersky9xinterface.cpp | 4 +- .../src/firmwares/ersky9x/ersky9xinterface.h | 4 +- .../src/firmwares/gruvin9x/gruvin9xeeprom.cpp | 8 +- .../firmwares/gruvin9x/gruvin9xinterface.cpp | 4 +- .../firmwares/gruvin9x/gruvin9xinterface.h | 4 +- .../firmwares/opentx/open9xGruvin9xeeprom.cpp | 18 +- .../firmwares/opentx/open9xSky9xeeprom.cpp | 44 +- .../firmwares/opentx/open9xStockeeprom.cpp | 44 +- .../src/firmwares/opentx/opentxeeprom.cpp | 30 +- .../src/firmwares/opentx/opentxinterface.cpp | 12 +- .../src/firmwares/opentx/opentxinterface.h | 4 +- .../src/firmwares/th9x/th9xinterface.cpp | 4 +- companion/src/firmwares/th9x/th9xinterface.h | 4 +- companion/src/helpers.cpp | 134 +- companion/src/helpers.h | 8 - companion/src/mdichild.cpp | 8 +- companion/src/modeledit/expodialog.cpp | 20 +- companion/src/modeledit/inputs.cpp | 12 +- companion/src/modeledit/mixerdialog.cpp | 10 +- companion/src/modeledit/mixes.cpp | 35 +- companion/src/modeledit/setup.cpp | 12 +- companion/src/modeledit/telemetry.cpp | 18 +- companion/src/modelprinter.cpp | 488 ++++++-- companion/src/modelprinter.h | 78 +- companion/src/modelslist.cpp | 12 +- companion/src/multimodelprinter.cpp | 486 ++++++++ companion/src/multimodelprinter.h | 54 + companion/src/printdialog.cpp | 743 +---------- companion/src/printdialog.h | 45 +- 36 files changed, 1391 insertions(+), 2260 deletions(-) create mode 100644 companion/src/multimodelprinter.cpp create mode 100644 companion/src/multimodelprinter.h diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 8e877489c..679b69ee4 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -158,6 +158,7 @@ set(companion_SRCS apppreferencesdialog.cpp fwpreferencesdialog.cpp burnconfigdialog.cpp + multimodelprinter.cpp comparedialog.cpp contributorsdialog.cpp releasenotesdialog.cpp diff --git a/companion/src/comparedialog.cpp b/companion/src/comparedialog.cpp index ccaf5f065..a05405a2f 100644 --- a/companion/src/comparedialog.cpp +++ b/companion/src/comparedialog.cpp @@ -1,52 +1,43 @@ #include "comparedialog.h" #include "ui_comparedialog.h" #include "helpers.h" -#include "helpers_html.h" -#include "eeprominterface.h" -#include -#include -#include -#include -#include +#include +#include -#if !defined WIN32 && defined __GNUC__ -#include -#endif +// #if !defined WIN32 && defined __GNUC__ +// #include +// #endif -#define ISIZE 200 // curve image size class DragDropHeader { -public: - DragDropHeader(): - general_settings(false), - models_count(0) - { - } - bool general_settings; - uint8_t models_count; - uint8_t models[C9X_MAX_MODELS]; + public: + DragDropHeader(): + general_settings(false), + models_count(0) + { + } + bool general_settings; + uint8_t models_count; + uint8_t models[C9X_MAX_MODELS]; }; CompareDialog::CompareDialog(QWidget * parent, Firmware * firmware): QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), - firmware(firmware), + multimodelprinter(firmware), model1Valid(false), model2Valid(false), - ui(new Ui::CompareDialog), - modelPrinter1(firmware, &dummySettings, &g_model1), - modelPrinter2(firmware, &dummySettings, &g_model2) + ui(new Ui::CompareDialog) { ui->setupUi(this); - this->setWindowIcon(CompanionIcon("compare.png")); - te = ui->textEdit; - this->setAcceptDrops(true); + setWindowIcon(CompanionIcon("compare.png")); + setAcceptDrops(true); //setDragDropOverwriteMode(true); //setDropIndicatorShown(true); - te->scrollToAnchor("1"); + // TODO scroll to top ... ui->textEdit->scrollToAnchor("1"); } -void CompareDialog::dragMoveEvent(QDragMoveEvent *event) +void CompareDialog::dragMoveEvent(QDragMoveEvent * event) { if (event->mimeData()->hasFormat("application/x-companion")) { event->acceptProposedAction(); @@ -56,7 +47,7 @@ void CompareDialog::dragMoveEvent(QDragMoveEvent *event) } } -void CompareDialog::dragEnterEvent(QDragEnterEvent *event) +void CompareDialog::dragEnterEvent(QDragEnterEvent * event) { // accept just text/uri-list mime format if (event->mimeData()->hasFormat("application/x-companion")) { @@ -67,48 +58,27 @@ void CompareDialog::dragEnterEvent(QDragEnterEvent *event) } } -void CompareDialog::dragLeaveEvent(QDragLeaveEvent *event) +void CompareDialog::dragLeaveEvent(QDragLeaveEvent * event) { event->accept(); } -void CompareDialog::printDiff() +bool CompareDialog::handleDroppedModel(const QMimeData * mimeData, ModelData & model, QLabel * label) { - te->clear(); - curvefile1=generateProcessUniqueTempFileName("curve1.png"); - curvefile2=generateProcessUniqueTempFileName("curve2.png"); - printSetup(); - if (GetCurrentFirmware()->getCapability(FlightModes)) { - printPhases(); - } - printInputs(); - printMixers(); - printLimits(); - printCurves(); - printGvars(); - printLogicalSwitches(); - printCustomFunctions(); - printFrSky(); - te->scrollToAnchor("1"); -} - -bool CompareDialog::handleDroppedModel(const QMimeData * mimeData, ModelData * model, QLabel * label) -{ - if(mimeData->hasFormat("application/x-companion")) { + if (mimeData->hasFormat("application/x-companion")) { QByteArray gmData = mimeData->data("application/x-companion"); - DragDropHeader *header = (DragDropHeader *)gmData.data(); + DragDropHeader * header = (DragDropHeader *)gmData.data(); if (!header->general_settings) { - char *gData = gmData.data()+sizeof(DragDropHeader); - if(gData[0] == 'M') { + char * gData = gmData.data() + sizeof(DragDropHeader); + if (gData[0] == 'M') { ModelData * modeltemp = (ModelData *)(gData + 1); if (modeltemp->used) { - memcpy(model, modeltemp, sizeof(ModelData)); - QString name(model->name); - if (!name.isEmpty()) { + memcpy(&model, modeltemp, sizeof(ModelData)); + QString name(model.name); + if (!name.isEmpty()) label->setText(name); - } else { + else label->setText(tr("No name")); - } return true; } } @@ -119,16 +89,20 @@ bool CompareDialog::handleDroppedModel(const QMimeData * mimeData, ModelData * m void CompareDialog::dropEvent(QDropEvent *event) { - QLabel *child = qobject_cast(childAt(event->pos())); + QLabel * child = qobject_cast(childAt(event->pos())); if (!child) return; if (child->objectName().contains("label_1")) { - model1Valid = handleDroppedModel(event->mimeData(), &g_model1, ui->label_1); + model1Valid = handleDroppedModel(event->mimeData(), model1, ui->label_1); } else if (child->objectName().contains("label_2")) { - model2Valid = handleDroppedModel(event->mimeData(), &g_model2, ui->label_2); + model2Valid = handleDroppedModel(event->mimeData(), model2, ui->label_2); } event->accept(); - if (model1Valid && model2Valid) printDiff(); + if (model1Valid && model2Valid) { + multimodelprinter.setModel(0, model1); + multimodelprinter.setModel(1, model2); + ui->textEdit->setHtml(multimodelprinter.print()); + } } void CompareDialog::closeEvent(QCloseEvent *event) @@ -137,979 +111,32 @@ void CompareDialog::closeEvent(QCloseEvent *event) CompareDialog::~CompareDialog() { - qunlink(curvefile1); - qunlink(curvefile2); delete ui; } -bool CompareDialog::ChannelHasExpo(ExpoData * expoArray, uint8_t destCh) -{ - for (int i=0; i< C9X_MAX_EXPOS; i++) { - if ((expoArray[i].chn==destCh)&&(expoArray[i].mode!=0)) { - return true; - } - } - return false; -} - -bool CompareDialog::ChannelHasMix(MixData * mixArray, uint8_t destCh) -{ - for (int i=0; i< C9X_MAX_MIXERS; i++) { - if (mixArray[i].destCh==destCh) { - return true; - } - } - return false; -} - -void CompareDialog::printSetup() -{ - QString color; - QString str = ""; - str.append(""); - str.append(""); - str.append("

"+tr("General Model Settings")+"

"); - color=getColor1(g_model1.name,g_model2.name); - str.append(fv(tr("Name"), g_model1.name, color)); - color=getColor1(GetEepromInterface()->getSize(g_model1), GetEepromInterface()->getSize(g_model2)); - str.append(""+tr("EEprom Size")+QString(": %1
").arg(GetEepromInterface()->getSize(g_model1)).arg(color)); - color=getColor1(getTimerStr(g_model1.timers[0]), getTimerStr(g_model2.timers[0])); - str.append(fv(tr("Timer1"), getTimerStr(g_model1.timers[0]), color)); //value, mode, count up/down - color=getColor1(getTimerStr(g_model1.timers[1]), getTimerStr(g_model2.timers[1])); - str.append(fv(tr("Timer2"), getTimerStr(g_model1.timers[1]), color)); //value, mode, count up/down - color=getColor1(getProtocol(g_model1.moduleData[0]),getProtocol(g_model2.moduleData[0])); - if (firmware->getCapability(NumModules)>1) { - str.append(""+(IS_TARANIS(firmware->getBoard()) ? tr("Internal Radio System") : tr("Radio System") )+"
  "); //proto, numch, delay, - } - str.append(fv(tr("Protocol"), getProtocol(g_model1.moduleData[0]),color)); - if (firmware->getCapability(NumModules)>1) { - color=getColor1(getProtocol(g_model1.moduleData[1]),getProtocol(g_model2.moduleData[1])); - str.append(""+(IS_TARANIS(firmware->getBoard()) ? tr("External Radio Module") : tr("Extra Radio System"))+"
  "); //proto, numch, delay, - str.append(fv(tr("Protocol"), getProtocol(g_model1.moduleData[1]),color)); - } - if (IS_TARANIS(firmware->getBoard())){ - color=getColor1(getTrainerMode(g_model1.trainerMode, g_model1.moduleData[2]),getTrainerMode(g_model2.trainerMode, g_model2.moduleData[2])); - str.append(fv(tr("Trainer port mode"), getTrainerMode(g_model1.trainerMode, g_model1.moduleData[2]),color)); - } - color=getColor1(g_model1.thrTrim,g_model2.thrTrim); - str.append(fv(tr("Throttle Trim"), g_model1.thrTrim ? tr("Enabled") : tr("Disabled"), color)); - color=getColor1(getTrimInc(&g_model1),getTrimInc(&g_model2)); - str.append(fv(tr("Trim Increment"), getTrimInc(&g_model1),color)); - color = getColor1(getCenterBeepStr(&g_model1), getCenterBeepStr(&g_model2)); - str.append(fv(tr("Center Beep"), getCenterBeepStr(&g_model1), color)); // specify which channels beep - str.append("
"); - color=getColor2(g_model1.name,g_model2.name); - str.append(fv(tr("Name"), g_model2.name, color)); - color=getColor2(GetEepromInterface()->getSize(g_model1), GetEepromInterface()->getSize(g_model2)); - str.append(""+tr("EEprom Size")+QString(": %1
").arg(GetEepromInterface()->getSize(g_model2)).arg(color)); - color=getColor2(getTimerStr(g_model1.timers[0]), getTimerStr(g_model2.timers[0])); - str.append(fv(tr("Timer1"), getTimerStr(g_model2.timers[0]),color)); //value, mode, count up/down - color=getColor2(getTimerStr(g_model1.timers[1]), getTimerStr(g_model2.timers[1])); - str.append(fv(tr("Timer2"), getTimerStr(g_model2.timers[1]),color)); //value, mode, count up/down - color=getColor2(getProtocol(g_model1.moduleData[0]),getProtocol(g_model2.moduleData[0])); - if (firmware->getCapability(NumModules)>1) { - str.append(""+(IS_TARANIS(firmware->getBoard()) ? tr("Internal Radio System") : tr("Radio System") )+"
  "); //proto, numch, delay, - } - str.append(fv(tr("Protocol"), getProtocol(g_model2.moduleData[0]),color)); - if (firmware->getCapability(NumModules)>1) { - color=getColor2(getProtocol(g_model1.moduleData[1]),getProtocol(g_model2.moduleData[1])); - str.append(""+(IS_TARANIS(firmware->getBoard()) ? tr("External Radio Module") : tr("Extra Radio System"))+"
  "); //proto, numch, delay, - str.append(fv(tr("Protocol"), getProtocol(g_model2.moduleData[1]),color)); - } - if (IS_TARANIS(firmware->getBoard())){ - color=getColor2(getTrainerMode(g_model1.trainerMode, g_model1.moduleData[2]),getTrainerMode(g_model2.trainerMode, g_model2.moduleData[2])); - str.append(fv(tr("Trainer port mode"), getTrainerMode(g_model2.trainerMode, g_model2.moduleData[2]),color)); - } - color=getColor2(g_model1.thrTrim,g_model2.thrTrim); - str.append(fv(tr("Throttle Trim"), g_model2.thrTrim ? tr("Enabled") : tr("Disabled"), color)); - color=getColor2(getTrimInc(&g_model1),getTrimInc(&g_model2)); - str.append(fv(tr("Trim Increment"), getTrimInc(&g_model2),color)); - color = getColor2(getCenterBeepStr(&g_model1),getCenterBeepStr(&g_model2)); - str.append(fv(tr("Center Beep"), getCenterBeepStr(&g_model2), color)); // specify which channels beep - str.append("
"); - te->append(str); -} - -void CompareDialog::printPhases() -{ - QString color; - int i,k; - QString str = ""; - str.append(""); - str.append(""); - - str.append("

"+tr("Flight modes Settings")+"

"); - str.append(""); - for (i=0; i<4; i++) { - str.append(QString("").arg(modelPrinter1.printInputName(i))); - } - str.append(""); - for (i=0; igetCapability(FlightModes); i++) { - FlightModeData *pd1=&g_model1.flightModeData[i]; - FlightModeData *pd2=&g_model2.flightModeData[i]; - str.append("").arg(pd1->name).arg(color)); - color=getColor1(pd1->fadeIn,pd2->fadeIn); - str.append(QString("").arg(pd1->fadeIn).arg(color)); - color=getColor1(pd1->fadeOut,pd2->fadeOut); - str.append(QString("").arg(pd1->fadeOut).arg(color)); - for (k=0; k<4; k++) { - if (pd1->trimRef[k]==-1) { - color=getColor1(pd1->trim[k],pd2->trim[k]); - str.append(QString("").arg(pd1->trim[k]).arg(color)); - } else { - color=getColor1(pd1->trimRef[k],pd2->trimRef[k]); - str.append(QString("").arg(pd1->trimRef[k])); - } - } - color=getColor1(pd1->swtch,pd2->swtch); - str.append(QString("").arg(pd1->swtch.toString()).arg(color)); - str.append(""); - } - str.append("
 "); - str.append(tr("Fades")+""+tr("Trims")); - str.append(""+tr("Switch")+"
"+tr("Flight mode name")); - str.append(""+tr("IN")+""+tr("OUT")+"%1
"+tr("FM")+QString("%1 ").arg(i)); - color=getColor1(pd1->name,pd2->name); - str.append(QString("%1%1%1%1").arg(color)+tr("FM")+QString("%1%1
"); - int gvars = GetCurrentFirmware()->getCapability(Gvars); - if ((gvars && GetCurrentFirmware()->getCapability(GvarsFlightModes)) || GetCurrentFirmware()->getCapability(RotaryEncoders)) { - str.append("
"); - str.append(""); - if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { - str.append(QString(""); - } - if (GetCurrentFirmware()->getCapability(RotaryEncoders)) { - str.append(QString(""); - } - str.append(""); - if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { - for (i=0; iGV%1
%2").arg(i+1).arg(g_model1.gvars_names[i])); - } - } - for (i=0; igetCapability(RotaryEncoders); i++) { - str.append(QString("
").arg((i==0 ? 'A': 'B'))); - } - str.append(""); - for (i=0; igetCapability(FlightModes); i++) { - FlightModeData *pd1=&g_model1.flightModeData[i]; - FlightModeData *pd2=&g_model2.flightModeData[i]; - str.append("").arg(pd1->name).arg(color)); - if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { - for (k=0; kgvars[k],pd2->gvars[k]); - if (pd1->gvars[k]<=1024) { - str.append(QString(""); - } - else { - int num = pd1->gvars[k] - 1025; - if (num>=i) num++; - str.append(QString("").arg(num)); - } - } - } - for (k=0; kgetCapability(RotaryEncoders); k++) { - color=getColor1(pd1->rotaryEncoders[k],pd2->rotaryEncoders[k]); - if (pd1->rotaryEncoders[k]<=1024) { - str.append(QString(""); - } - else { - int num = pd1->rotaryEncoders[k] - 1025; - if (num>=i) num++; - str.append(QString("").arg(num)); - } - } - str.append(""); - } - str.append("
 ").arg(gvars)+tr("Gvars")+"").arg(GetCurrentFirmware()->getCapability(RotaryEncoders))+tr("Rot. Enc.")+"
"+tr("Flight mode name")+"RE%1
"+tr("FM")+QString("%1 ").arg(i)); - color=getColor1(pd1->name,pd2->name); - str.append(QString("%1%1").arg(pd1->gvars[k]).arg(color)+"").arg(color)+tr("FM")+QString("%1%1").arg(pd1->rotaryEncoders[k]).arg(color)+"").arg(color)+tr("FM")+QString("%1
"); - } - str.append("
"); - str.append(""); - for (i=0; i<4; i++) { - str.append(QString("").arg(modelPrinter2.printInputName(i))); - } - str.append(""); - for (i=0; igetCapability(FlightModes); i++) { - FlightModeData *pd1=&g_model1.flightModeData[i]; - FlightModeData *pd2=&g_model2.flightModeData[i]; - str.append("").arg(pd2->name).arg(color)); - color=getColor2(pd1->fadeIn,pd2->fadeIn); - str.append(QString("").arg(pd2->fadeIn).arg(color)); - color=getColor2(pd1->fadeOut,pd2->fadeOut); - str.append(QString("").arg(pd2->fadeOut).arg(color)); - for (k=0; k<4; k++) { - if (pd2->trimRef[k]==-1) { - color=getColor2(pd1->trim[k],pd2->trim[k]); - str.append(QString("").arg(pd2->trim[k]).arg(color)); - } else { - color=getColor2(pd1->trimRef[k],pd2->trimRef[k]); - str.append(QString("").arg(pd2->trimRef[k])); - } - } - color=getColor2(pd1->swtch,pd2->swtch); - str.append(QString("").arg(pd2->swtch.toString()).arg(color)); - str.append(""); - } - str.append("
 "); - str.append(tr("Fades")+""+tr("Trims")); - str.append(""+tr("Switch")+"
"+tr("Flight mode name")); - str.append(""+tr("IN")+""+tr("OUT")+"%1
"+tr("FM")+QString("%1 ").arg(i)); - color=getColor2(pd1->name,pd2->name); - str.append(QString("%1%1%1%1").arg(color)+tr("FM")+QString("%1%1
"); - - if ((gvars && GetCurrentFirmware()->getCapability(GvarsFlightModes)) || GetCurrentFirmware()->getCapability(RotaryEncoders)) { - str.append("
"); - str.append(""); - if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { - str.append(QString(""); - } - if (GetCurrentFirmware()->getCapability(RotaryEncoders)) { - str.append(QString(""); - } - str.append(""); - if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { - for (i=0; iGV%1
%2").arg(i+1).arg(g_model2.gvars_names[i])); - } - } - for (i=0; igetCapability(RotaryEncoders); i++) { - str.append(QString("
").arg((i==0 ? 'A': 'B'))); - } - str.append(""); - for (i=0; igetCapability(FlightModes); i++) { - FlightModeData *pd1=&g_model1.flightModeData[i]; - FlightModeData *pd2=&g_model2.flightModeData[i]; - str.append("").arg(pd2->name).arg(color)); - if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { - for (k=0; kgvars[k],pd2->gvars[k]); - if (pd2->gvars[k]<=1024) { - str.append(QString(""); - } - else { - int num = pd2->gvars[k] - 1025; - if (num>=i) num++; - str.append(QString("").arg(num)); - } - } - } - for (k=0; kgetCapability(RotaryEncoders); k++) { - color=getColor1(pd1->rotaryEncoders[k],pd2->rotaryEncoders[k]); - if (pd2->rotaryEncoders[k]<=1024) { - str.append(QString(""); - } - else { - int num = pd2->rotaryEncoders[k] - 1025; - if (num>=i) num++; - str.append(QString("").arg(num)); - } - } - str.append(""); - } - str.append("
 ").arg(gvars)+tr("Gvars")+"").arg(GetCurrentFirmware()->getCapability(RotaryEncoders))+tr("Rot. Enc.")+"
"+tr("Flight mode name")+"RE%1
"+tr("FM")+QString("%1 ").arg(i)); - color=getColor1(pd1->name,pd2->name); - str.append(QString("%1%1").arg(pd2->gvars[k]).arg(color)+"").arg(color)+tr("FM")+QString("%1%1").arg(pd2->rotaryEncoders[k]).arg(color)+"").arg(color)+tr("FM")+QString("%1
"); - } - str.append("
"); - te->append(str); -} - -void CompareDialog::printLimits() -{ - QString color; - QString str = ""; - str.append(""); - str.append(""); - str.append("

"+tr("Limits")+"

"); - if (GetCurrentFirmware()->getCapability(HasChNames)) { - str.append(""); - } else { - str.append(""); - } - for(int i=0; igetCapability(Outputs); i++) { - str.append(""); - if (GetCurrentFirmware()->getCapability(HasChNames)) { - QString name1=g_model1.limitData[i].name; - QString name2=g_model2.limitData[i].name; - color=getColor1(name1,name2); - if (name1.trimmed().isEmpty()) { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),color,true)); - } else { - str.append(doTC(name1,color,true)); - } - } else { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); - } - color=getColor1(g_model1.limitData[i].offset,g_model2.limitData[i].offset); - str.append(doTR(g_model1.limitData[i].offsetToString(), color)); - color=getColor1(g_model1.limitData[i].min,g_model2.limitData[i].min); - str.append(doTR(g_model1.limitData[i].minToString(), color)); - color=getColor1(g_model1.limitData[i].max,g_model2.limitData[i].max); - str.append(doTR(g_model1.limitData[i].maxToString(), color)); - color=getColor1(g_model1.limitData[i].revert,g_model2.limitData[i].revert); - str.append(doTR(QString(g_model1.limitData[i].revert ? tr("INV") : tr("NOR")),color)); - str.append(""); - } - str.append("
"+tr("Name")+""+tr("Offset")+""+tr("Min")+""+tr("Max")+""+tr("Invert")+"
"+tr("Offset")+""+tr("Min")+""+tr("Max")+""+tr("Invert")+"
"); - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(""); - if (GetCurrentFirmware()->getCapability(HasChNames)) { - QString name1=g_model1.limitData[i].name; - QString name2=g_model2.limitData[i].name; - color=getColor2(name1,name2); - if (name2.trimmed().isEmpty()) { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),color,true)); - } else { - str.append(doTC(name2,color,true)); - } - } else { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); - } - color=getColor2(g_model1.limitData[i].offset,g_model2.limitData[i].offset); - str.append(doTR(g_model2.limitData[i].offsetToString(), color)); - color=getColor2(g_model1.limitData[i].min,g_model2.limitData[i].min); - str.append(doTR(g_model2.limitData[i].minToString(), color)); - color=getColor2(g_model1.limitData[i].max,g_model2.limitData[i].max); - str.append(doTR(g_model2.limitData[i].maxToString(), color)); - color=getColor2(g_model1.limitData[i].revert,g_model2.limitData[i].revert); - str.append(doTR(QString(g_model2.limitData[i].revert ? tr("INV") : tr("NOR")),color)); - str.append(""); - } - str.append("
"+tr("Offset")+""+tr("Min")+""+tr("Max")+""+tr("Invert")+"
"); - te->append(str); -} - -void CompareDialog::printGvars() -{ - QString color; - int gvars = GetCurrentFirmware()->getCapability(Gvars); - - if (!GetCurrentFirmware()->getCapability(GvarsFlightModes) && gvars) { - QString str = ""; - str.append(""); - str.append(""); - str.append("

"+tr("Global Variables")+"

"); - str.append(""); - FlightModeData *pd1=&g_model1.flightModeData[0]; - FlightModeData *pd2=&g_model2.flightModeData[0]; - int width = 100 / gvars; - str.append(""); - for (int i=0; i").arg(width)+tr("GV")+QString("%1").arg(i+1)); - } - str.append(""); - str.append(""); - for (int i=0; igvars[i],pd2->gvars[i]); - str.append(QString("").arg(pd1->gvars[i])); - } - str.append(""); - str.append("
").arg(width).arg(color)+QString("%1
"); - str.append(""); - str.append(""); - for (int i=0; i").arg(width)+tr("GV")+QString("%1").arg(i+1)); - } - str.append(""); - str.append(""); - for (int i=0; igvars[i],pd2->gvars[i]); - str.append(QString("").arg(pd2->gvars[i])); - } - str.append(""); - str.append("
").arg(width).arg(color)+QString("%1
"); - te->append(str); - } -} - -void CompareDialog::applyDiffFont(QString & v1, QString & v2, const QString & font, bool eqGrey) -{ - if (v1 != v2) { - if (!v1.isEmpty()) v1 = addFont(v1, "green", "", font); - if (!v2.isEmpty()) v2 = addFont(v2, "red" , "", font); - } - else if (eqGrey) { - if (!v1.isEmpty()) v1 = addFont(v1, "grey", "", font); - if (!v2.isEmpty()) v2 = addFont(v2, "grey", "", font); - } -} - -void CompareDialog::diffAndAssembleTableLines(QStringList & i1, QStringList & i2, QString & o1, QString & o2) -{ - while(!i1.isEmpty() || !i2.isEmpty()) { - QString l1, l2; - if (!i1.isEmpty()) l1 = i1.takeFirst(); - if (!i2.isEmpty()) l2 = i2.takeFirst(); - applyDiffFont(l1, l2, "Courier New", true); - if (!l1.isEmpty()) o1 += "" + l1 + ""; - if (!l2.isEmpty()) o2 += "" + l2 + ""; - } -} - -void CompareDialog::printInputs() -{ - QString str = "

"; - str += tr("Inputs"); - str += "

"; - for(uint8_t i=0; igetCapability(Outputs); i++) { - if (ChannelHasExpo(g_model1.expoData, i) || ChannelHasExpo(g_model2.expoData, i)) { - - QString name1, name2; - name1 = modelPrinter1.printInputName(i); - name2 = modelPrinter2.printInputName(i); - applyDiffFont(name1, name2); - - QStringList lines1, lines2; - for (int j=0; jchn == i) && (ed1-> mode != 0)) lines1 << modelPrinter1.printInputLine(ed1); - if ((ed2->chn == i) && (ed2-> mode != 0)) lines2 << modelPrinter2.printInputLine(ed2); - } - - QString diffLines1, diffLines2; - diffAndAssembleTableLines(lines1, lines2, diffLines1, diffLines2); - - str += ""; - str += ""; - str += ""; - str += ""; - str += ""; - str += ""; - } - } - str += "
" + name1 + "" + diffLines1 + "
" + name2 + "" + diffLines2 + "
"; - te->append(str); - // debugHtml(str); -} - -void CompareDialog::printMixers() -{ - QString color; - QString str = "

"; - str += tr("Mixers"); - str += "

"; - for(uint8_t i=1; i<=GetCurrentFirmware()->getCapability(Outputs); i++) { - if (ChannelHasMix(g_model1.mixData, i) || ChannelHasMix(g_model2.mixData, i)) { - - QStringList lines1, lines2; - for (int j=0; jgetCapability(Mixes); j++) { - MixData *md1 = &g_model1.mixData[j]; - MixData *md2 = &g_model2.mixData[j]; - if (md1->destCh == i) lines1 << modelPrinter1.printMixerLine(md1); - if (md2->destCh == i) lines2 << modelPrinter2.printMixerLine(md2); - } - - QString diffLines1, diffLines2; - diffAndAssembleTableLines(lines1, lines2, diffLines1, diffLines2); - - str += ""; - str += ""; - str += "").arg(i,2,10,QChar('0')); - str += ""; - str += ""; - } - } - str += "
"+ diffLines1 + "
"+tr("CH")+QString("%1"+ diffLines2 + "
"; - te->append(str); - // debugHtml(str); -} - -void CompareDialog::printCurves() -{ - int i,r,g,b,c,count1,count2,usedcurves=0; - QString cm1y,cm1x, cm2y,cm2x; - char buffer [16]; - QPen pen(Qt::black, 2, Qt::SolidLine); - int numcurves=firmware->getCapability(NumCurves); - if (numcurves==0) { - numcurves=16; - } - - QString str = "

"; - str.append(tr("Curves")); - str.append("

"); - str.append(""); - QImage qi1(ISIZE+1,ISIZE+1,QImage::Format_RGB32); - QPainter painter1(&qi1); - QImage qi2(ISIZE+1,ISIZE+1,QImage::Format_RGB32); - QPainter painter2(&qi2); - painter1.setBrush(QBrush("#FFFFFF")); - painter2.setBrush(QBrush("#FFFFFF")); - painter1.setPen(QColor(0,0,0)); - painter2.setPen(QColor(0,0,0)); - painter1.drawRect(0,0,ISIZE,ISIZE); - painter2.drawRect(0,0,ISIZE,ISIZE); - - for(i=0; i0) || (g_model1.curves[i].type == CurveData::CURVE_TYPE_CUSTOM)|| (g_model1.curves[i].count !=5) || - (count2>0) || (g_model2.curves[i].type == CurveData::CURVE_TYPE_CUSTOM)|| (g_model2.curves[i].count !=5)) { - pen.setColor(colors[usedcurves]); - painter1.setPen(pen); - painter2.setPen(pen); - - colors[usedcurves].getRgb(&r,&g,&b); - c=r; - c*=256; - c+=g; - c*=256; - c+=b; - sprintf(buffer,"%06x",c); - // curves are different in number of points or curve type so makes little sense to compare they are just different - if ((g_model1.curves[i].count!=g_model2.curves[i].count) || (g_model1.curves[i].type!=g_model2.curves[i].type)) { - cm1y="["; - cm1x="["; - for(int j=0; j")); - } - str.append(QString("").arg(i+1)); - str.append("")); - } - } else { - // curves have the same number of points and the same type, we can compare them point by point - cm1y="["; - cm1x="["; - cm2y="["; - cm2x="["; - for(int j=0; j%1").arg(g_model1.curves[i].points[j].y)); - cm2y.append(QString("%1").arg(g_model2.curves[i].points[j].y)); - } else { - cm1y.append(QString("%1").arg(g_model1.curves[i].points[j].y)); - cm2y.append(QString("%1").arg(g_model2.curves[i].points[j].y)); - } - if (g_model1.curves[i].points[j].x!=g_model2.curves[i].points[j].x) { - cm1x.append(QString("%1").arg(g_model1.curves[i].points[j].x)); - cm2x.append(QString("%1").arg(g_model2.curves[i].points[j].x)); - } else { - cm1x.append(QString("%1").arg(g_model1.curves[i].points[j].x)); - cm2x.append(QString("%1").arg(g_model2.curves[i].points[j].x)); - } - if (j<(g_model1.curves[i].count-1)) { - cm1y.append(","); - cm1x.append(","); - cm2y.append(","); - cm2x.append(","); - } - if (g_model1.curves[i].type == CurveData::CURVE_TYPE_CUSTOM) - painter1.drawLine(ISIZE/2+(ISIZE*g_model1.curves[i].points[j-1].x)/200,ISIZE/2-(ISIZE*g_model1.curves[i].points[j-1].y)/200,ISIZE/2+(ISIZE*g_model1.curves[i].points[j].x)/200,ISIZE/2-(ISIZE*g_model1.curves[i].points[j].y)/200); - else - painter1.drawLine(ISIZE*(j-1)/(g_model1.curves[i].count-1),ISIZE/2-(ISIZE*g_model1.curves[i].points[j-1].y)/200,ISIZE*(j)/(g_model1.curves[i].count-1),ISIZE/2-(ISIZE*g_model1.curves[i].points[j].y)/200); - if (g_model2.curves[i].type == CurveData::CURVE_TYPE_CUSTOM) - painter2.drawLine(ISIZE/2+(ISIZE*g_model2.curves[i].points[j-1].x)/200,ISIZE/2-(ISIZE*g_model2.curves[i].points[j-1].y)/200,ISIZE/2+(ISIZE*g_model2.curves[i].points[j].x)/200,ISIZE/2-(ISIZE*g_model2.curves[i].points[j].y)/200); - else - painter2.drawLine(ISIZE*(j-1)/(g_model2.curves[i].count-1),ISIZE/2-(ISIZE*g_model2.curves[i].points[j-1].y)/200,ISIZE*(j)/(g_model2.curves[i].count-1),ISIZE/2-(ISIZE*g_model2.curves[i].points[j].y)/200); - } - painter1.setPen(QColor(0,0,0)); - painter2.setPen(QColor(0,0,0)); - painter1.drawLine(0,ISIZE/2,ISIZE,ISIZE/2); - painter2.drawLine(0,ISIZE/2,ISIZE,ISIZE/2); - painter1.drawLine(ISIZE/2,0,ISIZE/2,ISIZE); - painter2.drawLine(ISIZE/2,0,ISIZE/2,ISIZE); - for(int k=0; k<21; k++) { - painter1.drawLine(ISIZE/2-5,(ISIZE*k)/(20),ISIZE/2+5,(ISIZE*k)/(20)); - painter2.drawLine(ISIZE/2-5,(ISIZE*k)/(20),ISIZE/2+5,(ISIZE*k)/(20)); - painter1.drawLine((ISIZE*k)/(20),ISIZE/2-5,(ISIZE*k)/(20),ISIZE/2+5); - painter2.drawLine((ISIZE*k)/(20),ISIZE/2-5,(ISIZE*k)/(20),ISIZE/2+5); - } - - cm1y.append("]"); - cm1x.append("]"); - cm2y.append("]"); - cm2x.append("]"); - str.append("")); - } - str.append(QString("").arg(i+1)); - str.append("")); - } - } - usedcurves++; - } - } - if (usedcurves>0) { - str.append(QString("").arg(curvefile1).arg(curvefile2)); - str.append("
"); - str.append(cm1y); - if ((g_model1.curves[i].type == CurveData::CURVE_TYPE_CUSTOM)) { - str.append(QString("
")+cm1x+QString("
").arg(buffer)+tr("Curve")+QString(" %1"); - str.append(cm2y); - if ((g_model2.curves[i].type == CurveData::CURVE_TYPE_CUSTOM)) { - str.append(QString("
")+cm2x+QString("
"); - str.append(cm1y); - if ((g_model1.curves[i].type == CurveData::CURVE_TYPE_CUSTOM)) { - str.append(QString("
")+cm1x+QString("
").arg(buffer)+tr("Curve")+QString(" %1"); - str.append(cm2y); - if ((g_model2.curves[i].type == CurveData::CURVE_TYPE_CUSTOM)) { - str.append(QString("
")+cm2x+QString("
 
"); - qi1.save(curvefile1, "png",100); - qi2.save(curvefile2, "png",100); - te->append(str); - } -} - -void CompareDialog::printLogicalSwitches() -{ - bool haveOutput = false; - QString str = ""; - str += ""; - str += "

" + tr("Logical Switches") + "

"; - for (int i=0; igetCapability(LogicalSwitches); i++) { - QString l1 = modelPrinter1.printLogicalSwitchLine(i); - QString l2 = modelPrinter2.printLogicalSwitchLine(i); - if (!(l1.isEmpty() && l2.isEmpty())) { - applyDiffFont(l1, l2); - str += ""; - str += ""; - str += "").arg(i+1); - str += ""; - str += ""; - haveOutput = true; - } - } - str += "
"+ l1 + "" + tr("L") + QString("%1" + l2 + "
"; - if (haveOutput) te->append(str); -} - -void CompareDialog::printCustomFunctions() -{ - bool haveOutput = false; - QString str = ""; - str += ""; - str += "

" + tr("Special Functions") + "

"; - for (int i=0; igetCapability(CustomFunctions); i++) { - QString l1 = modelPrinter1.printCustomFunctionLine(i); - QString l2 = modelPrinter2.printCustomFunctionLine(i); - if (!(l1.isEmpty() && l2.isEmpty())) { - applyDiffFont(l1, l2); - str += ""; - str += ""; - str += "").arg(i+1); - str += ""; - str += ""; - haveOutput = true; - } - } - str += "
"+ l1 + "" + tr("SF") + QString("%1" + l2 + "
"; - if (haveOutput) te->append(str); -} - -void CompareDialog::printFrSky() -{ - QString color; - float value1,value2; - QString str = ""; - str.append(""); - str.append("

"+tr("Telemetry Settings")+"

"); - str.append(""); - FrSkyData *fd1=&g_model1.frsky; - FrSkyData *fd2=&g_model2.frsky; - str.append(""); - for (int i=0; i<2; i++) { - str.append(""); - float ratio=(fd1->channels[i].ratio/(fd1->channels[i].type==0 ?10.0:1)); - str.append(""); - color=getColor1(fd1->channels[i].type,fd2->channels[i].type); - str.append(""); - color=getColor1(fd1->channels[i].ratio,fd2->channels[i].ratio); - str.append(""); - color=getColor1(fd1->channels[i].offset*fd1->channels[i].ratio,fd2->channels[i].offset*fd2->channels[i].ratio); - str.append(""); - str.append(""); - } - str.append("
"+tr("Analog")+""+tr("Unit")+""+tr("Scale")+""+tr("Offset")+"
"+tr("A%1").arg(i+1)+""+getFrSkyUnits(fd1->channels[i].type)+""+QString::number(ratio,10,(fd1->channels[i].type==0 ? 1:0))+""+QString::number((fd1->channels[i].offset*ratio)/255,10,(fd1->channels[i].type==0 ? 1:0))+"

"); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - for (int i=0; i<2; i++) { - float ratio1=(fd1->channels[i].ratio/(fd1->channels[i].type==0 ?10.0:1)); - float ratio2=(fd1->channels[i].ratio/(fd1->channels[i].type==0 ?10.0:1)); - str.append(""); - str.append(""); - color=getColor1(fd1->channels[i].alarms[0].level,fd2->channels[i].alarms[0].level); - str.append(""); - color=getColor1(fd1->channels[i].alarms[0].greater,fd2->channels[i].alarms[0].greater); - str.append(""); - color=getColor1(fd1->channels[i].alarms[1].level,fd2->channels[i].alarms[1].level); - str.append(""); - color=getColor1(fd1->channels[i].alarms[1].greater,fd2->channels[i].alarms[1].greater); - str.append(""); - } - str.append(""); - color=getColor1(fd1->rssiAlarms[0].level,fd2->rssiAlarms[0].level); - str.append(""); - str.append(""); - color=getColor1(fd1->rssiAlarms[0].value,fd2->rssiAlarms[0].value); - str.append(""); - color=getColor1(fd1->rssiAlarms[1].level,fd2->rssiAlarms[1].level); - str.append(""); - str.append(""); - color=getColor1(fd1->rssiAlarms[1].value,fd2->rssiAlarms[1].value); - str.append(""); - str.append("
"+tr("Alarm 1")+""+tr("Alarm 2")+"
"+tr("Type")+""+tr("Condition")+""+tr("Value")+""+tr("Type")+""+tr("Condition")+""+tr("Value")+"
"+tr("A%1").arg(i+1)+""+getFrSkyAlarmType(fd1->channels[i].alarms[0].level)+""); - str.append((fd1->channels[i].alarms[0].greater==1) ? ">" : "<"); - value1=ratio1*(fd1->channels[i].alarms[0].value/255.0+fd1->channels[i].offset/255.0); - value2=ratio2*(fd2->channels[i].alarms[0].value/255.0+fd2->channels[i].offset/255.0); - color=getColor1(value1,value2); - str.append(""+QString::number(value1,10,(fd1->channels[i].type==0 ? 1:0))+""+getFrSkyAlarmType(fd1->channels[i].alarms[1].level)+""); - str.append((fd1->channels[i].alarms[1].greater==1) ? ">" : "<"); - value1=ratio1*(fd1->channels[i].alarms[1].value/255.0+fd1->channels[i].offset/255.0); - value2=ratio2*(fd2->channels[i].alarms[1].value/255.0+fd2->channels[i].offset/255.0); - color=getColor1(value1,value2); - str.append(""+QString::number(value1,10,(fd1->channels[i].type==0 ? 1:0))+"
"+tr("RSSI Alarm")+""+getFrSkyAlarmType(fd1->rssiAlarms[0].level)+"<"+QString::number(fd1->rssiAlarms[0].value,10)+""+getFrSkyAlarmType(fd1->rssiAlarms[1].level)+"<"+QString::number(fd1->rssiAlarms[1].value,10)+"
"); -#if 0 - if (GetCurrentFirmware()->getCapability(TelemetryBars) || GetCurrentFirmware()->getCapability(TelemetryCSFields)) { - int cols=GetCurrentFirmware()->getCapability(TelemetryColsCSFields); - if (cols==0) cols=2; - for (int j=0; jgetCapability(TelemetryCSFields)/(4*cols); j++) { - QString tcols; - QString cwidth; - QString swidth; - if (cols==2) { - tcols="3"; - cwidth="45"; - swidth="10"; - } else { - tcols="5"; - cwidth="30"; - swidth="5"; - } - color=getColor1(fd1->screens[j].type,fd2->screens[j].type); - if (fd1->screens[j].type==0) { - str.append("
"); - for (int r=0; r<4; r++) { - str.append(""); - for (int c=0; cscreens[j].type==fd2->screens[j].type) - color=getColor1(fd1->screens[j].body.lines[r].source[c],fd2->screens[j].body.lines[r].source[c]); - str.append(""); - if (c<(cols-1)) { - str.append(""); - } - } - str.append(""); - } - str.append("
"+tr("Custom Telemetry View")+"
 
"+getFrSkySrc(fd1->screens[j].body.lines[r].source[c])+" 
"); - } else { - str.append("
"); - str.append(""); - for (int i=0; i<4; i++) { - str.append(""); - if (fd1->screens[0].type==fd2->screens[0].type) - color=getColor1(fd1->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].source); - str.append(""); - // TODO value1 = getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMin,fd1); - // TODO value2 = getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMin,fd2); - if (fd1->screens[0].type==fd2->screens[0].type) - color=getColor1(value1,value2); - str.append(""); - // TODO value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMax,fd1); - // TODO value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMax,fd2); - if (fd1->screens[0].type==fd2->screens[0].type) - color=getColor1(value1,value2); - str.append(""); - } - str.append("
"+tr("Telemetry Bars")+"
"+tr("Bar Number")+""+tr("Source")+""+tr("Min")+""+tr("Max")+"
"+QString::number(i+1,10)+""+getFrSkySrc(fd1->screens[0].body.bars[i].source)+""+QString::number(value1)+""+QString::number(value1)+"
"); - } - } - } -#endif - - str.append("
"); - str.append(""); - str.append(""); - for (int i=0; i<2; i++) { - str.append(""); - float ratio=(fd2->channels[i].ratio/(fd1->channels[i].type==0 ?10.0:1)); - str.append(""); - color=getColor2(fd1->channels[i].type,fd2->channels[i].type); - str.append(""); - color=getColor2(fd1->channels[i].ratio,fd2->channels[i].ratio); - str.append(""); - color=getColor2(fd1->channels[i].offset*fd1->channels[i].ratio,fd2->channels[i].offset*fd2->channels[i].ratio); - str.append(""); - str.append(""); - } - str.append("
"+tr("Analog")+""+tr("Unit")+""+tr("Scale")+""+tr("Offset")+"
"+tr("A%1").arg(i+1)+""+getFrSkyUnits(fd2->channels[i].type)+""+QString::number(ratio,10,(fd2->channels[i].type==0 ? 1:0))+""+QString::number((fd2->channels[i].offset*ratio)/255,10,(fd2->channels[i].type==0 ? 1:0))+"

"); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - str.append(""); - for (int i=0; i<2; i++) { - float ratio1=(fd1->channels[i].ratio/(fd1->channels[i].type==0 ?10.0:1)); - float ratio2=(fd1->channels[i].ratio/(fd1->channels[i].type==0 ?10.0:1)); - str.append(""); - str.append(""); - color=getColor2(fd1->channels[i].alarms[0].level,fd2->channels[i].alarms[0].level); - str.append(""); - color=getColor2(fd1->channels[i].alarms[0].greater,fd2->channels[i].alarms[0].greater); - str.append(""); - color=getColor2(fd1->channels[i].alarms[1].level,fd2->channels[i].alarms[1].level); - str.append(""); - color=getColor2(fd1->channels[i].alarms[1].greater,fd2->channels[i].alarms[1].greater); - str.append(""); - } - str.append(""); - color=getColor2(fd1->rssiAlarms[0].level,fd2->rssiAlarms[0].level); - str.append(""); - str.append(""); - color=getColor2(fd1->rssiAlarms[0].value,fd2->rssiAlarms[0].value); - str.append(""); - color=getColor2(fd1->rssiAlarms[1].level,fd2->rssiAlarms[1].level); - str.append(""); - str.append(""); - color=getColor2(fd1->rssiAlarms[1].value,fd2->rssiAlarms[1].value); - str.append(""); - str.append("
"+tr("Alarm 1")+""+tr("Alarm 2")+"
"+tr("Type")+""+tr("Condition")+""+tr("Value")+""+tr("Type")+""+tr("Condition")+""+tr("Value")+"
"+tr("A%1").arg(i+1)+""+getFrSkyAlarmType(fd2->channels[i].alarms[0].level)+""); - str.append((fd2->channels[i].alarms[0].greater==1) ? ">" : "<"); - value1=ratio1*(fd1->channels[i].alarms[0].value/255.0+fd1->channels[i].offset/255.0); - value2=ratio2*(fd2->channels[i].alarms[0].value/255.0+fd2->channels[i].offset/255.0); - color=getColor2(value1,value2); - str.append(""+QString::number(value2,10,(fd2->channels[i].type==0 ? 1:0))+""+getFrSkyAlarmType(fd2->channels[i].alarms[1].level)+""); - str.append((fd2->channels[i].alarms[1].greater==1) ? ">" : "<"); - value1=ratio1*(fd1->channels[i].alarms[1].value/255.0+fd1->channels[i].offset/255.0); - value2=ratio2*(fd2->channels[i].alarms[1].value/255.0+fd2->channels[i].offset/255.0); - color=getColor2(value1,value2); - str.append(""+QString::number(value2,10,(fd2->channels[i].type==0 ? 1:0))+"
"+tr("RSSI Alarm")+""+getFrSkyAlarmType(fd2->rssiAlarms[0].level)+"<"+QString::number(fd2->rssiAlarms[0].value,10)+""+getFrSkyAlarmType(fd2->rssiAlarms[1].level)+"<"+QString::number(fd2->rssiAlarms[1].value,10)+"

"); -#if 0 - if (GetCurrentFirmware()->getCapability(TelemetryBars) || GetCurrentFirmware()->getCapability(TelemetryCSFields)) { - int cols=GetCurrentFirmware()->getCapability(TelemetryColsCSFields); - if (cols==0) cols=2; - for (int j=0; jgetCapability(TelemetryCSFields)/(4*cols); j++) { - QString tcols; - QString cwidth; - QString swidth; - if (cols==2) { - tcols="3"; - cwidth="45"; - swidth="10"; - } else { - tcols="5"; - cwidth="30"; - swidth="5"; - } - color=getColor2(fd1->screens[j].type,fd2->screens[j].type); - if (fd2->screens[j].type==0) { - str.append("
"); - for (int r=0; r<4; r++) { - str.append(""); - for (int c=0; cscreens[j].type==fd2->screens[j].type) - color=getColor2(fd1->screens[j].body.lines[r].source[c],fd2->screens[j].body.lines[r].source[c]); - str.append(""); - if (c<(cols-1)) { - str.append(""); - } - } - str.append(""); - } - str.append("
"+tr("Custom Telemetry View")+"
 
"+getFrSkySrc(fd2->screens[j].body.lines[r].source[c])+" 
"); - } else { - str.append("
"); - str.append(""); - for (int i=0; i<4; i++) { - str.append(""); - if (fd1->screens[0].type==fd2->screens[0].type) - color=getColor2(fd1->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].source); - str.append(""); - // TODO value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMin,fd1); - // TODO value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMin,fd2); - if (fd1->screens[0].type==fd2->screens[0].type) - color=getColor2(value1,value2); - str.append(""); - // TODO value1=getBarValue(fd1->screens[0].body.bars[i].source,fd1->screens[0].body.bars[i].barMax,fd1); - // TODO value2=getBarValue(fd2->screens[0].body.bars[i].source,fd2->screens[0].body.bars[i].barMax,fd2); - if (fd1->screens[0].type==fd2->screens[0].type) - color=getColor2(value1,value2); - str.append(""); - } - str.append("
"+tr("Telemetry Bars")+"
"+tr("Bar Number")+""+tr("Source")+""+tr("Min")+""+tr("Max")+"
"+QString::number(i+1,10)+""+getFrSkySrc(fd2->screens[0].body.bars[i].source)+""+QString::number(value2)+""+QString::number(value2)+"
"); - } - } - } -#endif - str.append("
"); - te->append(str); -} - void CompareDialog::on_printButton_clicked() { - QPrinter printer; - printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); - QPrintDialog *dialog = new QPrintDialog(&printer, this); - dialog->setWindowTitle(tr("Print Document")); - if (dialog->exec() != QDialog::Accepted) - return; - te->print(&printer); + QPrinter printer; + printer.setPageMargins(10.0, 10.0, 10.0, 10.0, printer.Millimeter); + QPrintDialog * dialog = new QPrintDialog(&printer, this); + dialog->setWindowTitle(tr("Print Document")); + if (dialog->exec() != QDialog::Accepted) + return; + ui->textEdit->print(&printer); } void CompareDialog::on_printFileButton_clicked() { - QPrinter printer; - QString filename = QFileDialog::getSaveFileName(this,tr("Select PDF output file"),QString(),"Pdf File(*.pdf)"); - printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setOrientation(QPrinter::Landscape); - printer.setColorMode(QPrinter::Color); - if(!filename.isEmpty()) { - if(QFileInfo(filename).suffix().isEmpty()) - filename.append(".pdf"); - printer.setOutputFileName(filename); - te->print(&printer); - } + QPrinter printer; + QString filename = QFileDialog::getSaveFileName(this, tr("Select PDF output file"), QString(), "Pdf File(*.pdf)"); + printer.setPageMargins(10.0, 10.0, 10.0, 10.0, printer.Millimeter); + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setOrientation(QPrinter::Landscape); + printer.setColorMode(QPrinter::Color); + if (!filename.isEmpty()) { + if (QFileInfo(filename).suffix().isEmpty()) + filename.append(".pdf"); + printer.setOutputFileName(filename); + ui->textEdit->print(&printer); + } } diff --git a/companion/src/comparedialog.h b/companion/src/comparedialog.h index b8b15fc05..9805b8baa 100644 --- a/companion/src/comparedialog.h +++ b/companion/src/comparedialog.h @@ -1,11 +1,9 @@ -#ifndef COMPAREDIALOG_H -#define COMPAREDIALOG_H +#ifndef _COMPAREDIALOG_H +#define _COMPAREDIALOG_H #include -#include -#include -#include "eeprominterface.h" -#include "modelprinter.h" +#include +#include "multimodelprinter.h" namespace Ui { class CompareDialog; @@ -13,84 +11,32 @@ namespace Ui { class CompareDialog : public QDialog { - Q_OBJECT + Q_OBJECT public: CompareDialog(QWidget *parent, Firmware * firmware); ~CompareDialog(); - Firmware * firmware; protected: - GeneralSettings * settings; - ModelData g_model1; - ModelData g_model2; + MultiModelPrinter multimodelprinter; + ModelData model1; + ModelData model2; bool model1Valid; bool model2Valid; - - private: - void closeEvent(QCloseEvent *event); - Ui::CompareDialog *ui; - template QString getColor1(T val1, T val2) { - if (val1!=val2) - return "green"; - else - return "grey"; - } - template QString getColor2(T val1, T val2) { - if (val1!=val2) - return "red"; - else - return "grey"; - } - QString getColor1(char * val1, char * val2) { - if (strcmp(val1,val2)!=0) - return "green"; - else - return "grey"; - } - QString getColor2(char * val1, char * val2) { - if (strcmp(val1,val2)!=0) - return "red"; - else - return "grey"; - } - - bool ChannelHasExpo(ExpoData * expoArray, uint8_t destCh); - bool ChannelHasMix(MixData * mixArray, uint8_t destCh); - bool handleDroppedModel(const QMimeData * mimeData, ModelData * model, QLabel * label); - void applyDiffFont(QString & v1, QString & v2, const QString & font = "", bool eqGrey = false); - void diffAndAssembleTableLines(QStringList & i1, QStringList & i2, QString & o1, QString & o2); + Ui::CompareDialog * ui; - QTextEdit * te; - QString curvefile1; - QString curvefile2; - QDir *qd; - - ModelPrinter modelPrinter1; - ModelPrinter modelPrinter2; - GeneralSettings dummySettings; - -private slots: + protected slots: void on_printButton_clicked(); void on_printFileButton_clicked(); -protected: + protected: + void closeEvent(QCloseEvent * event); + bool handleDroppedModel(const QMimeData * mimeData, ModelData & model, QLabel * label); void dropEvent(QDropEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dragEnterEvent(QDragEnterEvent *event); void dragLeaveEvent(QDragLeaveEvent *event); void printDiff(); - void printSetup(); - void printPhases(); - void printLimits(); - void printInputs(); - void printMixers(); - void printCurves(); - void printGvars(); - void printLogicalSwitches(); - void printSafetySwitches(); - void printCustomFunctions(); - void printFrSky(); }; -#endif // COMPAREDIALOG_H +#endif // _COMPAREDIALOG_H diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index 41df54766..a03a1d07a 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -815,7 +815,7 @@ QString CustomFunctionData::funcToString() const } } -void CustomFunctionData::populateResetParams(ModelData * model, QComboBox * b, unsigned int value = 0) +void CustomFunctionData::populateResetParams(const ModelData * model, QComboBox * b, unsigned int value = 0) { int val = 0; Firmware * firmware = GetCurrentFirmware(); @@ -863,7 +863,7 @@ void CustomFunctionData::populateHapticParams(QStringList & qs) qs << "0" << "1" << "2" << "3"; } -QString CustomFunctionData::paramToString(ModelData * model) const +QString CustomFunctionData::paramToString(const ModelData * model) const { QStringList qs; if (func <= FuncInstantTrim) { @@ -948,17 +948,43 @@ QString CustomFunctionData::enabledToString() const return ""; } -QString LimitData::minToString() +CurveData::CurveData() +{ + clear(5); +} + +void CurveData::clear(int count) +{ + memset(this, 0, sizeof(CurveData)); + this->count = count; +} + +bool CurveData::isEmpty() const +{ + for (int i=0; i ModelData::expos(int input) const +{ + QVector result; + for (int i=0; ichn==input && ed->mode!=0) { + result << ed; + } + } + return result; +} + +QVector ModelData::mixes(int channel) const +{ + QVector result; + for (int i=0; idestCh == channel+1) { + result << md; + } + } + return result; +} + void ModelData::removeInput(const int idx) { unsigned int chn = expoData[idx].chn; @@ -1341,7 +1413,7 @@ void ModelData::clear() sensorData[i].clear(); } -bool ModelData::isempty() +bool ModelData::isEmpty() const { return !used; } diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index d925d07b5..2b4f11b23 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -445,7 +445,7 @@ class ExpoData { unsigned int mode; unsigned int chn; RawSwitch swtch; - unsigned int phases; // -5=!FP4, 0=normal, 5=FP4 + unsigned int flightModes; // -5=!FP4, 0=normal, 5=FP4 int weight; int offset; CurveReference curve; @@ -468,14 +468,14 @@ class CurveData { CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM }; - CurveData() { clear(5); } - + CurveData(); + void clear(int count); + bool isEmpty() const; CurveType type; bool smooth; int count; CurvePoint points[C9X_MAX_POINTS]; char name[6+1]; - void clear(int count) { memset(this, 0, sizeof(CurveData)); this->count = count; } }; class LimitData { @@ -489,9 +489,10 @@ class LimitData { bool symetrical; char name[6+1]; CurveReference curve; - QString minToString(); - QString maxToString(); - QString offsetToString(); + QString minToString() const; + QString maxToString() const; + QString offsetToString() const; + QString revertToString() const; void clear(); }; @@ -519,7 +520,7 @@ class MixData { bool noExpo; MltpxValue mltpx; // multiplex method 0=+ 1=* 2=replace unsigned int mixWarn; // mixer warning - unsigned int phases; // -5=!FP4, 0=normal, 5=FP4 + unsigned int flightModes; // -5=!FP4, 0=normal, 5=FP4 int sOffset; char name[MIXDATA_NAME_LEN+1]; @@ -625,11 +626,11 @@ class CustomFunctionData { // Function Switches data int repeatParam; void clear(); QString funcToString() const; - QString paramToString(ModelData * model) const; + QString paramToString(const ModelData * model) const; QString repeatToString() const; QString enabledToString() const; - static void populateResetParams(ModelData * model, QComboBox * b, unsigned int value); + static void populateResetParams(const ModelData * model, QComboBox * b, unsigned int value); static void populatePlaySoundParams(QStringList & qs); static void populateHapticParams(QStringList & qs); @@ -797,6 +798,12 @@ class MavlinkData { class TimerData { public: + enum CountDownMode { + COUNTDOWN_SILENT, + COUNTDOWN_BEEPS, + COUNTDOWN_VOICE, + COUNTDOWN_HAPTIC + }; TimerData() { clear(); } RawSwitch mode; char name[TIMER_NAME_LEN+1]; @@ -850,7 +857,7 @@ class ModuleData { bool ppmOutputType; // false = open drain, true = push pull int ppmFrameLength; void clear() { memset(this, 0, sizeof(ModuleData)); } - QString polarityToString() { return ppmPulsePol ? QObject::tr("Positive") : QObject::tr("Negative"); } + QString polarityToString() const { return ppmPulsePol ? QObject::tr("Positive") : QObject::tr("Negative"); } // TODO ModelPrinter }; #define C9X_MAX_SCRIPTS 7 @@ -992,6 +999,11 @@ class ModelData { void removeInput(const int idx); bool isInputValid(const unsigned int idx) const; + bool hasExpos(uint8_t inputIdx) const; + bool hasMixes(uint8_t output) const; + + QVector expos(int input) const; + QVector mixes(int channel) const; bool used; char name[12+1]; @@ -1043,7 +1055,7 @@ class ModelData { SensorData sensorData[C9X_MAX_SENSORS]; void clear(); - bool isempty(); + bool isEmpty() const; void setDefaultInputs(const GeneralSettings & settings); void setDefaultMixes(const GeneralSettings & settings); void setDefaultValues(unsigned int id, const GeneralSettings & settings); @@ -1362,9 +1374,9 @@ class EEPROMInterface virtual int save(uint8_t *eeprom, RadioData &radioData, uint32_t variant=0, uint8_t version=0) = 0; - virtual int getSize(ModelData &) = 0; + virtual int getSize(const ModelData &) = 0; - virtual int getSize(GeneralSettings &) = 0; + virtual int getSize(const GeneralSettings &) = 0; virtual int isAvailable(Protocol proto, int port=0) = 0; diff --git a/companion/src/firmwares/er9x/er9xinterface.cpp b/companion/src/firmwares/er9x/er9xinterface.cpp index 7961a2597..ddda4d86b 100644 --- a/companion/src/firmwares/er9x/er9xinterface.cpp +++ b/companion/src/firmwares/er9x/er9xinterface.cpp @@ -190,12 +190,12 @@ int Er9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t variant, return 0; } -int Er9xInterface::getSize(ModelData &model) +int Er9xInterface::getSize(const ModelData &model) { return 0; } -int Er9xInterface::getSize(GeneralSettings &settings) +int Er9xInterface::getSize(const GeneralSettings &settings) { return 0; } diff --git a/companion/src/firmwares/er9x/er9xinterface.h b/companion/src/firmwares/er9x/er9xinterface.h index 09f133d58..5a73255f9 100644 --- a/companion/src/firmwares/er9x/er9xinterface.h +++ b/companion/src/firmwares/er9x/er9xinterface.h @@ -42,9 +42,9 @@ class Er9xInterface : public EEPROMInterface virtual int save(uint8_t * eeprom, RadioData & radioData, uint32_t variant=0, uint8_t version=0); - virtual int getSize(ModelData &); + virtual int getSize(const ModelData &); - virtual int getSize(GeneralSettings &settings); + virtual int getSize(const GeneralSettings &settings); virtual int isAvailable(Protocol proto, int port=0); diff --git a/companion/src/firmwares/ersky9x/ersky9xinterface.cpp b/companion/src/firmwares/ersky9x/ersky9xinterface.cpp index 9d10ff3de..857e745c1 100644 --- a/companion/src/firmwares/ersky9x/ersky9xinterface.cpp +++ b/companion/src/firmwares/ersky9x/ersky9xinterface.cpp @@ -234,12 +234,12 @@ int Ersky9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t varia return 0; } -int Ersky9xInterface::getSize(ModelData &model) +int Ersky9xInterface::getSize(const ModelData & model) { return 0; } -int Ersky9xInterface::getSize(GeneralSettings &settings) +int Ersky9xInterface::getSize(const GeneralSettings & settings) { return 0; } diff --git a/companion/src/firmwares/ersky9x/ersky9xinterface.h b/companion/src/firmwares/ersky9x/ersky9xinterface.h index 0ebce8dce..7e1c2dce6 100644 --- a/companion/src/firmwares/ersky9x/ersky9xinterface.h +++ b/companion/src/firmwares/ersky9x/ersky9xinterface.h @@ -42,9 +42,9 @@ class Ersky9xInterface : public EEPROMInterface virtual int save(uint8_t * eeprom, RadioData & radioData, uint32_t variant=0, uint8_t version=0); - virtual int getSize(ModelData &); + virtual int getSize(const ModelData &); - virtual int getSize(GeneralSettings &settings); + virtual int getSize(const GeneralSettings & settings); virtual int isAvailable(Protocol proto, int port=0); diff --git a/companion/src/firmwares/gruvin9x/gruvin9xeeprom.cpp b/companion/src/firmwares/gruvin9x/gruvin9xeeprom.cpp index e477de7ef..0630022e1 100644 --- a/companion/src/firmwares/gruvin9x/gruvin9xeeprom.cpp +++ b/companion/src/firmwares/gruvin9x/gruvin9xeeprom.cpp @@ -170,12 +170,12 @@ t_Gruvin9xExpoData::operator ExpoData () c9x.chn = chn; c9x.swtch = gruvin9xToSwitch(swtch); if (negPhase) { - c9x.phases= 1 << (phase -1); + c9x.flightModes= 1 << (phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.weight = weight; if (expo) { diff --git a/companion/src/firmwares/gruvin9x/gruvin9xinterface.cpp b/companion/src/firmwares/gruvin9x/gruvin9xinterface.cpp index 2db16ebcc..4eecfbde9 100644 --- a/companion/src/firmwares/gruvin9x/gruvin9xinterface.cpp +++ b/companion/src/firmwares/gruvin9x/gruvin9xinterface.cpp @@ -206,12 +206,12 @@ int Gruvin9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t vari return 0; } -int Gruvin9xInterface::getSize(ModelData &model) +int Gruvin9xInterface::getSize(const ModelData & model) { return 0; } -int Gruvin9xInterface::getSize(GeneralSettings &settings) +int Gruvin9xInterface::getSize(const GeneralSettings & settings) { return 0; } diff --git a/companion/src/firmwares/gruvin9x/gruvin9xinterface.h b/companion/src/firmwares/gruvin9x/gruvin9xinterface.h index cc2892efb..5fbed3bdf 100644 --- a/companion/src/firmwares/gruvin9x/gruvin9xinterface.h +++ b/companion/src/firmwares/gruvin9x/gruvin9xinterface.h @@ -43,9 +43,9 @@ class Gruvin9xInterface : public EEPROMInterface virtual int save(uint8_t *eeprom, RadioData &radioData, uint32_t variant=0, uint8_t version=0); - virtual int getSize(ModelData &); + virtual int getSize(const ModelData &); - virtual int getSize(GeneralSettings &settings); + virtual int getSize(const GeneralSettings & settings); virtual int isAvailable(Protocol proto, int port=0); diff --git a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp index 77ce0ee70..63ea744e5 100644 --- a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp @@ -87,14 +87,14 @@ t_Open9xGruvin9xMixData_v207::operator MixData () c9x.mixWarn = mixWarn; if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; } @@ -155,14 +155,14 @@ t_Open9xGruvin9xMixData_v209::operator MixData () c9x.mixWarn = mixWarn; if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; } @@ -222,7 +222,7 @@ t_Open9xGruvin9xMixData_v211::operator MixData () c9x.noExpo = noExpo; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - c9x.phases = phases; + c9x.flightModes = phases; c9x.sOffset = sOffset; } return c9x; diff --git a/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp b/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp index 4122bd573..4caeffcb1 100644 --- a/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp @@ -160,12 +160,12 @@ t_Open9xArmExpoData_v208::operator ExpoData () } c9x.swtch = open9xArmToSwitch(swtch); if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.weight = weight; return c9x; @@ -190,14 +190,14 @@ t_Open9xArmExpoData_v210::operator ExpoData () } c9x.swtch = open9xArmToSwitch(swtch); if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.weight = weight; getEEPROMZString(c9x.name, name, sizeof(name)); @@ -213,7 +213,7 @@ t_Open9xArmExpoData_v212::operator ExpoData () // TODO c9x.curveMode=curveMode; // c9x.curveParam=curveParam; c9x.swtch = open9xArmToSwitch(swtch); - c9x.phases= phases; + c9x.flightModes= phases; c9x.weight = weight; getEEPROMZString(c9x.name, name, sizeof(name)); return c9x; @@ -292,14 +292,14 @@ t_Open9xArmMixData_v208::operator MixData () c9x.mixWarn = mixWarn; if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=511; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=511; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; @@ -358,14 +358,14 @@ t_Open9xArmMixData_v209::operator MixData () c9x.mixWarn = mixWarn; if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=511; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=511; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; @@ -424,14 +424,14 @@ t_Open9xArmMixData_v210::operator MixData () c9x.mixWarn = mixWarn; if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=511; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=511; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; @@ -493,7 +493,7 @@ t_Open9xArmMixData_v212::operator MixData () c9x.noExpo = noExpo; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - c9x.phases = phases; + c9x.flightModes = phases; c9x.sOffset = sOffset; getEEPROMZString(c9x.name, name, sizeof(name)); } diff --git a/companion/src/firmwares/opentx/open9xStockeeprom.cpp b/companion/src/firmwares/opentx/open9xStockeeprom.cpp index bc510dc0a..898c45d45 100644 --- a/companion/src/firmwares/opentx/open9xStockeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xStockeeprom.cpp @@ -101,14 +101,14 @@ t_Open9xExpoData_v201::operator ExpoData () } c9x.swtch = open9xStockToSwitch(swtch); if (negPhase) { - c9x.phases= 1 << (phase -1); + c9x.flightModes= 1 << (phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.weight = weight; return c9x; @@ -121,7 +121,7 @@ t_Open9xExpoData_v211::operator ExpoData () c9x.chn = chn; // TODO c9x.curve c9x.swtch = open9xStockToSwitch(swtch); - c9x.phases = phases; + c9x.flightModes = phases; c9x.weight = weight; return c9x; } @@ -198,12 +198,12 @@ t_Open9xMixData_v201::operator MixData () c9x.mixWarn = mixWarn; if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; return c9x; @@ -259,12 +259,12 @@ t_Open9xMixData_v203::operator MixData () c9x.mixWarn = mixWarn; if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; return c9x; @@ -320,14 +320,14 @@ t_Open9xMixData_v205::operator MixData () c9x.mixWarn = mixWarn; if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; } @@ -387,14 +387,14 @@ t_Open9xMixData_v209::operator MixData () c9x.mixWarn = mixWarn; if (phase<0) { - c9x.phases= 1 << (-phase -1); + c9x.flightModes= 1 << (-phase -1); } else if (phase==0) { - c9x.phases=0; + c9x.flightModes=0; } else { - c9x.phases=63; - c9x.phases &= ~(1 << (phase -1)); + c9x.flightModes=63; + c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; } @@ -453,7 +453,7 @@ t_Open9xMixData_v211::operator MixData () c9x.noExpo = noExpo; c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - c9x.phases = phases; + c9x.flightModes = phases; c9x.sOffset = sOffset; } return c9x; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index b129174c7..834d601b9 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -943,7 +943,7 @@ class MixField: public TransformedField { { if (IS_TARANIS(board) && version >= 217) { internalField.Append(new UnsignedField<8>(_destCh)); - internalField.Append(new UnsignedField<9>(mix.phases)); + internalField.Append(new UnsignedField<9>(mix.flightModes)); internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); internalField.Append(new UnsignedField<1>((unsigned int &)mix.carryTrim)); internalField.Append(new UnsignedField<4>(mix.mixWarn)); @@ -961,7 +961,7 @@ class MixField: public TransformedField { else if (IS_ARM(board) && version >= 217) { internalField.Append(new UnsignedField<5>(_destCh)); internalField.Append(new UnsignedField<3>(mix.mixWarn)); - internalField.Append(new UnsignedField<9>(mix.phases)); + internalField.Append(new UnsignedField<9>(mix.flightModes)); internalField.Append(new BoolField<1>(_curveMode)); internalField.Append(new BoolField<1>(mix.noExpo)); internalField.Append(new SignedField<3>(mix.carryTrim)); @@ -979,7 +979,7 @@ class MixField: public TransformedField { } else if (IS_TARANIS(board) && version == 216) { internalField.Append(new UnsignedField<8>(_destCh)); - internalField.Append(new UnsignedField<16>(mix.phases)); + internalField.Append(new UnsignedField<16>(mix.flightModes)); internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); internalField.Append(new UnsignedField<1>((unsigned int &)mix.carryTrim)); internalField.Append(new SpareBitsField<5>()); @@ -1000,7 +1000,7 @@ class MixField: public TransformedField { else if (IS_ARM(board) && version == 216) { internalField.Append(new UnsignedField<5>(_destCh)); internalField.Append(new UnsignedField<3>(mix.mixWarn)); - internalField.Append(new UnsignedField<16>(mix.phases)); + internalField.Append(new UnsignedField<16>(mix.flightModes)); internalField.Append(new BoolField<1>(_curveMode)); internalField.Append(new BoolField<1>(mix.noExpo)); internalField.Append(new SignedField<3>(mix.carryTrim)); @@ -1019,7 +1019,7 @@ class MixField: public TransformedField { } else if (IS_ARM(board)) { internalField.Append(new UnsignedField<8>(_destCh)); - internalField.Append(new UnsignedField<16>(mix.phases)); + internalField.Append(new UnsignedField<16>(mix.flightModes)); internalField.Append(new BoolField<1>(_curveMode)); internalField.Append(new BoolField<1>(mix.noExpo)); internalField.Append(new SignedField<3>(mix.carryTrim)); @@ -1064,7 +1064,7 @@ class MixField: public TransformedField { internalField.Append(new SourceField<8>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); internalField.Append(new SignedField<8>(_weight)); internalField.Append(new SwitchField<8>(mix.swtch, board, version)); - internalField.Append(new UnsignedField<8>(mix.phases)); + internalField.Append(new UnsignedField<8>(mix.flightModes)); internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); internalField.Append(new SignedField<3>(mix.carryTrim)); internalField.Append(new UnsignedField<2>(mix.mixWarn)); @@ -1085,7 +1085,7 @@ class MixField: public TransformedField { internalField.Append(new SignedField<8>(_weight)); internalField.Append(new SwitchField<6>(mix.swtch, board, version)); internalField.Append(new UnsignedField<2>((unsigned int &)mix.mltpx)); - internalField.Append(new UnsignedField<5>(mix.phases)); + internalField.Append(new UnsignedField<5>(mix.flightModes)); internalField.Append(new SignedField<3>(mix.carryTrim)); internalField.Append(new SourceField<6>(mix.srcRaw, board, version, FLAG_NOTELEMETRY)); internalField.Append(new UnsignedField<2>(mix.mixWarn)); @@ -1214,7 +1214,7 @@ class InputField: public TransformedField { internalField.Append(new UnsignedField<14>(expo.scale, "Scale")); internalField.Append(new UnsignedField<8>(expo.chn, "Channel")); internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<16>(expo.phases)); + internalField.Append(new UnsignedField<16>(expo.flightModes)); internalField.Append(new SignedField<8>(_weight, "Weight")); internalField.Append(new SignedField<6>(expo.carryTrim, "CarryTrim")); internalField.Append(new UnsignedField<2>(expo.mode, "Mode")); @@ -1226,7 +1226,7 @@ class InputField: public TransformedField { internalField.Append(new UnsignedField<2>(expo.mode, "Mode")); internalField.Append(new UnsignedField<3>(expo.chn, "Channel")); internalField.Append(new BoolField<2>(_curveMode)); - internalField.Append(new UnsignedField<9>(expo.phases, "Phases")); + internalField.Append(new UnsignedField<9>(expo.flightModes, "Phases")); internalField.Append(new SwitchField<8>(expo.swtch, board, version)); internalField.Append(new SignedField<8>(_weight, "Weight")); internalField.Append(new ZCharField<6>(expo.name)); @@ -1237,7 +1237,7 @@ class InputField: public TransformedField { internalField.Append(new UnsignedField<16>(expo.scale, "Scale")); internalField.Append(new UnsignedField<8>(expo.chn, "Channel")); internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<16>(expo.phases)); + internalField.Append(new UnsignedField<16>(expo.flightModes)); internalField.Append(new SignedField<8>(_weight, "Weight")); internalField.Append(new SignedField<6>(expo.carryTrim, "CarryTrim")); internalField.Append(new UnsignedField<2>(expo.mode, "Mode")); @@ -1251,7 +1251,7 @@ class InputField: public TransformedField { internalField.Append(new UnsignedField<4>(expo.chn, "Channel")); internalField.Append(new BoolField<2>(_curveMode)); internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<16>(expo.phases, "Phases")); + internalField.Append(new UnsignedField<16>(expo.flightModes, "Phases")); internalField.Append(new SignedField<8>(_weight, "Weight")); internalField.Append(new ZCharField<6>(expo.name)); internalField.Append(new SignedField<8>(_curveParam)); @@ -1260,7 +1260,7 @@ class InputField: public TransformedField { internalField.Append(new UnsignedField<8>(expo.mode, "Mode")); internalField.Append(new UnsignedField<8>(expo.chn, "Channel")); internalField.Append(new SwitchField<8>(expo.swtch, board, version)); - internalField.Append(new UnsignedField<16>(expo.phases, "Phases")); + internalField.Append(new UnsignedField<16>(expo.flightModes, "Phases")); internalField.Append(new SignedField<8>(_weight, "Weight")); internalField.Append(new BoolField<8>(_curveMode)); if (HAS_LARGE_LCD(board)) { @@ -1277,7 +1277,7 @@ class InputField: public TransformedField { internalField.Append(new UnsignedField<2>(expo.chn)); internalField.Append(new BoolField<1>(_curveMode)); internalField.Append(new SpareBitsField<3>()); - internalField.Append(new UnsignedField<8>(expo.phases)); + internalField.Append(new UnsignedField<8>(expo.flightModes)); internalField.Append(new SwitchField<8>(expo.swtch, board, version)); internalField.Append(new SignedField<8>(_weight)); internalField.Append(new SignedField<8>(_curveParam)); @@ -1286,7 +1286,7 @@ class InputField: public TransformedField { internalField.Append(new UnsignedField<2>(expo.mode)); internalField.Append(new SwitchField<6>(expo.swtch, board, version)); internalField.Append(new UnsignedField<2>(expo.chn)); - internalField.Append(new UnsignedField<5>(expo.phases)); + internalField.Append(new UnsignedField<5>(expo.flightModes)); internalField.Append(new BoolField<1>(_curveMode)); internalField.Append(new SignedField<8>(_weight)); internalField.Append(new SignedField<8>(_curveParam)); @@ -3208,7 +3208,7 @@ void OpenTxModelData::afterImport() for (unsigned int i=0; imode == INPUT_MODE_BOTH && expo->chn == i && expo->phases == 0 && expo->swtch.type == SWITCH_TYPE_NONE) + if (expo->mode == INPUT_MODE_BOTH && expo->chn == i && expo->flightModes == 0 && expo->swtch.type == SWITCH_TYPE_NONE) break; if (expo->mode == 0 || expo->chn > i) { ExpoData * newExpo = modelData.insertInput(j); diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 0a3e41450..ab189fcd6 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -414,7 +414,7 @@ int OpenTxEepromInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t } for (int i=0; i(i, radioData.models[i], version, variant); if (!result) { return 0; @@ -441,18 +441,18 @@ int OpenTxEepromInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t return size; } -int OpenTxEepromInterface::getSize(ModelData &model) +int OpenTxEepromInterface::getSize(const ModelData & model) { if (IS_SKY9X(board)) return 0; - if (model.isempty()) + if (model.isEmpty()) return 0; QByteArray tmp(EESIZE_MAX, 0); efile->EeFsCreate((uint8_t *)tmp.data(), EESIZE_MAX, board, 255/*version max*/); - OpenTxModelData open9xModel(model, board, 255/*version max*/, GetCurrentFirmware()->getVariantNumber()); + OpenTxModelData open9xModel((ModelData &)model, board, 255/*version max*/, GetCurrentFirmware()->getVariantNumber()); QByteArray eeprom; open9xModel.Export(eeprom); @@ -463,7 +463,7 @@ int OpenTxEepromInterface::getSize(ModelData &model) return efile->size(0); } -int OpenTxEepromInterface::getSize(GeneralSettings &settings) +int OpenTxEepromInterface::getSize(const GeneralSettings & settings) { if (IS_SKY9X(board)) return 0; @@ -471,7 +471,7 @@ int OpenTxEepromInterface::getSize(GeneralSettings &settings) QByteArray tmp(EESIZE_MAX, 0); efile->EeFsCreate((uint8_t *)tmp.data(), EESIZE_MAX, board, 255); - OpenTxGeneralData open9xGeneral(settings, board, 255, GetCurrentFirmware()->getVariantNumber()); + OpenTxGeneralData open9xGeneral((GeneralSettings &)settings, board, 255, GetCurrentFirmware()->getVariantNumber()); // open9xGeneral.Dump(); QByteArray eeprom; diff --git a/companion/src/firmwares/opentx/opentxinterface.h b/companion/src/firmwares/opentx/opentxinterface.h index 8938eadb9..8194d703c 100644 --- a/companion/src/firmwares/opentx/opentxinterface.h +++ b/companion/src/firmwares/opentx/opentxinterface.h @@ -41,9 +41,9 @@ class OpenTxEepromInterface : public EEPROMInterface virtual int save(uint8_t *eeprom, RadioData &radioData, uint32_t variant=0, uint8_t version=0); - virtual int getSize(ModelData &); + virtual int getSize(const ModelData &); - virtual int getSize(GeneralSettings &); + virtual int getSize(const GeneralSettings &); virtual int isAvailable(Protocol proto, int port=0); diff --git a/companion/src/firmwares/th9x/th9xinterface.cpp b/companion/src/firmwares/th9x/th9xinterface.cpp index f86aa9db1..37a91a5c8 100644 --- a/companion/src/firmwares/th9x/th9xinterface.cpp +++ b/companion/src/firmwares/th9x/th9xinterface.cpp @@ -130,12 +130,12 @@ int Th9xInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t variant, return 0; } -int Th9xInterface::getSize(ModelData &model) +int Th9xInterface::getSize(const ModelData & model) { return 0; } -int Th9xInterface::getSize(GeneralSettings &settings) +int Th9xInterface::getSize(const GeneralSettings & settings) { return 0; } diff --git a/companion/src/firmwares/th9x/th9xinterface.h b/companion/src/firmwares/th9x/th9xinterface.h index 3b917e43c..e65f93bfc 100644 --- a/companion/src/firmwares/th9x/th9xinterface.h +++ b/companion/src/firmwares/th9x/th9xinterface.h @@ -42,9 +42,9 @@ class Th9xInterface : public EEPROMInterface virtual int save(uint8_t *eeprom, RadioData &radioData, uint32_t variant=0, uint8_t version=0); - virtual int getSize(ModelData &); + virtual int getSize(const ModelData &); - virtual int getSize(GeneralSettings &); + virtual int getSize(const GeneralSettings &); virtual int isAvailable(Protocol proto, int port=0); diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index 8f21eed52..c396f13b4 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -47,24 +47,6 @@ const QColor colors[C9X_MAX_CURVES] = { QColor(255,127,0), }; -QString getPhaseName(int val, const char * phasename) -{ - if (!val) return "---"; - if (!phasename) { - return QString(val < 0 ? "!" : "") + QObject::tr("FM%1").arg(abs(val) - 1); - } - else { - QString phaseName; - phaseName.append(phasename); - if (phaseName.isEmpty()) { - return QString(val < 0 ? "!" : "") + QObject::tr("FM%1").arg(abs(val) - 1); - } - else { - return QString(val < 0 ? "!" : "") + phaseName; - } - } -} - void populateGvSourceCB(QComboBox *b, int value) { QString strings[] = { QObject::tr("---"), QObject::tr("Rud Trim"), QObject::tr("Ele Trim"), QObject::tr("Thr Trim"), QObject::tr("Ail Trim"), QObject::tr("Rot Enc"), QObject::tr("Rud"), QObject::tr("Ele"), QObject::tr("Thr"), QObject::tr("Ail"), QObject::tr("P1"), QObject::tr("P2"), QObject::tr("P3")}; @@ -106,20 +88,6 @@ void getFileComboBoxValue(QComboBox * b, char * dest, int length) } } -QString getProtocolStr(const int proto) -{ - static const char *strings[] = { "OFF", - "PPM", - "Silverlit A", "Silverlit B", "Silverlit C", - "CTP1009", - "LP45", "DSM2", "DSMX", - "PPM16", "PPMsim", - "FrSky XJT - D16", "FrSky XJT - D8", "FrSky XJT - LR12", "FrSky DJT", - }; - - return CHECK_IN_ARRAY(strings, proto); -} - void populatePhasesCB(QComboBox *b, int value) { for (int i=-GetCurrentFirmware()->getCapability(FlightModes); i<=GetCurrentFirmware()->getCapability(FlightModes); i++) { @@ -772,106 +740,6 @@ QString getFrSkySrc(int index) return RawSource(SOURCE_TYPE_TELEMETRY, index-1).toString(); } -QString getTrimInc(ModelData * g_model) -{ - switch (g_model->trimInc) { - case -2: - return QObject::tr("Exponential"); - case -1: - return QObject::tr("Extra Fine"); - case 0: - return QObject::tr("Fine"); - case 1: - return QObject::tr("Medium"); - case 2: - return QObject::tr("Coarse"); - default: - return QObject::tr("Unknown"); - } -} - -QString getTimerStr(TimerData & timer) -{ - QString result = QObject::tr("%1:%2").arg(timer.val/60, 2, 10, QChar('0')).arg(timer.val%60, 2, 10, QChar('0')); - result += QString(", ") + timer.mode.toString(); - if (timer.persistent) - result += QObject::tr(", Persistent"); - if (timer.minuteBeep) - result += QObject::tr(", MinuteBeep"); - if (timer.countdownBeep == 1) - result += QObject::tr(", CountDown(Beeps)"); - else if (timer.countdownBeep == 2) - result += QObject::tr(", CountDown(Voice)"); - return result; -} - -QString getProtocol(ModuleData & module) -{ - QString str = getProtocolStr(module.protocol); - - if (module.protocol == PPM) - str.append(QObject::tr(": Channel start: %1, %2 Channels, %3usec Delay, Pulse polarity %4").arg(module.channelsStart+1).arg(module.channelsCount).arg(module.ppmDelay).arg(module.polarityToString())); - else - str.append(QObject::tr(": Channel start: %1, %2 Channels").arg(module.channelsStart+1).arg(module.channelsCount)); - return str; -} - -QString getTrainerMode(const int trainermode, ModuleData & module) -{ - QString result; - switch (trainermode) { - case 1: - result=QObject::tr("Slave/Jack")+QObject::tr(": Channel start: %1, %2 Channels, %3usec Delay, Pulse polarity %4").arg(module.channelsStart+1).arg(module.channelsCount).arg(module.ppmDelay).arg(module.polarityToString()); - break; - case 2: - result=QObject::tr("Master/SBUS Module"); - break; - case 3: - result=QObject::tr("Master/CPPM Module"); - break; - case 4: - result=QObject::tr("Master/SBUS in battery compartment"); - break; - default: - result=QObject::tr("Master/Jack"); - } - return result; -} - -QString getCenterBeepStr(ModelData * g_model) -{ - QStringList strl; - if (g_model->beepANACenter & 0x01) - strl << QObject::tr("Rudder"); - if (g_model->beepANACenter & 0x02) - strl << QObject::tr("Elevator"); - if (g_model->beepANACenter & 0x04) - strl << QObject::tr("Throttle"); - if (g_model->beepANACenter & 0x08) - strl << QObject::tr("Aileron"); - if (IS_TARANIS(GetCurrentFirmware()->getBoard())) { - if (g_model->beepANACenter & 0x10) - strl << "S1"; - if (g_model->beepANACenter & 0x20) - strl << "S2"; - if (g_model->beepANACenter & 0x40) - strl << "S3"; - if (g_model->beepANACenter & 0x80) - strl << "LS"; - if (g_model->beepANACenter & 0x100) - strl << "RS"; - } - else { - if (g_model->beepANACenter & 0x10) - strl << "P1"; - if (g_model->beepANACenter & 0x20) - strl << "P2"; - if (g_model->beepANACenter & 0x40) - strl << "P3"; - } - return strl.join(", "); -} - QString getTheme() { int theme_set = g.theme(); @@ -1018,7 +886,7 @@ int qunlink(const QString & fileName) return unlink(ba.constData()); } -QString generateProcessUniqueTempFileName(const QString &fileName) +QString generateProcessUniqueTempFileName(const QString & fileName) { QString sanitizedFileName = fileName; sanitizedFileName.remove('/'); diff --git a/companion/src/helpers.h b/companion/src/helpers.h index a8b90fdc4..2740802b8 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -100,7 +100,6 @@ void populateSwitchCB(QComboBox *b, const RawSwitch & value, const GeneralSettin void populatePhasesCB(QComboBox *b, int value); void populateGvarUseCB(QComboBox *b, unsigned int phase); -QString getProtocolStr(const int proto); #define POPULATE_NONE (1<<0) #define POPULATE_SOURCES (1<<1) @@ -118,16 +117,9 @@ QString getProtocolStr(const int proto); // void populateGVarCB(QComboBox *b, int value, int min, int max,int pgvars=5); //TODO: Clean Up void populateGVCB(QComboBox *b, int value); void populateSourceCB(QComboBox *b, const RawSource &source, const GeneralSettings generalSettings, const ModelData * model, unsigned int flags); -QString getPhaseName(int val, const char * phasename=NULL); QString image2qstring(QImage image); int findmult(float value, float base); -QString getTrimInc(ModelData * g_model); -QString getTimerStr(TimerData & timer); -QString getProtocol(ModuleData & module); -QString getTrainerMode(const int trainermode, ModuleData & module); -QString getCenterBeepStr(ModelData * g_model); - /* FrSky helpers */ QString getFrSkyAlarmType(int alarm); QString getFrSkyUnits(int units); diff --git a/companion/src/mdichild.cpp b/companion/src/mdichild.cpp index 125343c72..84d4d2cf4 100644 --- a/companion/src/mdichild.cpp +++ b/companion/src/mdichild.cpp @@ -155,7 +155,7 @@ void MdiChild::on_SimulateTxButton_clicked() void MdiChild::checkAndInitModel(int row) { ModelData &model = radioData.models[row - 1]; - if (model.isempty()) { + if (model.isEmpty()) { model.setDefaultValues(row - 1, radioData.generalSettings); setModified(); } @@ -209,7 +209,7 @@ void MdiChild::openEditWindow() } else{ ModelData &model = radioData.models[row - 1]; - if (model.isempty() && g.useWizard()) { + if (model.isEmpty() && g.useWizard()) { wizardEdit(); } else { @@ -539,10 +539,10 @@ void MdiChild::print(int model, QString filename) PrintDialog * pd = NULL; if (model>=0 && !filename.isEmpty()) { - pd = new PrintDialog(this, GetCurrentFirmware()/*firmware*/, &radioData.generalSettings, &radioData.models[model], filename); + pd = new PrintDialog(this, GetCurrentFirmware()/*firmware*/, radioData.generalSettings, radioData.models[model], filename); } else if (getCurrentRow() > 0) { - pd = new PrintDialog(this, GetCurrentFirmware()/*firmware*/, &radioData.generalSettings, &radioData.models[getCurrentRow()-1]); + pd = new PrintDialog(this, GetCurrentFirmware()/*firmware*/, radioData.generalSettings, radioData.models[getCurrentRow()-1]); } if (pd) { diff --git a/companion/src/modeledit/expodialog.cpp b/companion/src/modeledit/expodialog.cpp index b629ff16d..8f757163d 100644 --- a/companion/src/modeledit/expodialog.cpp +++ b/companion/src/modeledit/expodialog.cpp @@ -11,7 +11,7 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G firmware(firmware), ed(expoData), inputName(inputName), - modelPrinter(firmware, &generalSettings, &model) + modelPrinter(firmware, generalSettings, model) { ui->setupUi(this); QLabel * lb_fp[] = {ui->lb_FP0,ui->lb_FP1,ui->lb_FP2,ui->lb_FP3,ui->lb_FP4,ui->lb_FP5,ui->lb_FP6,ui->lb_FP7,ui->lb_FP8 }; @@ -49,7 +49,7 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G else { int mask=1; for (int i=0; i<9 ; i++) { - if ((ed->phases & mask)==0) { + if ((ed->flightModes & mask)==0) { cb_fp[i]->setChecked(true); } mask <<= 1; @@ -157,18 +157,18 @@ void ExpoDialog::valuesChanged() if (firmware->getCapability(VirtualInputs)) inputName = ui->inputName->text(); - ed->phases=0; + ed->flightModes=0; for (int i=8; i>=0 ; i--) { if (!cb_fp[i]->checkState()) { - ed->phases+=1; + ed->flightModes+=1; } - ed->phases<<=1; + ed->flightModes<<=1; } - ed->phases>>=1; + ed->flightModes>>=1; if (firmware->getCapability(FlightModes)) { int zeros=0; int ones=0; - int phtemp=ed->phases; + int phtemp=ed->flightModes; for (int i=0; igetCapability(FlightModes); i++) { if (phtemp & 1) { ones++; @@ -179,7 +179,7 @@ void ExpoDialog::valuesChanged() phtemp >>=1; } if (zeros==1) { - phtemp=ed->phases; + phtemp=ed->flightModes; for (int i=0; igetCapability(FlightModes); i++) { if ((phtemp & 1)==0) { break; @@ -188,7 +188,7 @@ void ExpoDialog::valuesChanged() } } else if (ones==1) { - phtemp=ed->phases; + phtemp=ed->flightModes; for (int i=0; igetCapability(FlightModes); i++) { if (phtemp & 1) { break; @@ -198,7 +198,7 @@ void ExpoDialog::valuesChanged() } } else { - ed->phases=0; + ed->flightModes=0; } } diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index c9550ab60..a5bced74a 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -6,7 +6,7 @@ InputsPanel::InputsPanel(QWidget *parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): ModelPanel(parent, model, generalSettings, firmware), expoInserted(false), - modelPrinter(firmware, &generalSettings, &model) + modelPrinter(firmware, generalSettings, model) { inputsCount = firmware->getCapability(VirtualInputs); if (inputsCount == 0) @@ -140,14 +140,14 @@ QString InputsPanel::getInputText(int dest, bool * new_ch) if (new_ch) *new_ch = 1; } else { - ExpoData *md = &model->expoData[dest]; + ExpoData & input = model->expoData[dest]; - if ((dest == 0) || (model->expoData[dest-1].chn != md->chn)) { + if ((dest == 0) || (model->expoData[dest-1].chn != input.chn)) { if (new_ch) *new_ch = 1; if (firmware->getCapability(VirtualInputs)) - str += QString("%1").arg(modelPrinter.printInputName(md->chn), -10, ' '); + str += QString("%1").arg(modelPrinter.printInputName(input.chn), -10, ' '); else - str = modelPrinter.printInputName(md->chn); + str = modelPrinter.printInputName(input.chn); } else { if (firmware->getCapability(VirtualInputs)) @@ -156,7 +156,7 @@ QString InputsPanel::getInputText(int dest, bool * new_ch) str = " "; } str.replace(" ", " "); - str += modelPrinter.printInputLine(md); + str += modelPrinter.printInputLine(input); } return str; } diff --git a/companion/src/modeledit/mixerdialog.cpp b/companion/src/modeledit/mixerdialog.cpp index b4191d9ca..d32abd948 100644 --- a/companion/src/modeledit/mixerdialog.cpp +++ b/companion/src/modeledit/mixerdialog.cpp @@ -65,7 +65,7 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData *mixdata, G else { int mask=1; for (int i=0; i<9 ; i++) { - if ((md->phases & mask)==0) { + if ((md->flightModes & mask)==0) { cb_fp[i]->setChecked(true); } mask <<= 1; @@ -164,14 +164,14 @@ void MixerDialog::valuesChanged() md->name[i]=ui->mixerName->text().toAscii().at(i); } md->name[i]=0; - md->phases=0; + md->flightModes=0; for (int i=8; i>=0 ; i--) { if (!cb_fp[i]->checkState()) { - md->phases+=1; + md->flightModes+=1; } - md->phases<<=1; + md->flightModes<<=1; } - md->phases>>=1; + md->flightModes>>=1; lock = false; } diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index b368fabdb..0ae049ad2 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -7,7 +7,7 @@ MixesPanel::MixesPanel(QWidget *parent, ModelData & model, GeneralSettings & gen ModelPanel(parent, model, generalSettings, firmware), mixInserted(false), highlightedSource(0), - modelPrinter(firmware, &generalSettings, &model) + modelPrinter(firmware, generalSettings, model) { QGridLayout * mixesLayout = new QGridLayout(this); @@ -56,11 +56,11 @@ void MixesPanel::update() unsigned int outputs = firmware->getCapability(Outputs); for (i=0; igetCapability(Mixes); i++) { - MixData *md = &model->mixData[i]; - // qDebug() << "md->destCh: " << md->destCh; - if (md->destCh==0 || md->destCh>outputs) continue; + MixData & mix = model->mixData[i]; + // qDebug() << "mix.destCh: " << mix.destCh; + if (mix.destCh==0 || mix.destCh>outputs) continue; QString str = ""; - while (curDest < md->destCh-1) { + while (curDest < mix.destCh-1) { curDest++; AddMixerLine(-curDest); } @@ -133,14 +133,14 @@ QString MixesPanel::getMixerText(int dest, bool * new_ch) if (new_ch) *new_ch = 1; } else { - MixData *md = &model->mixData[dest]; - //md->destCh from 1 to 32 - str = modelPrinter.printMixerName(md->destCh); + MixData & mix = model->mixData[dest]; + //mix->destCh from 1 to 32 + str = modelPrinter.printMixerName(mix.destCh); - if ((dest == 0) || (model->mixData[dest-1].destCh != md->destCh)) { + if ((dest == 0) || (model->mixData[dest-1].destCh != mix.destCh)) { if (new_ch) *new_ch = 1; //highlight channel if needed - if (md->destCh == highlightedSource) { + if (mix.destCh == highlightedSource) { str = "" + str + ""; } } @@ -148,7 +148,7 @@ QString MixesPanel::getMixerText(int dest, bool * new_ch) str.fill(' '); } - str += modelPrinter.printMixerLine(md, highlightedSource); + str += modelPrinter.printMixerLine(mix, highlightedSource); } return str.replace(" ", " "); } @@ -303,10 +303,11 @@ void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) int idx; // mixer index int dch; - if(destIdx<0) { + if (destIdx < 0) { dch = -destIdx; idx = getMixerIndex(dch) - 1; //get mixer index to insert - } else { + } + else { idx = destIdx; dch = model->mixData[idx].destCh; } @@ -314,14 +315,14 @@ void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) QByteArray mxData = mimeData->data("application/x-companion-mix"); int i = 0; - while(igetCapability(Mixes)) break; + if (idx == firmware->getCapability(Mixes)) break; if (!gm_insertMix(idx)) break; - MixData *md = &model->mixData[idx]; - memcpy(md,mxData.mid(i,sizeof(MixData)).constData(),sizeof(MixData)); + MixData * md = &model->mixData[idx]; + memcpy(md, mxData.mid(i, sizeof(MixData)).constData(), sizeof(MixData)); md->destCh = dch; i += sizeof(MixData); } diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 8f782de87..f01bf6aca 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -4,6 +4,7 @@ #include "ui_setup_module.h" #include "helpers.h" #include "appdata.h" +#include "modelprinter.h" TimerPanel::TimerPanel(QWidget *parent, ModelData & model, TimerData & timer, GeneralSettings & generalSettings, Firmware * firmware, QWidget *prevFocus): ModelPanel(parent, model, generalSettings, firmware), @@ -35,10 +36,11 @@ TimerPanel::TimerPanel(QWidget *parent, ModelData & model, TimerData & timer, Ge } ui->countdownBeep->setField(timer.countdownBeep, this); - ui->countdownBeep->addItem(tr("Silent"), 0); - ui->countdownBeep->addItem(tr("Beeps"), 1); + ui->countdownBeep->addItem(tr("Silent"), TimerData::COUNTDOWN_SILENT); + ui->countdownBeep->addItem(tr("Beeps"), TimerData::COUNTDOWN_BEEPS); if (IS_ARM(board) || IS_2560(board)) { - ui->countdownBeep->addItem(tr("Voice"), 2); + ui->countdownBeep->addItem(tr("Voice"), TimerData::COUNTDOWN_VOICE); + ui->countdownBeep->addItem(tr("Haptic"), TimerData::COUNTDOWN_HAPTIC); } ui->persistent->setField(timer.persistent, this); @@ -167,7 +169,7 @@ ModulePanel::ModulePanel(QWidget *parent, ModelData & model, ModuleData & module // The protocols available on this board for (int i=0; iisAvailable((Protocol)i, moduleIdx)) { - ui->protocol->addItem(getProtocolStr(i), (QVariant)i); + ui->protocol->addItem(ModelPrinter::printModuleProtocol(i), (QVariant)i); if (i == module.protocol) ui->protocol->setCurrentIndex(ui->protocol->count()-1); } } @@ -756,7 +758,7 @@ void SetupPanel::populateThrottleSourceCB() int channels = (IS_ARM(GetEepromInterface()->getBoard()) ? 32 : 16); for (int i=0; ithrottleSource->addItem(QObject::tr("CH%1").arg(i+1, 2, 10, QChar('0')), THROTTLE_SOURCE_FIRST_CHANNEL+i); + ui->throttleSource->addItem(ModelPrinter::printChannelName(i), THROTTLE_SOURCE_FIRST_CHANNEL+i); if (model->thrTraceSrc == unsigned(THROTTLE_SOURCE_FIRST_CHANNEL+i)) ui->throttleSource->setCurrentIndex(ui->throttleSource->count()-1); } diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index 8c3c2770b..e715c679b 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -29,20 +29,10 @@ TelemetryAnalog::TelemetryAnalog(QWidget *parent, FrSkyChannelData & analog, Mod update(); ui->UnitCB->setCurrentIndex(analog.type); - if (!IS_TARANIS(firmware->getBoard())) { - ui->alarm1LevelCB->setCurrentIndex(analog.alarms[0].level); - ui->alarm1GreaterCB->setCurrentIndex(analog.alarms[0].greater); - ui->alarm2LevelCB->setCurrentIndex(analog.alarms[1].level); - ui->alarm2GreaterCB->setCurrentIndex(analog.alarms[1].greater); - } - else { - ui->alarm1LevelCB->hide(); - ui->alarm2LevelCB->hide(); - ui->alarm1GreaterCB->hide(); - ui->alarm2GreaterCB->hide(); - ui->alarm1Label->setText(tr("Low Alarm")); - ui->alarm2Label->setText(tr("Critical Alarm")); - } + ui->alarm1LevelCB->setCurrentIndex(analog.alarms[0].level); + ui->alarm1GreaterCB->setCurrentIndex(analog.alarms[0].greater); + ui->alarm2LevelCB->setCurrentIndex(analog.alarms[1].level); + ui->alarm2GreaterCB->setCurrentIndex(analog.alarms[1].greater); if (!(firmware->getCapability(Telemetry) & TM_HASOFFSET)) { ui->CalibSB->hide(); diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 6d9285810..13c9cc956 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -1,5 +1,6 @@ #include "helpers.h" #include "modelprinter.h" +#include QString changeColor(const QString & input, const QString & to, const QString & from) { @@ -7,13 +8,19 @@ QString changeColor(const QString & input, const QString & to, const QString & f return result.replace("color="+from, "color="+to); } -ModelPrinter::ModelPrinter(Firmware * firmware, - GeneralSettings *gg, ModelData *gm) : +ModelPrinter::ModelPrinter(Firmware * firmware, const GeneralSettings & generalSettings, const ModelData & model): firmware(firmware), - g_eeGeneral(gg), - g_model(gm) + generalSettings(generalSettings), + model(model) { -} +} + +ModelPrinter::~ModelPrinter() +{ + foreach(QString filename, curvefiles) { + qunlink(filename); + } +} void debugHtml(const QString & html) { @@ -40,67 +47,257 @@ QString addFont(const QString & input, const QString & color, const QString & si return "" + input + ""; } -QString ModelPrinter::printInputName(int idx) +QString ModelPrinter::printEEpromSize() +{ + return tr("%1 bytes").arg(GetEepromInterface()->getSize(model)); +} + +QString ModelPrinter::printChannelName(int idx) +{ + return tr("CH%1").arg(idx+1, 2, 10, QChar('0')); +} + +QString ModelPrinter::printOutputName(int idx) +{ + QString name = QString(model.limitData[idx].name).trimmed(); + if (firmware->getCapability(HasChNames) && !name.isEmpty()) { + return name; + } + else { + return printChannelName(idx); + } +} + +QString ModelPrinter::printTrimIncrementMode() +{ + switch (model.trimInc) { + case -2: + return tr("Exponential"); + case -1: + return tr("Extra Fine"); + case 0: + return tr("Fine"); + case 1: + return tr("Medium"); + case 2: + return tr("Coarse"); + default: + return tr("Unknown"); + } +} + +QString ModelPrinter::printThrottleTrimMode() +{ + return model.thrTrim ? tr("Enabled") : tr("Disabled"); +} + +QString ModelPrinter::printModuleProtocol(unsigned int protocol) +{ + static const char *strings[] = { "OFF", + "PPM", + "Silverlit A", "Silverlit B", "Silverlit C", + "CTP1009", + "LP45", "DSM2", "DSMX", + "PPM16", "PPMsim", + "FrSky XJT (D16)", "FrSky XJT (D8)", "FrSky XJT (LR12)", "FrSky DJT", + }; + + return CHECK_IN_ARRAY(strings, protocol); +} + +QString ModelPrinter::printModule(int idx) +{ + const ModuleData & module = model.moduleData[idx]; + if (module.protocol == OFF) + return printModuleProtocol(module.protocol); + else if (module.protocol == PPM) + return tr("%1, Channels(%2-%3), PPM delay(%4usec), Pulse polarity(%5)").arg(printModuleProtocol(module.protocol)).arg(module.channelsStart+1).arg(module.channelsStart+module.channelsCount).arg(module.ppmDelay).arg(module.polarityToString()); + else + return tr("%1, Channels(%2-%3)").arg(printModuleProtocol(module.protocol)).arg(module.channelsStart+1).arg(module.channelsStart+module.channelsCount); +} + +QString ModelPrinter::printTrainerMode() { QString result; - if (GetCurrentFirmware()->getCapability(VirtualInputs)) { - if (strlen(g_model->inputNames[idx]) > 0) { - result = QObject::tr("[I%1]").arg(idx+1); - result += QString(g_model->inputNames[idx]); + switch (model.trainerMode) { + case 1: + result = tr("Slave/Jack"); // TODO + tr(": Channel start: %1, %2 Channels, %3usec Delay, Pulse polarity %4").arg(module.channelsStart+1).arg(module.channelsCount).arg(module.ppmDelay).arg(module.polarityToString()); + break; + case 2: + result = tr("Master/SBUS Module"); + break; + case 3: + result = tr("Master/CPPM Module"); + break; + case 4: + result = tr("Master/SBUS in battery compartment"); + break; + default: + result = tr("Master/Jack"); + } + return result; +} + +QString ModelPrinter::printCenterBeep() +{ + QStringList strl; + if (model.beepANACenter & 0x01) + strl << tr("Rudder"); + if (model.beepANACenter & 0x02) + strl << tr("Elevator"); + if (model.beepANACenter & 0x04) + strl << tr("Throttle"); + if (model.beepANACenter & 0x08) + strl << tr("Aileron"); + if (IS_TARANIS(firmware->getBoard())) { + if (model.beepANACenter & 0x10) + strl << "S1"; + if (model.beepANACenter & 0x20) + strl << "S2"; + if (model.beepANACenter & 0x40) + strl << "S3"; + if (model.beepANACenter & 0x80) + strl << "LS"; + if (model.beepANACenter & 0x100) + strl << "RS"; + } + else { + if (model.beepANACenter & 0x10) + strl << "P1"; + if (model.beepANACenter & 0x20) + strl << "P2"; + if (model.beepANACenter & 0x40) + strl << "P3"; + } + return strl.join(", "); +} + +QString ModelPrinter::printTimer(int idx) +{ + return printTimer(model.timers[idx]); +} + +QString ModelPrinter::printTimer(const TimerData & timer) +{ + QStringList result; + if (firmware->getCapability(TimersName)) + result += tr("Name(%1)").arg(timer.name); + result += tr("%1:%2").arg(timer.val/60, 2, 10, QChar('0')).arg(timer.val%60, 2, 10, QChar('0')); + result += timer.mode.toString(); + if (timer.persistent) + result += tr("Persistent"); + if (timer.minuteBeep) + result += tr("MinuteBeep"); + if (timer.countdownBeep == TimerData::COUNTDOWN_BEEPS) + result += tr("CountDown(Beeps)"); + else if (timer.countdownBeep == TimerData::COUNTDOWN_VOICE) + result += tr("CountDown(Voice)"); + else if (timer.countdownBeep == TimerData::COUNTDOWN_HAPTIC) + result += tr("CountDown(Haptic)"); + return result.join(", "); +} + +QString ModelPrinter::printTrim(int flightModeIndex, int stickIndex) +{ + const FlightModeData & fm = model.flightModeData[flightModeIndex]; + + if (fm.trimRef[stickIndex] == -1) + return QString("%1").arg(fm.trim[stickIndex]); + else + return tr("FM%1").arg(fm.trimRef[stickIndex]); +} + +QString ModelPrinter::printGlobalVar(int flightModeIndex, int gvarIndex) +{ + const FlightModeData & fm = model.flightModeData[flightModeIndex]; + + if (fm.gvars[gvarIndex] <= 1024) { + return QString("%1").arg(fm.gvars[gvarIndex]); + } + else { + int num = fm.gvars[gvarIndex] - 1025; + if (num >= flightModeIndex) num++; + return tr("FM%1").arg(num); + } +} + +QString ModelPrinter::printRotaryEncoder(int flightModeIndex, int reIndex) +{ + const FlightModeData & fm = model.flightModeData[flightModeIndex]; + + if (fm.rotaryEncoders[reIndex] <= 1024) { + return QString("%1").arg(fm.rotaryEncoders[reIndex]); + } + else { + int num = fm.rotaryEncoders[reIndex] - 1025; + if (num >= flightModeIndex) num++; + return tr("FM%1").arg(num); + } +} + +QString ModelPrinter::printInputName(int idx) +{ + QString result; + if (firmware->getCapability(VirtualInputs)) { + if (strlen(model.inputNames[idx]) > 0) { + result = tr("[I%1]").arg(idx+1); + result += QString(model.inputNames[idx]); } else { - result = QObject::tr("Input%1").arg(idx+1, 2, 10, QChar('0')); + result = tr("Input%1").arg(idx+1, 2, 10, QChar('0')); } } else { - result = RawSource(SOURCE_TYPE_STICK, idx).toString(g_model); + result = RawSource(SOURCE_TYPE_STICK, idx).toString(&model); } return Qt::escape(result); } -QString ModelPrinter::printInputLine(const ExpoData * ed) +QString ModelPrinter::printInputLine(int idx) +{ + return printInputLine(model.expoData[idx]); +} + +QString ModelPrinter::printInputLine(const ExpoData & input) { QString str = " "; - switch (ed->mode) { + switch (input.mode) { case (1): str += "<- "; break; case (2): str += "-> "; break; default: str += "   "; break; } if (firmware->getCapability(VirtualInputs)) { - str += Qt::escape(ed->srcRaw.toString(g_model)); + str += Qt::escape(input.srcRaw.toString(&model)); } - str += " " + Qt::escape(QObject::tr("Weight")) + QString("(%1)").arg(getGVarString(ed->weight,true)); - if (ed->curve.value) str += " " + Qt::escape(ed->curve.toString()); + str += " " + Qt::escape(tr("Weight")) + QString("(%1)").arg(getGVarString(input.weight,true)); + if (input.curve.value) str += " " + Qt::escape(input.curve.toString()); - QString phasesStr = printPhases(ed->phases); - if (!phasesStr.isEmpty()) str += " " + Qt::escape(phasesStr); + QString flightModesStr = printFlightModes(input.flightModes); + if (!flightModesStr.isEmpty()) str += " " + Qt::escape(flightModesStr); - if (ed->swtch.type != SWITCH_TYPE_NONE) - str += " " + Qt::escape(QObject::tr("Switch") + QString("(%1)").arg(ed->swtch.toString())); + if (input.swtch.type != SWITCH_TYPE_NONE) + str += " " + Qt::escape(tr("Switch")) + QString("(%1)").arg(input.swtch.toString()); if (firmware->getCapability(VirtualInputs)) { - if (ed->carryTrim>0) str += " " + Qt::escape(QObject::tr("NoTrim")); - else if (ed->carryTrim<0) str += " " + Qt::escape(RawSource(SOURCE_TYPE_TRIM, (-(ed->carryTrim)-1)).toString(g_model)); + if (input.carryTrim>0) str += " " + Qt::escape(tr("NoTrim")); + else if (input.carryTrim<0) str += " " + Qt::escape(RawSource(SOURCE_TYPE_TRIM, (-(input.carryTrim)-1)).toString(&model)); } - if (firmware->getCapability(HasExpoNames) && ed->name[0]) - str += Qt::escape(QString(" [%1]").arg(ed->name)); + if (firmware->getCapability(HasExpoNames) && input.name[0]) + str += Qt::escape(QString(" [%1]").arg(input.name)); return str; } QString ModelPrinter::printMixerName(int curDest) { - QString str; - str = QObject::tr("CH%1").arg(curDest); - // TODO not nice, Qt brings a function for that, I don't remember right now - (str.length() < 4) ? str.append(" ") : str.append(" "); + QString str = printChannelName(curDest) + " "; if (firmware->getCapability(HasChNames)) { - QString name = g_model->limitData[curDest-1].name; + QString name = model.limitData[curDest-1].name; if (!name.isEmpty()) { name = QString("(") + name + QString(")"); } @@ -110,84 +307,109 @@ QString ModelPrinter::printMixerName(int curDest) return Qt::escape(str); } -QString ModelPrinter::printMixerLine(const MixData * md, int highlightedSource) +QString ModelPrinter::printMixerLine(int idx, int highlightedSource) +{ + return printMixerLine(model.mixData[idx], highlightedSource); +} + +QString ModelPrinter::printMixerLine(const MixData & mix, int highlightedSource) { QString str = " "; - switch(md->mltpx) { + switch(mix.mltpx) { case (1): str += "*"; break; case (2): str += "R"; break; default: str += " "; break; }; // highlight source if needed - QString source = Qt::escape(md->srcRaw.toString(g_model)); - if ( (md->srcRaw.type == SOURCE_TYPE_CH) && (md->srcRaw.index+1 == (int)highlightedSource) ) { + QString source = Qt::escape(mix.srcRaw.toString(&model)); + if ( (mix.srcRaw.type == SOURCE_TYPE_CH) && (mix.srcRaw.index+1 == (int)highlightedSource) ) { source = "" + source + ""; } str += " " + source; - str += " " + Qt::escape(QObject::tr("Weight")) + QString("(%1)").arg(getGVarString(md->weight, true)); + str += " " + Qt::escape(tr("Weight")) + QString("(%1)").arg(getGVarString(mix.weight, true)); - QString phasesStr = printPhases(md->phases); - if (!phasesStr.isEmpty()) str += " " + Qt::escape(phasesStr); + QString flightModesStr = printFlightModes(mix.flightModes); + if (!flightModesStr.isEmpty()) str += " " + Qt::escape(flightModesStr); - if (md->swtch.type != SWITCH_TYPE_NONE) { - str += " " + Qt::escape(QObject::tr("Switch")) + QString("(%1)").arg(md->swtch.toString()); + if (mix.swtch.type != SWITCH_TYPE_NONE) { + str += " " + Qt::escape(tr("Switch")) + QString("(%1)").arg(mix.swtch.toString()); } - if (md->carryTrim>0) str += " " + Qt::escape(QObject::tr("NoTrim")); - else if (md->carryTrim<0) str += " " + RawSource(SOURCE_TYPE_TRIM, (-(md->carryTrim)-1)).toString(g_model); + if (mix.carryTrim>0) str += " " + Qt::escape(tr("NoTrim")); + else if (mix.carryTrim<0) str += " " + RawSource(SOURCE_TYPE_TRIM, (-(mix.carryTrim)-1)).toString(&model); - if (firmware->getCapability(HasNoExpo) && md->noExpo) str += " " + Qt::escape(QObject::tr("No DR/Expo")); - if (md->sOffset) str += " " + Qt::escape(QObject::tr("Offset")) + QString("(%1)").arg(getGVarString(md->sOffset)); - if (md->curve.value) str += " " + Qt::escape(md->curve.toString()); + if (firmware->getCapability(HasNoExpo) && mix.noExpo) str += " " + Qt::escape(tr("No DR/Expo")); + if (mix.sOffset) str += " " + Qt::escape(tr("Offset") + ) + QString("(%1)").arg(getGVarString(mix.sOffset)); + if (mix.curve.value) str += " " + Qt::escape(mix.curve.toString()); int scale = firmware->getCapability(SlowScale); if (scale == 0) scale = 1; - if (md->delayDown || md->delayUp) - str += " " + Qt::escape(QObject::tr("Delay")) + QString("(u%1:d%2)").arg((double)md->delayUp/scale).arg((double)md->delayDown/scale); - if (md->speedDown || md->speedUp) - str += " " + Qt::escape(QObject::tr("Slow")) + QString("(u%1:d%2)").arg((double)md->speedUp/scale).arg((double)md->speedDown/scale); - if (md->mixWarn) - // str += Qt::escape(QObject::tr(" Warn(%1)").arg(md->mixWarn)); - str += " " + Qt::escape(QObject::tr("Warn")) + QString("(%1)").arg(md->mixWarn); - if (firmware->getCapability(HasMixerNames) && md->name[0]) - str += Qt::escape(QString(" [%1]").arg(md->name)); + if (mix.delayDown || mix.delayUp) + str += " " + Qt::escape(tr("Delay")) + QString("(u%1:d%2)").arg((double)mix.delayUp/scale).arg((double)mix.delayDown/scale); + if (mix.speedDown || mix.speedUp) + str += " " + Qt::escape(tr("Slow")) + QString("(u%1:d%2)").arg((double)mix.speedUp/scale).arg((double)mix.speedDown/scale); + if (mix.mixWarn) + str += " " + Qt::escape(tr("Warn(%1)").arg(mix.mixWarn)); + if (firmware->getCapability(HasMixerNames) && mix.name[0]) + str += Qt::escape(QString(" [%1]").arg(mix.name)); return str; } -QString ModelPrinter::printPhases(unsigned int phases) +QString ModelPrinter::printFlightModeSwitch(int index) { - int numphases = GetCurrentFirmware()->getCapability(FlightModes); - - if (numphases && phases) { - QString str; - int count = 0; - if (phases == (unsigned int)(1< 0) str += QString(", "); - str += getPhaseName(i+1, g_model->flightModeData[i].name); - } - } - // } - if (count > 1) - return QObject::tr("Flight modes") + QString("(%1)").arg(str); - else - return QObject::tr("Flight mode") + QString("(%1)").arg(str); + if (index == 0) + return "---"; + else if (index > 0) { + return printFlightModeName(index-1); } - return ""; + else { + return "!" + printFlightModeName(-index-1); + } +} + +QString ModelPrinter::printFlightModeName(int index) +{ + const FlightModeData & fm = model.flightModeData[index]; + if (strlen(fm.name) > 0) { + return tr("FM%1 \"%2\"").arg(index).arg(fm.name); + } + else { + return tr("FM%1").arg(index); + } +} + +QString ModelPrinter::printFlightModes(unsigned int flightModes) +{ + int numFlightModes = firmware->getCapability(FlightModes); + if (numFlightModes && flightModes) { + if (flightModes == (unsigned int)(1< 1) + return tr("Flight modes(%1)").arg(list.join(", ")); + else + return tr("Flight mode(%1)").arg(list.join(", ")); + } + } + else return ""; } QString ModelPrinter::printLogicalSwitchLine(int idx) { QString result = ""; - const LogicalSwitchData & ls = g_model->logicalSw[idx]; + const LogicalSwitchData & ls = model.logicalSw[idx]; if (!ls.func) return result; @@ -197,20 +419,20 @@ QString ModelPrinter::printLogicalSwitchLine(int idx) } switch (ls.getFunctionFamily()) { case LS_FAMILY_EDGE: - result += QObject::tr("Edge(%1, [%2:%3])").arg(RawSwitch(ls.val1).toString()).arg(ValToTim(ls.val2)).arg(ValToTim(ls.val2+ls.val3)); + result += tr("Edge(%1, [%2:%3])").arg(RawSwitch(ls.val1).toString()).arg(ValToTim(ls.val2)).arg(ValToTim(ls.val2+ls.val3)); break; case LS_FAMILY_STICKY: - result += QObject::tr("Sticky(%1, %2)").arg(RawSwitch(ls.val1).toString()).arg(RawSwitch(ls.val2).toString()); + result += tr("Sticky(%1, %2)").arg(RawSwitch(ls.val1).toString()).arg(RawSwitch(ls.val2).toString()); break; case LS_FAMILY_TIMER: - result += QObject::tr("Timer(%1, %2)").arg(ValToTim(ls.val1)).arg(ValToTim(ls.val2)); + result += tr("Timer(%1, %2)").arg(ValToTim(ls.val1)).arg(ValToTim(ls.val2)); break; case LS_FAMILY_VOFS: { RawSource source = RawSource(ls.val1); - RawSourceRange range = source.getRange(g_model, *g_eeGeneral); + RawSourceRange range = source.getRange(&model, generalSettings); QString res; if (ls.val1) - res += source.toString(g_model); + res += source.toString(&model); else res += "0"; res.remove(" "); @@ -218,10 +440,12 @@ QString ModelPrinter::printLogicalSwitchLine(int idx) res = "|" + res + "|"; else if (ls.func == LS_FN_DAPOS) res = "|d(" + res + ")|"; - else if (ls.func == LS_FN_DPOS) result = "d(" + res + ")"; + else if (ls.func == LS_FN_DPOS) + result = "d(" + res + ")"; result += res; - - if (ls.func == LS_FN_APOS || ls.func == LS_FN_VPOS || ls.func == LS_FN_DPOS || ls.func == LS_FN_DAPOS) + if (ls.func == LS_FN_VEQUAL) + result += " = "; + else if (ls.func == LS_FN_APOS || ls.func == LS_FN_VPOS || ls.func == LS_FN_DPOS || ls.func == LS_FN_DAPOS) result += " > "; else if (ls.func == LS_FN_ANEG || ls.func == LS_FN_VNEG) result += " < "; @@ -253,7 +477,7 @@ QString ModelPrinter::printLogicalSwitchLine(int idx) case LS_FAMILY_VCOMP: if (ls.val1) - result += RawSource(ls.val1).toString(g_model); + result += RawSource(ls.val1).toString(&model); else result += "0"; switch (ls.func) { @@ -281,22 +505,22 @@ QString ModelPrinter::printLogicalSwitchLine(int idx) break; } if (ls.val2) - result += RawSource(ls.val2).toString(g_model); + result += RawSource(ls.val2).toString(&model); else result += "0"; break; } - if (ls.andsw!=0) { + if (ls.andsw != 0) { result +=" ) AND "; result += RawSwitch(ls.andsw).toString(); } - if (GetCurrentFirmware()->getCapability(LogicalSwitchesExt)) { + if (firmware->getCapability(LogicalSwitchesExt)) { if (ls.duration) - result += QObject::tr(" Duration (%1s)").arg(ls.duration/10.0); + result += " " + tr("Duration(%1s)").arg(ls.duration/10.0); if (ls.delay) - result += QObject::tr(" Delay (%1s)").arg(ls.delay/10.0); + result += " " + tr("Delay(%1s)").arg(ls.delay/10.0); } return result; @@ -305,13 +529,93 @@ QString ModelPrinter::printLogicalSwitchLine(int idx) QString ModelPrinter::printCustomFunctionLine(int idx) { QString result; - const CustomFunctionData & cf = g_model->customFn[idx]; + const CustomFunctionData & cf = model.customFn[idx]; if (cf.swtch.type == SWITCH_TYPE_NONE) return result; result += cf.swtch.toString() + " - "; result += cf.funcToString() + "("; - result += cf.paramToString(g_model) + ")"; + result += cf.paramToString(&model) + ")"; if (!cf.repeatToString().isEmpty()) result += " " + cf.repeatToString(); if (!cf.enabledToString().isEmpty()) result += " " + cf.enabledToString(); return result; } + +QString ModelPrinter::printCurve(int idx) +{ + QString result; + const CurveData & curve = model.curves[idx]; + result += (curve.type == CurveData::CURVE_TYPE_CUSTOM) ? tr("Custom") : tr("Standard"); + result += ", ["; + if (curve.type == CurveData::CURVE_TYPE_CUSTOM) { + for (int j=0; jgetCapability(NumCurves); idx++) { + image.drawCurve(model.curves[idx], colors[idx]); + } + QString filename = generateProcessUniqueTempFileName(QString("curves-%1.png").arg((uint64_t)this)); + image.save(filename); + curvefiles << filename; + return filename; +} diff --git a/companion/src/modelprinter.h b/companion/src/modelprinter.h index cb50d5d9a..11a7b712c 100644 --- a/companion/src/modelprinter.h +++ b/companion/src/modelprinter.h @@ -1,7 +1,9 @@ -#ifndef MODELPRINTER_H -#define MODELPRINTER_H +#ifndef _MODELPRINTER_H_ +#define _MODELPRINTER_H_ #include +#include +#include #include "eeprominterface.h" QString changeColor(const QString & input, const QString & to, const QString & from = "grey"); @@ -10,26 +12,60 @@ QString addFont(const QString & input, const QString & color = "", const QString void debugHtml(const QString & html); - -class ModelPrinter +class CurveImage { -public: - ModelPrinter(Firmware * firmware, GeneralSettings *gg, ModelData *gm); - ~ModelPrinter() {}; - - QString printInputName(int idx); - QString printInputLine(const ExpoData * ed); - QString printMixerName(int curDest); - QString printMixerLine(const MixData * md, int highlightedSource = 0); - QString printLogicalSwitchLine(int idx); - QString printCustomFunctionLine(int idx); + public: + CurveImage(); + void drawCurve(const CurveData & curve, QColor color); + void save(const QString & filename); -private: - Firmware * firmware; - GeneralSettings * g_eeGeneral; - ModelData * g_model; - - QString printPhases(unsigned int phases); + protected: + int size; + QImage image; + QPainter painter; }; -#endif //#ifndef MODELPRINTER_H \ No newline at end of file +class ModelPrinter: public QObject +{ + public: + ModelPrinter(Firmware * firmware, const GeneralSettings & generalSettings, const ModelData & model); + virtual ~ModelPrinter(); + + QString printEEpromSize(); + QString printTrimIncrementMode(); + QString printThrottleTrimMode(); + static QString printModuleProtocol(unsigned int protocol); + QString printFlightModeSwitch(int index); + QString printFlightModeName(int index); + QString printFlightModes(unsigned int flightModes); + QString printModule(int idx); + QString printTrainerMode(); + QString printCenterBeep(); + QString printTrim(int flightModeIndex, int stickIndex); + QString printGlobalVar(int flightModeIndex, int gvarIndex); + QString printRotaryEncoder(int flightModeIndex, int reIndex); + QString printTimer(int idx); + QString printTimer(const TimerData & timer); + QString printInputName(int idx); + QString printInputLine(int idx); + QString printInputLine(const ExpoData & ed); + QString printMixerName(int curDest); + QString printMixerLine(int idx, int highlightedSource = 0); + QString printMixerLine(const MixData & md, int highlightedSource = 0); + QString printLogicalSwitchLine(int idx); + QString printCustomFunctionLine(int idx); + static QString printChannelName(int idx); + QString printOutputName(int idx); + QString printCurve(int idx); + QString createCurvesImage(); + QString createCurveImage(int idx); + + private: + Firmware * firmware; + const GeneralSettings & generalSettings; + const ModelData & model; + QStringList curvefiles; + +}; + +#endif // _MODELPRINTER_H_ diff --git a/companion/src/modelslist.cpp b/companion/src/modelslist.cpp index b2958ad08..49dbe51f7 100644 --- a/companion/src/modelslist.cpp +++ b/companion/src/modelslist.cpp @@ -143,7 +143,7 @@ void ModelsListWidget::setdefault() { if (currentRow()==0) return; unsigned int currModel = currentRow() - 1; - if (!radioData->models[currModel].isempty() && radioData->generalSettings.currModel != currModel) { + if (!radioData->models[currModel].isEmpty() && radioData->generalSettings.currModel != currModel) { radioData->generalSettings.currModel = currModel; refreshList(); ((MdiChild *)parent())->setModified(); @@ -295,7 +295,7 @@ void ModelsListWidget::refreshList() { QString item = QString().sprintf("%02d: ", i+1); - if (!radioData->models[i].isempty()) { + if (!radioData->models[i].isEmpty()) { if (eepromInterface && IS_SKY9X(eepromInterface->getBoard())) { if (radioData->models[i].name[0]==0) { QString modelname="Model"; @@ -363,7 +363,7 @@ void ModelsListWidget::deleteSelected(bool ask=true) QMessageBox::StandardButton ret = QMessageBox::Yes; if(ask) { foreach(QModelIndex index, this->selectionModel()->selectedIndexes()) { - if (index.row()>0 && !radioData->models[index.row()-1].isempty()) { + if (index.row()>0 && !radioData->models[index.row()-1].isEmpty()) { isModel=true; selModel=index.row()-1; } @@ -465,7 +465,7 @@ void ModelsListWidget::doPaste(QByteArray *gmData, int index) i += sizeof(GeneralSettings); } else { //model data - if (!radioData->models[id-1].isempty()) { + if (!radioData->models[id-1].isEmpty()) { ret = QMessageBox::question(this, "Companion", tr("You are pasting on an not empty model, are you sure?"), QMessageBox::Yes | QMessageBox::No); if (ret == QMessageBox::Yes) { @@ -521,7 +521,7 @@ void ModelsListWidget::duplicate() { ModelData *model = &radioData->models[i-1]; while(igetMaxModels()) { - if (radioData->models[i].isempty()) { + if (radioData->models[i].isEmpty()) { radioData->models[i] = *model; ((MdiChild *)parent())->setModified(); break; @@ -581,7 +581,7 @@ void ModelsListWidget::viableModelSelected(int idx) else if (idx<1) ((MdiChild*)parent())->viableModelSelected(false); else - ((MdiChild*)parent())->viableModelSelected(!radioData->models[currentRow()-1].isempty()); + ((MdiChild*)parent())->viableModelSelected(!radioData->models[currentRow()-1].isEmpty()); } diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp new file mode 100644 index 000000000..6736d9348 --- /dev/null +++ b/companion/src/multimodelprinter.cpp @@ -0,0 +1,486 @@ +#include "helpers.h" +#include "helpers_html.h" +#include "multimodelprinter.h" +#include + +MultiModelPrinter::MultiColumns::MultiColumns(int count): + count(count), + compareColumns(NULL) +{ + columns = new QString[count]; +} + +MultiModelPrinter::MultiColumns::~MultiColumns() +{ + delete[] columns; +} + +void MultiModelPrinter::MultiColumns::append(const QString & str) +{ + for (int i=0; i" + name + " "); +} + +void MultiModelPrinter::MultiColumns::append(int idx, const QString & str) +{ + if (compareColumns) + compareColumns[idx].append(str); + else + columns[idx].append(str); +} + +void MultiModelPrinter::MultiColumns::beginCompare() +{ + compareColumns = new QString[count]; +} + +void MultiModelPrinter::MultiColumns::endCompare(const QString & color) +{ + for (int i=0; i1 && compareColumns[0]!=compareColumns[1]) + cellColor = "green"; + else if (i>0 && compareColumns[i]!=compareColumns[0]) + cellColor = "red"; + columns[i].append(QString("%2").arg(cellColor).arg(compareColumns[i])); + } + delete[] compareColumns; + compareColumns = NULL; +} + +template +void MultiModelPrinter::MultiColumns::append(int idx, T val) +{ + append(idx, QString("%1").arg(val)); +} + +QString MultiModelPrinter::MultiColumns::print() +{ + QString result = ""; + for (int i=0; i%2").arg(100.0/count).arg(columns[i])); + } + result.append(""); + return result; +} + +bool MultiModelPrinter::MultiColumns::isEmpty() +{ + for (int i=0; i

").arg(modelPrinters.count()) + label + "

"; +} + +MultiModelPrinter::MultiModelPrinter(Firmware * firmware): + firmware(firmware) +{ +} + +MultiModelPrinter::~MultiModelPrinter() +{ +} + +void MultiModelPrinter::setModel(int idx, const ModelData & model) +{ + int count = std::max(models.size(), idx+1); + models.resize(count); + modelPrinters.resize(count); + models[idx] = (ModelData *)&model; // TODO remove cast + modelPrinters[idx] = new ModelPrinter(firmware, defaultSettings, model); +} + +QString MultiModelPrinter::print() +{ + QString str = ""; + str += printSetup(); + if (firmware->getCapability(FlightModes)) + str += printFlightModes(); + str += printInputs(); + str += printMixers(); + str += printLimits(); + str += printCurves(); + if (firmware->getCapability(Gvars) && !firmware->getCapability(GvarsFlightModes)) + str += printGvars(); + str += printLogicalSwitches(); + str += printCustomFunctions(); + str += printTelemetry(); + str += "
"; + return str; +} + +QString MultiModelPrinter::printSetup() +{ + QString str = printTitle(tr("General Model Settings")); + + MultiColumns columns(models.size()); + columns.appendTitle(tr("Name:")); + COMPARE(model->name); + columns.append("
"); + columns.appendTitle(tr("EEprom Size:")); + COMPARE(modelPrinter->printEEpromSize()); + columns.append("
"); + for (int i=0; igetCapability(Timers); i++) { + columns.appendTitle(tr("Timer%1:").arg(i+1)); + COMPARE(modelPrinter->printTimer(i)); + columns.append("
"); + } + for (int i=0; igetCapability(NumModules); i++) { + columns.appendTitle(firmware->getCapability(NumModules) > 1 ? tr("Module%1:").arg(i+1) : tr("Module:")); + COMPARE(modelPrinter->printModule(i)); + columns.append("
"); + } + if (IS_TARANIS(firmware->getBoard())) { + columns.appendTitle(tr("Trainer port:")); + COMPARE(modelPrinter->printTrainerMode()); + columns.append("
"); + } + columns.appendTitle(tr("Throttle Trim:")); + COMPARE(modelPrinter->printThrottleTrimMode()); + columns.append("
"); + columns.appendTitle(tr("Trim Increment:")); + COMPARE(modelPrinter->printTrimIncrementMode()); + columns.append("
"); + columns.appendTitle(tr("Center Beep:")); + COMPARE(modelPrinter->printCenterBeep()); + str.append(columns.print()); + return str; +} + +QString MultiModelPrinter::printFlightModes() +{ + QString str = printTitle(tr("Flight modes")); + + // Trims + { + MultiColumns columns(models.size()); + columns.append(""); + columns.append(""); + columns.append(""); + columns.append(""); + columns.append(""); + columns.append(""); + for (int i=0; i<4; i++) { + columns.append(""); + } + columns.append(""); + + for (int i=0; igetCapability(FlightModes); i++) { + columns.append(""); + for (int k=0; k<4; k++) { + columns.append(""); + } + columns.append(""); + } + + columns.append("
" + tr("Flight mode") + "" + tr("Switch") + "" + tr("Fade IN") + "" + tr("Fade OUT") + ""); + COMPARE(modelPrinter->printInputName(i)); + columns.append("
" + tr("FM%1").arg(i) + " "); + COMPARE(model->flightModeData[i].name); + columns.append(""); + COMPARE(model->flightModeData[i].swtch.toString()); + columns.append(""); + COMPARE(model->flightModeData[i].fadeIn); + columns.append(""); + COMPARE(model->flightModeData[i].fadeOut); + columns.append(""); + COMPARE(modelPrinter->printTrim(i, k)); + columns.append("
"); + str.append(columns.print()); + } + + // GVars and Rotary Encoders + int gvars = firmware->getCapability(Gvars); + if ((gvars && firmware->getCapability(GvarsFlightModes)) || firmware->getCapability(RotaryEncoders)) { + MultiColumns columns(models.size()); + columns.append(""); + columns.append(""); + if (firmware->getCapability(GvarsFlightModes)) { + for (int i=0; i" + tr("GV%1").arg(i+1) + "
"); + COMPARE(model->gvars_names[i]); + columns.append(""); + } + } + for (int i=0; igetCapability(RotaryEncoders); i++) { + columns.append("
"); + } + columns.append(""); + for (int i=0; igetCapability(FlightModes); i++) { + columns.append(""); + if (firmware->getCapability(GvarsFlightModes)) { + for (int k=0; k"); + COMPARE(modelPrinter->printGlobalVar(i, k)); + columns.append(""); + } + } + for (int k=0; kgetCapability(RotaryEncoders); k++) { + columns.append(""); + } + columns.append(""); + } + columns.append("
" + tr("Flight mode") + "" + tr("RE%1").arg(i+1) + "
" + tr("FM%1").arg(i) + " "); + COMPARE(model->flightModeData[i].name); + columns.append(""); + COMPARE(modelPrinter->printRotaryEncoder(i, k)); + columns.append("
"); + str.append(columns.print()); + } + + return str; +} + +QString MultiModelPrinter::printLimits() +{ + QString str = printTitle(tr("Limits")); + MultiColumns columns(models.size()); + columns.append("" \ + "" \ + " " \ + " " \ + " " \ + " " \ + " " \ + ""); + for (int i=0; igetCapability(Outputs); i++) { + columns.append(""); + } + columns.append("
" + (firmware->getCapability(HasChNames) ? tr("Name") : "") + "" + tr("Offset") + "" + tr("Min") + "" + tr("Max") + "" + tr("Invert") + "
"); + COMPARE(modelPrinter->printOutputName(i)); + columns.append(""); + COMPARE(model->limitData[i].offsetToString()); + columns.append(""); + COMPARE(model->limitData[i].minToString()); + columns.append(""); + COMPARE(model->limitData[i].maxToString()); + columns.append(""); + COMPARE(model->limitData[i].revertToString()); + columns.append("
"); + str.append(columns.print()); + return str; +} + +QString MultiModelPrinter::printGvars() +{ + QString str = printTitle(tr("Global Variables")); + int gvars = firmware->getCapability(Gvars); + MultiColumns columns(models.size()); + columns.append(""); + for (int i=0; i") + tr("GV%1").arg(i+1) + ""); + } + columns.append(""); + for (int i=0; i"); + COMPARE(model->flightModeData[0].gvars[i]); + columns.append(""); + } + columns.append(""); + str.append(columns.print()); + return str; +} + +QString MultiModelPrinter::printInputs() +{ + QString str = printTitle(tr("Inputs")); + MultiColumns columns(models.size()); + columns.append("
"); + for (int i=0; igetCapability(VirtualInputs)); i++) { + int count = 0; + for (int k=0; kexpos(i).size()); + } + if (count > 0) { + columns.append(""); + } + } + str.append(columns.print()); + return str; +} + +QString MultiModelPrinter::printMixers() +{ + QString str = printTitle(tr("Mixers")); + MultiColumns columns(models.size()); + columns.append("
"); + COMPARE(modelPrinter->printInputName(i)); + columns.append(""); + for (int j=0; j 0) + columns.append("
"); + COMPARE(jexpos(i).size() ? modelPrinter->printInputLine(*model->expos(i)[j]) : ""); + } + columns.append("
"); + for (int i=0; igetCapability(Outputs); i++) { + int count = 0; + for (int k=0; kmixes(i).size()); + } + if (count > 0) { + columns.append(""); + } + } + str.append(columns.print()); + return str; +} + +QString MultiModelPrinter::printCurves() +{ + QString str; + MultiColumns columns(models.size()); + int count = 0; + columns.append("
"); + COMPARE(modelPrinter->printChannelName(i)); + columns.append(""); + for (int j=0; j 0) + columns.append("
"); + COMPARE(modelPrinter->printMixerLine(*model->mixes(i)[j])); + } + columns.append("
"); + for (int i=0; igetCapability(NumCurves); i++) { + bool curveEmpty = true; + for (int k=0; kcurves[i].isEmpty()) { + curveEmpty = false; + break; + } + } + if (!curveEmpty) { + count++; + columns.append(""); + } + } + columns.append("
" + tr("CV%1").arg(i+1) + ""); + COMPARE(modelPrinter->printCurve(i)); + for (int k=0; k").arg(modelPrinters[k]->createCurveImage(i))); + columns.append("

"); + if (count > 0) { + str.append(printTitle(tr("Curves"))); + str.append(columns.print()); + } + return str; +} + +QString MultiModelPrinter::printLogicalSwitches() +{ + QString str; + MultiColumns columns(models.size()); + int count = 0; + columns.append(""); + for (int i=0; igetCapability(LogicalSwitches); i++) { + bool lsEmpty = true; + for (int k=0; kprintLogicalSwitchLine(i).isEmpty()) { + lsEmpty = false; + break; + } + } + if (!lsEmpty) { + count++; + columns.append(""); + } + } + columns.append("
" + tr("L%1").arg(i+1) + ""); + COMPARE(modelPrinter->printLogicalSwitchLine(i)); + columns.append("
"); + if (count > 0) { + str.append(printTitle(tr("Logical Switches"))); + str.append(columns.print()); + } + return str; +} + +QString MultiModelPrinter::printCustomFunctions() +{ + QString str; + MultiColumns columns(models.size()); + int count = 0; + columns.append(""); + for (int i=0; igetCapability(CustomFunctions); i++) { + bool sfEmpty = true; + for (int k=0; kprintCustomFunctionLine(i).isEmpty()) { + sfEmpty = false; + break; + } + } + if (!sfEmpty) { + count++; + columns.append(""); + } + } + columns.append("
" + tr("SF%1").arg(i+1) + ""); + COMPARE(modelPrinter->printCustomFunctionLine(i)); + columns.append("
"); + if (count > 0) { + str.append(printTitle(tr("Special Functions"))); + str.append(columns.print()); + } + return str; +} + +QString MultiModelPrinter::printTelemetry() +{ + QString str = printTitle(tr("Telemetry Settings")); + + // Analogs on non ARM boards + if (!IS_ARM(firmware->getBoard())) { + MultiColumns columns(models.size()); + columns.append("" \ + ""); + for (int i=0; i<2; i++) { + columns.append(""); + } + columns.append("
" + tr("Analogs") + "" + tr("Unit") + "" + tr("Scale") + "" + tr("Offset") + "
"+tr("A%1").arg(i+1)+""); + COMPARE(getFrSkyUnits(model->frsky.channels[i].type)); + columns.append(""); + COMPARE(QString::number((model->frsky.channels[i].ratio / (model->frsky.channels[i].type==0 ? 10.0 : 1)), 10, (model->frsky.channels[i].type==0 ? 1 : 0))); + columns.append(""); + COMPARE(QString::number((model->frsky.channels[i].offset*(model->frsky.channels[i].ratio / (model->frsky.channels[i].type==0 ?10.0 : 1)))/255, 10, (model->frsky.channels[i].type==0 ? 1 : 0))); + columns.append("

"); + str.append(columns.print()); + // TODO I remove the analogs alarms for now + } + + // RSSI alarms + { + MultiColumns columns(models.size()); + columns.append(""); + for (int i=0; i<2; i++) { + columns.append(""); + } + columns.append("
" + QString(i==0 ? tr("RSSI Alarms") : "") + ""); + COMPARE(getFrSkyAlarmType(model->frsky.rssiAlarms[i].level)); + columns.append("<"); + COMPARE(QString::number(model->frsky.rssiAlarms[i].value, 10)); + columns.append("

"); + str.append(columns.print()); + } + + return str; +} diff --git a/companion/src/multimodelprinter.h b/companion/src/multimodelprinter.h new file mode 100644 index 000000000..7f1959bf0 --- /dev/null +++ b/companion/src/multimodelprinter.h @@ -0,0 +1,54 @@ +#ifndef _MULTIMODELPRINTER_H +#define _MULTIMODELPRINTER_H + +#include +#include "eeprominterface.h" +#include "modelprinter.h" + +class MultiModelPrinter: public QObject +{ + public: + MultiModelPrinter(Firmware * firmware); + virtual ~MultiModelPrinter(); + + void setModel(int idx, const ModelData & model); + QString print(); + + protected: + class MultiColumns { + public: + MultiColumns(int count); + ~MultiColumns(); + bool isEmpty(); + QString print(); + void append(const QString & str); + void appendTitle(const QString & name); + void append(int idx, const QString & str); + template void append(int idx, T val); + void beginCompare(); + void endCompare(const QString & color = "grey"); + private: + int count; + QString * columns; + QString * compareColumns; + }; + + Firmware * firmware; + GeneralSettings defaultSettings; + QVector models; // TODO const + QVector modelPrinters; + + QString printTitle(const QString & label); + QString printSetup(); + QString printFlightModes(); + QString printLimits(); + QString printInputs(); + QString printMixers(); + QString printCurves(); + QString printGvars(); + QString printLogicalSwitches(); + QString printCustomFunctions(); + QString printTelemetry(); +}; + +#endif // _MULTIMODELPRINTER_H diff --git a/companion/src/printdialog.cpp b/companion/src/printdialog.cpp index 4e23c1e4a..aca06aacd 100644 --- a/companion/src/printdialog.cpp +++ b/companion/src/printdialog.cpp @@ -1,60 +1,27 @@ #include "printdialog.h" #include "ui_printdialog.h" #include "helpers.h" -#include "helpers_html.h" -#include "eeprominterface.h" -#include "modelprinter.h" -#include -#include -#include -#include +#include +#include -#if !defined WIN32 && defined __GNUC__ -#include -#endif +// #if !defined WIN32 && defined __GNUC__ +// #include +// #endif -#define ISIZE 200 // curve image size -#define ISIZEW 400 // curve image size - -PrintDialog::PrintDialog(QWidget *parent, Firmware * firmware, GeneralSettings *gg, ModelData *gm, QString filename) : +PrintDialog::PrintDialog(QWidget *parent, Firmware * firmware, GeneralSettings & generalSettings, ModelData & model, const QString & filename) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), firmware(firmware), - g_eeGeneral(gg), - g_model(gm), + generalSettings(generalSettings), + model(model), printfilename(filename), ui(new Ui::PrintDialog), - gvars(firmware->getCapability(Gvars)), - modelPrinter(firmware, gg, gm) + multimodelprinter(firmware) { ui->setupUi(this); setWindowIcon(CompanionIcon("print.png")); - te = ui->textEdit; - - setWindowTitle(tr("Setup for: ") + g_model->name); - te->clear(); - QString modelname=g_model->name; - if (modelname.isEmpty()) { - curvefile5=generateProcessUniqueTempFileName("curve5.png"); - curvefile9=generateProcessUniqueTempFileName("curve9.png"); - } - else { - curvefile5=generateProcessUniqueTempFileName(QString("%1-curve5.png").arg(modelname)); - curvefile9=generateProcessUniqueTempFileName(QString("%1-curve9.png").arg(modelname)); - } - printSetup(); - if (gvars) { - te->append(printFlightModes()+"
"); - } - printInputs(); - printMixes(); - printLimits(); - printCurves(); - printGvars(); - printLogicalSwitches(); - printCustomFunctions(); - printFrSky(); - - te->scrollToAnchor("1"); + setWindowTitle(model.name); + multimodelprinter.setModel(0, model); + ui->textEdit->setHtml(multimodelprinter.print()); if (!printfilename.isEmpty()) { printToFile(); QTimer::singleShot(0, this, SLOT(autoClose())); @@ -67,665 +34,59 @@ void PrintDialog::closeEvent(QCloseEvent *event) PrintDialog::~PrintDialog() { - // notice PrintDialog::closeEvent() is not called if user clicks on Close button - qunlink(curvefile5); - qunlink(curvefile9); delete ui; } -void PrintDialog::printSetup() -{ - QString str = ""; - str.append(QString(""); - if (!gvars) { - str.append(""); - } - str.append("

").arg((firmware->getCapability(FlightModes) && !gvars) ? 2 : 1)); - str.append(g_model->name); - str.append(" ("); - str.append(firmware->getName()); - str.append(")

"+tr("printed on: %1").arg(QDateTime::currentDateTime().toString(Qt::SystemLocaleShortDate))+"
"); - str.append(""); - str.append("

"+tr("General Model Settings")+"

"); - str.append(fv(tr("Name"), g_model->name)); - str.append(fv(tr("EEprom Size"), QString("%1").arg(firmware->getEepromInterface()->getSize(*g_model)))); - - for (int i=0; igetCapability(Timers); i++) { - str.append(fv(tr("Timer%1").arg(i+1), getTimerStr(g_model->timers[i]))); // value, mode, count up/down - } - - if (firmware->getCapability(NumModules)>1) { - str.append(""+(IS_TARANIS(firmware->getBoard()) ? tr("Internal Radio System") : tr("Radio System") )+"
  "); //proto, numch, delay, - } - str.append(fv(tr("Protocol"), getProtocol(g_model->moduleData[0]))); - if (firmware->getCapability(NumModules)>1) { - str.append(""+(IS_TARANIS(firmware->getBoard()) ? tr("External Radio Module") : tr("Extra Radio System"))+"
  "); //proto, numch, delay, - str.append(fv(tr("Protocol"), getProtocol(g_model->moduleData[1]))); - } - if (IS_TARANIS(firmware->getBoard())){ - str.append(fv(tr("Trainer port mode"), getTrainerMode(g_model->trainerMode, g_model->moduleData[2]))); - } - str.append(fv(tr("Throttle Trim"), g_model->thrTrim ? tr("Enabled") : tr("Disabled"))); - str.append(fv(tr("Trim Increment"), getTrimInc(g_model))); - str.append(fv(tr("Center Beep"), getCenterBeepStr(g_model))); // specify which channels beep - str.append("
"); - str.append(printFlightModes()); - str.append("

"); - te->append(str); -} - -QString PrintDialog::printFlightModes() -{ - QString str = ""; - str.append(QString(""); - str.append(""); - if (gvars) { - str.append(QString(""); - } - if (firmware->getCapability(RotaryEncoders)) { - str.append(QString(""); - } - str.append(""); - QString labels[] = { tr("Rud"), tr("Ele"), tr("Thr"), tr("Ail") }; // TODO is elsewhere for sure - for (int i=0; i<4; i++) { - GeneralSettings generalSettings = *g_eeGeneral; - str.append(QString("").arg((QString)labels[CONVERT_MODE(i+1)-1])); - } - for (unsigned int i=0; iGV%1
%2").arg(i+1).arg(g_model->gvars_names[i])); - } - for (int i=0; igetCapability(RotaryEncoders); i++) { - str.append(QString("
").arg((i==0 ? 'A': 'B'))); - } - str.append(""); - for (int i=0; igetCapability(FlightModes); i++) { - FlightModeData *pd=&g_model->flightModeData[i]; - str.append("").arg(i).arg(pd->name)); - str.append(QString("").arg((qreal)pd->fadeIn/firmware->getCapability(SlowScale))); - str.append(QString("").arg((qreal)pd->fadeOut/firmware->getCapability(SlowScale))); - for (int k=0; k<4; k++) { - //TODO trim values - if (pd->trimMode[k]==-1) { - str.append(QString("")); - } else { - if (pd->trimRef[k]==i) { - str.append("")); - } else { - if (pd->trimMode[k]==0) { - str.append("")); - } else { - str.append("")); - } - } - } - } - for (unsigned int k=0; kgvars[k]<=1024) { - str.append(QString(""); - } - else { - int num = pd->gvars[k] - 1025; - if (num>=i) num++; - str.append("").arg(num)); - } - } - for (int k=0; kgetCapability(RotaryEncoders); k++) { - if (pd->rotaryEncoders[k]<=1024) { - str.append(QString(""); - } - else { - int num = pd->rotaryEncoders[k] - 1025; - if (num>=i) num++; - str.append(QString("").arg(num)); - } - } - str.append(QString("").arg(pd->swtch.toString())); - str.append(""); - } - str.append("

").arg(!gvars ? 8+firmware->getCapability(RotaryEncoders) : 8+gvars+firmware->getCapability(RotaryEncoders))); - str.append(tr("Flight modes")); - str.append("

 "); - str.append(tr("Fades")+""+tr("Trims")+"").arg(gvars)+tr("Gvars")+"").arg(firmware->getCapability(RotaryEncoders))+tr("Rot.Enc.")+""+tr("Switch")+"
"+tr("Flight mode name")); - str.append(""+tr("IN")+""+tr("OUT")+"%1RE%1
"+tr("FM")+QString("%1 %2%1%1")+tr("Off")+QString(""+QString("%1").arg(pd->trim[k])+QString(""+tr("FM")+QString("%1").arg(pd->trimRef[k])+QString(""+tr("FM")+QString("%1+").arg(pd->trimRef[k])+QString("
%1").arg(pd->trim[k])+QString("
%1").arg(pd->gvars[k])+""+tr("FM")+QString("%1%1").arg(pd->rotaryEncoders[k])+"")+tr("FM")+QString("%1%1
"); - return(str); -} - -void PrintDialog::printInputs() -{ - QString str = "

"; - str += tr("Inputs"); - str += "

"; - int ec=0; - unsigned int lastCHN = 255; - for(int i=0; iexpoData[i]; - if(ed->mode==0) continue; - ec++; - - str += ""; - - str += ""; - str += ""; - } - str += "
"; - if(lastCHN!=ed->chn) { - lastCHN=ed->chn; - str += addFont(""+modelPrinter.printInputName(ed->chn)+"", "", "+1", "Courier New"); - } - str += "" + addFont(modelPrinter.printInputLine(ed), "green", "+1", "Courier New") + "

"; - if (ec>0) te->append(str); - // debugHtml(str); -} - - -void PrintDialog::printMixes() -{ - QString str = "

"; - str += tr("Mixers"); - str += "

"; - - unsigned int lastCHN = 255; - for(int i=0; igetCapability(Mixes); i++) { - MixData *md = &g_model->mixData[i]; - if(!md->destCh || md->destCh>(unsigned int)firmware->getCapability(Outputs) ) break; - - str += ""; - - str += ""; - str += ""; - } - str += "
"; - if(lastCHN!=md->destCh) { - lastCHN=md->destCh; - str += addFont(modelPrinter.printMixerName(md->destCh).replace(" ", " "), "", "+1", "Courier New"); - } - str += "" + addFont(modelPrinter.printMixerLine(md), "green", "+1", "Courier New") + "

"; - te->append(str); - // debugHtml(str); -} - -void PrintDialog::printLimits() -{ - QString str = ""; - int numcol; - numcol=(firmware->getCapability(Outputs)+1)>17 ? 17:firmware->getCapability(Outputs)+1; - str.append(QString(""); - str.append(""); - if (firmware->getCapability(Outputs)<17) { - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); - } - str.append(""); - if (firmware->getCapability(HasChNames)) { - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(g_model->limitData[i].name, "green")); - } - } - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(g_model->limitData[i].offsetToString(), "green")); - } - str.append(""); - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(g_model->limitData[i].minToString(), "green")); - } - str.append(""); - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(g_model->limitData[i].maxToString(), "green")); - } - str.append(""); - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green")); - } - } else { - for(int i=0; i<16; i++) { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); - } - str.append(""); - if (firmware->getCapability(HasChNames)) { - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(g_model->limitData[i].name,"green")); - } - } - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green")); - } - str.append(""); - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green")); - } - str.append(""); - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green")); - } - str.append(""); - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green")); - } - str.append(""); - str.append(QString(""); - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); - } - str.append(""); - if (firmware->getCapability(HasChNames)) { - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(g_model->limitData[i].name,"green")); - } - } - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green")); - } - str.append(""); - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green")); - } - str.append(""); - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green")); - } - str.append(""); - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green")); - } - } - str.append(""); - str.append("

").arg(numcol)+tr("Limits")+"

 
"+tr("Name")+"
"+tr("Offset")+"
"+tr("Min")+"
"+tr("Max")+"
"+tr("Invert")+"
"+tr("Name")+"
"+tr("Offset")+"
"+tr("Min")+"
"+tr("Max")+"
"+tr("Invert")+"
 ").arg(numcol)+"
 
"+tr("Name")+"
"+tr("Offset")+"
"+tr("Min")+"
"+tr("Max")+"
"+tr("Invert")+"
"); - str.append("
"); - te->append(str); -} - -void PrintDialog::printCurves() -{ - int i,r,g,b,c,count,usedcurves=0; - char buffer[16]; - QPen pen(Qt::black, 2, Qt::SolidLine); - - QString str = "

"; - str.append(tr("Curves")); - str.append("

"); - int numcurves=firmware->getCapability(NumCurves); - if (numcurves==0) { - numcurves=16; - } - - QImage qi(ISIZEW+1,ISIZEW+1,QImage::Format_RGB32); - QPainter painter(&qi); - painter.setBrush(QBrush("#FFFFFF")); - painter.setPen(QColor(0,0,0)); - painter.drawRect(0,0,ISIZEW,ISIZEW); - str.append(""+QString("
").arg(curvefile5)); - for(i=0; icurves[i].count; - count=0; - for(int j=0; jcurves[i].points[j].y!=0) - count++; - } - if ((count>0) || (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM)|| (g_model->curves[i].count !=5)) { - if(usedcurves%2 == 0) str.append(""); - str.append(QString("").arg(i+1)); - if(usedcurves%2) str.append(""); - usedcurves++; - } - } - if (!(usedcurves%2)) str.append(""); - if (usedcurves!=0) { - str.append("
").arg(buffer)+tr("Curve")+QString(" %1
"); - str.append(""); - str.append(doTC(" ")); - str.append(doTC(" ")); - int numpoint=0; - for(i=0; icurves[i].count>numpoint) - numpoint=g_model->curves[i].count; - } - for(i=0; i"); - for(i=0; icurves[i].count; - count=0; - for(int j=0; jcurves[i].points[j].y!=0) - count++; - } - if ((count>0) || (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM)) { - pen.setColor(colors[i]); - painter.setPen(pen); - colors[i].getRgb(&r,&g,&b); - c=r; - c*=256; - c+=g; - c*=256; - c+=b; - sprintf(buffer,"%06x",c); - str.append(""); - if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) - str.append(QString("").arg(i+1)); - else - str.append(QString("").arg(i+1)); - for(int j=0; jcurves[i].points[j].y),"green")); - if (j>0 && (count!=0 ||(g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM))) { - if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) - painter.drawLine(ISIZEW/2+(ISIZEW*g_model->curves[i].points[j-1].x)/200,ISIZEW/2-(ISIZEW*g_model->curves[i].points[j-1].y)/200,ISIZEW/2+(ISIZEW*g_model->curves[i].points[j].x)/200,ISIZEW/2-(ISIZEW*g_model->curves[i].points[j].y)/200); - else - painter.drawLine(ISIZEW*(j-1)/(curvepoints-1),ISIZEW/2-(ISIZEW*g_model->curves[i].points[j-1].y)/200,ISIZEW*(j)/(curvepoints-1),ISIZEW/2-(ISIZEW*g_model->curves[i].points[j].y)/200); - } - } - for(int j=curvepoints; j"); - if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) { - str.append(""); - for(int j=0; jcurves[i].points[j].x),"green")); - } - for(int j=curvepoints; j"); - } - } - } - str.append("
").arg(buffer)+tr("Curve")+QString(" %1Y").arg(buffer)+tr("Curve")+QString(" %1Y
X
"); - str.append("
"); - painter.setPen(QColor(0,0,0)); - painter.drawLine(0,ISIZEW/2,ISIZEW,ISIZEW/2); - painter.drawLine(ISIZEW/2,0,ISIZEW/2,ISIZEW); - for(i=0; i<21; i++) { - painter.drawLine(ISIZEW/2-5,(ISIZEW*i)/(20),ISIZEW/2+5,(ISIZEW*i)/(20)); - painter.drawLine((ISIZEW*i)/(20),ISIZEW/2-5,(ISIZEW*i)/(20),ISIZEW/2+5); - } - qi.save(curvefile5, "png",100); - te->append(str); - } -} - -void PrintDialog::printLogicalSwitches() -{ - bool haveOutput = false; - QString str = ""; - str += ""; - str += "

" + tr("Logical Switches") + "

"; - for (int i=0; igetCapability(LogicalSwitches); i++) { - QString sw = modelPrinter.printLogicalSwitchLine(i); - if (!sw.isEmpty()) { - str += ""; - str += "").arg(i+1); - str += ""; - str += ""; - haveOutput = true; - } - } - str += "
"+ tr("L") + QString("%1" + addFont(sw, "green") + "
"; - str += "
"; - if (haveOutput) te->append(str); -} - -void PrintDialog::printGvars() -{ - if (!firmware->getCapability(GvarsFlightModes) && gvars) { - QString str = ""; - str.append(""); - str.append("

"+tr("Global Variables")+"

"); - FlightModeData *pd=&g_model->flightModeData[0]; - int width = 100/gvars; - str.append(""); - for (unsigned int i=0; i").arg(width)+tr("GV")+QString("%1").arg(i+1)); - } - str.append(""); - str.append(""); - for (unsigned int i=0; i").arg(width)+QString("%1").arg(pd->gvars[i])); - } - str.append(""); - str.append("
"); - str.append("
"); - te->append(str); - } -} - -void PrintDialog::printCustomFunctions() -{ - bool haveOutput = false; - QString str = ""; - str += ""; - str += "

" + tr("Special Functions") + "

"; - for (int i=0; igetCapability(CustomFunctions); i++) { - QString cf = modelPrinter.printCustomFunctionLine(i); - if (!cf.isEmpty()) { - str += ""; - str += "").arg(i+1); - str += ""; - str += ""; - haveOutput = true; - } - } - str += "
"+ tr("SF") + QString("%1" + addFont(cf, "green") + "
"; - str += "
"; - if (haveOutput) te->append(str); -} - -void PrintDialog::printFrSky() -{ - int tc=0; - QString str = ""; - int analog=2; - if (IS_ARM(firmware->getBoard())) { - analog=4; - } - - if (IS_TARANIS(GetEepromInterface()->getBoard())) { - str.append(""); - str.append(""); - str.append(doTC(tr("Analog"),"", true)); - str.append(doTC(tr("Range"),"", true)); - str.append(doTC(tr("Offset"),"", true)); - str.append(""); - - FrSkyData *fd=&g_model->frsky; - for (int i=0; ichannels[i].ratio!=0) { - tc++; - float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1)); - QString unit = " " + getFrSkyUnits(fd->channels[i].type); - str.append(""); - str.append(doTL(tr("A%1").arg(i+1), "", true)); - str.append(doTC(QString::number(ratio,10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); - str.append(doTC(QString::number((fd->channels[i].offset*ratio)/255,10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); - str.append(""); - } - } - - str.append(""); - str.append(""); - str.append(doTC(tr("Alarms"),"", true)); - str.append(doTC(tr("Low Alarm"),"", true)); - str.append(doTC(tr("Critical Alarm"),"", true)); - str.append(""); - str.append(""); - str.append(doTL(tr("RSSI"),"", true)); - str.append(doTC(QString::number(fd->rssiAlarms[0].value,10),"green")); - str.append(doTC(QString::number(fd->rssiAlarms[1].value,10),"green")); - str.append(""); - for (int i=0; i<2; i++) { - if (fd->channels[i].ratio!=0) { - float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1)); - QString unit = " " + getFrSkyUnits(fd->channels[i].type); - str.append(""); - str.append(doTL(tr("A%1").arg(i+1), "", true)); - str.append(doTC(QString::number(ratio*(fd->channels[i].alarms[0].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); - str.append(doTC(QString::number(ratio*(fd->channels[i].alarms[1].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); - str.append(""); - } - } - - //TODO preferrably in new tables - str.append(""); - //str.append(""); - //str.append(""); - str.append(""); - str.append("

"+tr("Telemetry Settings")+"

"+tr("Frsky serial protocol")+""+getFrSkyProtocol(fd->usrProto)+"
"+tr("Units system")+""+getFrSkyMeasure(fd->imperial)+"
"+tr("Blades")+""+QString("%1").arg(fd->blades)+"
"); - } - else { //other boards - str.append("

"+tr("Telemetry Settings")+"

"); - str.append(" "+tr("Alarm 1")+""+tr("Alarm 2")+""); - str.append(""+tr("Analog")+""+tr("Unit")+""+tr("Scale")+""+tr("Offset")+""); - str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); - str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); - FrSkyData *fd=&g_model->frsky; - for (int i=0; ichannels[i].ratio!=0) { - tc++; - float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1)); - str.append(""+tr("A%1").arg(i+1)+""+getFrSkyUnits(fd->channels[i].type)+""+QString::number(ratio,10,(fd->channels[i].type==0 ? 1:0))+""+QString::number((fd->channels[i].offset*ratio)/255,10,(fd->channels[i].type==0 ? 1:0))+""); - str.append(""+getFrSkyAlarmType(fd->channels[i].alarms[0].level)+""); - str.append(""); - str.append((fd->channels[i].alarms[0].greater==1) ? ">" : "<"); - str.append(""+QString::number(ratio*(fd->channels[i].alarms[0].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+""); - str.append(""+getFrSkyAlarmType(fd->channels[i].alarms[1].level)+""); - str.append(""); - str.append((fd->channels[i].alarms[1].greater==1) ? ">" : "<"); - str.append(""+QString::number(ratio*(fd->channels[i].alarms[1].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+""); - } - } - str.append(""); - str.append(" "+tr("Alarm 1")+""+tr("Alarm 2")+""); - str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); - str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); - str.append(""+tr("RSSI Alarm")+""); - str.append(""+getFrSkyAlarmType(fd->rssiAlarms[0].level)+"<"+QString::number(fd->rssiAlarms[0].value,10)+""); - str.append(""+getFrSkyAlarmType(fd->rssiAlarms[1].level)+"<"+QString::number(fd->rssiAlarms[1].value,10)+""); - str.append(""); - str.append(""+tr("Frsky serial protocol")+""+getFrSkyProtocol(fd->usrProto)+""); - str.append(""+tr("Blades")+""+QString("%1").arg(fd->blades)+""); - str.append(""); - } -#if 0 - if (firmware->getCapability(TelemetryBars) || (firmware->getCapability(TelemetryCSFields))) { - int cols=firmware->getCapability(TelemetryColsCSFields); - if (cols==0) cols=2; - for (int j=0; jgetCapability(TelemetryCSFields)/(4*cols); j++ ) { - if (fd->screens[j].type==0) { - if (cols==2) { - str.append(""); - } else { - str.append("
"+tr("Custom Telemetry View")+"
"); - } - for (int r=0; r<4; r++) { - str.append(""); - for (int c=0; cscreens[j].body.lines[r].source[c]!=0) - tc++; - if (cols==2) { - str.append(""); - } else { - str.append(""); - } - if (c<(cols-1)) { - if (cols==2) { - str.append(""); - } else { - str.append(""); - } - } - } - str.append(""); - } - str.append("
"+tr("Custom Telemetry View")+"
"+getFrSkySrc(fd->screens[j].body.lines[r].source[c])+""+getFrSkySrc(fd->screens[j].body.lines[r].source[c])+"  
"); - } else { - str.append(""); - str.append(""); - for (int i=0; i<4; i++) { - if (fd->screens[j].body.bars[i].source!=0) - tc++; - // TODO str.append(""); - } - str.append("
"+tr("Telemetry Bars")+"
"+tr("Bar Number")+""+tr("Source")+""+tr("Min")+""+tr("Max")+"
"+QString::number(i+1,10)+""+getFrSkySrc(fd->screens[j].body.bars[i].source)+""+(fd->screens[j].body.bars[i].source>0 ? QString::number(getBarValue(fd->screens[j].body.bars[i].source, fd->screens[j].body.bars[i].barMin,fd)):"----")+""+(fd->screens[j].body.bars[i].source>0 ? QString::number(getBarValue(fd->screens[j].body.bars[i].source,(255-fd->screens[j].body.bars[i].barMax),fd)) :"----")+"
"); - } - } - } -#endif - if (tc>0) - te->append(str); -} - void PrintDialog::on_printButton_clicked() { - QPrinter printer; - printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); - QPrintDialog *dialog = new QPrintDialog(&printer, this); - dialog->setWindowTitle(tr("Print Document")); - if (dialog->exec() != QDialog::Accepted) - return; - te->print(&printer); + QPrinter printer; + printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); + QPrintDialog *dialog = new QPrintDialog(&printer, this); + dialog->setWindowTitle(tr("Print Document")); + if (dialog->exec() != QDialog::Accepted) + return; + ui->textEdit->print(&printer); } void PrintDialog::on_printFileButton_clicked() { - QString fn = QFileDialog::getSaveFileName(this,tr("Select PDF output file"),QString(),tr("ODF files (*.odt);;PDF Files(*.pdf);;HTML-Files (*.htm *.html);;All Files (*)")); - if (fn.isEmpty()) - return; - if (! (fn.endsWith(".odt", Qt::CaseInsensitive) || fn.endsWith(".pdf", Qt::CaseInsensitive) || fn.endsWith(".htm", Qt::CaseInsensitive) || fn.endsWith(".html", Qt::CaseInsensitive)) ) - fn += ".pdf"; // default - if (fn.endsWith(".pdf", Qt::CaseInsensitive)) { - QPrinter printer; - printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setColorMode(QPrinter::Color); - printer.setOutputFileName(fn); - te->print(&printer); - } else { - QTextDocumentWriter writer(fn); - writer.write(te->document()); - } + QString fn = QFileDialog::getSaveFileName(this,tr("Select PDF output file"),QString(),tr("ODF files (*.odt);;PDF Files(*.pdf);;HTML-Files (*.htm *.html);;All Files (*)")); + if (fn.isEmpty()) + return; + if (! (fn.endsWith(".odt", Qt::CaseInsensitive) || fn.endsWith(".pdf", Qt::CaseInsensitive) || fn.endsWith(".htm", Qt::CaseInsensitive) || fn.endsWith(".html", Qt::CaseInsensitive)) ) + fn += ".pdf"; // default + if (fn.endsWith(".pdf", Qt::CaseInsensitive)) { + QPrinter printer; + printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setColorMode(QPrinter::Color); + printer.setOutputFileName(fn); + ui->textEdit->print(&printer); + } + else { + QTextDocumentWriter writer(fn); + writer.write(ui->textEdit->document()); + } } void PrintDialog::printToFile() { - if (printfilename.isEmpty()) - return; - if (! (printfilename.endsWith(".odt", Qt::CaseInsensitive) || printfilename.endsWith(".pdf", Qt::CaseInsensitive) || printfilename.endsWith(".htm", Qt::CaseInsensitive) || printfilename.endsWith(".html", Qt::CaseInsensitive)) ) - printfilename += ".pdf"; // default - if (printfilename.endsWith(".pdf", Qt::CaseInsensitive)) { - QPrinter printer; - printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setColorMode(QPrinter::Color); - printer.setOutputFileName(printfilename); - te->print(&printer); - } else { - QTextDocumentWriter writer(printfilename); - writer.write(te->document()); - } + if (printfilename.isEmpty()) + return; + if (! (printfilename.endsWith(".odt", Qt::CaseInsensitive) || printfilename.endsWith(".pdf", Qt::CaseInsensitive) || printfilename.endsWith(".htm", Qt::CaseInsensitive) || printfilename.endsWith(".html", Qt::CaseInsensitive)) ) + printfilename += ".pdf"; // default + if (printfilename.endsWith(".pdf", Qt::CaseInsensitive)) { + QPrinter printer; + printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setColorMode(QPrinter::Color); + printer.setOutputFileName(printfilename); + ui->textEdit->print(&printer); + } + else { + QTextDocumentWriter writer(printfilename); + writer.write(ui->textEdit->document()); + } } void PrintDialog::autoClose() diff --git a/companion/src/printdialog.h b/companion/src/printdialog.h index 9804cd078..a9dd4f35b 100644 --- a/companion/src/printdialog.h +++ b/companion/src/printdialog.h @@ -1,11 +1,9 @@ -#ifndef PRINTDIALOG_H -#define PRINTDIALOG_H +#ifndef _PRINTDIALOG_H +#define _PRINTDIALOG_H #include -#include -#include #include "eeprominterface.h" -#include "modelprinter.h" +#include "multimodelprinter.h" namespace Ui { class PrintDialog; @@ -15,46 +13,27 @@ class PrintDialog : public QDialog { Q_OBJECT -public: - explicit PrintDialog(QWidget *parent, Firmware * firmware, GeneralSettings *gg, ModelData *gm, QString filename=""); - + public: + PrintDialog(QWidget * parent, Firmware * firmware, GeneralSettings & generalSettings, ModelData & model, const QString & filename=""); ~PrintDialog(); - void closeEvent(QCloseEvent *event); + void closeEvent(QCloseEvent * event); Firmware * firmware; - GeneralSettings * g_eeGeneral; - ModelData * g_model; + GeneralSettings & generalSettings; + ModelData & model; QString printfilename; -private: + protected: Ui::PrintDialog *ui; - unsigned int gvars; + MultiModelPrinter multimodelprinter; // TODO multimodelPrinter - void printSetup(); - QString printFlightModes(); - void printInputs(); - void printMixes(); - void printLimits(); - void printCurves(); - void printGvars(); - void printLogicalSwitches(); - void printSafetySwitches(); - void printCustomFunctions(); - void printFrSky(); void printToFile(); - - QTextEdit * te; - QString curvefile5; - QString curvefile9; - QDir *qd; - ModelPrinter modelPrinter; - -private slots: + private slots: void on_printButton_clicked(); void on_printFileButton_clicked(); void autoClose(); }; -#endif // PRINTDIALOG_H +#endif // _PRINTDIALOG_H From 0c7e545b426e6693da40c267df705f986e0fa081 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 23 Aug 2015 11:51:26 +0200 Subject: [PATCH 2/6] Cosmetics --- .../firmwares/opentx/open9xStockeeprom.cpp | 80 ++-- companion/src/modeledit/expodialog.cpp | 119 +++--- companion/src/modeledit/mixerdialog.cpp | 33 +- companion/src/modeledit/mixes.cpp | 403 +++++++++--------- 4 files changed, 319 insertions(+), 316 deletions(-) diff --git a/companion/src/firmwares/opentx/open9xStockeeprom.cpp b/companion/src/firmwares/opentx/open9xStockeeprom.cpp index 898c45d45..27d60ce27 100644 --- a/companion/src/firmwares/opentx/open9xStockeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xStockeeprom.cpp @@ -88,7 +88,7 @@ t_Open9xExpoData_v201::operator ExpoData () ExpoData c9x; c9x.mode = mode; c9x.chn = chn; - if (expo!=0 && curve!=0) { + if (expo != 0 && curve != 0) { EEPROMWarnings.push_back(::QObject::tr("Simultaneous usage of expo and curves is no longer supported in OpenTX")); } else { @@ -101,13 +101,13 @@ t_Open9xExpoData_v201::operator ExpoData () } c9x.swtch = open9xStockToSwitch(swtch); if (negPhase) { - c9x.flightModes= 1 << (phase -1); + c9x.flightModes = 1 << (phase -1); } - else if (phase==0) { - c9x.flightModes=0; + else if (phase == 0) { + c9x.flightModes = 0; } else { - c9x.flightModes=63; + c9x.flightModes = 63; c9x.flightModes &= ~(1 << (phase -1)); } c9x.weight = weight; @@ -129,8 +129,8 @@ t_Open9xExpoData_v211::operator ExpoData () t_Open9xLimitData_v201::operator LimitData () { LimitData c9x; - c9x.min = 10*(min-100); - c9x.max = 10*(max+100); + c9x.min = 10 * (min - 100); + c9x.max = 10 * (max + 100); c9x.revert = revert; c9x.offset = offset; return c9x; @@ -139,12 +139,12 @@ t_Open9xLimitData_v201::operator LimitData () t_Open9xLimitData_v211::operator LimitData () { LimitData c9x; - c9x.min = 10*(min-100); - c9x.max = 10*(max+100); + c9x.min = 10 * (min - 100); + c9x.max = 10 * (max + 100); c9x.revert = revert; c9x.offset = offset; - c9x.symetrical=symetrical; - c9x.ppmCenter=ppmCenter; + c9x.symetrical = symetrical; + c9x.ppmCenter = ppmCenter; return c9x; } @@ -197,12 +197,12 @@ t_Open9xMixData_v201::operator MixData () c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - if (phase<0) { - c9x.flightModes= 1 << (-phase -1); - } else if (phase==0) { - c9x.flightModes=0; + if (phase < 0) { + c9x.flightModes = 1 << (-phase -1); + } else if (phase == 0) { + c9x.flightModes = 0; } else { - c9x.flightModes=63; + c9x.flightModes = 63; c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; @@ -258,12 +258,12 @@ t_Open9xMixData_v203::operator MixData () c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - if (phase<0) { - c9x.flightModes= 1 << (-phase -1); - } else if (phase==0) { - c9x.flightModes=0; + if (phase < 0) { + c9x.flightModes = 1 << (-phase -1); + } else if (phase == 0) { + c9x.flightModes = 0; } else { - c9x.flightModes=63; + c9x.flightModes = 63; c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; @@ -319,14 +319,14 @@ t_Open9xMixData_v205::operator MixData () c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - if (phase<0) { - c9x.flightModes= 1 << (-phase -1); + if (phase < 0) { + c9x.flightModes = 1 << (-phase -1); } - else if (phase==0) { - c9x.flightModes=0; + else if (phase == 0) { + c9x.flightModes = 0; } else { - c9x.flightModes=63; + c9x.flightModes = 63; c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; @@ -339,7 +339,7 @@ t_Open9xMixData_v209::operator MixData () MixData c9x; if (srcRaw) { - c9x.destCh = destCh+1; + c9x.destCh = destCh + 1; c9x.swtch = open9xStockToSwitch(swtch); if (srcRaw == 0) { @@ -386,14 +386,14 @@ t_Open9xMixData_v209::operator MixData () c9x.mltpx = (MltpxValue)mltpx; c9x.mixWarn = mixWarn; - if (phase<0) { - c9x.flightModes= 1 << (-phase -1); + if (phase < 0) { + c9x.flightModes = 1 << (-phase -1); } - else if (phase==0) { - c9x.flightModes=0; + else if (phase ==0 ) { + c9x.flightModes = 0; } else { - c9x.flightModes=63; + c9x.flightModes = 63; c9x.flightModes &= ~(1 << (phase -1)); } c9x.sOffset = sOffset; @@ -406,7 +406,7 @@ t_Open9xMixData_v211::operator MixData () MixData c9x; if (srcRaw) { - c9x.destCh = destCh+1; + c9x.destCh = destCh + 1; c9x.swtch = open9xStockToSwitch(swtch); if (srcRaw == 0) { @@ -603,8 +603,8 @@ t_Open9xCustomFunctionData_v203::operator CustomFunctionData () CustomFunctionData c9x; c9x.swtch = open9xStockToSwitch(swtch); if (func < 16) { - c9x.enabled=param & 0x01; - c9x.param = (param>>1)<<1; + c9x.enabled = param & 0x01; + c9x.param = (param>>1) << 1; c9x.func = (AssignFunc)(func); } else { c9x.param = param; @@ -730,7 +730,7 @@ t_Open9xTimerData_v202::operator TimerData () FrSkyRSSIAlarm t_Open9xFrSkyRSSIAlarm::get(int index) { FrSkyRSSIAlarm c9x; - c9x.level = (2+index+level) % 4; + c9x.level = (2 + index + level) % 4; c9x.value = value + 50; return c9x; } @@ -840,7 +840,7 @@ t_Open9xFrSkyData_v204::operator FrSkyData () c9x.channels[0] = channels[0]; c9x.channels[1] = channels[1]; c9x.usrProto = usrProto; - c9x.blades = blades+2; + c9x.blades = blades + 2; c9x.screens[0].type = 1; for (int i=0; i<4; i++) c9x.screens[0].body.bars[i] = bars[i]; @@ -853,7 +853,7 @@ t_Open9xFrSkyData_v205::operator FrSkyData () c9x.channels[0] = channels[0]; c9x.channels[1] = channels[1]; c9x.usrProto = usrProto; - c9x.blades = blades+2; + c9x.blades = blades + 2; c9x.screens[0].type = 1; for (int i=0; i<4; i++) c9x.screens[0].body.bars[i] = bars[i]; @@ -869,7 +869,7 @@ t_Open9xFrSkyData_v208::operator FrSkyData () c9x.channels[1] = channels[1]; c9x.usrProto = usrProto; c9x.voltsSource = voltsSource; - c9x.blades = blades+2; + c9x.blades = blades + 2; c9x.currentSource=currentSource; c9x.screens[0].type = 1; for (int i=0; i<4; i++) @@ -886,7 +886,7 @@ t_Open9xFrSkyData_v210::operator FrSkyData () c9x.channels[1] = channels[1]; c9x.usrProto = usrProto; c9x.voltsSource = voltsSource; - c9x.blades = blades+2; + c9x.blades = blades + 2; c9x.currentSource=currentSource; int lines_screen_index = 0; diff --git a/companion/src/modeledit/expodialog.cpp b/companion/src/modeledit/expodialog.cpp index 8f757163d..7d3e64e03 100644 --- a/companion/src/modeledit/expodialog.cpp +++ b/companion/src/modeledit/expodialog.cpp @@ -33,7 +33,8 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G ui->offsetCB->hide(); } - curveGroup = new CurveGroup(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueCB, ui->curveValueSB, ed->curve, firmware->getCapability(HasInputDiff) ? 0 : (HIDE_DIFF | HIDE_NEGATIVE_CURVES)); + curveGroup = new CurveGroup(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueCB, ui->curveValueSB, ed->curve, + firmware->getCapability(HasInputDiff) ? 0 : (HIDE_DIFF | HIDE_NEGATIVE_CURVES)); populateSwitchCB(ui->switchesCB, ed->swtch, generalSettings, MixesContext); @@ -47,14 +48,14 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G } } else { - int mask=1; - for (int i=0; i<9 ; i++) { - if ((ed->flightModes & mask)==0) { + int mask = 1; + for (int i=0; i<9; i++) { + if ((ed->flightModes & mask) == 0) { cb_fp[i]->setChecked(true); } mask <<= 1; } - for (int i=firmware->getCapability(FlightModes); i<9;i++) { + for (int i=firmware->getCapability(FlightModes); i<9; i++) { lb_fp[i]->hide(); cb_fp[i]->hide(); } @@ -62,7 +63,8 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G if (firmware->getCapability(VirtualInputs)) { ui->inputName->setMaxLength(4); - populateSourceCB(ui->sourceCB, ed->srcRaw, generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SWITCHES | POPULATE_TRIMS | POPULATE_TELEMETRY); + populateSourceCB(ui->sourceCB, ed->srcRaw, generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES | + POPULATE_SWITCHES | POPULATE_TRIMS | POPULATE_TELEMETRY); ui->sourceCB->removeItem(0); ui->inputName->setValidator(new QRegExpValidator(rx, this)); ui->inputName->setText(inputName); @@ -139,67 +141,68 @@ void ExpoDialog::updateScale() void ExpoDialog::valuesChanged() { - QCheckBox * cb_fp[] = {ui->cb_FP0,ui->cb_FP1,ui->cb_FP2,ui->cb_FP3,ui->cb_FP4,ui->cb_FP5,ui->cb_FP6,ui->cb_FP7,ui->cb_FP8 }; + QCheckBox * cb_fp[] = {ui->cb_FP0,ui->cb_FP1,ui->cb_FP2,ui->cb_FP3,ui->cb_FP4,ui->cb_FP5,ui->cb_FP6,ui->cb_FP7,ui->cb_FP8 }; - RawSource srcRaw = RawSource(ui->sourceCB->itemData(ui->sourceCB->currentIndex()).toInt()); - if (ed->srcRaw != srcRaw) { - ed->srcRaw = srcRaw; - updateScale(); + RawSource srcRaw = RawSource(ui->sourceCB->itemData(ui->sourceCB->currentIndex()).toInt()); + if (ed->srcRaw != srcRaw) { + ed->srcRaw = srcRaw; + updateScale(); + } + + RawSourceRange range = srcRaw.getRange(&model, generalSettings); + ed->scale = round(float(ui->scale->value()) / range.step); + ed->carryTrim = 1 - ui->trimCB->currentIndex(); + ed->swtch = RawSwitch(ui->switchesCB->itemData(ui->switchesCB->currentIndex()).toInt()); + ed->mode = ui->sideCB->currentIndex() + 1; + + strcpy(ed->name, ui->lineName->text().toAscii().data()); + if (firmware->getCapability(VirtualInputs)) { + inputName = ui->inputName->text(); + } + + ed->flightModes = 0; + for (int i=8; i>=0 ; i--) { + if (!cb_fp[i]->checkState()) { + ed->flightModes++; } - - RawSourceRange range = srcRaw.getRange(&model, generalSettings); - ed->scale = round(float(ui->scale->value()) / range.step); - ed->carryTrim = 1 - ui->trimCB->currentIndex(); - ed->swtch = RawSwitch(ui->switchesCB->itemData(ui->switchesCB->currentIndex()).toInt()); - ed->mode = ui->sideCB->currentIndex() + 1; - - strcpy(ed->name, ui->lineName->text().toAscii().data()); - if (firmware->getCapability(VirtualInputs)) - inputName = ui->inputName->text(); - - ed->flightModes=0; - for (int i=8; i>=0 ; i--) { - if (!cb_fp[i]->checkState()) { - ed->flightModes+=1; + ed->flightModes <<= 1; + } + ed->flightModes >>= 1; + if (firmware->getCapability(FlightModes)) { + int zeros = 0; + int ones = 0; + int phtemp = ed->flightModes; + for (int i=0; igetCapability(FlightModes); i++) { + if (phtemp & 1) { + ones++; } - ed->flightModes<<=1; + else { + zeros++; + } + phtemp >>= 1; } - ed->flightModes>>=1; - if (firmware->getCapability(FlightModes)) { - int zeros=0; - int ones=0; - int phtemp=ed->flightModes; + if (zeros == 1) { + phtemp=ed->flightModes; + for (int i=0; igetCapability(FlightModes); i++) { + if ((phtemp & 1) == 0) { + break; + } + phtemp >>= 1; + } + } + else if (ones == 1) { + phtemp = ed->flightModes; for (int i=0; igetCapability(FlightModes); i++) { if (phtemp & 1) { - ones++; - } - else { - zeros++; - } - phtemp >>=1; - } - if (zeros==1) { - phtemp=ed->flightModes; - for (int i=0; igetCapability(FlightModes); i++) { - if ((phtemp & 1)==0) { - break; - } - phtemp >>=1; - } - } - else if (ones==1) { - phtemp=ed->flightModes; - for (int i=0; igetCapability(FlightModes); i++) { - if (phtemp & 1) { - break; - } - phtemp >>=1; + break; } + phtemp >>= 1; } } - else { - ed->flightModes=0; - } + } + else { + ed->flightModes = 0; + } } void ExpoDialog::shrink() diff --git a/companion/src/modeledit/mixerdialog.cpp b/companion/src/modeledit/mixerdialog.cpp index d32abd948..fcebdb6a8 100644 --- a/companion/src/modeledit/mixerdialog.cpp +++ b/companion/src/modeledit/mixerdialog.cpp @@ -19,16 +19,18 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData *mixdata, G this->setWindowTitle(tr("DEST -> CH%1").arg(md->destCh)); - populateSourceCB(ui->sourceCB, md->srcRaw, generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SCRIPT_OUTPUTS | POPULATE_VIRTUAL_INPUTS | POPULATE_SWITCHES | POPULATE_TRIMS); + populateSourceCB(ui->sourceCB, md->srcRaw, generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SCRIPT_OUTPUTS | + POPULATE_VIRTUAL_INPUTS | POPULATE_SWITCHES | POPULATE_TRIMS); ui->sourceCB->removeItem(0); int limit = firmware->getCapability(OffsetWeight); gvWeightGroup = new GVarGroup(ui->weightGV, ui->weightSB, ui->weightCB, md->weight, 100, -limit, limit); gvOffsetGroup = new GVarGroup(ui->offsetGV, ui->offsetSB, ui->offsetCB, md->sOffset, 0, -limit, limit); - curveGroup = new CurveGroup(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueCB, ui->curveValueSB, md->curve, firmware->getCapability(HasMixerExpo) ? 0 : HIDE_EXPO); + curveGroup = new CurveGroup(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueCB, ui->curveValueSB, + md->curve, firmware->getCapability(HasMixerExpo) ? 0 : HIDE_EXPO); - ui->MixDR_CB->setChecked(md->noExpo==0); + ui->MixDR_CB->setChecked(md->noExpo == 0); if (!firmware->getCapability(HasNoExpo)) { ui->MixDR_CB->hide(); @@ -63,14 +65,14 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData *mixdata, G } } else { - int mask=1; + int mask = 1; for (int i=0; i<9 ; i++) { - if ((md->flightModes & mask)==0) { + if ((md->flightModes & mask) == 0) { cb_fp[i]->setChecked(true); } mask <<= 1; } - for (int i=firmware->getCapability(FlightModes); i<9;i++) { + for (int i=firmware->getCapability(FlightModes); i<9; i++) { lb_fp[i]->hide(); cb_fp[i]->hide(); } @@ -149,29 +151,26 @@ void MixerDialog::valuesChanged() ui->label_MixDR->setEnabled(drVisible); } md->carryTrim = -(ui->trimCB->currentIndex()-1); - md->noExpo = ui->MixDR_CB->checkState() ? 0 : 1; + md->noExpo = ui->MixDR_CB->checkState() ? 0 : 1; md->swtch = RawSwitch(ui->switchesCB->itemData(ui->switchesCB->currentIndex()).toInt()); md->mixWarn = ui->warningCB->currentIndex(); md->mltpx = (MltpxValue)ui->mltpxCB->currentIndex(); - int scale=firmware->getCapability(SlowScale); + int scale = firmware->getCapability(SlowScale); md->delayDown = round(ui->delayDownSB->value()*scale); md->delayUp = round(ui->delayUpSB->value()*scale); md->speedDown = round(ui->slowDownSB->value()*scale); md->speedUp = round(ui->slowUpSB->value()*scale); - int i=0; - for (i=0; imixerName->text().toAscii().length(); i++) { - md->name[i]=ui->mixerName->text().toAscii().at(i); - } - md->name[i]=0; - md->flightModes=0; + strcpy(md->name, ui->mixerName->text().toAscii()); + + md->flightModes = 0; for (int i=8; i>=0 ; i--) { if (!cb_fp[i]->checkState()) { - md->flightModes+=1; + md->flightModes++; } - md->flightModes<<=1; + md->flightModes <<= 1; } - md->flightModes>>=1; + md->flightModes >>= 1; lock = false; } diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index 0ae049ad2..787bca608 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -48,17 +48,15 @@ void MixesPanel::update() { // curDest -> destination channel // i -> mixer number - QByteArray qba; MixerlistWidget->clear(); firstLine = true; unsigned int curDest = 0; - int i; unsigned int outputs = firmware->getCapability(Outputs); - for (i=0; igetCapability(Mixes); i++) { + for (int i=0; igetCapability(Mixes); i++) { MixData & mix = model->mixData[i]; // qDebug() << "mix.destCh: " << mix.destCh; - if (mix.destCh==0 || mix.destCh>outputs) continue; + if (mix.destCh == 0 || mix.destCh>outputs) continue; QString str = ""; while (curDest < mix.destCh-1) { curDest++; @@ -155,146 +153,147 @@ QString MixesPanel::getMixerText(int dest, bool * new_ch) bool MixesPanel::gm_insertMix(int idx) { - if (idx<0 || idx>=firmware->getCapability(Mixes) || model->mixData[firmware->getCapability(Mixes)-1].destCh > 0) { - QMessageBox::information(this, "companion", tr("Not enough available mixers!")); - return false; - } + if (idx < 0 || idx >= firmware->getCapability(Mixes) || model->mixData[firmware->getCapability(Mixes)-1].destCh > 0) { + QMessageBox::information(this, "companion", tr("Not enough available mixers!")); + return false; + } - int i = model->mixData[idx].destCh; - memmove(&model->mixData[idx+1],&model->mixData[idx], - (firmware->getCapability(Mixes)-(idx+1))*sizeof(MixData) ); - memset(&model->mixData[idx],0,sizeof(MixData)); - model->mixData[idx].srcRaw = RawSource(SOURCE_TYPE_NONE); - model->mixData[idx].destCh = i; - model->mixData[idx].weight = 100; - return true; + int i = model->mixData[idx].destCh; + memmove(&model->mixData[idx+1], &model->mixData[idx], + (firmware->getCapability(Mixes)-(idx+1)) * sizeof(MixData) ); + memset(&model->mixData[idx], 0, sizeof(MixData)); + model->mixData[idx].srcRaw = RawSource(SOURCE_TYPE_NONE); + model->mixData[idx].destCh = i; + model->mixData[idx].weight = 100; + return true; } void MixesPanel::gm_deleteMix(int index) { - memmove(&model->mixData[index],&model->mixData[index+1], - (firmware->getCapability(Mixes)-(index+1))*sizeof(MixData)); - memset(&model->mixData[firmware->getCapability(Mixes)-1],0,sizeof(MixData)); + memmove(&model->mixData[index], &model->mixData[index+1], + (firmware->getCapability(Mixes)-(index+1)) * sizeof(MixData)); + memset(&model->mixData[firmware->getCapability(Mixes)-1], 0, sizeof(MixData)); } void MixesPanel::gm_openMix(int index) { - if(index<0 || index>=firmware->getCapability(Mixes)) return; + if(index < 0 || index>=firmware->getCapability(Mixes)) return; - MixData mixd(model->mixData[index]); + MixData mixd(model->mixData[index]); + emit modified(); + update(); + + MixerDialog *g = new MixerDialog(this, *model, &mixd, generalSettings, firmware); + if(g->exec()) { + model->mixData[index] = mixd; emit modified(); update(); - - MixerDialog *g = new MixerDialog(this, *model, &mixd, generalSettings, firmware); - if(g->exec()) { - model->mixData[index] = mixd; - emit modified(); - update(); - } else { - if (mixInserted) { - gm_deleteMix(index); - } - mixInserted=false; - emit modified(); - update(); + } + else { + if (mixInserted) { + gm_deleteMix(index); } + mixInserted = false; + emit modified(); + update(); + } } int MixesPanel::getMixerIndex(unsigned int dch) { - int i = 0; - while ((model->mixData[i].destCh<=dch) && (model->mixData[i].destCh) && (igetCapability(Mixes))) i++; - if(i==firmware->getCapability(Mixes)) return -1; - return i; + int i = 0; + while ((model->mixData[i].destCh <= dch) && (model->mixData[i].destCh) && (i < firmware->getCapability(Mixes))) i++; + if (i == firmware->getCapability(Mixes)) return -1; + return i; } void MixesPanel::mixerlistWidget_doubleClicked(QModelIndex index) { - int idx= MixerlistWidget->item(index.row())->data(Qt::UserRole).toByteArray().at(0); - if (idx<0) { - int i = -idx; - idx = getMixerIndex(i); //get mixer index to insert - if (!gm_insertMix(idx)) - return; - model->mixData[idx].destCh = i; - mixInserted=true; - } else { - mixInserted=false; - } - gm_openMix(idx); + int idx = MixerlistWidget->item(index.row())->data(Qt::UserRole).toByteArray().at(0); + if (idx<0) { + int i = -idx; + idx = getMixerIndex(i); //get mixer index to insert + if (!gm_insertMix(idx)) return; + model->mixData[idx].destCh = i; + mixInserted = true; + } + else { + mixInserted = false; + } + gm_openMix(idx); } void MixesPanel::mixersDeleteList(QList list) { - qSort(list.begin(), list.end()); + qSort(list.begin(), list.end()); - int iDec = 0; - foreach(int idx, list) { - gm_deleteMix(idx-iDec); - iDec++; - } + int iDec = 0; + foreach(int idx, list) { + gm_deleteMix(idx - iDec); + iDec++; + } } QList MixesPanel::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 list; + foreach(QListWidgetItem *item, MixerlistWidget->selectedItems()) { + int idx= item->data(Qt::UserRole).toByteArray().at(0); + if(idx >= 0 && idxgetCapability(Mixes)) list << idx; + } + return list; } // TODO duplicated code void MixesPanel::setSelectedByMixList(QList 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); + 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 MixesPanel::mixersDelete(bool ask) { - QList list = createMixListFromSelected(); - if(list.isEmpty()) return; + QList list = createMixListFromSelected(); + if(list.isEmpty()) return; - QMessageBox::StandardButton ret = QMessageBox::No; + QMessageBox::StandardButton ret = QMessageBox::No; - if(ask) - ret = QMessageBox::warning(this, "companion", - tr("Delete Selected Mixes?"), - QMessageBox::Yes | QMessageBox::No); + if(ask) { + ret = QMessageBox::warning(this, "companion", + tr("Delete Selected Mixes?"), + QMessageBox::Yes | QMessageBox::No); + } - - if ((ret == QMessageBox::Yes) || (!ask)) { - mixersDeleteList(list); - emit modified(); - update(); - } + if ((ret == QMessageBox::Yes) || (!ask)) { + mixersDeleteList(list); + emit modified(); + update(); + } } void MixesPanel::mixersCut() { - mixersCopy(); - mixersDelete(false); + mixersCopy(); + mixersDelete(false); } void MixesPanel::mixersCopy() { + QList list = createMixListFromSelected(); - QList list = createMixListFromSelected(); + QByteArray mxData; + foreach(int idx, list) { + mxData.append((char*)&model->mixData[idx], sizeof(MixData)); + } - QByteArray mxData; - foreach(int idx, list) { - mxData.append((char*)&model->mixData[idx],sizeof(MixData)); - } - - QMimeData *mimeData = new QMimeData; - mimeData->setData("application/x-companion-mix", mxData); - QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard); + QMimeData *mimeData = new QMimeData; + mimeData->setData("application/x-companion-mix", mxData); + QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard); } void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) @@ -318,9 +317,8 @@ void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) while (i < mxData.size()) { idx++; if (idx == firmware->getCapability(Mixes)) break; + if (!gm_insertMix(idx)) break; - if (!gm_insertMix(idx)) - break; MixData * md = &model->mixData[idx]; memcpy(md, mxData.mid(i, sizeof(MixData)).constData(), sizeof(MixData)); md->destCh = dch; @@ -335,34 +333,35 @@ void MixesPanel::pasteMixerMimeData(const QMimeData * mimeData, int destIdx) void MixesPanel::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)); + 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 MixesPanel::mixersDuplicate() { - mixersCopy(); - mixersPaste(); + mixersCopy(); + mixersPaste(); } void MixesPanel::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; - model->mixData[idx].destCh = i; - mixInserted=true; - } else { - mixInserted=false; - } + 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; + model->mixData[idx].destCh = i; + mixInserted = true; + } + else { + mixInserted = false; + } - gm_openMix(idx); + gm_openMix(idx); } void MixesPanel::mixerHighlight() @@ -385,135 +384,137 @@ void MixesPanel::mixerHighlight() void MixesPanel::mixerAdd() { - if (!MixerlistWidget->currentItem()) - return; - int index = MixerlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); + if (!MixerlistWidget->currentItem()) return; - 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; - model->mixData[index].destCh = i; - mixInserted=true; - } else { - index++; - if (!gm_insertMix(index)) - return; - model->mixData[index].destCh = model->mixData[index-1].destCh; - mixInserted=true; - } - gm_openMix(index); + 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; + model->mixData[index].destCh = i; + mixInserted = true; + } + else { + index++; + if (!gm_insertMix(index)) return; + model->mixData[index].destCh = model->mixData[index-1].destCh; + mixInserted = true; + } + gm_openMix(index); } void MixesPanel::mixerlistWidget_customContextMenuRequested(QPoint pos) { - QPoint globalPos = MixerlistWidget->mapToGlobal(pos); + QPoint globalPos = MixerlistWidget->mapToGlobal(pos); - const QClipboard *clipboard = QApplication::clipboard(); - const QMimeData *mimeData = clipboard->mimeData(); - bool hasData = mimeData->hasFormat("application/x-companion-mix"); + const QClipboard *clipboard = QApplication::clipboard(); + const QMimeData *mimeData = clipboard->mimeData(); + bool hasData = mimeData->hasFormat("application/x-companion-mix"); - QMenu contextMenu; - contextMenu.addAction(CompanionIcon("add.png"), tr("&Add"),this,SLOT(mixerAdd()),tr("Ctrl+A")); - contextMenu.addAction(CompanionIcon("edit.png"), tr("&Edit"),this,SLOT(mixerOpen()),tr("Enter")); - contextMenu.addAction(CompanionIcon("fuses.png"), tr("&Toggle highlight"),this,SLOT(mixerHighlight()),tr("Ctrl+T")); - contextMenu.addSeparator(); - contextMenu.addAction(CompanionIcon("clear.png"), tr("&Delete"),this,SLOT(mixersDelete()),tr("Delete")); - contextMenu.addAction(CompanionIcon("copy.png"), tr("&Copy"),this,SLOT(mixersCopy()),tr("Ctrl+C")); - contextMenu.addAction(CompanionIcon("cut.png"), tr("C&ut"),this,SLOT(mixersCut()),tr("Ctrl+X")); - contextMenu.addAction(CompanionIcon("paste.png"), tr("&Paste"),this,SLOT(mixersPaste()),tr("Ctrl+V"))->setEnabled(hasData); - contextMenu.addAction(CompanionIcon("duplicate.png"), tr("Du&plicate"),this,SLOT(mixersDuplicate()),tr("Ctrl+U")); - contextMenu.addSeparator(); - contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"),this,SLOT(moveMixUp()),tr("Ctrl+Up")); - contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"),this,SLOT(moveMixDown()),tr("Ctrl+Down")); + QMenu contextMenu; + contextMenu.addAction(CompanionIcon("add.png"), tr("&Add"), this, SLOT(mixerAdd()), tr("Ctrl+A")); + contextMenu.addAction(CompanionIcon("edit.png"), tr("&Edit"), this, SLOT(mixerOpen()), tr("Enter")); + contextMenu.addAction(CompanionIcon("fuses.png"), tr("&Toggle highlight"), this, SLOT(mixerHighlight()), tr("Ctrl+T")); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("clear.png"), tr("&Delete"), this, SLOT(mixersDelete()), tr("Delete")); + contextMenu.addAction(CompanionIcon("copy.png"), tr("&Copy"), this, SLOT(mixersCopy()), tr("Ctrl+C")); + contextMenu.addAction(CompanionIcon("cut.png"), tr("C&ut"), this, SLOT(mixersCut()), tr("Ctrl+X")); + contextMenu.addAction(CompanionIcon("paste.png"), tr("&Paste"), this, SLOT(mixersPaste()), tr("Ctrl+V"))->setEnabled(hasData); + contextMenu.addAction(CompanionIcon("duplicate.png"), tr("Du&plicate"), this, SLOT(mixersDuplicate()), tr("Ctrl+U")); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(moveMixUp()), tr("Ctrl+Up")); + contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(moveMixDown()), tr("Ctrl+Down")); - contextMenu.exec(globalPos); + contextMenu.exec(globalPos); } void MixesPanel::mimeMixerDropped(int index, const QMimeData *data, Qt::DropAction /*action*/) { - int idx= MixerlistWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0); - //qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; - pasteMixerMimeData(data, idx); + int idx= MixerlistWidget->item(index > 0 ? index-1 : 0)->data(Qt::UserRole).toByteArray().at(0); + //qDebug() << "MixesPanel::mimeMixerDropped()" << index << data; + pasteMixerMimeData(data, idx); } void MixesPanel::mixesEdited() { - emit modified(); + emit modified(); } void MixesPanel::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->matches(QKeySequence::AddTab)) mixerHighlight(); + 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->matches(QKeySequence::AddTab)) mixerHighlight(); - 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); + 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); + } } int MixesPanel::gm_moveMix(int idx, bool dir) //true=inc=down false=dec=up { - if(idx>firmware->getCapability(Mixes) || (idx==firmware->getCapability(Mixes) && dir)) return idx; + if(idx > firmware->getCapability(Mixes) || (idx == firmware->getCapability(Mixes) && dir)) return idx; - MixData &src=model->mixData[idx]; + MixData &src=model->mixData[idx]; - if (idx==0 && !dir) { - //special case: topmost mixer moving up - if (src.destCh > 1) src.destCh--; - return idx; - } + if (idx == 0 && !dir) { + //special case: topmost mixer moving up + if (src.destCh > 1) src.destCh--; + return idx; + } - int tdx = dir ? idx+1 : idx-1; - MixData &tgt=model->mixData[tdx]; + int tdx = dir ? idx+1 : idx-1; + MixData & tgt = model->mixData[tdx]; - unsigned int outputs = firmware->getCapability(Outputs); - if((src.destCh==0) || (src.destCh>outputs) || (tgt.destCh>outputs)) return idx; + unsigned int outputs = firmware->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; - } + if (tgt.destCh != src.destCh) { + if (dir && src.destCh < outputs) src.destCh++; + if (!dir && src.destCh > 0) src.destCh--; + return idx; + } - //flip between idx and tgt - MixData temp; - memcpy(&temp,&src,sizeof(MixData)); - memcpy(&src,&tgt,sizeof(MixData)); - memcpy(&tgt,&temp,sizeof(MixData)); - return tdx; + //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 MixesPanel::moveMixUp() { - QList list = createMixListFromSelected(); - QList highlightList; - foreach(int idx, list) { - highlightList << gm_moveMix(idx, false); - } - emit modified(); - update(); - setSelectedByMixList(highlightList); + QList list = createMixListFromSelected(); + QList highlightList; + foreach(int idx, list) { + highlightList << gm_moveMix(idx, false); + } + emit modified(); + update(); + setSelectedByMixList(highlightList); } void MixesPanel::moveMixDown() { - QList list = createMixListFromSelected(); - QList highlightList; - foreach(int idx, list) { - highlightList << gm_moveMix(idx, true); - } - emit modified(); - update(); - setSelectedByMixList(highlightList); + QList list = createMixListFromSelected(); + QList highlightList; + foreach(int idx, list) { + highlightList << gm_moveMix(idx, true); + } + emit modified(); + update(); + setSelectedByMixList(highlightList); } void MixesPanel::clearMixes() From 65bdd25173fe903f9e61dea23cf0045c3987541e Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 23 Aug 2015 15:58:15 +0200 Subject: [PATCH 3/6] Various fixes: modelPrinter free, mixer crash, trims display, channel names, monospace font --- companion/src/modeledit/expodialog.cpp | 7 +++-- companion/src/modeledit/flightmodes.cpp | 6 ++++- companion/src/modeledit/mixerdialog.cpp | 7 +++-- companion/src/modelprinter.cpp | 29 +++++++++++++++----- companion/src/multimodelprinter.cpp | 35 ++++++++++++++++--------- 5 files changed, 56 insertions(+), 28 deletions(-) diff --git a/companion/src/modeledit/expodialog.cpp b/companion/src/modeledit/expodialog.cpp index 7d3e64e03..2e8c2d2cc 100644 --- a/companion/src/modeledit/expodialog.cpp +++ b/companion/src/modeledit/expodialog.cpp @@ -78,10 +78,9 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G ui->trimCB->hide(); } - ui->trimCB->addItem(tr("Rud"), 1); - ui->trimCB->addItem(tr("Ele"), 2); - ui->trimCB->addItem(tr("Thr"), 3); - ui->trimCB->addItem(tr("Ail"), 4); + for(int i=0; i < NUM_STICKS; i++) { + ui->trimCB->addItem(AnalogString(i), i+1); + } ui->trimCB->setCurrentIndex(1 - ed->carryTrim); int expolength = firmware->getCapability(HasExpoNames); diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp index 3fba520c5..20d03a71a 100644 --- a/companion/src/modeledit/flightmodes.cpp +++ b/companion/src/modeledit/flightmodes.cpp @@ -56,7 +56,11 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI } // The trims - QString labels[] = { tr("Rud"), tr("Ele"), tr("Thr"), tr("Ail") }; // TODO is elsewhere for sure + QString labels[NUM_STICKS]; + for(int i=0; i < NUM_STICKS; i++) { + labels[i] = AnalogString(i); + } + trimsLabel << ui->trim1Label << ui->trim2Label << ui->trim3Label << ui->trim4Label; trimsUse << ui->trim1Use << ui->trim2Use << ui->trim3Use << ui->trim4Use; diff --git a/companion/src/modeledit/mixerdialog.cpp b/companion/src/modeledit/mixerdialog.cpp index fcebdb6a8..85e602f11 100644 --- a/companion/src/modeledit/mixerdialog.cpp +++ b/companion/src/modeledit/mixerdialog.cpp @@ -38,10 +38,9 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData *mixdata, G } if (!firmware->getCapability(VirtualInputs)) { - ui->trimCB->addItem(tr("Rud")); - ui->trimCB->addItem(tr("Ele")); - ui->trimCB->addItem(tr("Thr")); - ui->trimCB->addItem(tr("Ail")); + for(int i=0; i < NUM_STICKS; i++) { + ui->trimCB->addItem(AnalogString(i)); + } } ui->trimCB->setCurrentIndex(1 - md->carryTrim); diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 13c9cc956..20f752c63 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -64,7 +64,7 @@ QString ModelPrinter::printOutputName(int idx) return name; } else { - return printChannelName(idx); + return ""; } } @@ -180,7 +180,7 @@ QString ModelPrinter::printTimer(int idx) QString ModelPrinter::printTimer(const TimerData & timer) { QStringList result; - if (firmware->getCapability(TimersName)) + if (firmware->getCapability(TimersName) && timer.name[0]) result += tr("Name(%1)").arg(timer.name); result += tr("%1:%2").arg(timer.val/60, 2, 10, QChar('0')).arg(timer.val%60, 2, 10, QChar('0')); result += timer.mode.toString(); @@ -201,10 +201,25 @@ QString ModelPrinter::printTrim(int flightModeIndex, int stickIndex) { const FlightModeData & fm = model.flightModeData[flightModeIndex]; - if (fm.trimRef[stickIndex] == -1) - return QString("%1").arg(fm.trim[stickIndex]); - else - return tr("FM%1").arg(fm.trimRef[stickIndex]); + if (fm.trimMode[stickIndex] == -1) { + return tr("Off"); + } + else { + if (fm.trimRef[stickIndex] == flightModeIndex) { + return QString("%1").arg(fm.trim[stickIndex]); + } + else { + if (fm.trimMode[stickIndex] == 0) { + return tr("FM%1").arg(fm.trimRef[stickIndex]); + } + else { + if (fm.trim[stickIndex] < 0) + return tr("FM%1%2").arg(fm.trimRef[stickIndex]).arg(fm.trim[stickIndex]); + else + return tr("FM%1+%2").arg(fm.trimRef[stickIndex]).arg(fm.trim[stickIndex]); + } + } + } } QString ModelPrinter::printGlobalVar(int flightModeIndex, int gvarIndex) @@ -295,7 +310,7 @@ QString ModelPrinter::printInputLine(const ExpoData & input) QString ModelPrinter::printMixerName(int curDest) { - QString str = printChannelName(curDest) + " "; + QString str = printChannelName(curDest-1) + " "; if (firmware->getCapability(HasChNames)) { QString name = model.limitData[curDest-1].name; if (!name.isEmpty()) { diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp index 6736d9348..963aeb4a2 100644 --- a/companion/src/multimodelprinter.cpp +++ b/companion/src/multimodelprinter.cpp @@ -84,8 +84,8 @@ bool MultiModelPrinter::MultiColumns::isEmpty() for (int cc=0; ccgetCapability(FlightModes)) str += printFlightModes(); @@ -182,10 +192,8 @@ QString MultiModelPrinter::printFlightModes() columns.append("" + tr("Switch") + ""); columns.append("" + tr("Fade IN") + ""); columns.append("" + tr("Fade OUT") + ""); - for (int i=0; i<4; i++) { - columns.append(""); - COMPARE(modelPrinter->printInputName(i)); - columns.append(""); + for (int i=0; i" + AnalogString(i) + " trim"); } columns.append(""); @@ -199,7 +207,7 @@ QString MultiModelPrinter::printFlightModes() columns.append(""); COMPARE(model->flightModeData[i].fadeOut); columns.append(""); - for (int k=0; k<4; k++) { + for (int k=0; k"); COMPARE(modelPrinter->printTrim(i, k)); columns.append(""); @@ -259,14 +267,17 @@ QString MultiModelPrinter::printLimits() MultiColumns columns(models.size()); columns.append("" \ "" \ - " " \ + " " \ + " " \ " " \ " " \ " " \ " " \ ""); for (int i=0; igetCapability(Outputs); i++) { - columns.append(""); } From a1a50041dd78bda8fe61dbaabc29d1936117d2a7 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 23 Aug 2015 21:03:48 +0200 Subject: [PATCH 4/6] Flight mode representation reverted back --- companion/src/modelprinter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 20f752c63..349f37c94 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -391,7 +391,7 @@ QString ModelPrinter::printFlightModeName(int index) { const FlightModeData & fm = model.flightModeData[index]; if (strlen(fm.name) > 0) { - return tr("FM%1 \"%2\"").arg(index).arg(fm.name); + return tr("%1").arg(fm.name); } else { return tr("FM%1").arg(index); From 2530caa16e100e2efe01720c00e803806822004e Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 23 Aug 2015 21:10:49 +0200 Subject: [PATCH 5/6] Flight mode representation reverted back (additional fix), unneeded condition removed --- companion/src/modelprinter.cpp | 2 +- companion/src/multimodelprinter.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 349f37c94..9b029c290 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -391,7 +391,7 @@ QString ModelPrinter::printFlightModeName(int index) { const FlightModeData & fm = model.flightModeData[index]; if (strlen(fm.name) > 0) { - return tr("%1").arg(fm.name); + return QString("%1").arg(fm.name); } else { return tr("FM%1").arg(index); diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp index 963aeb4a2..4ff6b52dc 100644 --- a/companion/src/multimodelprinter.cpp +++ b/companion/src/multimodelprinter.cpp @@ -102,7 +102,7 @@ MultiModelPrinter::MultiModelPrinter(Firmware * firmware): MultiModelPrinter::~MultiModelPrinter() { for(int i=0; i Date: Sun, 23 Aug 2015 22:17:27 +0200 Subject: [PATCH 6/6] Fixes #2576: display receiver number in model print/compare --- companion/src/modelprinter.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 9b029c290..d091422cc 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -112,8 +112,13 @@ QString ModelPrinter::printModule(int idx) return printModuleProtocol(module.protocol); else if (module.protocol == PPM) return tr("%1, Channels(%2-%3), PPM delay(%4usec), Pulse polarity(%5)").arg(printModuleProtocol(module.protocol)).arg(module.channelsStart+1).arg(module.channelsStart+module.channelsCount).arg(module.ppmDelay).arg(module.polarityToString()); - else - return tr("%1, Channels(%2-%3)").arg(printModuleProtocol(module.protocol)).arg(module.channelsStart+1).arg(module.channelsStart+module.channelsCount); + else { + QString result = tr("%1, Channels(%2-%3)").arg(printModuleProtocol(module.protocol)).arg(module.channelsStart+1).arg(module.channelsStart+module.channelsCount); + if (module.protocol != PXX_XJT_D8) { + result += " " + tr("Receiver number(%1)").arg(module.modelId); + } + return result; + } } QString ModelPrinter::printTrainerMode()
" + (firmware->getCapability(HasChNames) ? tr("Name") : "") + "" + tr("Channel") + "" + (firmware->getCapability(HasChNames) ? tr("Name") : "") + "" + tr("Offset") + "" + tr("Min") + "" + tr("Max") + "" + tr("Invert") + "
"); + columns.append("
"); + COMPARE(modelPrinter->printChannelName(i)); + columns.append(""); COMPARE(modelPrinter->printOutputName(i)); columns.append(""); COMPARE(model->limitData[i].offsetToString()); @@ -341,12 +352,12 @@ QString MultiModelPrinter::printMixers() } if (count > 0) { columns.append("
"); - COMPARE(modelPrinter->printChannelName(i)); + COMPARE(modelPrinter->printMixerName(i+1)); columns.append(""); for (int j=0; j 0) columns.append("
"); - COMPARE(modelPrinter->printMixerLine(*model->mixes(i)[j])); + COMPARE((j < model->mixes(i).size()) ? modelPrinter->printMixerLine(*model->mixes(i)[j]) : " "); } columns.append("