diff --git a/CMakeLists.txt b/CMakeLists.txt index 89f912977..a61bad048 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ set(VERSION_REVISION "0") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) -set(SDCARD_REVISION "0024") +set(SDCARD_REVISION "0025") set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION}) cmake_minimum_required(VERSION 2.8) diff --git a/CREDITS.txt b/CREDITS.txt index b654164b9..298dc3f45 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1661,3 +1661,9 @@ NthWave Web Works Simon Brenner Joseph Litko Bradley Murchie +William Cessna +Justin Farnsworth +James Snodgrass +Peter Schneider +Norman Schenck +Boris Hemmer diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index f76a7f252..e01657c33 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -123,7 +123,7 @@ configure_file(${COMPANION_SRC_DIRECTORY}/simulator.desktop.in ${CMAKE_CURRENT_B ### Generate .qm files and assemble resource (qrc) file. # available Companion translations (src/translations/*.ts) -set(LANGUAGES cs de en es fi fr it pl sv zh_CN ja) +set(LANGUAGES cs de en es fi fr it pl ru sv zh_CN ja) foreach(language ${LANGUAGES}) list(APPEND companion_TS translations/companion_${language}.ts) endforeach(language) @@ -341,7 +341,9 @@ endif() # the current flavour is not automatically added if build in the current cmake iteration, so always # add its library name to be sure -if(PCB STREQUAL X7 AND PCBREV STREQUAL T12) +if(PCB STREQUAL X7 AND PCBREV STREQUAL ACCESS) + set(FLAVOUR x7access) +elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T12) set(FLAVOUR t12) elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) set(FLAVOUR x9d+2019) diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 726cae256..9f42fa9c3 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -66,6 +66,7 @@ uint32_t Boards::getFourCC(Type board) case BOARD_TARANIS_XLITES: return 0x3B78746F; case BOARD_TARANIS_X7: + case BOARD_TARANIS_X7_ACCESS: return 0x3678746F; case BOARD_TARANIS_X9E: return 0x3578746F; @@ -116,6 +117,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_TARANIS_XLITES: case BOARD_TARANIS_XLITE: case BOARD_TARANIS_X7: + case BOARD_TARANIS_X7_ACCESS: case BOARD_TARANIS_X9LITE: case BOARD_TARANIS_X9LITES: case BOARD_TARANIS_X9D: @@ -154,6 +156,7 @@ int Boards::getFlashSize(Type board) case BOARD_TARANIS_XLITES: case BOARD_TARANIS_XLITE: case BOARD_TARANIS_X7: + case BOARD_TARANIS_X7_ACCESS: case BOARD_TARANIS_X9LITE: case BOARD_TARANIS_X9LITES: case BOARD_TARANIS_X9D: @@ -497,6 +500,8 @@ QString Boards::getBoardName(Board::Type board) return "MEGA2560"; case BOARD_TARANIS_X7: return "Taranis X7/X7S"; + case BOARD_TARANIS_X7_ACCESS: + return "Taranis X7/X7S Access"; case BOARD_JUMPER_T12: return "Jumper T12"; case BOARD_TARANIS_XLITE: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index c3cd3ff59..1057d3706 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -40,6 +40,7 @@ namespace Board { BOARD_9XRPRO, BOARD_AR9X, BOARD_TARANIS_X7, + BOARD_TARANIS_X7_ACCESS, BOARD_TARANIS_X9D, BOARD_TARANIS_X9DP, BOARD_TARANIS_X9DP_2019, @@ -241,7 +242,12 @@ inline bool IS_TARANIS_XLITES(Board::Type board) inline bool IS_TARANIS_X7(Board::Type board) { - return board == Board::BOARD_TARANIS_X7; + return board == Board::BOARD_TARANIS_X7 || board == Board::BOARD_TARANIS_X7_ACCESS; +} + +inline bool IS_TARANIS_X7_ACCESS(Board::Type board) +{ + return board == Board::BOARD_TARANIS_X7_ACCESS; } inline bool IS_TARANIS_X9LITE(Board::Type board) @@ -321,7 +327,7 @@ inline bool HAS_EXTERNAL_ANTENNA(Board::Type board) inline bool IS_ACCESS_RADIO(Board::Type board, QString &id) { - return (IS_TARANIS_XLITES(board) || IS_TARANIS_X9LITE(board) || board == Board::BOARD_TARANIS_X9DP_2019 || board == Board::BOARD_X10_EXPRESS || + return (IS_TARANIS_XLITES(board) || IS_TARANIS_X9LITE(board) || board == Board::BOARD_TARANIS_X9DP_2019 || board == Board::BOARD_X10_EXPRESS || IS_TARANIS_X7_ACCESS(board) || (IS_HORUS(board) && id.contains("internalaccess"))); } diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 9509c3c28..aaff3123b 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -80,6 +80,8 @@ const char * OpenTxEepromInterface::getName() return "OpenTX for FrSky Taranis X9E"; case BOARD_TARANIS_X7: return "OpenTX for FrSky Taranis X7"; + case BOARD_TARANIS_X7_ACCESS: + return "OpenTX for FrSky Taranis X7 Access"; case BOARD_TARANIS_X9LITES: return "OpenTX for FrSky Taranis X9-Lite S"; case BOARD_TARANIS_X9LITE: @@ -330,6 +332,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u else if (IS_TARANIS_X9LITE(board)) { variant |= TARANIS_X9LITE_VARIANT; } + else if (IS_TARANIS_X7_ACCESS(board)) { + variant |= TARANIS_X7_VARIANT; + } else if (IS_TARANIS_X7(board)) { variant |= TARANIS_X7_VARIANT; } @@ -1254,6 +1259,11 @@ void registerOpenTxFirmwares() addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); + /* FrSky X7 Access board */ + firmware = new OpenTxFirmware("opentx-x7access", Firmware::tr("FrSky Taranis X7 / X7S Access"), BOARD_TARANIS_X7_ACCESS); + addOpenTxTaranisOptions(firmware); + registerOpenTxFirmware(firmware); + /* FrSky X-Lite S/PRO board */ firmware = new OpenTxFirmware("opentx-xlites", Firmware::tr("FrSky Taranis X-Lite S/PRO"), BOARD_TARANIS_XLITES); addOpenTxTaranisOptions(firmware); diff --git a/companion/src/simulation/debugoutput.cpp b/companion/src/simulation/debugoutput.cpp index 006865bcc..c8434eef7 100644 --- a/companion/src/simulation/debugoutput.cpp +++ b/companion/src/simulation/debugoutput.cpp @@ -164,20 +164,19 @@ void DebugOutput::restoreState() void DebugOutput::processBytesReceived() { - static char buf[512]; + static QByteArray text; + if (text.capacity() < 512) + text.reserve(512); const QTextCursor savedCursor(ui->console->textCursor()); const int sbValue = ui->console->verticalScrollBar()->value(); const bool sbAtBottom = (sbValue == ui->console->verticalScrollBar()->maximum()); - qint64 len; - QString text; while (m_dataBufferDevice && m_dataBufferDevice->bytesAvailable() > 0) { - len = m_dataBufferDevice->read(buf, sizeof(buf)); - if (len <= 0) + text = m_dataBufferDevice->read(qint64(text.capacity())); + if (text.isEmpty()) break; - text = QString::fromLocal8Bit(buf, len); ui->console->moveCursor(QTextCursor::End); - ui->console->textCursor().insertText(text); + ui->console->textCursor().insertText(QString(text)); if (sbAtBottom) { ui->console->moveCursor(QTextCursor::End); ui->console->verticalScrollBar()->setValue(ui->console->verticalScrollBar()->maximum()); diff --git a/companion/src/simulation/filteredtextbuffer.cpp b/companion/src/simulation/filteredtextbuffer.cpp index 61d30d911..b39cd2297 100644 --- a/companion/src/simulation/filteredtextbuffer.cpp +++ b/companion/src/simulation/filteredtextbuffer.cpp @@ -31,38 +31,38 @@ FIFOBufferDevice::FIFOBufferDevice(QObject * parent) : QBuffer(parent), - m_dataBufferMaxSize(20 * 1024), m_hasOverflow(false) { + setDataBufferMaxSize(20 * 1024); } -qint64 FIFOBufferDevice::getDataBufferMaxSize() const +void FIFOBufferDevice::setDataBufferMaxSize(int size) { - return m_dataBufferMaxSize; -} - -void FIFOBufferDevice::setDataBufferMaxSize(qint64 size) -{ - if (m_dataBufferMaxSize > size) - trimData(m_dataBufferMaxSize - size); - - m_dataBufferMaxSize = size; + QWriteLocker locker(&m_dataRWLock); + if (buffer().capacity() > size) { + trimData(buffer().capacity() - size); + buffer().squeeze(); + } + buffer().reserve(size); } // Remove data from beginning of storage array. // NOT thread-safe, lock data before use (this avoids needing a recursive mutex) -qint64 FIFOBufferDevice::trimData(qint64 len) +int FIFOBufferDevice::trimData(int len) { - if (!isWritable()) + if (!isWritable() || len <= 0) return 0; - qint64 count = 0; - if (len > 0) { - count = qMin(len, (qint64)buffer().size()); - buffer().remove(0, count); - seek(0); - } - return count; + len = qMin(len, buffer().size()); + buffer().remove(0, len); + QIODevice::seek(0); + return len; +} + +int FIFOBufferDevice::nextLineLen() const +{ + QReadLocker locker(&m_dataRWLock); + return buffer().indexOf('\n', 0) + 1; } qint64 FIFOBufferDevice::writeData(const char * data, qint64 len) @@ -73,10 +73,10 @@ qint64 FIFOBufferDevice::writeData(const char * data, qint64 len) QWriteLocker locker(&m_dataRWLock); // Handle overflow - if (size() + len > m_dataBufferMaxSize) { + if (size() + len > getDataBufferMaxSize()) { m_hasOverflow = true; - qint64 tlen = trimData(size() + len - m_dataBufferMaxSize); - emit bufferOverflow(tlen); + const int tlen = trimData(size() + len - getDataBufferMaxSize()); + emit bufferOverflow(qint64(tlen)); } else if (m_hasOverflow) { m_hasOverflow = false; @@ -84,65 +84,62 @@ qint64 FIFOBufferDevice::writeData(const char * data, qint64 len) } // Always write to end of stream. - if (!seek(size())) + if (!QIODevice::seek(size())) return -1; // Save the data len = QBuffer::writeData(data, len); // Make sure we're always ready for reading, this makes bytesAvailable() (et.al.) return correct result. - seek(0); + QIODevice::seek(0); return len; } qint64 FIFOBufferDevice::readData(char * data, qint64 len) { - if (!isReadable()) + len = qMin(len, qint64(buffer().size())); + if (!isReadable() || len <= 0) return 0; - // Do not block - if (m_dataRWLock.tryLockForRead()) { - // Always take data from top - if (seek(0)) { - len = QBuffer::readData(data, len); - trimData(len); - } - m_dataRWLock.unlock(); + QWriteLocker locker(&m_dataRWLock); + // Always take data from top + if (QIODevice::seek(0)) { + memcpy(data, buffer().constData(), len); + buffer().remove(0, len); + } + else { + len = -1; } - return len; } qint64 FIFOBufferDevice::readLine(char * data, qint64 maxSize) { - m_dataRWLock.lockForRead(); - qint64 len = buffer().indexOf('\n', 0); - m_dataRWLock.unlock(); + if (maxSize < 2) + return -1; - if (len < 0 || maxSize <= 0) + int len = nextLineLen(); + if (len <= 0) return 0; - ++len; - len = qMin(len, maxSize); - return readData(data, len); + len = qMin(len, int(maxSize)); + return readData(data, qint64(len)); } QByteArray FIFOBufferDevice::readLine(qint64 maxSize) { - QByteArray ba; - m_dataRWLock.lockForRead(); - qint64 len = buffer().indexOf('\n', 0); - m_dataRWLock.unlock(); + if (maxSize < 0) + return QByteArray(); - if (len < 0) - return ba; + int len = nextLineLen(); + if (len <= 0) + return QByteArray(); - ++len; - if (maxSize > 0) - len = qMin(len, maxSize); + if (maxSize > 1) + len = qMin(len, int(maxSize - 1)); - ba.fill(0, len); - len = readData(ba.data(), len); + QByteArray ba(len, 0); + len = int(readData(ba.data(), qint64(len))); if (len < 0) len = 0; @@ -163,15 +160,12 @@ FilteredTextBuffer::FilteredTextBuffer(QObject * parent) : FIFOBufferDevice(parent), m_inBuffer(new FIFOBufferDevice(this)), m_bufferFlushTimer(new QTimer(this)), - m_lineFilter(QRegularExpression()), - m_inBuffMaxSize(5 * 1024), - m_inBuffFlushTimeout(1500), m_lineFilterEnable(false), m_lineFilterExclusive(false) { m_bufferFlushTimer->setSingleShot(true); - setInputBufferMaxSize(m_inBuffMaxSize); - setInputBufferTimeout(m_inBuffFlushTimeout); + setInputBufferMaxSize(5 * 1024); + setInputBufferTimeout(1500); connect(m_inBuffer, &FIFOBufferDevice::readyRead, this, &FilteredTextBuffer::processInputBuffer, Qt::QueuedConnection); connect(m_inBuffer, &FIFOBufferDevice::bytesWritten, this, &FilteredTextBuffer::onInputBufferWrite, Qt::QueuedConnection); @@ -186,44 +180,26 @@ FilteredTextBuffer::~FilteredTextBuffer() if (m_bufferFlushTimer) { disconnect(m_bufferFlushTimer, 0, this, 0); disconnect(this, 0, m_bufferFlushTimer, 0); - m_bufferFlushTimer->deleteLater(); - m_bufferFlushTimer = Q_NULLPTR; } if (m_inBuffer) { closeInputBuffer(); disconnect(m_inBuffer, 0, this, 0); - m_inBuffer->deleteLater(); - m_inBuffer = Q_NULLPTR; } } -qint64 FilteredTextBuffer::getInputBufferMaxSize() const +void FilteredTextBuffer::setInputBufferMaxSize(int size) { - return m_inBuffMaxSize; + m_inBuffer->setDataBufferMaxSize(size); } -quint32 FilteredTextBuffer::getInputBufferTimeout() const +void FilteredTextBuffer::setInputBufferTimeout(int ms) { - return m_inBuffFlushTimeout; -} - -void FilteredTextBuffer::setInputBufferMaxSize(qint64 size) -{ - m_inBuffMaxSize = size; - if (m_inBuffer) - m_inBuffer->setDataBufferMaxSize(size); -} - -void FilteredTextBuffer::setInputBufferTimeout(quint32 ms) -{ - m_inBuffFlushTimeout = ms; - if (m_bufferFlushTimer) - m_bufferFlushTimer->setInterval(ms); + m_bufferFlushTimer->setInterval(ms); } void FilteredTextBuffer::setLineFilterExpr(const QRegularExpression & expr) { - if (expr.isValid()) + if (!expr.pattern().isEmpty() && expr.isValid()) m_lineFilter = expr; else setLineFilterEnabled(false); @@ -231,7 +207,9 @@ void FilteredTextBuffer::setLineFilterExpr(const QRegularExpression & expr) void FilteredTextBuffer::setLineFilterEnabled(bool enable) { - if (!enable && m_lineFilterEnable) + if (enable && !m_inBuffer->isOpen()) + openInputBuffer(); + else if (!enable) closeInputBuffer(); m_lineFilterEnable = enable; @@ -251,7 +229,7 @@ void FilteredTextBuffer::setLineFilter(bool enable, bool exclusive, const QRegul qint64 FilteredTextBuffer::writeDataSuper(const char * data, qint64 len) { - if (len == -1) + if (len < 0) len = qstrlen(data); return FIFOBufferDevice::writeData(data, len); @@ -259,17 +237,20 @@ qint64 FilteredTextBuffer::writeDataSuper(const char * data, qint64 len) qint64 FilteredTextBuffer::writeData(const char * data, qint64 len) { - if (!isWritable()) + if (!isWritable() || len < 0) return -1; + if (!len) + return 0; + const qint64 maxSz = qint64(getInputBufferMaxSize()); // if filter is disabled, invalid, or input buffer failure, write directly to output buffer - if (!m_lineFilterEnable || !m_inBuffer || len > m_inBuffMaxSize || (!m_inBuffer->isOpen() && !openInputBuffer())) + if (!m_inBuffer->isOpen() || len > maxSz) return writeDataSuper(data, len); // check for input buffer overflow - if (m_inBuffer->bytesAvailable() + len > m_inBuffMaxSize) { + if (m_inBuffer->bytesAvailable() + len > maxSz) { flushInputBuffer(); - onInputBufferOverflow(m_inBuffer->bytesAvailable() + len - m_inBuffMaxSize); + onInputBufferOverflow(m_inBuffer->bytesAvailable() + len - maxSz); } return m_inBuffer->write(data, len); @@ -278,16 +259,15 @@ qint64 FilteredTextBuffer::writeData(const char * data, qint64 len) void FilteredTextBuffer::flushInputBuffer() { emit timerStop(); - - if (m_inBuffer && m_inBuffer->bytesAvailable()) { - // qDebug() << "Flushing input buffer."; - writeDataSuper(m_inBuffer->readAll().constData()); + if (m_inBuffer->bytesAvailable()) { + const QByteArray text = m_inBuffer->readAll(); + writeDataSuper(text.constData(), qint64(text.size())); } } void FilteredTextBuffer::closeInputBuffer() { - if (!m_inBuffer || !m_inBuffer->isOpen()) + if (!m_inBuffer->isOpen()) return; flushInputBuffer(); @@ -296,37 +276,33 @@ void FilteredTextBuffer::closeInputBuffer() bool FilteredTextBuffer::openInputBuffer() { - if (m_inBuffer && m_inBuffer->isOpen()) + if (m_inBuffer->isOpen()) closeInputBuffer(); - return m_inBuffer->open(ReadWrite); + return m_inBuffer->open(ReadWrite | Text); } void FilteredTextBuffer::processInputBuffer() { - if (m_lineFilterEnable && m_inBuffer && m_inBuffer->canReadLine()) { - emit timerStop(); - while (m_inBuffer && m_inBuffer->canReadLine()) { - QByteArray text = m_inBuffer->readLine(); - bool fltMatch = QString(text).contains(m_lineFilter); - // check line against filter - if ((m_lineFilterExclusive && !fltMatch) || (!m_lineFilterExclusive && fltMatch)) { - // Write line to output buffer - writeDataSuper(text.constData()); - } - } - // restart timer if unread bytes still remain - if (m_inBuffer && m_inBuffer->bytesAvailable() > 0) - emit timerStart(); + if (!m_lineFilterEnable) { + return closeInputBuffer(); } - else if (!m_lineFilterEnable || !m_inBuffer) { - closeInputBuffer(); + else if (sender() == m_bufferFlushTimer) { + return flushInputBuffer(); } - else if (m_bufferFlushTimer && !m_bufferFlushTimer->remainingTime()) { - flushInputBuffer(); - //qDebug() << "Input buffer timeout."; + + emit timerStop(); + while (m_lineFilterEnable && m_inBuffer->canReadLine()) { + const QByteArray text = m_inBuffer->readLine(); + // If line matches inclusive filter or does not match exclusive filter, write it to output buffer. + if (!text.isEmpty() && m_lineFilterExclusive != QString(text).contains(m_lineFilter)) + writeDataSuper(text.constData(), qint64(text.size())); } + // restart timer if unread bytes still remain + if (m_inBuffer->bytesAvailable() > 0) + emit timerStart(); } + void FilteredTextBuffer::onInputBufferWrite(qint64) { emit timerStart(); diff --git a/companion/src/simulation/filteredtextbuffer.h b/companion/src/simulation/filteredtextbuffer.h index 893f44e40..9d7d9b200 100644 --- a/companion/src/simulation/filteredtextbuffer.h +++ b/companion/src/simulation/filteredtextbuffer.h @@ -39,23 +39,28 @@ class FIFOBufferDevice : public QBuffer public: explicit FIFOBufferDevice(QObject * parent = Q_NULLPTR); - qint64 getDataBufferMaxSize() const; - void setDataBufferMaxSize(qint64 size); + //! @returns FIFO buffer limit in bytes. + inline int getDataBufferMaxSize() const { return buffer().capacity(); } + //! @param size in bytes. + void setDataBufferMaxSize(int size); + virtual inline qint64 bytesAvailable() const override { return size() || QIODevice::bytesAvailable(); } + virtual inline bool canReadLine() const override { return nextLineLen() > 0; } // reimplemented from QIODevice for efficiency qint64 readLine(char * data, qint64 maxSize); QByteArray readLine(qint64 maxSize = 0); signals: - void bufferOverflow(qint64 len); // len is overflow size, <= 0 means overflow has cleared + //! @param len is overflow size, <= 0 means overflow has cleared + void bufferOverflow(qint64 len); protected: - qint64 trimData(qint64 len); - virtual qint64 writeData(const char * data, qint64 len); - virtual qint64 readData(char * data, qint64 len); + int trimData(int len); + int nextLineLen() const; + virtual qint64 writeData(const char * data, qint64 len) override; + virtual qint64 readData(char * data, qint64 len) override; - QReadWriteLock m_dataRWLock; - qint64 m_dataBufferMaxSize; // [bytes] output buffer limit (FIFO). + mutable QReadWriteLock m_dataRWLock; bool m_hasOverflow; }; @@ -77,14 +82,14 @@ class FilteredTextBuffer : public FIFOBufferDevice explicit FilteredTextBuffer(QObject * parent = Q_NULLPTR); ~FilteredTextBuffer(); - qint64 getInputBufferMaxSize() const; - quint32 getInputBufferTimeout() const; + inline int getInputBufferMaxSize() const { return m_inBuffer->getDataBufferMaxSize(); } + inline int getInputBufferTimeout() const { return m_bufferFlushTimer->interval(); } public slots: - // input buffer will be flushed if grows > size bytes. - void setInputBufferMaxSize(qint64 size); - // how often to flush the input buffer when less than whole lines are present. - void setInputBufferTimeout(quint32 ms); + //! @param size in bytes. Input buffer will be flushed if grows over this size. + void setInputBufferMaxSize(int size); + //! @param ms how often to flush the input buffer when less than whole lines are present. + void setInputBufferTimeout(int ms); void setLineFilterExpr(const QRegularExpression & expr); void setLineFilterEnabled(bool enable); void setLineFilterExclusive(bool exclusive); @@ -97,7 +102,7 @@ class FilteredTextBuffer : public FIFOBufferDevice protected: qint64 writeDataSuper(const char * data, qint64 len = -1); - virtual qint64 writeData(const char * data, qint64 len); + virtual qint64 writeData(const char * data, qint64 len) override; void flushInputBuffer(); void closeInputBuffer(); bool openInputBuffer(); @@ -108,8 +113,6 @@ class FilteredTextBuffer : public FIFOBufferDevice FIFOBufferDevice * m_inBuffer; QTimer * m_bufferFlushTimer; QRegularExpression m_lineFilter; - qint64 m_inBuffMaxSize; // [bytes] - quint32 m_inBuffFlushTimeout; // [ms] bool m_lineFilterEnable; bool m_lineFilterExclusive; }; diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index c96cd480e..2a472fc00 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -64,6 +64,7 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato radioUiWidget = new SimulatedUIWidgetX9LITE(simulator, this); break; case Board::BOARD_TARANIS_X7: + case Board::BOARD_TARANIS_X7_ACCESS: radioUiWidget = new SimulatedUIWidgetX7(simulator, this); break; case Board::BOARD_TARANIS_X9D: diff --git a/companion/src/translations.cpp b/companion/src/translations.cpp index 03172dac8..76d63b425 100644 --- a/companion/src/translations.cpp +++ b/companion/src/translations.cpp @@ -45,7 +45,7 @@ QStringList const Translations::getAvailableTranslations() //<< "nl_NL" << "pl_PL" //<< "pt_PT" - //<< "ru_RU" + << "ru_RU" << "sv_SE" << "zh_CN" << "ja_JP" ; diff --git a/companion/src/translations/companion_ru.ts b/companion/src/translations/companion_ru.ts index 148edd16c..20cdbc733 100644 --- a/companion/src/translations/companion_ru.ts +++ b/companion/src/translations/companion_ru.ts @@ -1,110 +1,144 @@ - + AileronsPage - + No - + Нет - + Yes, controlled by a single channel - + Да, управляются одним каналом - + Yes, controlled by two channels - + Да, управляются двумя каналами - + <br>First Aileron Channel: - + <br>Первый канал элеронов: - + Second Aileron Channel: - + Второй канал элеронов: AirbrakesPage - + No - + Нет - + Yes, controlled by a single channel - + Да, управляются одним каналом - + Yes, controlled by two channels - + Да, управляются двумя каналами - + <br>First Airbrake Channel: - + <br>Первый канал воздушного тормоза: - + Second Airbrake Channel: - + Второй канал воздушного тормоза: + + + + AppData + + + Application Settings have been saved to + %1 + Настройки приложения сохранены в + %1 + + + + Could not save Application Settings to file "%1" + Не удалось сохранить настройки приложения в файл "%1" + + + + because the file could not be saved (check access permissions). + файл нельзя сохранить (проверьте права доступа). + + + + for unknown reasons. + причина неизвестна. + + + + AppMessages + + + Show this message again at next startup? + Показывать это сообщение при следующем запуске? AppPreferencesDialog - + Edit Settings - + Настройки - + Radio Profile - + Профиль аппаратуры - - - - - - Open Folder - - - - + Default Channel Order - Порядок следов. каналов + Порядок каналов - + Build Options - + Параметры прошивки - + Menu Language - + Язык меню - + Default Stick Mode - Режим стиков + Режим стиков (мода) - + Select Image - + Выбрать картинку - + + + + + + + Select Folder + Выбрать папку + + + Mode selection: Mode 1: @@ -127,1034 +161,1227 @@ Mode 4: - + Mode 1 (RUD ELE THR AIL) - + Mode 2 (RUD THR ELE AIL) - + Mode 3 (AIL ELE THR RUD) - + Mode 4 (AIL THR ELE RUD) - + Splash Screen - + Заставка при включении - - + + The profile specific folder, if set, will override general Backup folder - + Папка с резервными копиями. Относится к выбранному профилю, переопределяет настройки приложения - + Backup folder - + Резервное копирование - + If set it will override the application general setting - + Переопределяет папку, заданную в настройках приложения - + if set, will override general backup enable - + Переопределяет настроки приложения - + <html><head/><body><p>Channel order</p><p><br/></p><p>Defines the order of the default mixes created on a new model.</p></body></html> - + <html><head/><body><p>Порядок каналов</p><p><br/></p><p>Задает порядок микшеров при создании новой модели.</p></body></html> - + R E T A - + R E A T - + R T E A - + R T A E - + R A E T - + R A T E - + E R T A - + E R A T - + E T R A - + E T A R - + E A R T - + E A T R - + T R E A - + T R A E - + T E R A - + T E A R - + T A R E - + T A E R - + A R E T - + A R T E - + A E R T - + A E T R - + A T R E - + A T E R - - Use OpenTX firmware nightly builds - + + Simulator Volume Gain + Усиление звука в симуляторе - - Use Companion nightly builds - + + Profile Name + Название профиля + + + + Clear Image + Убрать картинку + + + + Append version number to FW file name + Добавить номер версии к названию файла прошивки + + + + Offer to write FW to Tx after download + Предложить обновить прошивку после загрузки + + + + Radio Type + Тип передатчика + + + + Other Settings + Другие настройки + + + + General Settings + Основные настройки + + + + SD Structure path + Папка с содержимым SD + + + + Application Settings + Настройки приложения + + + + Show splash screen when Companion starts + Показывать заставку при загрузке Companion + + + + Automatic check for Companion updates + Автоматически проверять наличие обновлений Companion + + + + + Enable automatic backup before writing firmware + Автоматически делать резервную копию перед обновлением прошивки + + + + Automatic check for OpenTX firmware updates + Автоматически проверять наличие обновлений прошивки (OpenTX) + + + + Splash Screen Library + Галерея изображений + + + + Google Earth Executable + Запуск Google Earth + + + + Only show user splash images + Показывать только пользовательские изображения + + + + Show user and companion splash images + Показывать встроенные и пользовательские изображения - Simulator Volume Gain - - - - - Profile Name - - - - - Remove Profile - - - - - Clear Image - - - - - Append version number to FW file name - - - - - Offer to write FW to Tx after download - - - - - Radio Type - - - - - Other Settings - - - - - General Settings - Основные настройки - - - - SD Structure path - - - - - Set voice language. -May be different from firmware language - - - - - Voice Language - - - - - Application Settings - - - - - Show splash screen when Companion starts - - - - - Automatic check for Companion updates - - - - - - Enable automatic backup before writing firmware - - - - - Automatic check for OpenTX firmware updates - - - - - Splash Screen Library - - - - - Files to keep - - - - - Find Executable - - - - - Google Earth Executable - - - - - Only show user splash images - - - - - Show user and companion splash images - - - - User Splash Screens - + Пользовательские заставки - + Automatic Backup Folder - + Папка для резервн. копий - - Use model wizard when creating a new model - - - - + Simulator Settings - + Настройки симулятора - + Simulator BackLight - + Подсветка в симуляторе - + Enable - + Включить - + + most recently used files + часто используемых файлов + + + + Startup Settings + Запуск приложения + + + + Remember + Запомнить + + + + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> + <html><head/><body><p>Это опция нужна, чтобы при удалении или перемещении модели сохранить поведение как старых версиях OpenTX. </p><p>Если отключить, то при удалении модели другие модели могут быть перемещены, чтобы убрать пустые слоты</p></body></html> + + + + Remove empty model slots when deleting models (only applies for radios w/out categories) + Удалять пустые слоты при удалении модели (только если нет категорий) + + + + Output Logs Folder + Папка с журналами + + + + Debug Output Logging + Журнал событий + + + + Use model wizard + использовать мастер + + + + Open model editor + открыть редактор + + + + Just create the model + просто создать модель + + + + Select Executable + Указать файл + + + + Action on New Model + Создание новой модели + + + + <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> + <html><head/><body><p>Сохранение отладочных сообщений из Companion и симулятора. При поиске проблем разработчики OpenTX могут попросить эти журналы.</p></body></html> + + + + Application (Companion/Simulator) + приложения (Companion/Симулятор) + + + + <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> + <html><head/><body><p>Сохранение всех сообщений прошивки запущенной в симуляторе. Это те же сообщения, что вы можете увидеть в симуляторе, в окне <span style=" font-style:italic;">Debug Output</span></p></body></html> + + + + Radio Firmware (in Simulator) + прошивки передатчика (в симуляторе) + + + + Release channel + Версии обновлений + + + + Releases (stable) + Релизы (стабильные версии) + + + + Release candidates (testing) + Предварительные версии (тестовые) / Release candidates + + + + Nightly builds (unstable) + Ночные сборки (нестабильные версии) + + + Blue - + Синяя - + Green - + Зеленая - + Red - + Красная - + Orange - + Оранжевая - + Yellow - + Желтая - + + Screenshot capture folder + Папка для скриншотов + + + Joystick - + Джойстик - + Calibrate - + Калибровка - - Simulator capture folder - - - - + Only capture to clipboard - + Не сохранять, только копировать в буфер обмена - + Remember simulator switch values - + Запоминать положения тумблеров в симуляторе - + My Radio - + + <p><b>You cannot switch Radio Type or change Build Options while there are unsaved file changes. What do you wish to do?</b></p> <ul><li><i>Save All</i> - Save any open file(s) before saving Settings.<li><li><i>Reset</i> - Revert to the previous Radio Type and Build Options before saving Settings.</li><li><i>Cancel</i> - Return to the Settings editor dialog.</li></ul> + <p><b>Если есть несохраненные изменения, то нельзя поменять тип передатчика и параметры прошивки. Что делать?</b></p> <ul><li><i>Сохранить все</i> - Сохранить все открытые файлы, прежде чем менять настройки.<li><li><i>Сбросить</i> - Перед сохранением вернуть все настройки назад.</li><li><i>Отмена</i> - Ничего не делать, вернуться к настройкам..</li></ul> + + + Select your snapshot folder + Выберите папку + + + + Note: Nightly builds are not available in this version, Release/RC update channel will be used. - - + + No joysticks found - + Джойстик не найден - + EMPTY: No radio settings stored in profile - + ПУСТО: в профиле нет настроек аппаратуры - + AVAILABLE: Radio settings of unknown age - + AVAILABLE: Radio settings stored %1 - + Select your library folder - + Выберите папку - - + + Select your Models and Settings backup folder - + Выберите папку для резервного копирования моделей и настроек - + + Select a folder for application logs + Выберите папку для хранения журнала событий + + + Select Google Earth executable - + Выбрать исполняемый файл Google Earth - + Select the folder replicating your SD structure - + Выберите папку, в которой хранится содержимое SD карточки - - Not possible to remove profile - - - - - The default profile can not be removed. - - - - + Open Image to load - + Выберите изображение - + Images (%1) - + Изображения (%1) - Calibration + BinEepromFormat - - Form + + Error reading %1: %2 + Ошибка чтения %1: %2 + + + + Cannot save EEPROM + Не удалось сохранить EEPROM + + + + Cannot open file %1: +%2. + Не удалось открыть файл %1: +%2. + + + + Error writing file %1: +%2. + Ошибка при записи файла %1: +%2. + + + + Invalid binary EEPROM file %1 + Неправильный бинарный EEPROM файл %1 + + + + Boards + + + Left Horizontal - - SQ + + Left Vertical - - SR + + Right Vertical - - LS2 + + Right Horizontal - - SP + + Aux. 1 - - SO + + Aux. 2 - - S4 + + + Unknown - - RS - - - - - SB - - - - - Serial Port - - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - Громкость. - -0 - Тишина. -1 - Без кнопок. -2 - Обычная. -3 - Громкая. -4 - Очень громкая. - - - - OFF - ВЫКЛ - - - - S-Port Mirror - - - - - Telemetry - - - - - SBUS Trainer - - - - - Debug - - - - + Rud - - - Mid value - - - - - Pot. 4 - - - - - Pot. 3 - - - - - Pot. 2 - - - - - Pot. 1 - - - - - PPM 1 - - - - - Stick 3 - - - - - - Negative span - - - - - - Positive span - - - - - Stick 1 - - - - - PPM 2 - - - - - Stick 2 - - - - - Stick 4 - - - - - v - В - - - - PPM Multiplier - PPM множитель - - - - PPM 3 - - - - - PPM 4 - - - - - Battery Offset - - - - - Current Offset - - - - - S1 - - - - - S2 - - - - - S3 - - - - - SA - - - - + Ele - - Ail - - - - + Thr - - SC - - - - - LS - - - - - SD - - - - - SE - - - - - SF - - - - - SG - - - - - SH - - - - - SI - - - - - SJ - - - - - SK - - - - - SL - - - - - SM - - - - - SN - - - - - RS2 - - - - - Bluetooth + + Ail CalibrationPanel - - - - None + + Negative span - - 2 Positions Toggle + + Mid value - - 2 Positions + + Positive span + + + + + CategorizedStorageFormat + + + Can't extract RADIO/radio.bin - - 3 Positions + + Can't extract RADIO/models.txt - - Pot with detent - + + Can't extract %1 + Не удалось извлечь %1 - - Multipos switch - - - - - Pot without detent - - - - - Slider with detent + + Error loading models Channels - + Name - + Название - + Min Мин - + Max Макс - + Subtrim - + Субтриммер - + Direction - + Направление - + Curve Кривая - + PPM Center - + Linear Subtrim + Линайный субтриммер + + + + CH%1 - - Channel %1 + + Popup menu available - + + Copy + Копировать + + + + Cut + Вырезать + + + + Paste + Вставить + + + + Clear + Очистить + + + + Insert + Вставка + + + + Delete + Удалить + + + + Move Up + Сдвинуть вверх + + + + Move Down + Сдвинуть вниз + + + + Clear All + Очистить всё + + + --- - + INV + + ChecklistDialog + + + Edit Checklist + + + + + Line nn, Col nn + + + + + &Import... + + + + + &Cancel + + + + + &OK + + + + + Please note, the maximum width displayable is radio model limited. Also, renaming the model will break the link to this checklist file. + + + + + File: unknown + + + + + Open Checklist + + + + + Checklist Files (*.txt) + + + + + + + + + Model Checklist + + + + + Cannot open file for writing %1: +%2. + + + + + Cannot write to file %1: +%2. + + + + + Cannot write file %1: +%2. + Не удается записать файл %1: +%2. + + + + Cannot open file %1: +%2. + + + + + Cannot read file %1: +%2. + + + + + Line %1, Col %2 + + + + + Companion + + + The saved settings could not be imported, please try again or continue with current settings. + + + + + Import from File + + + + + Import from v%1 + + + + + Do not import + + + + + We have found possible Companion settings backup file(s). +Do you want to import settings from a file? + + + + + Import settings from a file, or start with current values. + + + + + We have found existing settings for Companion version: %1. +Do you want to import them? + +If you have a settings backup file, you may import that instead. + + + + + Select %1: + + + + + Save application settings to file... + + + + + Load application settings from file or previous version... + + + + + Reset ALL application settings to default and remove radio profiles... + + + + + Exit before settings initialization and application startup. + + + + + Print version number and exit. + + + + + Print this help text. + + + + + Reset ALL application settings to default values and remove radio profiles, are you sure? + + + + + Would you like to perform a backup first? + + + + + Application settings were reset and saved. + + + + + OpenTX Companion + + + + + Information + + + + + Warning + Звук + + + + Error + Ошибка + + + + files + + + + + Radio and Models settings + + + + + Application Settings + Настройки приложения + + + + Select or create a file for exported Settings: + + + + + Press the 'Retry' button to choose another file. + + + + + Simulator for this firmware is not yet available + + + + + Uknown error during Simulator startup. + + + + + Simulator Error + + + + + Data Load Error + + + + + Error occurred while starting simulator. + + + + + settings + + + + + <p><b>Welcome to OpenTX %1.</b></p><p>As the first step, please configure the initial Radio Profile by selecting your Radio Type, Menu Language, and Build Options.</p><p>You may also want to take this time to review the other available options in the displayed Settings dialog.</p><p>After saving your settings, we recommend you download the latest firmware for your radio by using the <i>File -&gt; Download</i> menu option.</p><p>Please visit <a href='http://www.open-tx.org'>open-tx.org</a> for latest news, updates and documentation. Thank you for choosing OpenTX!</p>- The OpenTX Team. + + + + + <p><b>Thank you for upgrading to OpenTX %1.</b></p><p>This is a major upgrade that adds and modifies a lot of things, so please make sure that you read release notes carefully to learn about the changes, and thoroughly check each of your models for proper function.</p><p>Please visit <a href='http://www.open-tx.org'>open-tx.org</a> for release notes and other documentation.</p>- The OpenTX Team. + + + + + <p>The radio type in the selected profile does not exist. Using the default type instead.</p> <p><b>Please update your profile settings!</b></p> + + + CompareDialog Compare Models - + Сравнение моделей - - Drag first model here - + + To compare models, drag and drop them anywhere in this window. + Чтобы сравнить модели перетащите их в это окно. - - Drag second model here - - - - + Close - + Закрыть - + + Style + Стиль + + + Print - + Печать - + Print to file - + В файл - - No name - + + Unnamed Model %1 + Неизвестная модель %1 - + + Click to remove this model. + Нажмите, чтобы убрать эту модель. + + + Print Document - + Распечатать - + Select PDF output file - + PDF файл для сохранения ConclusionPage - + OK, I understand. - - - - - ContributorsDialog - - - OpenTX Contributors - - - - - Main Developers - - - - - Other contributors - - - - - Companies and projects who have donated to OpenTX - - - - - People who have donated to OpenTX - - - - - Honors go to Rafal Tomczak (RadioClone), Thomas Husterer (th9x) and Erez Raviv (er9x and eePe) - - - - - OpenTX Blacklist - - - - - monthly - + Хорошо, я понял. CopyProcess - - - - Error - Ошибка - - - + Write error - + Cannot write %1 (reason: %2) - + Cannot open %1 (reason: %2) + + CreditsDialog + + + OpenTX Contributors + + + + + Honors go to Rafal Tomczak (RadioClone), Thomas Husterer (th9x) and Erez Raviv (er9x and eePe) + + + + + OpenTX Blacklist + + + + + Main developers + + + + + Translators + + + + + Companies and projects who have donated to OpenTX + + + + + People who have donated to OpenTX + + + + + Other contributors + + + + + monthly + + + + + CurveData + + + CV + + + CurveGroup - + Diff - + Expo - + Func - + Curve Кривая + + CurveReference + + + Diff(%1) + + + + + Expo(%1) + + + + + Function(%1) + + + + + Curve(%1) + + + Curves Fixed X - + Фиксированный X Custom X - + Произвольный X @@ -1168,356 +1395,933 @@ May be different from firmware language - + Curve type - + Тип кривой Curve Creator - + Параметры кривой - + Y at X=0 - + + Point size + Размер точки + + + Y at X=100 - + Both - + Обе - + x>0 - + x<0 - + Apply - + Применить - + Side - + Сторона - + Y at X=-100 - + Coefficient - + Коэффициент Curve name + Название кривой + + + + Curve %1 + Кривая %1 + + + + Popup menu available - - Curve %1 - Кривая %1 - - - + %1 points - + Linear - + Линейная - + Single Expo - + Экспонента - + Symmetrical f(x)=-f(-x) - + Симметричная f(x)=-f(-x) - + Symmetrical f(x)=f(-x) - + Симметричная f(x)=f(-x) - + Copy - + Копировать - + Paste - + Вставить - + Clear - + Очистить - + Clear all curves - + Удалить все кривые - + Are you sure you want to reset curve %1? - + Вы действительно хотите сбросить настройки Кривой %1? - + Are you sure you want to reset all curves? - + Вы действительно хотите удалить все кривые? - + Editing curve %1 + Редактирование кривой %1 + + + + Not enough free points in EEPROM to store the curve. + + + + + CustomFunctionData + + + GF - - Not enough free points in EEPROM to store the curve. + + SF + + + + + Override %1 + + + + + Trainer + + + + + Trainer RUD + + + + + Trainer ELE + + + + + Trainer THR + + + + + Trainer AIL + + + + + Instant Trim + + + + + Play Sound + + + + + Haptic + + + + + Reset + + + + + Set Timer %1 + + + + + Vario + + + + + Play Track + + + + + Play Both + + + + + Play Value + + + + + Play Script + + + + + SD Logs + + + + + Volume + + + + + Backlight + + + + + Screenshot + + + + + Background Music + + + + + Background Music Pause + + + + + Adjust %1 + + + + + SetFailsafe Int. Module + + + + + SetFailsafe Ext. Module + + + + + RangeCheck Int. Module + + + + + RangeCheck Ext. Module + + + + + Bind Int. Module + + + + + Bind Ext. Module + + + + + Timer1 + + + + + Timer2 + + + + + Timer3 + + + + + Flight + + + + + Telemetry + + + + + Rotary Encoder + + + + + REa + + + + + REb + + + + + s + + + + + + + <font color=red><b>Inconsistent parameter</b></font> + + + + + Value + + + + + played once, not during startup + + + + + repeat(%1s) + + + + + DISABLED + + + + + CFN CustomFunctionsPanel - + Switch Тумблер - + Action - + Parameters - + Enable + Включить + + + + Popup menu available - + SF%1 - + GF%1 - + ON - - Error - Ошибка - - - - Unable to find sound file %1! + + Error occurred while trying to play sound, possibly the file is already opened. (Err: %1 [%2]) - - &Delete - Удалить + + Unable to find or open sound file: +%1 + - + + Copy + + + + + Cut + + + + + Paste + + + + + Clear + + + + + Insert + + + + + Move Up + + + + + Move Down + + + + + Clear All + + + + + Value + Значение + + + + Source + Источник + + + + GVAR + + + + + Increment + + + + Delete Удалить + + + CustomizeSplashDialog - - &Copy - Копировать - - - - Ctrl+C + + Transmitter Splash Screen Editor - - &Cut - Вырезать + + + Invert + Инверт - - Ctrl+X + + + Load FW - - &Paste - Вставить + + + Load Pict + - - Ctrl+V + + + Load Profile + + + + + + Save + + + + + + Open Splash Library + + + + + + + + ... + ... + + + + FW: %1 + + + + + Pict: %1 + + + + + Profile image + + + + + Open Firmware File + + + + + Can not load embedded image from firmware file %1. + + + + + Open Image to load + + + + + Images (%1) + Изображения (%1) + + + + Cannot load the image file %1. + + + + + Cannot load profile image %1. + + + + + Cannot load the library image %1. + + + + + File Saved + + + + + The image was saved to the file %1 + + + + + Image Refresh Error + + + + + Failed to refresh image from file %1 + + + + + File Save Error + + + + + Failed to write image to %1 CyclicPage - + 90 - + 15 сек. {90?} - + 120 - + 15 сек. {120?} - + 120x + 15 сек. {120x?} + + + + 140 + 15 сек. {140?} + + + + DataField + + + Conversion error on field %1 - - 140 + + Switch + Тумблер + + + + Switch + + + + + cannot be exported on this board! + + + + + Source + Источник + + + + Source %1 cannot be exported on this board! + + + + + OpenTX only accepts %1 points in all curves + + + + + OpenTx only accepts %1 points in all curves + + + + + + OpenTX on this board doesn't accept this function + + + + + OpenTX doesn't accept this radio protocol DebugOutput - + Debug Output + + + <html><head/><body><p>Enable or disable the filter. If the button won't stay enabled, it is likely there is a syntax error in the Regular Expression entered.</p></body></html> + + + + + Filter: + + + + + <html><head/><body><p>Enter filter text here. Click the help/info button for details about using the filter. </p><p> +To <b>remove a remembered entry</b> from the filter list, first choose it, and then press <code>Shift-Delete</code> (or <code>Shift-Backspace</code>) key combination.</p></body></html> + + + + + Buffer: + + + + + Number of lines to keep in display. + + + + + Filter &Help + + + + + Show information about using the filter. + + + + + Word &Wrap + + + + + Toggle word wrapping on/off. + + + + + &Clear + + + + + Clear the output window of all text. + + + + + Enable &Filter + + + + + Turn the filter on/off. + + + + + <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>The filter supports two syntax types: basic matching with common wildcards as well as full Perl-style (<code>pcre</code>) Regular Expressions.</p><p>By default a filter will only show lines which match (<b>inclusive</b>). To make an <b>exclusive</b> filter which removes matching lines, prefix the filter expression with a <kbd>!</kbd> (exclamation mark).</p><p>To use <b>Regular Expressions</b> (RegEx), prefix the filter text with a <kbd>/</kbd> (slash) or <kbd>^</kbd> (up caret). <ul><li>Put the <kbd>/</kbd> or <kbd>^</kbd> after the exclusive <kbd>!</kbd> indicator if you're using one.</li><li>By default the match is case-sensitive. To make it insensitive, add the typical <kbd>/i</kbd> (slash i) operator at the end of your RegEx.</li><li>If you use a caret (^) to denote a RegEx, it will become part of the Reg. Ex. (that is, matches from start of line).</li><li>If the RegEx is invalid, the filter edit field should show a red border and you will not be able to enable the filter.</li><li>A useful resource for testing REs (with a full reference) can be found at <a href="http://www.regexr.com/">http://www.regexr.com/</a></li></ul></p><p>To use <b>basic matching</b> just type any text.<ul><li>Wildcards: <kbd>*</kbd> (asterisk) matches zero or more of any character(s), and <kbd>?</kbd> (question mark) matches any single character.</li><li>The match is always case-insensitive.</li><li>The match always starts from the beginning of a log line. To ignore characters at the start, use a leading <kbd>*</kbd> wildcard.</li><li>A trailing <kbd>*</kbd> is always implied (that is, matches anything to the end of the log line). To avoid this, use a RegEx.</li><li>You can match literal wildcard characters by prefixing them with a <kbd>\</kbd> (backslash) character (eg. "foo\*bar" matches "foo*bar").</li></ul></p><p>After <b>editing text</b>, press ENTER or TAB key (or click anywhere outside the box) to update the filter.</p><p>To <b>remove an entry</b> from the filter selector list, first choose it, and while in the line editor press <kbd>Shift-Delete</kbd> (or <kbd>Shift-Backspace</kbd>) key combination. The default filters cannot be removed. Up to 50 filters are stored.</p></body></html> + + + + + Debug Console Filter Help + + - EepromInterface + DownloadDialog - + + Downloading: + + + + + Unable to save the file %1: %2. + + + + + Download failed: %1. + + + + + EEPROMInterface + + Possible causes for this: - + - Eeprom is from a newer version of OpenTX - + - Eeprom is not from OpenTX - + - Eeprom is not from Th9X - + - Eeprom is not from Gruvin9X - + - Eeprom is not from ErSky9X - + - Eeprom is not from Er9X - + - Eeprom size is invalid - + - Eeprom file system is invalid - + - Eeprom is from a unknown board - + - Eeprom is from the wrong board - + - Eeprom backup not supported - + - Something that couldn't be guessed, sorry - + Warning: - - + + - Your radio probably uses a wrong firmware, eeprom size is 4096 but only the first 2048 are used - + - Your eeprom is from an old version of OpenTX, upgrading! - You should 'save as' to keep the old file as a backup. + To keep your original file as a backup, please choose File -> Save As specifying a different name. + + + + + EepeFormat + + + Unable to open %1: %2 - - Warnings! + + Invalid EEPROM file %1 ElevonsPage - + <br>First Elevon Channel: + Первый канал элевонов: + + + + Second Elevon Channel: + Второй канал элевонов: + + + + ExpoData + + + INP - - Second Elevon Channel: + + (@%1) @@ -1526,7 +2330,7 @@ May be different from firmware language Weight - Вес + Вес @@ -1538,42 +2342,42 @@ May be different from firmware language Offset - Смещен. + Смещение The source for the mixer - Источник для микшера + Input name - + Название Входа Flight modes - + Полётные режимы Switch - Тумблер + Тумблер Source - Источник + Источник Line name - + Название строки Stick Side - + Сторона стика @@ -1583,32 +2387,32 @@ May be different from firmware language Include Trim - Исп. трим + Использовать триммер No - + Нет Yes - + Да Curve - Кривая + Кривая Curve applied to the source. - + Кривая применяется к источнику. NEG - + МИНУС @@ -1619,131 +2423,747 @@ May be different from firmware language Switch used to enable the line. If blank then the input is considered to be "ON" all the time. - + Тумблер используется для активации линии. +Если не указан, тогда Вход всегда активен. POS - + ПЛЮС ALL + ОБЕ + + + + Edit %1 + Редактирование %1 + + + + Popup menu available - - Edit %1 + + Clear All + + + + + Set All + + + + + Invert All + Инвертировать всё + + + + ExportableTableView + + + Select All + + + + + Copy selection as TAB-delimited text + + + + + Copy selection as cooma-delimited text (CSV) + + + + + Copy selection as pipe-delimited text + + + + + Copy selection as HTML + + + + + Save selection to file + + + + + Tab-delimited text + + + + + Comma-delimited text + + + + + Pipe-delimited text + + + + + HTML + + + + + Save to file FblPage - + Throttle Channel: - + Yaw Channel: - + Pitch Channel: - + Roll Channel: + + FileSyncDialog + + + Synchronize Files + + + + + Are you sure you wish to abort the sync? + + + + + Source Folder: + + + + + Destination Folder: + + + + + %1%2 Both directions, to destination folder first + + + + + %1%2 Both directions, to source folder first + + + + + %1 Only from source folder to destination folder + + + + + %1 Only from destination folder to source folder + + + + + How to handle overwriting files which already exist in the destination folder. + + + + + Copy only if newer and different (compare contents) + + + + + Copy only if newer (do not compare contents) + + + + + Copy only if different (ignore file time stamps) + + + + + Always copy (force overwite existing files) + + + + + Any size + + + + + Skip files larger than this size. Enter zero for unlimited. + + + + + Minimum reporting level. Events of this type and of higher importance are shown. +WARNING: High log rates may make the user interface temporarily unresponsive. + + + + + Skipped + + + + + Created + + + + + Updated + + + + + Errors Only + + + + + Test-run only + + + + + Run as normal but do not actually copy anything. Useful for verifying results before real sync. + + + + + Log Level: + + + + + Filters: + + + + + The "Include" filter will only copy files which match the pattern(s). +The "Exclude" filter will skip files matching the filter pattern(s). +The Include filter is evaluated first. + + + + + One or more file pattern(s) to exclude, separated by commas. +Blank means exclude none. ?, *, and [...] wildcards accepted. + + + + + One or more file pattern(s) to include, separated by commas. +Blank means include all. ?, *, and [...] wildcards accepted. + + + + + Include: + + + + + Exclude: + + + + + Case sensitive + + + + + + Follow links + + + + + Include hidden + + + + + Recursive + + + + + Skip empty + + + + + Apply filters + + + + + Filter Options: + + + + + Folder Options: + + + + + + Options + + + + + Show extra options + + + + + Reset to defaults + + + + + Close + Закрыть + + + + Sync. Direction: + + + + + Existing Files: + + + + + Max. File Size: + + + + + MB + + + + + KB + + + + + Abort + + + + + Start + + + + + Total: <b>%1</b>; Created: <b>%2</b>; Updated: <b>%3</b>; Skipped: <b>%4</b>; Errors: <font color=%6><b>%5</b></font>; + + + + + Current: <b>%1</b> of + + + + + Source folder not found. + + + + + Destination folder not found. + + + + + Source and destination folders are the same. + + + + + Firmware + + + Possibility to enable FAI MODE (no telemetry) at field + + + + + FAI MODE (no telemetry) always enabled + + + + + Channel values displayed in us + + + + + No OverrideCH functions available + + + + + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 + + + + + Enable non certified firmwares + + + + + Use alternative SQT5 font + + + + + + Disable HELI menu and cyclic mix support + + + + + + Disable Global variables + + + + + + Enable Lua custom scripts screen + + + + + Support for PPM internal module hack + + + + + Enable HELI menu and cyclic mix support + + + + + Global variables + + + + + Pots use in menus navigation + + + + + In model setup menus automatically set source by moving the control + + + + + In model setup menus automatically set switch by moving the control + + + + + No graphical check boxes and sliders + + + + + Battery graph + + + + + Don't use bold font for highlighting active items + + + + + Enable resetting values by pressing up and down at the same time + + + + + FrSky Taranis X9D+ + + + + + Disable RAS (SWR) + + + + + FrSky Taranis X9D+ 2019 + + + + + FrSky Taranis X9D + + + + + Haptic module installed + + + + + FrSky Taranis X9E + + + + + Confirmation before radio shutdown + + + + + Horus gimbals installed (Hall sensors) + + + + + FrSky Taranis X9-Lite + + + + + FrSky Taranis X9-Lite S + + + + + FrSky Taranis X7 / X7S + + + + + FrSky Taranis X-Lite S/PRO + + + + + FrSky Taranis X-Lite + + + + + FrSky Horus X10 / X10S + + + + + + Support for ACCESS internal module replacement + + + + + FrSky Horus X10 Express / X10S Express + + + + + FrSky Horus X12S + + + + + Use ONLY with first DEV pcb version + + + + + Jumper T12 / T12 Pro + + + + + Enable non certified R9M firmwares + + + + + + Support for MULTI internal module + + + + + Jumper T16 / T16+ / T16 Pro + + + + + Support for bluetooth module + + + + + Turnigy 9XR-PRO + + + + + 9X with AR9X board + + + + + 9X with Sky9x board + + + + + Turnigy 9XR + + + + + Turnigy 9XR with m128 chip + + + + + 9X with stock board + + + + + 9X with stock board and m128 chip + + + + + 9X with Gruvin9x board + + + + + DIY MEGA2560 radio + + + FirmwarePreferencesDialog Downloads - + Загрузки - + Check for updates - + Проверить наличие обновлений - - Voice - - - - - Set voice language. -May be different from firmware language - - - - - Download Voice - - - - - Download FW - - - - + Firmware - + Прошивка - + + Download firmware + Скачать прошивку + + + + Download SD contents + Скачать содержимое SD + + + Latest Download - + Загруженная версия: + + + + Unknown + неизвестная FlapsPage - + No - + Нет - + Yes, controlled by a single channel - + Да, управляются одним каналом - + Yes, controlled by two channels - + Да, управляются двумя каналами - + <br>First Flap Channel: - + <br>Первый канал закрылков: - + Second Flap Channel: - + Второй канал закрылков: FlashEEpromDialog - + Write Models and Settings to Radio - + Записать настройки и модели в передатчик Load... - + Выбрать... @@ -1752,19 +3172,23 @@ May be different from firmware language - Allows Companion to write to older version of the firmware Check Firmware compatibility + Проверить совместимость с передатчиком + + + + <html><head/><body><p>Saves a dated copy of your eeprom to the backup folder you specified in the Companion settings before writing the current model to the radio.</p></body></html> Backup before Write - + Сделать резервную копию @@ -1789,114 +3213,59 @@ May be different from firmware language Cancel - + Отмена Write to TX - + Записать - + Current profile: %1 - + Choose Radio Backup file - + Выберите файл с резервной копией - - - - - - - - - - - - Error - Ошибка - - - - Unable to find file %1! - Невозможно найти файл %1! - - - - - - Error opening file %1: -%2. - - - - - - Invalid Models and Settings File %1 - - - - - Error reading file %1: -%2. - Ошибка при считывании файла %1: -%2. - - - - Invalid Models and Settings file %1 - - - - - - - - Warning - Звук - - - + Wrong radio calibration data in profile, Settings not patched - + Wrong radio setting data in profile, Settings not patched - - + Cannot write file %1: %2. - Не удается записать файл %1: + Не удается записать файл %1: %2. - + Error writing file %1: %2. - Ошибка при записи файла %1: + Ошибка при записи файла %1: %2. - + The radio firmware belongs to another product family, check file and preferences! - + The radio firmware is outdated, please upgrade! - + Cannot check Models and Settings compatibility! Continue anyway? @@ -1906,47 +3275,47 @@ May be different from firmware language Flash Firmware - + Обновление прошивки Load... - + Выбрать... Date & Time - + Дата Variant - + Сборка Version - + Версия Use profile start screen - + Заставка из профиля Use firmware start screen - + Заставка из прошивки Use library start screen - + Заставка из библиотеки Use another start screen - + Другая заставка @@ -1956,228 +3325,205 @@ May be different from firmware language Check Hardware compatibility - + Проверить совместимость с передатчиком Backup and restore Models and Settings - + Сделать резервную копию настроек и моделей Cancel - + Отмена Write to TX - + Записать - + Open Firmware File - + Выбрать файл с прошивкой - - - - Warning - Звук - - - + %1 may not be a valid firmware file - + %1 - не прошивка - - - - - Error - Ошибка - - - The firmware file is not valid. - + Битый файл с прошивкой. - + There is no start screen image in the firmware file. - + Profile image %1 is invalid. - + Open image file to use as radio start screen - + Выбрать картинку для заставки - + Images (%1) - + Изображения (%1) - + Image could not be loaded from %1 - + The library image could not be loaded - + Splash image not found - + Файл с заставкой не найден - + Cannot save customized firmware - + Write Firmware to Radio - + Записать прошивку в передатчик - - + + Firmware check failed - + Не удалось проверить прошивку - + Could not check firmware from radio - + Не удалось проверить прошивку передатчика - + New firmware is not compatible with the one currently installed! - + Conversion failed - + Cannot convert Models and Settings for use with this firmware, original data will be used - + Невозможно сконвертировать модели и настройки для этой прошивки, будут использованы оригинальные данные - + Restore failed - + Could not restore Models and Settings to Radio. The models and settings data file can be found at: %1 - + Flashing done - + Обновление завершено FlashProcess - + Executable %1 not found - + Writing... - + Reading... - + Verifying... - + unknown - + ie: OpenTX for 9X board or OpenTX for 9XR board - + ie: OpenTX for M128 / 9X board or OpenTX for 9XR board with M128 chip - + ie: OpenTX for Gruvin9X board - + Your radio uses a %1 CPU!!! Please check advanced burn options to set the correct cpu type. - + Your radio uses a %1 CPU!!! Please select an appropriate firmware type to program it. - + You are currently using: %1 - - Your radio does not seem connected to USB or the driver is not installed!!! - -Please use ZADIG to properly install the driver. - - - - + Your radio does not seem connected to USB or the driver is not initialized!!!. - + Flashing done (exit code = %1) - + Flashing done with errors - + FUSES: Low=%1 High=%2 Ext=%3 @@ -2187,38 +3533,133 @@ Please use ZADIG to properly install the driver. Fade In - + Переход к режиму Fade Out - + Выход из режима Name - + Название Switch - Тумблер + Тумблер + + + + FlightModeData + + + FM + FlightModePanel + + + Popup menu available + + + + + Trim disabled + Триммер отключен + + Own Trim + Свой триммер + + + + Use Trim from Flight mode %1 + Использовать триммер Полётного режима %1 + + + + Use Trim from Flight mode %1 + Own Trim as an offset + Использовать триммер Полётного режима %1 + 'Свой триммер' как смещение + + + Rotary Encoder %1 - + + Name + Название + + + + Value source + Источник значений + + + + Value + Значение + + + + Unit + Ед. + + + + Prec + Точность + + + + Min + Мин + + + + Max + Макс + + + GVAR%1 - + + 0._ + + + + + 0.0 + + + + + + &Clear + + + + + + Clear + + + + + Clear all current Flight Mode properties? + + + + Popup enabled @@ -2226,39 +3667,71 @@ Please use ZADIG to properly install the driver. FlightModesPanel - + Flight Mode %1 - + Полётный режим %1 - + (%1) - + (%1) - + (default) - + (по умолчанию) FlybarSelectionPage - + Has Flybar - + Flybarless - + Flybar: + + FrSkyAlarmData + + + Yellow + Желтая + + + + Orange + Оранжевая + + + + Red + Красная + + + + FrSkyChannelData + + + + V + + + + + --- + + + FusesDialog @@ -2351,23 +3824,66 @@ p, li { white-space: pre-wrap; } - - + + Reset Radio Fuses - + Read Fuses from Radio + + GVarData + + + % + + + + + ? + + + + + 0._ + + + + + 0.0 + 15 сек. {0.0?} + + + + ?.? + + + + + GV + + + + + Own value + + + + + Flight mode %1 value + + + GeneralEdit - General Edit - Основная настройка + Radio settings + Параметры передатчика @@ -2377,14 +3893,14 @@ These will be relevant for all models in the same EEPROM. Это относится ко всем моделям сохраненным в EEPROM. - + Setup Настройка - + Trainer - + Тренер @@ -2397,40 +3913,52 @@ These will be relevant for all models in the same EEPROM. - + Global Functions - + Глобальные функции - - Hardware / Calibration - + + Hardware + Оборудование - - - Warning - Звук + + Calibration + Калибровка - + Wrong data in profile, radio calibration was not retrieved - + + Wrong data in profile, Switch/pot config not retrieved + + + + Wrong data in profile, hw related parameters were not retrieved - + Do you want to store calibration in %1 profile<br>overwriting existing calibration? - + Calibration and HW parameters saved. - + Параметры оборудования и калибровки сохранены. + + + + GeneralSettings + + + Radio Settings + Параметры передатчика @@ -2486,209 +4014,229 @@ These will be relevant for all models in the same EEPROM. - + Timeshift from UTC - + Смещение от UTC - + Voice Language - + Язык для голоса - + Country Code - + Регион - + Stick reverse - + Реверс стиков - + FAI Mode - + Режим FAI - - - If you enable FAI, you loose the vario, the play functions, the telemetry screen. This function cannot be disabled by the radio. - - - - + Adjust RTC - + Коррекция часов - + Vario pitch at max - + Макс. тон вариометра - - + + Hz - + Гц - + Speaker Volume - + Громкость динамика - + Backlight Switch - + Включение подсветки - + Sound Mode - + Режим звука - + Color 1 - + Цвет 1 - + Color 2 - + Цвет 2 - + Speaker Pitch (spkr only) - + Тон динамика - + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. - Если не равно нулю, то любое нажатие кнопок будет включать подсветку и выключать ее через указанное кол-во секунд. + Если не равно нулю, то любое нажатие кнопок будет включать подсветку и выключать её через указанное кол-во секунд. - + + + sec - сек + сек - + Backlight color - + Цвет фона - + Beeper - + - + Speaker - + Динамик - + BeeperVoice - + SpeakerVoice - - - Beep volume - - - - - Wav volume - - - - - Vario volume - - + Beep volume + Громкость писка + + + + Wav volume + Громкость Wav + + + + Vario volume + Громкость варио + + + Background volume - + Громкость фон. музыки - - + + ms - + мс - + Backlight Auto OFF after - + Отключать подсветку через - + Backlight flash on alarm - + Мигать подсветкой при увед. - + Vario pitch at zero - + Мин. тон вариометра - + Vario repeat at zero - + Повтор если вариометр 0 - + This is the switch selectrion for turning on the backlight (if installed). - Включение подсветки (при ее наличии). + Включение подсветки (при ее наличии). - - + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html> - Контраст LCD дисплея -Значения в пределах 20-45 + - + Backlight Brightness - + Яркость фона - + RotEnc Navigation - + Навигация крутилкой - + + Backlight OFF Brightness + Яркость отключенной подсветки + + + America - + Америка - + Japan - + Япония - + Europe + Европа + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + Если включить режим FAI, то будут работать только датчики RSSI и напряжения. Эту функцию нельзя отключить в передатчике. + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. - + + Owner Registration ID + + + + + aaaaaaAA + + + + Mode selection: Mode 1: @@ -2711,389 +4259,431 @@ Mode 4: - + Mode 1 (RUD ELE THR AIL) - + Mode 2 (RUD THR ELE AIL) - + Mode 3 (AIL ELE THR RUD) - + Mode 4 (AIL THR ELE RUD) - + <html><head/><body><p>Channel order</p><p><br/></p><p>Defines the order of the default mixes created on a new model.</p></body></html> - + <html><head/><body><p>Порядок каналов</p><p><br/></p><p>Задает порядок микшеров при создании новой модели.</p></body></html> - + R E T A - + R E A T - + R T E A - + R T A E - + R A E T - + R A T E - + E R T A - + E R A T - + E T R A - + E T A R - + E A R T - + E A T R - + T R E A - + T R A E - + T E R A - + T E A R - + T A R E - + T A E R - + A R E T - + A R T E - + A E R T - + A E T R - + A T R E - + A T E R - + + Power On Delay + Пауза при включении + + + + Jack Mode + Режим разъема наушников + + + + + Ask on Connect + Спросить при подключении + + + + Audio + Звук + + + + Trainer + Тренер + + + + DMS + + + + + Low EEPROM Warning + Предупреждать, если мало памяти (EEPROM) + + + + RSSI Poweroff Warning + Предупреждать, если есть сигнал RSSI + + + Stick Mode - Режим стиков + Режим стиков - + + Power Off Delay + Пауза при выключении + + + Metric - + Метрическая (метры) - + Imperial - + Имперская (мили, футы) - + Default Channel Order - Порядок следов. каналов + Порядок следов. каналов - + GPS Coordinates - + GPS координаты - + Min - Мин + Мин - - + + v - В + В - + Max - Макс + Макс - - Low Memory Warning - - - - + Inactivity Timer - Таймер активности + Таймер активности - + Show Splash Screen on Startup - Показывать заставку + Показывать заставку при включении - + Contrast - Конраст + Конраст - + Battery Meter Range - + Напряжение аккумулятора - + Haptic Strength - + Сила вибрации - + LCD Display Type - + Тип LCD экрана - + "No Sound" Warning - + Предупреждать, если отключен звук - + Battery Warning - Напряж. при разряде + Напряж. при разряде - + Haptic Length - + Продолжительность вибрации - + MAVLink Baud Rate - + Скорость MAVLink - - + + Quiet - тихо + Тихо - + Only Alarms - + Только предупреждения - - + + No Keys - без кнопок + Все, кроме кнопок - - + + All - + Все - + Battery warning voltage. This is the threashhold where the battery warning sounds. Acceptable values are 5v..10v - Предупреждение о разряде. + Предупреждение о разряде аккумулятора. Значение при котором сработает сигнализация. Диапазон 5В..10В - + Standard - + Стандартный - + Optrex - + Optrex - + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. - Если не равно нулю, начнет бипать при отсутсвии активности через указанное кол-во минут. + Если не равно нулю, то передатчик начнет пищать при отсутсвии активности через указанное кол-во минут. - + min - мин + мин - - + + Show splash screen on startup - Показывать заставку при включении + Показывать заставку при включении - + --- - + 2s - + 2 сек. - + 3s - + 3 сек. - + 4s - + 4 сек. - + 6s - + 6 сек. - + 8s - + 8 сек. - + 10s - + 10 сек. - + 15s - + 15 сек. - + 4800 Baud - + 4800 - + 9600 Baud - + 9600 - + 14400 Baud - + 14400 - + 19200 Baud - + 19200 - + 38400 Baud - + 38400 - + 57600 Baud - + 57600 - + 76800 Baud - + 76800 - + 115200 Baud - + 115200 - - + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3112,72 +4702,87 @@ p, li { white-space: pre-wrap; } "Тишина" - Предупреждение о "тихом" режиме (без звука) - - + + X-Short - + Очень кратко - - + + Short - + Кратко - - + + Normal - нормально + Нормальная - - + + Long - долго + Долго - - + + X-Long - - - - - hh° (N/S) mm' ss''.dd - + Очень долго - + NMEA - + Play Delay (switch mid position) - + Пауза воспр. (тумблер в сред. полож.) - + + USB Mode + Режим работы USB порта + + + + Joystick (HID) + Джойстик + + + + USB Mass Storage + Съемный диск + + + + USB Serial (CDC) + Последовательный порт + + + Measurement Units - + Система мер - + Haptic Mode - + Режим вибрации - + Beeper Length - + Продолжительность писка - + Beeper Mode - Режим бипов + Уведомления (писк) - + Beeper volume 0 - Quiet. No beeps at all. @@ -3185,25 +4790,145 @@ p, li { white-space: pre-wrap; } 2 - Normal. 3 - Loud. 4 - Extra loud. - Громкость. + Громкость. -0 - Тишина. -1 - Без кнопок. +0 - Тишина. Никаких звуков. +1 - Без кнопок. Обычный писк на уведомления, но кнопки не пищат 2 - Обычная. 3 - Громкая. 4 - Очень громкая. - + Alarms Only - + Только предупреждения GeneralSetupPanel - - If you enable FAI, you loose the vario, the play functions, the telemetry screen. + + OFF + Всегда выключена + + + + Keys + Кнопки + + + + Sticks + Стики + + + + Keys + Sticks + Кнопки + Стики + + + + ON + Всегда включена + + + + English + + + + + Dutch + + + + + French + + + + + Italian + + + + + German + + + + + Czech + + + + + Slovak + + + + + Spanish + + + + + Polish + + + + + Portuguese + + + + + Russian + + + + + Swedish + + + + + Hungarian + + + + + No + Нет + + + + RotEnc A + + + + + Rot Enc B + + + + + Rot Enc C + + + + + Rot Enc D + + + + + Rot Enc E + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. Are you sure ? @@ -3212,18 +4937,366 @@ Are you sure ? GyroPage - + No - + Нет - + Yes, controled by a switch + Да, управляется тумблером + + + + Yes, controlled by a pot + Да, управляется крутилкой + + + + Hardware + + + Form - - Yes, controlled by a pot + + SM + + + + + SC + + + + + Device Name: + + + + + SR + + + + + S4 + + + + + RS2 + + + + + Bluetooth + + + + + Current Offset + + + + + PPM 2 + + + + + SD + + + + + SJ + + + + + SA + + + + + S1 + + + + + S3 + + + + + SP + + + + + SF + + + + + LS + + + + + Battery Offset + + + + + Serial Port + + + + + SG + + + + + S2 + + + + + Ele + + + + + SI + + + + + SL + + + + + SQ + + + + + SO + + + + + PPM 1 + + + + + PPM 4 + + + + + SB + + + + + v + + + + + PPM Multiplier + + + + + Rud + + + + + ADC Filter + + + + + S5 + + + + + Antenna + + + + + PPM 3 + + + + + Ail + + + + + SK + + + + + SE + + + + + LS2 + + + + + Thr + + + + + SH + + + + + OFF + + + + + S-Port Mirror + + + + + Telemetry + + + + + SBUS Trainer + + + + + Debug + + + + + RS + + + + + SN + + + + + RTC Batt Check + + + + + HardwarePanel + + + + + None + + + + + 2 Positions Toggle + + + + + 2 Positions + + + + + 3 Positions + + + + + Pot with detent + + + + + Multipos switch + + + + + Pot without detent + + + + + Slider with detent + + + + + OFF + ВЫКЛ + + + + Enabled + + + + + Telemetry + + + + + Trainer + + + + + Internal + + + + + Ask + + + + + Per model + + + + + Internal + External + + + + + External @@ -3257,22 +5330,22 @@ Are you sure ? 120 - + 15 сек. {120?} 120X - + 15 сек. {120X?} 140 - + 15 сек. {140?} 90 - + 15 сек. {90?} @@ -3303,236 +5376,385 @@ Are you sure ? HeliPage - + Throttle Channel: - + Yaw Channel: - + Pitch Channel: - + Roll Channel: - InputsPanel + HexEepromFormat - - - Move Up + + Invalid EEPROM File %1 - - + + Cannot open file %1: +%2. + + + + + Error writing file %1: +%2. + Ошибка при записи файла %1: +%2. + + + + InputsPanel + + + + Move Up + Сдвинуть вверх + + + + Ctrl+Up - - + + Move Down - + Сдвинуть вниз - - + + Ctrl+Down - + Clear All Inputs - + Очистить все Входы - + Not enough available inputs! - + Delete Selected Inputs? - + Удалить выбранные Входы? - + &Add - Добавить + Добавить - + Ctrl+A - + &Edit - Правка + Редактировать - + Enter - Ввод + - + &Delete - Удалить + Удалить - + Delete - Удалить + - + &Copy - Копировать + Копировать - + Ctrl+C - + &Cut - Вырезать + Вырезать - + Ctrl+X - + &Paste - Вставить + Вставить - + Ctrl+V - + Du&plicate - + Сделать копию - + Ctrl+U - + Clear Inputs? + Очистить Входы? + + + + Really clear all the inputs? + Точно удалить все Входы? + + + + LimitData + + + INV - - Really clear all the inputs? + + NOR + + + + + CH + + + + + LimitsGroup + + + GV + + + + + LogicalSwitchData + + + --- + + + + + a>x + + + + + a<x + + + + + |a|>x + + + + + |a|<x + + + + + AND + + + + + OR + + + + + XOR + + + + + a=b + + + + + a!=b + + + + + a>b + + + + + a<b + + + + + a>=b + + + + + a<=b + + + + + d>=x + + + + + |d|>=x + + + + + a=x + + + + + a~x + + + + + Timer + + + + + Sticky + + + + + Edge + + + + + Unknown + + + + + L + + + + + LSW LogicalSwitchesPanel - + V1 - + V2 - + Duration - + Delay Задержка - + + Popup menu available + + + + + (instant) + + + + + (infinite) + + + + Function Функция - + AND Switch - - L%1 - - - - + &Delete Удалить - - Delete - Удалить - - - + &Copy Копировать - - - (no release) - - - - - (infinite) - - - - - Ctrl+C - - - - + &Cut Вырезать - - Ctrl+X - - - - + &Paste Вставить - - - Ctrl+V - - LogsDialog @@ -3542,146 +5764,166 @@ Are you sure ? - + Filename - + Open LogFile - + Zoom - + + Save session CSV + + + + X - + Y - + Reset - + Fly sessions - + Telemetry logs - + Time (hh:mm:ss) - + Plot Title Change - + New plot title: - + Axis Label Change - + New axis label: - + Graph Name Change - + New graph name: - - Error: no GPS data not found - - - - + The column containing GPS coordinates must be named "GPS". The columns for altitude "GAlt" and for speed "GSpd" are optional - - Error - Ошибка + + Error: no GPS data found + - + Cannot write file %1: %2. Не удается записать файл %1: %2. - + + Cursor A: %1 m + + + + + Cursor B: %1 m + + + + + Time delta: %1 + + + + + Climb rate: %1 m/s + + + + Select your log file - + Available fields - + The selected logfile contains %1 invalid lines out of %2 total lines - + total duration - + duration - + (L1) - + (R1) - + (L2) - + (R2) @@ -3689,119 +5931,81 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt MainWindow - - - - + + File loaded Файл загружен - - - + + Save As - Сохранить как... + Сохранить как - - + + No updates available at this time. - - Unable to check for updates. - - - - + Executable (*.exe) - + + Would you like to launch the installer? - - + + File saved Файл записан - - Display previous warning again at startup ? - - - - + New release available - - - Error - Ошибка - - - + Error opening file %1: %2. - - Compilation server termporary failure, try later - - - - + Compilation server too busy, try later - - - Unknown server failure, try later - - - - - Firmware %1 does not seem to have ever been downloaded. -Release %2 is available. -Do you want to download it now? - -We recommend you view the release notes using the button below to learn about any changes that may be important to you. - - - - - - Yes - - - - - - No - - - - - - Release Notes - - - - Do you want to download release %1 now ? - + Unknown server failure, try later + Неизвестная ошибка, попробуйте позже - + + + Yes + Да + + + + + No + Нет + + + + + Release Notes + Информация + + + A new version of %1 firmware is available: - current is %2 - newer is %3 @@ -3812,725 +6016,887 @@ We recommend you view the release notes using the button below to learn about an - - The selected language will be used the next time you start Companion. - - - - + The new theme will be loaded the next time you start Companion. - - The icon size will be used the next time you start Companion. - - - - - + + Synchronize SD - + Синхронизация содержимого SD - - Firmware updates - - - - - Current firmware does not provide release notes informations. - - - - + OpenTX Home Page: <a href='%1'>%1</a> - + If you've found this program useful, please support by <a href='%1'>donating</a> - + New - + Новый - + Open... - + Открыть... - + Save - + Сохранить - + Save As... - + Сохранить как... - - Copy Model - - - - - Paste Model - - - - - Load backup from file - - - - + Compare models - + Сравнить модели - + Exit the application Выйти из программы - + List available programmers Показать список программаторов - + Show fuses dialog Показать диалог установки фьюзов - + Show the application's About box Показать окно "О программе" - + Set Menu Language - + Язык меню - - Show the list of radio profiles - - - - + Write - + + Use default system language. + Использовать язык системы. + + + + Use %1 language (some translations may not be complete). + + + + %2 - + + Alt+%1 + + + + New Radio - + Checking for updates - + A new version of Companion is available (version %1)<br>Would you like to download it? - - A new release of Companion is available, please check the OpenTX website! - - - - - Not enough memory for all the selected firmware options - - - - - Compilation server requires registration, please check OpenTX web site - - - - + About Companion - + О программе OpenTX Companion - + A monochrome black icon theme - + Монохромная черная тема - + A monochrome white icon theme - + Монохромная белая тема - + A monochrome blue icon theme + Монохромная синяя тема + + + + Diskimage (*.dmg) - + + Would you like to open the disk image to install the new version? + + + + + No Companion release candidates are currently being served for this version, please switch release channel + + + + + No nightly Companion builds are currently being served for this version, please switch release channel + + + + + No Companion release builds are currently being served for this version, please switch release channel + + + + + Companion update check failed, new version information not found. + + + + + A new release of Companion is available, please check the <a href='%1'>OpenTX website!</a> + + + + + Not enough flash available on this board for all the selected options + + + + + Compilation server temporary failure, try later + + + + + Compilation error + + + + + Invalid firmware + + + + + Invalid board + + + + + Invalid language + + + + + No firmware release candidates are currently being served for this version, please switch release channel + + + + + No firmware nightly builds are currently being served for this version, please switch release channel + + + + + No firmware release builds are currently being served for this version, please switch release channel + + + + + Release candidate builds are now available for this version, would you like to switch to using them? + + + + + Channel changed to RC, please restart the download process + + + + + Official release builds are now available for this version, would you like to switch to using them? + + + + + Channel changed to Release, please restart the download process + + + + + This radio (%1) is not currently available in this firmware release channel + + + + + Firmware update check failed, new version information not found or invalid. + + + + + Firmware %1 does not seem to have ever been downloaded. +Version %2 is available. +Do you want to download it now? + +We recommend you view the release notes using the button below to learn about any changes that may be important to you. + Прошивка %1 не была загружена. +Доступна версия %2. +Хотите её скачать? + +Мы рекомендуем вначале воспользоваться кнопкой "Информация", чтобы прочесть обо всех новшествах. + + + + + Do you want to download version %1 now ? + Вы хотите скачать версию %1? + + + + Ignore this version %1? + Игнорировать версию %1? + + + + There are unsaved file changes which you may lose when switching radio types. + +Do you wish to continue? + + + + + No local SD structure path configured! + + + + + No Radio or SD card detected! + + + + + Local Folder + + + + + Radio Folder + + + + + Models and Settings read + + + + + + This function is not yet implemented + + + + + Close + Закрыть + + + + Close Models and Settings file + Закрыть окно с моделями с настройками + + + + List of recently used files + Список недавно открытых файлов + + + + Radio Profiles + Профили передатчиков + + + + Create or Select Radio Profiles + Выбрать профиль передатчика или создать новый + + + + Release notes... + Описание версии ПО... + + + + Show release notes + Показать информацию о текущей версии ПО + + + + Create a new Radio Settings Profile + Создать новый профиль передатчика + + + + Copy Current Radio Profile + Копировать текущий профиль передатчика + + + + Duplicate current Radio Settings Profile + Копировать текущий профиль передатчика + + + + Delete Current Radio Profile... + Удалить текущий профиль передатчика... + + + + Delete the current Radio Settings Profile + Удалить текущий профиль передатчика + + + + Export Application Settings.. + Экспорт настроек приложения... + + + + Save all the current %1 and Simulator settings (including radio profiles) to a file. + Сохранить все текущие настройки %1 и симулятора (включая профиль передатчика) в файл. + + + + Import Application Settings.. + Импорт настроек приложения... + + + + Load %1 and Simulator settings from a prevously exported settings file. + Чтение ранее экспортированных настроек %1 и симулятора из файла. + + + + Tabbed Windows + В виде закладок + + + + Use tabs to arrange open windows. + Использовать закладки для переключения между окнами. + + + + Tile Windows + По горизонтали + + + + Arrange open windows across all the available space. + Выравнивание открытых окон по горизонтали. + + + + Cascade Windows + Каскадом + + + + Arrange all open windows in a stack. + Выравнивание открытых окон каскадом. + + + + Close All Windows + Закрыть все окна + + + + Closes all open files (prompts to save if necessary. + Закрыть все окна (с запросом на сохранение изменений). + + + + Window + Окно + + + + Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete. + Некоторые сообщения не будут переведены, пока вы не перезапустите Companion. Учтите, что не все сообщения переведены на выбранный язык. + + + + Ctrl+Shift+S + + + + + Ctrl+Alt+L + + + + + Ctrl+Alt+D + + + + + Ctrl+Alt+R + + + + Small - + Маленькие - + Use small toolbar icons - + Использовать маленькие иконки - + Use normal size toolbar icons - + Использоват иконки стандартного размера - + Normal - нормально + Стандартные - + Use big toolbar icons - + Использовать большие иконки - + Big - + Большие - + Use huge toolbar icons - + Использовать огромные иконки - + Huge + Огромные + + + + - Copy - + + Companion :: Open files warning + + + + + Please save or close modified file(s) before deleting the active profile. + + + + + Not possible to remove profile + Невозможно удалить профиль + + + + The default profile can not be removed. + Нельзя удалить профиль по умолчанию. + + + + Confirm Delete Profile + + + + + Are you sure you wish to delete the "%1" radio profile? There is no way to undo this action! + + + + + Please save or close all modified files before importing settings + + + + + <html><p>%1 and Simulator settings can be imported (restored) from a previosly saved export (backup) file. This will replace current settings with any settings found in the file.</p><p>An automatic backup of the current settings will be attempted. But if the current settings are useful then it is recommended that you make a manual backup first.</p><p>For best results when importing settings, <b>close any other %1 windows you may have open, and make sure the standalone Simulator application is not running.</p><p>Do you wish to continue?</p></html> + + + + + Confirm Settings Import + + + + + Select %1: + + + + + backup + + + + + Press the 'Ignore' button to continue anyway. + + + + + The settings could not be imported. + Невозможно импортировать настройки. + + + + <html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p> + + + + + <p>The previous settings were backed up to:<br> %1</p> + + + + Do you want to write the firmware to the radio now ? - - + + Open Models and Settings file - + Открыть файл с моделями и настройками - + Read Models and Settings From Radio - + Прочитать модели и настройки из передатчика - - Ignore this release %1? - - - - - - - Companion - - - - + Save Radio Backup to File - + Read Radio Firmware to File - + Сохранить прошивку из передатчика в файл - + The OpenTX Companion project was originally forked from <a href='%1'>eePe</a> - + Copyright OpenTX Team - + OpenTX Companion %1 - Radio: %2 - Profile: %3 - + Create a new Models and Settings file - + Создать новую модель и настройки передатчика - - + + Save Models and Settings file - + Сохранить модели и настройки в файл - + Exit - + Выход - - Cut Model - - - - - Cut current model to the clipboard - - - - - Copy current model to the clipboard - - - - - Paste model from clipboard - - - - + Classical - + The classic companion9x icon theme - + Классическая тема companion9x - + Yerico - + Yellow round honey sweet icon theme - + Желтая тема - + Monochrome - + MonoWhite - + MonoBlue - + System language - + Язык ОС - - Use system language in menus - - - - - Czech - - - - - Use Czech in menus - - - - - German - - - - - Use German in menus - - - - - English - - - - - Use English in menus - - - - - Finnish - - - - - Use Finnish in menus - - - - - French - - - - - Use French in menus - - - - - Italian - - - - - Use Italian in menus - - - - - Polish - - - - - Use Polish in menus - - - - - Spanish - - - - - Use Spanish in menus - - - - - Swedish - - - - - Use Swedish in menus - - - - + About... - + О программе... - - Print... - - - - - Print current model - - - - - Simulate... - - - - - Simulate current model - - - - - Alt+S - - - - - Load Backup... - - - - + View Log File... - + Открыть журнал... - + Open and view log file - + Открыть и просмотреть журнал (логи) - + Settings... - + Настройки... - + Edit Settings - + Настройки - + Download... - + Скачать... - + Download firmware and voice files - + Скачать прошивку и содержимое SD карточки - + Check for Updates... - + Поиск обновлений... - + Check OpenTX and Companion updates - + Проверить наличие обновлений OpenTX и Companion - - Companion Changes... - - - - - Show Companion change log - - - - - Firmware Changes... - - - - - Show firmware change log - - - - + Compare Models... - + Сравнить модели... - + Edit Radio Splash Image... - + Редактировать заставку передатчика... - + Edit the splash image of your Radio - + List programmers... - + Fuses... - - + + Read Firmware from Radio - + Скачать прошивку из передатчика - + Read firmware from Radio - + Сохранить прошивку из передатчика в файл - - + Write Firmware to Radio - + Обновить прошивку передатчика - + Write firmware to Radio - + Обновить прошивку передатчика - + Add Radio Profile - + Добавить профиль передатчика - - Create a new Radio Setting Profile - - - - + Manuals and other Documents - + Инструкции и руководства - + Open the OpenTX document page in a web browser - + Открыть инструкцию к OpenTX в браузере - + Write Models and Settings To Radio - + Записать модели и настройки в передатчик - - + Write Models and Settings to Radio - - - - - - Read Models and Settings from Radio - - - - - Configure Communications... - - - - - Configure software for communicating with the Radio - - - - - Write Backup to Radio - - - - - Write Backup from file to Radio - - - - - Backup Radio to File - - - - - Save a complete backup file of all settings and model data in the Radio - - - - - Contributors... - - - - - A tribute to those who have contributed to OpenTX and Companion - - - - - SD card synchronization - - - - - Recent Files - + Записать модели и настройки в передатчик + - Recent Models+Settings - + Read Models and Settings from Radio + Прочитать модели и настройки из передатчика - + + Configure Communications... + Настройка подключения... + + + + Configure software for communicating with the Radio + Настройка подключения к передатчику + + + + Write Backup to Radio + Записать резервную копию из файла в передатчик + + + + Write Backup from file to Radio + Записать резервную копию из файла в передатчик + + + + Backup Radio to File + Сделать резервную копию передатчика + + + + Save a complete backup file of all settings and model data in the Radio + Сделать полную копию всех моделей и настроек, хранящихся в передатчике + + + + Contributors... + Разработчики... + + + + A tribute to those who have contributed to OpenTX and Companion + Показать список тех, кто помогал в разработке OpenTX и Companion + + + + SD card synchronization + Синхронизация содержимого SD карточки + + + + Recent Files + Последние + + + Set Icon Theme - + Стиль иконок - + Set Icon Size - + Размер иконок - - + + File Файл - - + + Edit Правка - + Settings - + Параметры - + Read/Write - + Чтение/Запись - - + + Help - + Помощь - - - Radio Profile - - - - - Show recent Models+Settings documents - - - - + Ready Готово @@ -4538,131 +6904,397 @@ We recommend you view the release notes using the button below to learn about an MdiChild - - - - - - - - - - - - - - - - - - - - Error - Ошибка - - - + Editing model %1: Редактирование модели %1: - - + + <p><b>Currently selected radio type (%1) is not compatible with file %3 (from %2), models and settings need to be converted.</b></p> + + + + + Do you wish to continue with the conversion? + + + + + Choose <i>Apply</i> to convert the file, or <i>Close</i> to close it without conversion. + + + + + <b>The conversion generated some important messages, please review them below.</b> + + + + + Companion :: Conversion Result for %1 + + + + + Unable to find Horus radio SD card! + + + + + Models and Settings written + + + + Unable to find file %1! Невозможно найти файл %1! - - + Error reading file %1: %2. Ошибка при считывании файла %1: %2. - - - - + Error opening file %1: %2. - - free bytes + + Alt+Shift+E - - Companion + + Ctrl+Alt+C - - - Invalid EEPROM File %1 + + Ctrl+Alt+V - - Invalid binary EEPROM File %1 + + Alt+Shift+S + + + Alt+C + + + + + Alt+A + + + + + Alt+R + + + + + Alt+W + + + + + Alt+U + + + + + Alt+S + + + + + %n Model(s) + As in "Copy 3 Models" or "Cut 1 Model" or "Delete 3 Models" action). + + модель + %n модели(ей) + %n модели + + + + + %n Model(s) + As in "Paste 3 Models" or "Insert 1 Model." + + модель + %n модели(ей) + %n модели(ей) + + + + + %n Category(ies) + As in "Delete 3 Categories" or "Delete 1 Category." + + категорию + %n категории(ий) + %n категории(ий) + + + + + Nothing selected + + + + + Rename Category + Переименовать категорию + + + + Edit Model + Редактировать модель + + + + Delete + Удалить + + + + Cut + Вырезать + + + + Copy + Копировать + + + + Paste + Вставить + + + + Insert + Вставить + + Edit Radio Settings + Параметры передатчика + + + + Copy Radio Settings + Копировать настройки передатчика + + - + Paste Radio Settings + Вставить настройки передатчика + + + + Simulate Radio + Симулятор передатчика + + + + Add Category + Добавить категорию + + + + Category + Категория + + + + Add Model + Добавить модель + + + Model + Модель + + + + Restore from Backup + Восстановить из резервной копии + + + + Model Wizard + Мастер по настройке + + + + Set as Default + Модель по умолчанию + + + + Print Model + Распечатать модель + + + + Simulate Model + Симулятор модели + + + + Duplicate Model + Сделать копию + + + + Move to Category + Переместить в категорию + + + + Show Category Actions Toolbar + + + + + Show Radio Actions Toolbar + + + + + Show Model Actions Toolbar + + + + + free bytes + байт свободно + + + + read only + + + + + New category + Translators do NOT use accent for this, this is the default category name on Horus. + + + + + Category index out of range. + + + + + Cannot delete the last category. + Нельзя удалять последнюю категорию. + + + + This category is not empty! + В этой категории есть модели! + + + + Cannot insert model, last model in list would be deleted. + + + + + Cannot add model, could not find an available model slot. + + + + + New model + Translators: do NOT use accents here, this is a default model name. + + + + + Cannot paste model, out of available model slots. + + + + + You are replacing an existing model, are you sure? + Вы действительно хотите перезаписать модель? + + + + Do you want to overwrite radio general settings? + + + + + Delete %n selected model(s)? + + Удалить выбранную модель? + Удалить выбранные модели (%n)? + Удалить выбранные модели (%n)? + + + + + Delete %n selected category(ies)? + + Удалить выбранную категорию? + Удалить выбранные категории? + Удалить выбранные категории (%n)? + + + + + Cannot duplicate model, could not find an available model slot. + + + + Save As - Сохранить как... + Сохранить как - - - - - Cannot write file %1: -%2. - Не удается записать файл %1: -%2. - - - + Open backup Models and Settings file - - - - - Warning - Звук - - - + Invalid binary backup File %1 - + %1 has been modified. Do you want to save your changes? + %1 изменен. +Вы хотите сохранить изменения? + + + + Cannot write temporary file! + Не удается записать временный файл! + + + + MixData + + + MIX - - - Error writing file %1: -%2. - Ошибка при записи файла %1: -%2. - - - - Cannot write temporary file! - Не удается записать временный файл! + + (@%1) + @@ -4671,7 +7303,7 @@ Do you want to save your changes? Dialog ??? - Диалог + Настройки микшера @@ -4684,7 +7316,7 @@ Do you want to save your changes? The source for the mixer - Источник для микшера + Источник данных для микшера @@ -4703,17 +7335,18 @@ Do you want to save your changes? Switch used by the mix. If blank then the mix is considered to be "ON" all the time. The value of the mixer is multiplied by this value and divided by 100. - Значение микшера умножается на это значение и делится на 100 + Микшер можно активировать тумблером. +Если тумблер не указан, тогда микшер будет включен всё время. Offset - Смещен. + Смещение Include Trim - Исп. трим + Использовать триммер @@ -4723,7 +7356,7 @@ If blank then the mix is considered to be "ON" all the time. The curve used by the mix - Кривая используемая микшером + Кривая, используемая микшером @@ -4733,12 +7366,12 @@ If blank then the mix is considered to be "ON" all the time. Yes - + Да No - + Нет @@ -4748,7 +7381,7 @@ If blank then the mix is considered to be "ON" all the time. Name - + Название @@ -4766,14 +7399,23 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If Delay is not zero the actuation of the mix will be delayed by the specified amount of seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If Slow is not zero then the speed of the mix will be set by the value specified -&gt; the value states the number of seconds it takes to transit from -100 to 100.</p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Задержка и замедление</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600; text-decoration: underline;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Эти значения управляют скоростью и задержкой применения микшера</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Если задержка больше 0, то микшер будет активирован не сразу, а через указанное время</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Если замедление не равно 0, то это скорость применения микшера. Т.е. значение в секундах для перехода от -100 к +100 (например, плавный выпуск закрылков/шасси)</p></body></html> Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. - Индикация включения. -Когда микшер активируется звучит выбранный сигнал. + Передатчик будет издавать звуки пока микшер активен. @@ -4783,18 +7425,18 @@ Setting this value will cause a beep to be emmitted when this value is active. 1 Beep - 1 бип + 1 сигнал 2 Beep 2 Beeo - 2 бипа + 2 сигнала 3 Beep - 3 бипа + 3 сигнала @@ -4812,31 +7454,31 @@ This determines how mixer values are added. "R" means the value replaces the previous values. If the switch is off the value will be ignored. Мультиплексор -Определяет, каким образом добавляется значение микшера. +Определяет, каким образом вычисляется значение микшера. -"+" - значение текущего микшера добавляется к предыдущему значению на этом же канале. -"*" - значение текущего микшера умножается на предыдущее значение на этом же канале -"R" - значение текущего микшера заменяет предыдущее значение на этом же канале. +"+" - значение текущего микшера добавляется к предыдущему микшеру на этом же канале. +"*" - значение текущего микшера умножается на значение предыдущего микшера на этом же канале +"R" - значение текущего микшера заменяет предыдущее значение. Если тумблер отключен, то значение игнорируется. ADD - ДОБАВИТЬ + СЛОЖЕНИЕ MULTIPLY - УМНОЖИТЬ + УМНОЖЕНИЕ REPLACE - ЗАМЕНИТЬ + ЗАМЕНА Flight modes - + Полётные режимы @@ -4851,153 +7493,209 @@ This determines how mixer values are added. Slow - Замедлен. + Замедление Up - Верх + Вверх Down - Низ + Вниз - - DEST -> CH%1 + + DEST -> %1 + + + + + Click to access popup menu + Нажмите, чтобы открыть меню + + + + Clear All + Убрать всё + + + + Set All + Выбрать всё + + + + Invert All + Инвертировать + + + + MixersListWidget + + + Increase font size + + + + + Decrease font size + + + + + Default font size + + + + + Ctrl+0 MixesPanel - - + + Move Up - + Сдвинуть вверх - - + + Ctrl+Up - - + + Move Down - + Сдвинуть вниз - - + + Ctrl+Down - + Clear Mixes - + Удалить микшеры - + Not enough available mixers! - + Недостаточно микшеров! - + Delete Selected Mixes? - Удалить выбранные микшеры? + Удалить выбранные микшеры? - + &Add - Добавить + Добавить - + Ctrl+A - + &Edit - Правка + Редактировать - + Enter - Ввод + - + &Toggle highlight - + Ctrl+T - + &Delete - Удалить + Удалить - + Delete - Удалить + - + &Copy - Копировать + Копировать - + Ctrl+C - + Ctrl+X - + C&ut - + &Paste - Вставить + Вставить - + Ctrl+V - + Du&plicate - + Сделать копию - + Ctrl+U - + Clear Mixes? + Удалить все микшеры? + + + + Really clear all the mixes? + Вы действительно хотите удалить все микшеры? + + + + ModelData + + + Model: - - Really clear all the mixes? + + Throttle Source @@ -5009,929 +7707,1865 @@ This determines how mixer values are added. Диалог - + Setup - Настройка + Основные - + Heli - + Вертолёт - + Inputs - + Входы - + Logical Switches - + Логические переключатели - + Mixes Микшеры - + Outputs - + Выходы - + Curves Кривые - + Special Functions - + Специальные функции - + Telemetry - + Телеметрия - + Flight Modes - + Полетные режимы Simulate - Симуляция + Симулятор ModelPrinter - - %1 bytes + + Enable - - CH%1 + + Disable - + + True + + + + + False + + + + + Yes + + + + + No + Нет + + + + Y + + + + + N + + + + + ON + + + + + + + + OFF + ВЫКЛ + + + + bytes + + + + Exponential - экспонента + - + Extra Fine - очень точно + - + Fine - точно + - + Medium - средне + - + Coarse - грубо + Грубо - + Unknown - - Enabled - - - - - Disabled - - - - - %1, Channels(%2-%3), PPM delay(%4usec), Pulse polarity(%5) - - - - - %1, Channels(%2-%3) - - - - - Receiver number(%1) - - - - - Slave/Jack - - - - - Master/SBUS Module - - - - - Master/CPPM Module - - - - - Master/SBUS in battery compartment - - - - - Master/Jack - - - - - Rudder - Руддер - - - - Elevator - Элеватор - - - - Throttle - Газ - - - - Aileron - Элероны - - - - Name(%1) - - - - - Persistent - - - - - MinuteBeep - - - - - CountDown(Beeps) + + + Mode - CountDown(Voice) + + Channels + + + + + + Frame length - CountDown(Haptic) + PPM delay - - Off + + + Polarity - - - - - FM%1 + + Protocol + Протокол + + + + + + Delay + + + + + + Receiver - FM%1%2 + Radio protocol + + + + + Subtype + Option value + + + + + Sub Type + + + + + RF Output Power + + + + + 90 + + + + + 120 + + + + + 120X + + + + + 140 + + + + + MULT! + + + + + + Offset + Смещен. + + + + Slow + + + + + Warn + + + + + Flight modes + + + + + Flight mode + + + + + All + + + + + Edge + + + + + instant + + + + + Sticky + + + + + Timer + + + + + missing + + + + + Duration + + + + + Extended Limits + Расш. лимиты + + + + Display Checklist + + + + + Global Functions + + + + + Manual + + + + + Auto + + + + + Failsafe Mode + + + + + + Hold + + + + + No Pulse + + + + + Not set + + + + + No pulses + + + + + Silent + + + + + Beeps + + + + + Voice + + + + + Haptic + + + + + Flight + + + + + Manual reset + + + + + Step + + + + + Display + + + + + Extended + + + + + Never + + + + + On Change + + + + + Always + + + + + + + Source + Источник + + + + Trim idle only + + + + + Warning + Звук + + + + Reversed + + + + + Tmr + + + + + FrSky S.PORT + + + + + FrSky D + + + + + FrSky D (cable) + + + + + Alti + + + + + Alti+ + + + + + VSpeed + + + + + + + A1 + + + + + + + A2 + + + + + + A3 + + + + + + A4 + + + + + + FAS + + + + + Cells + + + + + Calculated + + + + + Add + + + + + Average + + + + + + Min + + + + + + Max + + + + + Multiply + + + + + Totalise + + + + + Cell + + + + + Consumption + + + + + Distance + + + + + Lowest + + + + + Cell %1 + + + + + Highest + + + + + Delta + + + + + Formula + + + + + + Id + + + + + Instance + + + + + + + + Sensor + + + + + + Sources + + + + + + GPS + + + + + Alt. + + + + + + Blades + + + + + Multi. + + + + + F + + + + + Inst + + + + + Alt + + + + + Unit + + + + + Prec + + + + + Ratio + + + + + Multi + + + + + A/Offset + + + + + Filter + + + + + Persist + + + + + Positive + + + + + Log + + + + + Numbers + + + + + Bars + + + + + Script + + + + + Filename + + + + + Error: Unable to open or read file! + + + + + Slave/Jack + + + + + Master/SBUS Module + + + + + Master/CPPM Module + + + + + Master/SBUS in battery compartment + + + + + Master/Jack + + + + + Persistent + + + + + Off + + + + + + + + + + None + + + + + Name + + + + + Countdown + + + + + Minute call + + + + + + + FM%1 + + + + + FM%1%2 + + + + FM%1+%2 - - [I%1] - - - - - Input%1 - - - - + + Weight Вес - + + Switch Тумблер - - + + NoTrim - - Weight(%1) - - - - - Switch(%1) - - - - + No DR/Expo - + Offset(%1) - - Delay(u%1:d%2) - - - - - Slow(u%1:d%2) - - - - - Warn(%1) - - - - + Disabled in all flight modes - - Flight modes(%1) - - - - - Flight mode(%1) - - - - - Edge(%1, [%2:%3]) - - - - - Sticky(%1, %2) - - - - - Timer(%1, %2) - - - - - Duration(%1s) - - - - - Delay(%1s) - - - - + + + Custom - + Standard - + Стандартный ModelSelectionPage - + Plane - + Самолёт - + Multirotor - + Мультикоптер - + Helicopter - + Вертолет - + Model Name: - + Название модели: - + Model Type: - - - - - ModelsListWidget - - - - &Edit - Правка - - - - &Restore from backup - - - - - &Model Wizard - - - - - &Delete - Удалить - - - - Delete - Удалить - - - - &Copy - Копировать - - - - Ctrl+C - - - - - &Cut - Вырезать - - - - Ctrl+X - - - - - &Paste - Вставить - - - - Ctrl+V - - - - - D&uplicate - Дублировать - - - - Ctrl+U - - - - - &Use as default - - - - - P&rint model - - - - - Ctrl+P - - - - - Alt+S - - - - - &Simulate model - - - - - General Settings - Основные настройки - - - - Delete Selected Models? - Удалить выбранные модели? - - - - - Cannot delete default model. - - - - - Cannot cut default model. - - - - - Do you want to overwrite radio general settings? - - - - - You are pasting on an not empty model, are you sure? - You are pasting on an not empty model, are you sure ? - - - - - No free slot available, cannot duplicate - + Тип модели: Module - + Failsafe Mode - + Режим Failsafe - + Start - + Начать с - + PPM delay - + Negative - + Positive - + Polarity - + Полярность - + Trainer Mode - + Тренерский режим - + PPM Frame Length - + Длите. кадра PPM - + CH + Канал + + + + RF Output Power + Выходная мощность передатчика + + + + Receiver 1 + Приёмник 1 + + + + + + X - + + Receiver 2 + Приёмник 2 + + + + Receiver 3 + Приёмник 3 + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + Low Power + + + + us - + + Antenna + Антенна + + + + Option value + + + + + Registration ID + + + + + Multi Radio Protocol + Режим мультипротокольного модуля + + + + Sub Type + Подтип + + + + WARNING: Requires non-certified firmware! + + + + Master/Jack - + Главный (джек) - + Slave/Jack - + Ученик (джек) - + Master/SBUS Module - + Главный (SBUS модуль) - + Master/CPPM Module - + Главный (модуль CPPM) - + Master/SBUS in battery compartment + Главный (SBUS в батарейном отсеке) + + + + Show values in: - + + % + abbreviation for percent + + + + + μs + abbreviation for microseconds + + + + ms - - - - - Channels - Каналы - - - - Not set - - - - - Hold - - - - - Custom - - - - - No Pulses - - - - - Receiver - - - - - Failsafe Positions - + мс - Protocol - Протокол + Channels + Кол-во каналов - - Receiver No. + + Not set + Не задан + + + + Hold + Удержание + + + + Custom + Другой + + + + No Pulses + Без сигнала + + + + Receiver + В приёмнике + + + + Master/Bluetooth + Главный (bluetooth) + + + + Slave/Bluetooth + Ученик (bluetooth) + + + + Master/Multi + Главный (мультимодуль) + + + + Disable Telemetry + Отключить телеметрию + + + + Disable Ch. Map - + + Failsafe Positions + Параметры Failsafe + + + + Protocol + Протокол + + + + Receiver No. + Номер приёмника + + + Output type - + Open Drain - + Push Pull + + ModuleData + + + Trainer Port + + + + + Internal Radio System + Встроенный радиомодуль + + + + External Radio Module + Внешний радиомодуль + + + + Extra Radio System + + + + + Radio System + + + + + 10mW - 16CH + + + + + + 100mW - 16CH + + + + + 500mW - 16CH + + + + + Auto <= 1W - 16CH + + + + + + 25mW - 8CH + + + + + + 25mW - 16CH + + + + + 200mW - 16CH (no telemetry) + + + + + 500mW - 16CH (no telemetry) + + + + + 100mW - 16CH (no telemetry) + + + + + Positive + + + + + Negative + + + ModulePanel - - Trainer Port - - - - - Internal Radio System - - - - - External Radio Module - - - - - - Radio System - - - - - Extra Radio System - - - - + Value Значение - + Hold - + No Pulse + + + Ask + + + + + Internal + + + + + Internal + External + + + + + External + + + + + Autodetect Format + + + + + Bind on channel + + MultiModelPrinter - - General Model Settings - - - - - Name: - - - - - EEprom Size: - - - - - Timer%1: - - - - - Module%1: - - - - - Module: - - - - - Trainer port: - - - - - Throttle Trim: - - - - - Trim Increment: - - - - - Center Beep: - - - - + Flight modes - - + + Flight mode - + + Switch Тумблер - - Fade IN - - - - - Fade OUT - - - - - - FM%1 - - - - - + + GV%1 - + RE%1 - - Limits - Лимиты - - - + Channel - + + + Name - - + + General + + + + + EEprom Size + + + + + Model Image + + + + + Throttle + Газ + + + + Trims + + + + + Center Beep + + + + + Switch Warnings + + + + + Pot Warnings + + + + + Other + + + + + Timers + + + + + Time + + + + + Countdown + + + + + Min.call + + + + + Persist + + + + + Modules + + + + + Trainer port + + + + + Helicopter + + + + + Swash + + + + + + Type + + + + + Ring + + + + + Input + + + + + Weight + Вес + + + + Long. cyc + + + + + Lateral cyc + + + + + Collective + + + + + F.In + + + + + F.Out + + + + + Global vars + + + + + Prec + + + + + Popup + + + + + Outputs + + + + + Subtrim + + + + + Direct + + + + + Curve + Кривая + + + + PPM + + + + + Linear + + + + + Telemetry + + + + Offset Смещен. - + + Protocol + Протокол + + + + Low + + + + + Critical + + + + + Telemetry audio + + + + + Altimetry + + + + + + Vario source + + + + + Vario limits > + + + + + Sink max + + + + + Sink min + + + + + Climb min + + + + + Climb max + + + + + Center silent + + + + + Top Bar + + + + + + Volts source + + + + + Altitude source + + + + + Various + + + + + Serial protocol + + + + + FAS offset + + + + + mAh count + + + + + Persistent mAh + + + + + Current source + + + + + Blades + + + + + Parameters + + + + + Telemetry Sensors + + + + + Telemetry Screens + + + + + GF%1 + + + + + Global Functions + + + + + Checklist + + + + + Min Мин - + + Max Макс - - Invert - Инверт - - - + Global Variables - + Inputs - + Mixers - - CV%1 - - - - + Curves Кривые - + L%1 - + Logical Switches - + SF%1 - + Special Functions - - Telemetry Settings - - - - + Analogs - + + Unit - + Scale - - A%1 + + RSSI Alarms + + + + + Multiprotocols + + + Subtype - - RSSI Alarms + + Video TX frequency + + + + + CC2500 frequency fine tune + + + + + Telemetry + + + + + Radio output power + + + + + Servo output frequency + + + + + Option value + + + + + Fixed ID value + + + + + DEFAULT + + + + + Custom - proto %1) MultirotorPage - + Throttle Channel: - + Yaw Channel: - + Pitch Channel: - + Roll Channel: + + OpenTxEepromInterface + + + Unknown error + + + + + ... plus %1 errors + + + + + Cannot write radio settings + + + + + Cannot write model %1 + + + OptionsPage - + Throttle Cut - + Отсечка газа (throttle cut) - + Throttle Timer + Таймер газа + + + + Flight Timer + Таймер полетного времени + + + + OtxFormat + + + Error opening file %1: +%2. - - Flight Timer + + Error opening OTX archive %1 + + + + + Error initializing OTX archive writer + + + + + Error writing file %1: +%2. + Ошибка при записи файла %1: +%2. + + + + Error creating OTX file %1: +%2. + + + + + Error creating OTX archive + + + + + Error adding %1 to OTX archive @@ -5940,56 +9574,62 @@ This determines how mixer values are added. Close - + Закрыть - Print - + Style + Стили + Print + Печать + + + Print to file - + В файл - + Print Document - + Распечатать - + Select PDF output file - + PDF файл для сохранения - + ODF files (*.odt);;PDF Files(*.pdf);;HTML-Files (*.htm *.html);;All Files (*) - + ODF файлы (*.odt);;PDF файлы (*.pdf);;HTML-файлы (*.htm *.html);;Все файлы (*) ProgressDialog - + Flash Firmware - + + Close - + Закрыть + + + + Cancel + Отмена ProgressWidget - - Form - - - - + Show Details @@ -5997,2339 +9637,158 @@ This determines how mixer values are added. QObject - - Polish + + WARNING - - CH%1 + + <p>Importing JumperTX data into OpenTX 2.3 is <b>not supported and dangerous.</b></p> <p>It is unfortunately not possible for us to differentiate JumperTX data from legitimate FrSky X10 data, but <b>You should only continue here if the file you opened comes from a real FrSky X10.</b></p> <p>Do you really want to continue?</p> + + + RadioData - - No + + Models + + + RadioDataConversionState - - RotEnc A + + is invalid - - Rot Enc B + + converted to - - Rot Enc C + + verify is - - Rot Enc D + + [DBG] - - Rot Enc E + + [NFO] - - Trainer + + [WRN] - - Trainer RUD + + [CVT] - - Trainer ELE + + [ERR] - - Trainer THR + + [INV] - - Trainer AIL + + Event - - Instant Trim + + Origin - - Play Sound + + Comp - - Start Logs + + Sub-Component - - Haptic + + Field - - - - --- + + Type - - Rud Trim + + Old - - Ele Trim + + Action - - Thr Trim + + New - - Ail Trim + + Seq + + + RadioInterface - - Rot Enc - - - - - English - - - - - French - - - - - Italian - - - - - German - - - - - Czech - - - - - Slovak - - - - - Spanish - - - - - Portuguese - - - - - Swedish - - - - - No repeat - - - - - Reset - - - - - mA - - - - - kts - - - - - f - - - - - dB - - - - - rpms - - - - - hours - - - - - minutes - - - - - seconds - - - - - h:m - - - - - m:s - - - - - h:m:s - - - - - - F1 - - - - - - F2 - - - - - - F3 - - - - - - F4 - - - - - - S3 - - - - - - - Timer3 - - - - - RSSI Tx - - - - - RSSI Rx - - - - - A3 - - - - - A4 - - - - - Cells - - - - - dTE - - - - - Hdg - - - - - AirSpeed - - - - - A3- - - - - - A4- - - - - - Speed+ - - - - - Dist+ - - - - - AirSpeed+ - - - - - Cell- - - - - - Cells- - - - - - Vfas- - - - - - Curr+ - - - - - Powr+ - - - - - ACC - - - - - GPS Time - - - - - - L1 - - - - - - L2 - - - - - - L3 - - - - - - L4 - - - - - - L5 - - - - - - L6 - - - - - - L7 - - - - - - L8 - - - - - - L9 - - - - - - L10 - - - - - - L11 - - - - - - L12 - - - - - - L13 - - - - - - L14 - - - - - - L15 - - - - - - L16 - - - - - - L17 - - - - - - L18 - - - - - - L19 - - - - - - L20 - - - - - - L21 - - - - - - L22 - - - - - - L23 - - - - - - L24 - - - - - - L25 - - - - - - L26 - - - - - - L27 - - - - - - L28 - - - - - - L29 - - - - - - L30 - - - - - - L31 - - - - - - L32 - - - - - [I%1] - - - - - LUA%1%2 - - - - - TR%1 - - - - - FM0 - - - - - FM1 - - - - - FM2 - - - - - FM3 - - - - - FM4 - - - - - FM5 - - - - - FM6 - - - - - FM7 - - - - - FM8 - - - - - S31 - - - - - S32 - - - - - S33 - - - - - S34 - - - - - S35 - - - - - S36 - - - - - RudTrim Left - - - - - RudTrim Right - - - - - EleTrim Down - - - - - EleTrim Up - - - - - ThrTrim Down - - - - - ThrTrim Up - - - - - AilTrim Left - - - - - AilTrim Right - - - - - THs - - - - - TH% - - - - - THt - - - - - One - - - - - ??? - - - - - a>x - - - - - a<x - - - - - |a|>x - - - - - |a|<x - - - - - AND - - - - - OR - - - - - XOR - - - - - a=b - - - - - a!=b - - - - - a>b - - - - - a<b - - - - - a>=b - - - - - a<=b - - - - - d>=x - - - - - |d|>=x - - - - - a=x - - - - - a~x - - - - - Timer - - - - - Sticky - - - - - Unknown - - - - - Override %1 - - - - - Set Timer %1 - - - - - Vario - - - - - Play Track - - - - - Play Both - - - - - Play Value - - - - - Play Script - - - - - Volume - - - - - Backlight - - - - - Screenshot - - - - - Background Music - - - - - Background Music Pause - - - - - played once, not during startup - - - - - repeat(%1s) - - - - - DISABLED - - - - - INV - - - - - NOR - - - - - Edge - - - - - SetFailsafe Int. Module - - - - - SetFailsafe Ext. Module - - - - - RangeCheck Int. Module - - - - - RangeCheck Ext. Module - - - - - Bind Int. Module - - - - - Bind Ext. Module - - - - - - - <font color=red><b>Inconsistent parameter</b></font> - - - - - Value - - - - - Decr: - - - - - Incr: - - - - - Played once, not during startup - - - - - %1s - - - - - Adjust GV%1 - - - - - Rotary Encoder - - - - - Value - Значение - - - - Source - Источник - - - - GVAR - - - - - Increment - - - - - Flight - - - - - Finnish - - - - - !Flight mode %1 - - - - - Flight mode %1 - - - - - Flight mode %1 value - - - - - Yellow - - - - - Orange - - - - - Red - - - - - Winged Shadow How High - - - - - Winged Shadow How High (not supported) - - - - - FrSky Sensor Hub - - - - - None - - - - - Imperial - - - - - Metric - - - - - - - Timer1 - - - - - - - Timer2 - - - - - Telemetry - - - - - Own value - - - - - Keys - - - - - Sticks - - - - - Keys + Sticks - - - - - - -GV%1 - - - - - - - - ---- - - - - - - - P1 - - - - - - - P2 - - - - - - - P3 - - - - - MAX - - - - - - Rud - - - - - - Ele - - - - - - Thr - - - - - - Ail - - - - - - - REa - - - - - - - REb - - - - - Alt - - - - - Rpm - - - - - Fuel - - - - - Speed - - - - - Dist - - - - - GPS Alt - - - - - Cell - - - - - A1 - - - - - A2 - - - - - T1 - - - - - T2 - - - - - - Simultaneous usage of expo and curves is no longer supported - - - - - TrmR - - - - - TrmE - - - - - TrmT - - - - - TrmA - - - - - - - - S1 - - - - - - - - - - - V - - - - - - s - - - - - ft - - - - - - - m - - - - - - °C - - - - - - ° - - - - - - % - - - - - - - mph - - - - - - - km/h - - - - - - m/s - - - - - - A - - - - - °F - - - - - - mAh - - - - - - W - - - - - - g - - - - - - - - S2 - - - - - - - - LS - - - - - - - - RS - - - - - - Batt - - - - - SWR - - - - - Vfas - - - - - Curr - - - - - Cnsp - - - - - Powr - - - - - AccX - - - - - AccY - - - - - AccZ - - - - - VSpd - - - - - A1- - - - - - A2- - - - - - Alt- - - - - - Alt+ - - - - - Rpm+ - - - - - T1+ - - - - - T2+ - - - - - - Time - - - - - CYC%1 - - - - - S11 - - - - - S12 - - - - - S13 - - - - - S14 - - - - - S15 - - - - - S16 - - - - - S21 - - - - - S22 - - - - - S23 - - - - - S24 - - - - - S25 - - - - - S26 - - - - - Diff(%1) - - - - - Expo(%1) - - - - - Function(%1) - - - - - Curve(%1) - - - - - !Curve(%1) - - - - - - - GV%1 - - - - - THR - - - - - - - ON - - - - - - - OFF - ВЫКЛ - - - - - Support for frsky telemetry mod - - - - - - Support for jeti telemetry mod - - - - - - Support for receiving ardupilot data - - - - - - Support for receiving NMEA data - - - - - Support for telemetry easy board - - - - - - Support for MAVLINK devices - - - - - Rotary Encoder use in menus navigation - - - - - - - - - - Enable heli menu and cyclic mix support - - - - - - - - - - - - - Enable TEMPLATES menu - - - - - - - - No splash screen - - - - - - - - - - - - - Disable curves menus - - - - - - - - Support for radio modified with regular speaker - - - - - - - - - Used if you have modified your radio with voice mode - - - - - - - - - Used if you have modified your radio with haptic mode - - - - - Channel values displayed in us - - - - - - - - - - - - - In model setup menus automatically set source by moving the control - - - - - - - - - - - - - In model setup menus automatically set switch by moving the control - - - - - Use alternative SQT5 font - - - - - (displaying only first 10 warnings) - - - - - Possibility to enable FAI MODE (no telemetry) at field - - - - - FAI MODE (no telemetry) always enabled - - - - - - - - Support for a third timer - - - - - Instead of Joystick emulation, USB connection is Mass Storage (as in the Bootloader) - - - - - Instead of Joystick emulation, USB connection is Command Line Interface - - - - - Removes D8 and LR12 FrSky protocols that are not legal for use in the EU on radios sold after Jan 1st, 2015 - - - - - Support for PPM internal module hack - - - - - ST7565P LCD or compatible - - - - - ST7565R LCD or compatible - - - - - ERC12864FSF LCD - - - - - ST7920 LCD - - - - - 9X board - - - - - - - - Enable the throttle trace in Statistics - - - - - EEprom write progress bar - - - - - - No Winged Shadow How High support - - - - - - No vario support - - - - - - No GPS support - - - - - - No gauges in the custom telemetry screen - - - - - Allow compensating for offset errors in FrSky FAS current sensors - - - - - - Add support for reversing stick inputs (e.g. needed for FrSky gimbals) - - - - - Power management by soft-off circuitry - - - - - ar9x board / 9X - - - - - 9XR-PRO - - - - - FrSky Taranis - - - - - FrSky Taranis Plus - - - - - FrSky Taranis X9E - - - - - Confirmation before radio shutdown - - - - - - Adds mixers output view to the CHANNELS MONITOR screen, pressing [ENT] switches between the views - - - - - Haptic module installed - - - - - Support for Lua model scripts - - - - - - Support of FrSky PXX protocol - - - - - Disable HELI menu and cyclic mix support - - - - - Disable Global variables - - - - - - - - - Support for DSM2 modules - - - - - - - - - - - - - PPM center adjustment in limits - - - - - - - - - - - - - Symetrical Limits - - - - - - - - - - - Pots use in menus navigation - - - - - No OverrideCH functions available - - - - - - - - - - - - - No flight modes - - - - - - SmartieParts 2.2 Backlight support - - - - - - - - - - Enable resetting values by pressing up and down at the same time - - - - - - - - - - - - - No graphical check boxes and sliders - - - - - - - - - - - - - Battery graph - - - - - - - - - - - - - Don't use bold font for highlighting active items - - - - - - - - - EEprom write Progress bar - - - - - - - - - - Imperial units - - - - - M128 / 9X board - - - - - 9XR - - - - - 9XR with M128 chip - - - - - Gruvin9x board / 9X - - - - - MEGA2560 board - - - - - Sky9x board / 9X - - - - - - - Bluetooth interface - - - - - - - - - - - - - Global variables - - - - - - Support for SD memory card - - - - - Support for DSM2 modules using ppm instead of true serial - - - - - - - Enable HELI menu and cyclic mix support - - - - - - Warning - Звук - - - - EEPROM saved with these warnings: - - - - - Simulator for this firmware is not yet available - - - - - th9x on this board doesn't have Rotary Encoders - - - - - Source %1 cannot be exported on this board! - - - - - OpenTX only accepts %1 points in all curves - - - - - OpenTx only accepts %1 points in all curves - - - - - - - - - OpenTX on this board doesn't accept this function - - - - - OpenTX doesn't accept this telemetry protocol - - - - - - - OpenTX doesn't accept this radio protocol - - - - - OpenTX doesn't allow this number of channels - - - - - Trim disabled - - - - - Own Trim - - - - - Use Trim from Flight mode %1 - - - - - Use Trim from Flight mode %1 + Own Trim as an offset - - - - - FW: %1 - - - - - Pict: %1 - - - - - Profile image - - - - - Simultaneous usage of expo and curves is no longer supported in OpenTX - - - - - Thank you for upgrading to OpenTX 2.0. This is a major upgrade that adds and modifies a lot of things, so please make sure that you read release notes carefully to learn about the changes, and thoroughly check each of your models for proper function. - -The OpenTX Team. - - - - - - - - - Synchronization error - - - - - No SD directory configured! - - - - - No Radio connected! - - - - - GV - - - - - -%1 - - - - - - The directory '%1' doesn't exist! - - - - - Create '%1' failed - - - - - Copy '%1' to '%2' failed - - - - - Open '%1' failed - - - - - Write '%1' failed - - - - - - - Error - Ошибка - - - + Cannot write file %1: %2. Не удается записать файл %1: %2. - - Companion - - - - + <b><u>WARNING!</u></b><br>This will reset the fuses of %1 to the factory settings.<br>Writing fuses can mess up your radio.<br>Do this only if you are sure they are wrong!<br>Are you sure you want to continue? - - + + Could not delete temporary file: %1 - - Radio type + + Unable to find Horus radio SD card! + + + + + RadioKnobWidget + + + <p>Value (input): <b>%1</b></p> - - Which radio type do you want to simulate? + + Right-double-click to reset to center. @@ -8351,10 +9810,712 @@ The OpenTX Team. + + RadioOutputsWidget + + + Form + + + + + View: + + + + + Logical Switches + + + + + Global Variables + + + + + Channel Outputs + + + + + Mix Outputs + + + + + L +o +g +i +c + + + + + G +l +o +b +a +l + + + + + C +h +a +n +n +e +l +s + + + + + M +i +x +e +s + + + + + FM%1 + + + + + GV%1 + + + + + RadioSwitchWidget + + + Latch/unlatch the momentary switch. + + + + + RawSource + + + + + + V + + + + + + + + s + + + + + ft + + + + + + m + + + + + °C + + + + + ° + + + + + % + + + + + + mph + + + + + + km/h + + + + + m/s + + + + + A + + + + + mAh + + + + + W + + + + + g + + + + + TrmR + + + + + TrmE + + + + + TrmT + + + + + TrmA + + + + + Trm5 + + + + + Trm6 + + + + + TrmH + + + + + TrmV + + + + + + Batt + + + + + + Time + + + + + + Timer1 + + + + + + Timer2 + + + + + + Timer3 + + + + + RAS + + + + + RSSI Tx + + + + + RSSI Rx + + + + + A1 + + + + + A2 + + + + + A3 + + + + + A4 + + + + + Alt + + + + + Rpm + + + + + Fuel + + + + + T1 + + + + + T2 + + + + + Speed + + + + + Dist + + + + + GPS Alt + + + + + Cell + + + + + Cells + + + + + Vfas + + + + + Curr + + + + + Cnsp + + + + + Powr + + + + + AccX + + + + + AccY + + + + + AccZ + + + + + Hdg + + + + + VSpd + + + + + AirSpeed + + + + + dTE + + + + + A1- + + + + + A2- + + + + + A3- + + + + + A4- + + + + + Alt- + + + + + Alt+ + + + + + Rpm+ + + + + + T1+ + + + + + T2+ + + + + + Speed+ + + + + + Dist+ + + + + + AirSpeed+ + + + + + Cell- + + + + + Cells- + + + + + Vfas- + + + + + Curr+ + + + + + Powr+ + + + + + ACC + + + + + GPS Time + + + + + REa + + + + + REb + + + + + + ??? + + + + + ---- + + + + + I + as in Input + + + + + LUA%1%2 + + + + + MAX + + + + + CYC%1 + + + + + TR + as in Trainer + + + + + SRC + + + + + RawSwitch + + + ↑ + + + + + ↓ + + + + + - + + + + + ! + + + + + RudTrim Left + + + + + RudTrim Right + + + + + EleTrim Down + + + + + EleTrim Up + + + + + ThrTrim Down + + + + + ThrTrim Up + + + + + AilTrim Left + + + + + AilTrim Right + + + + + Trim 5 Down + + + + + Trim 5 Up + + + + + Trim 6 Down + + + + + Trim 6 Up + + + + + TrmH Left + + + + + TrmH Right + + + + + TrmV Down + + + + + TrmV Up + + + + + REa + + + + + REb + + + + + + OFF + ВЫКЛ + + + + + ON + + + + + THs + + + + + TH% + + + + + THt + + + + + + ??? + + + + + One + + + + + Act + + + + + ---- + + + + + Telemetry + + + + + SW + + + ReleaseNotesDialog - + Companion Release Notes @@ -8362,26 +10523,183 @@ The OpenTX Team. ReleaseNotesFirmwareDialog - + OpenTX Release Notes + + RepeatComboBox + + + Played once, not during startup + + + + + No repeat + + + + + %1s + + + RudderPage - - - No - - - - - Yes - - + No + Нет + + + + Yes + Есть + + + <br>Rudder Channel: + Канал руля направления: + + + + SdcardFormat + + + Error opening file %1: +%2. + + + + + Error opening file %1 in write mode: +%2. + + + + + SensorData + + + + V + + + + + A + + + + + mA + + + + + kts + + + + + m/s + + + + + km/h + + + + + mph + + + + + m + + + + + f + + + + + °C + + + + + °F + + + + + % + + + + + mAh + + + + + W + + + + + mW + + + + + dB + + + + + rpms + + + + + g + + + + + ° + + + + + Rad + + + + + hours + + + + + minutes + + + + + seconds + + + + + TELE @@ -8390,350 +10708,977 @@ The OpenTX Team. Center beep - Бип в центре + Сигнал в центре OFF - ВЫКЛ + ВЫКЛ Model Image - + Изображение модели - + Exponential - экспонента + По экспоненте - + Throttle Trim Idle Only - + Триммировать только холостой ход - + Extra Fine - очень точно + Очень точно - + Fine - точно + Точно - + Medium - средне + Средне - + Coarse - грубо + Грубо - + Display Checklist - + Показать контрольную карту - + Timer 2 - + Таймер 2 Timer 1 - + Таймер 1 - + Timer 3 - + Таймер 3 - + Never - + Никогда Top LCD Timer - + Верхний таймер - + On change - + При изменении - + Always - + Всегда - + Global Functions - + Глобальные функции - + + Edit Checklist... + Редактировать... + + + Throttle Source - + Канал газа - + Trim Step - + Шаг триммирования - + Trims Display - + Показывать триммеры Warnings - + Предупреждения Switch Warnings - + Тумблеры Pot Warnings - + Крутилки Manual - + Вручную Auto - + Автоматически Model - + Модель - + Extended Limits - Расш. лимиты + Расширенные лимиты - + Extended Trims - + Расширенные триммеры - + Throttle Warning - + Предупреждать если не убран - + Reverse throttle operation. If this is checked the throttle will be reversed. Idle will be forward, trim will also be reversed and the throttle warning will be reversed as well. - Реверсировать канал газа (а также триммеры и предупреждения) + Реверс газа +Если выбрана эта опция, то будет включен реверс газа, холостого хода и триммеров. Предупреждение о не нулевом положении стика газа также будет инвертировано. + + - + Reverse Throttle - + Реверс газа SetupPanel - + Timer %1 + + + THR + + + + + Profile Settings + + + + + SD structure path not specified or invalid + + SimpleTailPage - + Elevator Channel: + Канал руля высоты: + + + + SimulatedUIWidget + + + screenshot + Simulator LCD screenshot file name prefix + + + + + ENTER + + + + + S + + + + + PG-UP + + + + + PG-DN + + + + + DEL + + + + + BKSP + + + + + ESC + + + + + INS + + + + + <font size=+3>+</font> + + + + + <font size=+3>-</font> + + + + + <font size=+3>&larr;</font> + + + + + <font size=+3>&rarr;</font> + + + + + <font size=+3>&uarr;</font> + + + + + <font size=+3>&darr;</font> + + + + + <font size=+3>&#x2686;</font> + + + + + <font size=+3>&#x21b6;</font> + + + + + <font size=+3>&#x21b7;</font> + + + + + <font size=+3>&#x21c6;</font> + + + + + + <font size=+3>&#x21d3;</font> + + + + + <font size=+3>&#x21d1;</font> + + + + + <font size=+3>&#x21d5;</font> + + + + + <img src='qrc:/images/simulator/icons/svg/mouse.svg' width=20 height=18 /> + + + + + <img src='qrc:/images/simulator/icons/svg/arrow_click.svg' width=18 height=18 /> + + + + + <pre>[ MENU ]</pre> + + + + + <pre>[ PAGE ]</pre> + + + + + <pre>[ EXIT ]</pre> + + + + + <pre>[ ENT ]</pre> + + + + + <pre>[ SHIFT ]</pre> + + + + + <pre>[ UP ]</pre> + + + + + <pre>[ DN ]</pre> + + + + + <pre>[ <font size=+2>+</font> ]</pre> + + + + + <pre>[ <font size=+2>-</font> ]</pre> + + + + + <pre>[ PgUp ]</pre> + + + + + <pre>[ PgDn ]</pre> + + + + + <pre>[ MDL ]</pre> + + + + + <pre>[ RTN ]</pre> + + + + + <pre>[ SYS ]</pre> + + + + + <pre>[ TELE ]</pre> + + + + + <font size=+3>&#x2261;</font> - SimulatorDialog + SimulatorMain - - - Warning - Звук - - - - Joystick enabled but not configured correctly + + OpenTx Simulator - + + Available profiles: + + + + + ID: + + + + + Name: + + + + + Available radios: + + + + + Radio profile ID or Name to use for simulator. + + + + + profile + + + + + Radio type to simulate (usually defined in profile). + + + + + radio + + + + + Directory containing the SD card image to use. The default is configured in the chosen Radio Profile. + + + + + path + + + + + Data source type to use (applicable to Horus only). One of: + + + + + type + + + + + data-source + + + + + Radio data (.bin/.eeprom/.otx) image file to use OR data folder path (for Horus-style radios). +NOTE: any existing EEPROM data incompatible with the selected radio type may be overwritten! + + + + + [data-source] + + + + + Error: Profile ID %1 was not found. + + + + + Unrecognized startup data source type: %1 + + + + + WARNING: couldn't initialize SDL: +%1 + + + + + ERROR: No simulator libraries available. + + + + + ERROR: Couldn't start simulator, missing radio/profile/data file/folder. + Profile ID: [%1]; Radio ID: [%2]; +Data File: [%3] + + + + + ERROR: Radio profile or simulator firmware not found. +Profile ID: [%1]; Radio ID: [%2] + + + + + Uknown error during Simulator startup. + + + + + SimulatorMainWindow + + + OpenTx Simulator + + + + + View + + + + + Radio Window + + + + + Reload... + + + + + Tools + + + + + Toolbar + + + + + Reload Lua Scripts + + + + + Reload the Lua environment on the simulated radio. + + + + + F7 + + + + + Reload Radio Data + + + + + Reload all radio data without restarting the simulator. + + + + + F9 + + + + + Key Mapping + + + + + Show keyboard maping reference. + + + + + F1 + + + + + Joystick Settings + + + + + Open joystick configuration settings dialog. + + + + + F3 + + + + + LCD Screenshot + + + + + Save a screenshot of the current simulated LCD screen. + + + + + F8 + + + + + Dock In Main Window + + + + + Show the radio in the main window or as a separate "floating" window. + + + + + Menu Bar + + + + + Show or hide the top menu bar. + + + + + Alt+M + + + + + Constrain Width + + + + + Set radio widget width to be a fixed size. + + + + + Constrain Height + + + + + Set radio widget height to be a fixed size. + + + + + ERROR: Failed to create simulator interface, possibly missing or bad library. + + + + + Alt+T + + + + + Radio Outputs + + + + + F2 + + + + + Telemetry Simulator + + + + + F4 + + + + + Trainer Simulator + + + + + F5 + + + + + Debug Output + + + + + F6 + + + + + <b>Simulator Controls:</b> + + + + + <tr><th>Key/Mouse</th><th>Action</th></tr> + note: must match html layout of each table row (keyTemplate). + + + + + <tr><td><kbd>%1</kbd></td><td>%2</td></tr> + note: must match html layout of help text table header. + + + + + Simulator Help + + + + + SimulatorStartupDialog + + + OpenTX Simulator - Startup Options + + + + + Simulator Startup Options: + + + + + Radio Profile: + + + + + Existing radio profiles are shown here.<br /> +Create or edit profiles using the Companion application. + + + + + Radio Type: + + + + + Existing radio simulators are shown here.<br /> +The radio type specified in the selected profile is used by default. + + + + + Data Source: + + + + + Data File: + + + + + Data Folder: + + + + + SD Image Path: + + + + + Radio data (.bin/.eeprom/.otx) image file to use. A new file with a default image will be created if necessary.<br /> +<b>NOTE</b>: any existing EEPROM data incompatible with the selected radio type may be overwritten! + + + + + Select data file... + + + + + + + ... + ... + + + + Directory containing RADIO and MODELS folders to use.<br /> +New folder(s) with default radio/model will be created here if necessary. + + + + + Select data folder... + + + + + Directory containing the SD card image to use.<br/> +The default is configured in the chosen Radio Profile. + + + + + Select SD card image folder... + + + + + Select which of the data sources (File/Folder/SD Card) you would like to start the simulator with. + + + + + File + Файл + + + + Folder + + + + + SD Path + + + + + All files (*.*) + + + + + Select a data file + + + + + Select Data Directory + + + + + Select SD Card Image Folder + + + + + SimulatorWidget + + + Companion Simulator + + + + + Radio Simulator (%1) + + + + + Could not determine startup data source. + + + + + Could not load data, possibly wrong format. + + + + + Data Load Error + + + + + Invalid startup data provided. Plese specify a proper file/path. + + + + + Simulator Startup Error + + + + + Error saving data: could open file for writing: '%1' + + + + + Error saving data: could not get data from simulator interface. + + + + + An unexpected error occurred while attempting to save radio data to file '%1'. + + + + + Data Save Error + + + + Cannot open joystick, joystick disabled - - Simulating Radio (%1) + + Radio firmware error: %1 - - - Outputs - - - - - Firmware %1 error: %2 + + - Flight Mode %1 (#%2) - SimulatorDialog9X + SliderWidget - - Companion Simulator + + <p>Value (input): <b>%1</b></p> - - - - - Right Double Click to Reset - - - - - - Hold X - - - - - - Fix X - - - - - - Fix Y - - - - - - Hold Y - - - - - BEEP - - - - - 9x Simulator - - - - - Outputs - - - - - Outputs2 - - - - - Gvars - - - - - SimulatorDialogTaranis - - - Companion Simulator - - - - - Outputs2 - - - - - Gvars - - - - - S3 - - - - - S4 - - - - - - Hold Y - - - - - - Fix Y - - - - - - Fix X - - - - - - Hold X - - - - - - - - Right Double Click to Reset - - - - - Taranis Simulator - - - - - Outputs + + Right-double-click to reset to center. @@ -8743,30 +11688,20 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi ... - + ... - + Splash Library - page %1 of %2 - - Warning - Звук - - - + Invalid image in library %1 - - Information - - - - + No valid image found in library, check your settings @@ -8774,256 +11709,487 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi StandardPage - + Channel %1 + + Storage + + + Unable to find file %1! + Невозможно найти файл %1! + + + + StyleEditDialog + + + + + + Style Sheet Editor + + + + + &Reset to default + + + + + &Cancel + + + + + &OK + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. + + + + + Cannot retrieve style %1 +Error: %2 + + + + + Cannot retrieve default style %1 +Error: %2 + + + + + Cannot update custom style %1 +Error: %2 + + + + + Stylesheet + + + Style sheet data read from '%1' + + + + + Style sheet data unable to be read from '%1' + + + + + Cannot create folder '%1' + + + + + Cannot open file for writing '%1': Error: %2 + + + + + Cannot write to file '%1': Error: %2 + + + + + Cannot flush buffer for file '%1': Error: %2 + + + + + Style sheet written to '%1' + + + + + Custom style sheet deleted: '%1' + + + + + Unable to delete custom style sheet: '%1' + + + SyncProcess - - %1/%2 files + + [TEST RUN] - - Create directory %1 + + Gathering file information for %1... + + + + + No files found in %1 + + + + + Synchronization failed, nothing found to copy. + + + + + Synchronization aborted at %1 of %2 files. + + + + + Synchronization finished with %1 files in %2m %3s. + + + + + Synchronizing: %1 + To: %2 + + + + + Starting synchronization: + %1 -> %2 - - Copy %1 to %2 - + + +Too many errors, giving up. - - Write %1 - + + Skipping large file: %1 (%2KB) + + + + + Skipping filtered file: %1 + + + + + Skipping linked file: %1 + + + + + Aborted synchronization of: + + + + + Finished synchronizing: + + + + + Created: %1; Updated: %2; Skipped: %3; Errors: %4; + + + + + Creating directory: %1 + + + + + Could not create directory: %1 + + + + + Directory exists: %1 + + + + + At least one of the file modification dates is in the future, error on: %1 + + + + + Skipping older file: %1 + + + + + Could not open source file '%1': %2 + + + + + Could not open destination file '%1': %2 + + + + + Skipping identical file: %1 + + + + + Replacing file: %1 + + + + + Could not delete destination file '%1': %2 + + + + + Creating file: %1 + + + + + Copy failed: '%1' to '%2': %3 TailPage - + Rudder Channel: - + Руль направления: - + Elevator Channel: - + Руль высоты: - + Only one channel still available!<br>You probably should configure your model without using the wizard. - + Доступен только один канал!<br>Возможно стоит настроить модель без использования этого мастера. TailSelectionPage - + Elevator and Rudder - + Руль высоты и руль направления - + Only Elevator - + Только руль высоты - + V-tail - + V-образное оперение - + Tail Type: - + Тип хвостового оперения: Telemetry - + A1 - + A2 - + RSSI - + Alarm 1 - - + + ---- - - + + Yellow - - + + Orange - - + + Red - + + Disable telemetry audio warnings + Отключить головые предупреждения + + + Alarm 2 - - Center Silent - + + Source + Источник - + + Center Silent + Тишина в центре + + + Altitude source - + Volts source - + Top Bar - + Верхняя строка - + Serial Protocol - + Sensors - + Disable multi sensor handling - + Volt source - + Напряжение - + Current source - + Датчик тока Protocol - Протокол + Протокол - + None - + FrSky Sensor Hub - + Blades - + Sink Max - + Сниж. макс. - + Climb Max - + Набор макс. - + Sink Min - + Сниж. мин. - + Climb Min - + Набор мин. - + Vario source - + Вариометр - + Vario limits - + Пределы - + Altimetry - + Измерение высоты - + mAh - + A - + Various - + mAh count - + FAS Offset - + Persistent mAh @@ -9055,19 +12221,19 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi Yellow - + Желтая Orange - + Оранжевая Red - + Красная @@ -9121,7 +12287,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi Meters (m or ft) - + Temp (°) @@ -9137,7 +12303,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - + Range @@ -9150,22 +12316,22 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - + None - + Numbers - + Bars - + Script @@ -9193,99 +12359,104 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi TelemetryPanel - + FrSky S.PORT - + FrSky D - + FrSky D (cable) - + Telemetry screen %1 - + + Source + Источник + + + Low Alarm - + Низкий уровень - + Critical Alarm - + Критический уровень - + Winged Shadow How High - + Winged Shadow How High (not supported) - + Alti - + Alti+ - + VSpeed - - - + + + A1 - - - + + + A2 - - + + A3 - - + + A4 - - + + FAS - + Cells - + --- @@ -9298,259 +12469,274 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - + Custom - + Calculated - + Id - + Instance - + + Rx + + + + Add - + Average - + Min Мин - + Max Макс - + Multiply - + Totalize - + Cell - + Consumption - + Dist - + Cells Sensor : - - - - - - - - + + + + + + + + --- - + GPS Sensor : - + Alt. Sensor : - + Sensor : - + V - + A - + mA - + kt - + m/s - + ft/s - + km/h - + mph - + m - + ft - - + + °C - - + + °F - + % - + mAh - + W - + + mW + + + + dBm - + g - - + + ° - - mL - - - - - US fl.Oz. - - - - - Raw (-) - - - - - RPM - - - - - Precision + + Rad + mL + + + + + US fl.Oz. + + + + + Raw (-) + + + + + RPM + + + + + Precision + + + + Ratio - + Blades - + Offset - Смещен. + - + Multiplier - + Auto Offset - + Filter - + Persistent - + Positive - + Logs @@ -9558,22 +12744,22 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi TelemetrySensorPanel - + Lowest - + Cell %1 - + Highest - + Delta @@ -9581,242 +12767,361 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi TelemetrySimulator - + Telemetry Simulator - - Vario Altitude - - - - - V-ALT - - - - - Vario Vertical Speed - - - - - V-VSPD - - - - - ACCZ - - - - - GPS Time - - - - - GPS-T - - - - - ACCX - - - - - GPS Lat/Lon - - - - - GPS-LL - - - - + VFAS - - FAS-V - - - - - GPS Speed - - - - - GPS-S - - - - - CELLS - - - - - ACCY - - - - - GPS Course - - - - - GPS-C - - - - - GPS Altitude - - - - - GPS-A - - - - - CURRENT - - - - - FAS-C - - - - - 30 - - - - + RSSI - - 75 - - - - - SWR - - - - - FR_ID_AIR_SPEED - - - - - ASPD - - - - + A1 - + A2 - + + Simulate + + + + + RAS + + + + + + + V / ratio + + + + + Db + + + + + RxBt + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> + + + + + Tmp1 + + + + A3 - + A4 - - Temperature 1 + + Tmp2 - - T1 + + Fuel - - Temperature 2 + + + °C - - T2 + + ml - + + % + + + + + + Meters + + + + + Alt + + + + + VSpd + + + + + m/s + + + + + Fuel Qty + + + + + + km/h + + + + + Hdg + + + + + ASpd + + + + + + + G + + + + + GPS + + + + + Lat,Lon +(dec.deg.) + + + + + AccX + + + + + dd-MM-yyyy +hh:mm:ss + + + + + Date + + + + + Amps + + + + + AccZ + + + + + GAlt + + + + + + Volts + + + + + Cels + + + + + Curr + + + + + AccY + + + + + GSpd + + + + + Degrees + + + + + Replay SD Log File + + + + + Replay rate + + + + + Load + + + + + |> + + + + + <| + + + + + > + + + + + <- + + + + + X + + + + + Row # +Timestamp + + + + + 1/5x + + + + + 5x + + + + + No Log File Currently Loaded + + + + + Setting RSSI to zero simulates telemetry and radio link loss. + + + + + Set RSSI to zero when paused. + + + + + Stop sending telemetry data when the Telemetry Simulator window is hidden. + + + + + Pause simulation when hidden. + + + + + RPM - - FUEL - - - - + When enabled, sends any non-blank values as simulated telemetry data. - - simulate + + Log File - - Instance + + LOG Files (*.csv) - - 2 - - - - - <html><head/><body><p>Start with <span style=" font-style:italic;">0x</span> for hex, <span style=" font-style:italic;">0</span> for octal, otherwise decimal.<br/>Numeric entry only. Blank values are not sent.</p></body></html> + + ERROR - invalid file ThrottlePage - + Yes - + Да - + No - + Нет - + <br>Throttle Channel: - + Канал газа: @@ -9824,50 +13129,88 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi Countdown - + Отсчет Minute Call + Ежеминутный сигнал + + + + TimerData + + + TMR + + + Timer %1 + Таймер %1 + + + + TimerEdit + + + Use mouse scroll or UP/DOWN arrow keys to change time in small steps. +CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + Используйте колесо мыши или стрелки ВВЕРХ/ВНИЗ для изменений с небольшим шагом +CTRL+колесо или PAGE UP/DOWN - для изменения с большим шагом. + + + + m + м + + + + h + ч + + + + s + с + TimerPanel - + Silent - + Тихо - + Beeps - + Писком - + Voice - + Голосом - + Haptic - + Вибрацией - + Not persistent - + Сбрасываемый - + Persistent (flight) - + Постоянный (только полет) - + Persistent (manual reset) - + Постоянный (только ручной сброс) @@ -9996,345 +13339,423 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi TrainerSimulator - + Trainer simulator - VTailPage + TreeModel - - First Tail Channel: + + Index + Номер + + + + Name + Название + + + + Size + Размер + + + + RX # - + + Models + Translators do NOT use accent for this, this is the default category name on Horus. + Модели + + + + Model %1 + Translators: do NOT use accents here, this is a default model name. + Модель %1 + + + + VTailPage + + + First Tail Channel: + Первый канал управления: + + + Second Tail Channel: + Второй канал управления: + + + + VirtualJoystickWidget + + + Hld Y + + + + + Hold Vertical stick position. + + + + + Fix Y + + + + + Prevent Vertical movement of stick. + + + + + Fix X + + + + + Prevent Horizontal movement of stick. + + + + + Hld X + + + + + Hold Horizontal stick position. WingtypeSelectionPage - + Standard Wing - + Классическая схема - + Flying Wing / Deltawing - + Летающее крыло WizardDialog - + Model Wizard - + Мастер по настройке модели - + Model Type - + Тип модели - + Enter model name and model type. - + Введите название модели и выберите её тип. - + Throttle - Газ + Газ - + Has your model got a motor or an engine? - + У вашей модели есть двигатель? - + Wing Type - + Тип крыла - + Is your model a flying wing/deltawing or has it a standard wing configuration? - + У вас классический самолет или летающее крыло? - + Ailerons - + Элероны - + Has your model got ailerons? - + У вашей модели есть элероны? - + Flaps - + Закрылки - + Has your model got flaps? - + У вашей модели есть закрылки? - + Airbrakes - + Воздушные тормоза - + Has your model got airbrakes? - + У вашей модели есть воздушные тормоза? - + Flying-wing / Delta-wing - + Летающее крыло - + Select the elevons channels - - - - - Rudder - Руддер - - - - Does your model have a rudder? - - - - - Tail Type - - - - - Select which type of tail your model is equiped with. - - - - - - Tail - - - - - - Select channels for tail control. - - - - - V-Tail - - - - - Select elevator channel. - + Выберите каналы элевонов + Rudder + Руль направления + + + + Does your model have a rudder? + У вашей модели есть руль направления? + + + + Tail Type + Тип хвостового оперения + + + + Select which type of tail your model is equiped with. + Выберите тип хвостового оперения модели. + + + + + Tail + Хвостовое оперение + + + + + Select channels for tail control. + Выберите каналы для хвостового оперения. + + + + V-Tail + V-образное оперение + + + + Select elevator channel. + Выберите канал руля высоты. + + + Cyclic - + Which type of swash control is installed in your helicopter? - + Tail Gyro - + Has your helicopter got an adjustable gyro for the tail? - + Rotor Type - + Has your helicopter got a flybar? - - + + Helicopter - + Вертолет - - + + Select the controls for your helicopter - + Multirotor - + Мультикоптер - + Select the control channels for your multirotor - + Model Options - + Дополнительные опции - + Select additional options - + Выберите необходимое - + Save Changes - + Сохранить изменения - + Manually check the direction of each control surface and reverse any channels that make controls move in the wrong direction. Remove the propeller/propellers before you try to control your model for the first time.<br>Please note that continuing removes all old model settings! - + Вручную проверьте направление движения всех управляющих поверхностей, настройке реверсы там, где это необходимо. <br>Снимите пропеллер перед тестированием.<br>Учтите, что сохранение перезапишет старые настройки модели! - + Enter a name for your model and select model type. - + Введите название модели и выберите её тип. - + Select the receiver channel that is connected to your ESC or throttle servo.<br><br>Throttle - Spektrum: CH1, Futaba: CH3 - - - - - Most aircraft have a main wing and a tail with control surfaces. Flying wings and delta winged aircraft only have a single wing. The main control surface on a standard wing controls the roll of the aircraft. This surface is called an aileron.<br>The control surface of a delta wing controls both roll and pitch. This surface is called an elevon. - + Выберите канал на приемнике, к которому подключен регулятор скорости или сервомашинка для газа.<br><br>Spektrum: Канал1, Futaba: Канал3 + Most aircraft have a main wing and a tail with control surfaces. Flying wings and delta winged aircraft only have a single wing. The main control surface on a standard wing controls the roll of the aircraft. This surface is called an aileron.<br>The control surface of a delta wing controls both roll and pitch. This surface is called an elevon. + Большинство самолетов имеют нормальную аэродинамическую схему (классическую). У летающих крыльев нет хвостового оперения. <br>В классической схеме за крен отвечают элероны.<br>У летающих крыльев элевоны отвечают и за крен и за тангаж. + + + Models use one or two channels to control the ailerons.<br>A so called Y-cable can be used to connect a single receiver channel to two separate aileron servos. If your servos are connected by a Y-cable you should select the single-servo option.<br><br>Aileron - Spektrum: CH2, Futaba: CH1 - + Для управления элеронами используется 1 или 2 канала.<br>Так называемый Y-кабель нужен для подключения одного канала к двум сервомашинкам.<br>Если сервомашнки подключены таким кабелем, то выберите вариант с одним каналом<br><br>Элероны на Spektrum: Канал2. На Futaba: Канал1 - + This wizard assumes that your flaps are controlled by a switch. If your flaps are controlled by a potentiometer you can change that manually later. - + В этом мастере подразумевается, что закрылки управляются тумблером. Если вы используете крутилку, тогда придется настроить её вручную. - + Air brakes are used to reduce the speed of advanced sail planes.<br>They are very uncommon on other types of planes. - + Воздушные тормоза нужны для снижения скорости планеров.<br>Они редко используются на других типах самолетов. - + Models use two channels to control the elevons.<br>Select these two channels - + Для управления элевонами нужно 2 канала. Выберите их - + Select the receiver channel that is connected to your rudder.<br><br>Rudder - Spektrum: CH4, Futaba: CH4 - + Выберите канал, к которому подключен руль направления.<br><br>Руль направления - Spektrum: Канал4, Futaba: Канал4 - + Select the tail type of your plane. - + Нужно выбрать тип хвостового оперения модели. - - Select the Rudder and Elevator channels.<br><br>Rudder - Spektrum: CH4, Futaba: CH4<br>Elevator - Spektrum: CH3, Futaba: CH2 - - - - Select the Elevator channel.<br><br>Elevator - Spektrum: CH3, Futaba: CH2 - + Select the Rudder and Elevator channels.<br><br>Rudder - Spektrum: CH4, Futaba: CH4<br>Elevator - Spektrum: CH3, Futaba: CH2 + Выберите каналы для руля высоты и руля направления.<br><br>Руль направления - Spektrum: Канал4, Futaba: Канал4<br>Руль высоты - Spektrum: Канал3, Futaba: Канал2 - - - - - - - + + Select the Elevator channel.<br><br>Elevator - Spektrum: CH3, Futaba: CH2 + Выберите канал руля высоты.<br><br>Руль высоты - Spektrum: Канал3, Futaba: Канал2 + + + + + + + + + TBD. - + Select the control channels for your multirotor.<br><br>Throttle - Spektrum: CH1, Futaba: CH3<br>Yaw - Spektrum: CH4, Futaba: CH4<br>Pitch - Spektrum: CH3, Futaba: CH2<br>Roll - Spektrum: CH2, Futaba: CH1 - + There is no help available for the current page. - + Model Wizard Help - + Помощь по использованию мастера WizardPrinter - + Plane - + Multicopter - + Helicopter - + Model Name: - + Model Type: - + Options: - + Channel %1: @@ -10342,7 +13763,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi burnConfigDialog - + AVRDUDE Configuration Настроить программатор @@ -10497,39 +13918,34 @@ Please only use this if you know what you are doing. There are no error checks - + DFU-UTIL Configuration - + SAM-BA Configuration - - - + + + Select Location Выбрать расположение - + List available programmers Показать список программаторов - + Avrdude help - - Companion - - - - + <b><u>WARNING!</u></b><br>Normally CPU type is automatically selected according to the chosen firmware.<br>If you change the CPU type the resulting eeprom could be inconsistent. @@ -10548,382 +13964,153 @@ m2560 for v4.1 boards - - CustomizeSplashDialog - - - Transmitter Splash Screen Editor - - - - - - Invert - Инверт - - - - - Load FW - - - - - - Load Pict - - - - - - Load Profile - - - - - - Save - - - - - - Open Splash Library - - - - - - - - ... - - - - - - - - Error - Ошибка - - - - Open Firmware File - - - - - Can not load embedded image from firmware file %1. - - - - - Open Image to load - - - - - Images (%1) - - - - - Cannot load the image file %1. - - - - - Cannot load profile image %1. - - - - - Cannot load the library image %1. - - - - - File Saved - - - - - The image was saved to the file %1 - - - - - Image Refresh Error - - - - - Failed to refresh image from file %1 - - - - - File Save Error - - - - - Failed to write image to %1 - - - - - downloadDialog - - - Downloading: - - - - - Unable to save the file %1: %2. - - - - - Companion - - - - - Download failed: %1. - - - joystickDialog Configure Joystick - + Настройки джойстика - + Ch2 - - - - - - - - - Not Assigned - - - - - - - - - - - - Right Vertical - - - - - - - - - - - - Right Horizontal - - - - - - - - - - - - Left Vertical - - - - - - - - - - - - Left Horizontal - - - - - - - - - - - - P1 - - - - - - - - - - - - P2 - - - - - - - - - - - - P3/LS - - - - - - - - - - - - RS - - - - + Ch1 - + Ch4 - + Ch6 - + Ch3 - + Ch5 - + Ch7 - + Ch8 - + Instructions - + Инструкции - + + Enable + Включить + + + Cancel + Отмена + + + + Back + Назад + + + + Start - - Next + + Not Assigned - - Ok + + Stick - + + Knob/Slider %1 + + + + + No joysticks found + Джойстик не найден + + + + Press the Start button to start the stick range calibration procedure. +You may change the channel assignments or inversion at any time. + + + + Move sticks and pots in every direction making full movement -Press next when finished +Press Next when finished - - - Error - Ошибка + + Next + Дальше - - Cannot open joystick. - - - - + Place sticks and pots in middle position. -Press next when done +Press Next when done - + Map joystick channels to controls using comboboxes. -Press next when done +Press Next when done. - - Check inversion checkbox to get maximum at top-right position. -Press next when done + + Check inversion checkbox to if necessary to reverse direction. +Press Next when done. - - Press ok to save configuration -Press cancel to abort joystick calibration + + Press OK to save configuration +Press Cancel to abort joystick calibration without saving. - - Duplicated stick assignment + + Calibration not complete, save anyway? - - - mdiChild - - Simulate Tx - + + Ok + Ок + + + + Cannot open joystick. + Не удалось подключить джойстик. @@ -10937,109 +14124,109 @@ Press cancel to abort joystick calibration ... - + ... Splash library behaviour - + Библиотека заставок Remember simulator switches - + Запоминать положения тумблеров Include companion splashes - + Добавить кортинки Companion Only user defined splashes - + Только пользовательские заставки Custom TX splash screen - + Пользовательская заставка Personal splash library - + Моя библиотека заставок Joystick - + Джойстик Open Folder - + Выбрать папку Simulator capture folder - + Папка для скриншотов Use clipboard only - + Только копировать в буфер обмена Simu BackLight - + Подсветка в симуляторе Blue Blu - + Синяя Green - + Зеленая Red - + Красная Orange - + Оранжевая Yellow - + Желтая Enable - + Включить Calibrate - + Калибровать Open Image - + Выбрать картинку Invert Pixels - + Инверсия diff --git a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua index 11edfe67d..ddd83039d 100755 --- a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua +++ b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua @@ -16,37 +16,59 @@ ---- # # ---- ######################################################################### -local shadowed = 0 - -local options = { +local _options = { { "Sensor", SOURCE, 0 }, { "Color", COLOR, WHITE }, { "Shadow", BOOL, 0 }, - { "LowestCell", BOOL, 0 } + { "LowestCell", BOOL, 1 } } --- This function is runned once at the creation of the widget +-- This function is run once at the creation of the widget local function create(zone, options) - local myZone = { zone=zone, options=options, counter=0 } - histCellData = {} + local wgt = { + zone = zone, + options = options, + counter = 0, - -- use default if user did not set, So widget is operational when selecting the widget - if myZone.options.Sensor == 0 then - myZone.options.Sensor = "Cels" + shadowed = 0, + no_telem_blink = 0, + isDataAvailable = 0, + cellDataLive = {0,0,0,0,0,0}, + cellDataHistoryLowest = {0,0,0,0,0,0}, + cellDataHistoryCellLowest = 5, + cellMax = 0, + cellMin = 0, + cellAvg = 0, + cellPercent = 0, + cellCount = 0, + cellSum = 0, + mainValue = 0, + secondaryValue = 0 + } + + -- use default if user did not set, So widget is operational on "select widget" + if wgt.options.Sensor == 0 then + wgt.options.Sensor = "Cels" end - return myZone + wgt.options.LowestCell = wgt.options.LowestCell % 2 -- modulo due to bug that cause the value to be other than 0|1 + + return wgt end -- This function allow updates when you change widgets settings -local function update(myZone, options) - myZone.options = options +local function update(wgt, options) + if (wgt == nil) then return end - -- use default if user did not set, So widget is operational when selecting the widget - if myZone.options.Sensor == 0 then - myZone.options.Sensor = "Cels" + wgt.options = options + + -- use default if user did not set, So widget is operational on "select widget" + if wgt.options.Sensor == 0 then + wgt.options.Sensor = "Cels" end + wgt.options.LowestCell = wgt.options.LowestCell % 2 -- modulo due to bug that cause the value to be other than 0|1 + end -- A quick and dirty check for empty table @@ -57,345 +79,373 @@ local function isEmpty(self) return true end ---- This function returns a table with cels values -local function getCels(sensor) - liveCellData = getValue(sensor) - if type(liveCellData) == "table" then - -- initialize historical table if not done yet - if isEmpty(histCellData) then - for k, v in pairs(liveCellData) do - histCellData[k] = v - end - end - -- this is necessary for simu where cellcount can change - if #histCellData ~= #liveCellData then - for k, v in pairs(liveCellData) do - histCellData[k] = v - end - end - -- stores the lowest cell values in historical table - for k, v in pairs(liveCellData) do - if v < histCellData[k] then histCellData[k] = v end - end - else - -- erase low cell memory when you change lipo - histCellData = {} - end - return liveCellData -end - ---- This function returns the number of cels -local function getCellCount(cellData) - return #cellData -end - ---- This function returns the value of the highest of all cels -local function getCellMax(cellData) - cellMax = 0 - if type(cellData) == "table" then - for k, v in pairs(cellData) do - if v > cellMax then cellMax = v end - end - end - return cellMax -end - ---- This function returns the value of the lowest of all cels -local function getCellMin(cellData) - cellMin = 5 - if type(cellData) == "table" then - for k, v in pairs(cellData) do - if v < cellMin then cellMin = v end - end - end - return cellMin -end - --- This function return the percentage remaining in a single Lipo cel local function getCellPercent(cellValue) if cellValue == nil then return 0 end - --## Data gathered from commercial lipo sensors - local myArrayPercentList = -{{3, 0}, {3.093, 1}, {3.196, 2}, {3.301, 3}, {3.401, 4}, {3.477, 5}, {3.544, 6}, {3.601, 7}, {3.637, 8}, {3.664, 9}, {3.679, 10}, {3.683, 11}, {3.689, 12}, {3.692, 13}, {3.705, 14}, {3.71, 15}, {3.713, 16}, {3.715, 17}, {3.72, 18}, {3.731, 19}, {3.735, 20}, {3.744, 21}, {3.753, 22}, {3.756, 23}, {3.758, 24}, {3.762, 25}, {3.767, 26}, {3.774, 27}, {3.78, 28}, {3.783, 29}, {3.786, 30}, {3.789, 31}, {3.794, 32}, {3.797, 33}, {3.8, 34}, {3.802, 35}, {3.805, 36}, {3.808, 37}, {3.811, 38}, {3.815, 39}, {3.818, 40}, {3.822, 41}, {3.825, 42}, {3.829, 43}, {3.833, 44}, {3.836, 45}, {3.84, 46}, {3.843, 47}, {3.847, 48}, {3.85, 49}, {3.854, 50}, {3.857, 51}, {3.86, 52}, {3.863, 53}, {3.866, 54}, {3.87, 55}, {3.874, 56}, {3.879, 57}, {3.888, 58}, {3.893, 59}, {3.897, 60}, {3.902, 61}, {3.906, 62}, {3.911, 63}, {3.918, 64}, {3.923, 65}, {3.928, 66}, {3.939, 67}, {3.943, 68}, {3.949, 69}, {3.955, 70}, {3.961, 71}, {3.968, 72}, {3.974, 73}, {3.981, 74}, {3.987, 75}, {3.994, 76}, {4.001, 77}, {4.007, 78}, {4.014, 79}, {4.021, 80}, {4.029, 81}, {4.036, 82}, {4.044, 83}, {4.052, 84}, {4.062, 85}, {4.074, 86}, {4.085, 87}, {4.095, 88}, {4.105, 89}, {4.111, 90}, {4.116, 91}, {4.12, 92}, {4.125, 93}, {4.129, 94}, {4.135, 95}, {4.145, 96}, {4.176, 97}, {4.179, 98}, {4.193, 99}, {4.2, 100}} - for i, v in ipairs( myArrayPercentList ) do - if v[ 1 ] >= cellValue then - result = v[ 2 ] + -- in case somehow voltage is higher, don't return nil + if (cellValue > 4.2) then + return 100 + end + + -- Data gathered from commercial lipo sensors + local myArrayPercentList = { {3,0},{3.093,1},{3.196,2},{3.301,3},{3.401,4},{3.477,5},{3.544,6},{3.601,7},{3.637,8},{3.664,9},{3.679,10},{3.683,11},{3.689,12},{3.692,13},{3.705,14},{3.71,15},{3.713,16},{3.715,17},{3.72,18},{3.731,19},{3.735,20},{3.744,21},{3.753,22},{3.756,23},{3.758,24},{3.762,25},{3.767,26},{3.774,27},{3.78,28},{3.783,29},{3.786,30},{3.789,31},{3.794,32},{3.797,33},{3.8,34},{3.802,35},{3.805,36},{3.808,37},{3.811,38},{3.815,39},{3.818,40},{3.822,41},{3.825,42},{3.829,43},{3.833,44},{3.836,45},{3.84,46},{3.843,47},{3.847,48},{3.85,49},{3.854,50},{3.857,51},{3.86,52},{3.863,53},{3.866,54},{3.87,55},{3.874,56},{3.879,57},{3.888,58},{3.893,59},{3.897,60},{3.902,61},{3.906,62},{3.911,63},{3.918,64},{3.923,65},{3.928,66},{3.939,67},{3.943,68},{3.949,69},{3.955,70},{3.961,71},{3.968,72},{3.974,73},{3.981,74},{3.987,75},{3.994,76},{4.001,77},{4.007,78},{4.014,79},{4.021,80},{4.029,81},{4.036,82},{4.044,83},{4.052,84},{4.062,85},{4.074,86},{4.085,87},{4.095,88},{4.105,89},{4.111,90},{4.116,91},{4.12,92},{4.125,93},{4.129,94},{4.135,95},{4.145,96},{4.176,97},{4.179,98},{4.193,99},{4.2,100} } + + for i, v in ipairs(myArrayPercentList) do + if v[1] >= cellValue then + result = v[2] break - end + end end return result end ---- This function parse each individual cell and return the sum of all cels -local function getCellSum(cellData) - cellSum = 0 - if type(cellData) == "table" then - for k, v in pairs(cellData) do cellSum = cellSum + v end +--- This function returns a table with cels values +local function calculateBatteryData(wgt) + + local newCellData = getValue(wgt.options.Sensor) + + if type(newCellData) ~= "table" then + wgt.isDataAvailable = false + return end - return cellSum + + + -- this is necessary for simu where cell-count can change + if #wgt.cellDataHistoryLowest ~= #newCellData then + wgt.cellDataHistoryLowest = {} + for k, v in pairs(newCellData) do + wgt.cellDataHistoryLowest[k] = v + end + end + -- stores the lowest cell values in historical table + for k, v in pairs(newCellData) do + if v < wgt.cellDataHistoryLowest[k] then + wgt.cellDataHistoryLowest[k] = v + end + end + + --- calc highest of all cels + local cellMax = 0 + for k, v in pairs(newCellData) do + if v > cellMax then + cellMax = v + end + end + wgt.cellMax = cellMax + + --- calc lowest of all cels + local cellMin = 5 + for k, v in pairs(newCellData) do + if v < cellMin and v > 1 then -- >1 to ignore invalid values + cellMin = v + end + end + wgt.cellMin = cellMin + + --- calc history lowest of all cells + if cellMin < wgt.cellDataHistoryCellLowest and cellMin > 1 then -- >1 to ignore invalid values + wgt.cellDataHistoryCellLowest = cellMin + end + + wgt.cellCount = #newCellData + + --- sum of all cells + local cellSum = 0 + for k, v in pairs(newCellData) do + cellSum = cellSum + v + end + wgt.cellSum = cellSum + + --- average of all cells + wgt.cellAvg = wgt.cellSum / wgt.cellCount + wgt.cellPercent = getCellPercent(wgt.cellMin) + + wgt.cellDataLive = newCellData + + -- mainValue + if wgt.options.LowestCell == 1 then + wgt.mainValue = wgt.cellMin + elseif wgt.options.LowestCell == 0 then + wgt.mainValue = wgt.cellSum + else + wgt.mainValue = "-1" + end + + -- secondaryValue + if wgt.options.LowestCell == 1 then + wgt.secondaryValue = wgt.cellSum + elseif wgt.options.LowestCell == 0 then + wgt.secondaryValue = wgt.cellMin + else + wgt.secondaryValue = "-2" + end + + + wgt.isDataAvailable = true + + end ---- This function returns the average of all cels -local function getCellAvg(cellData) - if type(cellData) == "table" then - return getCellSum(cellData)/getCellCount(cellData) - end -end --- This function returns green at 100%, red bellow 30% and graduate in between -- color for battery -local function getPercentColor(cpercent) - if cpercent < 30 then +-- This function returns green at 100%, red bellow 30% and graduate in between +local function getPercentColor(percent) + if percent < 30 then return lcd.RGB(0xff, 0, 0) else - g = math.floor(0xdf * cpercent / 100) + g = math.floor(0xdf * percent / 100) r = 0xdf - g return lcd.RGB(r, g, 0) end end --- This function returns green at gvalue, red at rvalue and graduate in between -- color for cell -local function getRangeColor(value, gvalue, rvalue) - if gvalue > rvalue and not range==0 then - range = gvalue - rvalue - if value > gvalue then return lcd.RGB(0, 0xdf, 0) end - if value < rvalue then return lcd.RGB(0xdf, 0, 0) end - g = math.floor(0xdf * (value-rvalue) / range) +-- This function returns green at gvalue, red at rvalue and graduate in between +local function getRangeColor(value, green_value, red_value) + local range = math.abs(green_value - red_value) + if range==0 then return lcd.RGB(0, 0xdf, 0) end + + if green_value > red_value then + if value > green_value then return lcd.RGB(0, 0xdf, 0) end + if value < red_value then return lcd.RGB(0xdf, 0, 0) end + g = math.floor(0xdf * (value - red_value) / range) r = 0xdf - g return lcd.RGB(r, g, 0) else - range = rvalue - gvalue - if value > gvalue then return lcd.RGB(0, 0xdf, 0) end - if value < rvalue then return lcd.RGB(0xdf, 0, 0) end - r = math.floor(0xdf * (value-gvalue) / range) + if value > green_value then return lcd.RGB(0, 0xdf, 0) end + if value < red_value then return lcd.RGB(0xdf, 0, 0) end + r = math.floor(0xdf * (value - green_value) / range) g = 0xdf - r return lcd.RGB(r, g, 0) end end -local function getMainValue(mySensor, options) - if options.LowestCell == 1 then - return getCellMin(mySensor) - else - return getCellSum(mySensor) - end + +--- Zone size: 70x39 1/8th top bar +local function refreshZoneTiny(wgt) + local myString = string.format("%2.1fV", wgt.mainValue) + lcd.drawText(wgt.zone.x + wgt.zone.w -25, wgt.zone.y + 5, wgt.cellPercent .. "%", RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x + wgt.zone.w -25, wgt.zone.y + 20, myString, RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + -- draw batt + lcd.drawRectangle(wgt.zone.x + 50, wgt.zone.y + 9, 16, 25, CUSTOM_COLOR, 2) + lcd.drawFilledRectangle(wgt.zone.x +50 + 4, wgt.zone.y + 7, 6, 3, CUSTOM_COLOR) + local rect_h = math.floor(25 * wgt.cellPercent / 100) + lcd.drawFilledRectangle(wgt.zone.x +50, wgt.zone.y + 9 + 25 - rect_h, 16, rect_h, CUSTOM_COLOR + wgt.no_telem_blink) end -local function getSecondaryValue(mySensor, options) - if options.LowestCell == 1 then - return getCellSum(mySensor) - else - return getCellMin(mySensor) - end -end - - --- This size is for top bar widgets -local function refreshZoneTiny(zone) - local mySensor = getCels(zone.options.Sensor) - local isHaveData = (type(mySensor) == "table") - if isHaveData then - local myString = string.format("%2.1fV", getMainValue(mySensor, zone.options)) - local percent = getCellPercent(getCellAvg(mySensor)) - lcd.drawText(zone.zone.x + zone.zone.w, zone.zone.y, percent.."%", RIGHT + SMLSIZE + CUSTOM_COLOR) - lcd.drawText(zone.zone.x + zone.zone.w, zone.zone.y + 15, myString, RIGHT + SMLSIZE + CUSTOM_COLOR) - -- draw batt - lcd.drawRectangle(zone.zone.x, zone.zone.y + 6, 16, 25, CUSTOM_COLOR, 2) - lcd.drawFilledRectangle(zone.zone.x + 4, zone.zone.y + 4, 6, 3, CUSTOM_COLOR) - local rect_h = math.floor(25 * percent / 100) - lcd.drawFilledRectangle(zone.zone.x, zone.zone.y + 6 + 25 - rect_h , 16, rect_h, CUSTOM_COLOR) - end -end - ---- Size is 160x32 1/8th -local function refreshZoneSmall(zone) - local myBatt = {["x"]=0, ["y"]=0, ["w"]=155, ["h"]=35, ["segments_w"]=25, ["color"]=WHITE, ["cath_w"]=6, ["cath_h"]=20} - local mySensor = getCels(zone.options.Sensor) - local isDataAvailable = (type(mySensor) == "table") - - local percent = getCellPercent(getCellAvg(mySensor)) +--- Zone size: 160x32 1/8th +local function refreshZoneSmall(wgt) + local myBatt = { ["x"] = 0, ["y"] = 0, ["w"] = 155, ["h"] = 35, ["segments_w"] = 25, ["color"] = WHITE, ["cath_w"] = 6, ["cath_h"] = 20 } -- draws bat lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y, myBatt.w, myBatt.h, CUSTOM_COLOR, 2) - lcd.drawFilledRectangle(zone.zone.x + myBatt.x + myBatt.w, zone.zone.y + myBatt.h/2 - myBatt.cath_h/2, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) + lcd.drawRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y, myBatt.w, myBatt.h, CUSTOM_COLOR, 2) + + -- fill batt + lcd.setColor(CUSTOM_COLOR, getPercentColor(wgt.cellPercent)) + lcd.drawGauge(wgt.zone.x + 2, wgt.zone.y + 2, myBatt.w - 4, wgt.zone.h, wgt.cellPercent, 100, CUSTOM_COLOR) - -- fils batt - lcd.setColor(CUSTOM_COLOR, getPercentColor(percent)) - lcd.drawGauge(zone.zone.x+2, zone.zone.y+2, myBatt.w-4, zone.zone.h, percent, 100, CUSTOM_COLOR) -- write text - if isDataAvailable then - lcd.setColor(CUSTOM_COLOR, zone.options.Color) - local topLine = string.format("%2.1fV %2.0f%%", getMainValue(mySensor, zone.options), percent) - lcd.drawText(zone.zone.x + 20, zone.zone.y +2, topLine , MIDSIZE + CUSTOM_COLOR + shadowed) + if wgt.isDataAvailable then + lcd.setColor(CUSTOM_COLOR, wgt.options.Color) else - lcd.drawText(zone.zone.x + 10, zone.zone.y+10, "No Cells Data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) + lcd.setColor(CUSTOM_COLOR, GREY) end + local topLine = string.format("%2.1fV %2.0f%%", wgt.mainValue, wgt.cellPercent) + lcd.drawText(wgt.zone.x + 20, wgt.zone.y + 2, topLine, MIDSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) - - return end ---- Size is 225x98 1/4th (no sliders/trim) -local function refreshZoneMedium(zone) - local myBatt = {["x"]=0, ["y"]=0, ["w"]=85, ["h"]=35, ["segments_w"]=15, ["color"]=WHITE, ["cath_w"]=6, ["cath_h"]=20} - local mySensor = getCels(zone.options.Sensor) - local isDataAvailable = (type(mySensor) == "table") +--- Zone size: 180x70 1/4th (with sliders/trim) +--- Zone size: 225x98 1/4th (no sliders/trim) +local function refreshZoneMedium(wgt) + local myBatt = { ["x"] = 0, ["y"] = 0, ["w"] = 85, ["h"] = 35, ["segments_w"] = 15, ["color"] = WHITE, ["cath_w"] = 6, ["cath_h"] = 20 } - lcd.setColor(CUSTOM_COLOR, zone.options.Color) - if isDataAvailable then - -- draw values - local percent = getCellPercent(getCellAvg(mySensor)) - lcd.drawText(zone.zone.x + zone.zone.w, zone.zone.y, string.format("%2.1fV", getMainValue(mySensor, zone.options)) , DBLSIZE + CUSTOM_COLOR + RIGHT+ shadowed) - - -- fils batt - lcd.setColor(CUSTOM_COLOR, getPercentColor(percent)) - lcd.drawGauge(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y, myBatt.w, myBatt.h, percent, 100, CUSTOM_COLOR) - -- draw cells - local pos = {{x=2, y=38}, {x=60, y=38}, {x=118, y=38}, {x=2, y=57}, {x=60, y=57}, {x=118, y=57}} - for i=1, getCellCount(mySensor), 1 do - lcd.setColor(CUSTOM_COLOR, getRangeColor(mySensor[i], getCellMax(mySensor), getCellMax(mySensor) - 0.2)) - lcd.drawFilledRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 58, 20, CUSTOM_COLOR) - lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawText(zone.zone.x + pos[i].x+10, zone.zone.y + pos[i].y, string.format("%.2f", mySensor[i]), CUSTOM_COLOR + shadowed) - lcd.drawRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 59, 20, CUSTOM_COLOR,1) - end + if wgt.isDataAvailable then + lcd.setColor(CUSTOM_COLOR, wgt.options.Color) else - lcd.drawText(zone.zone.x, zone.zone.y+35, "No Cells Data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR) + lcd.setColor(CUSTOM_COLOR, GREY) end + + -- draw values + lcd.drawText(wgt.zone.x, wgt.zone.y + 35, string.format("%2.1fV", wgt.mainValue), DBLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) + + -- more info if 1/4 is high enough (without trim & slider) + if wgt.zone.h > 80 then + lcd.drawText(wgt.zone.x , wgt.zone.y + 70, string.format("%2.2fV" , wgt.secondaryValue), SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x + 50, wgt.zone.y + 70, string.format("dV %2.2fV", wgt.cellMax - wgt.cellMin), SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x , wgt.zone.y + 84, string.format("Min %2.2fV", wgt.cellDataHistoryCellLowest), SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + end + + -- fill batt + lcd.setColor(CUSTOM_COLOR, getPercentColor(wgt.cellPercent)) + lcd.drawGauge(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y, myBatt.w, myBatt.h, wgt.cellPercent, 100, CUSTOM_COLOR) + + -- draw cells + local cellH = wgt.zone.h / wgt.cellCount + if cellH > 20 then cellH =20 end + local cellX = 118 + local cellW = 58 + for i = 1, wgt.cellCount, 1 do + local cellY = wgt.zone.y + (i-1)* (cellH -1) + + -- fill current value + lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataLive[i], wgt.cellMax, wgt.cellMax - 0.2)) + --lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, 58, cellH, CUSTOM_COLOR) + local percentCurrent = getCellPercent(wgt.cellDataLive[i]) + local percentMin = getCellPercent(wgt.cellDataHistoryLowest[i]) + + lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, cellW * percentCurrent / 100, cellH, CUSTOM_COLOR) + -- fill min + lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataHistoryLowest[i], wgt.cellMax, wgt.cellMax - 0.2)) + lcd.drawFilledRectangle(wgt.zone.x + cellX + ((percentCurrent - percentMin) / 100) , cellY, cellW - (cellW * (percentCurrent - percentMin) / 100), cellH, CUSTOM_COLOR) + + lcd.setColor(CUSTOM_COLOR, WHITE) + lcd.drawText (wgt.zone.x + cellX + 10, cellY, string.format("%.2f", wgt.cellDataLive[i]), SMLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) + lcd.drawRectangle (wgt.zone.x + cellX , cellY, 59, cellH, CUSTOM_COLOR , 1) + end + -- draws bat lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawRectangle(zone.zone.x + myBatt.x , zone.zone.y + myBatt.y, myBatt.w, myBatt.h, CUSTOM_COLOR, 2) - lcd.drawFilledRectangle(zone.zone.x + myBatt.x + myBatt.w, zone.zone.y + myBatt.h/2 - myBatt.cath_h/2, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) - lcd.drawText(zone.zone.x + myBatt.x + 20 , zone.zone.y + myBatt.y + 5, string.format("%2.0f%%", getCellPercent(getCellAvg(mySensor))), LEFT + MIDSIZE + CUSTOM_COLOR + shadowed) - --for i=1, myBatt.w - myBatt.segments_w, myBatt.segments_w do - -- lcd.drawRectangle(zone.zone.x + myBatt.x + i, zone.zone.y + myBatt.y, myBatt.segments_w, myBatt.h, CUSTOM_COLOR, 1) - --end - return + lcd.drawRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y, myBatt.w, myBatt.h, CUSTOM_COLOR, 2) + lcd.drawFilledRectangle(wgt.zone.x + myBatt.x + myBatt.w, wgt.zone.y + myBatt.h / 2 - myBatt.cath_h / 2, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) + lcd.drawText(wgt.zone.x + myBatt.x + 20, wgt.zone.y + myBatt.y + 5, string.format("%2.0f%%", wgt.cellPercent), LEFT + MIDSIZE + CUSTOM_COLOR + wgt.shadowed) + end ---- Size is 192x152 1/2 -local function refreshZoneLarge(zone) - local myBatt = {["x"]=0, ["y"]=18, ["w"]=76, ["h"]=121, ["segments_h"]=30, ["color"]=WHITE, ["cath_w"]=30, ["cath_h"]=10} - local mySensor = getCels(zone.options.Sensor) - local isDataAvailable = (type(mySensor) == "table") +--- Zone size: 192x152 1/2 +local function refreshZoneLarge(wgt) + local myBatt = { ["x"] = 0, ["y"] = 18, ["w"] = 76, ["h"] = 121, ["segments_h"] = 30, ["color"] = WHITE, ["cath_w"] = 30, ["cath_h"] = 10 } - lcd.setColor(CUSTOM_COLOR, zone.options.Color) - if isDataAvailable then - local percent = getCellPercent(getCellAvg(mySensor)) - - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y, percent.."%", RIGHT + DBLSIZE + CUSTOM_COLOR + shadowed) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y+30, string.format("%2.1fV", getMainValue(mySensor, zone.options)), RIGHT + DBLSIZE + CUSTOM_COLOR + shadowed) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y+70, string.format("%2.1fV %2.1fS", getSecondaryValue(mySensor, options), getCellCount(mySensor)), RIGHT + SMLSIZE + CUSTOM_COLOR + shadowed) - -- fils batt - lcd.setColor(CUSTOM_COLOR, getPercentColor(percent)) - lcd.drawFilledRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y + myBatt.h + myBatt.cath_h - math.floor(percent/100 * myBatt.h), myBatt.w, math.floor(percent/100 * myBatt.h), CUSTOM_COLOR) - -- draw cells - local pos = {{x=80, y=90}, {x=138, y=90}, {x=80, y=109}, {x=138, y=109}, {x=80, y=128}, {x=138, y=128}} - for i=1, getCellCount(mySensor), 1 do - lcd.setColor(CUSTOM_COLOR, getRangeColor(mySensor[i], getCellMax(mySensor), getCellMax(mySensor) - 0.2)) - lcd.drawFilledRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 58, 20, CUSTOM_COLOR) - lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawText(zone.zone.x + pos[i].x+10, zone.zone.y + pos[i].y, string.format("%.2f", mySensor[i]), CUSTOM_COLOR + shadowed) - lcd.drawRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 59, 20, CUSTOM_COLOR, 1) - end + if wgt.isDataAvailable then + lcd.setColor(CUSTOM_COLOR, wgt.options.Color) else - lcd.drawText(zone.zone.x+5, zone.zone.y, "No Cells Data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) + lcd.setColor(CUSTOM_COLOR, GREY) end - -- draws bat + + lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y, wgt.cellPercent .. "%", RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed) + lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + 30, string.format("%2.1fV", wgt.mainValue), RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed) + lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + 70, string.format("%2.1fV %2.1fS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed) + -- fill batt + lcd.setColor(CUSTOM_COLOR, getPercentColor(wgt.cellPercent)) + lcd.drawFilledRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y + myBatt.h + myBatt.cath_h - math.floor(wgt.cellPercent / 100 * myBatt.h), myBatt.w, math.floor(wgt.cellPercent / 100 * myBatt.h), CUSTOM_COLOR) + -- draw cells + local pos = { { x = 80, y = 90 }, { x = 138, y = 90 }, { x = 80, y = 109 }, { x = 138, y = 109 }, { x = 80, y = 128 }, { x = 138, y = 128 } } + for i = 1, wgt.cellCount, 1 do + lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataLive[i], wgt.cellMax, wgt.cellMax - 0.2)) + lcd.drawFilledRectangle(wgt.zone.x + pos[i].x, wgt.zone.y + pos[i].y, 58, 20, CUSTOM_COLOR) + lcd.setColor(CUSTOM_COLOR, WHITE) + lcd.drawText(wgt.zone.x + pos[i].x + 10, wgt.zone.y + pos[i].y, string.format("%.2f", wgt.cellDataLive[i]), CUSTOM_COLOR + wgt.shadowed) + lcd.drawRectangle(wgt.zone.x + pos[i].x, wgt.zone.y + pos[i].y, 59, 20, CUSTOM_COLOR, 1) + end + + -- draw bat lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y + myBatt.cath_h , myBatt.w, myBatt.h, CUSTOM_COLOR, 2) - lcd.drawFilledRectangle(zone.zone.x + myBatt.x + myBatt.w/2 - myBatt.cath_w/2, zone.zone.y + myBatt.y, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) - for i=1, myBatt.h - myBatt.segments_h, myBatt.segments_h do - lcd.drawRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y + myBatt.cath_h + i, myBatt.w, myBatt.segments_h, CUSTOM_COLOR, 1) + lcd.drawRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y + myBatt.cath_h, myBatt.w, myBatt.h, CUSTOM_COLOR, 2) + lcd.drawFilledRectangle(wgt.zone.x + myBatt.x + myBatt.w / 2 - myBatt.cath_w / 2, wgt.zone.y + myBatt.y, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) + for i = 1, myBatt.h - myBatt.segments_h, myBatt.segments_h do + lcd.drawRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y + myBatt.cath_h + i, myBatt.w, myBatt.segments_h, CUSTOM_COLOR, 1) end - return + end ---- Size is 390x172 1/1 ---- Size is 460x252 1/1 (no sliders/trim/topbar) -local function refreshZoneXLarge(zone) - local myBatt = {["x"]=10, ["y"]=20, ["w"]=80, ["h"]=121, ["segments_h"]=30, ["color"]=WHITE, ["cath_w"]=30, ["cath_h"]=10} - local mySensor = getCels(zone.options.Sensor) - local isDataAvailable = (type(mySensor) == "table") +--- Zone size: 390x172 1/1 +--- Zone size: 460x252 1/1 (no sliders/trim/topbar) +local function refreshZoneXLarge(wgt) + local myBatt = { ["x"] = 10, ["y"] = 20, ["w"] = 80, ["h"] = 121, ["segments_h"] = 30, ["color"] = WHITE, ["cath_w"] = 30, ["cath_h"] = 10 } - lcd.setColor(CUSTOM_COLOR, zone.options.Color) - if isDataAvailable then - local percent = getCellPercent(getCellAvg(mySensor)) - -- fils batt - lcd.setColor(CUSTOM_COLOR, getPercentColor(percent)) - lcd.drawFilledRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y + myBatt.h + myBatt.cath_h - math.floor(percent/100 * myBatt.h), myBatt.w, math.floor(percent/100 * myBatt.h), CUSTOM_COLOR) - -- draw right text section - lcd.setColor(CUSTOM_COLOR, zone.options.Color) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y + myBatt.y, percent.."%", RIGHT + DBLSIZE + CUSTOM_COLOR + shadowed) + lcd.setColor(CUSTOM_COLOR, wgt.options.Color) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y + myBatt.y + 30, string.format("%2.1fV", getMainValue(mySensor, zone.options)), RIGHT + DBLSIZE + CUSTOM_COLOR + shadowed) - lcd.drawText(zone.zone.x+zone.zone.w, zone.zone.y + myBatt.y + 105, string.format("%2.1fV %2.1fS", getSecondaryValue(mySensor, zone.options), getCellCount(mySensor)) , RIGHT + SMLSIZE + CUSTOM_COLOR + shadowed) + -- fill batt + lcd.setColor(CUSTOM_COLOR, getPercentColor(wgt.cellPercent)) + lcd.drawFilledRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y + myBatt.h + myBatt.cath_h - math.floor(wgt.cellPercent / 100 * myBatt.h), myBatt.w, math.floor(wgt.cellPercent / 100 * myBatt.h), CUSTOM_COLOR) - -- draw cells - local pos = {{x=111, y=38}, {x=164, y=38}, {x=217, y=38}, {x=111, y=57}, {x=164, y=57}, {x=217, y=57}} - for i=1, getCellCount(mySensor), 1 do - lcd.setColor(CUSTOM_COLOR, getRangeColor(mySensor[i], getCellMax(mySensor), getCellMax(mySensor) - 0.2)) - lcd.drawFilledRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 53, 20, CUSTOM_COLOR) - lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawText(zone.zone.x + pos[i].x+10, zone.zone.y + pos[i].y, string.format("%.2f", mySensor[i]), CUSTOM_COLOR + shadowed) - lcd.drawRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 54, 20, CUSTOM_COLOR, 1) - end - -- draw cells for lowest cells - local pos = {{x=111, y=110}, {x=164, y=110}, {x=217, y=110}, {x=111, y=129}, {x=164, y=129}, {x=217, y=129}} - for i=1, getCellCount(mySensor), 1 do - lcd.setColor(CUSTOM_COLOR, getRangeColor(histCellData[i], mySensor[i], mySensor[i] - 0.3)) - lcd.drawFilledRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 53, 20, CUSTOM_COLOR) - lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawRectangle(zone.zone.x + pos[i].x, zone.zone.y + pos[i].y, 54, 20, CUSTOM_COLOR, 1) - lcd.drawText(zone.zone.x + pos[i].x+10, zone.zone.y + pos[i].y, string.format("%.2f", histCellData[i]), CUSTOM_COLOR + shadowed) - end + -- draw right text section + if wgt.isDataAvailable then + lcd.setColor(CUSTOM_COLOR, wgt.options.Color) else - lcd.drawText(zone.zone.x+5, zone.zone.y, "No Cells Data", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR) + lcd.setColor(CUSTOM_COLOR, GREY) end + lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y, wgt.cellPercent .. "%", RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) + + lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y + 30, string.format("%2.1fV", wgt.mainValue), RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y + 105, string.format("%2.1fV %2.1fS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) + + -- draw cells + local pos = { { x = 111, y = 38 }, { x = 164, y = 38 }, { x = 217, y = 38 }, { x = 111, y = 57 }, { x = 164, y = 57 }, { x = 217, y = 57 } } + for i = 1, wgt.cellCount, 1 do + lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataLive[i], wgt.cellMax, wgt.cellMax - 0.2)) + lcd.drawFilledRectangle(wgt.zone.x + pos[i].x, wgt.zone.y + pos[i].y, 53, 20, CUSTOM_COLOR) + lcd.setColor(CUSTOM_COLOR, WHITE) + lcd.drawText(wgt.zone.x + pos[i].x + 10, wgt.zone.y + pos[i].y, string.format("%.2f", wgt.cellDataLive[i]), CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) + lcd.drawRectangle(wgt.zone.x + pos[i].x, wgt.zone.y + pos[i].y, 54, 20, CUSTOM_COLOR, 1) + end + -- draw cells for lowest cells + local pos = { { x = 111, y = 110 }, { x = 164, y = 110 }, { x = 217, y = 110 }, { x = 111, y = 129 }, { x = 164, y = 129 }, { x = 217, y = 129 } } + for i = 1, wgt.cellCount, 1 do + lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataHistoryLowest[i], wgt.cellDataLive[i], wgt.cellDataLive[i] - 0.3)) + lcd.drawFilledRectangle(wgt.zone.x + pos[i].x, wgt.zone.y + pos[i].y, 53, 20, CUSTOM_COLOR) + lcd.setColor(CUSTOM_COLOR, WHITE) + lcd.drawRectangle(wgt.zone.x + pos[i].x, wgt.zone.y + pos[i].y, 54, 20, CUSTOM_COLOR, 1) + lcd.drawText(wgt.zone.x + pos[i].x + 10, wgt.zone.y + pos[i].y, string.format("%.2f", wgt.cellDataHistoryLowest[i]), CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) + end + -- draws bat lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y + myBatt.cath_h , myBatt.w, myBatt.h, CUSTOM_COLOR, 2) - lcd.drawFilledRectangle(zone.zone.x + myBatt.x + myBatt.w/2 - myBatt.cath_w/2, zone.zone.y + myBatt.y, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) - for i=1, myBatt.h - myBatt.segments_h, myBatt.segments_h do - lcd.drawRectangle(zone.zone.x + myBatt.x, zone.zone.y + myBatt.y + myBatt.cath_h + i, myBatt.w, myBatt.segments_h, CUSTOM_COLOR, 1) + lcd.drawRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y + myBatt.cath_h, myBatt.w, myBatt.h, CUSTOM_COLOR, 2) + lcd.drawFilledRectangle(wgt.zone.x + myBatt.x + myBatt.w / 2 - myBatt.cath_w / 2, wgt.zone.y + myBatt.y, myBatt.cath_w, myBatt.cath_h, CUSTOM_COLOR) + for i = 1, myBatt.h - myBatt.segments_h, myBatt.segments_h do + lcd.drawRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y + myBatt.cath_h + i, myBatt.w, myBatt.segments_h, CUSTOM_COLOR, 1) end -- draw middle rectangles - lcd.drawRectangle(zone.zone.x + 110, zone.zone.y + 38, 161, 40, CUSTOM_COLOR, 1) - lcd.drawText(zone.zone.x + 220, zone.zone.y + 21, "Live data", RIGHT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) - lcd.drawRectangle(zone.zone.x + 110, zone.zone.y + 110, 161, 40, CUSTOM_COLOR, 1) - lcd.drawText(zone.zone.x + 230, zone.zone.y + 93, "Lowest data", RIGHT + SMLSIZE + INVERS + CUSTOM_COLOR + shadowed) + lcd.drawRectangle(wgt.zone.x + 110, wgt.zone.y + 38, 161, 40, CUSTOM_COLOR, 1) + lcd.drawText(wgt.zone.x + 220, wgt.zone.y + 21, "Live data", RIGHT + SMLSIZE + INVERS + CUSTOM_COLOR + wgt.shadowed) + lcd.drawRectangle(wgt.zone.x + 110, wgt.zone.y + 110, 161, 40, CUSTOM_COLOR, 1) + lcd.drawText(wgt.zone.x + 230, wgt.zone.y + 93, "Lowest data", RIGHT + SMLSIZE + INVERS + CUSTOM_COLOR + wgt.shadowed) return end --- This function allow recording of lowest cells when widget is not active -local function background(myZone) - getCels(myZone.options.Sensor) - return +-- This function allow recording of lowest cells when widget is in background +local function background(wgt) + if (wgt == nil) then return end + + calculateBatteryData(wgt) + end -function refresh(myZone) - if myZone.options.Shadow == 1 then - shadowed = SHADOWED +local function refresh(wgt) + + if (wgt == nil) then return end + if (wgt.options == nil) then return end + if (wgt.zone == nil) then return end + if (wgt.options.LowestCell == nil) then return end + + if wgt.options.Shadow == 1 then + wgt.shadowed = SHADOWED else - shadowed = 0 + wgt.shadowed = 0 end - --if myZone.options.Sensor == 1 then - -- lcd.drawText(myZone.zone.x+2, myZone.zone.y+2, "Not configured", LEFT + SMLSIZE + CUSTOM_COLOR) - -- lcd.drawText(myZone.zone.x+2, myZone.zone.y+20, "Requires setting a Voltage Sensor", LEFT + SMLSIZE + INVERS + CUSTOM_COLOR) - -- return - --end - if myZone.zone.w > 380 and myZone.zone.h > 165 then refreshZoneXLarge(myZone) - elseif myZone.zone.w > 180 and myZone.zone.h > 145 then refreshZoneLarge(myZone) - elseif myZone.zone.w > 170 and myZone.zone.h > 65 then refreshZoneMedium(myZone) - elseif myZone.zone.w > 150 and myZone.zone.h > 28 then refreshZoneSmall(myZone) - elseif myZone.zone.w > 65 and myZone.zone.h > 35 then refreshZoneTiny(myZone) + + calculateBatteryData(wgt) + + if wgt.isDataAvailable then + wgt.no_telem_blink = 0 + else + wgt.no_telem_blink = INVERS + BLINK end + + + if wgt.zone.w > 380 and wgt.zone.h > 165 then refreshZoneXLarge(wgt) + elseif wgt.zone.w > 180 and wgt.zone.h > 145 then refreshZoneLarge(wgt) + elseif wgt.zone.w > 170 and wgt.zone.h > 65 then refreshZoneMedium(wgt) + elseif wgt.zone.w > 150 and wgt.zone.h > 28 then refreshZoneSmall(wgt) + elseif wgt.zone.w > 65 and wgt.zone.h > 35 then refreshZoneTiny(wgt) + end + end -return { name="BattCheck", options=options, create=create, update=update, background=background, refresh=refresh } +return { name="BattCheck", options=_options, create=create, update=update, background=background, refresh=refresh } diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index 99a2bd43c..4414cbc1e 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -21,7 +21,7 @@ #include "opentx.h" #include "gui/common/stdlcd/fonts.h" -pixel_t displayBuf[DISPLAY_BUFFER_SIZE]; +pixel_t displayBuf[DISPLAY_BUFFER_SIZE] __DMA; void lcdClear() { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 27e436fae..dd5503655 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -262,7 +262,11 @@ void onModelAntennaSwitchConfirm(const char * result) #define EXTERNAL_ANTENNA_ROW #endif -#if defined(PCBX7) || defined(PCBX9LITE) +#if defined(PCBX7ACCESS) + #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) + #define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW +#elif defined(PCBX7) || defined(PCBX9LITE) #if defined(BLUETOOTH) #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), #else @@ -1488,15 +1492,9 @@ void menuModelSetup(event_t event) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); if (attr) { - if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, 0, 70); - } - else if (multi_proto == MODULE_SUBTYPE_MULTI_OLRS) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -1, 7); - } - else { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); - } + int8_t min, max; + getMultiOptionValues(multi_proto, min, max); + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, min, max); } } #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index da9606694..aeefd9885 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1241,15 +1241,9 @@ void menuModelSetup(event_t event) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); if (attr) { - if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, 0, 70); - } - else if (multi_proto == MODULE_SUBTYPE_MULTI_OLRS) { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -1, 7); - } - else { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); - } + int8_t min, max; + getMultiOptionValues(multi_proto, min, max); + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, min, max); } } #endif diff --git a/radio/src/gui/colorlcd/menus.h b/radio/src/gui/colorlcd/menus.h index e6fd60d75..289019dd1 100644 --- a/radio/src/gui/colorlcd/menus.h +++ b/radio/src/gui/colorlcd/menus.h @@ -326,7 +326,6 @@ extern uint8_t warningInfoFlags; #define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) -#define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0) #define POPUP_MENU_MAX_LINES 12 #define MENU_MAX_DISPLAY_LINES 9 #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index efe9b62ca..2e72af936 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -309,7 +309,7 @@ void menuRadioSdManager(event_t _event) REFRESH_FILES(); break; -#if defined(PCBX9) || defined(RADIO_X7) // TODO NO_MENU_KEY +#if defined(PCBX9) || defined(RADIO_X7) || defined(RADIO_X7ACCESS) // TODO NO_MENU_KEY case EVT_KEY_LONG(KEY_MENU): if (SD_CARD_PRESENT() && !READ_ONLY() && s_editMode == 0) { killEvents(_event); @@ -345,7 +345,7 @@ void menuRadioSdManager(event_t _event) break; case EVT_KEY_LONG(KEY_ENTER): -#if !defined(PCBX9) && !defined(RADIO_X7) // TODO NO_HEADER_LINE +#if !defined(PCBX9) && !defined(RADIO_X7) && !defined(RADIO_X7ACCESS) // TODO NO_HEADER_LINE if (menuVerticalPosition < HEADER_LINE) { killEvents(_event); POPUP_MENU_ADD_ITEM(STR_SD_INFO); diff --git a/radio/src/io/bootloader_flash.cpp b/radio/src/io/bootloader_flash.cpp index 0bbe87b42..5be24b373 100644 --- a/radio/src/io/bootloader_flash.cpp +++ b/radio/src/io/bootloader_flash.cpp @@ -37,10 +37,13 @@ bool isBootloader(const char * filename) void bootloaderFlash(const char * filename) { FIL file; - f_open(&file, filename, FA_READ); uint8_t buffer[1024]; UINT count; + pausePulses(); + + f_open(&file, filename, FA_READ); + static uint8_t unlocked = 0; if (!unlocked) { unlocked = 1; @@ -71,6 +74,7 @@ void bootloaderFlash(const char * filename) } watchdogSuspend(0); + WDG_RESET(); if (unlocked) { lockFlash(); @@ -78,4 +82,6 @@ void bootloaderFlash(const char * filename) } f_close(&file); + + resumePulses(); } diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index b9776f69f..693ac7ef8 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -46,7 +46,7 @@ const char * logsOpen() { // Determine and set log file filename FRESULT result; - char filename[34]; // /LOGS/modelnamexxx-2013-01-01.log + char filename[sizeof(LOGS_PATH) + LEN_MODEL_NAME + 16]; // /LOGS/modelnamexxxxxx_2013-01-01.log if (!sdMounted()) return STR_NO_SDCARD; @@ -61,13 +61,13 @@ const char * logsOpen() return error; } - filename[sizeof(LOGS_PATH)-1] = '/'; + filename[sizeof(LOGS_PATH) - 1] = '/'; memcpy(&filename[sizeof(LOGS_PATH)], g_model.header.name, sizeof(g_model.header.name)); - filename[sizeof(LOGS_PATH)+sizeof(g_model.header.name)] = '\0'; + filename[sizeof(LOGS_PATH) + LEN_MODEL_NAME] = '\0'; - uint8_t i = sizeof(LOGS_PATH)+sizeof(g_model.header.name)-1; + uint8_t i = sizeof(LOGS_PATH) + LEN_MODEL_NAME - 1; uint8_t len = 0; - while (i>sizeof(LOGS_PATH)-1) { + while (i > sizeof(LOGS_PATH) - 1) { if (!len && filename[i]) len = i+1; if (len) { @@ -197,6 +197,10 @@ void logsWrite() { static const char * error_displayed = nullptr; + if (!sdMounted()) { + return; + } + if (isFunctionActive(FUNCTION_LOGS) && logDelay > 0) { tmr10ms_t tmr10ms = get_tmr10ms(); if (lastLogTime == 0 || (tmr10ms_t)(tmr10ms - lastLogTime) >= (tmr10ms_t)logDelay*10) { diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt index b2abeb7fb..39488df3f 100644 --- a/radio/src/lua/CMakeLists.txt +++ b/radio/src/lua/CMakeLists.txt @@ -16,15 +16,16 @@ set(LUA_INCLUDES ) if(PYTHONINTERP_FOUND) - add_lua_export_target(x9lite ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITE -DPCBX9) - add_lua_export_target(x9lites ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITES -DPCBX9LITE -DPCBX9) - add_lua_export_target(x7 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_X7) - add_lua_export_target(xlite ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITE) - add_lua_export_target(xlites ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITES -DPCBXLITE -DGYRO) - add_lua_export_target(x9d ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9D -DPCBX9) - add_lua_export_target(x9e ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9E -DPCBX9) - add_lua_export_target(x10 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10) - add_lua_export_target(x12s ${LUA_INCLUDES} -DPCBHORUS -DPCBX12S) - add_lua_export_target(t12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T12) - add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16) + add_lua_export_target(x9lite ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITE -DPCBX9) + add_lua_export_target(x9lites ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITES -DPCBX9LITE -DPCBX9) + add_lua_export_target(x7 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_X7) + add_lua_export_target(x7access ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7ACCESS -DPCBX7 -DRADIO_X7ACCESS) + add_lua_export_target(xlite ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITE) + add_lua_export_target(xlites ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITES -DPCBXLITE -DGYRO) + add_lua_export_target(x9d ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9D -DPCBX9) + add_lua_export_target(x9e ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9E -DPCBX9) + add_lua_export_target(x10 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10) + add_lua_export_target(x12s ${LUA_INCLUDES} -DPCBHORUS -DPCBX12S) + add_lua_export_target(t12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T12) + add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16) endif() diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 7ee2175b3..c70b57359 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -34,6 +34,8 @@ #include "lua/lua_exports_x10.inc" #elif defined(PCBX9E) #include "lua/lua_exports_x9e.inc" +#elif defined(RADIO_X7ACCESS) + #include "lua/lua_exports_x7access.inc" #elif defined(RADIO_X7) #include "lua/lua_exports_x7.inc" #elif defined(RADIO_T12) diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 787c48c5c..5fcd88a37 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -19,6 +19,7 @@ */ #include "opentx.h" + #if defined(LIBOPENUI) #include "mainwindow.h" #endif @@ -27,7 +28,24 @@ uint8_t currentSpeakerVolume = 255; uint8_t requiredSpeakerVolume = 255; uint8_t mainRequestFlags = 0; -#if defined(STM32) +#if defined(LIBOPENUI) +void openUsbMenu() +{ + auto menu = new Menu(); + menu->setTitle("USB"); + menu->addLine(STR_USB_JOYSTICK, [] { + setSelectedUsbMode(USB_JOYSTICK_MODE); + }); + menu->addLine(STR_USB_MASS_STORAGE, [] { + setSelectedUsbMode(USB_MASS_STORAGE_MODE); + }); +#if defined(DEBUG) + menu->addLine(STR_USB_SERIAL, [] { + setSelectedUsbMode(USB_SERIAL_MODE); + }); +#endif +} +#elif defined(STM32) void onUSBConnectMenu(const char *result) { if (result == STR_USB_MASS_STORAGE) { @@ -40,43 +58,46 @@ void onUSBConnectMenu(const char *result) setSelectedUsbMode(USB_SERIAL_MODE); } } + +void openUsbMenu() +{ + POPUP_MENU_ADD_ITEM(STR_USB_JOYSTICK); + POPUP_MENU_ADD_ITEM(STR_USB_MASS_STORAGE); +#if defined(DEBUG) + POPUP_MENU_ADD_ITEM(STR_USB_SERIAL); +#endif + POPUP_MENU_START(onUSBConnectMenu); +} #endif void handleUsbConnection() { #if defined(STM32) && !defined(SIMU) - if (!usbStarted() && usbPlugged() && !(getSelectedUsbMode() == USB_UNSELECTED_MODE)) { - usbStart(); - if (getSelectedUsbMode() == USB_MASS_STORAGE_MODE) { - opentxClose(false); - usbPluggedIn(); + if (!usbStarted() && usbPlugged()) { + if (getSelectedUsbMode() == USB_UNSELECTED_MODE) { + if (g_eeGeneral.USBMode == USB_UNSELECTED_MODE && popupMenuItemsCount == 0) { + openUsbMenu(); + } + else { + setSelectedUsbMode(g_eeGeneral.USBMode); + } + } + else { + if (getSelectedUsbMode() == USB_MASS_STORAGE_MODE) { + opentxClose(false); + usbPluggedIn(); + } + usbStart(); } } -#if defined(COLORLCD) -#warning "USB popup" -#else - if (!usbStarted() && usbPlugged() && getSelectedUsbMode() == USB_UNSELECTED_MODE) { - if (g_eeGeneral.USBMode == USB_UNSELECTED_MODE && popupMenuItemsCount == 0) { - POPUP_MENU_ADD_ITEM(STR_USB_JOYSTICK); - POPUP_MENU_ADD_ITEM(STR_USB_MASS_STORAGE); -#if defined(USB_SERIAL) - POPUP_MENU_ADD_ITEM(STR_USB_SERIAL); -#endif - POPUP_MENU_START(onUSBConnectMenu); - } - if (g_eeGeneral.USBMode != USB_UNSELECTED_MODE) { - setSelectedUsbMode(g_eeGeneral.USBMode); - } - } -#endif + if (usbStarted() && !usbPlugged()) { usbStop(); if (getSelectedUsbMode() == USB_MASS_STORAGE_MODE) { opentxResume(); + putEvent(EVT_ENTRY); } -#if !defined(BOOT) setSelectedUsbMode(USB_UNSELECTED_MODE); -#endif } #endif // defined(STM32) && !defined(SIMU) } @@ -164,12 +185,10 @@ void checkSpeakerVolume() #if defined(EEPROM) void checkEeprom() { - if (!usbPlugged()) { - if (eepromIsWriting()) - eepromWriteProcess(); - else if (TIME_TO_WRITE()) - storageCheck(false); - } + if (eepromIsWriting()) + eepromWriteProcess(); + else if (TIME_TO_WRITE()) + storageCheck(false); } #else void checkEeprom() @@ -494,13 +513,20 @@ void perMain() #if defined(PCBSKY9X) calcConsumption(); #endif + checkSpeakerVolume(); - checkEeprom(); - logsWrite(); + + if (!usbPlugged()) { + checkEeprom(); + logsWrite(); + } + handleUsbConnection(); + #if defined(PCBXLITES) handleJackConnection(); #endif + checkTrainerSettings(); periodicTick(); DEBUG_TIMER_STOP(debugTimerPerMain1); @@ -511,7 +537,7 @@ void perMain() mainRequestFlags &= ~(1 << REQUEST_FLIGHT_RESET); } - doLoopCommonActions(); + checkBacklight(); #if !defined(LIBOPENUI) event_t evt = getEvent(false); @@ -525,14 +551,14 @@ void perMain() #endif #if defined(STM32) - if (SD_CARD_PRESENT() && !sdMounted()) { + if (!usbPlugged() && SD_CARD_PRESENT() && !sdMounted()) { sdMount(); } #endif #if !defined(EEPROM) // In case the SD card is removed during the session - if (!SD_CARD_PRESENT() && !globalData.unexpectedShutdown) { + if (!usbPlugged() && !SD_CARD_PRESENT() && !globalData.unexpectedShutdown) { drawFatalErrorScreen(STR_NO_SDCARD); return; } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 5b408b966..53f3718bf 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -722,11 +722,6 @@ void checkBacklight() } } -void doLoopCommonActions() -{ - checkBacklight(); -} - void backlightOn() { lightOffCounter = ((uint16_t)g_eeGeneral.lightAutoOff*250) << 1; @@ -813,7 +808,7 @@ void doSplash() } #endif - doLoopCommonActions(); + checkBacklight(); } } } @@ -1049,7 +1044,7 @@ void checkThrottleStick() } #endif - doLoopCommonActions(); + checkBacklight(); WDG_RESET(); @@ -1089,7 +1084,7 @@ void alert(const char * title, const char * msg , uint8_t sound) if (getEvent()) // wait for key release break; - doLoopCommonActions(); + checkBacklight(); WDG_RESET(); @@ -1634,8 +1629,9 @@ void opentxClose(uint8_t shutdown) { TRACE("opentxClose"); + watchdogSuspend(2000/*20s*/); + if (shutdown) { - watchdogSuspend(2000/*20s*/); pausePulses(); // stop mixer task to disable trims processing while in shutdown AUDIO_BYE(); // TODO needed? telemetryEnd(); @@ -2178,7 +2174,13 @@ uint32_t pwrCheck() lcdRefreshWait(); lcdClear(); POPUP_CONFIRMATION(STR_MODEL_SHUTDOWN, nullptr); +#if defined(SHUTDOWN_CONFIRMATION) + if (TELEMETRY_STREAMING() && !g_eeGeneral.disableRssiPoweroffAlarm) { + SET_WARNING_INFO(STR_MODEL_STILL_POWERED, sizeof(TR_MODEL_STILL_POWERED), 0); + } +#else SET_WARNING_INFO(STR_MODEL_STILL_POWERED, sizeof(TR_MODEL_STILL_POWERED), 0); +#endif event_t evt = getEvent(false); DISPLAY_WARNING(evt); lcdRefresh(); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 421f986e4..810135a58 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -659,7 +659,6 @@ static inline void GET_ADC_IF_MIXER_NOT_RUNNING() void backlightOn(); void checkBacklight(); -void doLoopCommonActions(); uint16_t isqrt32(uint32_t n); diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 167d128ee..44db6486b 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -608,6 +608,36 @@ inline void resetMultiProtocolsOptions(uint8_t moduleIdx) g_model.moduleData[moduleIdx].multi.disableMapping = 0; g_model.moduleData[moduleIdx].multi.lowPowerMode = 0; } + +inline void getMultiOptionValues(int8_t multi_proto, int8_t & min, int8_t & max) +{ + switch (multi_proto) { + case MODULE_SUBTYPE_MULTI_DSM2: + min = 0; + max = 1; + break; + case MODULE_SUBTYPE_MULTI_BAYANG: + min = 0; + max = 3; + break; + case MODULE_SUBTYPE_MULTI_OLRS: + min = -1; + max = 7; + break; + case MODULE_SUBTYPE_MULTI_FS_AFHDS2A: + min = 0; + max = 70; + break; + case MODULE_SUBTYPE_MULTI_XN297DP: + min = -1; + max = 84; + break; + default: + min = -128; + max = 127; + break; + } +} #endif #endif // _MODULES_HELPERS_H_ diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index dec339ba3..b9eb75c00 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -25,15 +25,18 @@ template void Pxx1Pulses::addFlag1(uint8_t module, uint8_t sendFailsafe) { uint8_t flag1 = (g_model.moduleData[module].subType << 6); + if (moduleState[module].mode == MODULE_MODE_BIND) { flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; } else if (moduleState[module].mode == MODULE_MODE_RANGECHECK) { flag1 |= PXX_SEND_RANGECHECK; } - else if (sendFailsafe && g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER) { + + if (sendFailsafe && g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER) { flag1 |= PXX_SEND_FAILSAFE; } + PxxTransport::addByte(flag1); } diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 2474178fb..355cf78a5 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -138,8 +138,10 @@ const char * getBasename(const char * path); #define OTX_FOURCC 0x3B78746F // otx for Taranis X-Lite S #elif defined(PCBXLITE) #define OTX_FOURCC 0x3978746F // otx for Taranis X-Lite -#elif defined(RADIO_X7) - #define OTX_FOURCC 0x3678746F // otx for Taranis X7 +#elif defined(RADIO_T12) + #define OTX_FOURCC 0x3D78746F // otx for Jumper T12 +#elif defined(PCBX7) + #define OTX_FOURCC 0x3678746F // otx for Taranis X7 / X7S / X7 Express / X7S Express #elif defined(PCBX9LITES) #define OTX_FOURCC 0x3E78746F // otx for Taranis X9-Lite #elif defined(PCBX9LITE) @@ -150,8 +152,6 @@ const char * getBasename(const char * path); #define OTX_FOURCC 0x3A78746F // otx for NV14 #elif defined(PCBSKY9X) #define OTX_FOURCC 0x3278746F // otx for sky9x -#elif defined(RADIO_T12) - #define OTX_FOURCC 0x3D78746F // otx for Jumper T12 #endif bool isFileAvailable(const char * filename, bool exclDir = false); diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index c833a22ca..fa5ec608a 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -249,7 +249,7 @@ void convertModelData_218_to_219(ModelData &model) newModel.moduleData[i].type += 4; if (newModel.moduleData[i].type == MODULE_TYPE_XJT_PXX1) { newModel.moduleData[i].subType = newModel.moduleData[i].rfProtocol; -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) if (i == INTERNAL_MODULE) { newModel.moduleData[i].type = MODULE_TYPE_ISRM_PXX2; newModel.moduleData[i].subType = MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16; @@ -390,7 +390,7 @@ void convertRadioData_218_to_219(RadioData & settings) settings.backlightColor = oldSettings.backlightColor; settings.switchUnlockStates = oldSettings.switchUnlockStates; settings.switchConfig = oldSettings.switchConfig; -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) settings.switchConfig |= SWITCH_TOGGLE << 16; #endif memcpy(&settings.switchNames[0], &oldSettings.switchNames[0], 8 * LEN_SWITCH_NAME); @@ -441,7 +441,7 @@ void convertRadioData_218_to_219(RadioData & settings) } #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) // force re-calibration settings.chkSum = 0xFFFF; setDefaultOwnerId(); diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 8e8e0d884..9614cd7d6 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -158,11 +158,13 @@ void getSwitchesPosition(bool startup) CHECK_2POS(SW_SH); #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) CHECK_2POS(SW_SI); #endif -#if defined(PCBHORUS) || defined(PCBX7) +#if defined(PCBX7ACCESS) + CHECK_2POS(SW_SI); +#elif defined(PCBHORUS) || defined(PCBX7) CHECK_2POS(SW_SI); CHECK_2POS(SW_SJ); #endif @@ -745,7 +747,7 @@ void checkSwitches() } #endif - doLoopCommonActions(); + checkBacklight(); WDG_RESET(); diff --git a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp index 1d861e1d6..01349d56c 100644 --- a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp +++ b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp @@ -24,7 +24,7 @@ Fifo btTxFifo; Fifo btRxFifo; -#if defined(PCBX7) || defined(PCBXLITE) +#if defined(BLUETOOTH_PROBE) volatile uint8_t btChipPresent = 0; #endif @@ -117,7 +117,7 @@ extern "C" void BT_USART_IRQHandler(void) uint8_t byte = USART_ReceiveData(BT_USART); btRxFifo.push(byte); TRACE("BT %02X", byte); -#if defined(PCBX7) || defined(PCBXLITE) +#if defined(BLUETOOTH_PROBE) if (!btChipPresent) { // This is to differentiate X7 and X7S and X-Lite with/without BT btChipPresent = 1; diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.h b/radio/src/targets/common/arm/stm32/bootloader/boot.h index 140c772e6..4f8e7edc7 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.h +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.h @@ -23,7 +23,12 @@ #include "stamp.h" -#define BOOTLOADER_TITLE " OTX Bootloader - " VERSION +#if LCD_W < 212 + #define BOOTLOADER_TITLE " OTX Bootloader - " VERSION +#else + #define BOOTLOADER_TITLE " OpenTX Bootloader - " VERSION +#endif + #define DISPLAY_CHAR_WIDTH (LCD_COLS+4) #if LCD_W >= 480 diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp index f92c579cb..6eba99d36 100644 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ b/radio/src/targets/horus/bootloader/boot_menu.cpp @@ -73,7 +73,7 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) lcd->clear(DEFAULT_BGCOLOR); if (st == ST_START) { - bootloaderDrawTitle(88, "OpenTX Bootloader"); + bootloaderDrawTitle(88, BOOTLOADER_TITLE); lcd->drawBitmapPattern(90, 72, LBM_FLASH, DEFAULT_COLOR); lcd->drawText(124, 75, "Write Firmware"); diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index b9463ac8f..b4ec95e43 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -605,6 +605,8 @@ class OpenTxSimulatorFactory: public SimulatorFactory return Board::BOARD_HORUS_X12S; #elif defined(PCBX10) return Board::BOARD_X10; +#elif defined(PCBX7ACCESS) + return Board::BOARD_TARANIS_X7_ACCESS; #elif defined(PCBX7) return Board::BOARD_TARANIS_X7; #elif defined(PCBX9LITES) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index ffd155d67..f6d108625 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -38,6 +38,8 @@ if(PCB STREQUAL X9E) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS NO) + set(BLUETOOTH YES) + set(ROTARY_ENCODER YES) elseif(PCB STREQUAL X9D+) set(HAPTIC YES) set(LUA_EXPORT lua_export_x9d) @@ -54,39 +56,43 @@ elseif(PCB STREQUAL X9D+) if (${PCBREV} STREQUAL 2019) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) - set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") + set(FLAVOUR x9d+2019) set(CPU_TYPE STM32F4) set(CPU_TYPE_FULL STM32F407xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) + set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} startup_stm32f40_41xxx.s ) - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) + add_definitions(-DRADIO_X9DP2019) add_definitions(-DSTM32F40_41xxx) add_definitions(-DSOFTWARE_VOLUME -DPWR_BUTTON_${PWR_BUTTON} -DHARDWARE_POWER_MANAGEMENT_UNIT) set(STATUS_LEDS YES) set(PXX2 ON) set(PXX_FREQUENCY "HIGH") - set(FLAVOUR x9d+2019) + set(BLUETOOTH YES) + set(ROTARY_ENCODER YES) + set(INTERNAL_MODULE_SERIAL YES) else() option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) + set(FLAVOUR x9d+) set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) set(STATUS_LEDS NO) - set(FLAVOUR x9d+) endif() elseif(PCB STREQUAL X9D) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) + set(FLAVOUR x9d) set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) option(HAPTIC "Haptic support" OFF) set(LUA_EXPORT lua_export_x9d) - set(FLAVOUR x9d) add_definitions(-DPCBX9D -DPCBX9) add_definitions(-DEEPROM_VARIANT=0) set(GUI_DIR 212x64) @@ -99,34 +105,64 @@ elseif(PCB STREQUAL X9D) set(STATUS_LEDS NO) elseif(PCB STREQUAL X7) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(HAPTIC YES) - if(PCBREV STREQUAL T12) - set(LUA_EXPORT lua_export_t12) - set(FLAVOUR t12) - set(NAVIGATION_TYPE 9x) - add_definitions(-DRADIO_T12) - add_definitions(-DEEPROM_VARIANT=0x4001) - option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" OFF) - else() - option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) - option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) - set(LUA_EXPORT lua_export_x7) - set(FLAVOUR x7) - set(NAVIGATION_TYPE x7) - add_definitions(-DRADIO_X7) - add_definitions(-DEEPROM_VARIANT=0x4000) - endif() - add_definitions(-DPCBX7 -DSOFTWARE_VOLUME) - add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(GUI_DIR 128x64) set(BITMAPS_TARGET 9x_bitmaps) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) + add_definitions(-DPCBX7 -DSOFTWARE_VOLUME) + add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) + if(PCBREV STREQUAL T12) + option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" OFF) + set(FLAVOUR t12) + set(NAVIGATION_TYPE 9x) + set(CPU_TYPE STM32F2) + set(CPU_TYPE_FULL STM32F205xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(LUA_EXPORT lua_export_t12) + add_definitions(-DRADIO_T12) + add_definitions(-DEEPROM_VARIANT=0x4001) + elseif(PCBREV STREQUAL ACCESS) + option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) + option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) + set(FLAVOUR x7access) + set(NAVIGATION_TYPE x7) + set(CPU_TYPE STM32F4) + set(CPU_TYPE_FULL STM32F407xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) + set(LUA_EXPORT lua_export_x7access) + add_definitions(-DRADIO_X7ACCESS) + add_definitions(-DEEPROM_VARIANT=0x4000) + add_definitions(-DPCBREV=${PCBREV}) + add_definitions(-DPCBX7ACCESS) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + startup_stm32f40_41xxx.s + ) + add_definitions(-DSTM32F40_41xxx) + add_definitions(-DHARDWARE_POWER_MANAGEMENT_UNIT) + set(PXX2 ON) + set(PXX_FREQUENCY "HIGH") + set(BLUETOOTH YES) + set(ROTARY_ENCODER YES) + set(INTERNAL_MODULE_SERIAL YES) + else() + option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) + option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) + set(FLAVOUR x7) + set(NAVIGATION_TYPE x7) + set(CPU_TYPE STM32F2) + set(CPU_TYPE_FULL STM32F205xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(LUA_EXPORT lua_export_x7) + add_definitions(-DRADIO_X7) + add_definitions(-DEEPROM_VARIANT=0x4000) + set(BLUETOOTH YES) + add_definitions(-DBLUETOOTH_PROBE) + set(ROTARY_ENCODER YES) + endif() elseif(PCB STREQUAL X9LITE) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) @@ -150,6 +186,8 @@ elseif(PCB STREQUAL X9LITE) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) + set(ROTARY_ENCODER YES) + set(INTERNAL_MODULE_SERIAL YES) elseif(PCB STREQUAL X9LITES) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) @@ -173,6 +211,9 @@ elseif(PCB STREQUAL X9LITES) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) + set(BLUETOOTH YES) + set(ROTARY_ENCODER YES) + set(INTERNAL_MODULE_SERIAL YES) elseif(PCB STREQUAL XLITE) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) @@ -195,6 +236,8 @@ elseif(PCB STREQUAL XLITE) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) + set(BLUETOOTH YES) + set(INTERNAL_MODULE_SERIAL YES) elseif(PCB STREQUAL XLITES) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) @@ -217,9 +260,12 @@ elseif(PCB STREQUAL XLITES) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) set(PXX2 ON) + set(BLUETOOTH YES) + set(GYRO YES) + set(INTERNAL_MODULE_SERIAL YES) endif() -if(PCB STREQUAL XLITES) +if(GYRO) add_definitions(-DGYRO) set(TARGET_SRC ${TARGET_SRC} @@ -231,7 +277,7 @@ if(PCB STREQUAL XLITES) ) endif() -if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)) +if(INTERNAL_MODULE_SERIAL) add_definitions(-DINTERNAL_MODULE_SERIAL) if(PXX_FREQUENCY STREQUAL HIGH) add_definitions(-DPXX_FREQUENCY_HIGH) @@ -247,14 +293,14 @@ elseif(NOT (PCB STREQUAL X7 AND PCBREV STREQUAL T12)) ) endif() -if(PCB STREQUAL X9E OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES) +if(ROTARY_ENCODER) set(TARGET_SRC ${TARGET_SRC} ../common/arm/stm32/rotary_encoder_driver.cpp ) endif() -if(PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT PCBREV STREQUAL T12) OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR PCB STREQUAL X9LITES) +if(BLUETOOTH) add_definitions(-DBLUETOOTH) set(TARGET_SRC ${TARGET_SRC} diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 95a3aaca9..23efa9126 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -333,12 +333,16 @@ enum EnumSwitchesPositions SW_SH1, SW_SH2, #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) SW_SI0, SW_SI1, SW_SI2, #endif -#if defined(PCBX7) +#if defined(PCBX7ACCESS) + SW_SI0, + SW_SI1, + SW_SI2, +#elif defined(PCBX7) SW_SI0, SW_SI1, SW_SI2, @@ -396,6 +400,11 @@ enum EnumSwitchesPositions #define STORAGE_NUM_SWITCHES NUM_SWITCHES #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITHOUT_DETENT << 2); // S1 = pot without detent, S2 = pot with detent +#elif defined(PCBX7ACCESS) + #define NUM_SWITCHES 7 + #define STORAGE_NUM_SWITCHES 8 + #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) + #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent #elif defined(PCBX7) #define NUM_SWITCHES 8 #define STORAGE_NUM_SWITCHES NUM_SWITCHES @@ -417,7 +426,7 @@ enum EnumSwitchesPositions #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define NUM_SWITCHES 9 #define STORAGE_NUM_SWITCHES NUM_SWITCHES #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 16) + (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); @@ -607,7 +616,7 @@ extern uint16_t adcValues[NUM_ANALOGS]; #define BATT_SCALE 123 #elif defined(PCBX9LITE) #define BATT_SCALE 117 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define BATT_SCALE 117 #else #define BATT_SCALE 150 @@ -689,7 +698,9 @@ extern uint32_t telemetryErrors; void telemetryPortInvertedInit(uint32_t baudrate); // PCBREV driver -#if defined(PCBX7) +#if defined(PCBX7ACCESS) + #define HAS_SPORT_UPDATE_CONNECTOR() true +#elif defined(PCBX7) #define IS_PCBREV_40() (GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) == Bit_SET) #define HAS_SPORT_UPDATE_CONNECTOR() IS_PCBREV_40() #elif defined(SPORT_UPDATE_PWR_GPIO) @@ -785,11 +796,11 @@ void bluetoothInit(uint32_t baudrate, bool enable); void bluetoothWriteWakeup(); uint8_t bluetoothIsWriting(); void bluetoothDisable(); -#if defined(PCBX9LITES) +#if defined(PCBX9LITES) || defined(PCBX7ACCESS) #define IS_BLUETOOTH_CHIP_PRESENT() (true) #elif defined(PCBX9LITE) #define IS_BLUETOOTH_CHIP_PRESENT() (false) -#elif (defined(PCBX7) || defined(PCBXLITE)) && !defined(SIMU) +#elif defined(BLUETOOTH_PROBE) && !defined(SIMU) extern volatile uint8_t btChipPresent; #define IS_BLUETOOTH_CHIP_PRESENT() (btChipPresent) #else diff --git a/radio/src/targets/taranis/diskio.cpp b/radio/src/targets/taranis/diskio.cpp index 1fd4ee6e1..41ca3bab9 100644 --- a/radio/src/targets/taranis/diskio.cpp +++ b/radio/src/targets/taranis/diskio.cpp @@ -1026,7 +1026,7 @@ void sdDone() #if defined(LOG_TELEMETRY) f_close(&g_telemetryFile); #endif - f_mount(NULL, "", 0); // unmount SD + f_mount(nullptr, "", 0); // unmount SD } } #endif diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 235e5eefb..0217d173a 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -59,7 +59,7 @@ #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PD.07 #define KEYS_GPIO_REG_RIGHT GPIOD->IDR #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_3 // PD.03 -#elif defined(RADIO_X7) +#elif defined(PCBX7) #define KEYS_GPIO_REG_PAGE GPIOD->IDR #define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 #define KEYS_GPIO_REG_MENU GPIOD->IDR @@ -77,7 +77,7 @@ #define KEYS_GPIO_PIN_EXIT GPIO_Pin_9 // PE.09 #define KEYS_GPIO_REG_ENTER GPIOE->IDR #define KEYS_GPIO_PIN_ENTER GPIO_Pin_11 // PE.11 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define KEYS_GPIO_REG_MENU GPIOD->IDR #define KEYS_GPIO_PIN_MENU GPIO_Pin_2 // PD.02 #define KEYS_GPIO_REG_EXIT GPIOD->IDR @@ -115,7 +115,7 @@ #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOD #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource12 #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource13 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define ROTARY_ENCODER_NAVIGATION #define ROTARY_ENCODER_GPIO GPIOE #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_10 // PE.10 @@ -128,7 +128,7 @@ #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10 #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource11 -#elif defined(RADIO_X7) +#elif defined(RADIO_X7) || defined(RADIO_X7ACCESS) #define ROTARY_ENCODER_NAVIGATION #define ROTARY_ENCODER_GPIO GPIOE #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.09 @@ -193,6 +193,23 @@ #define TRIMS_GPIO_PIN_LVU GPIO_Pin_0 // PB.00 #define TRIMS_GPIO_REG_LVD GPIOB->IDR #define TRIMS_GPIO_PIN_LVD GPIO_Pin_1 // PB.01 +#elif defined(RADIO_X7ACCESS) + #define TRIMS_GPIO_REG_LHR GPIOD->IDR + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_15 // PD.15 + #define TRIMS_GPIO_REG_LHL GPIOC->IDR + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_1 // PC.01 + #define TRIMS_GPIO_REG_LVD GPIOE->IDR + #define TRIMS_GPIO_PIN_LVD GPIO_Pin_6 // PE.06 + #define TRIMS_GPIO_REG_LVU GPIOE->IDR + #define TRIMS_GPIO_PIN_LVU GPIO_Pin_5 // PE.05 + #define TRIMS_GPIO_REG_RVD GPIOC->IDR + #define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03 + #define TRIMS_GPIO_REG_RHR GPIOE->IDR + #define TRIMS_GPIO_PIN_RHR GPIO_Pin_3 // PE.03 + #define TRIMS_GPIO_REG_RVU GPIOC->IDR + #define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02 + #define TRIMS_GPIO_REG_RHL GPIOE->IDR + #define TRIMS_GPIO_PIN_RHL GPIO_Pin_4 // PE.04 #elif defined(PCBX7) #define TRIMS_GPIO_REG_LHL GPIOD->IDR #define TRIMS_GPIO_PIN_LHL GPIO_Pin_15 // PD.15 @@ -227,7 +244,7 @@ #define TRIMS_GPIO_PIN_RVD GPIO_Pin_14 // PE.14 #define TRIMS_GPIO_REG_RHL GPIOD->IDR #define TRIMS_GPIO_PIN_RHL GPIO_Pin_9 // PD.09 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define TRIMS_GPIO_REG_LHL GPIOE->IDR #define TRIMS_GPIO_PIN_LHL GPIO_Pin_3 // PE.03 #define TRIMS_GPIO_REG_LHR GPIOE->IDR @@ -351,8 +368,13 @@ #define HARDWARE_SWITCH_C #define SWITCHES_GPIO_REG_C_L GPIOD->IDR #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_11 // PD.11 - #define SWITCHES_GPIO_REG_C_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00 + #if defined(PCBX7ACCESS) + #define SWITCHES_GPIO_REG_C_H GPIOD->IDR + #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_10 // PD.10 + #else + #define SWITCHES_GPIO_REG_C_H GPIOE->IDR + #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00 + #endif #else #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C @@ -514,7 +536,7 @@ #define SWITCHES_GPIO_PIN_H GPIO_Pin_13 // PE.13 #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I #define SWITCHES_GPIO_REG_I GPIOD->IDR @@ -524,13 +546,19 @@ #endif // X7 P400 P401 headers additionnal momentary switches -#if defined(PCBX7) +#if defined(PCBX7ACCESS) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define STORAGE_SWITCH_J - #define HARDWARE_SWITCH_J #define SWITCHES_GPIO_REG_I GPIOC->IDR #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13 + #define STORAGE_SWITCH_J +#elif defined(PCBX7) + #define STORAGE_SWITCH_I + #define HARDWARE_SWITCH_I + #define SWITCHES_GPIO_REG_I GPIOC->IDR + #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13 + #define STORAGE_SWITCH_J + #define HARDWARE_SWITCH_J #define SWITCHES_GPIO_REG_J GPIOD->IDR #define SWITCHES_GPIO_PIN_J GPIO_Pin_10 // PD.10 #endif @@ -607,7 +635,7 @@ #define KEYS_GPIOE_PINS (TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_LVD | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_D_L| SWITCHES_GPIO_PIN_E_H | SWITCHES_GPIO_PIN_E_L | SWITCHES_GPIO_PIN_F | SWITCHES_GPIO_PIN_I_L | SWITCHES_GPIO_PIN_L_H | SWITCHES_GPIO_PIN_L_L | SWITCHES_GPIO_PIN_M_H | SWITCHES_GPIO_PIN_O_L | SWITCHES_GPIO_PIN_R_L) #define KEYS_GPIOF_PINS (KEYS_GPIO_PIN_ENTER | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | SWITCHES_GPIO_PIN_I_H | SWITCHES_GPIO_PIN_O_H | SWITCHES_GPIO_PIN_P_H | SWITCHES_GPIO_PIN_P_L | SWITCHES_GPIO_PIN_Q_H | SWITCHES_GPIO_PIN_Q_L) #define KEYS_GPIOG_PINS (TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LHR| SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_J_H | SWITCHES_GPIO_PIN_J_L | SWITCHES_GPIO_PIN_K_H | SWITCHES_GPIO_PIN_K_L) -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) #define KEYS_GPIOA_PINS (GPIO_Pin_5) #define KEYS_GPIOB_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5) @@ -639,6 +667,12 @@ #define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) #define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15) #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15) +#elif defined(RADIO_X7ACCESS) + #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) + #define KEYS_GPIOA_PINS GPIO_Pin_5 + #define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_13) + #define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15) + #define KEYS_GPIOE_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15) #elif defined(RADIO_X7) #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) #define KEYS_GPIOA_PINS GPIO_Pin_5 @@ -882,7 +916,7 @@ #define PWR_ON_GPIO_PIN GPIO_Pin_0 // PD.00 #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) #define STATUS_LEDS #define GPIO_LED_GPIO_ON GPIO_ResetBits #define GPIO_LED_GPIO_OFF GPIO_SetBits @@ -898,6 +932,14 @@ #define LED_RED_GPIO_PIN GPIO_Pin_4 // PE.04 #define LED_GREEN_GPIO GPIOE #define LED_GREEN_GPIO_PIN GPIO_Pin_5 // PE.05 +#elif defined(PCBX7ACCESS) + #define STATUS_LEDS + #define GPIO_LED_GPIO_ON GPIO_SetBits + #define GPIO_LED_GPIO_OFF GPIO_ResetBits + #define LED_BLUE_GPIO GPIOB + #define LED_BLUE_GPIO_PIN GPIO_Pin_1 // PB.01 + #define LED_RED_GPIO GPIOC + #define LED_RED_GPIO_PIN GPIO_Pin_4 // PC.04 #elif defined(PCBX7) #define STATUS_LEDS #define GPIO_LED_GPIO_ON GPIO_SetBits @@ -962,7 +1004,7 @@ #define INTMODULE_BOOTCMD_GPIO GPIOC #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_8 // PC.08 #endif -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define INTMODULE_RCC_APB1Periph 0 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) @@ -982,6 +1024,26 @@ #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 #define INTMODULE_DMA_CHANNEL DMA_Channel_4 +#elif defined(RADIO_X7ACCESS) + #define INTMODULE_RCC_APB1Periph 0 + #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 + #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) + #define INTMODULE_PWR_GPIO GPIOC + #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_5 // PC.05 + #define INTMODULE_GPIO GPIOB + #define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06 + #define INTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PB.07 + #define INTMODULE_GPIO_PinSource_TX GPIO_PinSource6 + #define INTMODULE_GPIO_PinSource_RX GPIO_PinSource7 + #define INTMODULE_USART USART1 + #define INTMODULE_GPIO_AF GPIO_AF_USART1 + #define INTMODULE_USART_IRQHandler USART1_IRQHandler + #define INTMODULE_USART_IRQn USART1_IRQn + #define INTMODULE_DMA_STREAM DMA2_Stream7 + #define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn + #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler + #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 + #define INTMODULE_DMA_CHANNEL DMA_Channel_4 #elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7) #define INTMODULE_PULSES #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) @@ -1051,9 +1113,9 @@ #endif // External Module -#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) +#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(PCBX7ACCESS) #define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) - #if defined(PCBX9DP) && PCBREV >= 2019 + #if defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 @@ -1121,7 +1183,7 @@ #define EXTMODULE_TIMER_OUTPUT_ENABLE TIM_CCER_CC1NE #define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC1NP #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) #define EXTMODULE_PWR_GPIO GPIOD @@ -1243,7 +1305,7 @@ #endif // Serial Port -#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) +#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) #define AUX_SERIAL_RCC_AHB1Periph 0 #define AUX_SERIAL_RCC_APB1Periph 0 #else @@ -1268,7 +1330,7 @@ #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 -#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) +#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) #define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN #define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN #else @@ -1295,9 +1357,9 @@ #define TELEMETRY_EXTI_IRQn EXTI9_5_IRQn #define TELEMETRY_EXTI_TRIGGER EXTI_Trigger_Rising -#if defined(RADIO_X7) +#if defined(RADIO_X7) || defined(RADIO_X7ACCESS) #define TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER -#elif defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) +#elif defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) #define TELEMETRY_EXTI_IRQHandler EXTI9_5_IRQHandler #else #define TELEMETRY_EXTI_REUSE_INTERRUPT_INTMODULE_HEARTBEAT @@ -1324,6 +1386,13 @@ #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits +#elif defined(PCBX7ACCESS) + #define SPORT_MAX_BAUDRATE 400000 + #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOB + #define SPORT_UPDATE_PWR_GPIO GPIOB + #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_3 // PB.03 + #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits #elif defined(PCBX7) #define SPORT_MAX_BAUDRATE 250000 // < 400000 #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOB @@ -1338,7 +1407,7 @@ #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PE.15 #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define SPORT_MAX_BAUDRATE 400000 #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define SPORT_UPDATE_PWR_GPIO GPIOA @@ -1372,17 +1441,27 @@ // #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line9 // #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn // #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI9_5_IRQHandler -#elif defined(RADIO_X7) +#elif defined(RADIO_X7ACCESS) + #define INTMODULE_HEARTBEAT + #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER + #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOA + #define INTMODULE_HEARTBEAT_GPIO GPIOA + #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_7 // PA.07 + #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOA + #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7 + #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7 + #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn +#elif defined(RADIO_X7) #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC #define INTMODULE_HEARTBEAT_GPIO GPIOC - #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_7 + #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_7 // PC.07 #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOC #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7 #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7 #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define INTMODULE_HEARTBEAT_GPIO GPIOB @@ -1646,7 +1725,16 @@ #define I2C_WP_GPIO_PIN GPIO_Pin_7 // PD.07 #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(PCBX7ACCESS) + #define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB + #define I2C_SPI_GPIO GPIOB + #define I2C_SDA_GPIO_PIN GPIO_Pin_9 // PB.09 + #define I2C_SCL_GPIO_PIN GPIO_Pin_8 // PB.08 + #define I2C_WP_GPIO GPIOB + #define I2C_WP_GPIO_PIN GPIO_Pin_5 // PB.05 + #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 + #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 +#elif defined(RADIO_X9DP2019) #define I2C_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOF) #define I2C_SPI_GPIO GPIOB #define I2C_SDA_GPIO_PIN GPIO_Pin_9 // PB.09 @@ -1759,7 +1847,7 @@ #define HAPTIC_CCMR1 TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 #define HAPTIC_CCER TIM_CCER_CC2E #define BACKLIGHT_BDTR TIM_BDTR_MOE -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) #define HAPTIC_PWM #define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define HAPTIC_RCC_APB2Periph RCC_APB2Periph_TIM1 @@ -1827,7 +1915,7 @@ #define BT_TX_GPIO_PinSource GPIO_PinSource14 #define BT_RX_GPIO_PinSource GPIO_PinSource9 #define BT_USART_IRQHandler USART6_IRQHandler -#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITES) || (defined(PCBX9DP) && PCBREV >= 2019) +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITES) || defined(RADIO_X9DP2019) #define STORAGE_BLUETOOTH #define BT_RCC_APB1Periph RCC_APB1Periph_USART3 #define BT_RCC_APB2Periph 0 diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index ccaf60760..ab0a6202d 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -195,6 +195,12 @@ uint32_t switchState(uint8_t index) #elif defined(PCBXLITE) ADD_3POS_CASE(D, 3); // no SWE, SWF, SWG and SWH on XLITE +#elif defined(PCBX7ACCESS) + ADD_3POS_CASE(D, 3); + ADD_2POS_CASE(F); + ADD_2POS_CASE(H); + ADD_2POS_CASE(I); + // no SWJ on XLITE #elif defined(PCBX7) ADD_3POS_CASE(D, 3); ADD_2POS_CASE(F); @@ -209,7 +215,7 @@ uint32_t switchState(uint8_t index) ADD_2POS_CASE(H); #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) ADD_2POS_CASE(I); #endif diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp index 50eb13982..ca66dc1a7 100644 --- a/radio/src/targets/taranis/lcd_driver_spi.cpp +++ b/radio/src/targets/taranis/lcd_driver_spi.cpp @@ -311,7 +311,7 @@ void lcdInit() issued by the other parts of the code. */ -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) #define LCD_DELAY_NEEDED() true #else #define LCD_DELAY_NEEDED() (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 2f32d3551..5c4501b5c 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -149,6 +149,11 @@ inline uint8_t modelTelemetryProtocol() if (!sportUsed && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { return PROTOCOL_TELEMETRY_MULTIMODULE; } +#if defined(INTERNAL_MODULE_MULTI) + if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { + return PROTOCOL_TELEMETRY_MULTIMODULE; + } +#endif #endif // default choice return PROTOCOL_TELEMETRY_FRSKY_SPORT; diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index c86d2dcd5..43fbc6739 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -39,14 +39,14 @@ #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" #elif defined(PCBXLITE) - #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0" - #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\312SE\0""\312SF\0" -#elif defined(RADIO_X7) - #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0" - #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SF\0""\212SH\0""\212SI\0""\212SJ\0" + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(RADIO_T12) #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0" #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SG\0""\212SH\0""\212SI\0""\212SJ\0" +#elif defined(PCBX7) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0""\312SI\0""\312SJ\0" #elif defined(PCBX9LITES) #define TR_POTS_VSRCRAW "\310S1\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0" diff --git a/radio/util/tts_common.py b/radio/util/tts_common.py new file mode 100644 index 000000000..7086c64dd --- /dev/null +++ b/radio/util/tts_common.py @@ -0,0 +1,6 @@ +def filename(idx): + ext = ".wav" + if isinstance(idx, int): + return "%04d%s" % (idx, ext) + else: + return idx + ext diff --git a/radio/util/tts_cz.py b/radio/util/tts_cz.py index 1370e8d53..8f5b77730 100755 --- a/radio/util/tts_cz.py +++ b/radio/util/tts_cz.py @@ -2,21 +2,20 @@ # Czech language sounds configuration -from tts_common import filename, NO_ALTERNATE, PROMPT_SYSTEM_BASE, PROMPT_CUSTOM_BASE +from tts_common import filename systemSounds = [] sounds = [] for i, s in enumerate(["nula", "jedna", "dva"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + i))) + systemSounds.append((s, filename(i))) for i in range(97): - systemSounds.append((str(3 + i), filename(PROMPT_SYSTEM_BASE + 3 + i))) -for i, s in enumerate(["sto", "dvěsta", "třista", "čtyřista", "pětset", "šestset", "sedmset", "osmset", - "devětset", "tisíc"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 100 + i))) + systemSounds.append((str(3 + i), filename(3 + i))) +for i, s in enumerate(["sto", "dvěsta", "třista", "čtyřista", "pětset", "šestset", "sedmset", "osmset", "devětset", "tisíc"]): + systemSounds.append((s, filename(100 + i))) for i, s in enumerate(["tisíce", "jeden", "jedno", "dvě", "celá", "celé", "celých", "mínus"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 110 + i))) + systemSounds.append((s, filename(110 + i))) for i, (s, f) in enumerate([("volt", "volt0"), ("volty", "volt1"), ("voltů", "volt2"),("voltu", "volt3"), ("ampér", "amp0"), ("ampéry", "amp1"), ("ampérů", "amp2"), ("ampéru", "amp3"), ("miliampér", "mamp0"), ("miliampéry", "mamp1"), ("miliampérů", "mamp2"), ("miliampéru", "mamp3"), @@ -45,43 +44,43 @@ for i, (s, f) in enumerate([("volt", "volt0"), ("volty", "volt1"), ("voltů", "v ("minuta", "minute0"), ("minuty", "minute1"), ("minut", "minute2"), ("minuty", "minute3"), ("sekunda", "second0"), ("sekundy", "second1"), ("sekund", "second2"), ("sekundy", "second3"), ]): - systemSounds.append((s, filename(f, PROMPT_SYSTEM_BASE + 118 + i))) -for s, f, a in [("střed trimu", "midtrim", 495), - ("maximum trimu", "maxtrim", NO_ALTERNATE), - ("minimum trimu", "mintrim", NO_ALTERNATE), - ("stopky 1 doběhly", "timovr1", NO_ALTERNATE), - ("stopky 2 doběhly", "timovr2", NO_ALTERNATE), - ("stopky 3 doběhly", "timovr3", NO_ALTERNATE), - ("baterie rádia je vybitá", "lowbatt", 485), - ("zapoměl jsi na mě!", "inactiv", 486), - ("plyn není na nule", "thralert", 481), - ("přepínače nejsou ve výchozí poloze", "swalert", 482), - ("neplatná eeprom", "eebad", 483), - ("Žádám o povolení ke startu.", "hello", 480), - ("Tak zase příště!", "bye", 480), - ("dvacet sekund", "timer20", 500), - ("třicet sekund", "timer30", 501), - ("A1,nízká", "a1_org", NO_ALTERNATE), - ("A1,kritická", "a1_red", NO_ALTERNATE), - ("A2,nízká", "a2_org", NO_ALTERNATE), - ("A2,kritická", "a2_red", NO_ALTERNATE), - ("A3,nízká", "a3_org", NO_ALTERNATE), - ("A3,kritická", "a3_red", NO_ALTERNATE), - ("A4,nízká", "a4_org", NO_ALTERNATE), - ("A4,kritická", "a4_red", NO_ALTERNATE), - ("nízký RF signál", "rssi_org", NO_ALTERNATE), - ("kritický RF signál", "rssi_red", NO_ALTERNATE), - ("problém s anténou rádia", "swr_red", NO_ALTERNATE), - ("telemetrie ztracena", "telemko", NO_ALTERNATE), - ("telemetrie je funkční", "telemok", NO_ALTERNATE), - ("trenér port odpojen", "trainko", NO_ALTERNATE), - ("trenér port připojen", "trainok", NO_ALTERNATE), - ("senzor ztracen", "sensorko", NO_ALTERNATE), - ("servo přetíženo", "servoko", NO_ALTERNATE), - ("r f přebuzeno", "rxko", NO_ALTERNATE), - ("receiver still connected", "modelpwr", NO_ALTERNATE), - ]: - systemSounds.append((s, filename(f, a))) + systemSounds.append((s, filename(f))) +for s, f in [("střed trimu", "midtrim"), + ("maximum trimu", "maxtrim"), + ("minimum trimu", "mintrim"), + ("stopky 1 doběhly", "timovr1"), + ("stopky 2 doběhly", "timovr2"), + ("stopky 3 doběhly", "timovr3"), + ("baterie rádia je vybitá", "lowbatt"), + ("zapoměl jsi na mě!", "inactiv"), + ("plyn není na nule", "thralert"), + ("přepínače nejsou ve výchozí poloze", "swalert"), + ("neplatná eeprom", "eebad"), + ("Žádám o povolení ke startu.", "hello"), + ("Tak zase příště!", "bye"), + ("dvacet sekund", "timer20"), + ("třicet sekund", "timer30"), + ("A1,nízká", "a1_org"), + ("A1,kritická", "a1_red"), + ("A2,nízká", "a2_org"), + ("A2,kritická", "a2_red"), + ("A3,nízká", "a3_org"), + ("A3,kritická", "a3_red"), + ("A4,nízká", "a4_org"), + ("A4,kritická", "a4_red"), + ("nízký RF signál", "rssi_org"), + ("kritický RF signál", "rssi_red"), + ("problém s anténou rádia", "swr_red"), + ("telemetrie ztracena", "telemko"), + ("telemetrie je funkční", "telemok"), + ("trenér port odpojen", "trainko"), + ("trenér port připojen", "trainok"), + ("senzor ztracen", "sensorko"), + ("servo přetíženo", "servoko"), + ("r f přebuzeno", "rxko"), + ("receiver still connected", "modelpwr"), + ]: + systemSounds.append((s, filename(f))) for i, (s, f) in enumerate([("podvozek je zasunut", "podvo0"), ("podvozek je vysunut", "podvo1"), ("klapky jsou zapnuty", "klapk1"), @@ -113,4 +112,4 @@ for i, (s, f) in enumerate([("podvozek je zasunut", "podvo0"), ("letový režim sedm", "fm-7"), ("letový režim osm", "fm-8"), ]): - sounds.append((s, filename(f, PROMPT_CUSTOM_BASE + i))) + sounds.append((s, filename(f))) diff --git a/radio/util/tts_de.py b/radio/util/tts_de.py index 8c8084d4f..793d3fb85 100755 --- a/radio/util/tts_de.py +++ b/radio/util/tts_de.py @@ -2,21 +2,21 @@ # German language sounds configuration -from tts_common import filename, NO_ALTERNATE, PROMPT_SYSTEM_BASE, PROMPT_CUSTOM_BASE +from tts_common import filename systemSounds = [] sounds = [] for i in range(100): - systemSounds.append((str(i), filename(PROMPT_SYSTEM_BASE + i))) -systemSounds.append(("ein", filename(PROMPT_SYSTEM_BASE + 100))) -systemSounds.append(("eine", filename(PROMPT_SYSTEM_BASE + 101))) -systemSounds.append(("hundert", filename(PROMPT_SYSTEM_BASE + 102))) -systemSounds.append(("tausend", filename(PROMPT_SYSTEM_BASE + 103))) + systemSounds.append((str(i), filename(i))) +systemSounds.append(("ein", filename(100))) +systemSounds.append(("eine", filename(101))) +systemSounds.append(("hundert", filename(102))) +systemSounds.append(("tausend", filename(103))) for i, s in enumerate(["komma", "und", "minus", "uhr", "minute", "minuten", "sekunde", "sekunden", "stunde", "stunden"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 104 + i))) -for i, (s, f) in enumerate([("Wolt","volt0"), + systemSounds.append((s, filename(104 + i))) +for i, (s, f) in enumerate([("Wolt", "volt0"), ("Ampär", "amp0"), ("MilliAmpär", "mamp0"), ("Knoten", "knot0"), @@ -44,52 +44,52 @@ for i, (s, f) in enumerate([("Wolt","volt0"), ("Minute", "minute0"), ("Minuten", "minute1"), ("Sekunde", "second0"), ("Sekunden", "second1"), ]): - systemSounds.append((s, filename(f, PROMPT_SYSTEM_BASE + 114 + i))) -for s, f, a in [("Inaktivitätsalarm", "inactiv", 486), - ("Senderspannung schwach", "lowbatt", 485), - ("Gaskanal nicht Null, bitte prüfen", "thralert", 481), - ("Schalter fehlpositioniert, bitte prüfen", "swalert", 482), - ("EEPROM fehlerhaft", "eebad", NO_ALTERNATE), - ("EEPROM formatiert", "eeformat", NO_ALTERNATE), - ("Fehler", "error", NO_ALTERNATE), - ("Trim zentriert", "midtrim", 495), - ("Poti zentriert", "midpot", 496), - ("Obere Trimmungsgrenze erreicht", "maxtrim", NO_ALTERNATE), - ("Untere Trimmungsgrenze erreicht", "mintrim", NO_ALTERNATE), - ("20 Sekunden", "timer20", 500), - ("30 Sekunden", "timer30", 501), - ("Senderstrom zu hoch!", "highmah", NO_ALTERNATE), - ("Sendertemperatur zu hoch!", "hightemp", NO_ALTERNATE), - ("A1 schwach!", "a1_org", NO_ALTERNATE), - ("A1 kritisch!", "a1_red", NO_ALTERNATE), - ("A2 schwach!", "a2_org", NO_ALTERNATE), - ("A2 kritisch!", "a2_red", NO_ALTERNATE), - ("A3 schwach!", "a3_org", NO_ALTERNATE), - ("A3 kritisch!", "a3_red", NO_ALTERNATE), - ("A4 schwach!", "a4_org", NO_ALTERNATE), - ("A4 kritisch!", "a4_red", NO_ALTERNATE), - ("Funksignal schwach!", "rssi_org", NO_ALTERNATE), - ("Funksignal kritisch!", "rssi_red", NO_ALTERNATE), - ("Problem mit der Sender Antenne", "swr_red", NO_ALTERNATE), - ("Telemetrie verloren", "telemko", NO_ALTERNATE), - ("Telemetrie wiederhergestellt", "telemok", NO_ALTERNATE), - ("Schülersignal verloren", "trainko", NO_ALTERNATE), - ("Schülersignal wiederhergestellt", "trainok", NO_ALTERNATE), - ("servo overload", "servoko", NO_ALTERNATE), - ("power overload", "rxko", NO_ALTERNATE), - ("Empfänger noch verbunden", "modelpwr", NO_ALTERNATE), - ("timer eins abgelaufen", "timovr1", NO_ALTERNATE), - ("timer zwei abgelaufen", "timovr2", NO_ALTERNATE), - ("timer drei abgelaufen", "timovr3", NO_ALTERNATE), - ("Sensor verloren", "sensorko", NO_ALTERNATE), - ("Willkommen bei open te ix", "hello", 480), - ]: - systemSounds.append((s, filename(f, a))) + systemSounds.append((s, filename(f))) +for s, f in [("Inaktivitätsalarm", "inactiv"), + ("Senderspannung schwach", "lowbatt"), + ("Gaskanal nicht Null, bitte prüfen", "thralert"), + ("Schalter fehlpositioniert, bitte prüfen", "swalert"), + ("EEPROM fehlerhaft", "eebad"), + ("EEPROM formatiert", "eeformat"), + ("Fehler", "error"), + ("Trim zentriert", "midtrim"), + ("Poti zentriert", "midpot"), + ("Obere Trimmungsgrenze erreicht", "maxtrim"), + ("Untere Trimmungsgrenze erreicht", "mintrim"), + ("20 Sekunden", "timer20"), + ("30 Sekunden", "timer30"), + ("Senderstrom zu hoch!", "highmah"), + ("Sendertemperatur zu hoch!", "hightemp"), + ("A1 schwach!", "a1_org"), + ("A1 kritisch!", "a1_red"), + ("A2 schwach!", "a2_org"), + ("A2 kritisch!", "a2_red"), + ("A3 schwach!", "a3_org"), + ("A3 kritisch!", "a3_red"), + ("A4 schwach!", "a4_org"), + ("A4 kritisch!", "a4_red"), + ("Funksignal schwach!", "rssi_org"), + ("Funksignal kritisch!", "rssi_red"), + ("Problem mit der Sender Antenne", "swr_red"), + ("Telemetrie verloren", "telemko"), + ("Telemetrie wiederhergestellt", "telemok"), + ("Schülersignal verloren", "trainko"), + ("Schülersignal wiederhergestellt", "trainok"), + ("servo overload", "servoko"), + ("power overload", "rxko"), + ("Empfänger noch verbunden", "modelpwr"), + ("timer eins abgelaufen", "timovr1"), + ("timer zwei abgelaufen", "timovr2"), + ("timer drei abgelaufen", "timovr3"), + ("Sensor verloren", "sensorko"), + ("Willkommen bei open te ix", "hello"), + ]: + systemSounds.append((s, filename(f))) for i, s in enumerate(["Uhr", "Uhr", "Sender", "Empfang", "A1", "A2", "Hoehe", "Motor", "Treibstoff", "Temperatur", "Temperatur", "Geschwindigkeit", "Entfernung", "Höhe", "Lipo-Zelle", "Zellen gesamt", "Spannung", "Strom", "Verbrauch", "Power", "Beschleunigung X", "Beschleunigung Y", "Beschleunigung Z", "Richtung", "Variometer", "Minimum", "Maximum"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 134 + i))) + systemSounds.append((s, filename(134 + i))) for i, (s, f) in enumerate([("Fahrwerk eingezogen", "gearup"), ("Fahrwerk ausgefahren", "geardn"), ("Klappen eingefahren", "flapup"), @@ -117,4 +117,4 @@ for i, (s, f) in enumerate([("Fahrwerk eingezogen", "gearup"), ("Flugmodus 8", "fm-8"), ("Flugmodus 9", "fm-9"), ]): - sounds.append((s, filename(f, PROMPT_CUSTOM_BASE + i))) + sounds.append((s, filename(f))) diff --git a/radio/util/tts_en.py b/radio/util/tts_en.py index 83fda999c..e53cfd348 100755 --- a/radio/util/tts_en.py +++ b/radio/util/tts_en.py @@ -2,18 +2,18 @@ # English language sounds configuration -from tts_common import filename, NO_ALTERNATE, PROMPT_SYSTEM_BASE, PROMPT_CUSTOM_BASE +from tts_common import filename systemSounds = [] sounds = [] for i in range(100): - systemSounds.append((str(i), filename(PROMPT_SYSTEM_BASE + i))) + systemSounds.append((str(i), filename(i))) for i in range(9): - systemSounds.append((str(100 * (i + 1)), filename(PROMPT_SYSTEM_BASE + 100 + i))) + systemSounds.append((str(100 * (i + 1)), filename(100 + i))) for i, s in enumerate(["thousand", "and", "minus", "point"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 109 + i))) + systemSounds.append((s, filename(109 + i))) for i, (s, f) in enumerate([("volt", "volt0"), ("volts", "volt1"), ("amp", "amp0"), ("amps", "amp1"), ("milliamp", "mamp0"), ("milliamps", "mamp1"), @@ -42,36 +42,36 @@ for i, (s, f) in enumerate([("volt", "volt0"), ("volts", "volt1"), ("minute", "minute0"), ("minutes", "minute1"), ("second", "second0"), ("seconds", "second1"), ]): - systemSounds.append((s, filename(f, PROMPT_SYSTEM_BASE + 115 + i))) + systemSounds.append((s, filename(f))) for i, s in enumerate(["point zero", "point one", "point two", "point three", "point four", "point five", "point six", "point seven", "point eight", "point nine"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 167 + i))) -for s, f, a in [("trim center", "midtrim", 495), - ("maximum trim reached", "maxtrim", NO_ALTERNATE), - ("minimum trim reached", "mintrim", NO_ALTERNATE), - ("timer 1 elapsed", "timovr1", NO_ALTERNATE), - ("timer 2 elapsed", "timovr2", NO_ALTERNATE), - ("timer 3 elapsed", "timovr3", NO_ALTERNATE), - ("transmitter battery low", "lowbatt", 485), - ("inactivity alarm", "inactiv", 486), - ("throttle warning", "thralert", 481), - ("switch warning", "swalert", 482), - ("bad eeprom", "eebad", 483), - ("Welcome to open tea ex!", "hello", 480), - ("RF signal, low", "rssi_org", NO_ALTERNATE), - ("RF signal, critical", "rssi_red", NO_ALTERNATE), - ("radio antenna defective", "swr_red", NO_ALTERNATE), - ("telemetry lost", "telemko", NO_ALTERNATE), - ("telemetry recovered", "telemok", NO_ALTERNATE), - ("trainer signal lost", "trainko", NO_ALTERNATE), - ("trainer signal recovered", "trainok", NO_ALTERNATE), - ("sensor lost", "sensorko", NO_ALTERNATE), - ("servo overload", "servoko", NO_ALTERNATE), - ("power overload", "rxko", NO_ALTERNATE), - ("receiver still connected", "modelpwr", NO_ALTERNATE), - ]: - systemSounds.append((s, filename(f, a))) + systemSounds.append((s, filename(167 + i))) +for s, f in [("trim center", "midtrim"), + ("maximum trim reached", "maxtrim"), + ("minimum trim reached", "mintrim"), + ("timer 1 elapsed", "timovr1"), + ("timer 2 elapsed", "timovr2"), + ("timer 3 elapsed", "timovr3"), + ("transmitter battery low", "lowbatt"), + ("inactivity alarm", "inactiv"), + ("throttle warning", "thralert"), + ("switch warning", "swalert"), + ("bad eeprom", "eebad"), + ("Welcome to open tea ex!", "hello"), + ("RF signal, low", "rssi_org"), + ("RF signal, critical", "rssi_red"), + ("radio antenna defective", "swr_red"), + ("telemetry lost", "telemko"), + ("telemetry recovered", "telemok"), + ("trainer signal lost", "trainko"), + ("trainer signal recovered", "trainok"), + ("sensor lost", "sensorko"), + ("servo overload", "servoko"), + ("power overload", "rxko"), + ("receiver still connected", "modelpwr"), + ]: + systemSounds.append((s, filename(f))) for i, (s, f) in enumerate([("gear!, up!", "gearup"), ("gear!, down!", "geardn"), ("flaps!, up!", "flapup"), @@ -118,4 +118,4 @@ for i, (s, f) in enumerate([("gear!, up!", "gearup"), ("flight mode thermal left", "fm-thl"), ("flight mode thermal right", "fm-thr"), ]): - sounds.append((s, filename(f, PROMPT_CUSTOM_BASE + i))) + sounds.append((s, filename(f))) diff --git a/radio/util/tts_es.py b/radio/util/tts_es.py index a5f4814a3..3b436ecd6 100755 --- a/radio/util/tts_es.py +++ b/radio/util/tts_es.py @@ -2,26 +2,26 @@ # Spanish language sounds configuration -from tts_common import filename, NO_ALTERNATE, PROMPT_SYSTEM_BASE, PROMPT_CUSTOM_BASE +from tts_common import filename systemSounds = [] sounds = [] for i in range(101): - systemSounds.append((str(i), filename(PROMPT_SYSTEM_BASE + i))) -systemSounds.append(("ciento", filename(PROMPT_SYSTEM_BASE + 101))) -systemSounds.append(("doscientos", filename(PROMPT_SYSTEM_BASE + 102))) -systemSounds.append(("trescientos", filename(PROMPT_SYSTEM_BASE + 103))) -systemSounds.append(("cuatrocientos", filename(PROMPT_SYSTEM_BASE + 104))) -systemSounds.append(("quinientos", filename(PROMPT_SYSTEM_BASE + 105))) -systemSounds.append(("sescientos", filename(PROMPT_SYSTEM_BASE + 106))) -systemSounds.append(("setecientos", filename(PROMPT_SYSTEM_BASE + 107))) -systemSounds.append(("ochocientos", filename(PROMPT_SYSTEM_BASE + 108))) -systemSounds.append(("nuevecientos", filename(PROMPT_SYSTEM_BASE + 109))) -systemSounds.append(("mil", filename(PROMPT_SYSTEM_BASE + 110))) + systemSounds.append((str(i), filename(i))) +systemSounds.append(("ciento", filename(101))) +systemSounds.append(("doscientos", filename(102))) +systemSounds.append(("trescientos", filename(103))) +systemSounds.append(("cuatrocientos", filename(104))) +systemSounds.append(("quinientos", filename(105))) +systemSounds.append(("sescientos", filename(106))) +systemSounds.append(("setecientos", filename(107))) +systemSounds.append(("ochocientos", filename(108))) +systemSounds.append(("nuevecientos", filename(109))) +systemSounds.append(("mil", filename(110))) for i, s in enumerate(["coma", "un", "una", "i", "meno", "hora", "horas", "minuto", "minutos", "segundo", "segundos"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 111 + i))) + systemSounds.append((s, filename(111 + i))) for i, (s, f) in enumerate([("Voltio","volt0"), ("ampério", "amp0"), ("miliamperios", "mamp0"), @@ -50,41 +50,41 @@ for i, (s, f) in enumerate([("Voltio","volt0"), ("minuto", "minute0"), ("minutos", "minute1"), ("segundo", "second0"), ("segundos", "second1"), ]): - systemSounds.append((s, filename(f, PROMPT_SYSTEM_BASE + 122 + i))) -for s, f, a in [("me tienes abandonada", "inactiv", 486), - ("batería del transmisor baja", "lowbatt", 485), - ("El acelerador está activado, por favor, corrijalo", "thralert", 481), - ("Los interruptores no están en la posición correcta, por favor corrijalo", "swalert", 482), - ("eeprom corrompida", "eebad", NO_ALTERNATE), - ("Formateo de eeprom en curso", "eeformat", NO_ALTERNATE), - ("error", "error", NO_ALTERNATE), - ("trim centrado", "midtrim", 495), - ("potenciómetro centrado", "midpot", 496), - ("trim al máximo", "maxtrim", NO_ALTERNATE), - ("trim al mínima", "mintrim", NO_ALTERNATE), - ("20 segundos", "timer20", 500), - ("30 segundos", "timer30", 501), - ("assorbimiento elevado", "highmah", NO_ALTERNATE), - ("temperatura elevada", "hightemp", NO_ALTERNATE), - ("Alarma A1", "a1_org", NO_ALTERNATE), - ("A1 crítica", "a1_red", NO_ALTERNATE), - ("Alarma A2", "a2_org", NO_ALTERNATE), - ("A2 crítica", "a2_red", NO_ALTERNATE), - ("recepcion de señal baja", "rssi_org", NO_ALTERNATE), - ("recepción de señal crítica", "rssi_red", NO_ALTERNATE), - ("Problemas con la antena del transmisor", "swr_red", NO_ALTERNATE), - ("Sin telemetría", "telemko", NO_ALTERNATE), - ("Telemetría disponible", "telemok", NO_ALTERNATE), - ("servo overload", "servoko", NO_ALTERNATE), - ("power overload", "rxko", NO_ALTERNATE), - ("receiver still connected", "modelpwr", NO_ALTERNATE), - ]: - systemSounds.append((s, filename(f, a))) + systemSounds.append((s, filename(f))) +for s, f in [("me tienes abandonada", "inactiv"), + ("batería del transmisor baja", "lowbatt"), + ("El acelerador está activado, por favor, corrijalo", "thralert"), + ("Los interruptores no están en la posición correcta, por favor corrijalo", "swalert"), + ("eeprom corrompida", "eebad"), + ("Formateo de eeprom en curso", "eeformat"), + ("error", "error"), + ("trim centrado", "midtrim"), + ("potenciómetro centrado", "midpot"), + ("trim al máximo", "maxtrim"), + ("trim al mínima", "mintrim"), + ("20 segundos", "timer20"), + ("30 segundos", "timer30"), + ("assorbimiento elevado", "highmah"), + ("temperatura elevada", "hightemp"), + ("Alarma A1", "a1_org"), + ("A1 crítica", "a1_red"), + ("Alarma A2", "a2_org"), + ("A2 crítica", "a2_red"), + ("recepcion de señal baja", "rssi_org"), + ("recepción de señal crítica", "rssi_red"), + ("Problemas con la antena del transmisor", "swr_red"), + ("Sin telemetría", "telemko"), + ("Telemetría disponible", "telemok"), + ("servo overload", "servoko"), + ("power overload", "rxko"), + ("receiver still connected", "modelpwr"), + ]: + systemSounds.append((s, filename(f))) for i, s in enumerate(["cronómetro", "cronómetro", "transmisión", "recepción", "A1", "A2", "altitud", "motor", "combustible", "temperatura", "temperatura", "velocidad", "distancia", "altitude", "célula lipo", "Total lipo", "voltaje", "corriente", "consumo", "potencia", "aceleración X", "aceleración Y", "aceleración Z", "dirección", "variómetro", "minimo", "máximo"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 141 + i))) + systemSounds.append((s, filename(141 + i))) for i, (s, f) in enumerate([("tren arriba.", "gearup"), ("tren abajo.", "geardn"), ("flaps arriba", "flapup"), @@ -111,4 +111,4 @@ for i, (s, f) in enumerate([("tren arriba.", "gearup"), ("fase de vuelo 8", "fltmd8"), ("fase de vuelo 9", "fltmd9"), ]): - sounds.append((s, filename(f, PROMPT_CUSTOM_BASE + i))) \ No newline at end of file + sounds.append((s, filename(f))) diff --git a/radio/util/tts_fr.py b/radio/util/tts_fr.py index fdb0117ae..736fef4c1 100755 --- a/radio/util/tts_fr.py +++ b/radio/util/tts_fr.py @@ -2,20 +2,20 @@ # French language sounds configuration -from tts_common import filename, NO_ALTERNATE, PROMPT_SYSTEM_BASE, PROMPT_CUSTOM_BASE +from tts_common import filename systemSounds = [] sounds = [] for i in range(100): - systemSounds.append((str(i), filename(PROMPT_SYSTEM_BASE + i))) + systemSounds.append((str(i), filename(i))) for i in range(10): - systemSounds.append((str(100 * (i + 1)), filename(PROMPT_SYSTEM_BASE + 100 + i))) + systemSounds.append((str(100 * (i + 1)), filename(100 + i))) for i, s in enumerate(["une", "onze", "vingt et une", "trente et une", "quarante et une", "cinquante et une", "soixante et une", "soixante et onze", "quatre vingt une"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 110 + i))) + systemSounds.append((s, filename(110 + i))) for i, s in enumerate(["virgule", "et", "moins", "minuit", "midi"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 119 + i))) -for i, (s, f) in enumerate([("volts","volt0"), + systemSounds.append((s, filename(119 + i))) +for i, (s, f) in enumerate([("volts", "volt0"), ("ampères", "amp0"), ("milli ampères", "mamp0"), ("noeud", "knot0"), @@ -43,34 +43,34 @@ for i, (s, f) in enumerate([("volts","volt0"), ("minute", "minute0"), ("seconde", "second0"), ]): - systemSounds.append((s, filename(f, PROMPT_SYSTEM_BASE + 125 + i))) + systemSounds.append((s, filename(f))) for i, s in enumerate(["virgule 0", "virgule 1", "virgule 2", "virgule 3", "virgule 4", "virgule 5", "virgule 6", "virgule 7", "virgule 8", "virgule 9"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 180 + i))) -for s, f, a in [("Trim centré", "midtrim", 495), - ("Trim maximum atteint", "maxtrim", NO_ALTERNATE), - ("Trim minimum atteint", "mintrim", NO_ALTERNATE), - ("Chrono 1 à 0", "timovr1", NO_ALTERNATE), - ("Chrono 2 à 0", "timovr2", NO_ALTERNATE), - ("Chrono 3 à 0", "timovr3", NO_ALTERNATE), - ("Batterie radio faible !", "lowbatt", 485), - ("Radio inactive !", "inactiv", 486), - ("Alerte manche des gaz", "thralert", 481), - ("Alerte inters", "swalert", 482), - ("éprome corrompue", "eebad", 483), - ("Bienvenue sur o pun t x", "hello", 480), - ("Signal RF, faible", "rssi_org", NO_ALTERNATE), - ("Signal RF, critique", "rssi_red", NO_ALTERNATE), - ("Antenne défectueuse", "swr_red", NO_ALTERNATE), - ("Télémétrie perdue", "telemko", NO_ALTERNATE), - ("Télémétrie retrouvée", "telemok", NO_ALTERNATE), - ("Signal écolage perdu", "trainko", NO_ALTERNATE), - ("Signal écolage retrouvé", "trainok", NO_ALTERNATE), - ("Sonde de télémétrie perdue", "sensorko", NO_ALTERNATE), - ("Servo en surcharge", "servoko", NO_ALTERNATE), - ("Surcharge réception", "rxko", NO_ALTERNATE), - ("Récepteur encore sous tension", "modelpwr", NO_ALTERNATE), - ]: - systemSounds.append((s, filename(f, a))) + systemSounds.append((s, filename(180 + i))) +for s, f in [("Trim centré", "midtrim"), + ("Trim maximum atteint", "maxtrim"), + ("Trim minimum atteint", "mintrim"), + ("Chrono 1 à 0", "timovr1"), + ("Chrono 2 à 0", "timovr2"), + ("Chrono 3 à 0", "timovr3"), + ("Batterie radio faible !", "lowbatt"), + ("Radio inactive !", "inactiv"), + ("Alerte manche des gaz", "thralert"), + ("Alerte inters", "swalert"), + ("éprome corrompue", "eebad"), + ("Bienvenue sur o pun t x", "hello"), + ("Signal RF, faible", "rssi_org"), + ("Signal RF, critique", "rssi_red"), + ("Antenne défectueuse", "swr_red"), + ("Télémétrie perdue", "telemko"), + ("Télémétrie retrouvée", "telemok"), + ("Signal écolage perdu", "trainko"), + ("Signal écolage retrouvé", "trainok"), + ("Sonde de télémétrie perdue", "sensorko"), + ("Servo en surcharge", "servoko"), + ("Surcharge réception", "rxko"), + ("Récepteur encore sous tension", "modelpwr"), + ]: + systemSounds.append((s, filename(f))) for i, (s, f) in enumerate([("altitude", "altitude"), ("température moteur", "moteur"), ("température contrôleur", "cntrleur"), @@ -112,4 +112,4 @@ for i, (s, f) in enumerate([("altitude", "altitude"), ("mode de vol thermique gauche", "fm-thl"), ("mode de vol thermique droit", "fm-thr"), ]): - sounds.append((s, filename(f, PROMPT_CUSTOM_BASE + i))) + sounds.append((s, filename(f))) diff --git a/radio/util/tts_it.py b/radio/util/tts_it.py index 52ba120a8..ea6223801 100755 --- a/radio/util/tts_it.py +++ b/radio/util/tts_it.py @@ -2,18 +2,18 @@ # Italian language sounds configuration -from tts_common import filename, NO_ALTERNATE, PROMPT_SYSTEM_BASE, PROMPT_CUSTOM_BASE +from tts_common import filename systemSounds = [] sounds = [] for i in range(101): - systemSounds.append((str(i), filename(PROMPT_SYSTEM_BASE + i))) -systemSounds.append(("mila", filename(PROMPT_SYSTEM_BASE + 101))) -systemSounds.append(("mille", filename(PROMPT_SYSTEM_BASE + 102))) + systemSounds.append((str(i), filename(i))) +systemSounds.append(("mila", filename(101))) +systemSounds.append(("mille", filename(102))) for i, s in enumerate(["virgola", "un", "e", "meno", "ora", "ore", "minuto", "minuti", "secondo", "secondi"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 103 + i))) + systemSounds.append((s, filename(103 + i))) for i, (s, f) in enumerate([("volt", "volt0"), ("ampere", "amp0"), ("milliampere", "mamp0"), @@ -42,48 +42,48 @@ for i, (s, f) in enumerate([("volt", "volt0"), ("minuto", "minute0"), ("minuti", "minute1"), ("secondo", "second0"), ("secondi", "second1"), ]): - systemSounds.append((s, filename(f, PROMPT_SYSTEM_BASE + 116 + i))) -for s, f, a in [("radio inattiva controllare", "inactiv", 486), - ("batteria della radio scarica", "lowbatt", 485), - ("controllo motore non in posizione, verificare", "thralert", 481), - ("interruttori non in posizione, verificare", "swalert", 482), - ("eeprom corrotta", "eebad", NO_ALTERNATE), - ("formattazione eeprom in corso", "eeformat", NO_ALTERNATE), - ("errore", "error", NO_ALTERNATE), - ("trim centrato", "midtrim", 495), - ("potenziometro centrato", "midpot", 496), - ("massimo trim raggiunto", "maxtrim", NO_ALTERNATE), - ("minimo trim raggiunto", "mintrim", NO_ALTERNATE), - ("venti secondi", "timer20", 500), - ("trenta secondi", "timer30", 501), - ("assorbimento elevato", "highmah", NO_ALTERNATE), - ("temperatura elevata", "hightemp", NO_ALTERNATE), - ("A1 in allarme", "a1_org", NO_ALTERNATE), - ("A1 critico", "a1_red", NO_ALTERNATE), - ("A2 in allarme", "a2_org", NO_ALTERNATE), - ("A2 critico", "a2_red", NO_ALTERNATE), - ("A3 in allarme", "a3_org", NO_ALTERNATE), - ("A3 critico", "a3_red", NO_ALTERNATE), - ("A4 in allarme", "a4_org", NO_ALTERNATE), - ("A4 critico", "a4_red", NO_ALTERNATE), - ("Segnale radio basso", "rssi_org", NO_ALTERNATE), - ("Segnale radio critico", "rssi_red", NO_ALTERNATE), - ("Problema all'antenna della radio", "swr_red", NO_ALTERNATE), - ("Telemetria assente", "telemko", NO_ALTERNATE), - ("Telemetria disponibile", "telemok", NO_ALTERNATE), - ("Segnale trainer perso", "trainko", NO_ALTERNATE), - ("Segnale trainer disponibile", "trainok", NO_ALTERNATE), - ("Sensore perso", "sensorko", NO_ALTERNATE), - ("sovraccarico servo", "servoko", NO_ALTERNATE), - ("sovraccarico di alimentazione", "rxko", NO_ALTERNATE), - ("ricevente ancora connessa", "modelpwr", NO_ALTERNATE), - ]: - systemSounds.append((s, filename(f, a))) + systemSounds.append((s, filename(f))) +for s, f in [("radio inattiva controllare", "inactiv"), + ("batteria della radio scarica", "lowbatt"), + ("controllo motore non in posizione, verificare", "thralert"), + ("interruttori non in posizione, verificare", "swalert"), + ("eeprom corrotta", "eebad"), + ("formattazione eeprom in corso", "eeformat"), + ("errore", "error"), + ("trim centrato", "midtrim"), + ("potenziometro centrato", "midpot"), + ("massimo trim raggiunto", "maxtrim"), + ("minimo trim raggiunto", "mintrim"), + ("venti secondi", "timer20"), + ("trenta secondi", "timer30"), + ("assorbimento elevato", "highmah"), + ("temperatura elevata", "hightemp"), + ("A1 in allarme", "a1_org"), + ("A1 critico", "a1_red"), + ("A2 in allarme", "a2_org"), + ("A2 critico", "a2_red"), + ("A3 in allarme", "a3_org"), + ("A3 critico", "a3_red"), + ("A4 in allarme", "a4_org"), + ("A4 critico", "a4_red"), + ("Segnale radio basso", "rssi_org"), + ("Segnale radio critico", "rssi_red"), + ("Problema all'antenna della radio", "swr_red"), + ("Telemetria assente", "telemko"), + ("Telemetria disponibile", "telemok"), + ("Segnale trainer perso", "trainko"), + ("Segnale trainer disponibile", "trainok"), + ("Sensore perso", "sensorko"), + ("sovraccarico servo", "servoko"), + ("sovraccarico di alimentazione", "rxko"), + ("ricevente ancora connessa", "modelpwr"), + ]: + systemSounds.append((s, filename(f))) for i, s in enumerate(["timer", "", "tensione", "tensione", "trasmissione", "ricezione", "altitudine", "motore", "carburante", "temperatura", "temperatura", "velocità", "distanza", "altitudine", "cella lipo", "totale lipo", "tensione", "corrente", "consumo", "potenza", "accelerazione X", "accelerazione Y", "accelerazione Z", "direzione", "variometro", "minimo", "massimo"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 155 + i))) + systemSounds.append((s, filename(155 + i))) for i, (s, f) in enumerate([("carrello chiuso", "gearup"), ("carrello aperto", "geardn"), ("flap rientrati", "flapup"), @@ -130,4 +130,4 @@ for i, (s, f) in enumerate([("carrello chiuso", "gearup"), ("fase di volo termica sinistra", "fm-thl"), ("fase di volo termica destra", "fm-thr"), ]): - sounds.append((s, filename(f, PROMPT_CUSTOM_BASE + i))) + sounds.append((s, filename(f))) diff --git a/radio/util/tts_pt.py b/radio/util/tts_pt.py index 0d0173b75..b2e71c8e8 100755 --- a/radio/util/tts_pt.py +++ b/radio/util/tts_pt.py @@ -2,26 +2,26 @@ # Portuguese language sounds configuration -from tts_common import filename, NO_ALTERNATE, PROMPT_SYSTEM_BASE, PROMPT_CUSTOM_BASE +from tts_common import filename systemSounds = [] sounds = [] for i in range(101): - systemSounds.append((str(i), filename(PROMPT_SYSTEM_BASE + i))) -systemSounds.append(("cento", filename(PROMPT_SYSTEM_BASE + 101))) -systemSounds.append(("duzentos", filename(PROMPT_SYSTEM_BASE + 102))) -systemSounds.append(("trezentos", filename(PROMPT_SYSTEM_BASE + 103))) -systemSounds.append(("quatrocentos", filename(PROMPT_SYSTEM_BASE + 104))) -systemSounds.append(("quinhentos", filename(PROMPT_SYSTEM_BASE + 105))) -systemSounds.append(("seiscentos", filename(PROMPT_SYSTEM_BASE + 106))) -systemSounds.append(("setecentos", filename(PROMPT_SYSTEM_BASE + 107))) -systemSounds.append(("oitocentos", filename(PROMPT_SYSTEM_BASE + 108))) -systemSounds.append(("novecentos", filename(PROMPT_SYSTEM_BASE + 109))) -systemSounds.append(("mil", filename(PROMPT_SYSTEM_BASE + 110))) + systemSounds.append((str(i), filename(i))) +systemSounds.append(("cento", filename(101))) +systemSounds.append(("duzentos", filename(102))) +systemSounds.append(("trezentos", filename(103))) +systemSounds.append(("quatrocentos", filename(104))) +systemSounds.append(("quinhentos", filename(105))) +systemSounds.append(("seiscentos", filename(106))) +systemSounds.append(("setecentos", filename(107))) +systemSounds.append(("oitocentos", filename(108))) +systemSounds.append(("novecentos", filename(109))) +systemSounds.append(("mil", filename(110))) for i, s in enumerate(["virgula", "uma", "duas", "e", "menos", "hora", "horas", "minuto", "minutos", "segundo", "segundos"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 111 + i))) + systemSounds.append((s, filename(111 + i))) for i, (s, f) in enumerate([("Volt", "volt0"), ("ampére", "amp0"), ("miliamperes", "mamp0"), @@ -50,39 +50,39 @@ for i, (s, f) in enumerate([("Volt", "volt0"), ("minutos", "minute0"), ("segundos", "second0"), ]): - systemSounds.append((s, filename(f, PROMPT_SYSTEM_BASE + 122 + i))) -for s, f, a in [("atenção, o rádio foi esquecido ligado, por favor desligue-o", "inactiv", 486), - ("bateria do rádio fraca", "lowbatt", 485), - ("atenção,acelerador não está no mínimo", "thralert", 481), - ("atenção, certifique-se que os interruptores estão na posição certa", "swalert", 482), - ("eeprom corrompida", "eebad", NO_ALTERNATE), - ("formatação da eeprom em curso", "eeformat", NO_ALTERNATE), - ("erro", "error", NO_ALTERNATE), - ("trim centrado", "midtrim", 495), - ("potenciómetro centrado", "midpot", 496), - ("trim no máximo", "maxtrim", NO_ALTERNATE), - ("trim no mínimo", "mintrim", NO_ALTERNATE), - ("20 segundos", "timer20", 500), - ("30 segundos", "timer30", 501), - ("assorbimento elevato", "highmah", NO_ALTERNATE), - ("temperatura elevata", "hightemp", NO_ALTERNATE), - ("Alarme A1", "a1_org", NO_ALTERNATE), - ("A1 critica", "a1_red", NO_ALTERNATE), - ("Alarme A2", "a2_org", NO_ALTERNATE), - ("A2 critica", "a2_red", NO_ALTERNATE), - ("recepção de sinal muito baixa", "rssi_org", NO_ALTERNATE), - ("recepção de sinal crítica", "rssi_red", NO_ALTERNATE), - ("Problema com a antena do transmissor", "swr_red", NO_ALTERNATE), - ("servo overload", "servoko", NO_ALTERNATE), - ("power overload", "rxko", NO_ALTERNATE), - ("receiver still connected", "modelpwr", NO_ALTERNATE), - ]: - systemSounds.append((s, filename(f, a))) + systemSounds.append((s, filename(f))) +for s, f in [("atenção, o rádio foi esquecido ligado, por favor desligue-o", "inactiv"), + ("bateria do rádio fraca", "lowbatt"), + ("atenção,acelerador não está no mínimo", "thralert"), + ("atenção, certifique-se que os interruptores estão na posição certa", "swalert"), + ("eeprom corrompida", "eebad"), + ("formatação da eeprom em curso", "eeformat"), + ("erro", "error"), + ("trim centrado", "midtrim"), + ("potenciómetro centrado", "midpot"), + ("trim no máximo", "maxtrim"), + ("trim no mínimo", "mintrim"), + ("20 segundos", "timer20"), + ("30 segundos", "timer30"), + ("assorbimento elevato", "highmah"), + ("temperatura elevata", "hightemp"), + ("Alarme A1", "a1_org"), + ("A1 critica", "a1_red"), + ("Alarme A2", "a2_org"), + ("A2 critica", "a2_red"), + ("recepção de sinal muito baixa", "rssi_org"), + ("recepção de sinal crítica", "rssi_red"), + ("Problema com a antena do transmissor", "swr_red"), + ("servo overload", "servoko"), + ("power overload", "rxko"), + ("receiver still connected", "modelpwr"), + ]: + systemSounds.append((s, filename(f))) for i, s in enumerate(["cronómetro", "cronómetro", "transmissão", "recepção", "A1", "A2", "altitude", "motor", "combustível", "temperatura", "temperatura", "velocidade", "distância", "altitude", "célula lipo", "Total lipo", "tensão", "corrente", "consumo", "potência", "aceleração X", "aceleração Y", "aceleração Z", "Direcção", "variómetro", "mínimo", "máximo"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 141 + i))) + systemSounds.append((s, filename(141 + i))) for i, (s, f) in enumerate([("trem, em cima.", "gearup"), ("trem, em baixo.", "geardn"), ("flaps recolhidos", "flapup"), @@ -109,4 +109,4 @@ for i, (s, f) in enumerate([("trem, em cima.", "gearup"), ("fase de voo 8", "fltmd8"), ("fase de voo 9", "fltmd9"), ]): - sounds.append((s, filename(f, PROMPT_CUSTOM_BASE + i))) + sounds.append((s, filename(f))) diff --git a/radio/util/tts_ru.py b/radio/util/tts_ru.py index 07c3320d7..c16d3a1d7 100644 --- a/radio/util/tts_ru.py +++ b/radio/util/tts_ru.py @@ -2,7 +2,7 @@ # Russian language sounds configuration -from tts_common import filename, NO_ALTERNATE, PROMPT_SYSTEM_BASE, PROMPT_CUSTOM_BASE +from tts_common import filename systemSounds = [] @@ -10,30 +10,30 @@ sounds = [] # 0 - 100 for i in range(100): - systemSounds.append((str(i), filename(PROMPT_SYSTEM_BASE + i))) + systemSounds.append((str(i), filename(i))) # 100, 200, ... 900 for i in range(9): - systemSounds.append((str(100 * (i + 1)), filename(PROMPT_SYSTEM_BASE + 100 + i))) + systemSounds.append((str(100 * (i + 1)), filename(100 + i))) for i, s in enumerate([u"тысяча", u"и", u"минус"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 109 + i))) + systemSounds.append((s, filename(109 + i))) for i, s in enumerate([u"тысяча", u"тысячи", u"тысяч"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 200 + i))) + systemSounds.append((s, filename(200 + i))) # decimal point for i, s in enumerate([u"ровно", u"и одна десятая", u"и две десятых", u"и три десятых", u"и четыре десятых", u"и пять десятых", u"и шесть десятых", u"и семь десятых", u"и восемь десятых", u"и девять десятых" ]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 165 + i))) + systemSounds.append((s, filename(165 + i))) # last digit = 1, female for i, s in enumerate([u"одна", u"одиннадцать", u"двадцать одна", u"тридцать одна", u"сорок одна", u"пятьдесят одна", u"шестьдесят одна", u"семьдесят одна", u"восемьдесят одна", u"девяносто одна"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 180 + i))) + systemSounds.append((s, filename(180 + i))) # last digit = 2, female for i, s in enumerate([u"две", u"двенадцать", u"двадцать две", u"тридцать две", u"сорок две", u"пятьдесят две", u"шестьдесят две", u"семьдесят две", u"восемьдесят две", u"девяносто две"]): - systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 190 + i))) + systemSounds.append((s, filename(190 + i))) for i, (s, f) in enumerate([(u"вольт", "volt0"), (u"вольт", "volt1"), (u"вольта", "volt2"), (u"вольт", "volt5"), @@ -88,83 +88,84 @@ for i, (s, f) in enumerate([(u"вольт", "volt0"), (u"вольт", "volt1"), (u"секунд", "second0"), (u"секунда", "second1"), (u"секунды", "second2"), (u"секунд", "second5"), ]): - systemSounds.append((s, filename(f, PROMPT_SYSTEM_BASE + 115 + i))) + systemSounds.append((s, filename(f))) -for s, f, a in [(u"Триммер по центру", "midtrim", 495), - (u"Триммер максимум", "maxtrim", NO_ALTERNATE), - (u"Триммер минимум", "mintrim", NO_ALTERNATE), - (u"Таймер 1. Время вышло", "timovr1", NO_ALTERNATE), - (u"Таймер 2. Время вышло", "timovr2", NO_ALTERNATE), - (u"Таймер 3. Время вышло", "timovr3", NO_ALTERNATE), - (u"Аккумулятор садится!", "lowbatt", 485), - (u"Внимание, пульт не выключен!", "inactiv", 486), - (u"Проверь газ!", "thralert", 481), - (u"Проверь, тумблеры!", "swalert", 482), - (u"Ошибка памяти", "eebad", 483), - (u"Опен тэ, икс приветствует вас!", "hello", 480), - (u"Слабый сигнал!", "rssi_org", NO_ALTERNATE), - (u"Очень слабый сигнал!", "rssi_red", NO_ALTERNATE), - (u"Проблема с антэнной!", "swr_red", NO_ALTERNATE), - (u"Телеметрия потеряна", "telemko", NO_ALTERNATE), - (u"Телеметрия восстановлена", "telemok", NO_ALTERNATE), - (u"Тренерский сигнал потерян", "trainko", NO_ALTERNATE), - (u"Тренерский сигнал восстановлен", "trainok", NO_ALTERNATE), - (u"Сенсор отключен", "sensorko", NO_ALTERNATE), - (u"Серва перегружена", "servoko", NO_ALTERNATE), - (u"Перегрузка", "rxko", NO_ALTERNATE), - (u"Приемник всё ещё подключен!", "modelpwr", NO_ALTERNATE), - ]: - systemSounds.append((s, filename(f, a))) +for s, f in [ + (u"Триммер по центру", "midtrim"), + (u"Триммер максимум", "maxtrim"), + (u"Триммер минимум", "mintrim"), + (u"Таймер 1. Время вышло", "timovr1"), + (u"Таймер 2. Время вышло", "timovr2"), + (u"Таймер 3. Время вышло", "timovr3"), + (u"Аккумулятор садится!", "lowbatt"), + (u"Внимание, пульт не выключен!", "inactiv"), + (u"Проверь газ!", "thralert"), + (u"Проверь, тумблеры!", "swalert"), + (u"Ошибка памяти", "eebad"), + (u"Опен тэ, икс приветствует вас!", "hello"), + (u"Слабый сигнал!", "rssi_org"), + (u"Очень слабый сигнал!", "rssi_red"), + (u"Проблема с антэнной!", "swr_red"), + (u"Телеметрия потеряна", "telemko"), + (u"Телеметрия восстановлена", "telemok"), + (u"Тренерский сигнал потерян", "trainko"), + (u"Тренерский сигнал восстановлен", "trainok"), + (u"Сенсор отключен", "sensorko"), + (u"Серва перегружена", "servoko"), + (u"Перегрузка", "rxko"), + (u"Приемник всё ещё подключен!", "modelpwr"), +]: + systemSounds.append((s, filename(f))) for i, (s, f) in enumerate([ - (u"Аккумулятор садится!", "lowbat"), - (u"Шасси, убраны'", "gearup"), - (u"Шасси, выпущены", "geardn"), - (u"Закрылки убраны'", "flapup"), - (u"Закрылки выпущены", "flapdn"), - (u"Спойлеры выпущены", "splrup"), - (u"Спойлеры - убраны'", "splrdn"), - (u"Тренер: подключен", "trnon"), - (u"Тренер: отключен", "trnoff"), - (u"Двигатели запущены!", "armed"), - (u"Двигатели выключены", "disarm"), - (u"Слишком высоко", "tohigh"), - (u"Слишком низко", "tolow"), - (u"Низкий уровень сигнала", "siglow"), - (u"Критически низкий уровень сигнала", "sigcrt"), - (u"Полетный режим один", "fm-1"), - (u"Полетный режим два", "fm-2"), - (u"Полетный режим три", "fm-3"), - (u"Полетный режим четыре", "fm-4"), - (u"Полетный режим пять", "fm-5"), - (u"Полетный режим шесть", "fm-6"), - (u"Полетный режим семь", "fm-7"), - (u"Полетный режим восемь", "fm-8"), - (u"Режим,акро", "fm-acr"), - (u"Режим круиза", "fm-crs"), - (u"Режим взлета", "fm-lch"), - (u"Режим посадки", "fm-lnd"), - (u"Нормальный режим", "fm-nrm"), - (u"Ручной режим", "fm-man"), - (u"Стабилизация", "fm-stb"), - (u"Удержание позиции", "fm-hld"), - (u"Возврат в точку старта", "fm-rth"), - (u"Горизонт", "fm-hor"), - (u"Стабилизация", "fm-ang"), - (u"аирмод включен", "airmon"), - (u"аирмод выключен", "airmof"), - (u"Высота", "alt"), - (u"Удержание высоты", "althld"), - (u"Критический разряд!", "batcrt"), - (u"Время полета", "flttm"), - (u"Аварийный режим выключен", "fsoff"), - (u"Аварийный режим включен", "fson"), - (u"ДжиПи Эс", "gps"), - (u"Высокие расходы", "hirate"), - (u"Низкие расходы", "lorate"), - (u"Спутники найдены!", "satfix"), - (u"Спутники потеряны!", "satlst"), - (u"Бортовые огни выключены", "ledoff"), - (u"Бортовые огни включены", "ledon") - ]): - sounds.append((s, filename(f, PROMPT_CUSTOM_BASE + i))) + (u"Аккумулятор садится!", "lowbat"), + (u"Шасси, убраны'", "gearup"), + (u"Шасси, выпущены", "geardn"), + (u"Закрылки убраны'", "flapup"), + (u"Закрылки выпущены", "flapdn"), + (u"Спойлеры выпущены", "splrup"), + (u"Спойлеры - убраны'", "splrdn"), + (u"Тренер: подключен", "trnon"), + (u"Тренер: отключен", "trnoff"), + (u"Двигатели запущены!", "armed"), + (u"Двигатели выключены", "disarm"), + (u"Слишком высоко", "tohigh"), + (u"Слишком низко", "tolow"), + (u"Низкий уровень сигнала", "siglow"), + (u"Критически низкий уровень сигнала", "sigcrt"), + (u"Полетный режим один", "fm-1"), + (u"Полетный режим два", "fm-2"), + (u"Полетный режим три", "fm-3"), + (u"Полетный режим четыре", "fm-4"), + (u"Полетный режим пять", "fm-5"), + (u"Полетный режим шесть", "fm-6"), + (u"Полетный режим семь", "fm-7"), + (u"Полетный режим восемь", "fm-8"), + (u"Режим,акро", "fm-acr"), + (u"Режим круиза", "fm-crs"), + (u"Режим взлета", "fm-lch"), + (u"Режим посадки", "fm-lnd"), + (u"Нормальный режим", "fm-nrm"), + (u"Ручной режим", "fm-man"), + (u"Стабилизация", "fm-stb"), + (u"Удержание позиции", "fm-hld"), + (u"Возврат в точку старта", "fm-rth"), + (u"Горизонт", "fm-hor"), + (u"Стабилизация", "fm-ang"), + (u"аирмод включен", "airmon"), + (u"аирмод выключен", "airmof"), + (u"Высота", "alt"), + (u"Удержание высоты", "althld"), + (u"Критический разряд!", "batcrt"), + (u"Время полета", "flttm"), + (u"Аварийный режим выключен", "fsoff"), + (u"Аварийный режим включен", "fson"), + (u"ДжиПи Эс", "gps"), + (u"Высокие расходы", "hirate"), + (u"Низкие расходы", "lorate"), + (u"Спутники найдены!", "satfix"), + (u"Спутники потеряны!", "satlst"), + (u"Бортовые огни выключены", "ledoff"), + (u"Бортовые огни включены", "ledon") +]): + sounds.append((s, filename(f))) diff --git a/tools/build-frsky.py b/tools/build-frsky.py index 9e538bc4a..3db1e97fb 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -103,6 +103,17 @@ boards = { "MULTIMODULE": "NO", "CROSSFIRE": "NO", "DEFAULT_MODE": "2", + }, + "X7ACCESS": { + "PCB": "X7", + "PCBREV": "ACCESS", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "AUTOUPDATE": "YES", + "PXX1": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", } }