Merge branch '2.3' into 3djc/TX16s-2.3
# Conflicts: # radio/src/translations/es.h.txt
This commit is contained in:
+10
@@ -1709,3 +1709,13 @@ Kevin Bowens
|
||||
David Frech
|
||||
Udo Kastenholz
|
||||
Julio Margarido
|
||||
Uwe Muendelein
|
||||
James Jewitt
|
||||
Daniel Ferreira
|
||||
Michael Charlston
|
||||
Leopoldo Cicero
|
||||
Tom Van Driel
|
||||
Karl Vetter
|
||||
Johannes Janssen
|
||||
François Blondé
|
||||
Precision Aero
|
||||
|
||||
@@ -82,6 +82,8 @@ QString SensorData::unitString() const
|
||||
return tr("seconds");
|
||||
case UNIT_CELLS:
|
||||
return tr("V");
|
||||
case UNIT_MILLILITERS_PER_MINUTE:
|
||||
return tr("ml/minute");
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -90,6 +90,7 @@ class SensorData {
|
||||
UNIT_RADIANS,
|
||||
UNIT_MILLILITERS,
|
||||
UNIT_FLOZ,
|
||||
UNIT_MILLILITERS_PER_MINUTE,
|
||||
UNIT_HOURS,
|
||||
UNIT_MINUTES,
|
||||
UNIT_SECONDS,
|
||||
|
||||
@@ -1124,7 +1124,7 @@ p, li { white-space: pre-wrap; }
|
||||
<item row="19" column="1">
|
||||
<widget class="QLineEdit" name="registrationId">
|
||||
<property name="inputMask">
|
||||
<string>aaaaaaAA</string>
|
||||
<string>nnnnnnNN</string>
|
||||
</property>
|
||||
<property name="maxLength">
|
||||
<number>8</number>
|
||||
|
||||
@@ -592,13 +592,28 @@ void TelemetryCustomScreen::barTimeChanged()
|
||||
}
|
||||
}
|
||||
|
||||
TelemetrySensorPanel::TelemetrySensorPanel(QWidget *parent, SensorData & sensor, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware):
|
||||
/******************************************************/
|
||||
|
||||
TelemetrySensorPanel::TelemetrySensorPanel(QWidget *parent, SensorData & sensor, int sensorIndex, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware):
|
||||
ModelPanel(parent, model, generalSettings, firmware),
|
||||
ui(new Ui::TelemetrySensor),
|
||||
sensor(sensor),
|
||||
lock(false)
|
||||
lock(false),
|
||||
sensorIndex(sensorIndex),
|
||||
selectedIndex(0)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
ui->numLabel->setText(tr("TELE%1").arg(sensorIndex + 1));
|
||||
ui->numLabel->setProperty("index", sensorIndex);
|
||||
ui->numLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||
QFontMetrics *f = new QFontMetrics(QFont());
|
||||
QSize sz;
|
||||
sz = f->size(Qt::TextSingleLine, "TELE00");
|
||||
ui->numLabel->setMinimumWidth(sz.width());
|
||||
ui->numLabel->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
ui->numLabel->setToolTip(tr("Popup menu available"));
|
||||
ui->numLabel->setMouseTracking(true);
|
||||
connect(ui->numLabel, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(on_customContextMenuRequested(QPoint)));
|
||||
ui->id->setField(sensor.id, this);
|
||||
ui->instance->setField(sensor.instance, this);
|
||||
ui->ratio->setField(sensor.ratio, this);
|
||||
@@ -613,7 +628,7 @@ TelemetrySensorPanel::TelemetrySensorPanel(QWidget *parent, SensorData & sensor,
|
||||
ui->ampsSensor->setField(sensor.amps, this);
|
||||
ui->cellsSensor->setField(sensor.source, this);
|
||||
ui->cellsIndex->addItem(tr("Lowest"), SensorData::TELEM_CELL_INDEX_LOWEST);
|
||||
for (int i=1; i<=6; i++)
|
||||
for (int i = 1; i <= 6; i++)
|
||||
ui->cellsIndex->addItem(tr("Cell %1").arg(i), i);
|
||||
ui->cellsIndex->addItem(tr("Highest"), SensorData::TELEM_CELL_INDEX_HIGHEST);
|
||||
ui->cellsIndex->addItem(tr("Delta"), SensorData::TELEM_CELL_INDEX_DELTA);
|
||||
@@ -622,6 +637,7 @@ TelemetrySensorPanel::TelemetrySensorPanel(QWidget *parent, SensorData & sensor,
|
||||
ui->source2->setField(sensor.sources[1], this);
|
||||
ui->source3->setField(sensor.sources[2], this);
|
||||
ui->source4->setField(sensor.sources[3], this);
|
||||
ui->prec->setField(sensor.prec, 0, 2, false, "", this);
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -645,7 +661,21 @@ void TelemetrySensorPanel::update()
|
||||
ui->name->setText(sensor.label);
|
||||
ui->type->setCurrentIndex(sensor.type);
|
||||
ui->unit->setCurrentIndex(sensor.unit);
|
||||
ui->prec->setValue(sensor.prec);
|
||||
ui->id->updateValue();
|
||||
ui->instance->updateValue();
|
||||
ui->ratio->updateValue();
|
||||
ui->offset->updateValue();
|
||||
ui->autoOffset->updateValue();
|
||||
ui->filter->updateValue();
|
||||
ui->logs->updateValue();
|
||||
ui->persistent->updateValue();
|
||||
ui->onlyPositive->updateValue();
|
||||
ui->gpsSensor->updateValue();
|
||||
ui->altSensor->updateValue();
|
||||
ui->ampsSensor->updateValue();
|
||||
ui->cellsSensor->updateValue();
|
||||
ui->cellsIndex->updateValue();
|
||||
ui->prec->updateValue();
|
||||
|
||||
if (sensor.type == SensorData::TELEM_TYPE_CALCULATED) {
|
||||
sensor.updateUnit();
|
||||
@@ -825,15 +855,85 @@ void TelemetrySensorPanel::on_unit_currentIndexChanged(int index)
|
||||
}
|
||||
}
|
||||
|
||||
void TelemetrySensorPanel::on_prec_valueChanged(double value)
|
||||
void TelemetrySensorPanel::on_prec_valueChanged()
|
||||
{
|
||||
if (!lock) {
|
||||
sensor.prec = value;
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
void TelemetrySensorPanel::on_customContextMenuRequested(QPoint pos)
|
||||
{
|
||||
QLabel *label = (QLabel *)sender();
|
||||
selectedIndex = label->property("index").toInt();
|
||||
QPoint globalPos = label->mapToGlobal(pos);
|
||||
|
||||
QMenu contextMenu;
|
||||
contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"),this,SLOT(cmCopy()));
|
||||
contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"),this,SLOT(cmCut()));
|
||||
contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"),this,SLOT(cmPaste()))->setEnabled(hasClipboardData());
|
||||
contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"),this,SLOT(cmClear()));
|
||||
contextMenu.addSeparator();
|
||||
contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"),this,SLOT(cmClearAll()));
|
||||
|
||||
contextMenu.exec(globalPos);
|
||||
}
|
||||
|
||||
bool TelemetrySensorPanel::hasClipboardData(QByteArray * data) const
|
||||
{
|
||||
const QClipboard * clipboard = QApplication::clipboard();
|
||||
const QMimeData * mimeData = clipboard->mimeData();
|
||||
if (mimeData->hasFormat(MIMETYPE_TELE_SENSOR)) {
|
||||
if (data)
|
||||
data->append(mimeData->data(MIMETYPE_TELE_SENSOR));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void TelemetrySensorPanel::cmCopy()
|
||||
{
|
||||
QByteArray data;
|
||||
data.append((char*)&sensor, sizeof(SensorData));
|
||||
QMimeData *mimeData = new QMimeData;
|
||||
mimeData->setData(MIMETYPE_TELE_SENSOR, data);
|
||||
QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard);
|
||||
}
|
||||
|
||||
void TelemetrySensorPanel::cmCut()
|
||||
{
|
||||
cmCopy();
|
||||
cmClear();
|
||||
}
|
||||
|
||||
void TelemetrySensorPanel::cmPaste()
|
||||
{
|
||||
QByteArray data;
|
||||
if (hasClipboardData(&data)) {
|
||||
memcpy(&sensor, data.constData(), sizeof(SensorData));
|
||||
emit dataModified();
|
||||
emit modified();
|
||||
}
|
||||
}
|
||||
|
||||
void TelemetrySensorPanel::cmClear()
|
||||
{
|
||||
if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear Telemetry Sensor. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)
|
||||
return;
|
||||
|
||||
sensor.clear();
|
||||
emit dataModified();
|
||||
emit modified();
|
||||
}
|
||||
|
||||
void TelemetrySensorPanel::cmClearAll()
|
||||
{
|
||||
if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Telemetry Sensors. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)
|
||||
return;
|
||||
|
||||
emit clearAllSensors();
|
||||
}
|
||||
|
||||
/******************************************************/
|
||||
|
||||
TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware):
|
||||
@@ -851,12 +951,13 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin
|
||||
ui->varioCenterSilent->setField(model.frsky.varioCenterSilent, this);
|
||||
ui->A1GB->hide();
|
||||
ui->A2GB->hide();
|
||||
for (unsigned i=0; i<CPN_MAX_SENSORS; ++i) {
|
||||
TelemetrySensorPanel * panel = new TelemetrySensorPanel(this, model.sensorData[i], model, generalSettings, firmware);
|
||||
for (unsigned i= 0; i < CPN_MAX_SENSORS; ++i) {
|
||||
TelemetrySensorPanel * panel = new TelemetrySensorPanel(this, model.sensorData[i], i, model, generalSettings, firmware);
|
||||
ui->sensorsLayout->addWidget(panel);
|
||||
sensorPanels[i] = panel;
|
||||
connect(panel, SIGNAL(dataModified()), this, SLOT(update()));
|
||||
connect(panel, SIGNAL(modified()), this, SLOT(onModified()));
|
||||
connect(panel, SIGNAL(clearAllSensors()), this, SLOT(on_clearAllSensors()));
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -869,7 +970,7 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin
|
||||
ui->A2Layout->addWidget(analogs[1]);
|
||||
connect(analogs[1], SIGNAL(modified()), this, SLOT(onModified()));
|
||||
}
|
||||
|
||||
|
||||
if (IS_TARANIS_X9(firmware->getBoard())) {
|
||||
ui->voltsSource->setField(model.frsky.voltsSource, this);
|
||||
ui->altitudeSource->setField(model.frsky.altitudeSource, this);
|
||||
@@ -881,7 +982,7 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin
|
||||
RawSourceFilterItemModel * srcModel = (new RawSourceFilterItemModel(&generalSettings, &model, this));
|
||||
connect(this, &TelemetryPanel::updated, srcModel, &RawSourceFilterItemModel::update);
|
||||
|
||||
for (int i=0; i<firmware->getCapability(TelemetryCustomScreens); i++) {
|
||||
for (int i = 0; i < firmware->getCapability(TelemetryCustomScreens); i++) {
|
||||
TelemetryCustomScreen * tab = new TelemetryCustomScreen(this, model, model.frsky.screens[i], generalSettings, firmware, srcModel);
|
||||
ui->customScreens->addTab(tab, tr("Telemetry screen %1").arg(i+1));
|
||||
telemetryCustomScreens[i] = tab;
|
||||
@@ -963,7 +1064,7 @@ void TelemetryPanel::setup()
|
||||
ui->rssiSourceCB->setField(model->rssiSource, this);
|
||||
ui->rssiSourceCB->show();
|
||||
populateTelemetrySourcesComboBox(ui->rssiSourceCB, model, false);
|
||||
|
||||
|
||||
ui->rssiAlarmWarningCB->hide();
|
||||
ui->rssiAlarmCriticalCB->hide();
|
||||
ui->rssiAlarmWarningLabel->setText(tr("Low Alarm"));
|
||||
@@ -1198,3 +1299,13 @@ void TelemetryPanel::on_mahCount_ChkB_toggled(bool checked)
|
||||
ui->mahCount_SB->setDisabled(!checked);
|
||||
emit modified();
|
||||
}
|
||||
|
||||
void TelemetryPanel::on_clearAllSensors()
|
||||
{
|
||||
for (int i = 0; i < CPN_MAX_SENSORS; i++) {
|
||||
model->sensorData[i].clear();
|
||||
}
|
||||
|
||||
update();
|
||||
emit modified();
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#include "modeledit.h"
|
||||
#include "eeprominterface.h"
|
||||
|
||||
constexpr char MIMETYPE_TELE_SENSOR[] = "application/x-companion-tele-sensor";
|
||||
|
||||
class AutoComboBox;
|
||||
class RawSourceFilterItemModel;
|
||||
class TimerEdit;
|
||||
@@ -103,19 +105,27 @@ class TelemetrySensorPanel: public ModelPanel
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TelemetrySensorPanel(QWidget *parent, SensorData & sensor, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware);
|
||||
TelemetrySensorPanel(QWidget *parent, SensorData & sensor, int sensorIndex, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware);
|
||||
~TelemetrySensorPanel();
|
||||
void update();
|
||||
|
||||
signals:
|
||||
void dataModified();
|
||||
void clearAllSensors();
|
||||
|
||||
protected slots:
|
||||
void on_name_editingFinished();
|
||||
void on_type_currentIndexChanged(int index);
|
||||
void on_formula_currentIndexChanged(int index);
|
||||
void on_unit_currentIndexChanged(int index);
|
||||
void on_prec_valueChanged(double value);
|
||||
void on_prec_valueChanged();
|
||||
void on_customContextMenuRequested(QPoint pos);
|
||||
bool hasClipboardData(QByteArray * data = nullptr) const;
|
||||
void cmCopy();
|
||||
void cmCut();
|
||||
void cmPaste();
|
||||
void cmClear();
|
||||
void cmClearAll();
|
||||
|
||||
protected:
|
||||
void updateSourcesComboBox(AutoComboBox * cb, bool negative);
|
||||
@@ -123,7 +133,9 @@ class TelemetrySensorPanel: public ModelPanel
|
||||
private:
|
||||
Ui::TelemetrySensor * ui;
|
||||
SensorData & sensor;
|
||||
bool lock;
|
||||
bool lock = false;
|
||||
int sensorIndex = 0;
|
||||
int selectedIndex = 0;
|
||||
};
|
||||
|
||||
class TelemetryPanel : public ModelPanel
|
||||
@@ -154,6 +166,7 @@ class TelemetryPanel : public ModelPanel
|
||||
void on_fasOffset_DSB_editingFinished();
|
||||
void on_mahCount_SB_editingFinished();
|
||||
void on_mahCount_ChkB_toggled(bool checked);
|
||||
void on_clearAllSensors();
|
||||
|
||||
private:
|
||||
Ui::Telemetry *ui;
|
||||
|
||||
@@ -13,13 +13,32 @@
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0,0,0,1,0,0,1,1,1,0,0,1,0,1,0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,1,0,0,0,1,0,0,1,1,1,0,0,1,0,1,0,1,1,1,1,1,1,0,0,0,0,1,0,0,1,0,0,0,0,0">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="numLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>TELE##</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="name">
|
||||
<property name="sizePolicy">
|
||||
@@ -520,6 +539,11 @@
|
||||
<string>US fl.Oz.</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>ml/min</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@@ -536,23 +560,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDoubleSpinBox" name="prec">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>2.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="AutoPrecisionComboBox" name="prec"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="ratioLabel">
|
||||
@@ -711,6 +719,11 @@
|
||||
<extends>QSpinBox</extends>
|
||||
<header>autohexspinbox.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>AutoPrecisionComboBox</class>
|
||||
<extends>QComboBox</extends>
|
||||
<header>autoprecisioncombobox.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
||||
@@ -15,6 +15,7 @@ set(shared_HDRS
|
||||
autolineedit.h
|
||||
genericpanel.h
|
||||
hexspinbox.h
|
||||
autoprecisioncombobox.h
|
||||
)
|
||||
|
||||
qt5_wrap_cpp(shared_SRCS ${shared_HDRS})
|
||||
|
||||
@@ -0,0 +1,257 @@
|
||||
/*
|
||||
* Copyright (C) OpenTX
|
||||
*
|
||||
* Based on code named
|
||||
* th9x - http://code.google.com/p/th9x
|
||||
* er9x - http://code.google.com/p/er9x
|
||||
* gruvin9x - http://code.google.com/p/gruvin9x
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _AUTOPRECISIONCOMBOBOX_H_
|
||||
#define _AUTOPRECISIONCOMBOBOX_H_
|
||||
|
||||
#include "genericpanel.h"
|
||||
|
||||
#include <QComboBox>
|
||||
#include <QString>
|
||||
|
||||
class AutoPrecisionComboBox: public QComboBox
|
||||
{
|
||||
Q_OBJECT
|
||||
//! \property minDecimals Determines the first list item
|
||||
Q_PROPERTY(unsigned int minDecimals READ minDecimals WRITE setMinDecimals)
|
||||
//! \property maxDecimals Determines the last list item
|
||||
Q_PROPERTY(unsigned int maxDecimals READ maxDecimals WRITE setMaxDecimals)
|
||||
//! \property padding If true, add trailing underscore placeholders to each list item
|
||||
Q_PROPERTY(bool padding READ padding WRITE setPadding)
|
||||
//! \property suffix Optional text suffix to each list value
|
||||
Q_PROPERTY(QString suffix READ suffix WRITE setSuffix)
|
||||
|
||||
public:
|
||||
explicit AutoPrecisionComboBox(QWidget * parent = nullptr):
|
||||
QComboBox(parent)
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
||||
explicit AutoPrecisionComboBox(unsigned int & field, unsigned int minDecimals = 0, unsigned int maxDecimals = 1, bool padding = false, QString suffix = "", QWidget * parent = nullptr, GenericPanel * panel = nullptr):
|
||||
QComboBox(parent)
|
||||
{
|
||||
setField(field, minDecimals, maxDecimals, padding, suffix, panel);
|
||||
init();
|
||||
}
|
||||
|
||||
explicit AutoPrecisionComboBox(int & field, unsigned int minDecimals = 0, unsigned int maxDecimals = 1, bool padding = false, QString suffix = "", QWidget * parent = nullptr, GenericPanel * panel = nullptr):
|
||||
QComboBox(parent)
|
||||
{
|
||||
setField(field, minDecimals, maxDecimals, padding, suffix, panel);
|
||||
init();
|
||||
}
|
||||
|
||||
inline int minDecimals() const { return m_minDecimals; }
|
||||
inline int maxDecimals() const { return m_maxDecimals; }
|
||||
inline bool padding() const { return m_padding; }
|
||||
inline QString suffix() const { return m_suffix; }
|
||||
|
||||
public slots:
|
||||
void setField(int & field, unsigned int minDecimals = 0, unsigned int maxDecimals = 1, bool padding = false, QString suffix = "", GenericPanel * panel = nullptr)
|
||||
{
|
||||
m_field = reinterpret_cast<unsigned int *>(&field);
|
||||
initField(minDecimals, maxDecimals, padding, suffix);
|
||||
setPanel(panel);
|
||||
}
|
||||
|
||||
void setField(unsigned int & field, unsigned int minDecimals = 0, unsigned int maxDecimals = 1, bool padding = false, QString suffix = "", GenericPanel * panel = nullptr)
|
||||
{
|
||||
m_field = &field;
|
||||
initField(minDecimals, maxDecimals, padding, suffix);
|
||||
setPanel(panel);
|
||||
}
|
||||
|
||||
void setMinDecimals(unsigned int minDecimals)
|
||||
{
|
||||
m_minDecimals = rangecheckDecimals(minDecimals);
|
||||
if (m_minDecimals > m_maxDecimals)
|
||||
m_minDecimals = m_maxDecimals;
|
||||
if (!m_lock)
|
||||
updateList();
|
||||
}
|
||||
|
||||
void setMaxDecimals(unsigned int maxDecimals)
|
||||
{
|
||||
m_maxDecimals = rangecheckDecimals(maxDecimals);
|
||||
if (m_maxDecimals < m_minDecimals)
|
||||
m_maxDecimals = m_minDecimals;
|
||||
if (!m_lock)
|
||||
updateList();
|
||||
}
|
||||
|
||||
void setPadding(bool padding)
|
||||
{
|
||||
m_padding = padding;
|
||||
if (!m_lock)
|
||||
updateList();
|
||||
}
|
||||
|
||||
void setSuffix(QString suffix)
|
||||
{
|
||||
m_suffix = suffix.trimmed();
|
||||
if (!m_lock)
|
||||
updateList();
|
||||
}
|
||||
|
||||
void setPanel(GenericPanel * panel)
|
||||
{
|
||||
m_panel = panel;
|
||||
}
|
||||
|
||||
void setValue(int value)
|
||||
{
|
||||
if (!m_field)
|
||||
return;
|
||||
const unsigned int val = (unsigned int)value;
|
||||
if (*m_field != val) {
|
||||
*m_field = rangecheckDecimals(val);
|
||||
updateValue();
|
||||
emit valueChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void setValue(unsigned int value)
|
||||
{
|
||||
if (!m_field)
|
||||
return;
|
||||
if (*m_field != value) {
|
||||
*m_field = rangecheckDecimals(value);
|
||||
updateValue();
|
||||
emit valueChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void updateValue()
|
||||
{
|
||||
if (!m_field)
|
||||
return;
|
||||
if (!isValidDecimals(*m_field))
|
||||
return;
|
||||
if (*m_field > m_maxDecimals) {
|
||||
setMaxDecimals(*m_field);
|
||||
}
|
||||
const bool savedlock = setLocked(true);
|
||||
setCurrentIndex(findData(*m_field));
|
||||
setLocked(savedlock);
|
||||
}
|
||||
|
||||
void setAutoIndexes()
|
||||
{
|
||||
for (int i = 0; i < count(); ++i)
|
||||
setItemData(i, i);
|
||||
updateValue();
|
||||
}
|
||||
|
||||
signals:
|
||||
void valueChanged();
|
||||
|
||||
protected slots:
|
||||
void init()
|
||||
{
|
||||
connect(this, QOverload<int>::of(&AutoPrecisionComboBox::currentIndexChanged), this, &AutoPrecisionComboBox::onCurrentIndexChanged);
|
||||
}
|
||||
|
||||
void initField(unsigned int minDecimals, unsigned int maxDecimals, bool padding, QString suffix)
|
||||
{
|
||||
const bool savedlock = setLocked(true);
|
||||
setMinDecimals(minDecimals);
|
||||
setMaxDecimals(maxDecimals);
|
||||
setPadding(padding);
|
||||
setSuffix(suffix);
|
||||
setLocked(savedlock);
|
||||
updateList();
|
||||
}
|
||||
|
||||
void updateList()
|
||||
{
|
||||
const bool savedlock = setLocked(true);
|
||||
unsigned int i;
|
||||
int j;
|
||||
clear();
|
||||
|
||||
for (i = APCB_DECIMALS_MIN, j = (int)m_maxDecimals; j >= 0; i++, j--) {
|
||||
if (i >= m_minDecimals) {
|
||||
QString str = QString("0.%1").arg(QString(i, '0'));
|
||||
if (m_padding)
|
||||
str.append(QString(j, '_'));
|
||||
if (m_suffix != "")
|
||||
str.append(QString(" %1").arg(m_suffix));
|
||||
addItem(str, i);
|
||||
}
|
||||
}
|
||||
|
||||
setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
||||
setLocked(savedlock);
|
||||
}
|
||||
|
||||
void onCurrentIndexChanged(int index)
|
||||
{
|
||||
if (index < 0)
|
||||
return;
|
||||
if (m_field && !m_lock) {
|
||||
*m_field = itemData(index).toUInt();
|
||||
if (m_panel)
|
||||
emit m_panel->modified();
|
||||
emit valueChanged();
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int rangecheckDecimals(unsigned int decimals)
|
||||
{
|
||||
unsigned int ret;
|
||||
if (decimals < APCB_DECIMALS_MIN)
|
||||
ret = APCB_DECIMALS_MIN;
|
||||
else if (decimals > APCB_DECIMALS_MAX)
|
||||
ret = APCB_DECIMALS_MAX;
|
||||
else
|
||||
ret = decimals;
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool isValidDecimals(unsigned int value)
|
||||
{
|
||||
if (value >= APCB_DECIMALS_MIN && value <= APCB_DECIMALS_MAX)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool setLocked(bool lock)
|
||||
{
|
||||
const bool ret = m_lock;
|
||||
m_lock = lock;
|
||||
return ret;
|
||||
}
|
||||
|
||||
protected:
|
||||
constexpr static unsigned int APCB_DECIMALS_MIN = {0};
|
||||
constexpr static unsigned int APCB_DECIMALS_MAX = {6};
|
||||
|
||||
unsigned int * m_field = nullptr;
|
||||
GenericPanel * m_panel = nullptr;
|
||||
unsigned int m_minDecimals = 0;
|
||||
unsigned int m_maxDecimals = 0;
|
||||
bool m_padding = false;
|
||||
QString m_suffix = "";
|
||||
bool m_lock = false;
|
||||
};
|
||||
|
||||
#endif // _AUTOPRECISIONCOMBOBOX_H_
|
||||
@@ -39,6 +39,7 @@ class GenericPanel : public QWidget
|
||||
friend class AutoHexSpinBox;
|
||||
friend class AutoLineEdit;
|
||||
friend class GVarGroup;
|
||||
friend class AutoPrecisionComboBox;
|
||||
|
||||
public:
|
||||
GenericPanel(QWidget *parent, ModelData * model, GeneralSettings & generalSettings, Firmware * firmware);
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
;Include Modern UI
|
||||
|
||||
!include "MUI2.nsh"
|
||||
!include "nsDialogs.nsh"
|
||||
!include "@CMAKE_CURRENT_SOURCE_DIR@\..\targets\windows\FileAssociation.nsh"
|
||||
|
||||
;--------------------------------
|
||||
@@ -32,6 +33,10 @@
|
||||
;Variables
|
||||
|
||||
Var StartMenuFolder
|
||||
Var StartMenuLocationDialog
|
||||
Var StartMenuLocationRadioCurrent
|
||||
Var StartMenuLocationRadioAll
|
||||
Var StartMenuLocationValue ; "current_user" or "all_users"
|
||||
|
||||
;--------------------------------
|
||||
;Interface Settings
|
||||
@@ -68,9 +73,11 @@
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\OpenTX\Companion @VERSION_FAMILY@"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
|
||||
|
||||
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
|
||||
|
||||
;Start Menu Folder for current user or all users?
|
||||
Page custom StartMenuLocationCreator StartMenuLocationLeave
|
||||
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
|
||||
# These indented statements modify settings for MUI_PAGE_FINISH
|
||||
@@ -127,10 +134,14 @@ Section "OpenTX Companion @VERSION_FAMILY@" SecDummy
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||
|
||||
;Create shortcuts
|
||||
${If} $StartMenuLocationValue == "all_users"
|
||||
SetShellVarContext all
|
||||
${Endif}
|
||||
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
|
||||
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Companion @VERSION_FAMILY@.lnk" "$INSTDIR\companion.exe"
|
||||
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Firmware Simulator @VERSION_FAMILY@.lnk" "$INSTDIR\simulator.exe"
|
||||
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall Companion @VERSION_FAMILY@.lnk" "$INSTDIR\Uninstall.exe"
|
||||
SetShellVarContext current
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
|
||||
@@ -142,6 +153,14 @@ SectionEnd
|
||||
;Language strings
|
||||
LangString DESC_SecDummy ${LANG_ENGLISH} "Models and settings editor for OpenTX"
|
||||
LangString DESC_SecDummy ${LANG_FRENCH} "Editeur de r�glages et mod�les pour OpenTX"
|
||||
LangString SML_SubTitle ${LANG_ENGLISH} "Choose a location for the Start Menu shortcuts"
|
||||
LangString SML_SubTitle ${LANG_FRENCH} "Choisissez un emplacement pour les raccourcis de l'application"
|
||||
LangString SML_MainLabel ${LANG_ENGLISH} "Create start menu shortcuts for:"
|
||||
LangString SML_MainLabel ${LANG_FRENCH} "Emplacement pour les raccourcis de l'application:"
|
||||
LangString SML_RadioCurrent ${LANG_ENGLISH} "Current user only"
|
||||
LangString SML_RadioCurrent ${LANG_FRENCH} "Utilisateur actuel"
|
||||
LangString SML_RadioAll ${LANG_ENGLISH} "All users"
|
||||
LangString SML_RadioAll ${LANG_FRENCH} "Tous les utilisateurs"
|
||||
|
||||
;Assign language strings to sections
|
||||
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
||||
@@ -204,6 +223,13 @@ Section "un.OpenTX Companion @VERSION_FAMILY@"
|
||||
|
||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
|
||||
|
||||
; Always remove start menu folder for both locations: current user and all users
|
||||
SetShellVarContext all
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Companion @VERSION_FAMILY@.lnk"
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Firmware Simulator @VERSION_FAMILY@.lnk"
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall Companion @VERSION_FAMILY@.lnk"
|
||||
RMDir "$SMPROGRAMS\$StartMenuFolder"
|
||||
SetShellVarContext current
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Companion @VERSION_FAMILY@.lnk"
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Firmware Simulator @VERSION_FAMILY@.lnk"
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall Companion @VERSION_FAMILY@.lnk"
|
||||
@@ -219,3 +245,58 @@ SectionEnd
|
||||
Function LaunchLink
|
||||
ExecShell "" "$INSTDIR\companion.exe"
|
||||
FunctionEnd
|
||||
|
||||
|
||||
; Custom page with radio buttons, if the start menu entries shall be created
|
||||
; for the current user or for all users.
|
||||
Function StartMenuLocationCreator
|
||||
; Set default value if not already set. Do this before we might "abort" this page.
|
||||
${If} $StartMenuLocationValue == ""
|
||||
StrCpy $StartMenuLocationValue "current_user"
|
||||
${EndIf}
|
||||
|
||||
; If the folder starts with >, the user has chosen not to create a shortcut (see NSIS/StartMenu.nsh)
|
||||
StrCpy $R0 $StartMenuFolder 1
|
||||
${If} $R0 == ">"
|
||||
Abort
|
||||
${EndIf}
|
||||
|
||||
!insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(SML_SubTitle)
|
||||
|
||||
nsDialogs::Create 1018
|
||||
Pop $StartMenuLocationDialog
|
||||
|
||||
${If} $StartMenuLocationDialog == error
|
||||
Abort
|
||||
${EndIf}
|
||||
|
||||
${NSD_CreateLabel} 0u 0u 100% 12u $(SML_MainLabel)
|
||||
Pop $R0
|
||||
|
||||
${NSD_CreateRadioButton} 8u 20u 100% 12u $(SML_RadioCurrent)
|
||||
Pop $StartMenuLocationRadioCurrent
|
||||
${NSD_AddStyle} $StartMenuLocationRadioCurrent ${WS_GROUP}
|
||||
|
||||
${NSD_CreateRadioButton} 8u 40u 100% 12u $(SML_RadioAll)
|
||||
Pop $StartMenuLocationRadioAll
|
||||
|
||||
${If} $StartMenuLocationValue == "all_users"
|
||||
${NSD_SetState} $StartMenuLocationRadioAll ${BST_CHECKED}
|
||||
${Else}
|
||||
${NSD_SetState} $StartMenuLocationRadioCurrent ${BST_CHECKED}
|
||||
${EndIf}
|
||||
|
||||
${NSD_OnBack} StartMenuLocationLeave
|
||||
|
||||
nsDialogs::Show
|
||||
FunctionEnd
|
||||
|
||||
; Converts the radio button state back into a value for "StartMenuLocationValue"
|
||||
Function StartMenuLocationLeave
|
||||
${NSD_GetState} $StartMenuLocationRadioAll $R0
|
||||
${If} $R0 == ${BST_CHECKED}
|
||||
StrCpy $StartMenuLocationValue "all_users"
|
||||
${Else}
|
||||
StrCpy $StartMenuLocationValue "current_user"
|
||||
${Endif}
|
||||
FunctionEnd
|
||||
|
||||
Binary file not shown.
@@ -489,7 +489,7 @@ end
|
||||
local function runPopupPage(event)
|
||||
local result
|
||||
if fieldPopup.status == 3 then
|
||||
result = popupConfirmation(fieldPopup.info, event)
|
||||
result = popupConfirmation("Confirmation", fieldPopup.info, event)
|
||||
else
|
||||
result = popupWarning(fieldPopup.info, event)
|
||||
end
|
||||
|
||||
@@ -0,0 +1,377 @@
|
||||
local toolName = "TNS|Multi chan namer|TNE"
|
||||
|
||||
---- #########################################################################
|
||||
---- # #
|
||||
---- # Copyright (C) OpenTX #
|
||||
-----# #
|
||||
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html #
|
||||
---- # #
|
||||
---- # This program is free software; you can redistribute it and/or modify #
|
||||
---- # it under the terms of the GNU General Public License version 2 as #
|
||||
---- # published by the Free Software Foundation. #
|
||||
---- # #
|
||||
---- # This program is distributed in the hope that it will be useful #
|
||||
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
---- # GNU General Public License for more details. #
|
||||
---- # #
|
||||
---- #########################################################################
|
||||
|
||||
local done = 0
|
||||
local Protocols = {
|
||||
{1, 0, "Flysky", "Flysky", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{1, 1, "Flysky", "V9x9", { "Flip", "Light", "Pict", "Video" }, 1 },
|
||||
{1, 2, "Flysky", "V6x6", { "Flip", "Light", "Pict", "Video", "HLess", "RTH", "XCAL", "YCAL" }, 1 },
|
||||
{1, 3, "Flysky", "V912", { "BtmBtn", "TopBtn" }, 1 },
|
||||
{1, 4, "Flysky", "CX20", { "CH5", "CH6", "CH7" }, 0 },
|
||||
{28, 0, "Flysky AFHDS2A", "PWM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{28, 1, "Flysky AFHDS2A", "PPM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{28, 2, "Flysky AFHDS2A", "PWM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{28, 3, "Flysky AFHDS2A", "PPM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{53, 0, "Flyzone", "FZ-410", { }, 0 },
|
||||
{2, 0, "Hubsan", "H107", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{2, 1, "Hubsan", "H301", { "RTH", "Light", "Stab", "Video" }, 0 },
|
||||
{2, 2, "Hubsan", "H501", { "RTH", "Light", "Pict", "Video", "HLess", "GPS_H", "ALT_H", "Flip", "FModes" }, 0 },
|
||||
{41, 0, "Bugs", "3-6-8", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 },
|
||||
{60, 0, "Pelikan", "PRO_V4", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{37, 0, "Corona", "COR_V1", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{37, 1, "Corona", "COR_V2", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{37, 2, "Corona", "FD_V3", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{25, 0, "FrSkyV", "V8", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{3, 0, "FrSkyD", "D8", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{3, 0, "FrSkyD", "D8Cloned", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{67, 0, "FrSkyL", "LR12", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{67, 1, "FrSkyL", "LR12_6CH", { "CH5", "CH6" }, 0 },
|
||||
{15, 0, "FrSkyX", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{15, 1, "FrSkyX", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{15, 2, "FrSkyX", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{15, 3, "FrSkyX", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{15, 4, "FrSkyX", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{64, 0, "FrSkyX2", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{64, 1, "FrSkyX2", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{64, 2, "FrSkyX2", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{64, 3, "FrSkyX2", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 1 },
|
||||
{64, 4, "FrSkyX2", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{55, 0, "FrSkyRX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{55, 1, "FrSkyRX", "CloneTX", { }, 0 },
|
||||
{39, 0, "Hitec", "Opt_Fw", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{39, 1, "Hitec", "Opt_Hub", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{39, 2, "Hitec", "Minima", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{57, 0, "HoTT", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{21, 0, "SFHSS", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{68, 0, "Skyartec", "Std", { "CH5", "CH6", "CH7" }, 0 },
|
||||
{7 , 0, "Devo", "8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{7 , 1, "Devo", "10CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" }, 0 },
|
||||
{7 , 2, "Devo", "12CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{7 , 3, "Devo", "6CH", { "CH5", "CH6" }, 0 },
|
||||
{7 , 4, "Devo", "7CH", { "CH5", "CH6", "CH7" }, 0 },
|
||||
{30, 0, "WK2x01", "WK2801", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{30, 1, "WK2x01", "WK2401", { }, 0 },
|
||||
{30, 2, "WK2x01", "W6_5_1", { "Gear", "Dis", "Gyro" }, 0 },
|
||||
{30, 3, "WK2x01", "W6_6_1", { "Gear", "Col", "Gyro" }, 0 },
|
||||
{30, 4, "WK2x01", "W6HEL", { "Gear", "Col", "Gyro" }, 0 },
|
||||
{30, 5, "WK2x01", "W6HEL_I", { "Gear", "Col", "Gyro" }, 0 },
|
||||
{6 , 0, "DSM", "2_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{6 , 1, "DSM", "2_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{6 , 2, "DSM", "X_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{6 , 3, "DSM", "X_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{22, 0, "J6Pro", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{22, 0, "WFLY", "WFR0xS", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{24, 0, "Assan", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{14, 0, "Bayang", "Std", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "n-a", "n-a", "AnAux1", "AnAux2" }, 1 },
|
||||
{14, 1, "Bayang", "H8S3D", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates" }, 1 },
|
||||
{14, 2, "Bayang", "X16_AH", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf" }, 1 },
|
||||
{14, 3, "Bayang", "IRDRONE", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 },
|
||||
{14, 4, "Bayang", "DHD_D4", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 },
|
||||
{59, 0, "BayangRX", "RX", { "AnAux1", "AnAux2", "Flip", "RTH", "Pict", "Video" }, 1 },
|
||||
{42, 0, "BugsMini", "Mini", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 },
|
||||
{42, 1, "BugsMini", "3H", { "Arm", "Angle", "Flip", "Pict", "Video", "LED", "AltHol" }, 0 },
|
||||
{34, 0, "Cabell", "V3", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{34, 1, "Cabell", "V3Telem", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{13, 0, "CG023", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{13, 1, "CG023", "YD829", { "Flip", "n-a", "Pict", "Video", "HLess" }, 1 },
|
||||
{12, 0, "CX10", "Green", { "Flip", "Rate" }, 1 },
|
||||
{12, 1, "CX10", "Blue", { "Flip", "Rate", "Pict", "Video" }, 1 },
|
||||
{12, 2, "CX10", "DM007", { "Flip", "Mode", "Pict", "Video", "HLess" }, 1 },
|
||||
{12, 4, "CX10", "JC3015_1", { "Flip", "Mode", "Pict", "Video" }, 1 },
|
||||
{12, 5, "CX10", "JC3015_2", { "Flip", "Mode", "LED", "DFlip" }, 1 },
|
||||
{12, 6, "CX10", "MK33041", { "Flip", "Mode", "Pict", "Video", "HLess", "RTH" }, 1 },
|
||||
{33, 0, "DM022", "Std", { "Flip", "LED", "Cam1", "Cam2", "HLess", "RTH", "RLow" }, 1 },
|
||||
{45, 0, "E01X", "E012", { "n-a", "Flip", "n-a", "HLess", "RTH" }, 1 },
|
||||
{45, 1, "E01X", "E015", { "Arm", "Flip", "LED", "HLess", "RTH" }, 1 },
|
||||
{45, 2, "E01X", "E016H", { "Stop", "Flip", "n-a", "HLess", "RTH" }, 1 },
|
||||
{16, 0, "ESKY", "Std", { "Gyro", "Pitch" }, 0 },
|
||||
{16, 1, "ESKY", "ET4", { "Gyro", "Pitch" }, 0 },
|
||||
{35, 0, "ESKY150", "4CH", { }, 0 },
|
||||
{35, 1, "ESKY150", "7CH", { "FMode", "Aux6", "Aux7" }, 0 },
|
||||
{20, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 },
|
||||
{20, 1, "FY326", "FY319", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 },
|
||||
{23, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert" }, 1 },
|
||||
{32, 0, "GW008", "FY326", { "Flip" }, 1 },
|
||||
{36, 0, "H8_3D", "Std", { "Flip", "Light", "Pict", "Video", "RTH", "FlMode", "Cal1" }, 1 },
|
||||
{36, 1, "H8_3D", "H20H", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 },
|
||||
{36, 2, "H8_3D", "H20", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 },
|
||||
{36, 3, "H8_3D", "H30", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 },
|
||||
{4 , 0, "Hisky", "Std", { "Gear", "Pitch", "Gyro", "CH8" }, 0 },
|
||||
{9 , 0, "KN", "WLToys", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 },
|
||||
{9 , 1, "KN", "Feilun", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 },
|
||||
{26, 0, "Hontai", "Std", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{26, 1, "Hontai", "JJRCX1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{26, 2, "Hontai", "X5C1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{26, 3, "Hontai", "FQ777_951", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{18, 0, "MJXQ", "WHL08", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 1, "MJXQ", "X600", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 2, "MJXQ", "X800", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 3, "MJXQ", "H26D", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 4, "MJXQ", "E010", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 5, "MJXQ", "H26WH", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 6, "MJXQ", "Phoenix", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{17, 0, "MT99XX", "Std", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 1, "MT99XX", "H7", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 2, "MT99XX", "YZ", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 3, "MT99XX", "LS", { "Flip", "Invert", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 },
|
||||
{44, 0, "NCC1701", "Std", { "Warp" }, 1 },
|
||||
{51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 },
|
||||
{56, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 },
|
||||
{29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 },
|
||||
{29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 },
|
||||
{29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 },
|
||||
{31, 0, "Q303", "Q303", { "AltHol", "Flip", "Pict", "Video", "HLess", "RTH", "Gimbal" }, 1 },
|
||||
{31, 1, "Q303", "C35", { "Arm", "VTX", "Pict", "Video", "n-a", "RTH", "Gimbal" }, 1 },
|
||||
{31, 2, "Q303", "CX10D", { "Arm", "Flip" }, 1 },
|
||||
{31, 3, "Q303", "CX10WD", { "Arm", "Flip" }, 1 },
|
||||
{50, 0, "Redpine", "Fast", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 },
|
||||
{50, 1, "Redpine", "Slow", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 },
|
||||
{11, 0, "SLT", "V1", { "Gear", "Pitch" }, 0 },
|
||||
{11, 1, "SLT", "V2", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{11, 2, "SLT", "Q100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "n-a", "n-a", "Calib" }, 0 },
|
||||
{11, 3, "SLT", "Q200", { "Rates", "n-a", "CH7", "CH8", "Mode", "VidOn", "VidOff", "Calib" }, 0 },
|
||||
{11, 4, "SLT", "MR100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "Video", "Pict" }, 0 },
|
||||
{10, 0, "Symax", "Std", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 },
|
||||
{10, 1, "Symax", "X5C", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 },
|
||||
{5 , 0, "V2x2", "Std", { "Flip", "Light", "Pict", "Video", "HLess", "CalX", "CalY" }, 1 },
|
||||
{5 , 1, "V2x2", "JXD506", { "Flip", "Light", "Pict", "Video", "HLess", "StaSto", "Emerg", "Cam_UD" }, 1 },
|
||||
{61, 0, "Tiger", "Std", { "Flip", "Light" }, 1 },
|
||||
{46, 0, "V911s", "Std", { "Calib" }, 1 },
|
||||
{46, 1, "E119", "Std", { "Calib" }, 1 },
|
||||
{62, 0, "XK", "X450", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 },
|
||||
{62, 1, "XK", "X420", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 },
|
||||
{8 , 0, "YD717", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 1, "YD717", "SkyWlkr", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 2, "YD717", "Simax4", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 3, "YD717", "XinXun", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 4, "YD717", "NiHui", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{65,0, "FrSkyR9", "R9_915", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
|
||||
-- Need first 4 channels changed...
|
||||
{19, 0, "Shenqi", "Cycle", { }, 1 },
|
||||
{4 , 1, "Hisky", "HK310", { "Aux" }, 0 },
|
||||
{43, 0, "Traxxas", "6519", { }, 0 },
|
||||
{52, 0, "ZSX", "280", { "Light" }, 1 },
|
||||
{48, 0, "V761", "Std", { "Gyro" }, 1 },
|
||||
{49, 0, "KF606", "Std", { "Trim" }, 1 },
|
||||
{47, 0, "GD00x", "V1", { "Trim", "LED", "Rate" }, 1 },
|
||||
{47, 1, "GD00x", "V2", { "Trim", "LED", "Rate" }, 1 },
|
||||
{58, 0, "FX816", "P38", { },1 }
|
||||
}
|
||||
|
||||
local function drawScreenTitle(title)
|
||||
if LCD_W == 480 then
|
||||
lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR)
|
||||
lcd.drawText(1, 5, title, MENU_TITLE_COLOR)
|
||||
else
|
||||
lcd.drawScreenTitle(title, 0, 0)
|
||||
end
|
||||
end
|
||||
|
||||
function bitand(a, b)
|
||||
local result = 0
|
||||
local bitval = 1
|
||||
while a > 0 and b > 0 do
|
||||
if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits
|
||||
result = result + bitval -- set the current bit
|
||||
end
|
||||
bitval = bitval * 2 -- shift left
|
||||
a = math.floor(a/2) -- shift right
|
||||
b = math.floor(b/2)
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
local function Multi_Draw_LCD()
|
||||
local line = 0
|
||||
local module_conf = {}
|
||||
local module_pos = "Internal"
|
||||
|
||||
lcd.clear()
|
||||
drawScreenTitle("Multi channels namer")
|
||||
module_conf = model.getModule(0)
|
||||
if module_conf["Type"] ~= 6 then
|
||||
module_pos = "External"
|
||||
module_conf = model.getModule(1)
|
||||
if module_conf["Type"] ~= 6 then
|
||||
if LCD_W == 480 then
|
||||
lcd.drawText(10,50,"No Multi module configured...", BLINK)
|
||||
else
|
||||
--Draw on LCD_W=128
|
||||
lcd.drawText(2,17,"No Multi module configured...",SMLSIZE)
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
local protocol = module_conf["protocol"]
|
||||
local sub_protocol = module_conf["subProtocol"]
|
||||
|
||||
--Display settings
|
||||
local lcd_opt
|
||||
if LCD_W == 480 then
|
||||
x_pos = 10
|
||||
y_pos = 32
|
||||
y_inc = 20
|
||||
else
|
||||
x_pos = 0
|
||||
y_pos = 9
|
||||
y_inc = 8
|
||||
lcd_opt = SMLSIZE
|
||||
end
|
||||
|
||||
--Exceptions on first 4 channels...
|
||||
local stick_names = { "Rud", "Ele", "Thr", "Ail" }
|
||||
if ( protocol == 4 and sub_protocol ==1 ) or protocol == 19 or protocol == 52 then -- Hisky/HK310, Shenqi, ZSX
|
||||
stick_names[2] = "n-a"
|
||||
stick_names[4] = "n-a"
|
||||
elseif protocol == 43 then -- Traxxas
|
||||
stick_names[2] = "Aux4"
|
||||
stick_names[4] = "Aux3"
|
||||
elseif protocol == 48 then -- V761
|
||||
stick_names[4] = "n-a"
|
||||
elseif protocol == 47 or protocol == 49 or protocol == 58 then -- GD00x, KF606, FX816
|
||||
stick_names[1] = "n-a"
|
||||
stick_names[2] = "n-a"
|
||||
end
|
||||
|
||||
--Determine fist 4 channels order
|
||||
local channel_names={}
|
||||
local ch_order=module_conf["channelsOrder"]
|
||||
if (ch_order == -1) then
|
||||
channel_names[1] = stick_names[defaultChannel(0)+1]
|
||||
channel_names[2] = stick_names[defaultChannel(1)+1]
|
||||
channel_names[3] = stick_names[defaultChannel(2)+1]
|
||||
channel_names[4] = stick_names[defaultChannel(3)+1]
|
||||
else
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[4]
|
||||
ch_order = math.floor(ch_order/4)
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[2]
|
||||
ch_order = math.floor(ch_order/4)
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[3]
|
||||
ch_order = math.floor(ch_order/4)
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[1]
|
||||
end
|
||||
|
||||
--Specific channels for protocol
|
||||
local protocol_name, sub_protocol_name, bind_ch
|
||||
for i,v in ipairs(Protocols) do
|
||||
if v[1] == protocol and v[2] == sub_protocol then
|
||||
protocol_name = v[3]
|
||||
sub_protocol_name = v[4]
|
||||
for j,w in ipairs(v[5]) do
|
||||
channel_names[4+j]=w;
|
||||
end
|
||||
bind_ch = v[6]
|
||||
end
|
||||
end
|
||||
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt)
|
||||
line = line + 1
|
||||
if (ch_order == -1) then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt)
|
||||
line = line + 1
|
||||
end
|
||||
if protocol_name == nil or sub_protocol_name == nil then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...", lcd_opt)
|
||||
else if LCD_W > 128 then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt)
|
||||
line = line + 1
|
||||
else
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt)
|
||||
line = line + 1
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt)
|
||||
line = line + 1
|
||||
end
|
||||
text1=""
|
||||
text2=""
|
||||
for i,v in ipairs(channel_names) do
|
||||
if i<=8 then
|
||||
if i==1 then
|
||||
text1 = v
|
||||
else
|
||||
text1=text1 .. "," .. v
|
||||
end
|
||||
else
|
||||
if i==9 then
|
||||
text2 = v
|
||||
else
|
||||
text2=text2 .. "," .. v
|
||||
end
|
||||
end
|
||||
end
|
||||
if LCD_W > 128 then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt)
|
||||
line = line + 1
|
||||
if text2 ~= "" then
|
||||
lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt)
|
||||
line = line + 1
|
||||
end
|
||||
end
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt)
|
||||
line = line + 1
|
||||
local output, nbr
|
||||
for i,v in ipairs(channel_names) do
|
||||
output = model.getOutput(i-1)
|
||||
output["name"] = v
|
||||
model.setOutput(i-1,output)
|
||||
nbr = i
|
||||
end
|
||||
for i = nbr, 15 do
|
||||
output = model.getOutput(i)
|
||||
output["name"] = "n-a"
|
||||
model.setOutput(i,output)
|
||||
end
|
||||
if bind_ch == 1 then
|
||||
output = model.getOutput(15)
|
||||
output["name"] = "BindCH"
|
||||
model.setOutput(15,output)
|
||||
end
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt)
|
||||
line = line + 1
|
||||
done = 1
|
||||
end
|
||||
end
|
||||
|
||||
-- Init
|
||||
local function Multi_Init()
|
||||
end
|
||||
|
||||
-- Main
|
||||
local function Multi_Run(event)
|
||||
if event == nil then
|
||||
error("Cannot be run as a model script!")
|
||||
return 2
|
||||
else
|
||||
if done == 0 then
|
||||
Multi_Draw_LCD()
|
||||
else
|
||||
if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then
|
||||
return 2
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
return { init=Multi_Init, run=Multi_Run }
|
||||
@@ -0,0 +1,377 @@
|
||||
local toolName = "TNS|Multi chan namer|TNE"
|
||||
|
||||
---- #########################################################################
|
||||
---- # #
|
||||
---- # Copyright (C) OpenTX #
|
||||
-----# #
|
||||
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html #
|
||||
---- # #
|
||||
---- # This program is free software; you can redistribute it and/or modify #
|
||||
---- # it under the terms of the GNU General Public License version 2 as #
|
||||
---- # published by the Free Software Foundation. #
|
||||
---- # #
|
||||
---- # This program is distributed in the hope that it will be useful #
|
||||
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
---- # GNU General Public License for more details. #
|
||||
---- # #
|
||||
---- #########################################################################
|
||||
|
||||
local done = 0
|
||||
local Protocols = {
|
||||
{1, 0, "Flysky", "Flysky", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{1, 1, "Flysky", "V9x9", { "Flip", "Light", "Pict", "Video" }, 1 },
|
||||
{1, 2, "Flysky", "V6x6", { "Flip", "Light", "Pict", "Video", "HLess", "RTH", "XCAL", "YCAL" }, 1 },
|
||||
{1, 3, "Flysky", "V912", { "BtmBtn", "TopBtn" }, 1 },
|
||||
{1, 4, "Flysky", "CX20", { "CH5", "CH6", "CH7" }, 0 },
|
||||
{28, 0, "Flysky AFHDS2A", "PWM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{28, 1, "Flysky AFHDS2A", "PPM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{28, 2, "Flysky AFHDS2A", "PWM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{28, 3, "Flysky AFHDS2A", "PPM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{53, 0, "Flyzone", "FZ-410", { }, 0 },
|
||||
{2, 0, "Hubsan", "H107", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{2, 1, "Hubsan", "H301", { "RTH", "Light", "Stab", "Video" }, 0 },
|
||||
{2, 2, "Hubsan", "H501", { "RTH", "Light", "Pict", "Video", "HLess", "GPS_H", "ALT_H", "Flip", "FModes" }, 0 },
|
||||
{41, 0, "Bugs", "3-6-8", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 },
|
||||
{60, 0, "Pelikan", "PRO_V4", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{37, 0, "Corona", "COR_V1", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{37, 1, "Corona", "COR_V2", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{37, 2, "Corona", "FD_V3", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{25, 0, "FrSkyV", "V8", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{3, 0, "FrSkyD", "D8", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{3, 0, "FrSkyD", "D8Cloned", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{67, 0, "FrSkyL", "LR12", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{67, 1, "FrSkyL", "LR12_6CH", { "CH5", "CH6" }, 0 },
|
||||
{15, 0, "FrSkyX", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{15, 1, "FrSkyX", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{15, 2, "FrSkyX", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{15, 3, "FrSkyX", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{15, 4, "FrSkyX", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{64, 0, "FrSkyX2", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{64, 1, "FrSkyX2", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{64, 2, "FrSkyX2", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{64, 3, "FrSkyX2", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 1 },
|
||||
{64, 4, "FrSkyX2", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{55, 0, "FrSkyRX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{55, 1, "FrSkyRX", "CloneTX", { }, 0 },
|
||||
{39, 0, "Hitec", "Opt_Fw", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{39, 1, "Hitec", "Opt_Hub", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{39, 2, "Hitec", "Minima", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{57, 0, "HoTT", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{21, 0, "SFHSS", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{68, 0, "Skyartec", "Std", { "CH5", "CH6", "CH7" }, 0 },
|
||||
{7 , 0, "Devo", "8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{7 , 1, "Devo", "10CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" }, 0 },
|
||||
{7 , 2, "Devo", "12CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{7 , 3, "Devo", "6CH", { "CH5", "CH6" }, 0 },
|
||||
{7 , 4, "Devo", "7CH", { "CH5", "CH6", "CH7" }, 0 },
|
||||
{30, 0, "WK2x01", "WK2801", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{30, 1, "WK2x01", "WK2401", { }, 0 },
|
||||
{30, 2, "WK2x01", "W6_5_1", { "Gear", "Dis", "Gyro" }, 0 },
|
||||
{30, 3, "WK2x01", "W6_6_1", { "Gear", "Col", "Gyro" }, 0 },
|
||||
{30, 4, "WK2x01", "W6HEL", { "Gear", "Col", "Gyro" }, 0 },
|
||||
{30, 5, "WK2x01", "W6HEL_I", { "Gear", "Col", "Gyro" }, 0 },
|
||||
{6 , 0, "DSM", "2_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{6 , 1, "DSM", "2_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{6 , 2, "DSM", "X_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{6 , 3, "DSM", "X_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{22, 0, "J6Pro", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{22, 0, "WFLY", "WFR0xS", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{24, 0, "Assan", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{14, 0, "Bayang", "Std", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "n-a", "n-a", "AnAux1", "AnAux2" }, 1 },
|
||||
{14, 1, "Bayang", "H8S3D", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates" }, 1 },
|
||||
{14, 2, "Bayang", "X16_AH", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf" }, 1 },
|
||||
{14, 3, "Bayang", "IRDRONE", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 },
|
||||
{14, 4, "Bayang", "DHD_D4", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 },
|
||||
{59, 0, "BayangRX", "RX", { "AnAux1", "AnAux2", "Flip", "RTH", "Pict", "Video" }, 1 },
|
||||
{42, 0, "BugsMini", "Mini", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 },
|
||||
{42, 1, "BugsMini", "3H", { "Arm", "Angle", "Flip", "Pict", "Video", "LED", "AltHol" }, 0 },
|
||||
{34, 0, "Cabell", "V3", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{34, 1, "Cabell", "V3Telem", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{13, 0, "CG023", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{13, 1, "CG023", "YD829", { "Flip", "n-a", "Pict", "Video", "HLess" }, 1 },
|
||||
{12, 0, "CX10", "Green", { "Flip", "Rate" }, 1 },
|
||||
{12, 1, "CX10", "Blue", { "Flip", "Rate", "Pict", "Video" }, 1 },
|
||||
{12, 2, "CX10", "DM007", { "Flip", "Mode", "Pict", "Video", "HLess" }, 1 },
|
||||
{12, 4, "CX10", "JC3015_1", { "Flip", "Mode", "Pict", "Video" }, 1 },
|
||||
{12, 5, "CX10", "JC3015_2", { "Flip", "Mode", "LED", "DFlip" }, 1 },
|
||||
{12, 6, "CX10", "MK33041", { "Flip", "Mode", "Pict", "Video", "HLess", "RTH" }, 1 },
|
||||
{33, 0, "DM022", "Std", { "Flip", "LED", "Cam1", "Cam2", "HLess", "RTH", "RLow" }, 1 },
|
||||
{45, 0, "E01X", "E012", { "n-a", "Flip", "n-a", "HLess", "RTH" }, 1 },
|
||||
{45, 1, "E01X", "E015", { "Arm", "Flip", "LED", "HLess", "RTH" }, 1 },
|
||||
{45, 2, "E01X", "E016H", { "Stop", "Flip", "n-a", "HLess", "RTH" }, 1 },
|
||||
{16, 0, "ESKY", "Std", { "Gyro", "Pitch" }, 0 },
|
||||
{16, 1, "ESKY", "ET4", { "Gyro", "Pitch" }, 0 },
|
||||
{35, 0, "ESKY150", "4CH", { }, 0 },
|
||||
{35, 1, "ESKY150", "7CH", { "FMode", "Aux6", "Aux7" }, 0 },
|
||||
{20, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 },
|
||||
{20, 1, "FY326", "FY319", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 },
|
||||
{23, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert" }, 1 },
|
||||
{32, 0, "GW008", "FY326", { "Flip" }, 1 },
|
||||
{36, 0, "H8_3D", "Std", { "Flip", "Light", "Pict", "Video", "RTH", "FlMode", "Cal1" }, 1 },
|
||||
{36, 1, "H8_3D", "H20H", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 },
|
||||
{36, 2, "H8_3D", "H20", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 },
|
||||
{36, 3, "H8_3D", "H30", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 },
|
||||
{4 , 0, "Hisky", "Std", { "Gear", "Pitch", "Gyro", "CH8" }, 0 },
|
||||
{9 , 0, "KN", "WLToys", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 },
|
||||
{9 , 1, "KN", "Feilun", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 },
|
||||
{26, 0, "Hontai", "Std", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{26, 1, "Hontai", "JJRCX1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{26, 2, "Hontai", "X5C1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{26, 3, "Hontai", "FQ777_951", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{18, 0, "MJXQ", "WHL08", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 1, "MJXQ", "X600", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 2, "MJXQ", "X800", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 3, "MJXQ", "H26D", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 4, "MJXQ", "E010", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 5, "MJXQ", "H26WH", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 6, "MJXQ", "Phoenix", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{17, 0, "MT99XX", "Std", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 1, "MT99XX", "H7", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 2, "MT99XX", "YZ", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 3, "MT99XX", "LS", { "Flip", "Invert", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 },
|
||||
{44, 0, "NCC1701", "Std", { "Warp" }, 1 },
|
||||
{51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 },
|
||||
{56, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 },
|
||||
{29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 },
|
||||
{29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 },
|
||||
{29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 },
|
||||
{31, 0, "Q303", "Q303", { "AltHol", "Flip", "Pict", "Video", "HLess", "RTH", "Gimbal" }, 1 },
|
||||
{31, 1, "Q303", "C35", { "Arm", "VTX", "Pict", "Video", "n-a", "RTH", "Gimbal" }, 1 },
|
||||
{31, 2, "Q303", "CX10D", { "Arm", "Flip" }, 1 },
|
||||
{31, 3, "Q303", "CX10WD", { "Arm", "Flip" }, 1 },
|
||||
{50, 0, "Redpine", "Fast", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 },
|
||||
{50, 1, "Redpine", "Slow", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 },
|
||||
{11, 0, "SLT", "V1", { "Gear", "Pitch" }, 0 },
|
||||
{11, 1, "SLT", "V2", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{11, 2, "SLT", "Q100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "n-a", "n-a", "Calib" }, 0 },
|
||||
{11, 3, "SLT", "Q200", { "Rates", "n-a", "CH7", "CH8", "Mode", "VidOn", "VidOff", "Calib" }, 0 },
|
||||
{11, 4, "SLT", "MR100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "Video", "Pict" }, 0 },
|
||||
{10, 0, "Symax", "Std", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 },
|
||||
{10, 1, "Symax", "X5C", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 },
|
||||
{5 , 0, "V2x2", "Std", { "Flip", "Light", "Pict", "Video", "HLess", "CalX", "CalY" }, 1 },
|
||||
{5 , 1, "V2x2", "JXD506", { "Flip", "Light", "Pict", "Video", "HLess", "StaSto", "Emerg", "Cam_UD" }, 1 },
|
||||
{61, 0, "Tiger", "Std", { "Flip", "Light" }, 1 },
|
||||
{46, 0, "V911s", "Std", { "Calib" }, 1 },
|
||||
{46, 1, "E119", "Std", { "Calib" }, 1 },
|
||||
{62, 0, "XK", "X450", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 },
|
||||
{62, 1, "XK", "X420", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 },
|
||||
{8 , 0, "YD717", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 1, "YD717", "SkyWlkr", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 2, "YD717", "Simax4", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 3, "YD717", "XinXun", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 4, "YD717", "NiHui", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{65,0, "FrSkyR9", "R9_915", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
|
||||
-- Need first 4 channels changed...
|
||||
{19, 0, "Shenqi", "Cycle", { }, 1 },
|
||||
{4 , 1, "Hisky", "HK310", { "Aux" }, 0 },
|
||||
{43, 0, "Traxxas", "6519", { }, 0 },
|
||||
{52, 0, "ZSX", "280", { "Light" }, 1 },
|
||||
{48, 0, "V761", "Std", { "Gyro" }, 1 },
|
||||
{49, 0, "KF606", "Std", { "Trim" }, 1 },
|
||||
{47, 0, "GD00x", "V1", { "Trim", "LED", "Rate" }, 1 },
|
||||
{47, 1, "GD00x", "V2", { "Trim", "LED", "Rate" }, 1 },
|
||||
{58, 0, "FX816", "P38", { },1 }
|
||||
}
|
||||
|
||||
local function drawScreenTitle(title)
|
||||
if LCD_W == 480 then
|
||||
lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR)
|
||||
lcd.drawText(1, 5, title, MENU_TITLE_COLOR)
|
||||
else
|
||||
lcd.drawScreenTitle(title, 0, 0)
|
||||
end
|
||||
end
|
||||
|
||||
function bitand(a, b)
|
||||
local result = 0
|
||||
local bitval = 1
|
||||
while a > 0 and b > 0 do
|
||||
if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits
|
||||
result = result + bitval -- set the current bit
|
||||
end
|
||||
bitval = bitval * 2 -- shift left
|
||||
a = math.floor(a/2) -- shift right
|
||||
b = math.floor(b/2)
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
local function Multi_Draw_LCD()
|
||||
local line = 0
|
||||
local module_conf = {}
|
||||
local module_pos = "Internal"
|
||||
|
||||
lcd.clear()
|
||||
drawScreenTitle("Multi channels namer")
|
||||
module_conf = model.getModule(0)
|
||||
if module_conf["Type"] ~= 6 then
|
||||
module_pos = "External"
|
||||
module_conf = model.getModule(1)
|
||||
if module_conf["Type"] ~= 6 then
|
||||
if LCD_W == 480 then
|
||||
lcd.drawText(10,50,"No Multi module configured...", BLINK)
|
||||
else
|
||||
--Draw on LCD_W=128
|
||||
lcd.drawText(2,17,"No Multi module configured...",SMLSIZE)
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
local protocol = module_conf["protocol"]
|
||||
local sub_protocol = module_conf["subProtocol"]
|
||||
|
||||
--Display settings
|
||||
local lcd_opt
|
||||
if LCD_W == 480 then
|
||||
x_pos = 10
|
||||
y_pos = 32
|
||||
y_inc = 20
|
||||
else
|
||||
x_pos = 0
|
||||
y_pos = 9
|
||||
y_inc = 8
|
||||
lcd_opt = SMLSIZE
|
||||
end
|
||||
|
||||
--Exceptions on first 4 channels...
|
||||
local stick_names = { "Rud", "Ele", "Thr", "Ail" }
|
||||
if ( protocol == 4 and sub_protocol ==1 ) or protocol == 19 or protocol == 52 then -- Hisky/HK310, Shenqi, ZSX
|
||||
stick_names[2] = "n-a"
|
||||
stick_names[4] = "n-a"
|
||||
elseif protocol == 43 then -- Traxxas
|
||||
stick_names[2] = "Aux4"
|
||||
stick_names[4] = "Aux3"
|
||||
elseif protocol == 48 then -- V761
|
||||
stick_names[4] = "n-a"
|
||||
elseif protocol == 47 or protocol == 49 or protocol == 58 then -- GD00x, KF606, FX816
|
||||
stick_names[1] = "n-a"
|
||||
stick_names[2] = "n-a"
|
||||
end
|
||||
|
||||
--Determine fist 4 channels order
|
||||
local channel_names={}
|
||||
local ch_order=module_conf["channelsOrder"]
|
||||
if (ch_order == -1) then
|
||||
channel_names[1] = stick_names[defaultChannel(0)+1]
|
||||
channel_names[2] = stick_names[defaultChannel(1)+1]
|
||||
channel_names[3] = stick_names[defaultChannel(2)+1]
|
||||
channel_names[4] = stick_names[defaultChannel(3)+1]
|
||||
else
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[4]
|
||||
ch_order = math.floor(ch_order/4)
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[2]
|
||||
ch_order = math.floor(ch_order/4)
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[3]
|
||||
ch_order = math.floor(ch_order/4)
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[1]
|
||||
end
|
||||
|
||||
--Specific channels for protocol
|
||||
local protocol_name, sub_protocol_name, bind_ch
|
||||
for i,v in ipairs(Protocols) do
|
||||
if v[1] == protocol and v[2] == sub_protocol then
|
||||
protocol_name = v[3]
|
||||
sub_protocol_name = v[4]
|
||||
for j,w in ipairs(v[5]) do
|
||||
channel_names[4+j]=w;
|
||||
end
|
||||
bind_ch = v[6]
|
||||
end
|
||||
end
|
||||
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.",lcd_opt)
|
||||
line = line + 1
|
||||
if (ch_order == -1) then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...",lcd_opt)
|
||||
line = line + 1
|
||||
end
|
||||
if protocol_name == nil or sub_protocol_name == nil then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...",lcd_opt)
|
||||
else if LCD_W > 128 then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name,lcd_opt)
|
||||
line = line + 1
|
||||
else
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt)
|
||||
line = line + 1
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt)
|
||||
line = line + 1
|
||||
end
|
||||
text1=""
|
||||
text2=""
|
||||
for i,v in ipairs(channel_names) do
|
||||
if i<=8 then
|
||||
if i==1 then
|
||||
text1 = v
|
||||
else
|
||||
text1=text1 .. "," .. v
|
||||
end
|
||||
else
|
||||
if i==9 then
|
||||
text2 = v
|
||||
else
|
||||
text2=text2 .. "," .. v
|
||||
end
|
||||
end
|
||||
end
|
||||
if LCD_W > 128 then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1,lcd_opt)
|
||||
line = line + 1
|
||||
if text2 ~= "" then
|
||||
lcd.drawText(x_pos*9, y_pos+y_inc*line,text2,lcd_opt)
|
||||
line = line + 1
|
||||
end
|
||||
end
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.",lcd_opt)
|
||||
line = line + 1
|
||||
local output, nbr
|
||||
for i,v in ipairs(channel_names) do
|
||||
output = model.getOutput(i-1)
|
||||
output["name"] = v
|
||||
model.setOutput(i-1,output)
|
||||
nbr = i
|
||||
end
|
||||
for i = nbr, 15 do
|
||||
output = model.getOutput(i)
|
||||
output["name"] = "n-a"
|
||||
model.setOutput(i,output)
|
||||
end
|
||||
if bind_ch == 1 then
|
||||
output = model.getOutput(15)
|
||||
output["name"] = "BindCH"
|
||||
model.setOutput(15,output)
|
||||
end
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Done!",lcd_opt)
|
||||
line = line + 1
|
||||
done = 1
|
||||
end
|
||||
end
|
||||
|
||||
-- Init
|
||||
local function Multi_Init()
|
||||
end
|
||||
|
||||
-- Main
|
||||
local function Multi_Run(event)
|
||||
if event == nil then
|
||||
error("Cannot be run as a model script!")
|
||||
return 2
|
||||
else
|
||||
if done == 0 then
|
||||
Multi_Draw_LCD()
|
||||
else
|
||||
if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then
|
||||
return 2
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
return { init=Multi_Init, run=Multi_Run }
|
||||
@@ -0,0 +1,377 @@
|
||||
local toolName = "TNS|Multi chan namer|TNE"
|
||||
|
||||
---- #########################################################################
|
||||
---- # #
|
||||
---- # Copyright (C) OpenTX #
|
||||
-----# #
|
||||
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html #
|
||||
---- # #
|
||||
---- # This program is free software; you can redistribute it and/or modify #
|
||||
---- # it under the terms of the GNU General Public License version 2 as #
|
||||
---- # published by the Free Software Foundation. #
|
||||
---- # #
|
||||
---- # This program is distributed in the hope that it will be useful #
|
||||
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
---- # GNU General Public License for more details. #
|
||||
---- # #
|
||||
---- #########################################################################
|
||||
|
||||
local done = 0
|
||||
local Protocols = {
|
||||
{1, 0, "Flysky", "Flysky", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{1, 1, "Flysky", "V9x9", { "Flip", "Light", "Pict", "Video" }, 1 },
|
||||
{1, 2, "Flysky", "V6x6", { "Flip", "Light", "Pict", "Video", "HLess", "RTH", "XCAL", "YCAL" }, 1 },
|
||||
{1, 3, "Flysky", "V912", { "BtmBtn", "TopBtn" }, 1 },
|
||||
{1, 4, "Flysky", "CX20", { "CH5", "CH6", "CH7" }, 0 },
|
||||
{28, 0, "Flysky AFHDS2A", "PWM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{28, 1, "Flysky AFHDS2A", "PPM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{28, 2, "Flysky AFHDS2A", "PWM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{28, 3, "Flysky AFHDS2A", "PPM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 },
|
||||
{53, 0, "Flyzone", "FZ-410", { }, 0 },
|
||||
{2, 0, "Hubsan", "H107", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{2, 1, "Hubsan", "H301", { "RTH", "Light", "Stab", "Video" }, 0 },
|
||||
{2, 2, "Hubsan", "H501", { "RTH", "Light", "Pict", "Video", "HLess", "GPS_H", "ALT_H", "Flip", "FModes" }, 0 },
|
||||
{41, 0, "Bugs", "3-6-8", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 },
|
||||
{60, 0, "Pelikan", "PRO_V4", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{37, 0, "Corona", "COR_V1", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{37, 1, "Corona", "COR_V2", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{37, 2, "Corona", "FD_V3", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{25, 0, "FrSkyV", "V8", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{3, 0, "FrSkyD", "D8", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{3, 0, "FrSkyD", "D8Cloned", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{67, 0, "FrSkyL", "LR12", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{67, 1, "FrSkyL", "LR12_6CH", { "CH5", "CH6" }, 0 },
|
||||
{15, 0, "FrSkyX", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{15, 1, "FrSkyX", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{15, 2, "FrSkyX", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{15, 3, "FrSkyX", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{15, 4, "FrSkyX", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{64, 0, "FrSkyX2", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{64, 1, "FrSkyX2", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{64, 2, "FrSkyX2", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{64, 3, "FrSkyX2", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 1 },
|
||||
{64, 4, "FrSkyX2", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{55, 0, "FrSkyRX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{55, 1, "FrSkyRX", "CloneTX", { }, 0 },
|
||||
{39, 0, "Hitec", "Opt_Fw", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{39, 1, "Hitec", "Opt_Hub", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{39, 2, "Hitec", "Minima", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{57, 0, "HoTT", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{21, 0, "SFHSS", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{68, 0, "Skyartec", "Std", { "CH5", "CH6", "CH7" }, 0 },
|
||||
{7 , 0, "Devo", "8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{7 , 1, "Devo", "10CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" }, 0 },
|
||||
{7 , 2, "Devo", "12CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{7 , 3, "Devo", "6CH", { "CH5", "CH6" }, 0 },
|
||||
{7 , 4, "Devo", "7CH", { "CH5", "CH6", "CH7" }, 0 },
|
||||
{30, 0, "WK2x01", "WK2801", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{30, 1, "WK2x01", "WK2401", { }, 0 },
|
||||
{30, 2, "WK2x01", "W6_5_1", { "Gear", "Dis", "Gyro" }, 0 },
|
||||
{30, 3, "WK2x01", "W6_6_1", { "Gear", "Col", "Gyro" }, 0 },
|
||||
{30, 4, "WK2x01", "W6HEL", { "Gear", "Col", "Gyro" }, 0 },
|
||||
{30, 5, "WK2x01", "W6HEL_I", { "Gear", "Col", "Gyro" }, 0 },
|
||||
{6 , 0, "DSM", "2_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{6 , 1, "DSM", "2_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{6 , 2, "DSM", "X_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{6 , 3, "DSM", "X_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 },
|
||||
{22, 0, "J6Pro", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 },
|
||||
{22, 0, "WFLY", "WFR0xS", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 },
|
||||
{24, 0, "Assan", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{14, 0, "Bayang", "Std", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "n-a", "n-a", "AnAux1", "AnAux2" }, 1 },
|
||||
{14, 1, "Bayang", "H8S3D", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates" }, 1 },
|
||||
{14, 2, "Bayang", "X16_AH", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf" }, 1 },
|
||||
{14, 3, "Bayang", "IRDRONE", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 },
|
||||
{14, 4, "Bayang", "DHD_D4", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 },
|
||||
{59, 0, "BayangRX", "RX", { "AnAux1", "AnAux2", "Flip", "RTH", "Pict", "Video" }, 1 },
|
||||
{42, 0, "BugsMini", "Mini", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 },
|
||||
{42, 1, "BugsMini", "3H", { "Arm", "Angle", "Flip", "Pict", "Video", "LED", "AltHol" }, 0 },
|
||||
{34, 0, "Cabell", "V3", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{34, 1, "Cabell", "V3Telem", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{13, 0, "CG023", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{13, 1, "CG023", "YD829", { "Flip", "n-a", "Pict", "Video", "HLess" }, 1 },
|
||||
{12, 0, "CX10", "Green", { "Flip", "Rate" }, 1 },
|
||||
{12, 1, "CX10", "Blue", { "Flip", "Rate", "Pict", "Video" }, 1 },
|
||||
{12, 2, "CX10", "DM007", { "Flip", "Mode", "Pict", "Video", "HLess" }, 1 },
|
||||
{12, 4, "CX10", "JC3015_1", { "Flip", "Mode", "Pict", "Video" }, 1 },
|
||||
{12, 5, "CX10", "JC3015_2", { "Flip", "Mode", "LED", "DFlip" }, 1 },
|
||||
{12, 6, "CX10", "MK33041", { "Flip", "Mode", "Pict", "Video", "HLess", "RTH" }, 1 },
|
||||
{33, 0, "DM022", "Std", { "Flip", "LED", "Cam1", "Cam2", "HLess", "RTH", "RLow" }, 1 },
|
||||
{45, 0, "E01X", "E012", { "n-a", "Flip", "n-a", "HLess", "RTH" }, 1 },
|
||||
{45, 1, "E01X", "E015", { "Arm", "Flip", "LED", "HLess", "RTH" }, 1 },
|
||||
{45, 2, "E01X", "E016H", { "Stop", "Flip", "n-a", "HLess", "RTH" }, 1 },
|
||||
{16, 0, "ESKY", "Std", { "Gyro", "Pitch" }, 0 },
|
||||
{16, 1, "ESKY", "ET4", { "Gyro", "Pitch" }, 0 },
|
||||
{35, 0, "ESKY150", "4CH", { }, 0 },
|
||||
{35, 1, "ESKY150", "7CH", { "FMode", "Aux6", "Aux7" }, 0 },
|
||||
{20, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 },
|
||||
{20, 1, "FY326", "FY319", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 },
|
||||
{23, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert" }, 1 },
|
||||
{32, 0, "GW008", "FY326", { "Flip" }, 1 },
|
||||
{36, 0, "H8_3D", "Std", { "Flip", "Light", "Pict", "Video", "RTH", "FlMode", "Cal1" }, 1 },
|
||||
{36, 1, "H8_3D", "H20H", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 },
|
||||
{36, 2, "H8_3D", "H20", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 },
|
||||
{36, 3, "H8_3D", "H30", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 },
|
||||
{4 , 0, "Hisky", "Std", { "Gear", "Pitch", "Gyro", "CH8" }, 0 },
|
||||
{9 , 0, "KN", "WLToys", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 },
|
||||
{9 , 1, "KN", "Feilun", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 },
|
||||
{26, 0, "Hontai", "Std", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{26, 1, "Hontai", "JJRCX1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{26, 2, "Hontai", "X5C1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{26, 3, "Hontai", "FQ777_951", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 },
|
||||
{18, 0, "MJXQ", "WHL08", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 1, "MJXQ", "X600", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 2, "MJXQ", "X800", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 3, "MJXQ", "H26D", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 4, "MJXQ", "E010", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 5, "MJXQ", "H26WH", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{18, 6, "MJXQ", "Phoenix", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 },
|
||||
{17, 0, "MT99XX", "Std", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 1, "MT99XX", "H7", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 2, "MT99XX", "YZ", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 3, "MT99XX", "LS", { "Flip", "Invert", "Pict", "Video", "HLess" }, 1 },
|
||||
{17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 },
|
||||
{44, 0, "NCC1701", "Std", { "Warp" }, 1 },
|
||||
{51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 },
|
||||
{56, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 },
|
||||
{29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 },
|
||||
{29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 },
|
||||
{29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 },
|
||||
{31, 0, "Q303", "Q303", { "AltHol", "Flip", "Pict", "Video", "HLess", "RTH", "Gimbal" }, 1 },
|
||||
{31, 1, "Q303", "C35", { "Arm", "VTX", "Pict", "Video", "n-a", "RTH", "Gimbal" }, 1 },
|
||||
{31, 2, "Q303", "CX10D", { "Arm", "Flip" }, 1 },
|
||||
{31, 3, "Q303", "CX10WD", { "Arm", "Flip" }, 1 },
|
||||
{50, 0, "Redpine", "Fast", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 },
|
||||
{50, 1, "Redpine", "Slow", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 },
|
||||
{11, 0, "SLT", "V1", { "Gear", "Pitch" }, 0 },
|
||||
{11, 1, "SLT", "V2", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{11, 2, "SLT", "Q100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "n-a", "n-a", "Calib" }, 0 },
|
||||
{11, 3, "SLT", "Q200", { "Rates", "n-a", "CH7", "CH8", "Mode", "VidOn", "VidOff", "Calib" }, 0 },
|
||||
{11, 4, "SLT", "MR100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "Video", "Pict" }, 0 },
|
||||
{10, 0, "Symax", "Std", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 },
|
||||
{10, 1, "Symax", "X5C", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 },
|
||||
{5 , 0, "V2x2", "Std", { "Flip", "Light", "Pict", "Video", "HLess", "CalX", "CalY" }, 1 },
|
||||
{5 , 1, "V2x2", "JXD506", { "Flip", "Light", "Pict", "Video", "HLess", "StaSto", "Emerg", "Cam_UD" }, 1 },
|
||||
{61, 0, "Tiger", "Std", { "Flip", "Light" }, 1 },
|
||||
{46, 0, "V911s", "Std", { "Calib" }, 1 },
|
||||
{46, 1, "E119", "Std", { "Calib" }, 1 },
|
||||
{62, 0, "XK", "X450", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 },
|
||||
{62, 1, "XK", "X420", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 },
|
||||
{8 , 0, "YD717", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 1, "YD717", "SkyWlkr", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 2, "YD717", "Simax4", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 3, "YD717", "XinXun", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{8 , 4, "YD717", "NiHui", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 },
|
||||
{65,0, "FrSkyR9", "R9_915", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 },
|
||||
{65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
{65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 },
|
||||
|
||||
-- Need first 4 channels changed...
|
||||
{19, 0, "Shenqi", "Cycle", { }, 1 },
|
||||
{4 , 1, "Hisky", "HK310", { "Aux" }, 0 },
|
||||
{43, 0, "Traxxas", "6519", { }, 0 },
|
||||
{52, 0, "ZSX", "280", { "Light" }, 1 },
|
||||
{48, 0, "V761", "Std", { "Gyro" }, 1 },
|
||||
{49, 0, "KF606", "Std", { "Trim" }, 1 },
|
||||
{47, 0, "GD00x", "V1", { "Trim", "LED", "Rate" }, 1 },
|
||||
{47, 1, "GD00x", "V2", { "Trim", "LED", "Rate" }, 1 },
|
||||
{58, 0, "FX816", "P38", { },1 }
|
||||
}
|
||||
|
||||
local function drawScreenTitle(title)
|
||||
if LCD_W == 480 then
|
||||
lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR)
|
||||
lcd.drawText(1, 5, title, MENU_TITLE_COLOR)
|
||||
else
|
||||
lcd.drawScreenTitle(title, 0, 0)
|
||||
end
|
||||
end
|
||||
|
||||
function bitand(a, b)
|
||||
local result = 0
|
||||
local bitval = 1
|
||||
while a > 0 and b > 0 do
|
||||
if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits
|
||||
result = result + bitval -- set the current bit
|
||||
end
|
||||
bitval = bitval * 2 -- shift left
|
||||
a = math.floor(a/2) -- shift right
|
||||
b = math.floor(b/2)
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
local function Multi_Draw_LCD()
|
||||
local line = 0
|
||||
local module_conf = {}
|
||||
local module_pos = "Internal"
|
||||
|
||||
lcd.clear()
|
||||
drawScreenTitle("Multi channels namer")
|
||||
module_conf = model.getModule(0)
|
||||
if module_conf["Type"] ~= 6 then
|
||||
module_pos = "External"
|
||||
module_conf = model.getModule(1)
|
||||
if module_conf["Type"] ~= 6 then
|
||||
if LCD_W == 480 then
|
||||
lcd.drawText(10,50,"No Multi module configured...", BLINK)
|
||||
else
|
||||
--Draw on LCD_W=128
|
||||
lcd.drawText(2,17,"No Multi module configured...",SMLSIZE)
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
local protocol = module_conf["protocol"]
|
||||
local sub_protocol = module_conf["subProtocol"]
|
||||
|
||||
--Display settings
|
||||
local lcd_opt
|
||||
if LCD_W == 480 then
|
||||
x_pos = 10
|
||||
y_pos = 32
|
||||
y_inc = 20
|
||||
else
|
||||
x_pos = 0
|
||||
y_pos = 9
|
||||
y_inc = 8
|
||||
lcd_opt = SMLSIZE
|
||||
end
|
||||
|
||||
--Exceptions on first 4 channels...
|
||||
local stick_names = { "Rud", "Ele", "Thr", "Ail" }
|
||||
if ( protocol == 4 and sub_protocol ==1 ) or protocol == 19 or protocol == 52 then -- Hisky/HK310, Shenqi, ZSX
|
||||
stick_names[2] = "n-a"
|
||||
stick_names[4] = "n-a"
|
||||
elseif protocol == 43 then -- Traxxas
|
||||
stick_names[2] = "Aux4"
|
||||
stick_names[4] = "Aux3"
|
||||
elseif protocol == 48 then -- V761
|
||||
stick_names[4] = "n-a"
|
||||
elseif protocol == 47 or protocol == 49 or protocol == 58 then -- GD00x, KF606, FX816
|
||||
stick_names[1] = "n-a"
|
||||
stick_names[2] = "n-a"
|
||||
end
|
||||
|
||||
--Determine fist 4 channels order
|
||||
local channel_names={}
|
||||
local ch_order=module_conf["channelsOrder"]
|
||||
if (ch_order == -1) then
|
||||
channel_names[1] = stick_names[defaultChannel(0)+1]
|
||||
channel_names[2] = stick_names[defaultChannel(1)+1]
|
||||
channel_names[3] = stick_names[defaultChannel(2)+1]
|
||||
channel_names[4] = stick_names[defaultChannel(3)+1]
|
||||
else
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[4]
|
||||
ch_order = math.floor(ch_order/4)
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[2]
|
||||
ch_order = math.floor(ch_order/4)
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[3]
|
||||
ch_order = math.floor(ch_order/4)
|
||||
channel_names[bitand(ch_order,3)+1] = stick_names[1]
|
||||
end
|
||||
|
||||
--Specific channels for protocol
|
||||
local protocol_name, sub_protocol_name, bind_ch
|
||||
for i,v in ipairs(Protocols) do
|
||||
if v[1] == protocol and v[2] == sub_protocol then
|
||||
protocol_name = v[3]
|
||||
sub_protocol_name = v[4]
|
||||
for j,w in ipairs(v[5]) do
|
||||
channel_names[4+j]=w;
|
||||
end
|
||||
bind_ch = v[6]
|
||||
end
|
||||
end
|
||||
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt)
|
||||
line = line + 1
|
||||
if (ch_order == -1) then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt)
|
||||
line = line + 1
|
||||
end
|
||||
if protocol_name == nil or sub_protocol_name == nil then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...", lcd_opt)
|
||||
else if LCD_W > 128 then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt)
|
||||
line = line + 1
|
||||
else
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt)
|
||||
line = line + 1
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt)
|
||||
line = line + 1
|
||||
end
|
||||
text1=""
|
||||
text2=""
|
||||
for i,v in ipairs(channel_names) do
|
||||
if i<=8 then
|
||||
if i==1 then
|
||||
text1 = v
|
||||
else
|
||||
text1=text1 .. "," .. v
|
||||
end
|
||||
else
|
||||
if i==9 then
|
||||
text2 = v
|
||||
else
|
||||
text2=text2 .. "," .. v
|
||||
end
|
||||
end
|
||||
end
|
||||
if LCD_W > 128 then
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt)
|
||||
line = line + 1
|
||||
if text2 ~= "" then
|
||||
lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt)
|
||||
line = line + 1
|
||||
end
|
||||
end
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt)
|
||||
line = line + 1
|
||||
local output, nbr
|
||||
for i,v in ipairs(channel_names) do
|
||||
output = model.getOutput(i-1)
|
||||
output["name"] = v
|
||||
model.setOutput(i-1,output)
|
||||
nbr = i
|
||||
end
|
||||
for i = nbr, 15 do
|
||||
output = model.getOutput(i)
|
||||
output["name"] = "n-a"
|
||||
model.setOutput(i,output)
|
||||
end
|
||||
if bind_ch == 1 then
|
||||
output = model.getOutput(15)
|
||||
output["name"] = "BindCH"
|
||||
model.setOutput(15,output)
|
||||
end
|
||||
lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt)
|
||||
line = line + 1
|
||||
done = 1
|
||||
end
|
||||
end
|
||||
|
||||
-- Init
|
||||
local function Multi_Init()
|
||||
end
|
||||
|
||||
-- Main
|
||||
local function Multi_Run(event)
|
||||
if event == nil then
|
||||
error("Cannot be run as a model script!")
|
||||
return 2
|
||||
else
|
||||
if done == 0 then
|
||||
Multi_Draw_LCD()
|
||||
else
|
||||
if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then
|
||||
return 2
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
return { init=Multi_Init, run=Multi_Run }
|
||||
@@ -22,8 +22,6 @@
|
||||
#define _BUZZER_H_
|
||||
|
||||
#if defined(BUZZER)
|
||||
extern uint8_t g_beepCnt;
|
||||
extern uint8_t beepAgain;
|
||||
extern uint8_t beepAgainOrig;
|
||||
extern uint8_t beepOn;
|
||||
extern bool warble;
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "dataconstants.h"
|
||||
#include "definitions.h"
|
||||
#include "bitfield.h"
|
||||
#include "globals.h"
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define N_TARANIS_FIELD(x)
|
||||
@@ -483,8 +484,6 @@ PACK(struct ModuleData {
|
||||
* Model structure
|
||||
*/
|
||||
|
||||
typedef uint16_t BeepANACenter;
|
||||
|
||||
#if LEN_BITMAP_NAME > 0
|
||||
#define MODEL_HEADER_BITMAP_FIELD NOBACKUP(char bitmap[LEN_BITMAP_NAME]);
|
||||
#else
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (C) OpenTX
|
||||
*
|
||||
* Based on code named
|
||||
* th9x - http://code.google.com/p/th9x
|
||||
* er9x - http://code.google.com/p/er9x
|
||||
* gruvin9x - http://code.google.com/p/gruvin9x
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _GLOBALS_H_
|
||||
#define _GLOBALS_H_
|
||||
|
||||
#include "definitions.h"
|
||||
#include "dataconstants.h"
|
||||
|
||||
PACK(struct GlobalData {
|
||||
uint8_t unexpectedShutdown:1;
|
||||
uint8_t externalAntennaEnabled:1;
|
||||
uint8_t authenticationCount:2;
|
||||
uint8_t upgradeModulePopup:1;
|
||||
uint8_t internalModuleVersionChecked:1;
|
||||
uint8_t spare:2;
|
||||
});
|
||||
|
||||
extern GlobalData globalData;
|
||||
|
||||
extern uint16_t sessionTimer;
|
||||
extern uint16_t s_timeCumThr;
|
||||
extern uint16_t s_timeCum16ThrP;
|
||||
|
||||
#if defined(OVERRIDE_CHANNEL_FUNCTION)
|
||||
#define OVERRIDE_CHANNEL_UNDEFINED -4096
|
||||
extern safetych_t safetyCh[MAX_OUTPUT_CHANNELS];
|
||||
#endif
|
||||
|
||||
extern uint8_t trimsCheckTimer;
|
||||
extern uint8_t trimsDisplayTimer;
|
||||
extern uint8_t trimsDisplayMask;
|
||||
extern uint16_t maxMixerDuration;
|
||||
|
||||
extern uint8_t requiredSpeakerVolume;
|
||||
|
||||
enum MainRequest {
|
||||
REQUEST_SCREENSHOT,
|
||||
REQUEST_FLIGHT_RESET,
|
||||
};
|
||||
|
||||
extern uint8_t mainRequestFlags;
|
||||
|
||||
#define DELAY_POS_MARGIN 3
|
||||
typedef int16_t delayval_t;
|
||||
PACK(struct SwOn {
|
||||
uint16_t delay:14; // max = 2550
|
||||
uint8_t activeMix:1;
|
||||
uint8_t activeExpo:1;
|
||||
int16_t now; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
|
||||
int16_t prev;
|
||||
});
|
||||
|
||||
extern SwOn swOn[MAX_MIXERS];
|
||||
extern int32_t act[MAX_MIXERS];
|
||||
|
||||
// static variables used in evalFlightModeMixes - moved here so they don't interfere with the stack
|
||||
// It's also easier to initialize them here.
|
||||
extern int8_t virtualInputsTrims[MAX_INPUTS];
|
||||
|
||||
extern int16_t anas [MAX_INPUTS];
|
||||
extern int16_t trims[NUM_TRIMS];
|
||||
extern int32_t chans[MAX_OUTPUT_CHANNELS];
|
||||
extern int16_t ex_chans[MAX_OUTPUT_CHANNELS]; // Outputs (before LIMITS) of the last perMain
|
||||
extern int16_t channelOutputs[MAX_OUTPUT_CHANNELS];
|
||||
|
||||
typedef uint16_t BeepANACenter;
|
||||
extern BeepANACenter bpanaCenter;
|
||||
|
||||
extern uint8_t s_mixer_first_run_done;
|
||||
|
||||
extern int16_t calibratedAnalogs[NUM_CALIBRATED_ANALOGS];
|
||||
|
||||
extern uint8_t g_beepCnt;
|
||||
extern uint8_t beepAgain;
|
||||
extern uint16_t lightOffCounter;
|
||||
extern uint8_t flashCounter;
|
||||
extern uint8_t mixWarning;
|
||||
|
||||
#endif
|
||||
@@ -40,6 +40,7 @@
|
||||
#define drawFieldLabel(x, y, str) lcdDrawTextAlignedLeft(y, str)
|
||||
|
||||
#define NUM_BODY_LINES (LCD_LINES-1)
|
||||
#define TEXT_VIEWER_LINES NUM_BODY_LINES
|
||||
#define MENU_HEADER_HEIGHT FH
|
||||
|
||||
#define CURVE_SIDE_WIDTH (LCD_H/2)
|
||||
|
||||
@@ -313,7 +313,7 @@ void onBluetoothConnectMenu(const char * result)
|
||||
MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \
|
||||
MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \
|
||||
MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS */ \
|
||||
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\
|
||||
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(MODULE_BIND_ROWS(INTERNAL_MODULE)))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\
|
||||
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM */ \
|
||||
MODULE_OPTION_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS */ \
|
||||
MULTIMODULE_MODULE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND */ \
|
||||
@@ -1000,7 +1000,25 @@ void menuModelSetup(event_t event)
|
||||
lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, multi_rfProto, attr);
|
||||
if (attr) {
|
||||
int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
|
||||
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
if (status.isValid()) {
|
||||
int8_t direction = checkIncDec(event, 0, -1, 1);
|
||||
if (direction == -1) {
|
||||
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
|
||||
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
|
||||
else
|
||||
multiRfProto = convertMultiToOtx(status.protocolPrev);
|
||||
}
|
||||
if (direction == 1) {
|
||||
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
|
||||
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
|
||||
else
|
||||
multiRfProto = convertMultiToOtx(status.protocolNext);
|
||||
}
|
||||
}
|
||||
else {
|
||||
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
|
||||
}
|
||||
if (checkIncDec_Ret) {
|
||||
g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto);
|
||||
g_model.moduleData[moduleIdx].subType = 0;
|
||||
@@ -1326,7 +1344,8 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
}
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0);
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
|
||||
if (!IS_RX_MULTI(moduleIdx))
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
|
||||
uint8_t newFlag = 0;
|
||||
#if defined(MULTIMODULE)
|
||||
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
|
||||
@@ -1586,7 +1605,7 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
#if defined(MULTIMODULE)
|
||||
else if (isModuleMultimodule(moduleIdx)) {
|
||||
module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
|
||||
module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -128,10 +128,6 @@ void menuChannelsView(event_t event)
|
||||
case EVT_KEY_PREVIOUS_PAGE:
|
||||
g_eeGeneral.view = (g_eeGeneral.view + (4 * ALTERNATE_VIEW) - ALTERNATE_VIEW) % (4 * ALTERNATE_VIEW);
|
||||
break;
|
||||
|
||||
case EVT_KEY_FIRST(KEY_ENTER):
|
||||
reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView;
|
||||
break;
|
||||
}
|
||||
|
||||
menuChannelsViewCommon(event);
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
#define DEFAULT_SCROLLBAR_X (LCD_W-1)
|
||||
#define NUM_BODY_LINES (LCD_LINES-1)
|
||||
#define TEXT_VIEWER_LINES NUM_BODY_LINES
|
||||
#define MENU_HEADER_HEIGHT FH
|
||||
|
||||
#define MODEL_BITMAP_WIDTH 64
|
||||
|
||||
@@ -907,7 +907,25 @@ void menuModelSetup(event_t event)
|
||||
switch (menuHorizontalPosition) {
|
||||
case 0: {
|
||||
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
|
||||
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
|
||||
MultiModuleStatus &status = getMultiModuleStatus(EXTERNAL_MODULE);
|
||||
if (status.isValid()) {
|
||||
int8_t direction = checkIncDec(event, 0, -1, 1);
|
||||
if (direction == -1) {
|
||||
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
|
||||
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
|
||||
else
|
||||
multiRfProto = convertMultiToOtx(status.protocolPrev);
|
||||
}
|
||||
if (direction == 1) {
|
||||
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
|
||||
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
|
||||
else
|
||||
multiRfProto = convertMultiToOtx(status.protocolNext);
|
||||
}
|
||||
}
|
||||
else {
|
||||
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
|
||||
}
|
||||
if (checkIncDec_Ret) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto);
|
||||
g_model.moduleData[EXTERNAL_MODULE].subType = 0;
|
||||
@@ -1122,8 +1140,13 @@ void menuModelSetup(event_t event)
|
||||
lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM);
|
||||
}
|
||||
if (isModuleBindRangeAvailable(moduleIdx)) {
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
|
||||
bindButtonPos = lcdNextPos + FW;
|
||||
if (!IS_RX_MULTI(moduleIdx)) {
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz == 0 ? attr : 0) | LEADING0 | LEFT, 2);
|
||||
bindButtonPos = lcdNextPos + FW;
|
||||
}
|
||||
else {
|
||||
bindButtonPos = MODEL_SETUP_2ND_COLUMN;
|
||||
}
|
||||
if (attr && l_posHorz==0) {
|
||||
if (s_editMode>0) {
|
||||
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
|
||||
@@ -1141,7 +1164,8 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
}
|
||||
lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0);
|
||||
lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
|
||||
if (!IS_RX_MULTI(moduleIdx))
|
||||
lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
|
||||
uint8_t newFlag = 0;
|
||||
#if defined(MULTIMODULE)
|
||||
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
|
||||
@@ -1306,7 +1330,7 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
#if defined (MULTIMODULE)
|
||||
else if (isModuleMultimodule(moduleIdx)) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
|
||||
#define FH 20
|
||||
#define NUM_BODY_LINES (MENU_BODY_HEIGHT / FH)
|
||||
#define TEXT_VIEWER_LINES ((MENU_FOOTER_TOP-MENU_HEADER_HEIGHT) / FH)
|
||||
|
||||
#define INVERT_HORZ_MARGIN 2
|
||||
#define INVERT_VERT_MARGIN 1
|
||||
|
||||
@@ -25,8 +25,8 @@ const uint8_t LBM_LAYOUT_1x1[] = {
|
||||
};
|
||||
|
||||
const ZoneOption OPTIONS_LAYOUT_1x1[] = {
|
||||
{ "Top bar", ZoneOption::Bool },
|
||||
{ "Sliders+Trims", ZoneOption::Bool },
|
||||
{ STR_TOP_BAR, ZoneOption::Bool },
|
||||
{ STR_SLIDERS_TRIMS, ZoneOption::Bool },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -25,10 +25,10 @@ const uint8_t LBM_LAYOUT_2P1[] = {
|
||||
};
|
||||
|
||||
const ZoneOption OPTIONS_LAYOUT_2P1[] = {
|
||||
{ "Top bar", ZoneOption::Bool },
|
||||
{ "Flight mode", ZoneOption::Bool },
|
||||
{ "Sliders", ZoneOption::Bool },
|
||||
{ "Trims", ZoneOption::Bool },
|
||||
{ STR_TOP_BAR, ZoneOption::Bool },
|
||||
{ STR_FLIGHT_MODE, ZoneOption::Bool },
|
||||
{ STR_SLIDERS, ZoneOption::Bool },
|
||||
{ STR_TRIMS, ZoneOption::Bool },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ const uint8_t LBM_LAYOUT_2x1[] = {
|
||||
};
|
||||
|
||||
const ZoneOption OPTIONS_LAYOUT_2x1[] = {
|
||||
{ "Top bar", ZoneOption::Bool },
|
||||
{ STR_TOP_BAR, ZoneOption::Bool },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ const uint8_t LBM_LAYOUT_2x2[] = {
|
||||
};
|
||||
|
||||
const ZoneOption OPTIONS_LAYOUT_2x2[] = {
|
||||
{ "Top bar", ZoneOption::Bool },
|
||||
{ STR_TOP_BAR, ZoneOption::Bool },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -25,14 +25,14 @@ const uint8_t LBM_LAYOUT_2x4[] = {
|
||||
};
|
||||
|
||||
const ZoneOption OPTIONS_LAYOUT_2x4[] = {
|
||||
{ "Top bar", ZoneOption::Bool },
|
||||
{ "Flight mode", ZoneOption::Bool },
|
||||
{ "Sliders", ZoneOption::Bool },
|
||||
{ "Trims", ZoneOption::Bool },
|
||||
{ "Panel1 background", ZoneOption::Bool },
|
||||
{ " Color", ZoneOption::Color },
|
||||
{ "Panel2 background", ZoneOption::Bool },
|
||||
{ " Color", ZoneOption::Color },
|
||||
{ STR_TOP_BAR, ZoneOption::Bool },
|
||||
{ STR_FLIGHT_MODE, ZoneOption::Bool },
|
||||
{ STR_SLIDERS, ZoneOption::Bool },
|
||||
{ STR_TRIMS, ZoneOption::Bool },
|
||||
{ STR_PANEL1_BACKGROUND, ZoneOption::Bool },
|
||||
{ INDENT TR_COLOR, ZoneOption::Color },
|
||||
{ STR_PANEL2_BACKGROUND, ZoneOption::Bool },
|
||||
{ INDENT TR_COLOR, ZoneOption::Color },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -339,9 +339,9 @@ void drawDate(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags att)
|
||||
att &= ~FONTSIZE_MASK;
|
||||
lcdDrawNumber(x, y, telemetryItem.datetime.day, att|LEADING0|LEFT, 2);
|
||||
lcdDrawChar(lcdNextPos-1, y, '-', att);
|
||||
lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.month, att|LEFT, 2);
|
||||
lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.month, att|LEADING0|LEFT, 2);
|
||||
lcdDrawChar(lcdNextPos-1, y, '-', att);
|
||||
lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.year-2000, att|LEFT);
|
||||
lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.year-2000, att|LEADING0|LEFT);
|
||||
y += FH;
|
||||
lcdDrawNumber(x, y, telemetryItem.datetime.hour, att|LEADING0|LEFT, 2);
|
||||
lcdDrawChar(lcdNextPos, y, ':', att);
|
||||
@@ -352,9 +352,9 @@ void drawDate(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags att)
|
||||
else {
|
||||
lcdDrawNumber(x, y, telemetryItem.datetime.day, att|LEADING0|LEFT, 2);
|
||||
lcdDrawChar(lcdNextPos-1, y, '-', att);
|
||||
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.month, att|LEFT, 2);
|
||||
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.month, att|LEADING0|LEFT, 2);
|
||||
lcdDrawChar(lcdNextPos-1, y, '-', att);
|
||||
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.year-2000, att|LEFT);
|
||||
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.year-2000, att|LEADING0|LEFT);
|
||||
lcdDrawNumber(lcdNextPos+11, y, telemetryItem.datetime.hour, att|LEADING0|LEFT, 2);
|
||||
lcdDrawChar(lcdNextPos, y, ':', att);
|
||||
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.min, att|LEADING0|LEFT, 2);
|
||||
|
||||
@@ -560,6 +560,8 @@ inline void CLEAR_POPUP()
|
||||
warningInfoText = nullptr;
|
||||
popupMenuHandler = nullptr;
|
||||
popupMenuItemsCount = 0;
|
||||
// TODO ? popupFunc = nullptr;
|
||||
putEvent(EVT_REFRESH);
|
||||
}
|
||||
|
||||
inline void POPUP_WAIT(const char * s)
|
||||
|
||||
@@ -133,7 +133,7 @@ bool menuModelCurveOne(event_t event)
|
||||
|
||||
// Curve type
|
||||
LcdFlags attr = (menuVerticalPosition==ITEM_CURVE_TYPE ? (s_editMode>0 ? INVERS|BLINK : INVERS) : 0);
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, "Type");
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, STR_TYPE);
|
||||
lcdDrawTextAtIndex(MODEL_CURVE_ONE_2ND_COLUMN, MENU_CONTENT_TOP, STR_CURVE_TYPES, crv.type, attr);
|
||||
if (attr) {
|
||||
uint8_t newType = checkIncDecModelZero(event, crv.type, CURVE_TYPE_LAST);
|
||||
|
||||
@@ -60,7 +60,7 @@ bool menuModelFailsafe(event_t event)
|
||||
}
|
||||
|
||||
SIMPLE_SUBMENU_WITH_OPTIONS("FAILSAFE", ICON_STATS_ANALOGS, sentModuleChannels(g_moduleIdx)+1, OPTION_MENU_NO_SCROLLBAR);
|
||||
drawStringWithIndex(50, 3+FH, "Module", g_moduleIdx+1, MENU_TITLE_COLOR);
|
||||
drawStringWithIndex(50, 3+FH, STR_MODULE, g_moduleIdx+1, MENU_TITLE_COLOR);
|
||||
|
||||
for (uint8_t col=0; col < cols; col++) {
|
||||
for (uint8_t line=0; line < 8; line++) {
|
||||
|
||||
@@ -607,6 +607,8 @@ bool menuModelMixAll(event_t event)
|
||||
if (!s_copyMode) {
|
||||
attr = INVERS;
|
||||
}
|
||||
if (g_model.limitData[ch-1].name[0] != '\0')
|
||||
lcdDrawSizedText(MENUS_MARGIN_LEFT, MENU_FOOTER_TOP, g_model.limitData[ch-1].name, sizeof(g_model.limitData[ch-1].name), MENU_TITLE_COLOR | LEFT | ZCHAR);
|
||||
}
|
||||
if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) {
|
||||
putsChn(MENUS_MARGIN_LEFT, y, ch, attr); // show CHx
|
||||
|
||||
@@ -279,7 +279,7 @@ void onModelSelectMenu(const char * result)
|
||||
setCurrentModel(currentCategory->size() - 1);
|
||||
}
|
||||
else {
|
||||
POPUP_WARNING("Invalid File");
|
||||
POPUP_WARNING(STR_INVALID_FILE);
|
||||
}
|
||||
}
|
||||
else if (result == STR_MOVE_MODEL) {
|
||||
|
||||
@@ -788,7 +788,7 @@ bool menuModelSetup(event_t event)
|
||||
|
||||
case ITEM_MODEL_SETUP_DISPLAY_TRIMS:
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DISPLAY_TRIMS);
|
||||
g_model.displayTrims = editChoice(MODEL_SETUP_2ND_COLUMN, y, "\006No\0 ChangeYes", g_model.displayTrims, 0, 2, attr, event);
|
||||
g_model.displayTrims = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VDISPLAYTRIMS, g_model.displayTrims, 0, 2, attr, event);
|
||||
break;
|
||||
|
||||
case ITEM_MODEL_SETUP_TRIM_INC:
|
||||
@@ -1018,10 +1018,6 @@ bool menuModelSetup(event_t event)
|
||||
uint8_t moduleType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable);
|
||||
if (checkIncDec_Ret) {
|
||||
setModuleType(INTERNAL_MODULE, moduleType);
|
||||
#if defined(ACCESS_LIB)
|
||||
// the module will reset on mode switch, we need to reset the authentication counter
|
||||
globalData.authenticationCount = 0;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else if (isModuleXJT(INTERNAL_MODULE)) {
|
||||
@@ -1034,6 +1030,7 @@ bool menuModelSetup(event_t event)
|
||||
}
|
||||
else if (isModulePXX2(INTERNAL_MODULE)) {
|
||||
g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, EE_MODEL);
|
||||
resetAccessAuthenticationCount();
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1115,9 +1112,27 @@ bool menuModelSetup(event_t event)
|
||||
if (isModuleDSM2(moduleIdx))
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
|
||||
#if defined(MULTIMODULE)
|
||||
else if (isModuleMultimodule(moduleIdx)) {
|
||||
else if (isModuleMultimodule(moduleIdx)) {
|
||||
int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
|
||||
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
if (status.isValid()) {
|
||||
int8_t direction = checkIncDec(event, 0, -1, 1);
|
||||
if (direction == -1) {
|
||||
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
|
||||
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
|
||||
else
|
||||
multiRfProto = convertMultiToOtx(status.protocolPrev);
|
||||
}
|
||||
if (direction == 1) {
|
||||
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
|
||||
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
|
||||
else
|
||||
multiRfProto = convertMultiToOtx(status.protocolNext);
|
||||
}
|
||||
}
|
||||
else {
|
||||
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
|
||||
}
|
||||
if (checkIncDec_Ret) {
|
||||
g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto);
|
||||
g_model.moduleData[moduleIdx].subType = 0;
|
||||
@@ -1339,7 +1354,8 @@ bool menuModelSetup(event_t event)
|
||||
{
|
||||
lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MODULE);
|
||||
drawButton(MODEL_SETUP_2ND_COLUMN, y, STR_REGISTER, (menuHorizontalPosition == 0 ? attr : 0));
|
||||
drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0));
|
||||
if (!IS_RX_MULTI(moduleIdx))
|
||||
drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0));
|
||||
if (attr) {
|
||||
if (moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) {
|
||||
if (menuHorizontalPosition == 0 && event == EVT_KEY_BREAK(KEY_ENTER)) {
|
||||
@@ -1523,7 +1539,8 @@ bool menuModelSetup(event_t event)
|
||||
}
|
||||
}
|
||||
drawButton(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, (moduleState[moduleIdx].mode == MODULE_MODE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0));
|
||||
drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0));
|
||||
if (!IS_RX_MULTI(moduleIdx))
|
||||
drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0));
|
||||
uint8_t newFlag = 0;
|
||||
#if defined(MULTIMODULE)
|
||||
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
|
||||
@@ -1686,7 +1703,7 @@ bool menuModelSetup(event_t event)
|
||||
}
|
||||
#if defined(MULTIMODULE)
|
||||
else if (isModuleMultimodule(moduleIdx)) {
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER);
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER);
|
||||
g_model.moduleData[moduleIdx].multi.lowPowerMode = editCheckBox(g_model.moduleData[moduleIdx].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -193,7 +193,7 @@ bool menuRadioHardware(event_t event)
|
||||
LcdFlags attr = (sub == k ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0);
|
||||
switch (k) {
|
||||
case ITEM_RADIO_HARDWARE_CALIBRATION:
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, "Calibration", attr);
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_CALIBRATION, attr);
|
||||
if (attr && s_editMode>0) {
|
||||
pushMenu(menuRadioCalibration);
|
||||
}
|
||||
|
||||
@@ -50,10 +50,7 @@ bool menuRadioPowerMeter(event_t event)
|
||||
lcdDrawCenteredText(LCD_H/2, STR_STOPPING);
|
||||
lcdRefresh();
|
||||
moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID);
|
||||
#if defined(ACCESS_LIB)
|
||||
// the module will reset on mode switch, we need to reset the authentication counter
|
||||
globalData.authenticationCount = 0;
|
||||
#endif
|
||||
resetAccessAuthenticationCount();
|
||||
/* wait 1s to resume normal operation before leaving */
|
||||
watchdogSuspend(500 /*5s*/);
|
||||
RTOS_WAIT_MS(1000);
|
||||
|
||||
@@ -97,6 +97,7 @@ void onUpdateConfirmation(const char * result)
|
||||
OtaUpdateInformation * destination = moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].otaUpdateInformation;
|
||||
Pxx2OtaUpdate otaUpdate(reusableBuffer.sdManager.otaUpdateInformation.module, destination->candidateReceiversNames[destination->selectedReceiverIndex]);
|
||||
otaUpdate.flashFirmware(destination->filename);
|
||||
putEvent(EVT_REFRESH);
|
||||
}
|
||||
else {
|
||||
moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
|
||||
@@ -563,7 +564,7 @@ bool menuRadioSdManager(event_t _event)
|
||||
if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) {
|
||||
if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) {
|
||||
CLEAR_POPUP();
|
||||
popupMenuItemsCount = min<uint8_t>(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE);
|
||||
popupMenuItemsCount = min<uint8_t>(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE);
|
||||
for (auto rx = 0; rx < popupMenuItemsCount; rx++) {
|
||||
popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx];
|
||||
}
|
||||
|
||||
@@ -58,10 +58,7 @@ bool menuRadioSpectrumAnalyser(event_t event)
|
||||
lcdRefresh();
|
||||
if (isModulePXX2(g_moduleIdx)) {
|
||||
moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID);
|
||||
#if defined(ACCESS_LIB)
|
||||
// the module will reset on mode switch, we need to reset the authentication counter
|
||||
globalData.authenticationCount = 0;
|
||||
#endif
|
||||
resetAccessAuthenticationCount();
|
||||
}
|
||||
else if (isModuleMultimodule(g_moduleIdx)) {
|
||||
if (reusableBuffer.spectrumAnalyser.moduleOFF)
|
||||
|
||||
@@ -121,7 +121,7 @@ bool editZoneOption(coord_t y, const ZoneOption * option, ZoneOptionValue * valu
|
||||
}
|
||||
}
|
||||
else if (option->type == ZoneOption::TextSize) {
|
||||
lcdDrawTextAtIndex(SCREENS_SETUP_2ND_COLUMN, y, "\010StandardTiny\0 Small\0 Mid\0 Double", value->unsignedValue, attr);
|
||||
lcdDrawTextAtIndex(SCREENS_SETUP_2ND_COLUMN, y, STR_TEXT_SIZE, value->unsignedValue, attr);
|
||||
if (attr) {
|
||||
value->unsignedValue = checkIncDec(event, value->unsignedValue, 0, 4, i_flags);
|
||||
}
|
||||
@@ -558,7 +558,7 @@ bool menuScreenSetup(int index, event_t event)
|
||||
currentContainer = currentScreen;
|
||||
bool needsOffsetCheck = (menuVerticalPosition != 0 || menuHorizontalPosition < 0);
|
||||
|
||||
char title[] = "Main view X";
|
||||
char title[] = TR_MAIN_VIEW_X;
|
||||
title[sizeof(title)-2] = '1' + index;
|
||||
menuPageCount = updateMainviewsMenu();
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ bool menuTextView(event_t event)
|
||||
break;
|
||||
|
||||
case EVT_ROTARY_RIGHT:
|
||||
if (menuVerticalOffset + NUM_BODY_LINES >= lines_count)
|
||||
if (menuVerticalOffset + TEXT_VIEWER_LINES >= lines_count)
|
||||
break;
|
||||
else
|
||||
++menuVerticalOffset;
|
||||
@@ -55,11 +55,11 @@ bool menuTextView(event_t event)
|
||||
break;
|
||||
}
|
||||
|
||||
for (int i=0; i<NUM_BODY_LINES; i++) {
|
||||
lcd->drawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT);
|
||||
for (int i = 0; i < TEXT_VIEWER_LINES; i++) {
|
||||
lcd->drawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_HEADER_HEIGHT + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT);
|
||||
}
|
||||
|
||||
drawVerticalScrollbar(LCD_W-5, 50, 195, menuVerticalOffset, lines_count, NUM_BODY_LINES);
|
||||
drawVerticalScrollbar(LCD_W-5, 50, 195, menuVerticalOffset, lines_count, TEXT_VIEWER_LINES);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -34,10 +34,10 @@ class GaugeWidget: public Widget
|
||||
};
|
||||
|
||||
const ZoneOption GaugeWidget::options[] = {
|
||||
{ "Source", ZoneOption::Source, OPTION_VALUE_UNSIGNED(1) },
|
||||
{ "Min", ZoneOption::Integer, OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) },
|
||||
{ "Max", ZoneOption::Integer, OPTION_VALUE_SIGNED(RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) },
|
||||
{ "Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) },
|
||||
{ STR_SOURCE, ZoneOption::Source, OPTION_VALUE_UNSIGNED(1) },
|
||||
{ STR_MIN, ZoneOption::Integer, OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) },
|
||||
{ STR_MAX, ZoneOption::Integer, OPTION_VALUE_SIGNED(RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) },
|
||||
{ STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -86,9 +86,9 @@ class OutputsWidget: public Widget
|
||||
};
|
||||
|
||||
const ZoneOption OutputsWidget::options[] = {
|
||||
{ "First channel", ZoneOption::Integer, OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(32) },
|
||||
{ "Fill Background?", ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
|
||||
{ "BG Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(LIGHTGREY) },
|
||||
{ STR_FIRST_CHANNEL, ZoneOption::Integer, OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(32) },
|
||||
{ STR_FILL_BACKGROUND, ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
|
||||
{ STR_BG_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(LIGHTGREY) },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -36,10 +36,10 @@ class TextWidget: public Widget
|
||||
};
|
||||
|
||||
const ZoneOption TextWidget::options[] = {
|
||||
{ "Text", ZoneOption::String, OPTION_VALUE_STRING(TEXT_WIDGET_DEFAULT_LABEL) },
|
||||
{ "Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) },
|
||||
{ "Size", ZoneOption::TextSize, OPTION_VALUE_UNSIGNED(0) },
|
||||
{ "Shadow", ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
|
||||
{ STR_TEXT, ZoneOption::String, OPTION_VALUE_STRING(TEXT_WIDGET_DEFAULT_LABEL) },
|
||||
{ STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) },
|
||||
{ STR_SIZE, ZoneOption::TextSize, OPTION_VALUE_UNSIGNED(0) },
|
||||
{ STR_SHADOW, ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ class TimerWidget: public Widget
|
||||
};
|
||||
|
||||
const ZoneOption TimerWidget::options[] = {
|
||||
{ "Timer source", ZoneOption::Timer, OPTION_VALUE_UNSIGNED(0) },
|
||||
{ STR_TIMER_SOURCE, ZoneOption::Timer, OPTION_VALUE_UNSIGNED(0) },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -34,9 +34,9 @@ class ValueWidget: public Widget
|
||||
};
|
||||
|
||||
const ZoneOption ValueWidget::options[] = {
|
||||
{ "Source", ZoneOption::Source, OPTION_VALUE_UNSIGNED(MIXSRC_Rud) },
|
||||
{ "Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(WHITE) },
|
||||
{ "Shadow", ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
|
||||
{ STR_SOURCE, ZoneOption::Source, OPTION_VALUE_UNSIGNED(MIXSRC_Rud) },
|
||||
{ STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(WHITE) },
|
||||
{ STR_SHADOW, ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
|
||||
{ NULL, ZoneOption::Bool }
|
||||
};
|
||||
|
||||
|
||||
@@ -576,7 +576,7 @@ void menuRadioSdManager(event_t _event)
|
||||
if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) {
|
||||
if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) {
|
||||
CLEAR_POPUP();
|
||||
popupMenuItemsCount = min<uint8_t>(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE);
|
||||
popupMenuItemsCount = min<uint8_t>(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE);
|
||||
for (auto rx = 0; rx < popupMenuItemsCount; rx++) {
|
||||
popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx];
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ void menuViewTelemetry(event_t event)
|
||||
}
|
||||
|
||||
drawTelemetryTopBar();
|
||||
lcdDrawText(LCD_W / 2, 3 * FH, "No Telemetry Screens", CENTERED);
|
||||
lcdDrawText(LCD_W / 2, 3 * FH, STR_NO_TELEMETRY_SCREENS, CENTERED);
|
||||
displayRssiLine();
|
||||
}
|
||||
|
||||
|
||||
@@ -789,7 +789,7 @@ int getFirstAvailable(int min, int max, IsValueAvailable isValueAvailable)
|
||||
#if defined(MULTIMODULE)
|
||||
|
||||
// This maps OpenTX multi type with Pascal's Multi type
|
||||
uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
|
||||
uint8_t multiConvertOtxToMulti(uint8_t moduleIdx, uint8_t type)
|
||||
{
|
||||
|
||||
// 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky)
|
||||
@@ -803,7 +803,7 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
|
||||
|
||||
if (type == MODULE_SUBTYPE_MULTI_FRSKY) {
|
||||
int subtype = g_model.moduleData[moduleIdx].subType;
|
||||
if (subtype == MM_RF_FRSKY_SUBTYPE_D8) {
|
||||
if (subtype == MM_RF_FRSKY_SUBTYPE_D8 || subtype == MM_RF_FRSKY_SUBTYPE_D8_CLONED) {
|
||||
//D8
|
||||
type = 3;
|
||||
}
|
||||
@@ -818,6 +818,27 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
|
||||
return type;
|
||||
}
|
||||
|
||||
// This maps multi type to OpenTX number, type ONLY (no subtype)
|
||||
int convertMultiToOtx(int type)
|
||||
{
|
||||
if (type == 3) //FrSkyD
|
||||
return MODULE_SUBTYPE_MULTI_FRSKY;
|
||||
|
||||
if (type == 15) //FrSkyX
|
||||
return MODULE_SUBTYPE_MULTI_FRSKY;
|
||||
|
||||
if (type == 25) //FrSkyV
|
||||
return MODULE_SUBTYPE_MULTI_FRSKY;
|
||||
|
||||
if (type > 25)
|
||||
type = type - 1;
|
||||
|
||||
if (type > 15)
|
||||
type = type - 1;
|
||||
|
||||
return type - 1; //Multi list starts at 1
|
||||
}
|
||||
|
||||
// Third row is number of subtypes -1 (max valid subtype)
|
||||
#define NO_SUBTYPE nullptr
|
||||
|
||||
@@ -831,8 +852,8 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
|
||||
|
||||
const char STR_SUBTYPE_FLYSKY[] = "\004""Std\0""V9x9""V6x6""V912""CX20";
|
||||
const char STR_SUBTYPE_HUBSAN[] = "\004""H107""H301""H501";
|
||||
const char STR_SUBTYPE_FRSKY[] = "\007""D16\0 ""D8\0 ""D16 8ch""V8\0 ""LBT(EU)""LBT 8ch";
|
||||
const char STR_SUBTYPE_FRSKYX2[] = "\007""D16\0 ""D16 8ch""LBT(EU)""LBT 8ch";
|
||||
const char STR_SUBTYPE_FRSKY[] = "\011""D16\0 ""D8\0 ""D16 8ch\0 ""V8\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D8Cloned\0""D16Cloned";
|
||||
const char STR_SUBTYPE_FRSKYX2[] = "\011""D16\0 ""D16 8ch\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D16Cloned";
|
||||
const char STR_SUBTYPE_HISKY[] = "\005""Std\0 ""HK310";
|
||||
const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506";
|
||||
const char STR_SUBTYPE_DSM[] = "\006""2 22ms""2 11ms""X 22ms""X 11ms";
|
||||
@@ -866,6 +887,7 @@ const char STR_SUBTYPE_ZSX[] = "\007""280JJRC";
|
||||
const char STR_SUBTYPE_FLYZONE[] = "\005""FZ410";
|
||||
const char STR_SUBTYPE_FX816[] = "\003""P38";
|
||||
const char STR_SUBTYPE_ESKY150[] = "\003""4CH""7CH";
|
||||
const char STR_SUBTYPE_FRSKYL[] = "\010""LR12\0 ""LR12 6ch";
|
||||
|
||||
const char* mm_options_strings::options[] = {
|
||||
nullptr,
|
||||
@@ -883,7 +905,7 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
// Protocol as defined in pulses\modules_constants.h, number of sub_protocols - 1, Failsafe supported, Disable channel mapping supported, Subtype string, Option type
|
||||
{MODULE_SUBTYPE_MULTI_FLYSKY, 4, false, true, STR_SUBTYPE_FLYSKY, nullptr},
|
||||
{MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ},
|
||||
{MODULE_SUBTYPE_MULTI_FRSKY, 5, false, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE},
|
||||
{MODULE_SUBTYPE_MULTI_FRSKY, 7, false, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE},
|
||||
{MODULE_SUBTYPE_MULTI_HISKY, 1, false, true, STR_SUBTYPE_HISKY, nullptr},
|
||||
{MODULE_SUBTYPE_MULTI_V2X2, 1, false, false, STR_SUBTYPE_V2X2, nullptr},
|
||||
{MODULE_SUBTYPE_MULTI_DSM2, 3, false, true, STR_SUBTYPE_DSM, STR_MULTI_MAX_THROW},
|
||||
@@ -924,7 +946,9 @@ const mm_protocol_definition multi_protocols[] = {
|
||||
{MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr},
|
||||
{MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr},
|
||||
{MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE},
|
||||
{MODULE_SUBTYPE_MULTI_FRSKYX2, 3, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE},
|
||||
{MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE},
|
||||
{MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, NO_SUBTYPE, nullptr},
|
||||
{MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE},
|
||||
{MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION},
|
||||
|
||||
// Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff)
|
||||
|
||||
@@ -122,6 +122,8 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value,
|
||||
void drawSourceCustomValue(coord_t x, coord_t y, source_t channel, int32_t val, LcdFlags flags=0);
|
||||
void drawSourceValue(coord_t x, coord_t y, source_t channel, LcdFlags flags=0);
|
||||
|
||||
int convertMultiToOtx(int type);
|
||||
|
||||
void drawCurve(coord_t offset=0);
|
||||
|
||||
#if defined(COLORLCD)
|
||||
@@ -139,6 +141,9 @@ void runFatalErrorScreen(const char * message);
|
||||
|
||||
inline uint8_t MODULE_BIND_ROWS(int moduleIdx)
|
||||
{
|
||||
if (IS_RX_MULTI(moduleIdx))
|
||||
return 0;
|
||||
|
||||
if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx))
|
||||
return 1;
|
||||
|
||||
@@ -150,7 +155,7 @@ inline uint8_t MODULE_BIND_ROWS(int moduleIdx)
|
||||
|
||||
inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx)
|
||||
{
|
||||
if (!IS_MODULE_ENABLED(moduleIdx))
|
||||
if (!IS_MODULE_ENABLED(moduleIdx) || IS_RX_MULTI(moduleIdx))
|
||||
return HIDDEN_ROW;
|
||||
|
||||
if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || isModuleSBUS(moduleIdx) || (isModuleMultimodule(moduleIdx) && g_model.moduleData[moduleIdx].getMultiProtocol() != MODULE_SUBTYPE_MULTI_DSM2))
|
||||
@@ -250,14 +255,14 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx)
|
||||
return false;
|
||||
}
|
||||
|
||||
#define MULTIMODULE_MODULE_ROWS(moduleIdx) MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP
|
||||
#define MULTIMODULE_MODULE_ROWS(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP
|
||||
#define MULTIMODULE_TYPE_ROW(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW,
|
||||
#define MULTIMODULE_STATUS_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(moduleIdx) && getMultiSyncStatus(moduleIdx).isValid()) ? TITLE_ROW : HIDDEN_ROW,
|
||||
#define MULTIMODULE_MODE_ROWS(moduleIdx) (g_model.moduleData[moduleIdx].multi.customProto) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t)2 : (uint8_t)1
|
||||
#define MULTIMODULE_TYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW,
|
||||
#define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW,
|
||||
#define MULTIMODULE_OPTIONS_ROW(moduleIdx) (isModuleMultimodule(moduleIdx) && MULTIMODULE_HASOPTIONS(moduleIdx)) ? (uint8_t) 0: HIDDEN_ROW
|
||||
#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW
|
||||
#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW
|
||||
|
||||
#else
|
||||
#define MULTIMODULE_STATUS_ROWS(moduleIdx)
|
||||
|
||||
@@ -71,7 +71,7 @@ class MultiFirmwareInformation {
|
||||
|
||||
bool isMultiInternalFirmware() const
|
||||
{
|
||||
return (boardType == FIRMWARE_MULTI_STM && telemetryInversion == false && optibootSupport == true && bootloaderCheck == true && telemetryType == FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY);
|
||||
return (boardType == FIRMWARE_MULTI_STM && optibootSupport == true && bootloaderCheck == true && telemetryType == FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY);
|
||||
}
|
||||
|
||||
bool isMultiExternalFirmware() const
|
||||
|
||||
@@ -1206,11 +1206,14 @@ static int luaPopupWarning(lua_State * L)
|
||||
}
|
||||
|
||||
/*luadoc
|
||||
@function popupConfirmation(title, event)
|
||||
@function popupConfirmation(title, event) deprecated, please replace by
|
||||
@function popupConfirmation(title, message, event)
|
||||
|
||||
Raises a pop-up on screen that asks for confirmation
|
||||
|
||||
@param title (string) text to display
|
||||
@param title (string) title to display
|
||||
|
||||
@param message (string) text to display
|
||||
|
||||
@param event (number) the event variable that is passed in from the
|
||||
Run function (key pressed)
|
||||
@@ -1219,13 +1222,24 @@ Run function (key pressed)
|
||||
|
||||
@notice Use only from stand-alone and telemetry scripts.
|
||||
|
||||
@status current Introduced in 2.2.0
|
||||
@status current Introduced in 2.2.0, changed to (title, message, event) in 2.3.8
|
||||
*/
|
||||
static int luaPopupConfirmation(lua_State * L)
|
||||
{
|
||||
event_t event = luaL_checkinteger(L, 2);
|
||||
warningText = luaL_checkstring(L, 1);
|
||||
warningType = WARNING_TYPE_CONFIRM;
|
||||
event_t event;
|
||||
|
||||
if (lua_isnone(L, 3)) {
|
||||
// only two args: deprecated mode
|
||||
warningText = luaL_checkstring(L, 1);
|
||||
event = luaL_checkinteger(L, 2);
|
||||
}
|
||||
else {
|
||||
warningText = luaL_checkstring(L, 1);
|
||||
warningInfoText = luaL_checkstring(L, 2);
|
||||
event = luaL_optinteger(L, 3, 0);
|
||||
}
|
||||
|
||||
runPopupWarning(event);
|
||||
if (!warningText) {
|
||||
lua_pushstring(L, warningResult ? "OK" : "CANCEL");
|
||||
@@ -1875,8 +1889,6 @@ const luaR_value_entry opentxConstants[] = {
|
||||
{ "PLAY_BACKGROUND", PLAY_BACKGROUND },
|
||||
{ "TIMEHOUR", TIMEHOUR },
|
||||
|
||||
#if defined(PCBHORUS)
|
||||
// Adding the unit consts for the set Telemetry function adds about 1k of flash usage
|
||||
{"UNIT_RAW", UNIT_RAW },
|
||||
{"UNIT_VOLTS", UNIT_VOLTS },
|
||||
{"UNIT_AMPS", UNIT_AMPS },
|
||||
@@ -1910,6 +1922,6 @@ const luaR_value_entry opentxConstants[] = {
|
||||
{"UNIT_GPS", UNIT_GPS},
|
||||
{"UNIT_BITFIELD", UNIT_BITFIELD},
|
||||
{"UNIT_TEXT", UNIT_TEXT},
|
||||
#endif
|
||||
|
||||
{ nullptr, 0 } /* sentinel */
|
||||
};
|
||||
|
||||
@@ -86,7 +86,24 @@ static int luaModelSetInfo(lua_State *L)
|
||||
|
||||
Get RF module parameters
|
||||
|
||||
`subType` values:
|
||||
`Type` values:
|
||||
* 0 NONE
|
||||
* 1 PPM
|
||||
* 2 XJT_PXX1
|
||||
* 3 ISRM_PXX2
|
||||
* 4 DSM2
|
||||
* 5 CROSSFIRE
|
||||
* 6 MULTIMODULE
|
||||
* 7 R9M_PXX1
|
||||
* 8 R9M_PXX2
|
||||
* 9 R9M_LITE_PXX1
|
||||
* 10 R9M_LITE_PXX2
|
||||
* 11 R9M_LITE_PRO_PXX1
|
||||
* 12 R9M_LITE_PRO_PXX2
|
||||
* 13 SBUS
|
||||
* 14 XJT_LITE_PXX2
|
||||
|
||||
`subType` values for XJT_PXX1:
|
||||
* -1 OFF
|
||||
* 0 D16
|
||||
* 1 D8
|
||||
@@ -101,6 +118,11 @@ Get RF module parameters
|
||||
* `modelId` (number) receiver number
|
||||
* `firstChannel` (number) start channel (0 is CH1)
|
||||
* `channelsCount` (number) number of channels sent to module
|
||||
* `Type` (number) module type
|
||||
* if the module type is Multi additional information are available
|
||||
* `protocol` (number) protocol number
|
||||
* `subProtocol` (number) sub-protocol number
|
||||
* `channelsOrder` (number) first 4 channels expected order
|
||||
|
||||
@status current Introduced in TODO
|
||||
*/
|
||||
@@ -114,6 +136,25 @@ static int luaModelGetModule(lua_State *L)
|
||||
lua_pushtableinteger(L, "modelId", g_model.header.modelId[idx]);
|
||||
lua_pushtableinteger(L, "firstChannel", module.channelsStart);
|
||||
lua_pushtableinteger(L, "channelsCount", module.channelsCount + 8);
|
||||
lua_pushtableinteger(L, "Type", module.type);
|
||||
#if defined(MULTIMODULE)
|
||||
if (module.type == MODULE_TYPE_MULTIMODULE) {
|
||||
int protocol = g_model.moduleData[idx].getMultiProtocol() + 1;
|
||||
int subprotocol = g_model.moduleData[idx].subType;
|
||||
convertOtxProtocolToMulti(&protocol, &subprotocol); // Special treatment for the FrSky entry...
|
||||
lua_pushtableinteger(L, "protocol", protocol);
|
||||
lua_pushtableinteger(L, "subProtocol", subprotocol);
|
||||
if (getMultiModuleStatus(idx).isValid()) {
|
||||
if (getMultiModuleStatus(idx).ch_order == 0xFF)
|
||||
lua_pushtableinteger(L, "channelsOrder", -1);
|
||||
else
|
||||
lua_pushtableinteger(L, "channelsOrder", getMultiModuleStatus(idx).ch_order);
|
||||
}
|
||||
else {
|
||||
lua_pushtableinteger(L, "channelsOrder", -1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
lua_pushnil(L);
|
||||
|
||||
+4
-8
@@ -901,9 +901,7 @@ void evalMixes(uint8_t tick10ms)
|
||||
|
||||
static uint16_t fp_act[MAX_FLIGHT_MODES] = {0};
|
||||
static uint16_t delta = 0;
|
||||
static ACTIVE_PHASES_TYPE flightModesFade = 0;
|
||||
|
||||
LS_RECURSIVE_EVALUATION_RESET();
|
||||
static uint16_t flightModesFade = 0;
|
||||
|
||||
uint8_t fm = getFlightMode();
|
||||
|
||||
@@ -915,7 +913,7 @@ void evalMixes(uint8_t tick10ms)
|
||||
}
|
||||
else {
|
||||
uint8_t fadeTime = max(g_model.flightModeData[lastFlightMode].fadeOut, g_model.flightModeData[fm].fadeIn);
|
||||
ACTIVE_PHASES_TYPE transitionMask = ((ACTIVE_PHASES_TYPE)1 << lastFlightMode) + ((ACTIVE_PHASES_TYPE)1 << fm);
|
||||
uint16_t transitionMask = (0x01u << lastFlightMode) + (0x01u << fm);
|
||||
if (fadeTime) {
|
||||
flightModesFade |= transitionMask;
|
||||
delta = (MAX_ACT / 10) / fadeTime;
|
||||
@@ -945,15 +943,13 @@ void evalMixes(uint8_t tick10ms)
|
||||
if (flightModesFade) {
|
||||
memclear(sum_chans512, sizeof(sum_chans512));
|
||||
for (uint8_t p=0; p<MAX_FLIGHT_MODES; p++) {
|
||||
LS_RECURSIVE_EVALUATION_RESET();
|
||||
if (flightModesFade & ((ACTIVE_PHASES_TYPE)1 << p)) {
|
||||
if (flightModesFade & (0x01 << p)) {
|
||||
mixerCurrentFlightMode = p;
|
||||
evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0);
|
||||
for (uint8_t i=0; i<MAX_OUTPUT_CHANNELS; i++)
|
||||
sum_chans512[i] += (chans[i] >> 4) * fp_act[p];
|
||||
weight += fp_act[p];
|
||||
}
|
||||
LS_RECURSIVE_EVALUATION_RESET();
|
||||
}
|
||||
assert(weight);
|
||||
mixerCurrentFlightMode = fm;
|
||||
@@ -994,7 +990,7 @@ void evalMixes(uint8_t tick10ms)
|
||||
if (tick10ms && flightModesFade) {
|
||||
uint16_t tick_delta = delta * tick10ms;
|
||||
for (uint8_t p=0; p<MAX_FLIGHT_MODES; p++) {
|
||||
ACTIVE_PHASES_TYPE flightModeMask = ((ACTIVE_PHASES_TYPE)1 << p);
|
||||
uint16_t flightModeMask = (0x01 << p);
|
||||
if (flightModesFade & flightModeMask) {
|
||||
if (p == fm) {
|
||||
if (MAX_ACT - fp_act[p] > tick_delta)
|
||||
|
||||
+2
-77
@@ -21,14 +21,12 @@
|
||||
#ifndef _OPENTX_H_
|
||||
#define _OPENTX_H_
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <string.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include "definitions.h"
|
||||
#include "opentx_types.h"
|
||||
#include "debounce.h"
|
||||
#include "globals.h"
|
||||
#include "opentx_helpers.h"
|
||||
|
||||
#if defined(SIMU)
|
||||
#include "targets/simu/simpgmspace.h"
|
||||
@@ -502,7 +500,6 @@ void logicalSwitchesReset();
|
||||
|
||||
void evalLogicalSwitches(bool isCurrentFlightmode=true);
|
||||
void logicalSwitchesCopyState(uint8_t src, uint8_t dst);
|
||||
#define LS_RECURSIVE_EVALUATION_RESET()
|
||||
|
||||
#if defined(PCBTARANIS) || defined(PCBHORUS)
|
||||
void getSwitchesPosition(bool startup);
|
||||
@@ -547,34 +544,8 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim);
|
||||
|
||||
#include "gvars.h"
|
||||
|
||||
extern uint16_t sessionTimer;
|
||||
extern uint16_t s_timeCumThr;
|
||||
extern uint16_t s_timeCum16ThrP;
|
||||
|
||||
#if defined(OVERRIDE_CHANNEL_FUNCTION)
|
||||
#define OVERRIDE_CHANNEL_UNDEFINED -4096
|
||||
extern safetych_t safetyCh[MAX_OUTPUT_CHANNELS];
|
||||
#endif
|
||||
|
||||
extern uint8_t trimsCheckTimer;
|
||||
extern uint8_t trimsDisplayTimer;
|
||||
extern uint8_t trimsDisplayMask;
|
||||
|
||||
void flightReset(uint8_t check=true);
|
||||
|
||||
PACK(struct GlobalData {
|
||||
uint8_t unexpectedShutdown:1;
|
||||
uint8_t externalAntennaEnabled:1;
|
||||
uint8_t authenticationCount:2;
|
||||
uint8_t upgradeModulePopup:1;
|
||||
uint8_t internalModuleVersionChecked:1;
|
||||
uint8_t spare:2;
|
||||
});
|
||||
|
||||
extern GlobalData globalData;
|
||||
|
||||
extern uint16_t maxMixerDuration;
|
||||
|
||||
#define DURATION_MS_PREC2(x) ((x)/20)
|
||||
|
||||
#if defined(THRTRACE)
|
||||
@@ -723,14 +694,9 @@ extern const char vers_stamp[];
|
||||
const char * getOtherVersion(char * buffer);
|
||||
|
||||
#define g_blinkTmr10ms (*(uint8_t*)&g_tmr10ms)
|
||||
extern uint8_t g_beepCnt;
|
||||
|
||||
#include "trainer.h"
|
||||
|
||||
extern int32_t chans[MAX_OUTPUT_CHANNELS];
|
||||
extern int16_t ex_chans[MAX_OUTPUT_CHANNELS]; // Outputs (before LIMITS) of the last perMain
|
||||
extern int16_t channelOutputs[MAX_OUTPUT_CHANNELS];
|
||||
|
||||
int expo(int x, int k);
|
||||
|
||||
inline void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFlags * flags = 0)
|
||||
@@ -829,33 +795,15 @@ int16_t applyLimits(uint8_t channel, int32_t value);
|
||||
void evalInputs(uint8_t mode);
|
||||
uint16_t anaIn(uint8_t chan);
|
||||
|
||||
extern int16_t calibratedAnalogs[NUM_CALIBRATED_ANALOGS];
|
||||
|
||||
#define FLASH_DURATION 20 /*200ms*/
|
||||
|
||||
extern uint8_t beepAgain;
|
||||
extern uint16_t lightOffCounter;
|
||||
extern uint8_t flashCounter;
|
||||
extern uint8_t mixWarning;
|
||||
|
||||
FlightModeData * flightModeAddress(uint8_t idx);
|
||||
ExpoData * expoAddress(uint8_t idx);
|
||||
MixData * mixAddress(uint8_t idx);
|
||||
LimitData * limitAddress(uint8_t idx);
|
||||
LogicalSwitchData * lswAddress(uint8_t idx);
|
||||
|
||||
// static variables used in evalFlightModeMixes - moved here so they don't interfere with the stack
|
||||
// It's also easier to initialize them here.
|
||||
extern int8_t virtualInputsTrims[MAX_INPUTS];
|
||||
|
||||
extern int16_t anas [MAX_INPUTS];
|
||||
extern int16_t trims[NUM_TRIMS];
|
||||
extern BeepANACenter bpanaCenter;
|
||||
|
||||
extern uint8_t s_mixer_first_run_done;
|
||||
|
||||
void applyDefaultTemplate();
|
||||
|
||||
void instantTrim();
|
||||
void evalTrims();
|
||||
void copyTrimsToOffset(uint8_t ch);
|
||||
@@ -863,20 +811,6 @@ void copySticksToOffset(uint8_t ch);
|
||||
void copyMinMaxToOutputs(uint8_t ch);
|
||||
void moveTrimsToOffsets();
|
||||
|
||||
typedef uint16_t ACTIVE_PHASES_TYPE;
|
||||
#define DELAY_POS_MARGIN 3
|
||||
typedef int16_t delayval_t;
|
||||
PACK(struct SwOn {
|
||||
uint16_t delay:14; // max = 2550
|
||||
uint8_t activeMix:1;
|
||||
uint8_t activeExpo:1;
|
||||
int16_t now; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
|
||||
int16_t prev;
|
||||
});
|
||||
|
||||
extern SwOn swOn[MAX_MIXERS];
|
||||
extern int32_t act[MAX_MIXERS];
|
||||
|
||||
#if defined(BOLD_FONT)
|
||||
inline bool isExpoActive(uint8_t expo)
|
||||
{
|
||||
@@ -1050,15 +984,6 @@ void setMFP();
|
||||
void clearMFP();
|
||||
#endif
|
||||
|
||||
extern uint8_t requiredSpeakerVolume;
|
||||
|
||||
enum MainRequest {
|
||||
REQUEST_SCREENSHOT,
|
||||
REQUEST_FLIGHT_RESET,
|
||||
};
|
||||
|
||||
extern uint8_t mainRequestFlags;
|
||||
|
||||
void checkBattery();
|
||||
void opentxClose(uint8_t shutdown=true);
|
||||
void opentxInit();
|
||||
|
||||
@@ -102,68 +102,70 @@ enum ModuleSubtypeR9M {
|
||||
enum ModuleSubtypeMulti {
|
||||
MODULE_SUBTYPE_MULTI_FIRST = 0,
|
||||
MODULE_SUBTYPE_MULTI_FLYSKY = MODULE_SUBTYPE_MULTI_FIRST,
|
||||
MODULE_SUBTYPE_MULTI_HUBSAN,
|
||||
MODULE_SUBTYPE_MULTI_FRSKY,
|
||||
MODULE_SUBTYPE_MULTI_HISKY,
|
||||
MODULE_SUBTYPE_MULTI_V2X2,
|
||||
MODULE_SUBTYPE_MULTI_DSM2,
|
||||
MODULE_SUBTYPE_MULTI_HUBSAN, //1
|
||||
MODULE_SUBTYPE_MULTI_FRSKY, //2
|
||||
MODULE_SUBTYPE_MULTI_HISKY, //3
|
||||
MODULE_SUBTYPE_MULTI_V2X2, //4
|
||||
MODULE_SUBTYPE_MULTI_DSM2, //5
|
||||
MODULE_SUBTYPE_MULTI_DEVO,
|
||||
MODULE_SUBTYPE_MULTI_YD717,
|
||||
MODULE_SUBTYPE_MULTI_KN,
|
||||
MODULE_SUBTYPE_MULTI_SYMAX,
|
||||
MODULE_SUBTYPE_MULTI_SLT,
|
||||
MODULE_SUBTYPE_MULTI_SLT, //10
|
||||
MODULE_SUBTYPE_MULTI_CX10,
|
||||
MODULE_SUBTYPE_MULTI_CG023,
|
||||
MODULE_SUBTYPE_MULTI_BAYANG,
|
||||
MODULE_SUBTYPE_MULTI_ESky,
|
||||
MODULE_SUBTYPE_MULTI_MT99XX,
|
||||
MODULE_SUBTYPE_MULTI_MT99XX, //15
|
||||
MODULE_SUBTYPE_MULTI_MJXQ,
|
||||
MODULE_SUBTYPE_MULTI_SHENQI,
|
||||
MODULE_SUBTYPE_MULTI_FY326,
|
||||
MODULE_SUBTYPE_MULTI_SFHSS,
|
||||
MODULE_SUBTYPE_MULTI_J6PRO,
|
||||
MODULE_SUBTYPE_MULTI_J6PRO, //20
|
||||
MODULE_SUBTYPE_MULTI_FQ777,
|
||||
MODULE_SUBTYPE_MULTI_ASSAN,
|
||||
MODULE_SUBTYPE_MULTI_HONTAI,
|
||||
MODULE_SUBTYPE_MULTI_OLRS,
|
||||
MODULE_SUBTYPE_MULTI_FS_AFHDS2A,
|
||||
MODULE_SUBTYPE_MULTI_FS_AFHDS2A, //25
|
||||
MODULE_SUBTYPE_MULTI_Q2X2,
|
||||
MODULE_SUBTYPE_MULTI_WK_2X01,
|
||||
MODULE_SUBTYPE_MULTI_Q303,
|
||||
MODULE_SUBTYPE_MULTI_GW008,
|
||||
MODULE_SUBTYPE_MULTI_DM002,
|
||||
MODULE_SUBTYPE_MULTI_DM002, //30
|
||||
MODULE_SUBTYPE_MULTI_CABELL,
|
||||
MODULE_SUBTYPE_MULTI_ESKY150,
|
||||
MODULE_SUBTYPE_MULTI_H83D,
|
||||
MODULE_SUBTYPE_MULTI_CORONA,
|
||||
MODULE_SUBTYPE_MULTI_CFLIE,
|
||||
MODULE_SUBTYPE_MULTI_CFLIE, //35
|
||||
MODULE_SUBTYPE_MULTI_HITEC,
|
||||
MODULE_SUBTYPE_MULTI_WFLY,
|
||||
MODULE_SUBTYPE_MULTI_BUGS,
|
||||
MODULE_SUBTYPE_MULTI_BUGS_MINI,
|
||||
MODULE_SUBTYPE_MULTI_TRAXXAS,
|
||||
MODULE_SUBTYPE_MULTI_TRAXXAS, //40
|
||||
MODULE_SUBTYPE_MULTI_NCC1701,
|
||||
MODULE_SUBTYPE_MULTI_E01X,
|
||||
MODULE_SUBTYPE_MULTI_V911S,
|
||||
MODULE_SUBTYPE_MULTI_GD00X,
|
||||
MODULE_SUBTYPE_MULTI_V761,
|
||||
MODULE_SUBTYPE_MULTI_V761, //45
|
||||
MODULE_SUBTYPE_MULTI_KF606,
|
||||
MODULE_SUBTYPE_MULTI_REDPINE,
|
||||
MODULE_SUBTYPE_MULTI_POTENSIC,
|
||||
MODULE_SUBTYPE_MULTI_ZSX,
|
||||
MODULE_SUBTYPE_MULTI_FLYZONE,
|
||||
MODULE_SUBTYPE_MULTI_FLYZONE, //50
|
||||
MODULE_SUBTYPE_MULTI_SCANNER,
|
||||
MODULE_SUBTYPE_MULTI_FRSKYX_RX,
|
||||
MODULE_SUBTYPE_MULTI_AFHDS2A_RX,
|
||||
MODULE_SUBTYPE_MULTI_HOTT,
|
||||
MODULE_SUBTYPE_MULTI_FX816,
|
||||
MODULE_SUBTYPE_MULTI_FX816, //55
|
||||
MODULE_SUBTYPE_MULTI_BAYANG_RX,
|
||||
MODULE_SUBTYPE_MULTI_PELIKAN,
|
||||
MODULE_SUBTYPE_MULTI_TIGER,
|
||||
MODULE_SUBTYPE_MULTI_XK,
|
||||
MODULE_SUBTYPE_MULTI_XN297DUMP,
|
||||
MODULE_SUBTYPE_MULTI_XN297DUMP, //60
|
||||
MODULE_SUBTYPE_MULTI_FRSKYX2,
|
||||
MODULE_SUBTYPE_MULTI_FRSKY_R9,
|
||||
MODULE_SUBTYPE_MULTI_PROPEL,
|
||||
MODULE_SUBTYPE_MULTI_FRSKYL,
|
||||
MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FRSKY_R9
|
||||
};
|
||||
#define MODULE_SUBTYPE_MULTI_XN297DP 63-3
|
||||
@@ -182,7 +184,9 @@ enum MMRFrskySubtypes {
|
||||
MM_RF_FRSKY_SUBTYPE_D16_8CH,
|
||||
MM_RF_FRSKY_SUBTYPE_V8,
|
||||
MM_RF_FRSKY_SUBTYPE_D16_LBT,
|
||||
MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH
|
||||
MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH,
|
||||
MM_RF_FRSKY_SUBTYPE_D8_CLONED,
|
||||
MM_RF_FRSKY_SUBTYPE_D16_CLONED
|
||||
};
|
||||
|
||||
enum ModuleSubtypeDSM2 {
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "opentx_helpers.h"
|
||||
#include "telemetry/telemetry.h"
|
||||
#include "storage/storage.h"
|
||||
#include "globals.h"
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
#include "telemetry/multi.h"
|
||||
@@ -57,7 +58,7 @@ inline uint8_t getMaxMultiSubtype(uint8_t moduleIdx)
|
||||
const mm_protocol_definition *pdef = getMultiProtocolDefinition(g_model.moduleData[moduleIdx].getMultiProtocol());
|
||||
|
||||
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) {
|
||||
return 5;
|
||||
return 7;
|
||||
}
|
||||
|
||||
if (g_model.moduleData[moduleIdx].getMultiProtocol() > MODULE_SUBTYPE_MULTI_LAST) {
|
||||
@@ -383,6 +384,9 @@ inline bool isModuleRxNumAvailable(uint8_t moduleIdx)
|
||||
if (isModuleISRM(moduleIdx))
|
||||
return true;
|
||||
|
||||
if (IS_RX_MULTI(moduleIdx))
|
||||
return false;
|
||||
|
||||
if (isModuleMultimodule(moduleIdx))
|
||||
return true;
|
||||
|
||||
@@ -534,6 +538,14 @@ inline void setDefaultPpmFrameLength(uint8_t moduleIdx)
|
||||
g_model.moduleData[moduleIdx].ppm.frameLength = 4 * max<int>(0, g_model.moduleData[moduleIdx].channelsCount);
|
||||
}
|
||||
|
||||
inline void resetAccessAuthenticationCount()
|
||||
{
|
||||
#if defined(ACCESS_LIB)
|
||||
// the module will reset on mode switch, we need to reset the authentication counter
|
||||
globalData.authenticationCount = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType)
|
||||
{
|
||||
ModuleData & moduleData = g_model.moduleData[moduleIdx];
|
||||
@@ -544,6 +556,8 @@ inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType)
|
||||
moduleData.sbus.refreshRate = -31;
|
||||
else if (moduleData.type == MODULE_TYPE_PPM)
|
||||
setDefaultPpmFrameLength(moduleIdx);
|
||||
else
|
||||
resetAccessAuthenticationCount();
|
||||
}
|
||||
|
||||
extern bool isExternalAntennaEnabled();
|
||||
|
||||
+48
-33
@@ -244,6 +244,50 @@ void sendChannels(uint8_t moduleIdx)
|
||||
}
|
||||
}
|
||||
|
||||
void convertOtxProtocolToMulti(int *protocol, int *subprotocol)
|
||||
{
|
||||
// Special treatment for the FrSky entry...
|
||||
if (*protocol == MODULE_SUBTYPE_MULTI_FRSKY +1) {
|
||||
if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D8) {
|
||||
//D8
|
||||
*protocol = 3;
|
||||
*subprotocol = 0;
|
||||
}
|
||||
else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D8_CLONED) {
|
||||
//D8
|
||||
*protocol = 3;
|
||||
*subprotocol = 1;
|
||||
}
|
||||
else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_V8) {
|
||||
//V8
|
||||
*protocol = 25;
|
||||
*subprotocol = 0;
|
||||
}
|
||||
else {
|
||||
*protocol = 15;
|
||||
if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16_8CH)
|
||||
*subprotocol = 1;
|
||||
else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16)
|
||||
*subprotocol = 0; // D16
|
||||
else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16_LBT)
|
||||
*subprotocol = 2;
|
||||
else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH)
|
||||
*subprotocol = 3;
|
||||
else
|
||||
*subprotocol = 4; // D16_CLONED
|
||||
}
|
||||
}
|
||||
else {
|
||||
// 15 for Multimodule is FrskyX or D16 which we map as a protocol of 3 (FrSky)
|
||||
// all protos > frskyx are therefore also off by one
|
||||
if (*protocol >= 15)
|
||||
*protocol = *protocol + 1;
|
||||
// 25 is again a FrSky *protocol (FrskyV) so shift again
|
||||
if (*protocol >= 25)
|
||||
*protocol = *protocol + 1;
|
||||
}
|
||||
}
|
||||
|
||||
void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe)
|
||||
{// byte 1+2, protocol information
|
||||
|
||||
@@ -268,8 +312,7 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe)
|
||||
protoByte |= MULTI_SEND_RANGECHECK;
|
||||
|
||||
// rfProtocol
|
||||
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) {
|
||||
|
||||
if (type == MODULE_SUBTYPE_MULTI_DSM2 +1 ) {
|
||||
// Autobinding should always be done in DSMX 11ms
|
||||
if (g_model.moduleData[moduleIdx].multi.autoBindMode && moduleState[moduleIdx].mode == MODULE_MODE_BIND)
|
||||
subtype = MM_RF_DSM2_SUBTYPE_AUTO;
|
||||
@@ -279,39 +322,11 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe)
|
||||
optionValue = 0x80 | sentModuleChannels(moduleIdx); // Max throw
|
||||
else
|
||||
optionValue = sentModuleChannels(moduleIdx);
|
||||
}
|
||||
|
||||
// 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky)
|
||||
// all protos > frskyx are therefore also off by one
|
||||
if (type >= 15)
|
||||
type = type + 1;
|
||||
|
||||
// 25 is again a FrSky protocol (FrskyV) so shift again
|
||||
if (type >= 25)
|
||||
type = type + 1;
|
||||
|
||||
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) {
|
||||
if (subtype == MM_RF_FRSKY_SUBTYPE_D8) {
|
||||
//D8
|
||||
type = 3;
|
||||
subtype = 0;
|
||||
} else if (subtype == MM_RF_FRSKY_SUBTYPE_V8) {
|
||||
//V8
|
||||
type = 25;
|
||||
subtype = 0;
|
||||
} else {
|
||||
type = 15;
|
||||
if (subtype == MM_RF_FRSKY_SUBTYPE_D16_8CH) // D16 8ch
|
||||
subtype = 1;
|
||||
else if (subtype == MM_RF_FRSKY_SUBTYPE_D16)
|
||||
subtype = 0; // D16
|
||||
else if (subtype == MM_RF_FRSKY_SUBTYPE_D16_LBT)
|
||||
subtype = 2;
|
||||
else
|
||||
subtype = 3; // MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH
|
||||
}
|
||||
}
|
||||
|
||||
// Special treatment for the FrSky entry...
|
||||
convertOtxProtocolToMulti(&type, &subtype);
|
||||
|
||||
// Set the highest bit of option byte in AFHDS2A protocol to instruct MULTI to passthrough telemetry bytes instead
|
||||
// of sending Frsky D telemetry
|
||||
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "pulses_common.h"
|
||||
|
||||
void multiPatchCustom(uint8_t moduleIdx);
|
||||
void convertOtxProtocolToMulti(int *protocol, int *subprotocol);
|
||||
|
||||
class UartMultiPulses: public DataBuffer<uint8_t, 64>
|
||||
{
|
||||
|
||||
@@ -308,9 +308,7 @@ static void enablePulsesInternalModule(uint8_t protocol)
|
||||
#if defined(PXX2)
|
||||
case PROTOCOL_CHANNELS_PXX2_HIGHSPEED:
|
||||
intmoduleSerialStart(PXX2_HIGHSPEED_BAUDRATE, true, USART_Parity_No, USART_StopBits_1, USART_WordLength_8b);
|
||||
#if defined(HARDWARE_INTERNAL_MODULE) && defined(INTERNAL_MODULE_PXX2) && defined(ACCESS_LIB)
|
||||
globalData.authenticationCount = 0;
|
||||
#endif
|
||||
resetAccessAuthenticationCount();
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -412,7 +412,7 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen
|
||||
|
||||
constexpr uint32_t TEXT_FILE_MAXSIZE = 2048;
|
||||
|
||||
void sdReadTextFile(const char * filename, char lines[NUM_BODY_LINES][LCD_COLS + 1], int & lines_count)
|
||||
void sdReadTextFile(const char * filename, char lines[TEXT_VIEWER_LINES][LCD_COLS + 1], int & lines_count)
|
||||
{
|
||||
FIL file;
|
||||
int result;
|
||||
@@ -423,17 +423,17 @@ void sdReadTextFile(const char * filename, char lines[NUM_BODY_LINES][LCD_COLS +
|
||||
char escape_chars[4] = {0};
|
||||
int current_line = 0;
|
||||
|
||||
memclear(lines, NUM_BODY_LINES * (LCD_COLS + 1));
|
||||
memclear(lines, TEXT_VIEWER_LINES * (LCD_COLS + 1));
|
||||
|
||||
result = f_open(&file, filename, FA_OPEN_EXISTING | FA_READ);
|
||||
if (result == FR_OK) {
|
||||
for (unsigned i = 0; i < TEXT_FILE_MAXSIZE && f_read(&file, &c, 1, &sz) == FR_OK && sz == 1 && (lines_count == 0 || current_line - menuVerticalOffset < NUM_BODY_LINES); i++) {
|
||||
for (unsigned i = 0; i < TEXT_FILE_MAXSIZE && f_read(&file, &c, 1, &sz) == FR_OK && sz == 1 && (lines_count == 0 || current_line - menuVerticalOffset < TEXT_VIEWER_LINES); i++) {
|
||||
if (c == '\n') {
|
||||
++current_line;
|
||||
line_length = 0;
|
||||
escape = 0;
|
||||
}
|
||||
else if (c!='\r' && current_line>=menuVerticalOffset && current_line-menuVerticalOffset<NUM_BODY_LINES && line_length<LCD_COLS) {
|
||||
else if (c!='\r' && current_line>=menuVerticalOffset && current_line-menuVerticalOffset<TEXT_VIEWER_LINES && line_length<LCD_COLS) {
|
||||
if (c == '\\' && escape == 0) {
|
||||
escape = 1;
|
||||
continue;
|
||||
|
||||
@@ -21,12 +21,18 @@
|
||||
#include "opentx.h"
|
||||
|
||||
ModuleFifo intmoduleFifo;
|
||||
#if !defined(INTMODULE_DMA_STREAM)
|
||||
uint8_t * intmoduleTxBufferData;
|
||||
uint8_t intmoduleTxBufferRemaining;
|
||||
#endif
|
||||
|
||||
void intmoduleStop()
|
||||
{
|
||||
GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN);
|
||||
|
||||
#if defined(INTMODULE_DMA_STREAM)
|
||||
INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
|
||||
#endif
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
GPIO_InitStructure.GPIO_Pin = INTMODULE_TX_GPIO_PIN | INTMODULE_RX_GPIO_PIN;
|
||||
@@ -57,7 +63,11 @@ void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable, uint16_t parity,
|
||||
INTERNAL_MODULE_ON();
|
||||
|
||||
NVIC_InitTypeDef NVIC_InitStructure;
|
||||
#if defined(INTMODULE_DMA_STREAM)
|
||||
NVIC_InitStructure.NVIC_IRQChannel = INTMODULE_DMA_STREAM_IRQ;
|
||||
#else
|
||||
NVIC_InitStructure.NVIC_IRQChannel = INTMODULE_USART_IRQn;
|
||||
#endif
|
||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */;
|
||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||
@@ -118,8 +128,22 @@ void intmoduleTimerStart(uint32_t periodMs)
|
||||
#define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE)
|
||||
extern "C" void INTMODULE_USART_IRQHandler(void)
|
||||
{
|
||||
uint32_t status = INTMODULE_USART->SR;
|
||||
#if !defined(INTMODULE_DMA_STREAM)
|
||||
// Send
|
||||
if (USART_GetITStatus(INTMODULE_USART, USART_IT_TXE) != RESET) {
|
||||
if (intmoduleTxBufferRemaining) {
|
||||
USART_SendData(INTMODULE_USART, intmoduleTxBufferData[0]);
|
||||
intmoduleTxBufferData++;
|
||||
intmoduleTxBufferRemaining--;
|
||||
}
|
||||
else {
|
||||
USART_ITConfig(INTMODULE_USART, USART_IT_TXE, DISABLE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Receive
|
||||
uint32_t status = INTMODULE_USART->SR;
|
||||
while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) {
|
||||
uint8_t data = INTMODULE_USART->DR;
|
||||
if (status & USART_FLAG_ERRORS) {
|
||||
@@ -143,6 +167,7 @@ void intmoduleSendBuffer(const uint8_t * data, uint8_t size)
|
||||
if (size == 0)
|
||||
return;
|
||||
|
||||
#if defined(INTMODULE_DMA_STREAM)
|
||||
DMA_InitTypeDef DMA_InitStructure;
|
||||
DMA_DeInit(INTMODULE_DMA_STREAM);
|
||||
DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL;
|
||||
@@ -163,6 +188,11 @@ void intmoduleSendBuffer(const uint8_t * data, uint8_t size)
|
||||
DMA_Init(INTMODULE_DMA_STREAM, &DMA_InitStructure);
|
||||
DMA_Cmd(INTMODULE_DMA_STREAM, ENABLE);
|
||||
USART_DMACmd(INTMODULE_USART, USART_DMAReq_Tx, ENABLE);
|
||||
#else
|
||||
intmoduleTxBufferData = (uint8_t *)data;
|
||||
intmoduleTxBufferRemaining = size;
|
||||
USART_ITConfig(INTMODULE_USART, USART_IT_TXE, ENABLE);
|
||||
#endif
|
||||
}
|
||||
|
||||
void intmoduleSendNextFrame()
|
||||
|
||||
@@ -1078,11 +1078,6 @@
|
||||
#define INTMODULE_GPIO_AF GPIO_AF_USART3
|
||||
#define INTMODULE_USART_IRQn USART3_IRQn
|
||||
#define INTMODULE_USART_IRQHandler USART3_IRQHandler
|
||||
#define INTMODULE_DMA_STREAM DMA1_Stream3
|
||||
#define INTMODULE_DMA_STREAM_IRQ DMA1_Stream3_IRQn
|
||||
#define INTMODULE_DMA_STREAM_IRQHandler DMA1_Stream3_IRQHandler
|
||||
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF3
|
||||
#define INTMODULE_DMA_CHANNEL DMA_Channel_4
|
||||
#define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2
|
||||
#define INTMODULE_RCC_APB2Periph RCC_APB1Periph_USART3
|
||||
#define INTMODULE_TIMER TIM2
|
||||
|
||||
@@ -130,7 +130,7 @@ uint16_t rboxState;
|
||||
void sportProcessTelemetryPacket(uint16_t id, uint8_t subId, uint8_t instance, uint32_t data, TelemetryUnit unit=UNIT_RAW)
|
||||
{
|
||||
const FrSkySportSensor * sensor = getFrSkySportSensor(id, subId);
|
||||
uint8_t precision = 0;
|
||||
uint8_t precision = 255;
|
||||
if (sensor) {
|
||||
if (unit == UNIT_RAW)
|
||||
unit = sensor->unit;
|
||||
|
||||
@@ -555,7 +555,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const
|
||||
return;
|
||||
}
|
||||
|
||||
if (major <= 1 && minor <= 3 && revision <= 0 && patch <= 78 && SLOW_BLINK_ON_PHASE) {
|
||||
if (major <= 1 && minor <= 3 && revision <= 0 && patch < 91 && SLOW_BLINK_ON_PHASE) {
|
||||
strcpy(statusText, STR_MODULE_UPGRADE);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -108,9 +108,10 @@ void frskyDSetDefault(int index, uint16_t id);
|
||||
extern uint8_t telemetryProtocol;
|
||||
|
||||
#if defined (MULTIMODULE)
|
||||
#define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH)) \
|
||||
#define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_CLONED)) \
|
||||
|| (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX2))
|
||||
#define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT)
|
||||
#define IS_RX_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_BAYANG_RX))
|
||||
#if defined(HARDWARE_INTERNAL_MODULE)
|
||||
#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE)||IS_D16_MULTI(EXTERNAL_MODULE))))
|
||||
#else
|
||||
|
||||
@@ -82,6 +82,10 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32
|
||||
{
|
||||
int32_t newVal = val;
|
||||
|
||||
if(prec == 255) {
|
||||
prec = sensor.prec;
|
||||
}
|
||||
|
||||
if (unit == UNIT_CELLS) {
|
||||
uint32_t data = uint32_t(newVal);
|
||||
uint8_t cellsCount = (data >> 24);
|
||||
|
||||
@@ -100,6 +100,10 @@ ISTR(MULTI_PROTOCOLS);
|
||||
ISTR(BLUETOOTH_MODES);
|
||||
#endif
|
||||
|
||||
#if defined(PCBHORUS)
|
||||
ISTR(TEXT_SIZE);
|
||||
#endif
|
||||
|
||||
const char STR_POPUPS_ENTER_EXIT[] = TR_POPUPS_ENTER_EXIT;
|
||||
const char STR_OK[] = TR_OK;
|
||||
const char STR_FREE[] = TR_FREE;
|
||||
@@ -591,10 +595,26 @@ const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE;
|
||||
|
||||
#if defined(PCBHORUS)
|
||||
const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH;
|
||||
const char STR_FIRST_CHANNEL[] = TR_FIRST_CHANNEL;
|
||||
const char STR_FILL_BACKGROUND[] = TR_FILL_BACKGROUND;
|
||||
const char STR_BG_COLOR[] = TR_BG_COLOR;
|
||||
const char STR_SLIDERS_TRIMS[] = TR_SLIDERS_TRIMS;
|
||||
const char STR_SLIDERS[] = TR_SLIDERS;
|
||||
const char STR_FLIGHT_MODE[] = TR_FLIGHT_MODE;
|
||||
const char STR_INVALID_FILE[] = TR_INVALID_FILE;
|
||||
const char STR_TIMER_SOURCE[] = TR_TIMER_SOURCE;
|
||||
const char STR_SIZE[] = TR_SIZE;
|
||||
const char STR_SHADOW[] = TR_SHADOW;
|
||||
const char STR_TEXT[] = TR_TEXT;
|
||||
const char STR_COLOR[] = TR_COLOR;
|
||||
const char STR_MAIN_VIEW_X[] = TR_MAIN_VIEW_X;
|
||||
const char STR_PANEL1_BACKGROUND[] = TR_PANEL1_BACKGROUND;
|
||||
const char STR_PANEL2_BACKGROUND[] = TR_PANEL2_BACKGROUND;
|
||||
#endif
|
||||
|
||||
#if !defined(COLORLCD)
|
||||
const char STR_MENUWHENDONE[] = TR_MENUWHENDONE;
|
||||
const char STR_NO_TELEMETRY_SCREENS[] = TR_NO_TELEMETRY_SCREENS;
|
||||
#endif
|
||||
|
||||
#if defined(PCBSKY9X) && defined(REVX)
|
||||
@@ -679,6 +699,7 @@ const char STR_DISABLE_CH_MAP[] = TR_DISABLE_CH_MAP;
|
||||
const char STR_DISABLE_TELEM[] = TR_DISABLE_TELEM;
|
||||
const char STR_MULTI_DSM_AUTODTECT[] = TR_MULTI_DSM_AUTODTECT;
|
||||
const char STR_MULTI_LOWPOWER[] = TR_MULTI_LOWPOWER;
|
||||
const char STR_MULTI_LNA_DISABLE[] = TR_MULTI_LNA_DISABLE;
|
||||
const char STR_MODULE_NO_SERIAL_MODE[] = TR_MODULE_NO_SERIAL_MODE;
|
||||
const char STR_MODULE_NO_INPUT[] = TR_MODULE_NO_INPUT;
|
||||
const char STR_MODULE_WAITFORBIND[] = TR_MODULE_WAITFORBIND;
|
||||
|
||||
@@ -188,6 +188,7 @@ extern const char STR_EXIT[];
|
||||
|
||||
#if !defined(PCBHORUS)
|
||||
extern const char STR_MENUWHENDONE[];
|
||||
extern const char STR_NO_TELEMETRY_SCREENS[];
|
||||
#endif
|
||||
|
||||
extern const char STR_FREE[];
|
||||
@@ -394,6 +395,7 @@ extern const char STR_DISABLE_CH_MAP[];
|
||||
extern const char STR_DISABLE_TELEM[];
|
||||
extern const char STR_MULTI_DSM_AUTODTECT[];
|
||||
extern const char STR_MULTI_LOWPOWER[];
|
||||
extern const char STR_MULTI_LNA_DISABLE[];
|
||||
extern const char STR_MODULE_NO_SERIAL_MODE[];
|
||||
extern const char STR_MODULE_NO_INPUT[];
|
||||
extern const char STR_MODULE_WAITFORBIND[];
|
||||
@@ -596,6 +598,22 @@ extern const char STR_PLAY_FILE[];
|
||||
extern const char STR_ASSIGN_BITMAP[];
|
||||
#if defined(PCBHORUS)
|
||||
extern const char STR_ASSIGN_SPLASH[];
|
||||
extern const char STR_FIRST_CHANNEL[];
|
||||
extern const char STR_FILL_BACKGROUND[];
|
||||
extern const char STR_BG_COLOR[];
|
||||
extern const char STR_SLIDERS_TRIMS[];
|
||||
extern const char STR_SLIDERS[];
|
||||
extern const char STR_FLIGHT_MODE[];
|
||||
extern const char STR_INVALID_FILE[];
|
||||
extern const char STR_TIMER_SOURCE[];
|
||||
extern const char STR_TEXT_SIZE[];
|
||||
extern const char STR_SIZE[];
|
||||
extern const char STR_SHADOW[];
|
||||
extern const char STR_TEXT[];
|
||||
extern const char STR_COLOR[];
|
||||
extern const char STR_MAIN_VIEW_X[];
|
||||
extern const char STR_PANEL1_BACKGROUND[];
|
||||
extern const char STR_PANEL2_BACKGROUND[];
|
||||
#endif
|
||||
extern const char STR_EXECUTE_FILE[];
|
||||
extern const char STR_DELETE_FILE[];
|
||||
|
||||
@@ -375,6 +375,9 @@
|
||||
#define LEN_GYROS "\004"
|
||||
#define TR_GYROS "GyrX""GyrY"
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
// ZERO TERMINATED STRINGS
|
||||
#if defined(COLORLCD)
|
||||
#define INDENT "\007"
|
||||
@@ -636,6 +639,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetekce", INDENT "Formát autodetekce")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Nízký výkon", INDENT "Režim nízkého výkonu")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
|
||||
#define TR_MODULE_TELEM_ON TR("Zap", "Zapnuto")
|
||||
#define TR_DISABLE_INTERNAL TR("Vypnout int.", "Vypnout interní RF")
|
||||
@@ -989,6 +993,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Název"
|
||||
@@ -1032,6 +1037,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Typ porovnávací funkce", "První proměnná", "Druhá proměnná nebo konstanta", "Druhá proměnná nebo konstanta", "Další stav povolující tenko spínač", "Minimální doba trvání sepnutého stavu", "Minimální doba platné podmínky pro aktivaci" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// Taranis About screen
|
||||
#define TR_ABOUTUS TR(" O nás ", "O nás")
|
||||
|
||||
|
||||
@@ -378,6 +378,9 @@
|
||||
#define LEN_GYROS "\004"
|
||||
#define TR_GYROS "GyrX""GyrY"
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
// ZERO TERMINATED STRINGS
|
||||
#if defined(COLORLCD)
|
||||
#define INDENT " "
|
||||
@@ -638,6 +641,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
|
||||
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
|
||||
@@ -995,6 +999,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis specific column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Name "
|
||||
@@ -1007,6 +1012,24 @@
|
||||
#define TR_PHASES_HEADERS_CH6_TRIM "Trim 6"
|
||||
#define TR_PHASES_HEADERS_FAD_IN "Langs Ein"
|
||||
#define TR_PHASES_HEADERS_FAD_OUT "Langs Aus"
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// Taranis Info Zeile Anzeigen
|
||||
#define TR_LIMITS_HEADERS_NAME "Name"
|
||||
#define TR_LIMITS_HEADERS_SUBTRIM "Subtrim"
|
||||
|
||||
@@ -378,6 +378,9 @@
|
||||
#define LEN_GYROS "\004"
|
||||
#define TR_GYROS "GyrX""GyrY"
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
// ZERO TERMINATED STRINGS
|
||||
#if defined(COLORLCD)
|
||||
#define INDENT " "
|
||||
@@ -637,6 +640,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
|
||||
#define TR_DISABLE_INTERNAL TR("Disable int.", "Disable internal RF")
|
||||
@@ -994,6 +998,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Name"
|
||||
@@ -1037,6 +1042,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// About screen
|
||||
#define TR_ABOUTUS TR(" ABOUT ", "ABOUT")
|
||||
|
||||
|
||||
+172
-169
@@ -19,7 +19,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
// ES translations author: Jose Moreno <josemoreno259@gmail.com>
|
||||
// ES translations authors: Jose Moreno <josemoreno259@gmail.com>, Daniel GeA <daniel.gea.1000@gmail.com>
|
||||
|
||||
/*
|
||||
* !!!!! DO NOT EDIT es.h - EDIT es.h.txt INSTEAD !!!!!!!
|
||||
@@ -49,11 +49,11 @@
|
||||
#define LEN_MMMINV "\003"
|
||||
#define TR_MMMINV "---""INV"
|
||||
|
||||
#define LEN_VBEEPMODE "\005"
|
||||
#define TR_VBEEPMODE "Mudo ""Alarm""NoKey""Todo "
|
||||
#define LEN_VBEEPMODE "\010"
|
||||
#define TR_VBEEPMODE "Silencio""Alarma\0 ""No tecla""Todo\0 "
|
||||
|
||||
#define LEN_VBLMODE "\005"
|
||||
#define TR_VBLMODE "OFF\0 ""Keys\0""Stks\0""Ambos""ON\0"
|
||||
#define LEN_VBLMODE "\006"
|
||||
#define TR_VBLMODE "OFF\0 ""Teclas""Sticks""Ambos\0""ON\0 "
|
||||
|
||||
#define LEN_TRNMODE "\003"
|
||||
#define TR_TRNMODE "OFF""+=\0"":="
|
||||
@@ -68,8 +68,8 @@
|
||||
#define TR_AUX_SERIAL_MODES "OFF\0 ""Telem Mirror\0""Telemetria\0 ""Entrenador SBUS""LUA\0 "
|
||||
#endif
|
||||
|
||||
#define LEN_SWTYPES "\006"
|
||||
#define TR_SWTYPES "Nada\0 ""Palanc""2POS\0 ""3POS\0"
|
||||
#define LEN_SWTYPES "\007"
|
||||
#define TR_SWTYPES "Nada\0 ""Palanca""2POS\0 ""3POS\0 "
|
||||
|
||||
#define LEN_POTTYPES TR("\013", "\017")
|
||||
#define TR_POTTYPES TR("Nada\0 ""Pot con fij""Multipos\0 ""Pot\0 ", "Nada\0 ""Pot con fijador""Switch multipos""Pot\0 ")
|
||||
@@ -86,11 +86,11 @@
|
||||
#define LEN_COUNTRYCODES TR("\002", "\007")
|
||||
#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japon\0 ""Europa\0")
|
||||
|
||||
#define LEN_USBMODES TR("\006", "\010")
|
||||
#define TR_USBMODES TR("Pregun""Joyst\0""SDCard""Serie\0", "Pregunta""Joystick""SDCard\0 ""Serie\0 ")
|
||||
#define LEN_USBMODES "\010"
|
||||
#define TR_USBMODES "Pregunta""Joystick""SDCard\0 ""Serie\0 "
|
||||
|
||||
#define LEN_JACKMODES "\007"
|
||||
#define TR_JACKMODES "Pregunt""Audio\0 ""Entrena"
|
||||
#define LEN_JACKMODES "\010"
|
||||
#define TR_JACKMODES "Pregunta""Audio\0 ""Entrena."
|
||||
|
||||
#define LEN_TELEMETRY_PROTOCOLS "\017"
|
||||
#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetr."
|
||||
@@ -98,13 +98,13 @@
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_VTRIMINC TR("\006", "\013")
|
||||
#define TR_VTRIMINC TR("Expo ""ExFino""Fino ""Medio ""Grueso", "Exponencial""Extra Fino ""Fino ""Medio ""Grueso ")
|
||||
#define TR_VTRIMINC TR("Expo\0 ""ExFino""Fino\0 ""Medio\0""Grueso", "Exponencial""Extra fino\0""Fino\0 ""Medio\0 ""Grueso\0 ")
|
||||
|
||||
#define LEN_VDISPLAYTRIMS "\006"
|
||||
#define TR_VDISPLAYTRIMS "No\0 ""Cambiar""Si\0 "
|
||||
#define LEN_VDISPLAYTRIMS "\007"
|
||||
#define TR_VDISPLAYTRIMS "No\0 ""Cambiar""Si\0 "
|
||||
|
||||
#define LEN_VBEEPCOUNTDOWN "\006"
|
||||
#define TR_VBEEPCOUNTDOWN "SilencBeeps\0Voz\0 Haptic"
|
||||
#define LEN_VBEEPCOUNTDOWN "\010"
|
||||
#define TR_VBEEPCOUNTDOWN "Silencio""Beeps\0 ""Voz\0 ""Haptic\0 "
|
||||
|
||||
#define LEN_VVARIOCENTER "\010"
|
||||
#define TR_VVARIOCENTER "Tono\0 ""Silencio"
|
||||
@@ -143,21 +143,21 @@
|
||||
#define LEN_VMIXTRIMS "\003"
|
||||
|
||||
#if defined(PCBHORUS)
|
||||
#define TR_VMIXTRIMS "OFF""ON\0""Dir""Ele""Ace""Ale""T5\0""T6\0"
|
||||
#define TR_VMIXTRIMS "OFF""ON\0""Rud""Ele""Thr""Ail""T5\0""T6\0"
|
||||
#else
|
||||
#define TR_VMIXTRIMS "OFF""ON\0""Dir""Ele""Ace""Ale"
|
||||
#define TR_VMIXTRIMS "OFF""ON\0""Rud""Ele""Thr""Ail"
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#if LCD_W >= 212
|
||||
#define TR_CSWTIMER "Timer"
|
||||
#define TR_CSWSTICKY "Stcky"
|
||||
#define TR_CSWRANGE "Range"
|
||||
#define TR_CSWSTAY "Edge\0"
|
||||
#define TR_CSWSTICKY "Pega\0"
|
||||
#define TR_CSWRANGE "Rango"
|
||||
#define TR_CSWSTAY "Borde"
|
||||
#else
|
||||
#define TR_CSWTIMER "Tim\0 "
|
||||
#define TR_CSWSTICKY "Glue\0"
|
||||
#define TR_CSWRANGE "Rnge\0"
|
||||
#define TR_CSWSTAY "Edge\0"
|
||||
#define TR_CSWSTICKY "Pega\0"
|
||||
#define TR_CSWRANGE "Rngo\0"
|
||||
#define TR_CSWSTAY "Bord\0"
|
||||
#endif
|
||||
|
||||
#define TR_CSWEQUAL "a=x\0 "
|
||||
@@ -174,7 +174,7 @@
|
||||
#endif
|
||||
|
||||
#if defined(AUDIO)
|
||||
#define TR_SOUND "Oir Sonido"
|
||||
#define TR_SOUND "Oir sonido"
|
||||
#else
|
||||
#define TR_SOUND "Beep\0 "
|
||||
#endif
|
||||
@@ -234,57 +234,39 @@
|
||||
#define TR_SF_SCREENSHOT "Captura"
|
||||
#define TR_SF_RESERVE "[reserv.]\0"
|
||||
|
||||
#define TR_VFSWFUNC TR_SF_SAFETY "Entrena.\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volumen\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz fondo\0" TR_SF_SCREENSHOT TR_SF_TEST
|
||||
|
||||
#define LEN_VFSWRESET TR("\004", "\011")
|
||||
#define TR_VFSWFUNC TR_SF_SAFETY "Entrenador""Inst. Trim""Reset\0 ""Ajuste \0 " TR_ADJUST_GVAR "Volumen\0 " "Failsafe\0 " "CheckRango" "Enl.Modulo" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz Fondo\0" TR_SF_SCREENSHOT TR_SF_TEST
|
||||
|
||||
#define LEN_VFSWRESET TR("\004", "\012")
|
||||
#define TR_FSW_RESET_TELEM TR("Telm", "Telemetria")
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#if LCD_W >= 212
|
||||
#define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 "
|
||||
#else
|
||||
#define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3"
|
||||
#endif
|
||||
|
||||
#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "All\0" TR_FSW_RESET_TELEM, TR_FSW_RESET_TIMERS "All\0 " TR_FSW_RESET_TELEM)
|
||||
#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "Todo" TR_FSW_RESET_TELEM, TR_FSW_RESET_TIMERS "Todo\0 " TR_FSW_RESET_TELEM)
|
||||
|
||||
#define LEN_FUNCSOUNDS TR("\004", "\006")
|
||||
#define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Avs1""Avs2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Aviso1""Aviso2""Cheep ""Ratata""Tick ""Sirena""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk")
|
||||
|
||||
#define LEN_VTELEMCHNS "\004"
|
||||
|
||||
#define TR_TELEM_RESERVE TR("[--]", "[---]")
|
||||
#define TR_TELEM_TIME TR("Time", "Time\0")
|
||||
#define TR_RAS TR("SWR\0", "SWR\0 ")
|
||||
#define TR_RX_BATT TR("[NA]", "[NA]\0")
|
||||
#define TR_A3_A4 TR("A3\0 ""A4\0 ", "A3\0 ""A4\0 ")
|
||||
#define TR_A3_A4_MIN TR("A3-\0""A4-\0", "A3-\0 ""A4-\0 ")
|
||||
|
||||
#define TR_ASPD_MAX TR("ASp+", "ASpd+")
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define TR_TELEM_RSSI_RX "RSSI\0"
|
||||
#else
|
||||
#define TR_TELEM_RSSI_RX TR("Rx\0 ", "Rx\0 ")
|
||||
#endif
|
||||
|
||||
#define TR_TELEM_TIMERS TR("Tmr1""Tmr2""Tmr3", "Tmr1\0""Tmr2\0""Tmr3\0")
|
||||
|
||||
#define LENGTH_UNIT_IMP "ft\0"
|
||||
#define SPEED_UNIT_IMP "mph"
|
||||
#define LENGTH_UNIT_METR "m\0 "
|
||||
#define SPEED_UNIT_METR "kmh"
|
||||
|
||||
#define LEN_VUNITSSYSTEM "\007"
|
||||
#define TR_VUNITSSYSTEM "Metrico""Imperial"
|
||||
#define LEN_VTELEMUNIT "\003"
|
||||
#define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""rad""ml\0""fOz"
|
||||
#define LEN_VUNITSSYSTEM "\010"
|
||||
#define TR_VUNITSSYSTEM "Metrico\0""Imperial"
|
||||
#define LEN_VTELEMUNIT "\003"
|
||||
#define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""rad""ml\0""fOz"
|
||||
|
||||
#define STR_V (STR_VTELEMUNIT+1)
|
||||
#define STR_A (STR_VTELEMUNIT+4)
|
||||
|
||||
#define LEN_VTELEMSCREENTYPE "\004"
|
||||
#define TR_VTELEMSCREENTYPE "Nums""Bars"
|
||||
#define LEN_VTELEMSCREENTYPE "\007"
|
||||
#define TR_VTELEMSCREENTYPE "Nada\0 ""Numeros""Barras\0""Script\0"
|
||||
|
||||
#define LEN_GPSFORMAT "\004"
|
||||
#define TR_GPSFORMAT "HMS NMEA"
|
||||
@@ -323,12 +305,12 @@
|
||||
#define LEN_VSWITCHES "\003"
|
||||
#define LEN_VSRCRAW "\004"
|
||||
|
||||
#define TR_STICKS_VSRCRAW "\307Dir""\307Ele""\307Thr""\307Ale"
|
||||
#define TR_STICKS_VSRCRAW "\307Rud""\307Ele""\307Thr""\307Ail"
|
||||
|
||||
#if defined(PCBHORUS)
|
||||
#define TR_TRIMS_VSRCRAW "\313Dir""\313Ele""\313Thr""\313Ale""\313T5\0""\313T6\0"
|
||||
#define TR_TRIMS_VSRCRAW "\313Rud""\313Ele""\313Thr""\313Ail""\313T5\0""\313T6\0"
|
||||
#else
|
||||
#define TR_TRIMS_VSRCRAW TR("TrmD" "TrmE" "TrmT" "TrmA", "\313Dir""\313Ele""\313Thr""\313Ale")
|
||||
#define TR_TRIMS_VSRCRAW TR("TrmR" "TrmE" "TrmT" "TrmA", "\313Rud""\313Ele""\313Thr""\313Ail")
|
||||
#endif
|
||||
|
||||
#if defined(PCBHORUS)
|
||||
@@ -375,14 +357,14 @@
|
||||
#define TR_VTRAINER_MULTI "Master/Multi"
|
||||
|
||||
#define LEN_VFAILSAFE "\011"
|
||||
#define TR_VFAILSAFE "No\0 ""Guardar\0 ""Adaptar\0 ""Sin pulso""Receptor\0"
|
||||
#define TR_VFAILSAFE "No\0 ""Hold\0 ""Custom\0 ""No pulsos""Receptor\0"
|
||||
|
||||
|
||||
#define LEN_VSENSORTYPES "\012"
|
||||
#define TR_VSENSORTYPES "Custom\0 ""Calculado"
|
||||
|
||||
#define LEN_VFORMULAS "\010"
|
||||
#define TR_VFORMULAS "Suma\0 ""Media\0 ""Min\0 ""Max\0 ""Multipl.""Total\0 ""Cell\0 ""Consumo\0""Distanc."
|
||||
#define LEN_VFORMULAS "\011"
|
||||
#define TR_VFORMULAS "Suma\0 ""Media\0 ""Min\0 ""Max\0 ""Multipl. ""Total\0 ""Cell\0 ""Consumo\0 ""Distancia"
|
||||
|
||||
#define LEN_VPREC "\004"
|
||||
#define TR_VPREC "0.--""0.0 ""0.00"
|
||||
@@ -393,6 +375,9 @@
|
||||
#define LEN_GYROS "\004"
|
||||
#define TR_GYROS "GyrX""GyrY"
|
||||
|
||||
#define LEN_TEXT_SIZE "\013"
|
||||
#define TR_TEXT_SIZE "Normal\0 ""Muy pequeño""Pequeño\0 ""Medio\0 ""Doble\0 "
|
||||
|
||||
// ZERO TERMINATED STRINGS
|
||||
#if defined(COLORLCD)
|
||||
#define INDENT " "
|
||||
@@ -431,24 +416,24 @@
|
||||
#define TR_FREE "libre"
|
||||
#define TR_DELETEMODEL "BORRAR MODELO"
|
||||
#define TR_COPYINGMODEL "Copiando modelo.."
|
||||
#define TR_MOVINGMODEL "Mover modelo..."
|
||||
#define TR_LOADINGMODEL "Cargar modelo..."
|
||||
#define TR_MOVINGMODEL "Moviendo modelo..."
|
||||
#define TR_LOADINGMODEL "Cargando modelo..."
|
||||
#define TR_NAME "Nombre"
|
||||
#define TR_MODELNAME "Nom.Modelo"
|
||||
#define TR_PHASENAME "Nom.Fase "
|
||||
#define TR_MIXNAME "Nom.Mezcla"
|
||||
#define TR_INPUTNAME TR("N.entr","Nombre entrada")
|
||||
#define TR_EXPONAME TR("N.expo","Nombre expo")
|
||||
#define TR_BITMAP "Imagen Modelo"
|
||||
#define TR_TIMER TR("Reloj","Reloj ")
|
||||
#define TR_ELIMITS TR("E.Limite","Ampliar Limites")
|
||||
#define TR_ETRIMS TR("E.Trims","Ampliar Trims")
|
||||
#define TR_TRIMINC "Paso Trim"
|
||||
#define TR_DISPLAY_TRIMS "Ver Trims"
|
||||
#define TR_TTRACE TR("Fuente-A", INDENT "Fuente Acelerad")
|
||||
#define TR_TTRIM TR("Trim-A", INDENT "Trim Acelerad")
|
||||
#define TR_BEEPCTR TR("Beep ctr","Beep centro")
|
||||
#define TR_USE_GLOBAL_FUNCS "Funcs glob."
|
||||
#define TR_MODELNAME TR("Nom. modelo", "Nombre modelo")
|
||||
#define TR_PHASENAME "Nombre fase "
|
||||
#define TR_MIXNAME TR("Nom. mezcla", "Nombre mezcla")
|
||||
#define TR_INPUTNAME TR("Entrada", "Nom. entrada")
|
||||
#define TR_EXPONAME TR("Nom.", "Nombre expo")
|
||||
#define TR_BITMAP "Imagen modelo"
|
||||
#define TR_TIMER TR("Timer", "Timer ")
|
||||
#define TR_ELIMITS TR("E.Limite", "Ampliar limites")
|
||||
#define TR_ETRIMS TR("E.Trims", "Ampliar trims")
|
||||
#define TR_TRIMINC "Paso trim"
|
||||
#define TR_DISPLAY_TRIMS "Ver trims"
|
||||
#define TR_TTRACE TR("Fuente-A", INDENT "Fuente acelerador")
|
||||
#define TR_TTRIM TR("Trim-A", INDENT "Trim acelerador")
|
||||
#define TR_BEEPCTR TR("Beep ctr", "Beep centro")
|
||||
#define TR_USE_GLOBAL_FUNCS TR("Funcs. glob.", "Usar func. globales")
|
||||
#if defined(PCBSKY9X) && defined(REVX)
|
||||
#define TR_OUTPUT_TYPE INDENT "Output"
|
||||
#endif
|
||||
@@ -458,7 +443,7 @@
|
||||
#define STR_WARN_BATTVOLTAGE TR(INDENT "Salida es VBAT: ", INDENT "Aviso: señal salida es VBAT: ")
|
||||
#define TR_MS "ms"
|
||||
#define TR_FREQUENCY INDENT "Frequencia"
|
||||
#define TR_SWITCH "Interr"
|
||||
#define TR_SWITCH TR("Interr.", "Interruptor")
|
||||
#define TR_TRIMS "Trims"
|
||||
#define TR_FADEIN "Inicio"
|
||||
#define TR_FADEOUT "Final"
|
||||
@@ -466,28 +451,28 @@
|
||||
#define TR_CHECKTRIMS CENTER "\006Check\012Trims"
|
||||
#define OFS_CHECKTRIMS CENTER_OFS+(9*FW)
|
||||
#define TR_SWASHTYPE "Tipo ciclico"
|
||||
#define TR_COLLECTIVE TR("Colectivo", "Fuente Colectivo")
|
||||
#define TR_COLLECTIVE TR("Colectivo", "Fuente colectivo")
|
||||
#define TR_AILERON TR("Col. lateral", "Fuente col. lateral")
|
||||
#define TR_ELEVATOR TR("Col. long. ", "Fuente col. longitudinal")
|
||||
#define TR_SWASHRING "Ciclico"
|
||||
#define TR_ELEDIRECTION TR("ELE Direccion","Largo cyc. direccion")
|
||||
#define TR_AILDIRECTION TR("AIL Direccion","Lateral cyc. direccion")
|
||||
#define TR_COLDIRECTION TR("PIT Direccion","Coll. pitch direccion")
|
||||
#define TR_ELEDIRECTION TR("ELE Direccion", "Largo cyc. direccion")
|
||||
#define TR_AILDIRECTION TR("AIL Direccion", "Lateral cyc. direccion")
|
||||
#define TR_COLDIRECTION TR("PIT Direccion", "Coll. pitch direccion")
|
||||
#define TR_MODE "Modo"
|
||||
#define TR_SUBTYPE INDENT "Subtipo"
|
||||
#define TR_NOFREEEXPO "No expo libre!"
|
||||
#define TR_NOFREEMIXER "No mezcla lib!"
|
||||
#define TR_SOURCE "Fuente"
|
||||
#define TR_WEIGHT "Cantidad"
|
||||
#define TR_EXPO TR("Expo","Exponencial")
|
||||
#define TR_SIDE "Lado"
|
||||
#define TR_EXPO TR("Expo", "Exponencial")
|
||||
#define TR_SIDE "Zona"
|
||||
#define TR_DIFFERENTIAL "Diferenc"
|
||||
#define TR_OFFSET "Offset"
|
||||
#define TR_TRIM "Trim"
|
||||
#define TR_DREX "DRex"
|
||||
#define DREX_CHBOX_OFFSET 30
|
||||
#define TR_CURVE "Curva"
|
||||
#define TR_FLMODE TR("Modo","Modos")
|
||||
#define TR_FLMODE TR("Modo", "Modos")
|
||||
#define TR_MIXWARNING "Aviso"
|
||||
#define TR_OFF "OFF"
|
||||
#define TR_ANTENNA "Antena"
|
||||
@@ -497,7 +482,7 @@
|
||||
#define TR_DELAYUP "Atraso subir"
|
||||
#define TR_SLOWDOWN "Bajar lento "
|
||||
#define TR_SLOWUP "Subir lento"
|
||||
#define TR_MIXES "MEZCLAS"
|
||||
#define TR_MIXES "MIXES"
|
||||
#define TR_CV "CV"
|
||||
#define TR_GV TR("G", "GV")
|
||||
#define TR_ACHANNEL "A\004canal"
|
||||
@@ -512,48 +497,48 @@
|
||||
#define TR_LENGTH INDENT"Longitud"
|
||||
#define TR_BEEP_LENGTH INDENT "Duracion Beep"
|
||||
#define TR_SPKRPITCH INDENT"Tono"
|
||||
#define TR_HAPTIC_LABEL "Tactil"
|
||||
#define TR_HAPTIC_LABEL "Haptic"
|
||||
#define TR_HAPTICSTRENGTH INDENT"Intensidad"
|
||||
#define TR_GYRO_LABEL "Gyro"
|
||||
#define TR_GYRO_OFFSET "Offset"
|
||||
#define TR_GYRO_MAX "Max"
|
||||
#define TR_CONTRAST "Contraste"
|
||||
#define TR_ALARMS_LABEL "Alarmas"
|
||||
#define TR_BATTERY_RANGE TR("Rango bateria","Rango medidor Bater")
|
||||
#define TR_BATTERYWARNING INDENT"Bateria Baja"
|
||||
#define TR_BATTERY_RANGE TR("Rango bateria", "Rango medidor bateria")
|
||||
#define TR_BATTERYWARNING INDENT"Bateria baja"
|
||||
#define TR_INACTIVITYALARM INDENT"Inactividad"
|
||||
#define TR_MEMORYWARNING INDENT"Memoria Baja"
|
||||
#define TR_ALARMWARNING INDENT"Sin Sonido"
|
||||
#define TR_MEMORYWARNING INDENT"Memoria baja"
|
||||
#define TR_ALARMWARNING INDENT"Sin sonido"
|
||||
#define TR_RSSISHUTDOWNALARM TR(INDENT "Apagado Rssi", INDENT "Check Rssi al apagar")
|
||||
#define TR_MODEL_STILL_POWERED "Modelo aun encendido"
|
||||
#define TR_MODEL_SHUTDOWN "Apagar ?"
|
||||
#define TR_PRESS_ENTER_TO_CONFIRM "Enter para confirmar"
|
||||
#define TR_THROTTLE_LABEL "Potencia"
|
||||
#define TR_THROTTLEREVERSE TR("Invert_Acel", INDENT "Invertir Acel.")
|
||||
#define TR_MINUTEBEEP TR("Minuto", "Cada Minuto")
|
||||
#define TR_BEEPCOUNTDOWN INDENT"Cta. atras"
|
||||
#define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente")
|
||||
#define TR_BACKLIGHT_LABEL "Luz Fondo"
|
||||
#define TR_THROTTLEREVERSE TR("Invert acel", INDENT "Invertir acel.")
|
||||
#define TR_MINUTEBEEP TR("Minuto", "Cada minuto")
|
||||
#define TR_BEEPCOUNTDOWN TR(INDENT"Cta. atras", INDENT"Cuenta atras")
|
||||
#define TR_PERSISTENT TR(INDENT"Persisten.", INDENT"Persistente")
|
||||
#define TR_BACKLIGHT_LABEL "Luz fondo"
|
||||
#define TR_BLDELAY INDENT"Duracion"
|
||||
#define TR_BLONBRIGHTNESS INDENT"MAS Brillo"
|
||||
#define TR_BLOFFBRIGHTNESS INDENT"MENOS Brillo"
|
||||
#define TR_BLONBRIGHTNESS INDENT"MAS brillo"
|
||||
#define TR_BLOFFBRIGHTNESS INDENT"MENOS brillo"
|
||||
#define TR_BLCOLOR INDENT "Color"
|
||||
#define TR_SPLASHSCREEN "Pant. inicio"
|
||||
#define TR_PWR_ON_DELAY "Atraso On"
|
||||
#define TR_PWR_OFF_DELAY "Atraso Off"
|
||||
#define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso Acelerador")
|
||||
#define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso Intrptor")
|
||||
#define TR_SPLASHSCREEN "Pantalla inicio"
|
||||
#define TR_PWR_ON_DELAY TR("Atraso On", "Atraso encendido")
|
||||
#define TR_PWR_OFF_DELAY TR("Atraso Off", "Atraso apagado")
|
||||
#define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso acelerador")
|
||||
#define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso interruptor")
|
||||
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")
|
||||
#define TR_SLIDERWARNING TR(INDENT "Pos. slid.", INDENT "Posiciones slider")
|
||||
#define TR_POTWARNING TR("Aviso pot", INDENT "Aviso pot")
|
||||
#define TR_TIMEZONE TR("Zona Hora", "GPS Zona Hora")
|
||||
#define TR_TIMEZONE TR("Zona horaria", INDENT "Zona horaria")
|
||||
#define TR_ADJUST_RTC TR("Ajustar RTC", INDENT "Ajustar RTC")
|
||||
#define TR_GPS "GPS"
|
||||
#define TR_RXCHANNELORD TR("Rx Orden canal", "Orden habitual canales")
|
||||
#define TR_STICKS "Sticks"
|
||||
#define TR_POTS "Pots"
|
||||
#define TR_SWITCHES "Switches"
|
||||
#define TR_SWITCHES_DELAY "Atraso switch."
|
||||
#define TR_SWITCHES_DELAY TR("Atraso switch.", "Atraso switches")
|
||||
#define TR_SLAVE "Esclavo"
|
||||
#define TR_MODESRC "Modo\006% Fuente"
|
||||
#define TR_MULTIPLIER "Multiplicar"
|
||||
@@ -588,7 +573,7 @@
|
||||
#define TR_PRESSANYKEYTOSKIP "Pulsar tecla para omitir"
|
||||
#define TR_THROTTLENOTIDLE "Aceler. Activado"
|
||||
#define TR_ALARMSDISABLED "Alarmas Desact."
|
||||
#define TR_PRESSANYKEY TR("\010Pulsa una Tecla", "Pulsa una Tecla")
|
||||
#define TR_PRESSANYKEY TR("\010Pulsa una tecla", "Pulsa una tecla")
|
||||
#define TR_BADEEPROMDATA "Error datos EEprom"
|
||||
#define TR_BAD_RADIO_DATA "Error datos radio"
|
||||
#define TR_EEPROMFORMATTING "Formateo EEPROM"
|
||||
@@ -599,8 +584,8 @@
|
||||
#define TR_MENUTRAINER "ENTRENADOR"
|
||||
#define TR_MENUSPECIALFUNCS "FUNCIONES GLOBALES"
|
||||
#define TR_MENUVERSION "VERSION"
|
||||
#define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERUP.")
|
||||
#define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTRADAS ANALOG")
|
||||
#define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERRUPTORES")
|
||||
#define TR_MENU_RADIO_ANALOGS TR("ANALOGICOS", "TEST ANALOGICOS")
|
||||
#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST"
|
||||
#define TR_MENUCALIBRATION "CALIBRACION"
|
||||
#if defined(COLORLCD)
|
||||
@@ -611,7 +596,7 @@
|
||||
#define TR_CHANNELS2FAILSAFE "Canales=>Failsafe"
|
||||
#define TR_CHANNEL2FAILSAFE "Canal=>Failsafe"
|
||||
#define TR_MENUMODELSEL TR("MODELOS", "SELECCION MODELO")
|
||||
#define TR_MENUSETUP "CONFIG. MODELO"
|
||||
#define TR_MENUSETUP TR("CONFIG. MODELO", "CONFIGURACION MODELO")
|
||||
#define TR_MENUFLIGHTMODE "MODO DE VUELO"
|
||||
#define TR_MENUFLIGHTMODES "MODOS DE VUELO"
|
||||
#define TR_MENUHELISETUP "CONFIGURACION HELI"
|
||||
@@ -629,13 +614,13 @@
|
||||
|
||||
#define TR_MENUCURVES "CURVAS"
|
||||
#define TR_MENUCURVE "CURVA"
|
||||
#define TR_MENULOGICALSWITCH "INTERRUP. LOGICO"
|
||||
#define TR_MENULOGICALSWITCHES "INTERRUP. LOGICOS"
|
||||
#define TR_MENUCUSTOMFUNC "FUNCIONES"
|
||||
#define TR_MENULOGICALSWITCH "INTERRUP.LOGICO"
|
||||
#define TR_MENULOGICALSWITCHES TR3("INTERRUP. LOGICOS", "INTERRUP. LOGICOS", "INTERRUPTORES LOGICOS")
|
||||
#define TR_MENUCUSTOMFUNC TR("FUNCIONES", "FUNCIONES ESPECIALES")
|
||||
#define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS"
|
||||
#define TR_MENUTELEMETRY "TELEMETRIA"
|
||||
#define TR_MENUTEMPLATES "PLANTILLAS"
|
||||
#define TR_MENUSTAT "ESTADISTICAS"
|
||||
#define TR_MENUSTAT TR("ESTAD.", "ESTADISTICAS")
|
||||
#define TR_MENUDEBUG "DEBUG"
|
||||
#define TR_MONITOR_CHANNELS1 "MONITOR CANALES 1/8"
|
||||
#define TR_MONITOR_CHANNELS2 "MONITOR CANALES 9/16"
|
||||
@@ -643,23 +628,24 @@
|
||||
#define TR_MONITOR_CHANNELS3 "MONITOR CANALES 17/24"
|
||||
#define TR_MONITOR_CHANNELS4 "MONITOR CANALES 25/32"
|
||||
#define TR_MONITOR_OUTPUT_DESC "SALIDAS"
|
||||
#define TR_MONITOR_MIXER_DESC "MEZCLAS"
|
||||
#define TR_RECEIVER_NUM TR("RxNum", "Receptor No.")
|
||||
#define TR_MONITOR_MIXER_DESC "Mixers"
|
||||
#define TR_RECEIVER_NUM TR("Num Rx", "Receptor No.")
|
||||
#define TR_RECEIVER "Receptor"
|
||||
#define TR_MULTI_RFTUNE TR("Sint.freq.", "RF Freq. sint.fina")
|
||||
#define TR_MULTI_TELEMETRY "Telemetria"
|
||||
#define TR_MULTI_VIDFREQ TR("Freq. Vid.", "Frecuancia Video")
|
||||
#define TR_MULTI_VIDFREQ TR("Freq. Vid.", "Frecuencia Video")
|
||||
#define TR_RFPOWER "RF Power"
|
||||
#define TR_MULTI_FIXEDID TR("ID Fijo", "ID Fijo")
|
||||
#define TR_MULTI_OPTION TR("Opcion", "Valor opcion")
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Emp Cnl",INDENT "Emparejar en canal")
|
||||
#define TR_DISABLE_CH_MAP TR("No ch map", "Desactivar mapa cnl")
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Desactivar Telemetria")
|
||||
#define TR_DISABLE_TELEM TR("No telem", "Desactivar telem.")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetectar formato")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Baja potencia", INDENT "Modo de baja potencia")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Baja poten.", INDENT "Modo de baja poten.")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Activado")
|
||||
#define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desactivar modulo interno RF")
|
||||
#define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desact. mod. int. RF")
|
||||
#define TR_MODULE_NO_SERIAL_MODE TR("No modo serie", "No en modo serie")
|
||||
#define TR_MODULE_NO_INPUT TR("Sin señal", "Sin señal")
|
||||
#define TR_MODULE_NO_TELEMETRY TR3( "No telemetria", "No MULTI_TELEMETRY", "No telemetria (activa MULTI_TELEMETRY)")
|
||||
@@ -675,7 +661,7 @@
|
||||
#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON"
|
||||
#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF"
|
||||
#define TR_PROTOCOL_INVALID TR("Prot. invalido", "Protocolo invalido")
|
||||
#define TR_MODULE_STATUS TR(INDENT "EStado", INDENT "Estado modulo")
|
||||
#define TR_MODULE_STATUS TR(INDENT "Estado", INDENT "Estado modulo")
|
||||
#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Estado proto sync")
|
||||
#define TR_MULTI_SERVOFREQ TR("V ref serv", "Vel. refr. servo")
|
||||
#define TR_MULTI_MAX_THROW TR("Max. Throw", "Activar max. throw")
|
||||
@@ -685,18 +671,18 @@
|
||||
#define TR_MINRSSI "Min Rssi"
|
||||
#define TR_LATITUDE "Latitud"
|
||||
#define TR_LONGITUDE "Longitud"
|
||||
#define TR_GPSCOORD TR("Coords GPS", "GPS formato coordenadas")
|
||||
#define TR_GPSCOORD TR("Coords GPS", INDENT "Formato coordenadas")
|
||||
#define TR_VARIO TR("Vario", "Variometro")
|
||||
#define TR_PITCH_AT_ZERO INDENT "Pitch en cero"
|
||||
#define TR_PITCH_AT_MAX INDENT "Pitch en max"
|
||||
#define TR_REPEAT_AT_ZERO INDENT "Repet. en cero"
|
||||
#define TR_REPEAT_AT_ZERO TR(INDENT "Repet. en cero", INDENT "Repetir en cero")
|
||||
#define TR_SHUTDOWN "APAGANDO"
|
||||
#define TR_SAVEMODEL "Grabando modelo"
|
||||
#define TR_BATT_CALIB "Calib.bat."
|
||||
#define TR_BATT_CALIB TR("Calib.bat.", "Calibracion bateria")
|
||||
#define TR_CURRENT_CALIB "Calib. actual"
|
||||
#define TR_VOLTAGE INDENT"Voltaje"
|
||||
#define TR_CURRENT INDENT"Actual"
|
||||
#define TR_SELECT_MODEL "Selec Modelo"
|
||||
#define TR_SELECT_MODEL TR("Selec. modelo", "Seleccionar modelo")
|
||||
#define TR_CREATE_CATEGORY "Crear categoria"
|
||||
#define TR_RENAME_CATEGORY "Renombrar categoria"
|
||||
#define TR_DELETE_CATEGORY "Borrar categoria"
|
||||
@@ -704,7 +690,7 @@
|
||||
#define TR_DUPLICATE_MODEL "Duplicar modelo"
|
||||
#define TR_COPY_MODEL "Copiar modelo"
|
||||
#define TR_MOVE_MODEL "Mover modelo"
|
||||
#define TR_BACKUP_MODEL "Copia sgdad mod."
|
||||
#define TR_BACKUP_MODEL TR("Copia sgdad. mod.", "Copia seguridad modelo")
|
||||
#define TR_DELETE_MODEL "Borrar modelo"
|
||||
#define TR_RESTORE_MODEL "Restaurar modelo"
|
||||
#define TR_DELETE_ERROR "Error de borrado"
|
||||
@@ -736,8 +722,8 @@
|
||||
#define TR_RF_PROTOCOL "Protocolo RF"
|
||||
#define TR_MODULE_OPTIONS "Opciones modulo"
|
||||
#define TR_POWER "Potencia"
|
||||
#define TR_NO_TX_OPTIONS "Sin pciones TX"
|
||||
#define TR_RTC_BATT "Bat. RTC"
|
||||
#define TR_NO_TX_OPTIONS "Sin opciones TX"
|
||||
#define TR_RTC_BATT TR("Bat. RTC", "Bateria RTC")
|
||||
#define TR_POWER_METER_EXT "Medidor potencia(EXT)"
|
||||
#define TR_POWER_METER_INT "Medidor potencia(INT)"
|
||||
#define TR_SPECTRUM_ANALYSER_EXT "Spectro (EXT)"
|
||||
@@ -751,22 +737,22 @@
|
||||
#define TR_EEPROMWARN "EEPROM"
|
||||
#define TR_STORAGE_WARNING "ALMAC."
|
||||
#define TR_EEPROM_CONVERTING "Convirtiendo EEPROM"
|
||||
#define TR_THROTTLEWARN "ACELERADOR"
|
||||
#define TR_THROTTLEWARN TR("ACELERAD.", "ACELERADOR")
|
||||
#define TR_ALARMSWARN "ALARMAS"
|
||||
#define TR_SWITCHWARN "INTERPTOR"
|
||||
#define TR_SWITCHWARN TR("INTERRUP.", "INTERRUPTOR")
|
||||
#define TR_FAILSAFEWARN "FAILSAFE"
|
||||
#define TR_TEST_WARNING TR("TESTING", "TEST BUILD")
|
||||
#define TR_TEST_NOTSAFE "Usar solo para test"
|
||||
#define TR_WRONG_SDCARDVERSION TR("Ver esperada: ","Version esperada: ")
|
||||
#define TR_WRONG_SDCARDVERSION TR("Ver esperada: ", "Version esperada: ")
|
||||
#define TR_WARN_RTC_BATTERY_LOW "Bateria RTC baja"
|
||||
#define TR_WARN_MULTI_LOWPOWER "Modo baja potencia"
|
||||
#define TR_BATTERY "BATERiA"
|
||||
#define TR_BATTERY "BATERIA"
|
||||
#define TR_WRONG_PCBREV "Placa PCB erronea"
|
||||
#define TR_EMERGENCY_MODE "MODO EMERGENCIA"
|
||||
#define TR_PCBREV_ERROR "Error PCB"
|
||||
#define TR_NO_FAILSAFE "Failsafe no fijado"
|
||||
#define TR_KEYSTUCK "Tecla atascada"
|
||||
#define TR_INVERT_THR TR("Invertir Acel?", "Invertir Acel.?")
|
||||
#define TR_INVERT_THR TR("Invertir acel?", "Invertir acel.?")
|
||||
#define TR_SPEAKER_VOLUME INDENT "Volumen"
|
||||
#define TR_LCD "LCD"
|
||||
#define TR_BRIGHTNESS INDENT "Brillo"
|
||||
@@ -775,9 +761,9 @@
|
||||
#define TR_CPU_MAH "Consumo"
|
||||
#define TR_COPROC "CoProc."
|
||||
#define TR_COPROC_TEMP "MB Temp. \016>"
|
||||
#define TR_CAPAWARNING INDENT "Capacidad Baja"
|
||||
#define TR_CAPAWARNING INDENT "Capacidad baja"
|
||||
#define TR_TEMPWARNING INDENT "Sobrecalent"
|
||||
#define TR_FUNC "Func"
|
||||
#define TR_FUNC "Funcion"
|
||||
#define TR_V1 "V1"
|
||||
#define TR_V2 "V2"
|
||||
#define TR_DURATION "Duracion"
|
||||
@@ -843,8 +829,8 @@
|
||||
#define TR_FLASH_BOOTLOADER "Flash bootloader"
|
||||
#define TR_FLASH_EXTERNAL_DEVICE "Flash disp. externo"
|
||||
#define TR_FLASH_RECEIVER_OTA "Flash RX OTA"
|
||||
#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA"
|
||||
#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA"
|
||||
#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX por ext. OTA"
|
||||
#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX por int. OTA"
|
||||
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulo BT", "Flash modulo bluetooth")
|
||||
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash unid. pwr mngt"
|
||||
#define TR_CURRENT_VERSION TR("Vers. actual", "Version actual: ")
|
||||
@@ -852,20 +838,20 @@
|
||||
#define TR_FLASH_INTERNAL_MULTI TR("Flash Multi int", "Flash Multi interno")
|
||||
#define TR_FLASH_EXTERNAL_MODULE TR("Flash modulo ext", "Flash modulo externo")
|
||||
#define TR_FLASH_EXTERNAL_MULTI TR("Flash Multi ext", "Flash Multi externo")
|
||||
#define TR_FIRMWARE_UPDATE_ERROR TR("Error act FW","Error actualiz. firmware")
|
||||
#define TR_FIRMWARE_UPDATE_ERROR TR("Error act FW", "Error actualiz. firmware")
|
||||
#define TR_FIRMWARE_UPDATE_SUCCESS "Flash ok"
|
||||
#define TR_WRITING "Escribiendo..."
|
||||
#define TR_CONFIRM_FORMAT "Confirmar formato?"
|
||||
#define TR_INTERNALRF "RF interna"
|
||||
#define TR_INTERNAL_MODULE TR("Modulo int","Modulo interno")
|
||||
#define TR_EXTERNAL_MODULE TR("Modulo ext","Modulo externo")
|
||||
#define TR_INTERNAL_MODULE TR("Modulo int", "Modulo interno")
|
||||
#define TR_EXTERNAL_MODULE TR("Modulo ext", "Modulo externo")
|
||||
#define TR_OPENTX_UPGRADE_REQUIRED "Actualiz. OpenTX requerida"
|
||||
#define TR_TELEMETRY_DISABLED "Telem. inactiva"
|
||||
#define TR_MORE_OPTIONS_AVAILABLE "Mas opciones disp."
|
||||
#define TR_NO_MODULE_INFORMATION "Sin informacion modulo"
|
||||
#define TR_EXTERNALRF "RF externa"
|
||||
#define TR_FAILSAFE INDENT"Modo sgdad."
|
||||
#define TR_FAILSAFESET "AJUSTES SGDAD."
|
||||
#define TR_FAILSAFE INDENT"Failsafe"
|
||||
#define TR_FAILSAFESET "AJUSTES FAILSAFE"
|
||||
#define TR_REG_ID "Reg. ID"
|
||||
#define TR_OWNER_ID "Pers. ID"
|
||||
#define TR_PINMAPSET "PINMAP"
|
||||
@@ -909,7 +895,7 @@
|
||||
#define TR_USB_SERIAL "Serie USB (Debug)"
|
||||
#define TR_SETUP_SCREENS "Pantallas config"
|
||||
#define TR_MONITOR_SCREENS "Monitores"
|
||||
#define TR_AND_SWITCH "AND Inter."
|
||||
#define TR_AND_SWITCH TR("Inter. AND", "Interruptor AND")
|
||||
#define TR_SF "CF"
|
||||
#define TR_GF "GF"
|
||||
#define TR_SPEAKER INDENT"Altavoz"
|
||||
@@ -940,9 +926,9 @@
|
||||
#define TR_TOUCH_EXIT "Touch screen to exit"
|
||||
#define TR_CALIBRATION "Calibracion"
|
||||
#define TR_SET "[Ajuste]"
|
||||
#define TR_TRAINER "Entrena."
|
||||
#define TR_TRAINER "Entrenador"
|
||||
#define TR_CHANS "Chans"
|
||||
#define TR_ANTENNAPROBLEM CENTER "¡Problema antena TX!"
|
||||
#define TR_ANTENNAPROBLEM CENTER "Problema antena TX!"
|
||||
#define TR_MODELIDUSED TR("ID en uso", "ID modelo en uso")
|
||||
#define TR_MODULE "Modulo"
|
||||
#define TR_RX_NAME "Nombre Rx"
|
||||
@@ -951,15 +937,15 @@
|
||||
#define TR_VALUE "Valor"
|
||||
#define TR_TOPLCDTIMER "Timer LCD superior"
|
||||
#define TR_UNIT "Unidad"
|
||||
#define TR_TELEMETRY_NEWSENSOR INDENT "Añadir nuevo sensor..."
|
||||
#define TR_TELEMETRY_NEWSENSOR INDENT "Añadir sensor..."
|
||||
#define TR_CHANNELRANGE INDENT "Canales"
|
||||
#define TR_ANTENNACONFIRM1 "ANTENA EXT."
|
||||
#if defined(PCBX12S)
|
||||
#define LEN_ANTENNA_MODES "\023"
|
||||
#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0 ""Por modelo\0 ""Interno + Externo\0 "
|
||||
#define LEN_ANTENNA_MODES "\020"
|
||||
#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0 ""Por modelo\0 ""Interno + Externo\0"
|
||||
#else
|
||||
#define LEN_ANTENNA_MODES "\011"
|
||||
#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0""Por model""Externa\0 "
|
||||
#define LEN_ANTENNA_MODES "\012"
|
||||
#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0""Por modelo""Externa\0 "
|
||||
#endif
|
||||
#define TR_USE_INTERNAL_ANTENNA TR("Usa antena int.", "Usa antena interna")
|
||||
#define TR_USE_EXTERNAL_ANTENNA TR("Use antena ext.", "Usa antena externa")
|
||||
@@ -971,7 +957,7 @@
|
||||
#define TR_MODULE_PROTOCOL_WARN_LINE2 "firmware certificado"
|
||||
#define TR_LOWALARM INDENT "Alarma baja"
|
||||
#define TR_CRITICALALARM INDENT "Alarma critica"
|
||||
#define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI")
|
||||
#define TR_RSSIALARM_WARN TR("RSSI", "TELEMETRY RSSI")
|
||||
#define TR_NO_RSSIALARM TR(INDENT "Alarmas desact.", INDENT "Alarmas telemetria desact.")
|
||||
#define TR_DISABLE_ALARM TR(INDENT "Desact. alarmas", INDENT "Desact. alarmas telem.")
|
||||
#define TR_ENABLE_POPUP "Activa Popup"
|
||||
@@ -988,7 +974,7 @@
|
||||
#define TR_COUNT "Puntos"
|
||||
#define TR_PT "pt"
|
||||
#define TR_PTS "pts"
|
||||
#define TR_SMOOTH "Suaviz"
|
||||
#define TR_SMOOTH TR3("Suaviz.", "Suaviz.", "Suavizado")
|
||||
#define TR_COPY_STICKS_TO_OFS TR("Copia stick->subtr", "Copia Sticks a Offset")
|
||||
#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Copia min/max a sal", "Copia min/max/ctr a salidas")
|
||||
#define TR_COPY_TRIMS_TO_OFS TR("Copia trim->subtr", "Copia trims a subtrim")
|
||||
@@ -997,8 +983,8 @@
|
||||
#define TR_MIXSOURCE "Entrada mixer"
|
||||
#define TR_CONSTANT "Constante"
|
||||
#define TR_PERSISTENT_MAH INDENT "Valor mAh"
|
||||
#define TR_PREFLIGHT "Chequeos Prevuelo"
|
||||
#define TR_CHECKLIST INDENT "Lista verif"
|
||||
#define TR_PREFLIGHT "Chequeos prevuelo"
|
||||
#define TR_CHECKLIST TR(INDENT "Lista verif", INDENT "Lista verificacion")
|
||||
#define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset")
|
||||
#define TR_AUX_SERIAL_MODE "Puerto serie"
|
||||
#define TR_SCRIPT "Script"
|
||||
@@ -1006,12 +992,12 @@
|
||||
#define TR_OUTPUTS "Salidas"
|
||||
#define STR_EEBACKUP "Copia seg. EEPROM"
|
||||
#define STR_FACTORYRESET "Rest. fabrica"
|
||||
#define TR_CONFIRMRESET "Borrar TODOS los modelos y configuracion?"
|
||||
#define TR_CONFIRMRESET "Borrar TODOS los " LCDW_128_480_LINEBREAK "modelos y conf?"
|
||||
#define TR_TOO_MANY_LUA_SCRIPTS "Demasiados Lua scripts!"
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
|
||||
#define TR_NO_TELEMETRY_SCREENS TR("No hay pant. telemetria", "No hay pantallas de telemetria")
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Nombre"
|
||||
@@ -1037,7 +1023,7 @@
|
||||
#define TR_LSW_HEADERS_FUNCTION "Funcion"
|
||||
#define TR_LSW_HEADERS_V1 "V1"
|
||||
#define TR_LSW_HEADERS_V2 "V2"
|
||||
#define TR_LSW_HEADERS_ANDSW "AND Interrup."
|
||||
#define TR_LSW_HEADERS_ANDSW "Interrup. AND"
|
||||
#define TR_LSW_HEADERS_DURATION "Duracion"
|
||||
#define TR_LSW_HEADERS_DELAY "Retardo"
|
||||
|
||||
@@ -1055,6 +1041,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Tipo de comparacion o funcion", "Primera variable", "Segunda variable o constante", "Segunda variable o constante", "Condicion adicional para activar linea", "Duracion minima de switch logico", "Duracion minima TRUE para activar switch logico" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "Primer canal"
|
||||
#define TR_FILL_BACKGROUND "Rellenar fondo"
|
||||
#define TR_BG_COLOR "Color BG"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Modo de vuelo"
|
||||
#define TR_INVALID_FILE "Fichero no valido"
|
||||
#define TR_TIMER_SOURCE "Entrada timer"
|
||||
#define TR_SIZE "Tamaño"
|
||||
#define TR_SHADOW "Sombra"
|
||||
#define TR_TEXT "Texto"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Vista principal X"
|
||||
#define TR_PANEL1_BACKGROUND "Fondo panel1"
|
||||
#define TR_PANEL2_BACKGROUND "Fondo panel2"
|
||||
|
||||
// Taranis About screen
|
||||
#define TR_ABOUTUS "Nosotros"
|
||||
|
||||
@@ -1119,10 +1122,10 @@
|
||||
|
||||
#define TR_TOP_BAR "Panel superior"
|
||||
#define TR_FLASH_ERASE "Borrar flash..."
|
||||
#define TR_FLASH_WRITE "Escrivir flash..."
|
||||
#define TR_FLASH_WRITE "Escribir flash..."
|
||||
#define TR_OTA_UPDATE "Actualizacion OTA..."
|
||||
#define TR_MODULE_RESET "Reset modulo..."
|
||||
#define TR_UNKNOWN_RX "RX deconocido"
|
||||
#define TR_UNKNOWN_RX "RX desconocido"
|
||||
#define TR_UNSUPPORTED_RX "RX no soportado"
|
||||
#define TR_OTA_UPDATE_ERROR "Error actualizacion OTA"
|
||||
#define TR_DEVICE_RESET "Reset dispositivo..."
|
||||
@@ -1131,7 +1134,7 @@
|
||||
#define TR_VIEW_CHANNELS "Ver Canales"
|
||||
#define TR_VIEW_NOTES "Ver Notas"
|
||||
#define TR_MODEL_SELECT "Seleccionar modelo"
|
||||
#define TR_MODS_FORBIDDEN "Modificacions prohibidas!"
|
||||
#define TR_MODS_FORBIDDEN "Modificaciones prohibidas"
|
||||
#define TR_UNLOCKED "Desbloqueado"
|
||||
#define TR_ID "ID"
|
||||
#define TR_PRECISION "Precision"
|
||||
@@ -1146,26 +1149,26 @@
|
||||
#define TR_CELLSENSOR "Cell sensor"
|
||||
#define TR_GPSSENSOR "GPS sensor"
|
||||
#define TR_CURRENTSENSOR "Sensor"
|
||||
#define TR_AUTOOFFSET "Auto Offset"
|
||||
#define TR_AUTOOFFSET "Auto offset"
|
||||
#define TR_ONLYPOSITIVE "Positivo"
|
||||
#define TR_FILTER "Filtro"
|
||||
#define TR_TELEMETRYFULL TR("Telem. llena!", "Todas las entradas de telemetria llenas!")
|
||||
#define TR_SERVOS_OK "Servos OK"
|
||||
#define TR_SERVOS_KO "Servos KO"
|
||||
#define TR_INVERTED_SERIAL INDENT "Invertir"
|
||||
#define TR_IGNORE_INSTANCE INDENT "Ignorar instancia"
|
||||
#define TR_DISCOVER_SENSORS "Buscar nuevos sensores"
|
||||
#define TR_IGNORE_INSTANCE TR(INDENT "No inst.", INDENT "Ignora instancias")
|
||||
#define TR_DISCOVER_SENSORS "Buscar sensores"
|
||||
#define TR_STOP_DISCOVER_SENSORS "Parar busqueda"
|
||||
#define TR_DELETE_ALL_SENSORS "Borrar sensores"
|
||||
#define TR_CONFIRMDELETE "Seguro " LCDW_128_480_LINEBREAK "borrar todo ?"
|
||||
#define TR_SELECT_WIDGET "Seleccionar widget"
|
||||
#define TR_REMOVE_WIDGET "Borrar widget"
|
||||
#define TR_WIDGET_SETTINGS "Config. widget"
|
||||
#define TR_REMOVE_SCREEN "Borar pantalla"
|
||||
#define TR_REMOVE_SCREEN "Borrar pantalla"
|
||||
#define TR_SETUP_WIDGETS "Config. widgets"
|
||||
#define TR_USER_INTERFACE "Interfaz"
|
||||
#define TR_THEME "Tema"
|
||||
#define TR_SETUP "Configiracion"
|
||||
#define TR_SETUP "Configuracion"
|
||||
#define TR_MAINVIEWX "Vista pral. X"
|
||||
#define TR_LAYOUT "Diseño"
|
||||
#define TR_ADDMAINVIEW "Añadir vista pral."
|
||||
@@ -1173,25 +1176,25 @@
|
||||
#define TR_MAIN_COLOR "Color principal"
|
||||
#define TR_TEXT_VIEWER "Visor de texto"
|
||||
|
||||
#define TR_MENU_INPUTS "\314Inputs"
|
||||
#define TR_MENU_INPUTS "\314Entradas"
|
||||
#define TR_MENU_LUA "\322Lua scripts"
|
||||
#define TR_MENU_STICKS "\307Sticks"
|
||||
#define TR_MENU_POTS "\310Pots"
|
||||
#define TR_MENU_MAX "\315MAX"
|
||||
#define TR_MENU_HELI "\316Ciclico"
|
||||
#define TR_MENU_TRIMS "\313Trims"
|
||||
#define TR_MENU_SWITCHES "\312Switches"
|
||||
#define TR_MENU_LOGICAL_SWITCHES "\312Logical Switches"
|
||||
#define TR_MENU_SWITCHES "\312Interruptores"
|
||||
#define TR_MENU_LOGICAL_SWITCHES TR("\312Interr. logicos", "\312Interruptores logicos")
|
||||
#define TR_MENU_TRAINER "\317Entrenador"
|
||||
#define TR_MENU_CHANNELS "\320Canales"
|
||||
#define TR_MENU_GVARS "\311GVars"
|
||||
#define TR_MENU_TELEMETRY "\321Telemetria"
|
||||
#define TR_MENU_DISPLAY "Monitor"
|
||||
#define TR_MENU_DISPLAY "MONITOR"
|
||||
#define TR_MENU_OTHER "Otros"
|
||||
#define TR_MENU_INVERT "Invertir"
|
||||
#define TR_JITTER_FILTER "Filtro ADC"
|
||||
#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltaje")
|
||||
#define TR_AUTH_FAILURE "Fallo auth."
|
||||
#define TR_AUTH_FAILURE "Fallo " LCDW_128_480_LINEBREAK "autentificacion"
|
||||
|
||||
#define ZSTR_FLR "FLR"
|
||||
#define ZSTR_RSSI "RSSI"
|
||||
|
||||
@@ -165,6 +165,9 @@
|
||||
#define LEN_VCSWFUNC "\005"
|
||||
#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""a<x\0 " TR_CSWRANGE "|a|>x""|a|<x""AND\0 ""OR\0 ""XOR\0 " TR_CSWSTAY "a=b\0 ""a>b\0 ""a<b\0 ""Δ}x\0 ""|Δ|}x" TR_CSWTIMER TR_CSWSTICKY
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
#define LEN_VFSWFUNC "\012"
|
||||
|
||||
#if defined(VARIO)
|
||||
@@ -655,6 +658,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
|
||||
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
|
||||
@@ -1008,7 +1012,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Name"
|
||||
@@ -1052,6 +1056,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// About screen
|
||||
#define TR_ABOUTUS TR(" ABOUT ", "ABOUT")
|
||||
|
||||
|
||||
@@ -165,6 +165,9 @@
|
||||
#define LEN_VCSWFUNC "\005"
|
||||
#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""a<x\0 " TR_CSWRANGE "|a|>x""|a|<x""ET\0 ""OU\0 ""OUX\0 " TR_CSWSTAY "a=b\0 ""a>b\0 ""a<b\0 ""Δ}x\0 ""|Δ|}x" TR_CSWTIMER TR_CSWSTICKY
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
#define LEN_VFSWFUNC "\015"
|
||||
|
||||
#if defined(VARIO)
|
||||
@@ -658,6 +661,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Désact Télémétrie")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodét.", INDENT "Autodétection")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Basse puis.", INDENT "Mode basse puiss.")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "Lien S.Port")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Actif")
|
||||
#define TR_DISABLE_INTERNAL TR("Désact intRF", "Désact. RF interne")
|
||||
@@ -1018,6 +1022,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Nom"
|
||||
@@ -1061,6 +1066,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Type de comparaison ou fonction", "Première variable", "Seconde variable ou constante", "Seconde variable ou constante", "Condition supplémentaire pour activer la ligne", "Durée minimale d'activation de l'inter logique", "Durée min de la condition avant l'activation de l'inter" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// Taranis About screen
|
||||
#define TR_ABOUTUS TR(" A PROPOS ", "A PROPOS")
|
||||
|
||||
|
||||
@@ -166,6 +166,9 @@
|
||||
#define LEN_VCSWFUNC "\005"
|
||||
#define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""a<x\0 " TR_CSWRANGE "|a|>x""|a|<x""AND\0 ""OR\0 ""XOR\0 " TR_CSWSTAY "a=b\0 ""a>b\0 ""a<b\0 ""Δ}x\0 ""|Δ|}x" TR_CSWTIMER TR_CSWSTICKY
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
#define LEN_VFSWFUNC "\015"
|
||||
|
||||
#if defined(VARIO)
|
||||
@@ -657,6 +660,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Telem. disabil.")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Trova autom.", INDENT "Autoril. il formato")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Bassa pot.", INDENT "Modo bassa potenza")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "Link S.Port")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Abilitato")
|
||||
#define TR_DISABLE_INTERNAL TR("Disatt. RF int.", "Disattiva RF interna")
|
||||
@@ -860,7 +864,7 @@
|
||||
#define TR_INTERNAL_MODULE TR("Modulo int.", "Modulo interno")
|
||||
#define TR_EXTERNAL_MODULE TR("Modulo est.", "Modulo esterno")
|
||||
#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX richiede aggiornamento"
|
||||
#define TR_TELEMETRY_DISABLED "Telem. disabilitata"
|
||||
#define TR_TELEMETRY_DISABLED TR("Telem. off", "Telem. disabilitata")
|
||||
#define TR_MORE_OPTIONS_AVAILABLE "Altre opzioni assenti"
|
||||
#define TR_NO_MODULE_INFORMATION "Nessuna info del modulo"
|
||||
#define TR_EXTERNALRF "Modulo esterno"
|
||||
@@ -1010,7 +1014,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Nome"
|
||||
@@ -1054,6 +1058,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Tipo o funzione di confronto", "Prima variabile", "Seconda variabile o costante", "Seconda variabile o costante", "Condizione aggiuntiva da abilitare linea", "Durata minima ON dell'interruttore logico", "Durata minima TRUE affinché l'interruttore si accenda" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// About screen
|
||||
#define TR_ABOUTUS TR(" INFO ", "INFO SU")
|
||||
|
||||
|
||||
@@ -377,6 +377,9 @@
|
||||
#define LEN_GYROS "\004"
|
||||
#define TR_GYROS "GyrX""GyrY"
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
// ZERO TERMINATED STRINGS
|
||||
#if defined(COLORLCD)
|
||||
#define INDENT " "
|
||||
@@ -643,6 +646,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
|
||||
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
|
||||
@@ -1002,7 +1006,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Name"
|
||||
@@ -1046,6 +1050,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Vergelijking of Functie", "1e variabele", "2e variabele of constante", "2e variabele of constante", "Additionele conditie", "Minimale AAN duur van de logische schakelaar", "Minimale WAAR duur om AAN te gaan" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// About screen
|
||||
#define TR_ABOUTUS TR(" ABOUT ", "ABOUT")
|
||||
|
||||
|
||||
@@ -396,6 +396,9 @@
|
||||
#define LEN_GYROS "\004"
|
||||
#define TR_GYROS "GyrX""GyrY"
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
// ZERO TERMINATED STRINGS
|
||||
#if defined(COLORLCD)
|
||||
#define INDENT "\007"
|
||||
@@ -656,6 +659,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
|
||||
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
|
||||
@@ -1009,7 +1013,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Nazwa"
|
||||
@@ -1053,6 +1057,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// About screen
|
||||
#define TR_ABOUTUS TR(" O ", " O ")
|
||||
|
||||
|
||||
@@ -378,6 +378,9 @@
|
||||
#define LEN_GYROS "\004"
|
||||
#define TR_GYROS "GyrX""GyrY"
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
// ZERO TERMINATED STRINGS
|
||||
#if defined(COLORLCD)
|
||||
#define INDENT " "
|
||||
@@ -647,6 +650,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
|
||||
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
|
||||
@@ -999,7 +1003,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Name"
|
||||
@@ -1043,6 +1047,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// Taranis About screen
|
||||
#define TR_ABOUTUS "ABOUT US"
|
||||
|
||||
|
||||
@@ -391,6 +391,9 @@
|
||||
#define LEN_GYROS "\004"
|
||||
#define TR_GYROS "GyrX""GyrY"
|
||||
|
||||
#define LEN_TEXT_SIZE "\010"
|
||||
#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 "
|
||||
|
||||
// ZERO TERMINATED STRINGS
|
||||
#if defined(COLORLCD)
|
||||
#define INDENT " "
|
||||
@@ -656,6 +659,7 @@
|
||||
#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_MULTI_LNA_DISABLE INDENT "LNA disable"
|
||||
#define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link")
|
||||
#define TR_MODULE_TELEM_ON TR("ON", "Enabled")
|
||||
#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF")
|
||||
@@ -1009,7 +1013,7 @@
|
||||
#define TR_SPORT_UPDATE_POWER_MODE "SP Power"
|
||||
#define LEN_SPORT_UPDATE_POWER_MODES "\004"
|
||||
#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 "
|
||||
|
||||
#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens"
|
||||
|
||||
// Horus and Taranis column headers
|
||||
#define TR_PHASES_HEADERS_NAME "Namn"
|
||||
@@ -1053,6 +1057,23 @@
|
||||
// Horus footer descriptions
|
||||
#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" }
|
||||
|
||||
// Horus layouts and widgets
|
||||
#define TR_FIRST_CHANNEL "First channel"
|
||||
#define TR_FILL_BACKGROUND "Fill background?"
|
||||
#define TR_BG_COLOR "BG Color"
|
||||
#define TR_SLIDERS_TRIMS "Sliders+Trims"
|
||||
#define TR_SLIDERS "Sliders"
|
||||
#define TR_FLIGHT_MODE "Flight mode"
|
||||
#define TR_INVALID_FILE "Invalid File"
|
||||
#define TR_TIMER_SOURCE "Timer source"
|
||||
#define TR_SIZE "Size"
|
||||
#define TR_SHADOW "Shadow"
|
||||
#define TR_TEXT "Text"
|
||||
#define TR_COLOR "Color"
|
||||
#define TR_MAIN_VIEW_X "Main view X"
|
||||
#define TR_PANEL1_BACKGROUND "Panel1 background"
|
||||
#define TR_PANEL2_BACKGROUND "Panel2 background"
|
||||
|
||||
// About screen
|
||||
#define TR_ABOUTUS "Om Oss"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user