mirror of
https://github.com/opentx/opentx.git
synced 2025-07-16 12:55:12 +03:00
PrintDialog / CompareDialog refactoring
This commit is contained in:
parent
3075ad857e
commit
ed05174fc8
36 changed files with 1391 additions and 2260 deletions
|
@ -158,6 +158,7 @@ set(companion_SRCS
|
|||
apppreferencesdialog.cpp
|
||||
fwpreferencesdialog.cpp
|
||||
burnconfigdialog.cpp
|
||||
multimodelprinter.cpp
|
||||
comparedialog.cpp
|
||||
contributorsdialog.cpp
|
||||
releasenotesdialog.cpp
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,11 +1,9 @@
|
|||
#ifndef COMPAREDIALOG_H
|
||||
#define COMPAREDIALOG_H
|
||||
#ifndef _COMPAREDIALOG_H
|
||||
#define _COMPAREDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QtGui>
|
||||
#include <QDir>
|
||||
#include "eeprominterface.h"
|
||||
#include "modelprinter.h"
|
||||
#include <QLabel>
|
||||
#include "multimodelprinter.h"
|
||||
|
||||
namespace Ui {
|
||||
class CompareDialog;
|
||||
|
@ -18,79 +16,27 @@ class CompareDialog : public QDialog
|
|||
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;
|
||||
Ui::CompareDialog * ui;
|
||||
|
||||
private:
|
||||
void closeEvent(QCloseEvent *event);
|
||||
Ui::CompareDialog *ui;
|
||||
template<class T> QString getColor1(T val1, T val2) {
|
||||
if (val1!=val2)
|
||||
return "green";
|
||||
else
|
||||
return "grey";
|
||||
}
|
||||
template<class T> 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);
|
||||
|
||||
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
|
||||
|
|
|
@ -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<count; i++) {
|
||||
if (points[i].y != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
QString LimitData::minToString() const
|
||||
{
|
||||
return QString::number((qreal)min/10);
|
||||
}
|
||||
|
||||
QString LimitData::maxToString()
|
||||
QString LimitData::maxToString() const
|
||||
{
|
||||
return QString::number((qreal)max/10);
|
||||
}
|
||||
|
||||
QString LimitData::offsetToString()
|
||||
QString LimitData::revertToString() const
|
||||
{
|
||||
return revert ? QObject::tr("INV") : QObject::tr("NOR");
|
||||
}
|
||||
|
||||
QString LimitData::offsetToString() const
|
||||
{
|
||||
return QString::number((qreal)offset/10, 'f', 1);
|
||||
}
|
||||
|
@ -1262,6 +1288,52 @@ bool ModelData::isInputValid(const unsigned int idx) const
|
|||
return false;
|
||||
}
|
||||
|
||||
bool ModelData::hasExpos(uint8_t inputIdx) const
|
||||
{
|
||||
for (int i=0; i<C9X_MAX_EXPOS; i++) {
|
||||
const ExpoData & expo = expoData[i];
|
||||
if (expo.chn==inputIdx && expo.mode!=0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ModelData::hasMixes(uint8_t channelIdx) const
|
||||
{
|
||||
channelIdx += 1;
|
||||
for (int i=0; i<C9X_MAX_MIXERS; i++) {
|
||||
if (mixData[i].destCh == channelIdx) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QVector<const ExpoData *> ModelData::expos(int input) const
|
||||
{
|
||||
QVector<const ExpoData *> result;
|
||||
for (int i=0; i<C9X_MAX_EXPOS; i++) {
|
||||
const ExpoData * ed = &expoData[i];
|
||||
if ((int)ed->chn==input && ed->mode!=0) {
|
||||
result << ed;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
QVector<const MixData *> ModelData::mixes(int channel) const
|
||||
{
|
||||
QVector<const MixData *> result;
|
||||
for (int i=0; i<C9X_MAX_MIXERS; i++) {
|
||||
const MixData * md = &mixData[i];
|
||||
if ((int)md->destCh == 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;
|
||||
}
|
||||
|
|
|
@ -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<const ExpoData *> expos(int input) const;
|
||||
QVector<const MixData *> 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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; i<NUM_STICKS; i++) {
|
||||
for (int j=0; j<64; j++) {
|
||||
ExpoData * expo = &modelData.expoData[j];
|
||||
if (expo->mode == 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);
|
||||
|
|
|
@ -414,7 +414,7 @@ int OpenTxEepromInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t
|
|||
}
|
||||
|
||||
for (int i=0; i<getMaxModels(); i++) {
|
||||
if (!radioData.models[i].isempty()) {
|
||||
if (!radioData.models[i].isEmpty()) {
|
||||
result = saveModel<OpenTxModelData>(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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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('/');
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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; i<firmware->getCapability(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; i<firmware->getCapability(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; i<firmware->getCapability(FlightModes); i++) {
|
||||
if (phtemp & 1) {
|
||||
break;
|
||||
|
@ -198,7 +198,7 @@ void ExpoDialog::valuesChanged()
|
|||
}
|
||||
}
|
||||
else {
|
||||
ed->phases=0;
|
||||
ed->flightModes=0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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; i<firmware->getCapability(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 = "<b>" + str + "</b>";
|
||||
}
|
||||
}
|
||||
|
@ -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(i<mxData.size()) {
|
||||
while (i < mxData.size()) {
|
||||
idx++;
|
||||
if(idx==firmware->getCapability(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);
|
||||
}
|
||||
|
|
|
@ -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; i<PROTO_LAST; i++) {
|
||||
if (GetEepromInterface()->isAvailable((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; i<channels; i++) {
|
||||
ui->throttleSource->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);
|
||||
}
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
||||
if (!(firmware->getCapability(Telemetry) & TM_HASOFFSET)) {
|
||||
ui->CalibSB->hide();
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "helpers.h"
|
||||
#include "modelprinter.h"
|
||||
#include <QPainter>
|
||||
|
||||
QString changeColor(const QString & input, const QString & to, const QString & from)
|
||||
{
|
||||
|
@ -7,14 +8,20 @@ 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)
|
||||
{
|
||||
QFile file("foo.html");
|
||||
|
@ -40,67 +47,257 @@ QString addFont(const QString & input, const QString & color, const QString & si
|
|||
return "<font " + sizeStr + " " + faceStr + " " + colorStr + ">" + input + "</font>";
|
||||
}
|
||||
|
||||
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;
|
||||
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 (GetCurrentFirmware()->getCapability(VirtualInputs)) {
|
||||
if (strlen(g_model->inputNames[idx]) > 0) {
|
||||
result = QObject::tr("[I%1]").arg(idx+1);
|
||||
result += QString(g_model->inputNames[idx]);
|
||||
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 = "<b>" + source + "</b>";
|
||||
}
|
||||
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 (index == 0)
|
||||
return "---";
|
||||
else if (index > 0) {
|
||||
return printFlightModeName(index-1);
|
||||
}
|
||||
else {
|
||||
return "!" + printFlightModeName(-index-1);
|
||||
}
|
||||
}
|
||||
|
||||
if (numphases && phases) {
|
||||
QString str;
|
||||
int count = 0;
|
||||
if (phases == (unsigned int)(1<<numphases) - 1) {
|
||||
str = " ### " + QObject::tr("DISABLED") + " ### ";
|
||||
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);
|
||||
}
|
||||
// if (phases) {
|
||||
for (int i=0; i<numphases; i++) {
|
||||
if (!(phases & (1<<i))) {
|
||||
if (count++ > 0) str += QString(", ");
|
||||
str += getPhaseName(i+1, g_model->flightModeData[i].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<<numFlightModes) - 1) {
|
||||
return tr("Disabled in all flight modes");
|
||||
}
|
||||
else {
|
||||
QStringList list;
|
||||
for (int i=0; i<numFlightModes; i++) {
|
||||
if (!(flightModes & (1<<i))) {
|
||||
list << printFlightModeName(i);
|
||||
}
|
||||
}
|
||||
// }
|
||||
if (count > 1)
|
||||
return QObject::tr("Flight modes") + QString("(%1)").arg(str);
|
||||
if (list.size() > 1)
|
||||
return tr("Flight modes(%1)").arg(list.join(", "));
|
||||
else
|
||||
return QObject::tr("Flight mode") + QString("(%1)").arg(str);
|
||||
return tr("Flight mode(%1)").arg(list.join(", "));
|
||||
}
|
||||
return "";
|
||||
}
|
||||
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; j<curve.count; j++) {
|
||||
if (j != 0)
|
||||
result += ", ";
|
||||
result += QString("(%1, %2)").arg(curve.points[j].x).arg(curve.points[j].y);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (int j=0; j<curve.count; j++) {
|
||||
if (j != 0)
|
||||
result += ", ";
|
||||
result += QString("%1").arg(curve.points[j].y);
|
||||
}
|
||||
}
|
||||
result += "]";
|
||||
return result;
|
||||
}
|
||||
|
||||
CurveImage::CurveImage():
|
||||
size(200),
|
||||
image(size+1, size+1, QImage::Format_RGB32),
|
||||
painter(&image)
|
||||
{
|
||||
painter.setBrush(QBrush("#FFFFFF"));
|
||||
painter.setPen(QColor(0, 0, 0));
|
||||
painter.drawRect(0, 0, size, size);
|
||||
|
||||
painter.setPen(QColor(0, 0, 0));
|
||||
painter.drawLine(0, size/2, size, size/2);
|
||||
painter.drawLine(size/2, 0, size/2, size);
|
||||
for (int i=0; i<21; i++) {
|
||||
painter.drawLine(size/2-5, (size*i)/(20), size/2+5, (size*i)/(20));
|
||||
painter.drawLine((size*i)/(20), size/2-5, (size*i)/(20), size/2+5);
|
||||
}
|
||||
}
|
||||
|
||||
void CurveImage::drawCurve(const CurveData & curve, QColor color)
|
||||
{
|
||||
painter.setPen(QPen(color, 2, Qt::SolidLine));
|
||||
for (int j=1; j<curve.count; j++) {
|
||||
if (curve.type == CurveData::CURVE_TYPE_CUSTOM)
|
||||
painter.drawLine(size/2+(size*curve.points[j-1].x)/200, size/2-(size*curve.points[j-1].y)/200, size/2+(size*curve.points[j].x)/200, size/2-(size*curve.points[j].y)/200);
|
||||
else
|
||||
painter.drawLine(size*(j-1)/(curve.count-1), size/2-(size*curve.points[j-1].y)/200, size*(j)/(curve.count-1), size/2-(size*curve.points[j].y)/200);
|
||||
}
|
||||
}
|
||||
|
||||
void CurveImage::save(const QString & filename)
|
||||
{
|
||||
image.save(filename, "png", 100);
|
||||
}
|
||||
|
||||
QString ModelPrinter::createCurveImage(int idx)
|
||||
{
|
||||
CurveImage image;
|
||||
image.drawCurve(model.curves[idx], colors[idx]);
|
||||
QString filename = generateProcessUniqueTempFileName(QString("curve-%1-%2.png").arg((uint64_t)this).arg(idx));
|
||||
image.save(filename);
|
||||
curvefiles << filename;
|
||||
return filename;
|
||||
}
|
||||
|
||||
QString ModelPrinter::createCurvesImage()
|
||||
{
|
||||
CurveImage image;
|
||||
for (int idx=0; idx<firmware->getCapability(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;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
#ifndef MODELPRINTER_H
|
||||
#define MODELPRINTER_H
|
||||
#ifndef _MODELPRINTER_H_
|
||||
#define _MODELPRINTER_H_
|
||||
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QPainter>
|
||||
#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() {};
|
||||
public:
|
||||
CurveImage();
|
||||
void drawCurve(const CurveData & curve, QColor color);
|
||||
void save(const QString & filename);
|
||||
|
||||
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);
|
||||
|
||||
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
|
||||
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_
|
||||
|
|
|
@ -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(i<GetEepromInterface()->getMaxModels()) {
|
||||
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());
|
||||
}
|
||||
|
||||
|
||||
|
|
486
companion/src/multimodelprinter.cpp
Normal file
486
companion/src/multimodelprinter.cpp
Normal file
|
@ -0,0 +1,486 @@
|
|||
#include "helpers.h"
|
||||
#include "helpers_html.h"
|
||||
#include "multimodelprinter.h"
|
||||
#include <algorithm>
|
||||
|
||||
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<count; i++) {
|
||||
append(i, str);
|
||||
}
|
||||
}
|
||||
|
||||
void MultiModelPrinter::MultiColumns::appendTitle(const QString & name)
|
||||
{
|
||||
append("<b>" + name + "</b> ");
|
||||
}
|
||||
|
||||
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; i<count; i++) {
|
||||
QString cellColor = color;
|
||||
if (i==0 && count>1 && compareColumns[0]!=compareColumns[1])
|
||||
cellColor = "green";
|
||||
else if (i>0 && compareColumns[i]!=compareColumns[0])
|
||||
cellColor = "red";
|
||||
columns[i].append(QString("<font color='%1'>%2</font>").arg(cellColor).arg(compareColumns[i]));
|
||||
}
|
||||
delete[] compareColumns;
|
||||
compareColumns = NULL;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void MultiModelPrinter::MultiColumns::append(int idx, T val)
|
||||
{
|
||||
append(idx, QString("%1").arg(val));
|
||||
}
|
||||
|
||||
QString MultiModelPrinter::MultiColumns::print()
|
||||
{
|
||||
QString result = "<tr>";
|
||||
for (int i=0; i<count; i++) {
|
||||
result.append(QString("<td width='%1%'>%2</td>").arg(100.0/count).arg(columns[i]));
|
||||
}
|
||||
result.append("</tr>");
|
||||
return result;
|
||||
}
|
||||
|
||||
bool MultiModelPrinter::MultiColumns::isEmpty()
|
||||
{
|
||||
for (int i=0; i<count; i++) {
|
||||
if (!columns[i].isEmpty())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#define COMPARE(what) \
|
||||
columns.beginCompare(); \
|
||||
for (int cc=0; cc<models.size(); cc++) { \
|
||||
ModelPrinter * modelPrinter = modelPrinters[cc]; \
|
||||
ModelData * model = models[cc]; \
|
||||
model = model; modelPrinter = modelPrinter; \
|
||||
columns.append(cc, what); \
|
||||
} \
|
||||
columns.endCompare();
|
||||
|
||||
QString MultiModelPrinter::printTitle(const QString & label)
|
||||
{
|
||||
return QString("<tr><td colspan='%1'><h2>").arg(modelPrinters.count()) + label + "</h2></td></tr>";
|
||||
}
|
||||
|
||||
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 = "<table border='1' cellspacing='0' cellpadding='3' width='100%'>";
|
||||
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 += "</table>";
|
||||
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("<br/>");
|
||||
columns.appendTitle(tr("EEprom Size:"));
|
||||
COMPARE(modelPrinter->printEEpromSize());
|
||||
columns.append("<br/>");
|
||||
for (int i=0; i<firmware->getCapability(Timers); i++) {
|
||||
columns.appendTitle(tr("Timer%1:").arg(i+1));
|
||||
COMPARE(modelPrinter->printTimer(i));
|
||||
columns.append("<br/>");
|
||||
}
|
||||
for (int i=0; i<firmware->getCapability(NumModules); i++) {
|
||||
columns.appendTitle(firmware->getCapability(NumModules) > 1 ? tr("Module%1:").arg(i+1) : tr("Module:"));
|
||||
COMPARE(modelPrinter->printModule(i));
|
||||
columns.append("<br/>");
|
||||
}
|
||||
if (IS_TARANIS(firmware->getBoard())) {
|
||||
columns.appendTitle(tr("Trainer port:"));
|
||||
COMPARE(modelPrinter->printTrainerMode());
|
||||
columns.append("<br/>");
|
||||
}
|
||||
columns.appendTitle(tr("Throttle Trim:"));
|
||||
COMPARE(modelPrinter->printThrottleTrimMode());
|
||||
columns.append("<br/>");
|
||||
columns.appendTitle(tr("Trim Increment:"));
|
||||
COMPARE(modelPrinter->printTrimIncrementMode());
|
||||
columns.append("<br/>");
|
||||
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("<table cellspacing='0' cellpadding='1' width='100%' border='0' style='border-collapse:collapse'>");
|
||||
columns.append("<tr>");
|
||||
columns.append("<td><b>" + tr("Flight mode") + "</b></td>");
|
||||
columns.append("<td><b>" + tr("Switch") + "</b></td>");
|
||||
columns.append("<td><b>" + tr("Fade IN") + "</b></td>");
|
||||
columns.append("<td><b>" + tr("Fade OUT") + "</b></td>");
|
||||
for (int i=0; i<4; i++) {
|
||||
columns.append("<td><b>");
|
||||
COMPARE(modelPrinter->printInputName(i));
|
||||
columns.append("</b></td>");
|
||||
}
|
||||
columns.append("</tr>");
|
||||
|
||||
for (int i=0; i<firmware->getCapability(FlightModes); i++) {
|
||||
columns.append("<tr><td><b>" + tr("FM%1").arg(i) + "</b> ");
|
||||
COMPARE(model->flightModeData[i].name);
|
||||
columns.append("</td><td>");
|
||||
COMPARE(model->flightModeData[i].swtch.toString());
|
||||
columns.append("</td><td>");
|
||||
COMPARE(model->flightModeData[i].fadeIn);
|
||||
columns.append("</td><td>");
|
||||
COMPARE(model->flightModeData[i].fadeOut);
|
||||
columns.append("</td>");
|
||||
for (int k=0; k<4; k++) {
|
||||
columns.append("<td>");
|
||||
COMPARE(modelPrinter->printTrim(i, k));
|
||||
columns.append("</td>");
|
||||
}
|
||||
columns.append("</tr>");
|
||||
}
|
||||
|
||||
columns.append("</table>");
|
||||
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("<table cellspacing='0' cellpadding='1' width='100%' border='0' style='border-collapse:collapse'>");
|
||||
columns.append("<tr><td><b>" + tr("Flight mode") + "</b></td>");
|
||||
if (firmware->getCapability(GvarsFlightModes)) {
|
||||
for (int i=0; i<gvars; i++) {
|
||||
columns.append("<td><b>" + tr("GV%1").arg(i+1) + "</b><br/>");
|
||||
COMPARE(model->gvars_names[i]);
|
||||
columns.append("</td>");
|
||||
}
|
||||
}
|
||||
for (int i=0; i<firmware->getCapability(RotaryEncoders); i++) {
|
||||
columns.append("<td><b>" + tr("RE%1").arg(i+1) + "</b></td>");
|
||||
}
|
||||
columns.append("</tr>");
|
||||
for (int i=0; i<firmware->getCapability(FlightModes); i++) {
|
||||
columns.append("<tr><td><b>" + tr("FM%1").arg(i) + "</b> ");
|
||||
COMPARE(model->flightModeData[i].name);
|
||||
columns.append("</td>");
|
||||
if (firmware->getCapability(GvarsFlightModes)) {
|
||||
for (int k=0; k<gvars; k++) {
|
||||
columns.append("<td>");
|
||||
COMPARE(modelPrinter->printGlobalVar(i, k));
|
||||
columns.append("</td>");
|
||||
}
|
||||
}
|
||||
for (int k=0; k<firmware->getCapability(RotaryEncoders); k++) {
|
||||
columns.append("<td>");
|
||||
COMPARE(modelPrinter->printRotaryEncoder(i, k));
|
||||
columns.append("</td>");
|
||||
}
|
||||
columns.append("</tr>");
|
||||
}
|
||||
columns.append("</table>");
|
||||
str.append(columns.print());
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
QString MultiModelPrinter::printLimits()
|
||||
{
|
||||
QString str = printTitle(tr("Limits"));
|
||||
MultiColumns columns(models.size());
|
||||
columns.append("<table border='0' cellspacing='0' cellpadding='1' width='100%'>" \
|
||||
"<tr>" \
|
||||
" <td>" + (firmware->getCapability(HasChNames) ? tr("Name") : "") + "</td>" \
|
||||
" <td><b>" + tr("Offset") + "</b></td>" \
|
||||
" <td><b>" + tr("Min") + "</b></td>" \
|
||||
" <td><b>" + tr("Max") + "</b></td>" \
|
||||
" <td><b>" + tr("Invert") + "</b></td>" \
|
||||
"</tr>");
|
||||
for (int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
columns.append("<tr><td>");
|
||||
COMPARE(modelPrinter->printOutputName(i));
|
||||
columns.append("</td><td>");
|
||||
COMPARE(model->limitData[i].offsetToString());
|
||||
columns.append("</td><td>");
|
||||
COMPARE(model->limitData[i].minToString());
|
||||
columns.append("</td><td>");
|
||||
COMPARE(model->limitData[i].maxToString());
|
||||
columns.append("</td><td>");
|
||||
COMPARE(model->limitData[i].revertToString());
|
||||
columns.append("</td></tr>");
|
||||
}
|
||||
columns.append("</table>");
|
||||
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("<table border='0' cellspacing='0' cellpadding='1' width='100%'><tr>");
|
||||
for (int i=0; i<gvars; i++) {
|
||||
columns.append(QString("<td><b>") + tr("GV%1").arg(i+1) + "</b></td>");
|
||||
}
|
||||
columns.append("</tr><tr>");
|
||||
for (int i=0; i<gvars; i++) {
|
||||
columns.append("<td>");
|
||||
COMPARE(model->flightModeData[0].gvars[i]);
|
||||
columns.append("</td>");
|
||||
}
|
||||
columns.append("</tr>");
|
||||
str.append(columns.print());
|
||||
return str;
|
||||
}
|
||||
|
||||
QString MultiModelPrinter::printInputs()
|
||||
{
|
||||
QString str = printTitle(tr("Inputs"));
|
||||
MultiColumns columns(models.size());
|
||||
columns.append("<table cellspacing='0' cellpadding='1' width='100%' border='0' style='border-collapse:collapse'>");
|
||||
for (int i=0; i<std::max(4, firmware->getCapability(VirtualInputs)); i++) {
|
||||
int count = 0;
|
||||
for (int k=0; k<models.size(); k++) {
|
||||
count = std::max(count, models[k]->expos(i).size());
|
||||
}
|
||||
if (count > 0) {
|
||||
columns.append("<tr><td width='20%'><b>");
|
||||
COMPARE(modelPrinter->printInputName(i));
|
||||
columns.append("</b></td><td>");
|
||||
for (int j=0; j<count; j++) {
|
||||
if (j > 0)
|
||||
columns.append("<br/>");
|
||||
COMPARE(j<model->expos(i).size() ? modelPrinter->printInputLine(*model->expos(i)[j]) : "");
|
||||
}
|
||||
columns.append("</td></tr>");
|
||||
}
|
||||
}
|
||||
str.append(columns.print());
|
||||
return str;
|
||||
}
|
||||
|
||||
QString MultiModelPrinter::printMixers()
|
||||
{
|
||||
QString str = printTitle(tr("Mixers"));
|
||||
MultiColumns columns(models.size());
|
||||
columns.append("<table cellspacing='0' cellpadding='1' width='100%' border='0' style='border-collapse:collapse'>");
|
||||
for (int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
int count = 0;
|
||||
for (int k=0; k<models.size(); k++) {
|
||||
count = std::max(count, models[k]->mixes(i).size());
|
||||
}
|
||||
if (count > 0) {
|
||||
columns.append("<tr><td width='20%'><b>");
|
||||
COMPARE(modelPrinter->printChannelName(i));
|
||||
columns.append("</b></td><td>");
|
||||
for (int j=0; j<count; j++) {
|
||||
if (j > 0)
|
||||
columns.append("<br/>");
|
||||
COMPARE(modelPrinter->printMixerLine(*model->mixes(i)[j]));
|
||||
}
|
||||
columns.append("</td></tr>");
|
||||
}
|
||||
}
|
||||
str.append(columns.print());
|
||||
return str;
|
||||
}
|
||||
|
||||
QString MultiModelPrinter::printCurves()
|
||||
{
|
||||
QString str;
|
||||
MultiColumns columns(models.size());
|
||||
int count = 0;
|
||||
columns.append("<table cellspacing='0' cellpadding='1' width='100%' border='0' style='border-collapse:collapse'>");
|
||||
for (int i=0; i<firmware->getCapability(NumCurves); i++) {
|
||||
bool curveEmpty = true;
|
||||
for (int k=0; k<models.size(); k++) {
|
||||
if (!models[k]->curves[i].isEmpty()) {
|
||||
curveEmpty = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!curveEmpty) {
|
||||
count++;
|
||||
columns.append("<tr><td width='20%'><b>" + tr("CV%1").arg(i+1) + "</b></td><td>");
|
||||
COMPARE(modelPrinter->printCurve(i));
|
||||
for (int k=0; k<models.size(); k++)
|
||||
columns.append(k, QString("<br/><img src='%1' border='0' />").arg(modelPrinters[k]->createCurveImage(i)));
|
||||
columns.append("</td></tr>");
|
||||
}
|
||||
}
|
||||
columns.append("</table><br/>");
|
||||
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("<table cellspacing='0' cellpadding='1' width='100%' border='0' style='border-collapse:collapse'>");
|
||||
for (int i=0; i<firmware->getCapability(LogicalSwitches); i++) {
|
||||
bool lsEmpty = true;
|
||||
for (int k=0; k<models.size(); k++) {
|
||||
if (!modelPrinters[k]->printLogicalSwitchLine(i).isEmpty()) {
|
||||
lsEmpty = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!lsEmpty) {
|
||||
count++;
|
||||
columns.append("<tr><td width='20%'><b>" + tr("L%1").arg(i+1) + "</b></td><td>");
|
||||
COMPARE(modelPrinter->printLogicalSwitchLine(i));
|
||||
columns.append("</td></tr>");
|
||||
}
|
||||
}
|
||||
columns.append("</table>");
|
||||
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("<table cellspacing='0' cellpadding='1' width='100%' border='0' style='border-collapse:collapse'>");
|
||||
for (int i=0; i<firmware->getCapability(CustomFunctions); i++) {
|
||||
bool sfEmpty = true;
|
||||
for (int k=0; k<models.size(); k++) {
|
||||
if (!modelPrinters[k]->printCustomFunctionLine(i).isEmpty()) {
|
||||
sfEmpty = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!sfEmpty) {
|
||||
count++;
|
||||
columns.append("<tr><td width='20%'><b>" + tr("SF%1").arg(i+1) + "</b></td><td>");
|
||||
COMPARE(modelPrinter->printCustomFunctionLine(i));
|
||||
columns.append("</td></tr>");
|
||||
}
|
||||
}
|
||||
columns.append("</table>");
|
||||
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("<table border='0' cellspacing='0' cellpadding='1' width='100%'>" \
|
||||
"<tr><td width='22%'><b>" + tr("Analogs") + "</b></td><td width='26%'><b>" + tr("Unit") + "</b></td><td width='26%'><b>" + tr("Scale") + "</b></td><td width='26%'><b>" + tr("Offset") + "</b></td></tr>");
|
||||
for (int i=0; i<2; i++) {
|
||||
columns.append("<tr><td><b>"+tr("A%1").arg(i+1)+"</b></td><td>");
|
||||
COMPARE(getFrSkyUnits(model->frsky.channels[i].type));
|
||||
columns.append("</td><td>");
|
||||
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("</td><td>");
|
||||
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("</td></tr>");
|
||||
}
|
||||
columns.append("</table><br/>");
|
||||
str.append(columns.print());
|
||||
// TODO I remove the analogs alarms for now
|
||||
}
|
||||
|
||||
// RSSI alarms
|
||||
{
|
||||
MultiColumns columns(models.size());
|
||||
columns.append("<table border='0' cellspacing='0' cellpadding='1' width='100%'>");
|
||||
for (int i=0; i<2; i++) {
|
||||
columns.append("<tr><td><b>" + QString(i==0 ? tr("RSSI Alarms") : "") + "</b></td><td>");
|
||||
COMPARE(getFrSkyAlarmType(model->frsky.rssiAlarms[i].level));
|
||||
columns.append("</td><td><</td><td>");
|
||||
COMPARE(QString::number(model->frsky.rssiAlarms[i].value, 10));
|
||||
columns.append("</td></tr>");
|
||||
}
|
||||
columns.append("</table><br/>");
|
||||
str.append(columns.print());
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
54
companion/src/multimodelprinter.h
Normal file
54
companion/src/multimodelprinter.h
Normal file
|
@ -0,0 +1,54 @@
|
|||
#ifndef _MULTIMODELPRINTER_H
|
||||
#define _MULTIMODELPRINTER_H
|
||||
|
||||
#include <QObject>
|
||||
#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 <class T> 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<ModelData *> models; // TODO const
|
||||
QVector<ModelPrinter *> 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
|
|
@ -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 <QtGui>
|
||||
#include <QImage>
|
||||
#include <QColor>
|
||||
#include <QPainter>
|
||||
#include <QPrinter>
|
||||
#include <QPrintDialog>
|
||||
|
||||
#if !defined WIN32 && defined __GNUC__
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
// #if !defined WIN32 && defined __GNUC__
|
||||
// #include <unistd.h>
|
||||
// #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()+"<br>");
|
||||
}
|
||||
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,617 +34,9 @@ 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 = "<a name=1></a><table border=1 cellspacing=0 cellpadding=3 width=\"100%\">";
|
||||
str.append(QString("<tr><td colspan=%1 ><table border=0 width=\"100%\"><tr><td><h1>").arg((firmware->getCapability(FlightModes) && !gvars) ? 2 : 1));
|
||||
str.append(g_model->name);
|
||||
str.append(" (");
|
||||
str.append(firmware->getName());
|
||||
str.append(")</h1></td><td align=right valign=top NOWRAP><font size=-1>"+tr("printed on: %1").arg(QDateTime::currentDateTime().toString(Qt::SystemLocaleShortDate))+"</font></td></tr></table></td></tr><tr><td><table border=0 cellspacing=0 cellpadding=3>");
|
||||
str.append("<tr><td><h2>"+tr("General Model Settings")+"</h2></td></tr>");
|
||||
str.append("<tr><td>");
|
||||
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; i<firmware->getCapability(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("<b>"+(IS_TARANIS(firmware->getBoard()) ? tr("Internal Radio System") : tr("Radio System") )+"</b><br> "); //proto, numch, delay,
|
||||
}
|
||||
str.append(fv(tr("Protocol"), getProtocol(g_model->moduleData[0])));
|
||||
if (firmware->getCapability(NumModules)>1) {
|
||||
str.append("<b>"+(IS_TARANIS(firmware->getBoard()) ? tr("External Radio Module") : tr("Extra Radio System"))+"</b><br> "); //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("</td></tr></table></td>");
|
||||
if (!gvars) {
|
||||
str.append("<td width=\"380\">");
|
||||
str.append(printFlightModes());
|
||||
str.append("</td>");
|
||||
}
|
||||
str.append("</tr></table><br>");
|
||||
te->append(str);
|
||||
}
|
||||
|
||||
QString PrintDialog::printFlightModes()
|
||||
{
|
||||
QString str = "";
|
||||
str.append(QString("<table border=1 cellspacing=0 cellpadding=3 width=\"100%\"><tr><td colspan=%1><h2>").arg(!gvars ? 8+firmware->getCapability(RotaryEncoders) : 8+gvars+firmware->getCapability(RotaryEncoders)));
|
||||
str.append(tr("Flight modes"));
|
||||
str.append("</h2></td></tr><tr><td style=\"border-style:none;\"> </td><td colspan=2 align=center><b>");
|
||||
str.append(tr("Fades")+"</b></td>");
|
||||
str.append("<td colspan=4 align=center><b>"+tr("Trims")+"</b></td>");
|
||||
if (gvars) {
|
||||
str.append(QString("<td colspan=%1 align=center><b>").arg(gvars)+tr("Gvars")+"</b></td>");
|
||||
}
|
||||
if (firmware->getCapability(RotaryEncoders)) {
|
||||
str.append(QString("<td colspan=%1 align=center><b>").arg(firmware->getCapability(RotaryEncoders))+tr("Rot.Enc.")+"</b></td>");
|
||||
}
|
||||
str.append("<td rowspan=2 align=\"center\" valign=\"bottom\"><b>"+tr("Switch")+"</b></td></tr><tr><td align=center nowrap><b>"+tr("Flight mode name"));
|
||||
str.append("</b></td><td align=center ><b>"+tr("IN")+"</b></td><td align=center ><b>"+tr("OUT")+"</b></td>");
|
||||
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("<td align=\"center\" nowrap><b>%1</b></td>").arg((QString)labels[CONVERT_MODE(i+1)-1]));
|
||||
}
|
||||
for (unsigned int i=0; i<gvars; i++) {
|
||||
str.append(QString("<td align=\"center\" nowrap><b>GV%1</b><br>%2</td>").arg(i+1).arg(g_model->gvars_names[i]));
|
||||
}
|
||||
for (int i=0; i<firmware->getCapability(RotaryEncoders); i++) {
|
||||
str.append(QString("<td align=\"center\"><b>RE%1</b></td>").arg((i==0 ? 'A': 'B')));
|
||||
}
|
||||
str.append("</tr>");
|
||||
for (int i=0; i<firmware->getCapability(FlightModes); i++) {
|
||||
FlightModeData *pd=&g_model->flightModeData[i];
|
||||
str.append("<tr><td valign=\"middle\"><b>"+tr("FM")+QString("%1</b> <font size=+1 face='Courier New' color=green>%2</font></td>").arg(i).arg(pd->name));
|
||||
str.append(QString("<td valign=\"middle\" align=\"right\"><font size=+1 face='Courier New' color=green>%1</font></td>").arg((qreal)pd->fadeIn/firmware->getCapability(SlowScale)));
|
||||
str.append(QString("<td valign=\"middle\" width=\"30\" align=\"right\"><font size=+1 face='Courier New' color=green>%1</font></td>").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("<td valign=\"middle\" align=\"center\"><font size=+1 face='Courier New' color=grey>")+tr("Off")+QString("</font></td>"));
|
||||
} else {
|
||||
if (pd->trimRef[k]==i) {
|
||||
str.append("<td valign=\"middle\" align=\"center\" ><font size=+1 face='Courier New' color=green>"+QString("%1").arg(pd->trim[k])+QString("</font></td>"));
|
||||
} else {
|
||||
if (pd->trimMode[k]==0) {
|
||||
str.append("<td valign=\"middle\" align=\"center\" ><font size=+1 face='Courier New' color=green>"+tr("FM")+QString("%1").arg(pd->trimRef[k])+QString("</font></td>"));
|
||||
} else {
|
||||
str.append("<td valign=\"middle\" align=\"center\" ><font size=+1 face='Courier New' color=green>"+tr("FM")+QString("%1+").arg(pd->trimRef[k])+QString("<br>%1").arg(pd->trim[k])+QString("</font></td>"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (unsigned int k=0; k<gvars; k++) {
|
||||
if (pd->gvars[k]<=1024) {
|
||||
str.append(QString("<td align=\"right\" valign=\"middle\"><font size=+1 face='Courier New' color=green>%1").arg(pd->gvars[k])+"</font></td>");
|
||||
}
|
||||
else {
|
||||
int num = pd->gvars[k] - 1025;
|
||||
if (num>=i) num++;
|
||||
str.append("<td align=\"right\" valign=\"middle\"><font size=+1 face='Courier New' color=green>"+tr("FM")+QString("%1</font></td>").arg(num));
|
||||
}
|
||||
}
|
||||
for (int k=0; k<firmware->getCapability(RotaryEncoders); k++) {
|
||||
if (pd->rotaryEncoders[k]<=1024) {
|
||||
str.append(QString("<td align=\"right\" valign=\"middle\"><font size=+1 face='Courier New' color=green>%1").arg(pd->rotaryEncoders[k])+"</font></td>");
|
||||
}
|
||||
else {
|
||||
int num = pd->rotaryEncoders[k] - 1025;
|
||||
if (num>=i) num++;
|
||||
str.append(QString("<td align=\"right\" valign=\"middle\"><font size=+1 face='Courier New' color=green>")+tr("FM")+QString("%1</font></td>").arg(num));
|
||||
}
|
||||
}
|
||||
str.append(QString("<td align=center valign=\"middle\"><font size=+1 face='Courier New' color=green>%1</font></td>").arg(pd->swtch.toString()));
|
||||
str.append("</tr>");
|
||||
}
|
||||
str.append("</table>");
|
||||
return(str);
|
||||
}
|
||||
|
||||
void PrintDialog::printInputs()
|
||||
{
|
||||
QString str = "<table border=1 cellspacing=0 cellpadding=3 width=\"100%\"><tr><td><h2>";
|
||||
str += tr("Inputs");
|
||||
str += "</h2></td></tr><tr><td><table border=0 cellspacing=0 cellpadding=3>";
|
||||
int ec=0;
|
||||
unsigned int lastCHN = 255;
|
||||
for(int i=0; i<C9X_MAX_EXPOS; i++) {
|
||||
ExpoData *ed=&g_model->expoData[i];
|
||||
if(ed->mode==0) continue;
|
||||
ec++;
|
||||
|
||||
str += "<tr><td>";
|
||||
if(lastCHN!=ed->chn) {
|
||||
lastCHN=ed->chn;
|
||||
str += addFont("<b>"+modelPrinter.printInputName(ed->chn)+"</b>", "", "+1", "Courier New");
|
||||
}
|
||||
str += "</td>";
|
||||
|
||||
str += "<td>" + addFont(modelPrinter.printInputLine(ed), "green", "+1", "Courier New") + "</td>";
|
||||
str += "</tr>";
|
||||
}
|
||||
str += "</table></td></tr></table><br>";
|
||||
if (ec>0) te->append(str);
|
||||
// debugHtml(str);
|
||||
}
|
||||
|
||||
|
||||
void PrintDialog::printMixes()
|
||||
{
|
||||
QString str = "<table border=1 cellspacing=0 cellpadding=3 style=\"page-break-after:always;\" width=\"100%\"><tr><td><h2>";
|
||||
str += tr("Mixers");
|
||||
str += "</h2></td></tr><tr><td><table border=0 cellspacing=0 cellpadding=3>";
|
||||
|
||||
unsigned int lastCHN = 255;
|
||||
for(int i=0; i<firmware->getCapability(Mixes); i++) {
|
||||
MixData *md = &g_model->mixData[i];
|
||||
if(!md->destCh || md->destCh>(unsigned int)firmware->getCapability(Outputs) ) break;
|
||||
|
||||
str += "<tr><td><b>";
|
||||
if(lastCHN!=md->destCh) {
|
||||
lastCHN=md->destCh;
|
||||
str += addFont(modelPrinter.printMixerName(md->destCh).replace(" ", " "), "", "+1", "Courier New");
|
||||
}
|
||||
str += "</b></td>";
|
||||
|
||||
str += "<td>" + addFont(modelPrinter.printMixerLine(md), "green", "+1", "Courier New") + "</td>";
|
||||
str += "</tr>";
|
||||
}
|
||||
str += "</table></td></tr></table><br>";
|
||||
te->append(str);
|
||||
// debugHtml(str);
|
||||
}
|
||||
|
||||
void PrintDialog::printLimits()
|
||||
{
|
||||
QString str = "<table border=1 cellspacing=0 cellpadding=3 width=\"100%\">";
|
||||
int numcol;
|
||||
numcol=(firmware->getCapability(Outputs)+1)>17 ? 17:firmware->getCapability(Outputs)+1;
|
||||
str.append(QString("<tr><td colspan=%1><h2>").arg(numcol)+tr("Limits")+"</h2></td></tr>");
|
||||
str.append("<tr><td> </td>");
|
||||
if (firmware->getCapability(Outputs)<17) {
|
||||
for(int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true));
|
||||
}
|
||||
str.append("</tr>");
|
||||
if (firmware->getCapability(HasChNames)) {
|
||||
str.append("<tr><td><b>"+tr("Name")+"</b></td>");
|
||||
for(int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTR(g_model->limitData[i].name, "green"));
|
||||
}
|
||||
}
|
||||
str.append("<tr><td><b>"+tr("Offset")+"</b></td>");
|
||||
for(int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTR(g_model->limitData[i].offsetToString(), "green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr><td><b>"+tr("Min")+"</b></td>");
|
||||
for(int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTR(g_model->limitData[i].minToString(), "green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr><td><b>"+tr("Max")+"</b></td>");
|
||||
for(int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTR(g_model->limitData[i].maxToString(), "green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr><td><b>"+tr("Invert")+"</b></td>");
|
||||
for(int i=0; i<firmware->getCapability(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("</tr>");
|
||||
if (firmware->getCapability(HasChNames)) {
|
||||
str.append("<tr><td><b>"+tr("Name")+"</b></td>");
|
||||
for(int i=0; i<16; i++) {
|
||||
str.append(doTR(g_model->limitData[i].name,"green"));
|
||||
}
|
||||
}
|
||||
str.append("<tr><td><b>"+tr("Offset")+"</b></td>");
|
||||
for(int i=0; i<16; i++) {
|
||||
str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr><td><b>"+tr("Min")+"</b></td>");
|
||||
for(int i=0; i<16; i++) {
|
||||
str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr><td><b>"+tr("Max")+"</b></td>");
|
||||
for(int i=0; i<16; i++) {
|
||||
str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr><td><b>"+tr("Invert")+"</b></td>");
|
||||
for(int i=0; i<16; i++) {
|
||||
str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append(QString("<tr><td colspan=%1> ").arg(numcol)+"</td></tr>");
|
||||
str.append("<tr><td> </td>");
|
||||
for(int i=16; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true));
|
||||
}
|
||||
str.append("</tr>");
|
||||
if (firmware->getCapability(HasChNames)) {
|
||||
str.append("<tr><td><b>"+tr("Name")+"</b></td>");
|
||||
for(int i=16; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTR(g_model->limitData[i].name,"green"));
|
||||
}
|
||||
}
|
||||
str.append("<tr><td><b>"+tr("Offset")+"</b></td>");
|
||||
for(int i=16; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr><td><b>"+tr("Min")+"</b></td>");
|
||||
for(int i=16; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr><td><b>"+tr("Max")+"</b></td>");
|
||||
for(int i=16; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr><td><b>"+tr("Invert")+"</b></td>");
|
||||
for(int i=16; i<firmware->getCapability(Outputs); i++) {
|
||||
str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green"));
|
||||
}
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("</table>");
|
||||
str.append("<br>");
|
||||
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 = "<table border=1 cellspacing=0 cellpadding=3 style=\"page-break-before:auto;\" width=\"100%\"><tr><td><h2>";
|
||||
str.append(tr("Curves"));
|
||||
str.append("</h2></td></tr><tr><td>");
|
||||
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("<table border=0 cellspacing=0 cellpadding=3 width=\"100%\">"+QString("<tr><td width=\"400\"><img src=\"%1\" border=0></td><td><table border=1 cellspacing=0 cellpadding=3 width=\"100%\">").arg(curvefile5));
|
||||
for(i=0; i<numcurves; i++) {
|
||||
pen.setColor(colors[usedcurves]);
|
||||
painter.setPen(pen);
|
||||
colors[usedcurves].getRgb(&r,&g,&b);
|
||||
c=r;
|
||||
c*=256;
|
||||
c+=g;
|
||||
c*=256;
|
||||
c+=b;
|
||||
sprintf(buffer,"%06x",c);
|
||||
int curvepoints=g_model->curves[i].count;
|
||||
count=0;
|
||||
for(int j=0; j<curvepoints; j++) {
|
||||
if (g_model->curves[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("<tr>");
|
||||
str.append(QString("<td width=\"70\"><font color=#%1><b>").arg(buffer)+tr("Curve")+QString(" %1</b></font></td>").arg(i+1));
|
||||
if(usedcurves%2) str.append("</tr>");
|
||||
usedcurves++;
|
||||
}
|
||||
}
|
||||
if (!(usedcurves%2)) str.append("</tr>");
|
||||
if (usedcurves!=0) {
|
||||
str.append("</table></td></tr><tr><td colspan=2><table border=1 cellspacing=0 cellpadding=3 width=\"100%\">");
|
||||
str.append("<tr>");
|
||||
str.append(doTC(" "));
|
||||
str.append(doTC(" "));
|
||||
int numpoint=0;
|
||||
for(i=0; i<numcurves; i++) {
|
||||
if (g_model->curves[i].count>numpoint)
|
||||
numpoint=g_model->curves[i].count;
|
||||
}
|
||||
for(i=0; i<numpoint; i++)
|
||||
str.append(doTC(tr("pt %1").arg(i+1), "", true));
|
||||
str.append("</tr>");
|
||||
for(i=0; i<numcurves; i++) {
|
||||
int curvepoints=g_model->curves[i].count;
|
||||
count=0;
|
||||
for(int j=0; j<curvepoints; j++) {
|
||||
if (g_model->curves[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("<tr>");
|
||||
if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM)
|
||||
str.append(QString("<td width=\"70\" rowspan=2 valign=middle><font color=#%1><b>").arg(buffer)+tr("Curve")+QString(" %1</b></font></td><td width=5>Y</td>").arg(i+1));
|
||||
else
|
||||
str.append(QString("<td width=\"70\"><font color=#%1><b>").arg(buffer)+tr("Curve")+QString(" %1</b></font></td><td width=5>Y</td>").arg(i+1));
|
||||
for(int j=0; j<curvepoints; j++) {
|
||||
str.append(doTR(QString::number(g_model->curves[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<numpoint; j++) {
|
||||
str.append(doTR("","green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) {
|
||||
str.append("<tr><td width=5>X</td>");
|
||||
for(int j=0; j<curvepoints; j++) {
|
||||
str.append(doTR(QString::number(g_model->curves[i].points[j].x),"green"));
|
||||
}
|
||||
for(int j=curvepoints; j<numpoint; j++) {
|
||||
str.append(doTR("","green"));
|
||||
}
|
||||
str.append("</tr>");
|
||||
}
|
||||
}
|
||||
}
|
||||
str.append("</table></td></tr></table></td></tr></table>");
|
||||
str.append("<br>");
|
||||
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 = "<table border=1 cellspacing=0 cellpadding=3 width=\"100%\">";
|
||||
str += "<tr><td><h2>" + tr("Logical Switches") + "</h2></td></tr>";
|
||||
str += "<tr><td><table border=0 cellspacing=0 cellpadding=3>";
|
||||
for (int i=0; i<firmware->getCapability(LogicalSwitches); i++) {
|
||||
QString sw = modelPrinter.printLogicalSwitchLine(i);
|
||||
if (!sw.isEmpty()) {
|
||||
str += "<tr>";
|
||||
str += "<td width=\"60\"><b>"+ tr("L") + QString("%1</b></td>").arg(i+1);
|
||||
str += "<td align=left>" + addFont(sw, "green") + "</td>";
|
||||
str += "</tr>";
|
||||
haveOutput = true;
|
||||
}
|
||||
}
|
||||
str += "</table></td></tr></table>";
|
||||
str += "<br>";
|
||||
if (haveOutput) te->append(str);
|
||||
}
|
||||
|
||||
void PrintDialog::printGvars()
|
||||
{
|
||||
if (!firmware->getCapability(GvarsFlightModes) && gvars) {
|
||||
QString str = "<table border=1 cellspacing=0 cellpadding=3 width=\"100%\">";
|
||||
str.append("<tr><td><h2>"+tr("Global Variables")+"</h2></td></tr>");
|
||||
str.append("<tr><td><table border=1 cellspacing=0 cellpadding=3 width=100>");
|
||||
FlightModeData *pd=&g_model->flightModeData[0];
|
||||
int width = 100/gvars;
|
||||
str.append("<tr>");
|
||||
for (unsigned int i=0; i<gvars; i++) {
|
||||
str.append(QString("<td width=\"%1%\" align=\"center\"><b>").arg(width)+tr("GV")+QString("%1</b></td>").arg(i+1));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("<tr>");
|
||||
for (unsigned int i=0; i<gvars; i++) {
|
||||
str.append(QString("<td width=\"%1%\" align=\"center\"><font color=green>").arg(width)+QString("%1</font></td>").arg(pd->gvars[i]));
|
||||
}
|
||||
str.append("</tr>");
|
||||
str.append("</table></td></tr></table>");
|
||||
str.append("<br>");
|
||||
te->append(str);
|
||||
}
|
||||
}
|
||||
|
||||
void PrintDialog::printCustomFunctions()
|
||||
{
|
||||
bool haveOutput = false;
|
||||
QString str = "<table border=1 cellspacing=0 cellpadding=3 width=\"100%\">";
|
||||
str += "<tr><td><h2>" + tr("Special Functions") + "</h2></td></tr>";
|
||||
str += "<tr><td><table border=0 cellspacing=0 cellpadding=3>";
|
||||
for (int i=0; i<firmware->getCapability(CustomFunctions); i++) {
|
||||
QString cf = modelPrinter.printCustomFunctionLine(i);
|
||||
if (!cf.isEmpty()) {
|
||||
str += "<tr>";
|
||||
str += "<td width=\"60\"><b>"+ tr("SF") + QString("%1</b></td>").arg(i+1);
|
||||
str += "<td align=left>" + addFont(cf, "green") + "</td>";
|
||||
str += "</tr>";
|
||||
haveOutput = true;
|
||||
}
|
||||
}
|
||||
str += "</table></td></tr></table>";
|
||||
str += "<br>";
|
||||
if (haveOutput) te->append(str);
|
||||
}
|
||||
|
||||
void PrintDialog::printFrSky()
|
||||
{
|
||||
int tc=0;
|
||||
QString str = "<table border=1 cellspacing=0 cellpadding=3 width=\"100%\">";
|
||||
int analog=2;
|
||||
if (IS_ARM(firmware->getBoard())) {
|
||||
analog=4;
|
||||
}
|
||||
|
||||
if (IS_TARANIS(GetEepromInterface()->getBoard())) {
|
||||
str.append("<tr><td colspan=3><h2>"+tr("Telemetry Settings")+"</h2></td></tr>");
|
||||
str.append("<tr>");
|
||||
str.append(doTC(tr("Analog"),"", true));
|
||||
str.append(doTC(tr("Range"),"", true));
|
||||
str.append(doTC(tr("Offset"),"", true));
|
||||
str.append("</tr>");
|
||||
|
||||
FrSkyData *fd=&g_model->frsky;
|
||||
for (int i=0; i<analog; i++) {
|
||||
if (fd->channels[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("<tr>");
|
||||
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("</tr>");
|
||||
}
|
||||
}
|
||||
|
||||
str.append("<tr><td colspan=3 align=\"Left\" height=\"4px\"></td></tr>");
|
||||
str.append("<tr>");
|
||||
str.append(doTC(tr("Alarms"),"", true));
|
||||
str.append(doTC(tr("Low Alarm"),"", true));
|
||||
str.append(doTC(tr("Critical Alarm"),"", true));
|
||||
str.append("</tr>");
|
||||
str.append("<tr>");
|
||||
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("</tr>");
|
||||
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("<tr>");
|
||||
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("</tr>");
|
||||
}
|
||||
}
|
||||
|
||||
//TODO preferrably in new tables
|
||||
str.append("<tr><td colspan=3 align=\"Left\" height=\"4px\"></td></tr>");
|
||||
//str.append("<tr><td align=\"Left\"><b>"+tr("Frsky serial protocol")+"</b></td><td colspan=2 align=\"left\">"+getFrSkyProtocol(fd->usrProto)+"</td></tr>");
|
||||
//str.append("<tr><td align=\"Left\"><b>"+tr("Units system")+"</b></td><td colspan=2 align=\"left\">"+getFrSkyMeasure(fd->imperial)+"</td></tr>");
|
||||
str.append("<tr><td align=\"Left\"><b>"+tr("Blades")+"</b></td><td colspan=2 align=\"left\">"+QString("%1").arg(fd->blades)+"</td></tr>");
|
||||
str.append("<tr><td align=\"Left\" height=\"4px\"></td></tr></table>");
|
||||
}
|
||||
else { //other boards
|
||||
str.append("<tr><td colspan=10><h2>"+tr("Telemetry Settings")+"</h2></td></tr>");
|
||||
str.append("<tr><td colspan=4 align=\"center\"> </td><td colspan=3 align=\"center\"><b>"+tr("Alarm 1")+"</b></td><td colspan=3 align=\"center\"><b>"+tr("Alarm 2")+"</b></td></tr>");
|
||||
str.append("<tr><td align=\"center\"><b>"+tr("Analog")+"</b></td><td align=\"center\"><b>"+tr("Unit")+"</b></td><td align=\"center\"><b>"+tr("Scale")+"</b></td><td align=\"center\"><b>"+tr("Offset")+"</b></td>");
|
||||
str.append("<td width=\"40\" align=\"center\"><b>"+tr("Type")+"</b></td><td width=\"40\" align=\"center\"><b>"+tr("Condition")+"</b></td><td width=\"40\" align=\"center\"><b>"+tr("Value")+"</b></td>");
|
||||
str.append("<td width=\"40\" align=\"center\"><b>"+tr("Type")+"</b></td><td width=\"40\" align=\"center\"><b>"+tr("Condition")+"</b></td><td width=\"40\" align=\"center\"><b>"+tr("Value")+"</b></td></tr>");
|
||||
FrSkyData *fd=&g_model->frsky;
|
||||
for (int i=0; i<analog; i++) {
|
||||
if (fd->channels[i].ratio!=0) {
|
||||
tc++;
|
||||
float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1));
|
||||
str.append("<tr><td align=\"center\"><b>"+tr("A%1").arg(i+1)+"</b></td><td align=\"center\"><font color=green>"+getFrSkyUnits(fd->channels[i].type)+"</font></td><td align=\"center\"><font color=green>"+QString::number(ratio,10,(fd->channels[i].type==0 ? 1:0))+"</font></td><td align=\"center\"><font color=green>"+QString::number((fd->channels[i].offset*ratio)/255,10,(fd->channels[i].type==0 ? 1:0))+"</font></td>");
|
||||
str.append("<td width=\"40\" align=\"center\"><font color=green>"+getFrSkyAlarmType(fd->channels[i].alarms[0].level)+"</font></td>");
|
||||
str.append("<td width=\"40\" align=\"center\"><font color=green>");
|
||||
str.append((fd->channels[i].alarms[0].greater==1) ? ">" : "<");
|
||||
str.append("</font></td><td width=\"40\" align=\"center\"><font color=green>"+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))+"</font></td>");
|
||||
str.append("<td width=\"40\" align=\"center\"><font color=green>"+getFrSkyAlarmType(fd->channels[i].alarms[1].level)+"</font></td>");
|
||||
str.append("<td width=\"40\" align=\"center\"><font color=green>");
|
||||
str.append((fd->channels[i].alarms[1].greater==1) ? ">" : "<");
|
||||
str.append("</font></td><td width=\"40\" align=\"center\"><font color=green>"+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))+"</font></td></tr>");
|
||||
}
|
||||
}
|
||||
str.append("<tr><td colspan=10 align=\"Left\" height=\"4px\"></td></tr>");
|
||||
str.append("<tr><td colspan=4 align=\"center\" rowspan=2> </td><td colspan=3 align=\"center\"><b>"+tr("Alarm 1")+"</b></td><td colspan=3 align=\"center\"><b>"+tr("Alarm 2")+"</b></td></tr>");
|
||||
str.append("<tr><td width=\"40\" align=\"center\"><b>"+tr("Type")+"</b></td><td width=\"40\" align=\"center\"><b>"+tr("Condition")+"</b></td><td width=\"40\" align=\"center\"><b>"+tr("Value")+"</b></td>");
|
||||
str.append("<td width=\"40\" align=\"center\"><b>"+tr("Type")+"</b></td><td width=\"40\" align=\"center\"><b>"+tr("Condition")+"</b></td><td width=\"40\" align=\"center\"><b>"+tr("Value")+"</b></td></tr>");
|
||||
str.append("<tr><td align=\"Left\" colspan=4><b>"+tr("RSSI Alarm")+"</b></td>");
|
||||
str.append("<td width=\"40\" align=\"center\"><b>"+getFrSkyAlarmType(fd->rssiAlarms[0].level)+"</b></td><td width=\"40\" align=\"center\"><b><</b></td><td width=\"40\" align=\"center\"><b>"+QString::number(fd->rssiAlarms[0].value,10)+"</b></td>");
|
||||
str.append("<td width=\"40\" align=\"center\"><b>"+getFrSkyAlarmType(fd->rssiAlarms[1].level)+"</b></td><td width=\"40\" align=\"center\"><b><</b></td><td width=\"40\" align=\"center\"><b>"+QString::number(fd->rssiAlarms[1].value,10)+"</b></td></tr>");
|
||||
str.append("<tr><td colspan=10 align=\"Left\" height=\"4px\"></td></tr>");
|
||||
str.append("<tr><td colspan=2 align=\"Left\"><b>"+tr("Frsky serial protocol")+"</b></td><td colspan=8 align=\"left\">"+getFrSkyProtocol(fd->usrProto)+"</td></tr>");
|
||||
str.append("<tr><td colspan=2 align=\"Left\"><b>"+tr("Blades")+"</b></td><td colspan=8 align=\"left\">"+QString("%1").arg(fd->blades)+"</td></tr>");
|
||||
str.append("<tr><td colspan=10 align=\"Left\" height=\"4px\"></td></tr></table>");
|
||||
}
|
||||
#if 0
|
||||
if (firmware->getCapability(TelemetryBars) || (firmware->getCapability(TelemetryCSFields))) {
|
||||
int cols=firmware->getCapability(TelemetryColsCSFields);
|
||||
if (cols==0) cols=2;
|
||||
for (int j=0; j<firmware->getCapability(TelemetryCSFields)/(4*cols); j++ ) {
|
||||
if (fd->screens[j].type==0) {
|
||||
if (cols==2) {
|
||||
str.append("<table border=1 cellspacing=0 cellpadding=3 width=\"100%\"><tr><td colspan=3 align=\"Left\"><b>"+tr("Custom Telemetry View")+"</b></td></tr>");
|
||||
} else {
|
||||
str.append("<table border=1 cellspacing=0 cellpadding=3 width=\"100%\"><tr><td colspan=5 align=\"Left\"><b>"+tr("Custom Telemetry View")+"</b></td></tr>");
|
||||
}
|
||||
for (int r=0; r<4; r++) {
|
||||
str.append("<tr>");
|
||||
for (int c=0; c<cols; c++) {
|
||||
if (fd->screens[j].body.lines[r].source[c]!=0)
|
||||
tc++;
|
||||
if (cols==2) {
|
||||
str.append("<td align=\"Center\" width=\"45%\"><b>"+getFrSkySrc(fd->screens[j].body.lines[r].source[c])+"</b></td>");
|
||||
} else {
|
||||
str.append("<td align=\"Center\" width=\"30%\"><b>"+getFrSkySrc(fd->screens[j].body.lines[r].source[c])+"</b></td>");
|
||||
}
|
||||
if (c<(cols-1)) {
|
||||
if (cols==2) {
|
||||
str.append("<td align=\"Center\" width=\"10%\"><b> </b></td>");
|
||||
} else {
|
||||
str.append("<td align=\"Center\" width=\"5%\"><b> </b></td>");
|
||||
}
|
||||
}
|
||||
}
|
||||
str.append("</tr>");
|
||||
}
|
||||
str.append("</table>");
|
||||
} else {
|
||||
str.append("<table border=1 cellspacing=0 cellpadding=3 width=\"100%\"><tr><td colspan=4 align=\"Left\"><b>"+tr("Telemetry Bars")+"</b></td></tr>");
|
||||
str.append("<tr><td align=\"Center\"><b>"+tr("Bar Number")+"</b></td><td align=\"Center\"><b>"+tr("Source")+"</b></td><td align=\"Center\"><b>"+tr("Min")+"</b></td><td align=\"Center\"><b>"+tr("Max")+"</b></td></tr>");
|
||||
for (int i=0; i<4; i++) {
|
||||
if (fd->screens[j].body.bars[i].source!=0)
|
||||
tc++;
|
||||
// TODO str.append("<tr><td align=\"Center\"><b>"+QString::number(i+1,10)+"</b></td><td align=\"Center\"><b>"+getFrSkySrc(fd->screens[j].body.bars[i].source)+"</b></td><td align=\"Right\"><b>"+(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)):"----")+"</b></td><td align=\"Right\"><b>"+(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)) :"----")+"</b></td></tr>");
|
||||
}
|
||||
str.append("</table>");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (tc>0)
|
||||
te->append(str);
|
||||
}
|
||||
|
||||
void PrintDialog::on_printButton_clicked()
|
||||
{
|
||||
QPrinter printer;
|
||||
|
@ -686,7 +45,7 @@ void PrintDialog::on_printButton_clicked()
|
|||
dialog->setWindowTitle(tr("Print Document"));
|
||||
if (dialog->exec() != QDialog::Accepted)
|
||||
return;
|
||||
te->print(&printer);
|
||||
ui->textEdit->print(&printer);
|
||||
}
|
||||
|
||||
void PrintDialog::on_printFileButton_clicked()
|
||||
|
@ -702,10 +61,11 @@ void PrintDialog::on_printFileButton_clicked()
|
|||
printer.setOutputFormat(QPrinter::PdfFormat);
|
||||
printer.setColorMode(QPrinter::Color);
|
||||
printer.setOutputFileName(fn);
|
||||
te->print(&printer);
|
||||
} else {
|
||||
ui->textEdit->print(&printer);
|
||||
}
|
||||
else {
|
||||
QTextDocumentWriter writer(fn);
|
||||
writer.write(te->document());
|
||||
writer.write(ui->textEdit->document());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -721,10 +81,11 @@ void PrintDialog::printToFile()
|
|||
printer.setOutputFormat(QPrinter::PdfFormat);
|
||||
printer.setColorMode(QPrinter::Color);
|
||||
printer.setOutputFileName(printfilename);
|
||||
te->print(&printer);
|
||||
} else {
|
||||
ui->textEdit->print(&printer);
|
||||
}
|
||||
else {
|
||||
QTextDocumentWriter writer(printfilename);
|
||||
writer.write(te->document());
|
||||
writer.write(ui->textEdit->document());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,11 +1,9 @@
|
|||
#ifndef PRINTDIALOG_H
|
||||
#define PRINTDIALOG_H
|
||||
#ifndef _PRINTDIALOG_H
|
||||
#define _PRINTDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QtGui>
|
||||
#include <QDir>
|
||||
#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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue