/* * Copyright (C) OpenTX * * Based on code named * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #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() { for(int i=0; iclear(); QString str = ""; str += printSetup(); if (firmware->getCapability(Heli)) str += printHeliSetup(); if (firmware->getCapability(FlightModes)) str += printFlightModes(); str += printInputs(); str += printMixers(); str += printLimits(); str += printCurves(document); 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::printHeliSetup() { bool heliEnabled = false; for (int k=0; kswashRingData.type != HELI_SWASH_TYPE_NONE; } if (!heliEnabled) return ""; QString str = printTitle(tr("Helicopter Setup")); MultiColumns columns(models.size()); columns.appendTitle (tr("Swash Type:")); COMPARE(modelPrinter->printHeliSwashType()); columns.append ("
"); columns.appendTitle (tr("Swash Ring:")); COMPARE(model->swashRingData.value); columns.append (""); columns.append(""); columns.append(""); columns.append(""); columns.append(""); columns.append(""); columns.append(""); columns.append("
" + tr("Input") + "" + tr("Weight") + "
" + tr("Long. cyc") + ""); COMPARE(model->swashRingData.elevatorSource.toString(model)); columns.append(""); COMPARE(model->swashRingData.elevatorWeight) columns.append("
" + tr("Lateral cyc") + ""); COMPARE(model->swashRingData.aileronSource.toString(model)); columns.append(""); COMPARE(model->swashRingData.aileronWeight) columns.append("
" + tr("Collective") + ""); COMPARE(model->swashRingData.collectiveSource.toString(model)); columns.append(""); COMPARE(model->swashRingData.collectiveWeight) columns.append("
"); 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"); COMPARE(modelPrinter->printTrim(i, k)); columns.append(""); } columns.append(""); } columns.append("
" + tr("Flight mode") + "" + tr("Switch") + "" + tr("Fade IN") + "" + tr("Fade OUT") + "" + getCurrentFirmware()->getAnalogInputName(i) + " trim
" + 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("
"); 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("
" + tr("Channel") + "" + (firmware->getCapability(ChannelsName) > 0 ? tr("Name") : "") + "" + tr("Offset") + "" + tr("Min") + "" + tr("Max") + "" + tr("Invert") + "
"); COMPARE(modelPrinter->printChannelName(i)); columns.append(""); 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(QTextDocument * document) { QString str; MultiColumns columns(models.size()); int count = 0; columns.append("
"); COMPARE(modelPrinter->printMixerName(i+1)); columns.append(""); for (int j=0; j 0) columns.append("
"); COMPARE((j < model->mixes(i).size()) ? modelPrinter->printMixerLine(*model->mixes(i)[j], (j>0)) : " "); } 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, document))); 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") : "") + ""); if (IS_HORUS_OR_TARANIS(getCurrentBoard())) { COMPARE(i==0 ? tr("Low Alarm") : tr("Critical Alarm")); } else { 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; }