diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 72e28b4fd..e76779c62 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -343,6 +343,8 @@ 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 X7 AND PCBREV STREQUAL TX12) + set(FLAVOUR tx12) elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) set(FLAVOUR x9d+2019) elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS) diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc index cddc2fa3e..fbbacdb48 100644 --- a/companion/src/companion.qrc +++ b/companion/src/companion.qrc @@ -179,6 +179,17 @@ images/simulator/JumperT12/JumperT12-x.png images/simulator/JumperT12/JumperT12-center.png images/simulator/JumperT12/JumperT12-top.png + images/simulator/TX12/left.png + images/simulator/TX12/left-pageup.png + images/simulator/TX12/left-pagedn.png + images/simulator/TX12/left-rtn.png + images/simulator/TX12/left-sys.png + images/simulator/TX12/left-tele.png + images/simulator/TX12/right.png + images/simulator/TX12/right-ent.png + images/simulator/TX12/right-mdl.png + images/simulator/TX12/bottom.png + images/simulator/TX12/top.png images/simulator/JumperT16/left.png images/simulator/JumperT16/right.png images/simulator/JumperT16/top.png diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 5e0ceeb86..35f7a0bab 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -85,6 +85,8 @@ uint32_t Boards::getFourCC(Type board) return 0x4078746F; case BOARD_RADIOMASTER_TX16S: return 0x3878746F; + case BOARD_RADIOMASTER_TX12: + return 0x4178746F; case BOARD_UNKNOWN: break; } @@ -111,6 +113,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_TARANIS_X9DP_2019: case BOARD_TARANIS_X9E: case BOARD_JUMPER_T12: + case BOARD_RADIOMASTER_TX12: return EESIZE_TARANIS; case BOARD_UNKNOWN: return EESIZE_MAX; @@ -145,6 +148,7 @@ int Boards::getFlashSize(Type board) case BOARD_TARANIS_X9DP_2019: case BOARD_TARANIS_X9E: case BOARD_JUMPER_T12: + case BOARD_RADIOMASTER_TX12: return FSIZE_TARANIS; case BOARD_HORUS_X12S: case BOARD_X10: @@ -201,6 +205,20 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index) if (index < DIM(switches)) return switches[index]; } + else if (IS_RADIOMASTER_TX12(board)) { + const Board::SwitchInfo switches[] = { + {SWITCH_TOGGLE, "SA"}, + {SWITCH_3POS, "SB"}, + {SWITCH_3POS, "SC"}, + {SWITCH_TOGGLE, "SD"}, + {SWITCH_3POS, "SE"}, + {SWITCH_3POS, "SF"}, + {SWITCH_2POS, "SI"}, + {SWITCH_2POS, "SJ"} + }; + if (index < DIM(switches)) + return switches[index]; + } else if (IS_JUMPER_T12(board)) { const Board::SwitchInfo switches[] = { {SWITCH_3POS, "SA"}, @@ -213,7 +231,23 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index) if (index < DIM(switches)) return switches[index]; } - else if (IS_HORUS_OR_TARANIS(board)) { + else if (IS_FAMILY_HORUS_OR_T16(board)) { + const Board::SwitchInfo switches[] = { + {SWITCH_3POS, "SA"}, + {SWITCH_3POS, "SB"}, + {SWITCH_3POS, "SC"}, + {SWITCH_3POS, "SD"}, + {SWITCH_3POS, "SE"}, + {SWITCH_2POS, "SF"}, + {SWITCH_3POS, "SG"}, + {SWITCH_TOGGLE, "SH"}, + {SWITCH_2POS, "SI"}, + {SWITCH_2POS, "SJ"} + }; + if (index < DIM(switches)) + return switches[index]; + } + else if (IS_TARANIS(board)) { const Board::SwitchInfo switches[] = { {SWITCH_3POS, "SA"}, {SWITCH_3POS, "SB"}, @@ -263,7 +297,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) case Pots: if (IS_TARANIS_X9LITE(board)) return 1; - else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) + else if (IS_TARANIS_SMALL(board)) return 2; else if (IS_TARANIS_X9E(board)) return 4; @@ -318,8 +352,8 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) return 7; else if (IS_TARANIS_X7(board)) return 8; - else if (IS_JUMPER_T12(board)) - return 6; + else if (IS_FAMILY_T12(board)) + return 8; else if (IS_TARANIS_XLITE(board)) return 6; else if (board == Board::BOARD_TARANIS_X9DP_2019) @@ -334,6 +368,8 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) case FactoryInstalledSwitches: if (IS_TARANIS_X9E(board)) return 8; + if (IS_FAMILY_T12(board)) + return 6; if (IS_HORUS_X12S(board)) return 8; else @@ -515,6 +551,8 @@ QString Boards::getBoardName(Board::Type board) return "Jumper T18"; case BOARD_RADIOMASTER_TX16S: return "Radiomaster TX16S"; + case BOARD_RADIOMASTER_TX12: + return "Radiomaster TX12"; default: return tr("Unknown"); } diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 2ecf3c2fe..1e1588485 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -52,9 +52,10 @@ namespace Board { BOARD_JUMPER_T16, BOARD_RADIOMASTER_TX16S, BOARD_JUMPER_T18, + BOARD_RADIOMASTER_TX12, }; - constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_T18; + constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX12; enum PotType { @@ -218,11 +219,21 @@ inline bool IS_RADIOMASTER_TX16S(Board::Type board) return board == Board::BOARD_RADIOMASTER_TX16S; } +inline bool IS_RADIOMASTER_TX12(Board::Type board) +{ + return board == Board::BOARD_RADIOMASTER_TX12; +} + inline bool IS_FAMILY_T16(Board::Type board) { return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S || board == Board::BOARD_JUMPER_T18; } +inline bool IS_FAMILY_T12(Board::Type board) +{ + return board == Board::BOARD_JUMPER_T12 || board == Board::BOARD_RADIOMASTER_TX12; +} + inline bool IS_TARANIS_XLITE(Board::Type board) { return board == Board::BOARD_TARANIS_XLITE || board == Board::BOARD_TARANIS_XLITES; @@ -273,14 +284,14 @@ inline bool IS_TARANIS_X9E(Board::Type board) return board == Board::BOARD_TARANIS_X9E; } -inline bool IS_TARANIS(Board::Type board) -{ - return IS_TARANIS_X9(board) || IS_TARANIS_X7(board) || IS_TARANIS_X9LITE(board) || IS_TARANIS_XLITE(board) || IS_JUMPER_T12(board); -} - inline bool IS_TARANIS_SMALL(Board::Type board) { - return IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || IS_JUMPER_T12(board); + return IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || IS_FAMILY_T12(board); +} + +inline bool IS_TARANIS(Board::Type board) +{ + return IS_TARANIS_X9(board) || IS_TARANIS_SMALL(board); } inline bool IS_HORUS_X10(Board::Type board) diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index f307dbf26..005900c93 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -253,11 +253,11 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board) potConfig[0] = Board::POT_WITHOUT_DETENT; potConfig[1] = Board::POT_WITH_DETENT; } - else if (IS_TARANIS(board)) { + else if (IS_FAMILY_T12(board)) { potConfig[0] = Board::POT_WITH_DETENT; potConfig[1] = Board::POT_WITH_DETENT; } - else if (IS_JUMPER_T12(board)) { + else if (IS_TARANIS(board)) { potConfig[0] = Board::POT_WITH_DETENT; potConfig[1] = Board::POT_WITH_DETENT; } @@ -329,14 +329,14 @@ void GeneralSettings::convert(RadioDataConversionState & cstate) } } - if (IS_JUMPER_T12(cstate.toType)) { + if (IS_FAMILY_T12(cstate.toType)) { if (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType)) { strncpy(switchName[4], switchName[5], sizeof(switchName[0])); strncpy(switchName[5], switchName[7], sizeof(switchName[0])); } } - else if (IS_JUMPER_T12(cstate.fromType)) { + else if (IS_FAMILY_T12(cstate.fromType)) { if (IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) { strncpy(switchName[5], switchName[4], sizeof(switchName[0])); strncpy(switchName[7], switchName[5], sizeof(switchName[0])); diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 5f02afee6..30666ca79 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -45,7 +45,7 @@ inline int MAX_SWITCHES(Board::Type board, int version) if (IS_TARANIS_X9D(board)) return 9; - if (IS_JUMPER_T12(board)) + if (IS_FAMILY_T12(board)) return 8; return Boards::getCapability(board, Board::Switches); diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h index bb55b5687..aabbe2284 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.h +++ b/companion/src/firmwares/opentx/opentxeeprom.h @@ -36,6 +36,7 @@ #define TARANIS_X9LITE_VARIANT 0x0800 #define TARANIS_X9LITES_VARIANT 0x0801 #define JUMPER_T12_VARIANT 0x4001 +#define RADIOMASTER_TX12_VARIANT 0x4002 class OpenTxGeneralData: public TransformedField { public: diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 005a29c40..2e35c51db 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -66,6 +66,8 @@ const char * OpenTxEepromInterface::getName() return "OpenTX for Jumper T18"; case BOARD_RADIOMASTER_TX16S: return "OpenTX for Radiomaster TX16S"; + case BOARD_RADIOMASTER_TX12: + return "OpenTX for Radiomaster TX12"; case BOARD_TARANIS_X9D: return "OpenTX for FrSky Taranis X9D"; case BOARD_TARANIS_X9DP: @@ -334,7 +336,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u else if (IS_JUMPER_T12(board)) { variant |= JUMPER_T12_VARIANT; } - + else if (IS_RADIOMASTER_TX12(board)) { + variant |= RADIOMASTER_TX12_VARIANT; + } OpenTxGeneralData generator((GeneralSettings &)radioData.generalSettings, board, version, variant); // generator.dump(); QByteArray data; @@ -520,7 +524,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case MaxVolume: return 23; case MaxContrast: - if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) + if (IS_TARANIS_SMALL(board)) return 30; else return 45; @@ -615,7 +619,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case LcdWidth: if (IS_FAMILY_HORUS_OR_T16(board)) return 480; - else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) + else if (IS_TARANIS_SMALL(board)) return 128; else if (IS_TARANIS(board)) return 212; @@ -629,7 +633,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case LcdDepth: if (IS_FAMILY_HORUS_OR_T16(board)) return 16; - else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) + else if (IS_TARANIS_SMALL(board)) return 1; else if (IS_TARANIS(board)) return 4; @@ -679,6 +683,8 @@ int OpenTxFirmware::getCapability(::Capability capability) return TARANIS_XLITE_VARIANT; else if (IS_JUMPER_T12(board)) return JUMPER_T12_VARIANT; + else if (IS_RADIOMASTER_TX12(board)) + return RADIOMASTER_TX12_VARIANT; else return 0; case MavlinkTelemetry: @@ -733,9 +739,9 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) return true; case PULSES_PXX_XJT_X16: case PULSES_PXX_XJT_LR12: - return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board) && !IS_JUMPER_T12(board); + return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board) && !IS_FAMILY_T12(board); case PULSES_PXX_XJT_D8: - return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board) && !IS_JUMPER_T12(board); + return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board) && !IS_FAMILY_T12(board); case PULSES_ACCESS_ISRM: case PULSES_ACCST_ISRM_D16: return IS_ACCESS_RADIO(board, id); @@ -943,6 +949,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari variantError = true; } } + else if (IS_RADIOMASTER_TX12(board)) { + if (variant != RADIOMASTER_TX12_VARIANT) { + variantError = true; + } + } else if (IS_TARANIS(board)) { if (variant != 0) { variantError = true; @@ -1273,6 +1284,16 @@ void registerOpenTxFirmwares() addOpenTxRfOptions(firmware, FLEX); registerOpenTxFirmware(firmware); + /* Radiomaster TX12 board */ + firmware = new OpenTxFirmware("opentx-tx12", QCoreApplication::translate("Firmware", "Radiomaster TX12"), BOARD_RADIOMASTER_TX12); + addOpenTxCommonOptions(firmware); + firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support")); + firmware->addOption("nogvars", Firmware::tr("Disable Global variables")); + firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen")); + addOpenTxFontOptions(firmware); + registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); + /* Radiomaster TX16S board */ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16S / SE / Hall / Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); diff --git a/companion/src/firmwares/rawsource.cpp b/companion/src/firmwares/rawsource.cpp index 92377fe0a..67a640c33 100644 --- a/companion/src/firmwares/rawsource.cpp +++ b/companion/src/firmwares/rawsource.cpp @@ -364,7 +364,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate) if (index >= 0) evt = RadioDataConversionState::EVT_CVRT; } - else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) { + else if (IS_FAMILY_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) { // No SE and SG on T12 board index = toSwitchList.indexOf("SD"); if (index >= 0) diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp index 8c1685a25..10d3f7fa3 100644 --- a/companion/src/firmwares/rawswitch.cpp +++ b/companion/src/firmwares/rawswitch.cpp @@ -200,7 +200,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate) if (newIdx >= 0) evt = RadioDataConversionState::EVT_CVRT; } - else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) { + else if (IS_FAMILY_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) { // No SE and SG on T12 board newIdx = toSwitchList.indexOf("SD"); if (newIdx >= 0) diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index d718bd759..9d2e8e452 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -47,7 +47,15 @@ void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * na label->setText("SJ"); } } - if (IS_JUMPER_T12(board)) { + else if (IS_RADIOMASTER_TX12(board)) { + if (index == 6) { + label->setText("SI"); + } + else if (index == 7) { + label->setText("SJ"); + } + } + else if (IS_FAMILY_T12(board)) { if (index == 4) { label->setText("SG"); } @@ -101,6 +109,15 @@ void HardwarePanel::setupSliderType(int index, QLabel *label, AutoLineEdit *name } } +bool HardwarePanel::isSwitch3Pos(int idx) +{ + Board::Type board = firmware->getBoard(); + Board::SwitchInfo switchInfo = Boards::getSwitchInfo(board, idx); + + switchInfo.config = Board::SwitchType(generalSettings.switchConfig[idx]); + return switchInfo.config == Board::SWITCH_3POS; +}; + HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware): GeneralPanel(parent, generalSettings, firmware), ui(new Ui::Hardware) @@ -147,17 +164,17 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings setupSliderType(2, ui->ls2Label, ui->ls2Name, ui->ls2Type); setupSliderType(3, ui->rs2Label, ui->rs2Name, ui->rs2Type); - setupSwitchType(0, ui->saLabel, ui->saName, ui->saType); - setupSwitchType(1, ui->sbLabel, ui->sbName, ui->sbType); - setupSwitchType(2, ui->scLabel, ui->scName, ui->scType); - setupSwitchType(3, ui->sdLabel, ui->sdName, ui->sdType); - setupSwitchType(4, ui->seLabel, ui->seName, ui->seType); - setupSwitchType(5, ui->sfLabel, ui->sfName, ui->sfType, false); //switch does not support 3POS - setupSwitchType(6, ui->sgLabel, ui->sgName, ui->sgType); - setupSwitchType(7, ui->shLabel, ui->shName, ui->shType, false); //switch does not support 3POS - setupSwitchType(8, ui->siLabel, ui->siName, ui->siType); - setupSwitchType(9, ui->sjLabel, ui->sjName, ui->sjType); - setupSwitchType(10, ui->skLabel, ui->skName, ui->skType); + setupSwitchType(0, ui->saLabel, ui->saName, ui->saType, isSwitch3Pos(0)); + setupSwitchType(1, ui->sbLabel, ui->sbName, ui->sbType, isSwitch3Pos(1)); + setupSwitchType(2, ui->scLabel, ui->scName, ui->scType, isSwitch3Pos(2)); + setupSwitchType(3, ui->sdLabel, ui->sdName, ui->sdType, isSwitch3Pos(3)); + setupSwitchType(4, ui->seLabel, ui->seName, ui->seType, isSwitch3Pos(4)); + setupSwitchType(5, ui->sfLabel, ui->sfName, ui->sfType, isSwitch3Pos(5)); + setupSwitchType(6, ui->sgLabel, ui->sgName, ui->sgType, isSwitch3Pos(6)); + setupSwitchType(7, ui->shLabel, ui->shName, ui->shType, isSwitch3Pos(7)); + setupSwitchType(8, ui->siLabel, ui->siName, ui->siType, isSwitch3Pos(8)); + setupSwitchType(9, ui->sjLabel, ui->sjName, ui->sjType, isSwitch3Pos(9)); + setupSwitchType(10, ui->skLabel, ui->skName, ui->skType); // Here starts X9E, only 3 switches setupSwitchType(11, ui->slLabel, ui->slName, ui->slType); setupSwitchType(12, ui->smLabel, ui->smName, ui->smType); setupSwitchType(13, ui->snLabel, ui->snName, ui->snType); diff --git a/companion/src/generaledit/hardware.h b/companion/src/generaledit/hardware.h index 39d3fcd53..3b63a1d77 100644 --- a/companion/src/generaledit/hardware.h +++ b/companion/src/generaledit/hardware.h @@ -63,6 +63,7 @@ class HardwarePanel : public GeneralPanel Ui::Hardware *ui; void setValues(); + bool isSwitch3Pos(int idx); }; #endif // _HARDWARE_H_ diff --git a/companion/src/images/simulator/TX12/bottom.png b/companion/src/images/simulator/TX12/bottom.png new file mode 100644 index 000000000..52a35bceb Binary files /dev/null and b/companion/src/images/simulator/TX12/bottom.png differ diff --git a/companion/src/images/simulator/TX12/left-pagedn.png b/companion/src/images/simulator/TX12/left-pagedn.png new file mode 100755 index 000000000..3f83d370c Binary files /dev/null and b/companion/src/images/simulator/TX12/left-pagedn.png differ diff --git a/companion/src/images/simulator/TX12/left-pageup.png b/companion/src/images/simulator/TX12/left-pageup.png new file mode 100755 index 000000000..203fd73e7 Binary files /dev/null and b/companion/src/images/simulator/TX12/left-pageup.png differ diff --git a/companion/src/images/simulator/TX12/left-rtn.png b/companion/src/images/simulator/TX12/left-rtn.png new file mode 100755 index 000000000..8269d8853 Binary files /dev/null and b/companion/src/images/simulator/TX12/left-rtn.png differ diff --git a/companion/src/images/simulator/TX12/left-sys.png b/companion/src/images/simulator/TX12/left-sys.png new file mode 100755 index 000000000..472b412eb Binary files /dev/null and b/companion/src/images/simulator/TX12/left-sys.png differ diff --git a/companion/src/images/simulator/TX12/left-tele.png b/companion/src/images/simulator/TX12/left-tele.png new file mode 100755 index 000000000..d7971d791 Binary files /dev/null and b/companion/src/images/simulator/TX12/left-tele.png differ diff --git a/companion/src/images/simulator/TX12/left.png b/companion/src/images/simulator/TX12/left.png new file mode 100755 index 000000000..e7f5522c1 Binary files /dev/null and b/companion/src/images/simulator/TX12/left.png differ diff --git a/companion/src/images/simulator/TX12/right-ent.png b/companion/src/images/simulator/TX12/right-ent.png new file mode 100755 index 000000000..8534cceb2 Binary files /dev/null and b/companion/src/images/simulator/TX12/right-ent.png differ diff --git a/companion/src/images/simulator/TX12/right-mdl.png b/companion/src/images/simulator/TX12/right-mdl.png new file mode 100755 index 000000000..4343626ea Binary files /dev/null and b/companion/src/images/simulator/TX12/right-mdl.png differ diff --git a/companion/src/images/simulator/TX12/right.png b/companion/src/images/simulator/TX12/right.png new file mode 100755 index 000000000..0f33cae7c Binary files /dev/null and b/companion/src/images/simulator/TX12/right.png differ diff --git a/companion/src/images/simulator/TX12/top.png b/companion/src/images/simulator/TX12/top.png new file mode 100644 index 000000000..ceb68a4c1 Binary files /dev/null and b/companion/src/images/simulator/TX12/top.png differ diff --git a/companion/src/modeledit/curves.cpp b/companion/src/modeledit/curves.cpp index 662dc61c4..da056964e 100644 --- a/companion/src/modeledit/curves.cpp +++ b/companion/src/modeledit/curves.cpp @@ -412,6 +412,7 @@ void Curves::onPointEdited() model->curves[currentCurve].points[index].x = spnx[index]->value(); model->curves[currentCurve].points[index].y = spny[index]->value(); updateCurve(); + updateCurvePoints(); emit modified(); } } diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt index 462d5693f..d2d6c77de 100644 --- a/companion/src/simulation/CMakeLists.txt +++ b/companion/src/simulation/CMakeLists.txt @@ -15,6 +15,7 @@ set(simulation_SRCS simulateduiwidgetJumperT12.cpp simulateduiwidgetJumperT16.cpp simulateduiwidgetJumperT18.cpp + simulateduiwidgetTX12.cpp simulateduiwidgetTX16S.cpp simulatorinterface.cpp simulatormainwindow.cpp @@ -41,6 +42,7 @@ set(simulation_UIS simulateduiwidgetJumperT12.ui simulateduiwidgetJumperT16.ui simulateduiwidgetJumperT18.ui + simulateduiwidgetTX12.ui simulateduiwidgetTX16S.ui simulatormainwindow.ui simulatorstartupdialog.ui diff --git a/companion/src/simulation/simulateduiwidget.h b/companion/src/simulation/simulateduiwidget.h index 8419840c5..66939f429 100644 --- a/companion/src/simulation/simulateduiwidget.h +++ b/companion/src/simulation/simulateduiwidget.h @@ -115,6 +115,7 @@ namespace Ui { class SimulatedUIWidgetJumperT16; class SimulatedUIWidgetJumperT18; class SimulatedUIWidgetTX16S; + class SimulatedUIWidgetTX12; } class SimulatedUIWidget9X: public SimulatedUIWidget @@ -265,6 +266,19 @@ class SimulatedUIWidgetJumperT18: public SimulatedUIWidget Ui::SimulatedUIWidgetJumperT18 * ui; }; +class SimulatedUIWidgetTX12: public SimulatedUIWidget +{ + Q_OBJECT + + public: + explicit SimulatedUIWidgetTX12(SimulatorInterface * simulator, QWidget * parent = nullptr); + virtual ~SimulatedUIWidgetTX12(); + + private: + Ui::SimulatedUIWidgetTX12 * ui; +}; + + class SimulatedUIWidgetTX16S: public SimulatedUIWidget { Q_OBJECT diff --git a/companion/src/simulation/simulateduiwidgetTX12.cpp b/companion/src/simulation/simulateduiwidgetTX12.cpp new file mode 100644 index 000000000..8e7c518f0 --- /dev/null +++ b/companion/src/simulation/simulateduiwidgetTX12.cpp @@ -0,0 +1,67 @@ +#include "simulateduiwidget.h" +#include "ui_simulateduiwidgetTX12.h" + +// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h + +SimulatedUIWidgetTX12::SimulatedUIWidgetTX12(SimulatorInterface *simulator, QWidget * parent): + SimulatedUIWidget(simulator, parent), + ui(new Ui::SimulatedUIWidgetTX12) +{ + RadioUiAction * act; + + ui->setupUi(this); + + // add actions in order of appearance on the help menu + + act = new RadioUiAction(5, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL); + addRadioWidget(ui->rightbuttons->addArea(QRect(60, 5, 90, 60), "TX12/right-mdl.png", act)); + + m_mouseMidClickAction = new RadioUiAction(1, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN); + addRadioWidget(ui->rightbuttons->addArea(QRect(45, 100, 70, 120), "TX12/right-ent.png", m_mouseMidClickAction)); + + act = new RadioUiAction(4, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS); + addRadioWidget(ui->leftbuttons->addArea(QRect(35, 5, 80, 50), "TX12/left-sys.png", act)); + + act = new RadioUiAction(6, QList() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE); + addRadioWidget(ui->leftbuttons->addArea(QRect(90, 210, 80, 35), "TX12/left-tele.png", act)); + + act = new RadioUiAction(3, QList() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN); + addRadioWidget(ui->leftbuttons->addArea(QRect(75, 125, 80, 35), "TX12/left-pagedn.png", act)); + + act = new RadioUiAction(2, QList() << Qt::Key_PageUp, SIMU_STR_HLP_KEY_PGUP, SIMU_STR_HLP_ACT_PGUP); + addRadioWidget(ui->leftbuttons->addArea(QRect(80, 170, 80, 35), "TX12/left-pageup.png", act)); + + act = new RadioUiAction(0, QList() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_EXIT); + addRadioWidget(ui->leftbuttons->addArea(QRect(70, 85, 80, 35), "TX12/left-rtn.png", act)); + + m_scrollUpAction = new RadioUiAction(-1, QList() << Qt::Key_Minus << Qt::Key_Equal << Qt::Key_Left, SIMU_STR_HLP_KEYS_GO_LFT, SIMU_STR_HLP_ACT_ROT_LFT); + m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Right, SIMU_STR_HLP_KEYS_GO_RGT, SIMU_STR_HLP_ACT_ROT_RGT); + connectScrollActions(); + + m_backlightColors << QColor(215, 243, 255); // X7 Blue + m_backlightColors << QColor(166,247,159); + m_backlightColors << QColor(247,159,166); + m_backlightColors << QColor(255,195,151); + m_backlightColors << QColor(247,242,159); + + setLcd(ui->lcd); + + QString css = "#radioUiWidget {" + "background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1," + "stop:0 rgba(255, 255, 255, 255)," + "stop:0.757062 rgba(241, 238, 238, 255)," + "stop:1 rgba(247, 245, 245, 255));" + "}"; + + QTimer * tim = new QTimer(this); + tim->setSingleShot(true); + connect(tim, &QTimer::timeout, [this, css]() { + emit customStyleRequest(css); + }); + tim->start(100); +} + +SimulatedUIWidgetTX12::~SimulatedUIWidgetTX12() +{ + delete ui; +} diff --git a/companion/src/simulation/simulateduiwidgetTX12.ui b/companion/src/simulation/simulateduiwidgetTX12.ui new file mode 100644 index 000000000..8d51ba2e6 --- /dev/null +++ b/companion/src/simulation/simulateduiwidgetTX12.ui @@ -0,0 +1,258 @@ + + + SimulatedUIWidgetTX12 + + + + 0 + 0 + 641 + 272 + + + + + 0 + 0 + + + + + 641 + 272 + + + + + 641 + 272 + + + + Taranis TX12 Simulator + + + background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 255), stop:0.757062 rgba(241, 238, 238, 255), stop:1 rgba(247, 245, 245, 255)); + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 196 + 253 + + + + + 196 + 253 + + + + background:url(:/images/simulator/TX12/left.png); + + + + + + + + 0 + 0 + + + + + 256 + 128 + + + + + 424 + 128 + + + + background-color: rgb(215, 243, 255); + + + + + + + + 0 + 0 + + + + + 189 + 253 + + + + + 189 + 253 + + + + background:url(:/images/simulator/TX12/right.png) + + + + + + + + 0 + 0 + + + + + 261 + 101 + + + + + 261 + 101 + + + + background:url(:/images/simulator/TX12/top.png) + + + + + + + + 0 + 0 + + + + + 261 + 24 + + + + + 261 + 24 + + + + background:url(:/images/simulator/TX12/bottom.png) + + + + + + + + 0 + 0 + + + + + 0 + 10 + + + + + 16777215 + 12 + + + + + 0 + 12 + + + + background-color: rgb(255, 255, 255); + + + + + + + + + + + 0 + 0 + + + + + 0 + 10 + + + + + 16777215 + 10 + + + + background-color: rgb(247, 245, 245); + + + + + + + + + + + LcdWidget + QWidget +
lcdwidget.h
+ 1 +
+ + ButtonsWidget + QWidget +
buttonswidget.h
+ 1 +
+
+ + +
diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index f70813442..cab7600d4 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -97,6 +97,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato case Board::BOARD_JUMPER_T18: radioUiWidget = new SimulatedUIWidgetJumperT18(simulator, this); break; + case Board::BOARD_RADIOMASTER_TX12: + radioUiWidget = new SimulatedUIWidgetTX12(simulator, this); + break; case Board::BOARD_RADIOMASTER_TX16S: radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this); break; diff --git a/companion/src/translations.cpp b/companion/src/translations.cpp index 76d63b425..415d00ba8 100644 --- a/companion/src/translations.cpp +++ b/companion/src/translations.cpp @@ -48,6 +48,7 @@ QStringList const Translations::getAvailableTranslations() << "ru_RU" << "sv_SE" << "zh_CN" + << "zh_TW" << "ja_JP" ; } return locales; diff --git a/companion/src/translations/companion_zh_TW.ts b/companion/src/translations/companion_zh_TW.ts new file mode 100644 index 000000000..54b71926b --- /dev/null +++ b/companion/src/translations/companion_zh_TW.ts @@ -0,0 +1,21736 @@ + + + + + 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 + + + + + Could not save Application Settings to file "%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 + 此之後位置在主菜單中的settings-->settings + 首選項 + + + + + + + + + + + Radio Profile + 遙控器檔案可以有多個,對應不同的遙控器 + 遙控器檔案 + + + + + + + + + + + Profile Name + 檔案名稱 + + + + + + + + + + + Radio Type + 遙控器型號 + + + + + + + + + + + Menu Language + 遙控器檔案中 + 菜單語言 + + + + + + + + + + + Build Options + 編譯選項 + + + + + + + + + + + Splash Screen + 遙控器檔案中 + 開機畫面 + + + + + + + + + + + Other Settings + 其他設置 + + + + + + + + + + + SD Structure path + SD卡目錄 + + + + + + + + + + + + + + + + + + + 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 + 如果設定將會覆蓋一般備份允許選項 + + + + + + + + + + + + + + + + + + + Enable automatic backup before writing firmware + 寫入韌體前允許自動備份 + + + + + + + + + + + General Settings + 一般設定 + + + + + + + + + + + Default Stick Mode + 默認搖桿模式 + + + + + + + + + + + Mode selection: + +Mode 1: + Left stick: Elevator, Rudder + Right stick: Throttle, Aileron + +Mode 2: + Left stick: Throttle, Rudder + Right stick: Elevator, Aileron + +Mode 3: + Left stick: Elevator, Aileron + Right stick: Throttle, Rudder + +Mode 4: + Left stick: Throttle, Aileron + Right stick: Elevator, Rudder + + + 遙控器檔案中 + 模式選擇: + +日本手 (左手升降方向-右手油門副翼) +美國手 (左手油門方向-右手升降副翼) +中國手 (左手升降副翼-右手油門方向) +日本手 (左手油門副翼-右手升降方向) + + + + + + + + + + + + + Mode 1 (RUD ELE THR AIL) + 遥控器档案中 + MODE1 日本手 ↕升降↔方向 ↕油門↔副翼 + + + + + + + + + + + Mode 2 (RUD THR ELE AIL) + MODE2 美國手 ↕油門↔方向 ↕升降↔副翼 + + + + + + + + + + + Mode 3 (AIL ELE THR RUD) + MODE3 中國手 ↕升降↔副翼 ↕油門↔方向 + + + + + + + + + + + Mode 4 (AIL THR ELE RUD) + MODE4 模式4 ↕油門↔副翼 ↕升降↔方向 + + + + + + + + + + + Default Channel Order + 遙控器檔案中 + 默認通道順序 + + + + + + + + + + + <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 T A] + + + + + + + + + + + R E A T + 方向 升降 副翼 油門 [R E A T] + + + + + + + + + + + R T E A + 方向 油門 升降 副翼 [R T E A] + + + + + + + + + + + R T A E + 方向 油門 副翼 升降 [R T A E] + + + + + + + + + + + R A E T + 方向 副翼 升降 油門 [R A E T] + + + + + + + + + + + R A T E + 方向 副翼 油門 升降 [R A T E] + + + + + + + + + + + E R T A + 升降 方向 油門 副翼 [E R T A] + + + + + + + + + + + E R A T + 升降 方向 副翼 油門 [E R A T] + + + + + + + + + + + E T R A + 升降 油門 方向 副翼 [E T R A] + + + + + + + + + + + E T A R + 升降 油門 副翼 方向 [E T A R] + + + + + + + + + + + E A R T + 升降 副翼 方向 油門 [E A R T] + + + + + + + + + + + E A T R + 升降 副翼 油門 方向 [E A T R] + + + + + + + + + + + T R E A + 油門 方向 升降 副翼 [T R E A] + + + + + + + + + + + T R A E + 油門 方向 副翼 升降 [T R A E] + + + + + + + + + + + T E R A + 油門 升降 方向 副翼 [T E R A] + + + + + + + + + + + T E A R + 油門 升降 副翼 方向 [T E A R] + + + + + + + + + + + T A R E + 油門 副翼 方向 升降 [T A R E] + + + + + + + + + + + T A E R + 油門 副翼 升降 方向 [T A E R] + + + + + + + + + + + A R E T + 副翼 方向 升降 油門 [A R E T] + + + + + + + + + + + A R T E + 副翼 方向 油門 升降 [A R T E] + + + + + + + + + + + A E R T + 副翼 升降 方向 油門 [A E R T] + + + + + + + + + + + A E T R + 副翼 升降 油門 方向 [A E T R] + + + + + + + + + + + A T R E + 副翼 油門 方向 升降 [A T R E] + + + + + + + + + + + A T E R + 副翼 油門 升降 方向 [A T E R] + + + + + + + + + + + Append version number to FW file name + 將版本號添加到韌體文件的文件名中 + + + + + + + + + + + Offer to write FW to Tx after download + 下載完成後提示將韌體寫入到遙控器 + + + + + + + + + + + Action on New Model + + + + + + + + + + + + Screenshot capture folder + + + + + + + + + + + + Clear Image + 清除圖片 + + + + + + + + + + + Select Image + 遙控器檔案中 + 選擇圖片 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder + 選擇目錄 + + + + + + + + + + + Application Settings + 程序首選項 + + + + + + + + + + + Automatic check for Companion updates + 自動檢查 Companion 版本更新 + + + + + + + + + + + most recently used files + + + + + + + + + + + + Startup Settings + + + + + + + + + + + + Remember + + + + + + + + + + + + Show splash screen when Companion starts + Companion 啟動時顯示啟動畫面 + + + + + + + + + + + Automatic check for OpenTX firmware updates + 自動檢查 OpenTX 韌體版本更新 + + + + + + + + + + + Output Logs Folder + + + + + + + + + + + + <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> + + + + + + + + + + + + Remove empty model slots when deleting models (only applies for radios w/out categories) + + + + + + + + + + + + Use model wizard + + + + + + + + + + + + Open model editor + + + + + + + + + + + + Just create the model + + + + + + + + + + + + Debug Output Logging + + + + + + + + + + + + <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> + + + + + + + + + + + + Application (Companion/Simulator) + + + + + + + + + + + + <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> + + + + + + + + + + + + Radio Firmware (in Simulator) + + + + + + + + + + + + Splash Screen Library + 開機畫面圖片庫 + + + + + + + + + + + Google Earth Executable + Google Earch 可執行文件 + + + + + + + + + + + User Splash Screens + 自定義開機畫面 + + + + + + + + + + + Automatic Backup Folder + 自動備份目錄 + + + + + + + + + + + Only show user splash images + 只顯示自定義開機畫面 + + + + + + + + + + + Show user and companion splash images + 顯示自定義和系統開機畫面 + + + + + + + + + + + Select Executable + 選擇可執行文件 + + + + + + + + Release channel + + + + + + + + + Releases (stable) + + + + + + + + + Release candidates (testing) + + + + + + + + + Nightly builds (unstable) + + + + + + + + + + + + Simulator Settings + 模擬器設置 + + + + + + + + + + + Calibrate + 校準 + + + + + + + + + + + Blue + 藍色 + + + + + + + + + + + Green + 綠色 + + + + + + + + + + + Red + 紅色 + + + + + + + + + + + Orange + 橙色 + + + + + + + + + + + Yellow + 黄色 + + + + + + + + + + + Only capture to clipboard + 只截圖到剪貼板中 + + + + + + + + + + + Enable + 使用遊戲桿 + + + + + + + + + + + Joystick + 遊戲桿 + + + + + + + + + + + Simulator BackLight + 模擬器背光顏色 + + + + + + + + + + + Remember simulator switch values + 關閉模擬器後記憶開關位置 + + + + + + + + + + + Simulator Volume Gain + 模擬器音量調節 + + + + 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> + + + + + 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 + 允許:遙控器設定保存到 %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卡目錄結構的電腦文件夾 + + + + Open Image to load + 打開圖片並載入 + + + + Images (%1) + 圖片 (%1) + + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + + + + BinEepromFormat + + + Error reading %1: %2 + + + + + Cannot save EEPROM + + + + + Cannot open file %1: +%2. + + + + + Error writing file %1: +%2. + 寫入文件錯誤 %1: +%2. + + + + Invalid binary EEPROM file %1 + + + + + Boards + + + Left Horizontal + 左搖桿水平方向 + + + + Left Vertical + 左搖桿垂直方向 + + + + Right Vertical + 右搖桿上下方向 + + + + Right Horizontal + 右搖桿水平方向 + + + + Aux. 1 + + + + + Aux. 2 + + + + + + Unknown + 未知[Unknown] + + + + Rud + + + + + Ele + + + + + Thr + + + + + Ail + + + + + CalibrationPanel + + + Negative span + 負範圍 + + + + Mid value + 中值 + + + + Positive span + 正範圍 + + + + CategorizedStorageFormat + + + Can't extract RADIO/radio.bin + + + + + Can't extract RADIO/models.txt + + + + + Can't extract %1 + + + + + Error loading models + + + + + Channels + + + Name + 在舵機設置頁面中 + 通道名稱 [Name] + + + + Subtrim + 在舵機設置頁面中 + 舵機中位 [Subtrim] + + + + Min + 在舵機設置頁面中 + 舵機下限 [Min] + + + + Max + 在舵機設置頁面中 + 舵機上限 [Max] + + + + Direction + 在舵機設置頁面中 + 舵機反向 [Dir] + + + + Curve + 在舵機設置頁面中 + 舵機曲線 [Curve] + + + + PPM Center + 在舵機設置頁面中 + PPM中位脈寬 + + + + Linear Subtrim + 在舵機設置頁面中 + 線性微調 [Linear] + + + + CH%1 + 在舵機設置頁面中 + 通道%1 + + + + Popup menu available + + + + + --- + 在舵機設置頁面中 表示舵機正向 + 正向 [→] + + + + INV + 在舵機設置頁面中 + 反向 [←] + + + + &Copy + + + + + &Cut + 剪下 (&C) + + + + &Paste + 貼上 (&P) + + + + &Delete + 删除 (&D) + + + + 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 + + + OpenTX Companion + + + + + Information + 信息 + + + + Warning + 啟用時蜂鳴 [Warning] + + + + Error + 錯誤 + + + + Application Settings + 程序首選項 + + + + files + + + + + Radio and Models 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. + + + + + <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> + + + + + 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. + + + + + settings + + + + + CompareDialog + + + + + + + + + + Compare Models + Compare 模型對比對話框 + 比較模型參數 + + + + + + + + + + + To compare models, drag and drop them anywhere in this window. + + + + + + + + + + + + Close + Compare 模型對比對話框 + 关闭 + + + + + + + + + + + Style + + + + + + + + + + + + Print + Compare 模型對比對話框 + 打印 + + + + + + + + + + + Print to file + Compare 模型對比對話框 + 列印到文件 + + + + Unnamed Model %1 + + + + + Click to remove this model. + + + + + Print Document + Compare 模型對比對話框 + 列印到文檔 + + + + Select PDF output file + Compare 模型對比對話框 + 選擇PDF輸出文件 + + + + ConclusionPage + + + OK, I understand. + ConclusionPage 模型配置頁面最後確認按鈕中使用 + 好的, 我知道。 + + + + CopyProcess + + + Write error + CopyProcess + 寫入錯誤 + + + + Cannot write %1 (reason: %2) + CopyProcess + 無法寫入 %1 (原因: %2) + + + + Cannot open %1 (reason: %2) + CopyProcess + 無法打開 %1 (原因: %2) + + + + CreditsDialog + + + OpenTX Contributors + OpenTX 貢獻者 + + + + Honors go to Rafal Tomczak (RadioClone), Thomas Husterer (th9x) and Erez Raviv (er9x and eePe) + 榮譽給予 Rafal Tomczak (RadioClone), Thomas Husterer (th9x) 和 Erez Raviv (er9x and eePe) + + + + OpenTX Blacklist + OpenTX 黑名單 + + + + Main developers + + + + + Translators + + + + + Companies and projects who have donated to OpenTX + 曾經給予OpenTX捐贈的公司和項目 + + + + People who have donated to OpenTX + 曾經給予OpenTX捐贈的個人 + + + + Other contributors + 其他貢獻者 + + + + monthly + 每月 + + + + CurveData + + + CV + + + + + CurveGroup + + + Diff + 用於INPUT和MIXER曲線選擇項 + 差動曲線 [Diff] + + + + Expo + 用於INPUT和MIXER曲線選擇項 + 指數曲線 [Expo] + + + + Func + 用於INPUT和MIXER曲線選擇項 + 其他曲線 [Func] + + + + Curve + 用於INPUT和MIXER曲線選擇項 + 多點曲線 [Cstm] + + + + CurveReference + + + Diff(%1) + + + + + Expo(%1) + + + + + Function(%1) + + + + + Curve(%1) + + + + + Curves + + + + + + + + + + Curve name + 曲線名稱 [Name] + + + + + + + + + + + Fixed X + 均勻間距 [Standard] + + + + + + + + + + + Custom X + 自定間距 [Custom] + + + + + + + + + + + Lines + 折線 + + + + + + + + + + + Smooth + 平滑 [Smooth] + + + + + + + + + + + + + + + + + + + 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 %1 + 曲線 %1 + + + + Popup menu available + + + + + %1 points + %1 點 + + + + Linear + 直線 + + + + Single Expo + 非對稱指數曲線 + + + + Symmetrical f(x)=-f(-x) + 左右中心對稱 + + + + Symmetrical f(x)=f(-x) + 左右鏡像對稱 + + + + Editing curve %1 + 編輯曲線 %1 + + + + Not enough free points in EEPROM to store the curve. + EEPROM中沒有足夠的空餘曲線點存儲空間. + + + + Copy + 複製 + + + + Paste + 貼上 + + + + Clear + curve + 清除 + + + + Clear all curves + 清除所有曲線 + + + + Are you sure you want to reset curve %1? + 你確定想要重置曲線%1嗎? + + + + Are you sure you want to reset all curves? + 你確定想要重置全部曲線嗎? + + + + CustomFunctionData + + + GF + + + + + SF + + + + + Override %1 + 鎖定通道值 %1 [Override] + + + + Trainer + 教練功能 + + + + Trainer RUD + 教練開關 方向 [Trainer RUD] + + + + Trainer ELE + 教練開關 升降 [Trainer ELE] + + + + Trainer THR + 教練開關 油門 [Trainer THR] + + + + Trainer AIL + 教練開關 副翼 [Trainer AIL] + + + + Instant Trim + 操縱杆位變微調 [Instant Trim] + + + + Play Sound + 播放蜂鳴 [Play Sound] + + + + Haptic + 震動 [Haptic] + + + + Reset + 重設 + + + + Set Timer %1 + 設定計時器%1 [Set Timer] + + + + Vario + 開啟 Vario 聲音 [Vario] + + + + Play Track + 播放聲音文件 [Play Track] + + + + Play Both + 播放同時振動 [Play Both] + + + + Play Value + 播放數值 [Play Value] + + + + Play Script + 運行腳本 [Play Script] + + + + SD Logs + SD Log 記錄 [SD Logs] + + + + Volume + 音量 [Volume] + + + + Backlight + 背光 [Backlight] + + + + Screenshot + 截屏 [Screenshot] + + + + Background Music + 背景音樂播放 [Bg Music] + + + + Background Music Pause + 背景音樂暫停 [Bg Music Pause] + + + + Adjust %1 + + + + + SetFailsafe Int. Module + 啟動內置高頻頭失控保護 [SetFailsafe Int] + + + + SetFailsafe Ext. Module + 啟動外置高頻頭失控保護 [SetFailsafe Ext] + + + + RangeCheck Int. Module + 內置高頻頭拉距測試 + + + + RangeCheck Ext. Module + 外置高頻頭拉距測試 + + + + Bind Int. Module + 內置高頻頭對頻 + + + + Bind Ext. Module + 外置高頻頭對頻 + + + + Timer1 + 計時器1 [Timer1] + + + + Timer2 + 計時器2 [Timer2] + + + + Timer3 + 計時器3 [Timer3] + + + + Flight + 飛行 [Flight] + + + + Telemetry + + + + + Rotary Encoder + 旋轉編碼器 [Rotary Encoder] + + + + REa + + + + + REb + + + + + s + + + + + + + <font color=red><b>Inconsistent parameter</b></font> + <font color=red><b>不一致的參數</b></font> + + + + Value + + + + + played once, not during startup + 播放一次但開機時不播放 + + + + repeat(%1s) + 每%1秒重複 + + + + DISABLED + 禁用 + + + + CFN + + + + + CustomFunctionsPanel + + + Switch + CustomFunctionPanel + 啟動開關 + + + + Action + CustomFunctionPanel + 功能 + + + + Parameters + CustomFunctionPanel + 参数 + + + + Enable + CustomFunctionPanel + 是否啟用 + + + + Popup menu available + + + + + SF%1 + CustomFunctionPanel + SF%1 + + + + GF%1 + CustomFunctionPanel + GF%1 + + + + ON + CustomFunctionPanel + 啟用 + + + + Error occurred while trying to play sound, possibly the file is already opened. (Err: %1 [%2]) + + + + + Unable to find or open sound file: +%1 + + + + + Value + 设为 + + + + Source + + + + + GVAR + GVAR + + + + Increment + 增加 + + + + &Copy + CustomFunctionPanel + 複製 (&C) + + + + &Cut + CustomFunctionPanel + 剪下 (&C) + + + + &Paste + CustomFunctionPanel + 貼上 (&P) + + + + &Delete + CustomFunctionPanel + 删除 (&D) + + + + CustomizeSplashDialog + + + + + + + + + + Transmitter Splash Screen Editor + 遙控器開機畫面編輯器 + + + + + + + + + + + + + + + + + + + Invert + 底片效果 + + + + + + + + + + + + + + + + + + + Open Splash Library + 打開開機圖片庫 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... + + + + + + + + + + + + + + + + + + + + Load Profile + 載入遙控文檔 + + + + + + + + + + + + + + + + + + + Load FW + 載入韌體 + + + + + + + + + + + + + + + + + + + Load Pict + 載入圖片文件 + + + + + + + + + + + + + + + + + + + Save + 保存 + + + + Open Firmware File + 打開韌體文件 + + + + FW: %1 + 韌體: %1 + + + + Pict: %1 + 圖片: %1 + + + + Profile image + 檔案圖片 + + + + Can not load embedded image from firmware file %1. + 不能從韌體文件 %1 中載入內嵌圖片 . + + + + Open Image to load + 打開圖片文件以載入 + + + + Images (%1) + 圖片 (%1) + + + + Cannot load the image file %1. + 不能打開圖片文件 %1. + + + + Cannot load profile image %1. + 不能打開遙控器文檔中圖片 %1. + + + + Cannot load the library image %1. + 不能從開機圖片庫中載入圖片 %1. + + + + File Saved + 文件已保存 + + + + The image was saved to the file %1 + 圖片已經保存到 %1 + + + + Image Refresh Error + 圖片刷新錯誤 + + + + Failed to refresh image from file %1 + 無法從文件 %1 中刷新圖片 + + + + File Save Error + 文件保存錯誤 + + + + Failed to write image to %1 + 無法寫入文件 %1 + + + + CyclicPage + + + 90 + 90 + + + + 120 + 120 + + + + 120x + 120x + + + + 140 + 140 + + + + DataField + + + Conversion error on field %1 + + + + + Switch + + + + + Switch + 啟動開關 + + + + cannot be exported on this board! + 無法輸出到這個主板! + + + + Source + + + + + Source %1 cannot be exported on this board! + 源 %1 無法輸出到這個主板! + + + + OpenTX only accepts %1 points in all curves + OpenTX只允許最大%1點曲線 + + + + OpenTx only accepts %1 points in all curves + OpenTX只允許最大%1點曲線 + + + + + OpenTX on this board doesn't accept this function + OpenTX在這個主板上不支持此項功能 + + + + OpenTX doesn't accept this radio protocol + OpenTX 不接受此遙控器協議 + + + + DebugOutput + + + + + + + + + + + + Debug Output + Debug 輸出 + + + + + + + + + + + + + <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 + (&C)清除 + + + + + + + + + + + + + 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 + + + + + DownloadDialog + + + + + + + + + + Downloading: + 下載中: + + + + Unable to save the file %1: %2. + 無法保存文件 %1: +%2. + + + + Download failed: %1. + 下載失敗:%1. + + + + EEPROMInterface + + + Possible causes for this: + 可能導致這樣的原因: + + + + - Eeprom is from a newer version of OpenTX + - Eeprom 來自 OpenTX 的新版本 + + + + - Eeprom is not from OpenTX + - Eeprom 不是來自 OpenTX + + + + - Eeprom is not from Th9X + - Eeprom 不是來自 Th9x + + + + - Eeprom is not from Gruvin9X + - Eeprom 不是來自 Gruvin9x + + + + - Eeprom is not from ErSky9X + - Eeprom 不是來自 ErSky9X + + + + - Eeprom is not from Er9X + - Eeprom 不是來自 Er9x + + + + - Eeprom size is invalid + - Eeprom 文件大小錯誤 + + + + - Eeprom file system is invalid + - Eeprom 文件系统錯誤 + + + + - Eeprom is from a unknown board + - Eeprom 來自未知的主板 + + + + - Eeprom is from the wrong board + - Eeprom 來自錯誤的主板 + + + + - Eeprom backup not supported + - 不支持 Eeprom 備份 + + + + - 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 + - 你的遙控器可能使用了錯誤的韌體, + eeprom 大小為4096但僅前半部分的2048被使用 + + + + - Your eeprom is from an old version of OpenTX, upgrading! + To keep your original file as a backup, please choose File -> Save As specifying a different name. + + + + + EepeFormat + + + Unable to open %1: %2 + + + + + Invalid EEPROM file %1 + + + + + ElevonsPage + + + <br>First Elevon Channel: + <br>指定第1個升降副翼舵機通道: + + + + Second Elevon Channel: + <br>指定第2個升降副翼舵機通道: + + + + ExpoData + + + INP + + + + + (@%1) + + + + + ExpoDialog + + + + + + + + + + Flight modes + Inputs對話框 + 飛行模式 [Modes] + + + + + + + + + + + Input name + Inputs對話框 + 輸入名稱 [Input] + + + + + + + + + + + + + + + + + + + + + + + + + + + GV + Inputs對話框 + GV + + + + + + + + + + + Source for the mixer. + Inputs對話框 + 混控的輸入源. + + + + + + + + + + + Weight + Inputs對話框 + 比例 [Weight] + + + + + + + + + + + Switch + Inputs對話框 + 啟用開關 [Switch] + + + + + + + + + + + Switch used to enable the line. +If blank then the input is considered to be "ON" all the time. + Inputs對話框 + 啟用開關 +不選擇則默認一直啟用. + + + + + + + + + + + Stick Side + Inputs對話框 + 搖桿作用於 [Side] + + + + + + + + + + + NEG + Inputs對話框 + 負側 [NEG] + + + + + + + + + + + POS + Inputs對話框 + 正侧 [POS] + + + + + + + + + + + ALL + Inputs對話框 + 兩側 [ALL] + + + + + + + + + + + Scale + Inputs對話框 + 縮放 [Scale] + + + + + + + + + + + Include Trim + Inputs對話框 + 微調 [Trim] + + + + + + + + + + + No + Inputs對話框 + 不使用 [OFF] + + + + + + + + + + + Yes + Inputs對話框 + 使用 [On] + + + + + + + + + + + Curve + Inputs對話框 + 曲線 [Curve] + + + + + + + + + + + Curve applied to the source. + Inputs對話框 + 作用於輸入源的曲線. + + + + + + + + + + + Source + Inputs對話框 + 輸入來源 [Source] + + + + + + + + + + + Line name + Inputs對話框 + 此條名稱 [Line] + + + + + + + + + + + Offset + Inputs對話框 + 偏移 [Offset] + + + + + + + + + + + The source for the mixer + Inputs對話框 + 混控的輸入源 + + + + Edit %1 + Inputs對話框 + 編輯 %1 + + + + Popup menu available + + + + + 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: + 油門通道 [Throttle]: + + + + Yaw Channel: + 偏航通道 [Yaw]: + + + + Pitch Channel: + 仰俯通道 [Pitch]: + + + + Roll Channel: + 滾轉通道 [Roll]: + + + + 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 + 開始通道 [CH] + + + + 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 + + + Channel values displayed in us + 通道值顯示為微秒 + + + + No OverrideCH functions available + 不允許鎖定通道值功能 + + + + Possibility to enable FAI MODE (no telemetry) at field + 可選擇啟用 FAI 模式 (沒有回傳) + + + + FAI MODE (no telemetry) always enabled + 一直啟用 FAI 模式 (沒有回傳) + + + + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 + 移除 D8 FrSky 協議支持,因為在20151月1日後在歐洲銷售的遙控器中使用此協議是不合法的 + + + + + Disable HELI menu and cyclic mix support + 禁用直升機菜單和CCPM混控菜單 + + + + + Disable Global variables + 禁用GV[Global variables]功能 + + + + + Enable Lua custom scripts screen + + + + + Use alternative SQT5 font + 使用 另一個 SQT5 font + + + + Pots use in menus navigation + 使用旋鈕進行菜單導航 + + + + FrSky Taranis X9D+ + FrSky Taranis X9D+ + + + + Support for PPM internal module hack + 支持 hack PPM內置高頻頭 + + + + Enable non certified firmwares + + + + + Disable RAS (SWR) + + + + + FrSky Taranis X9D+ 2019 + + + + + FrSky Taranis X9D + FrSky Taranis X9D + + + + Haptic module installed + 振動模塊已經安裝 + + + + FrSky Taranis X9E + FrSky Taranis X9E + + + + Confirmation before radio shutdown + 遙控器關機前確認 + + + + Horus gimbals installed (Hall sensors) + Horus 搖桿已安裝 (霍爾傳感器) + + + + FrSky Taranis X9-Lite + + + + + + Support for auto update on boot + + + + + FrSky Taranis X7 / X7S + + + + + FrSky Taranis X-Lite S/PRO + + + + + FrSky Taranis X-Lite + + + + + FrSky Horus X10 / X10S + + + + + FrSky Horus X12S + + + + + Use ONLY with first DEV pcb version + 只用與 DEV pcb 版本 + + + + Turnigy 9XR-PRO + Turnigy 9XR-PRO + + + + Enable HELI menu and cyclic mix support + 允許直升機菜單和斜盤混控支持 + + + + Global variables + GV [Global variables] + + + + 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 + 不使用粗體高亮活動項目 + + + + + Support for ACCESS internal module replacement + + + + + FrSky Horus X10 Express + + + + + Jumper T12 + + + + + Enable non certified R9M firmwares + + + + + Turnigy 9XR with m128 chip + Turnigy 9XR (m128芯片) + + + + Turnigy 9XR + Turnigy 9XR + + + + 9X with stock board + 9X (原装主板) + + + + Enable resetting values by pressing up and down at the same time + 允許通過同時按上下鍵重設數值 + + + + 9X with stock board and m128 chip + 9X (原裝主板和m128芯片) + + + + 9X with AR9X board + 9X (AR9X主板) + + + + 9X with Sky9x board + 9X (Sky9x主板) + + + + 9X with Gruvin9x board + 9X (Gruvin9x主板) + + + + DIY MEGA2560 radio + DIY的 MEGA2560 遥控器 + + + + FirmwarePreferencesDialog + + + + + + + + + + Downloads + FirmwarePref + 下載 + + + + + + + + + + + Check for updates + FirmwarePref + 檢查更新 + + + + + + + + + + + Firmware + FirmwarePref + 韌體類型 + + + + + + + + + + + Download firmware + + + + + + + + + + + + Download SD contents + + + + + + + + + + + + Latest Download + FirmwarePref + 最後下載的韌體版本 + + + + Unknown + 未知[Unknown] + + + + FlapsPage + + + No + FlapsPage + 没有襟翼 + + + + 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... + 加載... + + + + + + + + + + + Current Profile + 當前文檔 + + + + + + + + + + + Allows Companion to write to older version of the firmware + 允許 Companion 寫入舊版本的韌體 + + + + + + + + + + + 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 + 寫入前備份 + + + + + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> + <html><head/><body><p>用當前檔案的設置修改校準參數</p></body></html> + + + + + + + + + + + Patch calibration setting from profile + 依照當前檔案修改校準參數 + + + + + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> + <html><head/><body><p>用當前檔案的設置修改硬件參數</p></body></html> + + + + + + + + + + + Patch HW settings from profile + 依照當前檔案修改硬件參數 + + + + + + + + + + + Cancel + 取消 + + + + + + + + + + + Write to TX + 寫入到遙控器 + + + + Current profile: %1 + 當前檔案: %1 + + + + Choose Radio Backup file + 選擇遙控器備份文件 + + + + Wrong radio calibration data in profile, Settings not patched + 此文檔包含錯誤的遙控器校準數據.設置沒有修改 + + + + Wrong radio setting data in profile, Settings not patched + 此文檔包含錯誤的遙控器設置數據.設置沒有修改 + + + + Cannot write file %1: +%2. + 無法寫入文件 %1: +%2. + + + + Error writing file %1: +%2. + 寫入文件錯誤 %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? + 無法檢查模型和設置兼容性! 仍然繼續麼? + + + + FlashFirmwareDialog + + + + + + + + + + Flash Firmware + 燒錄韌體 + + + + + + + + + + + Load... + 加載... + + + + + + + + + + + Date & Time + 日期 & 時間 + + + + + + + + + + + Variant + 變體 + + + + + + + + + + + Version + 版本 + + + + + + + + + + + Use profile start screen + 使用文檔中的開始畫面 + + + + + + + + + + + Use firmware start screen + 使用韌體中的開始畫面 + + + + + + + + + + + Use library start screen + 使用圖片庫中的開始畫面 + + + + + + + + + + + Use another start screen + 使用其他開始畫面 + + + + + + + + + + + Allows Companion to write to older version of the firmware + 允許 Companion 寫入舊版本的韌體 + + + + + + + + + + + Check Hardware compatibility + 檢查硬件兼容性 + + + + + + + + + + + Backup and restore Models and Settings + 備份和恢復模型和設置 + + + + + + + + + + + Cancel + 取消 + + + + + + + + + + + Write to TX + 寫入到遙控器 + + + + Open Firmware File + 打開韌體文件 + + + + %1 may not be a valid firmware file + %1 可能是非法的韌體文件 + + + + The firmware file is not valid. + 韌體文件非法. + + + + There is no start screen image in the firmware file. + 韌體中沒有開機畫面. + + + + Profile image %1 is invalid. + 檔案圖片 %1 无效. + + + + Open image file to use as radio start screen + 打開圖片文件用作遙控器開機畫面 + + + + Images (%1) + 圖片 (%1) + + + + Image could not be loaded from %1 + 圖片無法從 %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 + 無法將模型和設置恢復到遙控器. 模型和設置數據可以在 %1 中找到 + + + + Flashing done + 燒錄完成 + + + + FlashProcess + + + Executable %1 not found + FlashProcess + 未找到可執行文件 %1 + + + + Writing... + FlashProcess + 寫入中... + + + + Reading... + FlashProcess + 讀取中... + + + + Verifying... + FlashProcess + 驗證中... + + + + unknown + FlashProcess + 未知 + + + + ie: OpenTX for 9X board or OpenTX for 9XR board + 例如: OpenTX for 9X 主板 或 OpenTX for 9XR 主板 + + + + ie: OpenTX for M128 / 9X board or OpenTX for 9XR board with M128 chip + 例如: OpenTX for M128 / 9X 主板 或 帶有M128芯片的OpenTX for 9XR 主板 + + + + ie: OpenTX for Gruvin9X board + 例如: OpenTX for Gruvin9X 主板 + + + + Your radio uses a %1 CPU!!! + +Please check advanced burn options to set the correct cpu type. + 你的遙控器使用 %1 CPU!!! + +請檢查高級燒錄選項設置正確的cpu型號. + + + + Your radio uses a %1 CPU!!! + +Please select an appropriate firmware type to program it. + 你的遥控器使用 %1 CPU!!! + +請選擇合適的用來編程它的固件類型. + + + + +You are currently using: + %1 + +你當前正在使用: + %1 + + + + Your radio does not seem connected to USB or the driver is not initialized!!!. + 你的遙控器似乎沒有連接到到USB端口,或沒有安裝驅動程序!!!. + + + + Flashing done (exit code = %1) + 燒錄完成 (退出碼 = %1) + + + + Flashing done with errors + 燒錄完成但包含錯誤 + + + + FUSES: Low=%1 High=%2 Ext=%3 + 熔絲位: Low=%1 High=%2 Ext=%3 + + + + FlightMode + + + + + + + + + + Fade In + FlightMode + 切入秒數 [Fade In] + + + + + + + + + + + Fade Out + FlightMode + 切出秒數 [Fade In] + + + + + + + + + + + Name + FlightMode + 名稱 [Name] + + + + + + + + + + + Switch + FlightMode + 啟用開關 [Switch] + + + + FlightModeData + + + FM + + + + + FlightModePanel + + + Rotary Encoder %1 + + + + + Name + + + + + Value source + + + + + Value + 设为 + + + + GVAR%1 + 全局變量[GV] %1 + + + + Popup enabled + 屏幕彈窗提示 + + + + Popup menu available + + + + + Trim disabled + 不使用微調 + + + + Own Trim + 使用單獨的微調值 + + + + Use Trim from Flight mode %1 + 使用 FM%1 的微調值 + + + + Use Trim from Flight mode %1 + Own Trim as an offset + 使用 FM%1 的微調值 + 單獨的微調偏移值 + + + + Unit + + + + + Prec + + + + + Min + + + + + Max + + + + + 0._ + + + + + 0.0 + 0.0 + + + + + &Clear + (&C)清除 + + + + + Clear + 清除 + + + + Clear all current Flight Mode properties? + 是否清除所有的飛行模式屬性? + + + + FlightModesPanel + + + Flight Mode %1 + 用於FM設定 + 飛行模式[FM] %1 + + + + (%1) + FlightModePanel + (%1) + + + + (default) + FlightModePanel + (默認) + + + + FlybarSelectionPage + + + Has Flybar + 有副翼 + + + + Flybarless + 無副翼 + + + + Flybar: + 副翼: + + + + FrSkyAlarmData + + + Yellow + + + + + Orange + + + + + Red + + + + + FrSkyChannelData + + + + V + + + + + --- + 正向 [→] + + + + FusesDialog + + + + + + + + + + Fuses + 熔絲位 + + + + + + + + + + + <!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:'Sans Serif'; font-size:9pt; 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-family:'MS Shell Dlg 2'; font-size:8pt;">Reads the current fuses in the AVR controller.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">Proper states for </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">AtMega 64 </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">:</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-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse not set: 0E, 81, FF</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-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse set: 0E, 89, FF</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">Proper states for AtMega 2560 :</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-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse not set: D7, 11, FC</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-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse set: D7, 19, FC</span></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:'Sans Serif'; font-size:9pt; 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-family:'MS Shell Dlg 2'; font-size:8pt;">读取当前AVR控制器中的熔丝位.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">Proper states for </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">AtMega 64 </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">:</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-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM 删除熔丝位 [erase fuse] 未设定 [not set]: 0E, 81, FF</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-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM 删除熔丝位 [erase fuse] 已设定 [set]: 0E, 89, FF</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">Proper states for AtMega 2560 :</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-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM 删除熔丝位 [erase fuse] 未设定 [not set]: D7, 11, FC</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-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM 删除熔丝位 [erase fuse] 已设定 [set]: D7, 19, FC</span></p></body></html> + + + + + + + + + + + Read Fuses + 讀取熔絲位 + + + + + + + + + + + <!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:'Sans Serif'; font-size:9pt; 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-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">Reset Fuses</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-family:'MS Shell Dlg 2'; font-size:8pt;">Fuses in the AVR tell it how to behave. Pressing this button sets the fuses to the default parameters needed in the FW. These parameters are different for stock and 4.1 MB, please verify you selected the appropriate processor type in preferences.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">This button also sets the &quot;EEPROM protect&quot; Fuse.</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-family:'MS Shell Dlg 2'; font-size:8pt;">This prevents erasing of the EEPROM when the flash memory is written.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">WARNING</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-family:'MS Shell Dlg 2'; font-size:8pt;">Setting fuses can lead to problems and even a total lockout from your controller. Do this only if you know what you are doing.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">When in doubt consult either the project's page or the 9xforum (http://9xforums.com/forum/)</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-family:'MS Shell Dlg 2'; font-size:8pt;">If you do get locked out - google lookup for &quot;dealing with Fuse Bricks&quot;.</span></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:'Sans Serif'; font-size:9pt; 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-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">重设熔丝位</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-family:'MS Shell Dlg 2'; font-size:8pt;">熔丝指示AVR如何运行. 按此按钮将熔丝设置成固件需要的默认参数. 这些参数和 stock 与 4.1 MB中的不一样, 请检查你在偏好选项中选择了合适的处理器类型.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">这个按钮设置 &quot;EEPROM protect&quot; 熔丝.</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-family:'MS Shell Dlg 2'; font-size:8pt;">当 Flash 存储器被写入时这会保护 EEPROM 不被删除.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">警告</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-family:'MS Shell Dlg 2'; font-size:8pt;">设置熔丝位可导致问题发生,严重的甚至导致你的遥控器无法开机. 只有当你知道自己在做什么时才可以操作.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">如果有疑问请咨询合适的项目主页或 9xforum (http://9xforums.com/forum/)</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-family:'MS Shell Dlg 2'; font-size:8pt;">如果你的遥控器无法开机 - 在google 中搜索 &quot;dealing with Fuse Bricks&quot;.</span></p></body></html> + + + + + + + + + + + Reset Fuses +EEPROM - PROTECT + 重設熔絲位 +EEPROM - PROTECT + + + + + + + + + + + <!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:'Sans Serif'; font-size:9pt; 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-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">Reset Fuses</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-family:'MS Shell Dlg 2'; font-size:8pt;">Fuses in the AVR tell it how to behave. Pressing this button sets the fuses to the default parameters needed in the </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">FW. These parameters are different for stock and 4.1 MB, please verify you selected the appropriate processor type in preferences.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">This button also clears the &quot;EEPROM protect&quot; Fuse.</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-family:'MS Shell Dlg 2'; font-size:8pt;">This causes erasing of the EEPROM when the flash memory is written.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">WARNING</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-family:'MS Shell Dlg 2'; font-size:8pt;">Setting fuses can lead to problems and even a total lockout from your controller. Do this only if you know what you are doing.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">When in doubt consult either the project's page or the 9xforum (http://9xforums.com/forum/)</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-family:'MS Shell Dlg 2'; font-size:8pt;">If you do get locked out - google lookup for &quot;dealing with Fuse Bricks&quot;.</span></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:'Sans Serif'; font-size:9pt; 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-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">重设熔丝位</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-family:'MS Shell Dlg 2'; font-size:8pt;">熔丝指示AVR如何运行. 按此按钮将熔丝设置成固件需要的默认参数. 这些参数和 stock 与 4.1 MB中的不一样, 请检查你在偏好选项中选择了合适的处理器类型.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">这个按钮清除 &quot;EEPROM protect&quot; 熔丝.</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-family:'MS Shell Dlg 2'; font-size:8pt;">当 Flash 存储器被写入时 EEPROM 将会被删除.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">警告</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-family:'MS Shell Dlg 2'; font-size:8pt;">设置熔丝位可导致问题发生,严重的甚至导致你的遥控器无法开机. 只有当你知道自己在做什么时才可以操作.</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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:8pt;">如果有疑问请咨询合适的项目主页或 9xforum (http://9xforums.com/forum/)</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-family:'MS Shell Dlg 2'; font-size:8pt;">如果你的遥控器无法开机 - 在google 中搜索 &quot;dealing with Fuse Bricks&quot;.</span></p></body></html> + + + + + + + + + + + Reset Fuses +EEPROM - DELETE + 重設熔絲位 +EEPROM - DELETE + + + + + + + + + + + <!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:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p align="center" 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;">WARNING</span></p> +<p align="center" 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 align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changing the fuses can mess up your radio.</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Proceed only if you know what you are doing.</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:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p align="center" 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 align="center" 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 align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">改变熔丝位可能使你的遥控器变砖.</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">只有当你知道自己在做什么时才进行操作.</p></body></html> + + + + + Reset Radio Fuses + 重設遙控器熔絲位 + + + + Read Fuses from Radio + 從遙控器中讀取熔絲位 + + + + GVarData + + + % + + + + + ? + + + + + 0._ + + + + + 0.0 + 0.0 + + + + ?.? + + + + + GV + GV + + + + Own value + 使用單獨的取值 + + + + Flight mode %1 value + 使用FM%1值 + + + + GeneralEdit + + + + + + + + + + Radio settings + + + + + + + + + + + + Retrieve calib. and hw settings from profile + 從遙控器檔案中讀取校準和硬件設定 + + + + + + + + + + + Store calib. and hw settings in selected profile + 存儲校準和硬件設定到選擇的遙控器檔案 + + + + + + + + + + + General settings used throught the transmitter. +These will be relevant for all models in the same EEPROM. + 遙控器一般設定, 用在整個遙控器上 +對相同的EEPROM, 對所有模型這些設置都是相同的. + + + + Setup + General Edit???? + 設定 + + + + Global Functions + General Edit + 全局功能 + + + + Trainer + General Edit + 教練功能 + + + + Hardware + General Edit???? + 硬件 + + + + Calibration + General Edit + 校準 + + + + 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? + 你想要存儲校準數據到 %1 檔案<br>覆蓋當前已經存在的校準數據麼? + + + + Calibration and HW parameters saved. + 校準數據和硬件參數已經存儲. + + + + GeneralSettings + + + Radio Settings + + + + + GeneralSetup + + + + + + + + + + Form + GeneralSetup???? + 表單 + + + + + + + + + + + Readonly Unlock + 只讀解鎖 [Readonly Unlock] + + + + + + + + + + + SC + + + + + + + + + + + + SE + + + + + + + + + + + + SA + + + + + + + + + + + + SF + + + + + + + + + + + + SH + + + + + + + + + + + + SD + + + + + + + + + + + + SB + + + + + + + + + + + + SG + + + + + + + + + + + + Timeshift from UTC + 依照UTC調整時間 [From UTC] + + + + + + + + + + + Voice Language + 語音語言 [Voice Language] + + + + + + + + + + + Country Code + 國家代碼 [Country Code] + + + + + + + + + + + Stick reverse + 反向搖桿 [Stick Reverse] + + + + + + + + + + + FAI Mode + FAI 模式 [FAI Mode] + + + + + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. + 如果安裝有GPS回傳則自動調整遙控器時鐘. + + + + + + + + + + + Adjust RTC + 自動調整時鐘 + + + + + + + + + + + Vario pitch at max + 最大上升率時Vario音調 [Max] + + + + + + + + + + + + + + + + + + + Hz + + + + + + + + + + + + Speaker Volume + 喇叭音量 [Volume] + + + + + + + + + + + Backlight Switch + 背光開關 [Switch] + + + + + + + + + + + Sound Mode + 聲音模式 [Sound Mode] + + + + + + + + + + + Color 1 + 顏色 1 + + + + + + + + + + + Color 2 + 顏色 2 + + + + + + + + + + + Speaker Pitch (spkr only) + 喇叭音調 (僅喇叭) [Pitch] + + + + + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. + 如果值非0, 任何按鍵將會開啟背光, 並在所設定秒數後關閉. + + + + + + + + + + + + + + + + + + + + + sec + + + + + + + + + + + + Backlight color + 背光顏色 [Color] + + + + + + + + + + + Beeper + 蜂鳴器 + + + + + + + + + + + Speaker + 喇叭 + + + + + + + + + + + BeeperVoice + 蜂鳴器和語音 + + + + + + + + + + + SpeakerVoice + 喇叭和語音 + + + + + + + + + + + Beep volume + 蜂鳴器音量 + + + + + + + + + + + Wav volume + WAV播放音量 + + + + + + + + + + + Vario volume + Vario音量 + + + + + + + + + + + Background volume + 背景音樂音量 + + + + + + + + + + + + + + + + + + + ms + 毫秒 + + + + + + + + + + + Backlight Auto OFF after + 背光自動關閉時間 [Duration] + + + + + + + + + + + Backlight flash on alarm + 警告時背光閃爍 [Alarm] + + + + + + + + + + + Vario pitch at zero + 升降率為0時Vario音調 [Zero] + + + + + + + + + + + Vario repeat at zero + 升降率0時Vario重複率 [Repeat] + + + + + + + + + + + This is the switch selectrion for turning on the backlight (if installed). + + + !!!! 英文selection + 這個開關用來開啟背光 (如果遙控器有背光). + + + + + + + + + + + + + + + + + + + + + <!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> + <!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 显示屏对比度</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;">取值范围 20-45</span></p></body></html> + + + + + + + + + + + Backlight Brightness + 背光亮度 [Brightness] + + + + + + + + + + + RotEnc Navigation + 旋轉編碼器導航 [RotEnc] + + + + + + + + + + + America + 美國 + + + + + + + + + + + Japan + 日本 + + + + + + + + + + + Europe + 歐洲 + + + + + + + + + + + Backlight OFF Brightness + + + + + + + + + + + + Mode selection: + +Mode 1: + Left stick: Elevator, Rudder + Right stick: Throttle, Aileron + +Mode 2: + Left stick: Throttle, Rudder + Right stick: Elevator, Aileron + +Mode 3: + Left stick: Elevator, Aileron + Right stick: Throttle, Rudder + +Mode 4: + Left stick: Throttle, Aileron + Right stick: Elevator, Rudder + + + 遙控器模式[MODE]選擇: + +MODE1 日本手: + 左手: 升降方向 + 右手: 油門副翼 + +MODE2 美國手: + 左手: 油門方向 + 右手: 升降副翼 + +MODE3 中國手: + 左手: 升降副翼 + 右手: 油門方向 + +MODE4 模式4: + 左手: 油門副翼 + 右手: 升降方向 + + + + + + + + + + + + + Mode 1 (RUD ELE THR AIL) + MODE1 日本手↕升降↔方向 ↕油門↔副翼 + + + + + + + + + + + Mode 2 (RUD THR ELE AIL) + MODE2 美國手↕油門↔方向 ↕升降↔副翼 + + + + + + + + + + + Mode 3 (AIL ELE THR RUD) + MODE3 中國手↕升降↔副翼 ↕油門↔方向 + + + + + + + + + + + Mode 4 (AIL THR ELE RUD) + MODE4 模式4 ↕油門↔副翼 ↕升降↔方向 + + + + + + + + + + + <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> + + + + + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + + + + + + + + + + + + RSSI Poweroff Warning + + + + + + + + + + + + Low EEPROM Warning + + + + + + + + + Owner Registration ID + + + + + + + + + aaaaaaAA + + + + + + + + + + + + R E T A + 方向 升降 油門 副翼 [R E T A] + + + + + + + + + + + R E A T + 方向 升降 副翼 油門 [R E A T] + + + + + + + + + + + R T E A + 方向 油門 升降 副翼 [R T E A] + + + + + + + + + + + R T A E + 方向 油門 副翼 升降 [R T A E] + + + + + + + + + + + R A E T + 方向 副翼 升降 油門 [R A E T] + + + + + + + + + + + R A T E + 方向 副翼 油門 升降 [R A T E] + + + + + + + + + + + E R T A + 升降 方向 油門 副翼 [E R T A] + + + + + + + + + + + E R A T + 升降 方向 副翼 油門 [E R A T] + + + + + + + + + + + E T R A + 升降 油門 方向 副翼 [E T R A] + + + + + + + + + + + E T A R + 升降 油門 副翼 方向 [E T A R] + + + + + + + + + + + E A R T + 升降 副翼 方向 油門 [E A R T] + + + + + + + + + + + E A T R + 升降 副翼 油門 方向 [E A T R] + + + + + + + + + + + T R E A + 油門 方向 升降 副翼 [T R E A] + + + + + + + + + + + T R A E + 油門 方向 副翼 升降 [T R A E] + + + + + + + + + + + T E R A + 油門 升降 方向 副翼 [T E R A] + + + + + + + + + + + T E A R + 油門 升降 副翼 方向 [T E A R] + + + + + + + + + + + T A R E + 油門 副翼 方向 升降 [T A R E] + + + + + + + + + + + T A E R + 油門 副翼 升降 方向 [T A E R] + + + + + + + + + + + A R E T + 副翼 方向 升降 油門 [A R E T] + + + + + + + + + + + A R T E + 副翼 方向 油門 升降 [A R T E] + + + + + + + + + + + A E R T + 副翼 升降 方向 油門 [A E R T] + + + + + + + + + + + A E T R + 副翼 升降 油門 方向 [A E T R] + + + + + + + + + + + A T R E + 副翼 油門 方向 升降 [A T R E] + + + + + + + + + + + A T E R + 副翼 油門 升降 方向 [A T E R] + + + + + + + + Power On Delay + + + + + + + + + + + + Jack Mode + + + + + + + + + + + + Audio + + + + + + + + + + + + Trainer + 教練功能 + + + + + + + + + + + DMS + + + + + + + + + + + + USB Mode + + + + + + + + + Power Off Delay + + + + + + + + + + + + + + + + + + + + Ask on Connect + + + + + + + + + + + + Joystick (HID) + + + + + + + + + + + + USB Mass Storage + + + + + + + + + + + + USB Serial (CDC) + + + + + + + + + + + + Stick Mode + 摇杆模式 [MODE] + + + + + + + + + + + Metric + 公制 [Metric] + + + + + + + + + + + Imperial + 英制 [Imperial] + + + + + + + + + + + Default Channel Order + 默認通道順序[Default Ch Order] + + + + + + + + + + + GPS Coordinates + GPS坐標格式 [GPS Coordinates] + + + + + + + + + + + Min + GeneralEdit + 最小 + + + + + + + + + + + + + + + + + + + v + GeneralEdit + v + + + + + + + + + + + Max + GeneralEdit + 最大 + + + + + + + + + + + Inactivity Timer + 忘記關機定時器 [Inactivity] + + + + + + + + + + + Show Splash Screen on Startup + 顯示開機畫面 [Splash Screen] + + + + + + + + + + + Contrast + 顯示屏對比度 [Contrast] + + + + + + + + + + + Battery Meter Range + 遙控器電池圖標範圍 [Range] + + + + + + + + + + + Haptic Strength + 振動強度 [Haptic Strength] + + + + + + + + + + + LCD Display Type + LCD顯示屏類型 [LCD Disp Type] + + + + + + + + + + + "No Sound" Warning + 當靜音時 開機警告 [Sound Off] + + + + + + + + + + + Battery Warning + 遙控器電量警告 [Battery Low] + + + + + + + + + + + Haptic Length + 振動時長 [Haptic Length] + + + + + + + + + + + MAVLink Baud Rate + MAVLink 波特率 [Baud Rate] + + + + + + + + + + + + + + + + + + + Quiet + GeneralEdit + 禁用 [Quiet] + + + + + + + + + + + Only Alarms + GeneralEdit + 只有警告 [Alarm] + + + + + + + + + + + + + + + + + + + No Keys + GeneralEdit + 忽略按鍵 [NoKey] + + + + + + + + + + + + + + + + + + + All + GeneralEdit + 開啟 [All] + + + + + + + + + + + Battery warning voltage. +This is the threashhold where the battery warning sounds. + +Acceptable values are 5v..10v + 遙控器電池警告電壓 +當電壓低於此數值時電量警告響起 + +允許值是5V - 10V + + + + + + + + + + + Standard + 標準LCD [Standard] + + + + + + + + + + + Optrex + GeneralEdit + 光王LCD [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 + + + + + + + + + + + + --- + GeneralEdit + + + + + + + + + + + + 2s + GeneralEdit + + + + + + + + + + + + 3s + GeneralEdit + + + + + + + + + + + + 4s + GeneralEdit + + + + + + + + + + + + 6s + GeneralEdit + + + + + + + + + + + + 8s + + + + + + + + + + + + 10s + + + + + + + + + + + + 15s + + + + + + + + + + + + 4800 Baud + GeneralEdit + + + + + + + + + + + + 9600 Baud + + + + + + + + + + + + 14400 Baud + + + + + + + + + + + + 19200 Baud + + + + + + + + + + + + 38400 Baud + + + + + + + + + + + + 57600 Baud + + + + + + + + + + + + 76800 Baud + + + + + + + + + + + + 115200 Baud + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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=" text-decoration: underline;">Warnings</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;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> + + + + + + + + + + + + + + + + + + + + X-Short + GeneralEdit + 極短 + + + + + + + + + + + + + + + + + + + Short + GeneralEdit + 較短 + + + + + + + + + + + + + + + + + + + Normal + 正常 + + + + + + + + + + + + + + + + + + + Long + GeneralEdit + 較長 + + + + + + + + + + + + + + + + + + + X-Long + 極長 + + + + + + + + + + + NMEA + GeneralEdit + + + + + + + + + + + + Play Delay (switch mid position) + 開關撥過中檔時播音延遲 [Delay] + + + + + + + + + + + Measurement Units + 單位制 [Units] + + + + + + + + + + + Haptic Mode + GeneralEdit + 振動 [Haptic Mode] + + + + + + + + + + + Beeper Length + 蜂鳴時長 [Beep Length] + + + + + + + + + + + Beeper Mode + 蜂鳴音 [Beep Mode] + + + + + + + + + + + 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. + + + + + + + + + + + + Alarms Only + GeneralEdit + 只有警告 [Alarm] + + + + Power On Speed + + + + + Power Off Speed + + + + + GeneralSetupPanel + + + OFF + + + + + Keys + 按鍵 [Keys] + + + + Sticks + 摇杆 [Sticks] + + + + Keys + Sticks + 按鍵和搖桿 [Keys + Sticks] + + + + ON + 啟用 + + + + English + 英語 + + + + Dutch + 荷蘭語 + + + + French + 法語 + + + + Italian + 意大利語 + + + + German + 德語 + + + + Czech + 捷克語 + + + + Slovak + 慢動作 [Slow] + + + + Spanish + 西班牙語 + + + + Polish + 波蘭語 + + + + Portuguese + 葡萄牙語 + + + + Russian + + + + + Swedish + 瑞典語 + + + + Hungarian + 匈牙利語 + + + + No + + + + + RotEnc A + 旋轉編碼器A + + + + Rot Enc B + 旋轉編碼器B + + + + Rot Enc C + 旋轉編碼器C + + + + Rot Enc D + 旋轉編碼器D + + + + Rot Enc E + 旋轉編碼器E + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. +This function cannot be disabled by the radio. +Are you sure ? + + + + + GyroPage + + + No + Gyropage + 無陀螺儀 + + + + Yes, controled by a switch + 有陀螺儀, 通過開關控制感度 + + + + Yes, controlled by a pot + 有陀螺儀, 通過旋鈕控制感度 + + + + Hardware + + + + + + + + + + Form + Hardware + 表單 + + + + + + + + + + + SQ + + + + + + + + + + + + SR + + + + + + + + + + + + LS2 + LS2 滑桿 + + + + + + + + + + + SP + + + + + + + + + + + + SO + + + + + + + + + + + + S4 + S4 旋鈕 + + + + + + + + + + + RS + RS 滑桿 + + + + + + + + + + + SB + + + + + + + + + + + + PPM 2 + 教練口訊號2 [PPM 2] + + + + + + + + + + + OFF + 關閉 [OFF] + + + + + + + + + + + S-Port Mirror + S-Port 鏡像 [S-Port Mirror] + + + + + + + + + + + Telemetry + 回傳 [Telemetry] + + + + + + + + + + + SBUS Trainer + SBUS 教練功能 [SBUS Trainer] + + + + + + + + + + + Debug + 除錯 [Debug] + + + + + + + + + + + Rud + Rud 搖桿 + + + + + + + + + + + PPM 3 + 教練口訊號3 [PPM 3] + + + + + + + + + + + S1 + S1 旋鈕 + + + + + + + + + + + S2 + S2 旋鈕 + + + + + + + + + + + S3 + S3 旋鈕 + + + + + + + + + + + PPM 1 + 教練口訊號1 [PPM 1] + + + + + + + + + + + Serial Port + 串口 [Serial Port] + + + + + + + + + + + v + + + + + + + + + + + + PPM Multiplier + 教練口訊號係數 [PPM Multiplier] + + + + + + + + + + + Current Offset + 當前修正 [Offset] + + + + + + + + + + + PPM 4 + 教練口訊號4 [PPM 4] + + + + + + + + + + + SA + + + + + + + + + + + + Ele + Ele 搖桿 + + + + + + + Antenna + + + + + + + + + + S5 + S5 旋鈕 + + + + + + + + + + + Ail + Ail 搖桿 + + + + + + + + + + + Thr + Thr 搖桿 + + + + + + + + + + + SC + + + + + + + + + + + + LS + LS 滑桿 + + + + + + + + + + + SD + + + + + + + + + + + + Battery Offset + 控電電壓修正 [Battery Offset] + + + + + + + + + + + SE + + + + + + + + + + + + SF + + + + + + + + + + + + SG + + + + + + + + + + + + SH + + + + + + + + + + + + SI + + + + + + + + + + + + SJ + + + + + + + + + + + + SK + + + + + + + + + + + + SL + + + + + + + + + + + + SM + + + + + + + + + + + + SN + + + + + + + + + + + + RS2 + RS2 滑桿 + + + + + + + + + + + Bluetooth + 藍牙 [Bluetooth] + + + + + + + + + + + ADC Filter + + + + + + + + + + + + Device Name: + + + + + HardwarePanel + + + + + None + + + + + 2 Positions Toggle + 2段彈簧開關 + + + + 2 Positions + 2段開關 + + + + 3 Positions + 3段開關 + + + + Pot with detent + 有中位旋鈕 + + + + Multipos switch + 多段開關 + + + + Pot without detent + 無中位旋鈕 + + + + Slider with detent + 有中位滑桿 + + + + OFF + + + + + Enabled + + + + + Telemetry + + + + + Trainer + 教練功能 + + + + Internal + + + + + Ask + + + + + Per model + + + + + Internal + External + + + + + External + + + + + Heli + + + + + + + + + + Off + 禁用 + + + + + + + + + + + 120 + + + + + + + + + + + + 120X + + + + + + + + + + + + 140 + + + + + + + + + + + + 90 + + + + + + + + + + + + Invert Elevator + 升降反向 [Ele] + + + + + + + + + + + Invert Aileron + 副翼反向 [Ail] + + + + + + + + + + + Invert Collective + 總距反向 {Col] + + + + + + + + + + + Long. cyc + 縱向循環螺距 [Long] + + + + + + + + + + + Invert + 反向 [Invert] + + + + + + + + + + + Swash Ring + 斜盤限位 [Swach RIng] + + + + + + + + + + + Swash Type + 斜盤類型 [Swach Type] + + + + + + + + + + + Lateral cyc + 橫向循環螺距 [Lateral] + + + + + + + + + + + Collective + 總距 [Collective] + + + + HeliPage + + + Throttle Channel: + 油門通道 [Throttle]: + + + + Yaw Channel: + 偏航通道 [Yaw]: + + + + Pitch Channel: + 仰俯通道 [Pitch]: + + + + Roll Channel: + 滾轉通道 [Roll]: + + + + HexEepromFormat + + + Invalid EEPROM File %1 + 無效的 EEPROM 文件 %1 + + + + Cannot open file %1: +%2. + + + + + Error writing file %1: +%2. + 寫入文件錯誤 %1: +%2. + + + + InputsPanel + + + + Move Up + 上移 + + + + + Ctrl+Up + Ctrl+Up + + + + + Move Down + 下移 + + + + + Ctrl+Down + Ctrl+Down + + + + Clear All Inputs + 清除所有輸入 + + + + Not enough available inputs! + 沒有足夠的可用輸入! + + + + Delete Selected Inputs? + 刪除選擇的輸入? + + + + &Add + 添加 (&A) + + + + Ctrl+A + + + + + &Edit + 編輯 (&E) + + + + Enter + InputPanel + 確定 + + + + &Delete + 删除 (&D) + + + + Delete + 删除 + + + + &Copy + 複製 (&C) + + + + Ctrl+C + + + + + &Cut + 剪下 (&C) + + + + Ctrl+X + + + + + &Paste + 貼上 (&P) + + + + Ctrl+V + + + + + Du&plicate + 克隆 (&P) + + + + Ctrl+U + + + + + Clear Inputs? + 清除輸入? + + + + Really clear all the inputs? + 確定清除所有輸入麼? + + + + LimitData + + + INV + 反向 [←] + + + + NOR + 或非 + + + + CH + + + + + LimitsGroup + + + GV + GV + + + + LogicalSwitchData + + + --- + 正向 [→] + + + + a>x + 數值1 > 數值2 a>x + + + + a<x + 數值1 < 數值2 a<x + + + + |a|>x + |數值1| > 數值2 |a|>x + + + + |a|<x + |數值1| < 數值 2 |a|<x + + + + AND + 與運算 AND + + + + OR + 或運算 OR + + + + XOR + 異或運算 XOR + + + + a=b + 數值1 = 數值2 a=b + + + + a!=b + 數值1 != 數值2 a!=b + + + + a>b + 數值1 > 數值2 a>b + + + + a<b + 數值1 < 數值2 a<b + + + + a>=b + 數值1 ≥ 數值2 a>=b + + + + a<=b + 數值1 ≤ 數值2 a<=b + + + + d>=x + 數值1變動 ≥ 數值2 d>=x + + + + |d|>=x + |數值1變動| ≥ 數值2 d>=x + + + + a=x + 數值1 = 數值2 a=x + + + + a~x + 數值1 ≈ 數值2 a~x + + + + Timer + 定時開關 Timer + + + + Sticky + 粘滞键 Sticky + + + + Edge + 邊沿觸發 EDGE + + + + Unknown + 未知[Unknown] + + + + L + + + + + LSW + + + + + LogicalSwitchesPanel + + + Function + LogicalSwitchPanel + 運算方式 [Function] + + + + V1 + LogicalSwitchPanel + 數值1 [V1] + + + + V2 + LogicalSwitchPanel + 數值2 [V2] + + + + AND Switch + 與開關 [AND Sw] + + + + Duration + LogicalSwitchPanel + 持續時間 [Duration] + + + + Delay + LogicalSwitchPanel + 延遲 [Delay] + + + + Popup menu available + + + + + (infinite) + + + + + (instant) + LogicalSwitchPanel 邊沿觸發使用 + (立刻 [instant]) + + + + &Copy + 複製 (&C) + + + + &Cut + LogicalSwitchPanel + 剪下 (&C) + + + + &Paste + LogicalSwitchPanel + 貼上 (&P) + + + + &Delete + LogicalSwitchPanel + 刪除 (&D) + + + + LogsDialog + + + + + + + + + + Companion Log Viewer + Companion Log 查看器 + + + + + + + + + + + Fly sessions + LogsDialog + 飛行起落 + + + + + + + + + + + Save session CSV + + + + + + + + + + + + Zoom + 縮放 + + + + + + + + + + + X + + + + + + + + + + + + Y + + + + + + + + + + + + Reset + 重設 + + + + + + + + + + + Filename + 文件名 + + + + + + + + + + + Open LogFile + 打開 Log 文件 + + + + Telemetry logs + 回傳 logs + + + + Time (hh:mm:ss) + 時間 (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 found + + + + + The column containing GPS coordinates must be named "GPS". + +The columns for altitude "GAlt" and for speed "GSpd" are optional + 包含 GPS 坐標的列必須起名為 "GPS". + +包含高度的列 "GAlt" 和包含速度的列 "GSpd" 是可選的 + + + + Cannot write file %1: +%2. + 無法寫入文件 %1: +%2. + + + + Cursor A: %1 m + 光標 A: %1 m + + + + Cursor B: %1 m + 光標 B: %1 m + + + + Time delta: %1 + 時間偏移: %1 + + + + Climb rate: %1 m/s + 升降速率: %1 m/s + + + + Select your log file + 選擇你的 log 文件 + + + + Available fields + 可用項目 + + + + The selected logfile contains %1 invalid lines out of %2 total lines + 選擇的 Log 文件共有 %2 條記錄, 其中 %1 條記錄無效 + + + + total duration + 總持續時間 + + + + duration + 持續時間 + + + + (L1) + (L1) + + + + (R1) + + + + + (L2) + + + + + (R2) + + + + + MainWindow + + + + File loaded + 文件已載入 + + + + Checking for updates + 檢查更新中 + + + + A new version of Companion is available (version %1)<br>Would you like to download it? + 有新版本的 Companion 可用. (版本号 %1)<br>你希望現在就下載麼? + + + + + Save As + 另存為 + + + + Executable (*.exe) + 可執行文件 (*.exe) + + + + New release available + 有新版本發布 + + + + + No updates available at this time. + 目前沒有更新的韌體版本發布. + + + + + Would you like to launch the installer? + 你希望打開安裝軟體嗎? + + + + Error opening file %1: +%2. + 打開文件錯誤 %1: +%2. + + + + Not enough flash available on this board for all the selected options + 此主板上沒有足夠的Flash用來存儲所有所選選項 + + + + Compilation server temporary failure, try later + 編譯服務器臨時不可用, 請稍後再試 + + + + Compilation server too busy, try later + 編譯服務器太忙, 請稍後再試 + + + + Compilation error + 編譯錯誤 + + + + Invalid firmware + 無效的韌體 + + + + Invalid board + 無效的主板 + + + + Invalid language + 無效的語言 + + + + Unknown server failure, try later + 未知服務器失效, 請稍後再試 + + + + Do you want to write the firmware to the radio now ? + 你希望現在就將韌體寫入到遙控器嗎? + + + + + Yes + MainWindow + + + + + + No + MainWindow + + + + + + Release Notes + 版本發布說明 + + + + A new version of %1 firmware is available: + - current is %2 + - newer is %3 + +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 + - 新的版本是 %3 + +你希望現在下載嗎 ? + +我們建議你使用下面的按鈕查看版本發布說明, 以便了解對你來說重要的更新項目. + + + + The new theme will be loaded the next time you start Companion. + 新的主題將在重新打開程序後使用. + + + + + Open Models and Settings file + 打開模型和配置文件 + + + + + File saved + 文件已保存 + + + + + Synchronize SD + 同步SD卡 + + + + + Read Firmware from Radio + 從遙控器中讀取韌體 + + + + Write Firmware to Radio + 將韌體寫入遙控器 + + + + + Read Models and Settings from Radio + 從遙控器中讀取模型和配置 + + + + Write Models and Settings to Radio + 將模型和配置寫入遙控器 + + + + Save Radio Backup to File + 保存遙控器備份到文件 + + + + Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete. + + + + + Models and Settings read + + + + + Diskimage (*.dmg) + + + + + Would you like to open the disk image to install the new version? + + + + + A new release of Companion is available, please check the <a href='%1'>OpenTX website!</a> + + + + + 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! + + + + + + This function is not yet implemented + + + + + Read Radio Firmware to File + 讀取遙控器韌體並保存到文件 + + + + OpenTX Home Page: <a href='%1'>%1</a> + OpenTX 網站主頁: <a href='%1'>%1</a> + + + + The OpenTX Companion project was originally forked from <a href='%1'>eePe</a> + OpenTX Companion項目起初分支於 <a href='%1'>eePe</a> + + + + If you've found this program useful, please support by <a href='%1'>donating</a> + 如果你覺得此程序有用, 請通過<a href='%1'>捐贈</a>支持 + + + + Copyright OpenTX Team + 版權所有 OpenTX Team + + + + About Companion + 關於 Companion + + + + OpenTX Companion %1 - Radio: %2 - Profile: %3 + OpenTX Companion %1 - 遙控器: %2 - 檔案: %3 + + + + New + MainWindow + 新建配置文件 + + + + Create a new Models and Settings file + 建立新的模型和設置文件 + + + + Open... + 打開... + + + + Save + 保存 + + + + + Save Models and Settings file + 保存模型和配置文件 + + + + Save As... + 另存為... + + + + Close + 關閉 + + + + Close Models and Settings file + + + + + Exit + 退出 + + + + Exit the application + 退出軟體 + + + + - 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! + + + + + Classical + 經典 + + + + The classic companion9x icon theme + 經典 companion9x 圖標主題 + + + + Yerico + Yerico圖標主題 + + + + Yellow round honey sweet icon theme + 黃色圓潤甜蜜圖標主題 + + + + Monochrome + 單色黑白 + + + + A monochrome black icon theme + 黑色圖標的黑白主題 + + + + MonoWhite + 單色白色 + + + + A monochrome white icon theme + 白色圖標的黑白主題 + + + + MonoBlue + 單色藍色 + + + + 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. + + + + + 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. + + + + + + Do you want to download version %1 now ? + + + + + Ignore this version %1? + + + + + Local Folder + + + + + Radio Folder + + + + + 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. + + + + + Import Application Settings.. + + + + + Load %1 and Simulator settings from a prevously exported settings file. + + + + + 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 + + + + + Ctrl+Shift+S + + + + + Ctrl+Alt+L + + + + + Ctrl+Alt+D + + + + + Ctrl+Alt+R + + + + + A monochrome blue icon theme + 藍色圖標的黑白主題 + + + + Small + + + + + Use small toolbar icons + 使用小的工具欄圖標 + + + + Normal + MainWindow + 普通 + + + + Use normal size toolbar icons + 使用普通大小的工具欄圖標 + + + + Big + + + + + Use big toolbar icons + 使用大工具欄圖標 + + + + Huge + 超大 + + + + Use huge toolbar icons + 使用特大的工具欄圖標 + + + + System language + 使用系統語言 + + + + 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> + + + + + About... + 关于... + + + + Show the application's About box + 顯示軟體的關於對話框 + + + + View Log File... + 查看 Log 文件... + + + + Open and view log file + 打開和查看 Log 文件 + + + + Settings... + 設置... + + + + Edit Settings + 編輯設定 + + + + Download... + 下載... + + + + Download firmware and voice files + 下載韌體和語音文件 + + + + Check for Updates... + 檢查更新... + + + + Check OpenTX and Companion updates + 檢查 OpenTX 和 Companion 更新 + + + + Compare Models... + 比較模型... + + + + Compare models + 比較模型參數 + + + + Edit Radio Splash Image... + 編輯遙控器開機畫面... + + + + Edit the splash image of your Radio + 編輯你的遙控器的開機畫面 + + + + List programmers... + 列出編程器... + + + + List available programmers + 列出可用的編程器 + + + + Fuses... + 熔絲位... + + + + Show fuses dialog + 顯示熔絲位對話框 + + + + Read firmware from Radio + 從遙控器中讀取韌體 + + + + Write firmware to Radio + 將韌體寫入遙控器 + + + + Add Radio Profile + 添加遙控器檔案 + + + + Manuals and other Documents + 使用說明書和其他文檔 + + + + Open the OpenTX document page in a web browser + 在網路瀏覽器中打開OpenTX文檔主頁 + + + + 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 + 向所有對OpenTX和Companion做出過貢獻的人致敬 + + + + SD card synchronization + 同步SD卡 + + + + Use default system language. + + + + + Use %1 language (some translations may not be complete). + + + + + Recent Files + 最近使用的文件 + + + + Set Menu Language + 設置菜單語言 + + + + Set Icon Theme + 設置程序圖標 + + + + Set Icon Size + 設置圖標大小 + + + + + File + 文件 + + + + + Edit + 編輯 + + + + Settings + 設置 + + + + Read/Write + 讀/寫 + + + + + Help + 幫助 + + + + Write + 寫入 + + + + Ready + 已準備好 + + + + %2 + + + + + Alt+%1 + + + + + New Radio + 新的遙控器 + + + + MdiChild + + + Delete + 刪除 + + + + Move to Category + + + + + Alt+S + + + + + Do you want to overwrite radio general settings? + 你希望覆蓋遙控器一般設定嗎? + + + + Alt+Shift+E + + + + + Ctrl+Alt+C + + + + + Ctrl+Alt+V + + + + + Alt+Shift+S + + + + + Alt+C + + + + + Alt+A + + + + + Alt+R + + + + + Alt+W + + + + + Alt+U + + + + + %n Model(s) + As in "Copy 3 Models" or "Cut 1 Model" or "Delete 3 Models" action). + + + + + + + %n Model(s) + As in "Paste 3 Models" or "Insert 1 Model." + + + + + + + %n Category(ies) + As in "Delete 3 Categories" or "Delete 1 Category." + + + + + + + Nothing selected + + + + + Rename Category + + + + + Edit Model + + + + + Cut + + + + + Copy + 複製 + + + + Paste + 貼上 + + + + Insert + + + + + Edit Radio Settings + + + + + Copy Radio Settings + + + + + Paste Radio Settings + + + + + Simulate Radio + + + + + Add Category + + + + + Category + + + + + Add Model + + + + + Model + 模型名稱 [Model Name] + + + + Restore from Backup + + + + + Model Wizard + 模型嚮導 + + + + Set as Default + + + + + Print Model + + + + + Simulate Model + + + + + Duplicate Model + + + + + Show Category Actions Toolbar + + + + + Show Radio Actions Toolbar + + + + + Show Model Actions Toolbar + + + + + free bytes + 剩餘空間 (Bytes) + + + + 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? + + + + + Delete %n selected model(s)? + + + + + + + Delete %n selected category(ies)? + + + + + + + Cannot duplicate model, could not find an available model slot. + + + + + 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> + + + + + Unable to find Horus radio SD card! + + + + + Models and Settings written + + + + + Unable to find file %1! + 無法找到文件 %1! + + + + Error opening file %1: +%2. + 打開文件錯誤 %1: +%2. + + + + Error reading file %1: +%2. + 打開文件錯誤 %1: +%2. + + + + Save As + 另存為 + + + + %1 has been modified. +Do you want to save your changes? + %1已經修改. +想要保存修改嗎? + + + + 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 + + + + + Cannot write temporary file! + + + + + Open backup Models and Settings file + 打開備份的模型和設置文件 + + + + Invalid binary backup File %1 + 無效的二進製備份文件 %1 + + + + MixData + + + MIX + + + + + (@%1) + + + + + MixerDialog + + + + + + + + Dialog + 對話框 + + + + + + + + + + + Delay + 延遲 [Delay] + + + + + + + + + + + Slow + 慢動作 [Slow] + + + + + + + + + + + Up + 正向 [Up] + + + + + + + + + + + Down + 負向 [Dn] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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;">Delay ans Slow</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;">These values control the speed and delay of the output of the mix. </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 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, 混控的输出将按照指定的速度慢动作 -&gt; 所设定数值为舵机从 -100% 运动到 +100%所需要时间.</p></body></html> + + + + + + + + + + + Include Trim + 微調 [Trim] + + + + + + + + + + + Offset + 偏移 [Offset] + + + + + + + + + + + Weight + 比例 [Weight] + + + + + + + + + + + Name + 名稱 [Name] + + + + + + + + + + + Source + 第一次出現 Mixer的主頁條目概覽中 + 輸入源 [Source] + + + + + + + + + + + Multiplex + 混控方式 [Multiplex] + + + + + + + + + + + Warning + 啟用時蜂鳴 [Warning] + + + + + + + + + + + The curve used by the mix + 此混控使用的曲線 + + + + + + + + + + + Include DR/Expo + 使用 DR/Expo + + + + + + + + + + + Flight modes + 飛行模式 [Modes] + + + + + + + + + + + Switch + 開啟開關 [Switch] + + + + + + + + + + + Mixer warning. +Setting this value will cause a beep to be emmitted when this value is active. + 混控警告 +當本條混控啟用時發出蜂鳴. + + + + + + + + + + + OFF + 1聲蜂鳴 [1] + 關閉 [OFF] + + + + + + + + + + + 1 Beep + 1聲蜂鳴 [1] + + + + + + + + + + + 2 Beep + 2聲蜂鳴 [2] + + + + + + + + + + + 3 Beep + 3聲蜂鳴 [3] + + + + + + + + + + + No + 禁用微調 用在FM設定中 + 不使用 [OFF] + + + + + + + + + + + Yes + 不使用 [OFF] + 使用 [On] + + + + + + + + + + + + + + + + + + + + + + + + + + + GV + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer + 混控的輸入源 + + + + + + + + + + + Multiplexer + +This determines how mixer values are added. + +"+" means the value of the current mix is added to the previous mixes in the same channel. +"*" means the value of the current mix is amultiplied with the previous mixes in the same channel. +"R" means the value replaces the previous values. If the switch is off the value will be ignored. + 混控方式 + +規定了混控值如何混合 + +"+"表示本混控值將會與此通道中的上條2混控 值相加. + +"*"表示本混控值將會與此通道中的上條混控值相乘. + +"R"表示本混控值將會取代此通道中的上條混控 +如果開關關閉此條混控將會被忽略. + + + + + + + + + + + ADD + 與前一行的輸出值相加後輸出 [Add] + + + + + + + + + + + MULTIPLY + 與前一行的輸出值相乘後輸出 [Multiply] + + + + + + + + + + + REPLACE + 與前一行的輸出值相乘後輸出 [Multiply] + 取代前一行的輸出值 [Replace] + + + + + + + + + + + Curve + 曲線 [Curve] + + + + + + + + + + + Switch used by the mix. +If blank then the mix is considered to be "ON" all the time. + 用來開啟此條混控的開關 +如果不設定開啟開關則默認此條混控一直​​啟用. + + + + DEST -> %1 + + + + + Click to access popup menu + + + + + Clear All + + + + + Set All + + + + + Invert All + + + + + + FullScreenDialog + + + + + MixersListWidget + + + Increase font size + + + + + Decrease font size + + + + + Default font size + + + + + Ctrl+0 + + + + + MixesPanel + + + + Move Up + 向上移動此行 + + + + + Ctrl+Up + + + + + + Move Down + 向下移動此行 + + + + + Ctrl+Down + Ctrl+Dn + + + + Clear Mixes + 清除本頁所有混控 + + + + Not enough available mixers! + 無空白混控存儲位置! + + + + Delete Selected Mixes? + 是否刪除選擇的混控? + + + + &Add + 添加 (&A) + + + + Ctrl+A + + + + + &Edit + 編輯 (&E) + + + + Enter + 確定 + + + + &Toggle highlight + 切換高亮 (&T) + + + + Ctrl+T + + + + + &Delete + 删除 (&D) + + + + Delete + 删除 + + + + &Copy + 複製 (&C) + + + + Ctrl+C + + + + + C&ut + 剪下 (&C) + + + + Ctrl+X + + + + + &Paste + 貼上 (&P) + + + + Ctrl+V + + + + + Du&plicate + 克隆 (&P) + + + + Ctrl+U + + + + + Clear Mixes? + 清除混控? + + + + Really clear all the mixes? + 是否真的刪除所有混控? + + + + ModelData + + + Model: + + + + + Throttle Source + 設為油門桿 [Thr Source] + + + + ModelEdit + + + + + + + + Dialog + 對話框 + + + + + + + + + + + Simulate + 遙控器模擬器 + + + + Setup + 設置 Setup + + + + Heli + 直升機 Heli + + + + Flight Modes + 飛行模式 FM + + + + Inputs + 輸入 Inputs + + + + Mixes + !!!! mixes-->mixer + 混控 Mixer + + + + Outputs + 輸出 Outputs + + + + Curves + ModelEdit + 曲線 Curves + + + + Logical Switches + 邏輯開關 Logical Sw + + + + Special Functions + 特殊功能 Special Func + + + + Telemetry + 回傳設置 Tele + + + + + FullScreenDialog + + + + + ModelPrinter + + + Exponential + 指微調的步長 + 先小後大 [Exp] + + + + Extra Fine + 很小 [Extra Fine] + + + + Fine + 小 [Fine] + + + + Medium + 中等 [Medium] + + + + Coarse + 大 [Coarse] + + + + Unknown + Model Printer + 未知[Unknown] + + + + Slave/Jack + 教練從機/教練線插口 [Slave/Jack] + + + + Master/SBUS Module + 教練主機/SBUS 模塊 [Master/SBUS] + + + + Master/CPPM Module + 教練主機/CPPM 模塊 [Master/CPPM] + + + + Master/SBUS in battery compartment + 教练主机/SBUS 电池盒中插座 + + + + Master/Jack + 教练主机/教练线插口 [Master/Jack] + + + + Enable + + + + + Disable + + + + + True + + + + + False + + + + + Yes + + + + + No + + + + + Y + + + + + N + + + + + ON + 啟用 + + + + + + + OFF + + + + + bytes + + + + + + Mode + 模式 + + + + + Channels + 通道數 [Channels] + + + + + Frame length + + + + + PPM delay + PPM 延遲 [Delay] + + + + + Polarity + 極性 [Polarity] + + + + Protocol + + + + + + + Delay + + + + + + Receiver + 接收機設置[Reciever] + + + + Radio protocol + + + + + Subtype + + + + + Option value + + + + + Sub Type + + + + + RF Output Power + + + + + 90 + + + + + 120 + + + + + 120X + + + + + 140 + + + + + Off + Model Printer + 关闭 + + + + + + + + + None + + + + + Name + + + + + Countdown + 倒數報數 + + + + Minute call + + + + + MULT! + + + + + + Offset + + + + + Slow + 慢動作 [Slow] + + + + Warn + + + + + Flight modes + + + + + Flight mode + 飛行模式 [Modes] + + + + All + 開啟 [All] + + + + Edge + 邊沿觸發 EDGE + + + + Sticky + 粘滯鍵 Sticky + + + + Timer + 定時開關 Timer + + + + missing + + + + + Duration + 持續時間 [Duration] + + + + Extended Limits + 舵機上下限擴展 +[Extended Limits] + + + + Display Checklist + 顯示檢查單 +[Checklist] + + + + Global Functions + + + + + Manual + 手動 [Manual] + + + + Auto + 用關機位置 [Auto] + + + + Failsafe Mode + 失控保護方式 [Failsafe Mode] + + + + + Hold + + + + + No Pulse + 不輸出脈衝 [No Pulse] + + + + Not set + 未設置 + + + + No pulses + + + + + Silent + 静音 [Silent] + + + + Beeps + 蜂鳴 [Beeps] + + + + Voice + 語音 [Voice] + + + + Haptic + 振動 [Haptic] + + + + Flight + 飛行 [Flight] + + + + Manual reset + + + + + Step + + + + + Display + + + + + Extended + + + + + Never + 從不 [Never] + + + + On Change + + + + + Always + 一直 [Always] + + + + + + Source + + + + + Trim idle only + + + + + Warning + 啟用時蜂鳴 [Warning] + + + + Reversed + + + + + Tmr + + + + + FrSky S.PORT + + + + + FrSky D + + + + + FrSky D (cable) + + + + + Alti + 高度 + + + + Alti+ + 最大高度 + + + + VSpeed + 垂直速度 + + + + + + A1 + A1 模擬值1 + + + + + + A2 + A2 模擬值2 + + + + + A3 + A3 模擬值3 + + + + + A4 + A4 模擬值4 + + + + + FAS + FAS + + + + Cells + 鋰電總電壓 + + + + Calculated + 運算 + + + + Add + + + + + Average + 平均值 + + + + + Min + + + + + + Max + + + + + Multiply + 乘以 + + + + Totalise + + + + + Cell + 鋰電單片電壓 + + + + Consumption + 消耗 + + + + Distance + + + + + Lowest + 最低 + + + + Cell %1 + 第%1片 + + + + Highest + 最高 + + + + Delta + 每片電壓差 + + + + Formula + + + + + + Id + + + + + Instance + 對象 + + + + + + + Sensor + + + + + + Sources + + + + + + GPS + + + + + Alt. + + + + + + Blades + 旋翼數 + + + + Multi. + + + + + F + + + + + Inst + + + + + Alt + Alt 高度 + + + + Unit + + + + + Prec + + + + + Ratio + 比例 + + + + Multi + + + + + A/Offset + + + + + Filter + 過濾器 + + + + Persist + + + + + Positive + + + + + Log + + + + + Numbers + 數字 + + + + Bars + 條狀圖 + + + + Script + 腳本 + + + + Filename + 文件名 + + + + Error: Unable to open or read file! + + + + + Persistent + 保持[Persistent] + + + + + + FM%1 + + + + + FM%1%2 + + + + + FM%1+%2 + + + + + + Weight + 比例 [Weight] + + + + + Switch + 啟用開[Switch] + + + + + NoTrim + 不使用微調[Notrim] + + + + Offset(%1) + 偏移[Offse](%1) + + + + No DR/Expo + 不使用 DR/Expo + + + + Disabled in all flight modes + 在所有飛行模式中禁用 + + + + instant + 立刻執行[instant] + + + + + + Custom + 自定義[Custom] + + + + Standard + 標準[Standard] + + + + ModelSelectionPage + + + Plane + 固定翼 + + + + Multirotor + 多軸 + + + + Helicopter + 直升機 + + + + Model Name: + 模型名稱: + + + + Model Type: + 模型種類: + + + + Module + + + + + + + + + + CH + 通道 + + + + + + + + + + + Failsafe Mode + 失控保護方式 [Failsafe Mode] + + + + + + + + + + + Start + 開始通道 [CH] + + + + + + + + + + + PPM delay + PPM 延遲 [Delay] + + + + + + + + + + + us + 微秒 + + + + + + + + + + + Negative + 負 [Negative] + + + + + + + + + + + Positive + 正 [Positive] + + + + + + + + + + + RF Output Power + + + + + + + + + + + + Antenna + + + + + + + + + + + + Option value + + + + + + + + + + + + Sub Type + + + + + + + + + + + + Master/Jack + 教練主機/教練線插口 [Master/Jack] + + + + + + + + + + + Slave/Jack + 教練從機/教練線插口 [Slave/Jack] + + + + + + + + + + + Master/SBUS Module + 教練主機/SBUS 模組 [Master/SBUS] + + + + + + + + + + + Master/CPPM Module + 教練主機/CPPM 模組 [Master/CPPM] + + + + + + + + + + + Master/SBUS in battery compartment + 教練主機/SBUS 電池盒中插座 + + + + + + + + + + + Show values in: + + + + + + + + + + + + % + abbreviation for percent + + + + + + + + + + + + μs + abbreviation for microseconds + + + + + + + + + + + + Polarity + 極性 [Polarity] + + + + + + + + + + + Trainer Mode + 教練功能模式 [Trainer Mode] + + + + + + + + + + + ms + 毫秒 + + + + + + + + + + + PPM Frame Length + PPM幀長 [Frame Length] + + + + + + + + + + + Channels + 通道數 [Channels] + + + + + + + + Receiver 1 + + + + + + + + + + + + + + + + + + + X + + + + + + + + + Receiver 2 + + + + + + + + + Receiver 3 + + + + + + + + + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + + + + + Registration ID + + + + + + + + + + + + WARNING: Requires non-certified firmware! + + + + + + + + + + + + Not set + 未設置 + + + + + + + + + + + Hold + 自定義 [Custom]]]]] + 保持 [Hold] + + + + + + + + + + + Custom + 自定義 [Custom]]]]] + 自定義 [Custom] + + + + + + + + + + + No Pulses + 自定義 [Custom]]]]] + 不輸出脈衝 [No Puls] + + + + + + + + + + + Receiver + 自定義 [Custom]]]]] + 接收機設置[Reciever] + + + + + + + + + + + Failsafe Positions + 失控保護位置 [F.s. Positons] + + + + + + + + + + + Protocol + 遙控器發射協議 [Protocol] + + + + + + + + + + + Multi Radio Protocol + 多遙控協議 [Multi Protocal] + + + + + + + + + + + Receiver No. + 接收機編號 [Receiver No.]. + + + + + + + + + + + Output type + 輸出類型 [Output type] + + + + + + + + + + + Open Drain + 開漏輸出 [Open Drain] + + + + + + + + + + + Push Pull + 推挽輸出 [Push Pull] + + + + + + + + + + + Bind on startup + 開機時對頻[Bind] + + + + + + + + + + + Low Power + 低功率[Range] + + + + + + + Internal + + + + + + + + Ext. + Int. + + + + + ModuleData + + + Positive + + + + + Negative + 负 [Negative] + + + + Trainer Port + 教練功能 [Trainer Port] + + + + Internal Radio System + 內置高頻頭 [Internal RF] + + + + External Radio Module + 外置高頻頭 [External RF] + + + + Extra Radio System + 附加高頻頭 [Extra RF] + + + + 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) + + + + + ModulePanel + + + Value + 自定義回傳中使用 + 設為 + + + + Hold + 保持 [Hold] + + + + No Pulse + 不輸出脈衝 [No Pulse] + + + + Ask + + + + + Internal + + + + + Internal + External + + + + + External + + + + + MultiModelPrinter + + + Input + 輸入 + + + + Weight + 比例 [Weight] + + + + Long. cyc + 縱向循環螺距 [Long] + + + + Lateral cyc + 橫向循環螺距 [Lateral] + + + + Collective + 總距 [Collective] + + + + Flight modes + 飛行模式 [Modes] + + + + + Flight mode + 飛行模式 [Modes] + + + + + Switch + 啟用開關 [Switch] + + + + General + + + + + EEprom Size + + + + + Model Image + 模型圖片 [Medel Image] + + + + Throttle + 油門 + + + + Trims + + + + + Center Beep + + + + + Switch Warnings + 開關位置警告 [Switch Positions] + + + + Pot Warnings + 旋鈕位置警告 [Pot Positions] + + + + Other + + + + + Timers + + + + + Time + Time 當前時間 + + + + Countdown + 倒數報數 + + + + Modules + + + + + Trainer port + + + + + Helicopter + 直升機 + + + + Swash + + + + + + Type + + + + + Ring + + + + + Protocol + + + + + Low + + + + + Critical + + + + + Telemetry audio + + + + + Altimetry + 高度計 + + + + + Vario source + Vario 傳感器 + + + + 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 + 保持mAh + + + + Current source + 當前源 + + + + Blades + 旋翼數 + + + + Parameters + 參數 + + + + Telemetry Sensors + + + + + Telemetry Screens + + + + + GF%1 + GF%1 + + + + Global Functions + + + + + Checklist + + + + + + GV%1 + + + + + RE%1 + + + + + Channel + 通道 + + + + + + Name + 名稱 [Name] + + + + Prec + + + + + Popup + + + + + Outputs + 輸出 Outputs + + + + Subtrim + 舵機中位 [Subtrim] + + + + Direct + + + + + Curve + + + + + PPM + + + + + Linear + 直線 + + + + Telemetry + + + + + Offset + 偏移 [Offset] + + + + + Min + 舵機下限 [Min] + + + + Min.call + + + + + Persist + + + + + F.In + + + + + F.Out + + + + + Global vars + + + + + + Max + 舵機上限 [Max] + + + + Global Variables + 全局變量 [Global Variables] + + + + Inputs + 輸入 + + + + Mixers + 混控 [Mixers] + + + + Curves + 多點曲線 [Curves] + + + + L%1 + + + + + Logical Switches + 邏輯開關 [Logical Sw] + + + + SF%1 + + + + + Special Functions + 特殊功能 [Special Func] + + + + Analogs + 模擬量 [Analogs] + + + + + Unit + 單位 [Unit] + + + + Scale + 縮放 [Scale] + + + + RSSI Alarms + RSSI 警告 [RSSI Alarms] + + + + Multiprotocols + + + Subtype + + + + + 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: + 油門通道 [Throttle]: + + + + Yaw Channel: + 偏航通道 [Yaw]: + + + + Pitch Channel: + 仰俯通道 [Pitch]: + + + + Roll Channel: + 滾轉通道 [Roll]: + + + + OpenTxEepromInterface + + + Unknown error + + + + + ... plus %1 errors + + + + + Cannot write radio settings + + + + + Cannot write model %1 + + + + + OptionsPage + + + Throttle Cut + 油門切斷 [Throttle Cut] + + + + Throttle Timer + 油門計時器 [Throttle Timer] + + + + Flight Timer + 飛行計時器 [Flight Timer] + + + + OtxFormat + + + Error opening file %1: +%2. + 打開文件錯誤 %1: +%2. + + + + Error opening OTX archive %1 + 打開 OTX 存檔錯誤 %1. {1?} + + + + Error initializing OTX archive writer + OTX 存檔寫入器初始化錯誤 + + + + Error writing file %1: +%2. + 寫入文件錯誤 %1: +%2. + + + + Error creating OTX file %1: +%2. + 創建 OTX 存檔 %1時出錯: +%2. + + + + Error creating OTX archive + 創建 OTX 存檔時出錯 + + + + Error adding %1 to OTX archive + 将 %1 加入到 OTX 存檔時出錯 + + + + PrintDialog + + + + + + + + + + Close + 關閉 + + + + + + + + + + + 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 + + + + + + + + + + Show Details + 顯示詳情 + + + + RadioData + + + Models + + + + + RadioDataConversionState + + + is invalid + + + + + converted to + + + + + verify is + + + + + [DBG] + + + + + [NFO] + + + + + [WRN] + + + + + [CVT] + + + + + [ERR] + + + + + [INV] + + + + + Event + + + + + Origin + + + + + Comp + + + + + Sub-Component + + + + + Field + + + + + Type + + + + + Old + + + + + Action + 功能 + + + + New + 新建配置文件 + + + + Seq + + + + + RadioInterface + + + Cannot write file %1: +%2. + 無法寫入文件 %1: +%2. + + + + <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? + <b><u>警告!</u></b><br>這將把 %1 的熔絲位恢復工廠設置<br>改變熔絲位可能使你的遙控器變磚.<br>只有當你確定它們是錯誤的時候才能進行此操作!<br>你確認要繼續嗎? + + + + + Could not delete temporary file: %1 + 無法刪除臨時文件: %1 + + + + Unable to find Horus radio SD card! + + + + + RadioKnobWidget + + + <p>Value (input): <b>%1</b></p> + + + + + Right-double-click to reset to center. + + + + + RadioNotFoundDialog + + + + + + + + + + No Radio Found + 未找到遙控器 + + + + + + + + + + + <html><head/><body><p>No Radio was found!</p><p>Make sure that you hold the lower trim buttons towards the center while you turn it on.</p><p>Then connect the USB wire.</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">Note: if you have a Taranis that has not had the firmware upgraded to 2.0 then this version of Companion will not work.</span></p></body></html> + <html><head/><body><p>未找到遥控器!</p><p>先將這兩個微調按鈕同時保持撥向內側, 然後再打開遙控器.</p><p>開機後再插上USB線.</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">提示:如果你的X9D遙控器尚未升級到2.0版本, 則不能使用這個版本的 Compaion 軟體.</span></p></body></html> + + + + + + + + + + + OK + + + + + RadioOutputsWidget + + + + + + + + + + + + Form + 表單 + + + + + + + + + + + + + View: + + + + + + + + + + + + + + Logical Switches + + + + + + + + + + + + + + Global Variables + 全局變量 [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 + TrmR 方向微調 + + + + TrmE + TrmE 升降微調 + + + + TrmT + TrmT 油門微調 + + + + TrmA + TrmA 副翼微調 + + + + Trm5 + + + + + Trm6 + + + + + TrmH + + + + + TrmV + + + + + + Batt + Batt 控電電壓 + + + + + Time + Time 當前時間 + + + + + Timer1 + 計時器1 [Timer1] + + + + + Timer2 + 計時器2 [Timer2] + + + + + Timer3 + 計時器3 [Timer3] + + + + RAS + + + + + RSSI Tx + RSSI Tx 發射機RSSI + + + + RSSI Rx + RSSI Rx 接收機RSSI + + + + A1 + A1 模擬值1 + + + + A2 + A2 模擬值2 + + + + A3 + A3 模擬值3 + + + + A4 + A4 模擬值4 + + + + Alt + Alt 高度 + + + + Rpm + Rpm 轉速 + + + + Fuel + Fule 燃油 + + + + T1 + T1 温度1 + + + + T2 + T2 温度2 + + + + Speed + Speed 速度 + + + + Dist + 距離 + + + + GPS Alt + GPS Alt GPS高度 + + + + Cell + 鋰電單片電壓 + + + + Cells + 鋰電總電壓 + + + + Vfas + Vfas FAS傳感器電壓 + + + + Curr + Curr 電流 + + + + Cnsp + Cnsp 電池使用mAh + + + + Powr + Powr 功率 + + + + AccX + AccX X軸加速度 + + + + AccY + AccY Y軸加速度 + + + + AccZ + AccZ Z軸加速度 + + + + Hdg + Hdg 航向角 + + + + VSpd + VSpd 垂直速度 + + + + AirSpeed + AirSpeed 空速 + + + + dTE + dTE 總能量變化 + + + + A1- + A1- 模擬值1- + + + + A2- + A2- 模擬值2- + + + + A3- + A3- 模擬值3- + + + + A4- + A4- 模擬值4- + + + + Alt- + Alt- 最小高度 + + + + Alt+ + Alt+ 最大高度 + + + + Rpm+ + + + + + T1+ + T1+ 温度1+ + + + + T2+ + T2+ 温度2+ + + + + Speed+ + + + + + Dist+ + + + + + AirSpeed+ + + + + + Cell- + + + + + Cells- + + + + + Vfas- + + + + + Curr+ + + + + + Powr+ + + + + + ACC + ACC 加速度 + + + + GPS Time + GPS Time GPS時間 + + + + REa + + + + + REb + + + + + + ??? + + + + + ---- + + + + + I + as in Input + + + + + LUA%1%2 + + + + + MAX + MAX 最大 + + + + CYC%1 + CYC%1 循環螺距 + + + + TR + as in Trainer + + + + + SRC + + + + + RawSwitch + + + ↑ + + + + + ↓ + + + + + - + + + + + ! + + + + + RudTrim Left + RudTrim Left 方向微調← + + + + RudTrim Right + RudTrim Right 方向微調→ + + + + EleTrim Down + EleTrim Down 升降微調↓ + + + + EleTrim Up + EleTrim Up 升降微調↑ + + + + ThrTrim Down + ThrTrim Down 油門微調↓ + + + + ThrTrim Up + ThrTrim Up 油門微調↑ + + + + AilTrim Left + AilTrim Left 副翼微調← + + + + AilTrim Right + 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 + THs 油門激活 + + + + TH% + TH% 油門比例 + + + + THt + THt 油門計時 + + + + + ??? + + + + + One + One 單次 + + + + ---- + + + + + Telemetry + + + + + SW + + + + + ReleaseNotesDialog + + + Companion Release Notes + Companion 版本發布說明 + + + + ReleaseNotesFirmwareDialog + + + OpenTX Release Notes + OpenTx 版本發布說明 + + + + RepeatComboBox + + + Played once, not during startup + 播放一次但開機時不播放 [!1x] + + + + No repeat + 播放一次 [1x] + + + + %1s + 每%1秒播放一次 + + + + RudderPage + + + No + RudderPage + 没有方向舵 + + + + Yes + RudderPage + 有方向舵 + + + + <br>Rudder Channel: + <br>方向舵通道: + + + + SdcardFormat + + + Error opening file %1: +%2. + 打開文件錯誤 %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 + + + + + Internal + + + + + External + + + + + Setup + + + + + + + + + + Timer 1 + 計時器 1 [Timer 1] + + + + + + + + + + + Top LCD Timer + 頂部 LCD 計時器 + + + + + + + + + + + Model Image + 模型圖片 [Medel Image] + + + + + + + + + + + Warnings + 警告 [Warnings] + + + + + + + + + + + Switch Warnings + 開關位置警告 [Switch Positions] + + + + + + + + + + + Pot Warnings + 旋鈕位置警告 [Pot Positions] + + + + + + + + + + + OFF + 關閉 [OFF] + + + + + + + + + + + Manual + 手動 [Manual] + + + + + + + + + + + Auto + 用關機位置 [Auto] + + + + + + + + + + + Model + 模型名稱 [Model Name] + + + + + + + + + + + Center beep + 回中蜂鳴 [Center Beep] + + + + + + + + + + + Edit Checklist... + + + + + + + + + + + + Extended Trims + 微調範圍擴展 +[Extended Trims] + + + + + + + + + + + Display Checklist + 顯示檢查單 +[Checklist] + + + + + + + + + + + Extended Limits + 舵機上下限擴展 +[Extended Limits] + + + + + + + + + + + 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 + 油門桿反向 +{Reverse] + + + + + + + + + + + Throttle Trim Idle Only + 油門微調只改變怠速 +[Trim Idle] + + + + + + + + + + + Throttle Warning + 油門杆位置警告 +[Throttle State] + + + + + + + + + + + Exponential + 先小後大 [Exp] + + + + + + + + + + + Extra Fine + 很小 [Extra Fine] + + + + + + + + + + + Fine + 較小 [Fine] + + + + + + + + + + + Medium + 中等 [Medium] + + + + + + + + + + + Coarse + 較大 [Coarse] + + + + + + + + + + + Never + 微調從不顯示在LCD顯示屏上 + 从不 [Never] + + + + + + + + + + + On change + ????意思是說微調在撥動微調開關時才在LCD顯示屏上顯示 + 調整時 [On change] + + + + + + + + + + + Always + 微調一直顯示在LCD顯示屏上 + 一直 [Always] + + + + + + + + + + + Global Functions + 全局功能 +[Global Functions] + + + + + + + + + + + Throttle Source + 設為油門桿 [Thr Source] + + + + + + + + + + + Trim Step + 微調步幅 [Trim Step] + + + + + + + + + + + Trims Display + 微調顯示 [Trims Display] + + + + + + + + + + + Timer 2 + 計時器 2 [Timer 2] + + + + + + + + + + + Timer 3 + 計時器 3 [Timer 3] + + + + SetupPanel + + + Timer %1 + 計時器[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> + + + + + SimulatorMain + + + OpenTx Simulator + + + + + Available profiles: + 可用檔案: + + + + ID: + + + + + Name: + + + + + Available radios: + 可用的遥控器: + + + + Radio profile ID or Name to use for simulator. + 用於模擬器的遙控器檔案 ID 或名稱. + + + + 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 + 警告: 無法初始化 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] + 錯誤: 未找到遙控器檔案或模擬器韌體. +檔案 ID: [%1]; 遥控器 ID: [%2] + + + + Uknown error during Simulator startup. + + + + + SimulatorMainWindow + + + + + + + + + + + + OpenTx Simulator + + + + + + + + + + + + + + View + + + + + + + + + + + + + + Radio Window + + + + + + + + + + + + + + Reload... + + + + + + + + + + + + + + Tools + + + + + + + + + + + + + + Toolbar + + + + + + + + + + + + + + Reload Lua Scripts + 載入 Lua 腳本 + + + + + + + + + + + + + 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 + Debug 輸出 + + + + 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 + Companion 模擬器 + + + + 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 + + + + + Radio firmware error: %1 + + + + + - Flight Mode %1 (#%2) + + + + + Cannot open joystick, joystick disabled + 無法打開遊戲桿, 遊戲桿功能禁用 + + + + SliderWidget + + + Right-double-click to reset to center. + + + + + <p>Value (input): <b>%1</b></p> + + + + + SplashLibraryDialog + + + + + + + + + + + + + + + + + + ... + + + + + Splash Library - page %1 of %2 + 開機圖片庫 - 第%1頁/共%2頁 + + + + Invalid image in library %1 + 圖片庫 %1 中的圖片無效 + + + + No valid image found in library, check your settings + 在圖片庫中沒有找到有效的圖片, 請檢查你的設置 + + + + StandardPage + + + Channel %1 + 通道 %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 + + + [TEST RUN] + + + + + Synchronization failed, nothing found to copy. + + + + + Skipping large file: %1 (%2KB) + + + + + Creating directory: %1 + + + + + Could not create directory: %1 + + + + + Gathering file information for %1... + + + + + No files found in %1 + + + + + Synchronization aborted at %1 of %2 files. + + + + + Synchronization finished with %1 files in %2m %3s. + + + + + Synchronizing: %1 + To: %2 + + + + + Starting synchronization: + %1 -> %2 + + + + + + +Too many errors, giving up. + + + + + Skipping filtered file: %1 + + + + + Skipping linked file: %1 + + + + + Aborted synchronization of: + + + + + Finished synchronizing: + + + + + Created: %1; Updated: %2; Skipped: %3; Errors: %4; + + + + + 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 + + + + + Creating file: %1 + + + + + Could not delete destination file '%1': %2 + + + + + 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 + + + + + + + + + + Protocol + 協議 + + + + + + + + + + + Alarm 1 + 警告 1 + + + + + + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + + + + + + + Yellow + 黄色警告 + + + + + + + + + + + + + + + + + + + Orange + 橙色警告 + + + + + + + + + + + + + + + + + + + Red + 红色警告 + + + + + + + + + + + Alarm 2 + 警告 2 + + + + + + + + + + + RSSI + + + + + + + + + + + + Disable telemetry audio warnings + + + + + + + + + + Source + + + + + + + + + + + + A1 + A1 模擬值1 + + + + + + + + + + + A2 + A2 模擬值2 + + + + + + + + + + + Sink Max + 最大下降率 + + + + + + + + + + + Climb Max + 最大爬升 + + + + + + + + + + + Sink Min + 最小下降率 + + + + + + + + + + + Climb Min + 最小爬升 + + + + + + + + + + + Center Silent + 中間靜音 + + + + + + + + + + + Vario limits + Vario 限值 + + + + + + + + + + + Vario source + Vario 傳感器 + + + + + + + + + + + Altimetry + 高度計 + + + + + + + + + + + Altitude source + 高度傳感器 + + + + + + + + + + + Volts source + 電壓傳感器 + + + + + + + + + + + Top Bar + 頂部橫條 + + + + + + + + + + + Volt source + 電壓傳感器 + + + + + + + + + + + Current source + 當前源 + + + + + + + + + + + Blades + 旋翼數 + + + + + + + + + + + mAh count + + + + + + + + + + + + mAh + + + + + + + + + + + + A + + + + + + + + + + + + FAS Offset + FAS偏移 + + + + + + + + + + + Persistent mAh + 保持mAh + + + + + + + + + + + Various + ???? + 不同的 + + + + + + + + + + + Serial Protocol + 串口協議 + + + + + + + + + + + None + + + + + + + + + + + + FrSky Sensor Hub + FrSky Sensor Hub + + + + + + + + + + + Sensors + 傳感器 + + + + + + + + + + + Disable multi sensor handling + 禁止多傳感器處理 + + + + TelemetryAnalog + + + + + + + + + + Unit + 單位 + + + + + + + + + + + Max Value + 最大值 + + + + + + + + + + + Alarm 1 + 警告 1 + + + + + + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + + + + + + + Yellow + 黄色警告 + + + + + + + + + + + + + + + + + + + Orange + + + + + + + + + + + + + + + + + + + + Red + 红色警告 + + + + + + + + + + + + + + + + + + + < + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + Alarm 2 + 警告 2 + + + + + + + + + + + Offset + + + + + + + + + + + + Volts (V) + 電壓 (V) + + + + + + + + + + + Amps (A) + 電流 (A) + + + + + + + + + + + Speed (m/s or ft/s) + 速度 (m/s or ft/s) + + + + + + + + + + + Raw (-) + 原始值 (-) + + + + + + + + + + + Speed (km/h or miles/h) + 速度 ( km/h 或 miles/h) + + + + + + + + + + + Meters (m or ft) + 高度 (米或英尺) + + + + + + + + + + + Temp (°) + 温度 (°) + + + + + + + + + + + Fuel (%) + 油量 (%) + + + + + + + + + + + mAmps (mA) + 電流 (mA) + + + + Range + 範圍 + + + + TelemetryCustomScreen + + + + + + + + + + Custom Screen Type + 自定義屏幕類型 + + + + + + + + + + + Min + 最小 + + + + + + + + + + + Source + 來源 + + + + + + + + + + + Gauge + 儀錶盤 + + + + + + + + + + + Max + 最大 + + + + None + 回傳屏幕設置中的選項 + + + + + Numbers + 數字 + + + + Bars + 條狀圖 + + + + Script + 脚本 + + + + TelemetryPanel + + + Telemetry screen %1 + 回傳屏幕 %1 + + + + FrSky S.PORT + + + + + FrSky D + + + + + FrSky D (cable) + + + + + Source + + + + + Low Alarm + 低警告 + + + + Critical Alarm + 緊急警告 + + + + Winged Shadow How High + + + + + Winged Shadow How High (not supported) + Winged Shadow How High (不支持) + + + + Alti + 高度 + + + + Alti+ + 最大高度 + + + + VSpeed + 垂直速度 + + + + + + A1 + A1 模擬值1 + + + + + + A2 + A2 模擬值2 + + + + + A3 + A3 模擬值3 + + + + + A4 + A4 模擬值4 + + + + + FAS + FAS + + + + Cells + 鋰電總電壓 + + + + --- + + + + + TelemetrySensor + + + + + + + + + + Form + 表單 + + + + + + + + + + + Custom + 自定義 + + + + + + + + + + + Calculated + 運算 + + + + + + + + + + + Id + + + + + + + + + + + + Instance + 對象 + + + + + + + + Rx + + + + + + + + + Mod. + + + + + + + + + + + + Add + + + + + + + + + + + + Average + 平均值 + + + + + + + + + + + Min + 最小 + + + + + + + + + + + Max + 最大 + + + + + + + + + + + Multiply + 乘以 + + + + + + + + + + + Totalize + 總計 + + + + + + + + + + + Cell + 鋰電單片電壓 + + + + + + + + + + + Consumption + 消耗 + + + + + + + + + + + Dist + 距離 + + + + + + + + + + + Cells Sensor : + 鋰電電壓傳感器 : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- + + + + + + + + + + + + GPS Sensor : + GPS 傳感器 : + + + + + + + + + + + Alt. Sensor : + 高度傳感器 : + + + + + + + + + + + Sensor : + 傳感器 : + + + + + + + + + + + Raw (-) + 原始值 (-) + + + + + + + + + + + V + + + + + + + + + + + + A + + + + + + + + + + + + mA + + + + + + + + + + + + kt + + + + + + + + + + + + m/s + + + + + + + + + + + + ft/s + + + + + + + + + + + + km/h + + + + + + + + + + + + mph + + + + + + + + + + + + m + + + + + + + + + + + + ft + + + + + + + + + + + + °C + + + + + + + + + + + + °F + + + + + + + + + + + + % + + + + + + + + + + + + mAh + + + + + + + + + + + + W + + + + + + + + + + + + mW + + + + + + + + + + + + dBm + + + + + + + + + + + + RPM + + + + + + + + + + + + g + + + + + + + + + + + + ° + + + + + + + + + + + + Rad + + + + + + + + + + + + mL + + + + + + + + + + + + US fl.Oz. + + + + + + + + + + + + Precision + 精確度 + + + + + + + + + + + Ratio + 比例 + + + + + + + + + + + Blades + 旋翼數 + + + + + + + + + + + Offset + 偏移 + + + + + + + + + + + Multiplier + 係數 + + + + + + + + + + + Auto Offset + 自動偏移 + + + + + + + + + + + Filter + 過濾器 + + + + + + + + + + + Persistent + 保持 + + + + + + + + + + + Positive + 正向 + + + + + + + + + + + Logs + LOG記錄 + + + + TelemetrySensorPanel + + + Lowest + 最低 + + + + Cell %1 + 第%1片 + + + + Highest + 最高 + + + + Delta + 每片電壓差 + + + + TelemetrySimulator + + + + + + + + + + + + Telemetry Simulator + 回傳模擬器 + + + + + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. + 如果允许 =, 發送任何非空值作為回傳模擬數據. + + + + + + + + + + + + + Simulate + 模擬 + + + + + + + + + + + + + Replay SD Log File + 重播 SD Log 文件 + + + + + + + + + + + + + Replay rate + + + + + + + + + + + + + + |> + + + + + + + + + + + + + + <| + + + + + + + + + + + + + + > + + + + + + + + + + + + + + <- + + + + + + + + + + + + + + X + + + + + + + + + + + + + + 1/5x + 1/5x + + + + + + + + + + + + + 5x + 5x + + + + + + + + + + + + + No Log File Currently Loaded + 現在沒有載入任何 log 文件 + + + + + + + + + + + + + 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. + + + + + + + + + + + + + + Load + 載入 + + + + + + + + + + + + + Row # +Timestamp + 行數 +時間戳 + + + + + + + + + + + + + RxBt + RxBt 接收機電壓 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio + 伏 / 比值 + + + + + + + + + + + + + RAS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> + + + + + + + + + + + + + + VFAS + VFAS FAS傳感器電壓 + + + + + + + + + + + + + Lat,Lon +(dec.deg.) + + + + + + + + + + + + + + dd-MM-yyyy +hh:mm:ss + + + + + + + + + + + + + + + + + + + + + + + + Volts + V + + + + + + + + + + + + + RSSI + RSSI 信號強度 + + + + + + + + + + + + + Db + + + + + + + + + + + + + + Curr + Curr 電流 + + + + + + + + + + + + + Amps + A + + + + + + + + + + + + + Cels + Cells 鋰電電壓 + + + + + + + + + + + + + A1 + A1 模擬值1 + + + + + + + + + + + + + A2 + A2 模擬值2 + + + + + + + + + + + + + ASpd + ASpd 空速 + + + + + + + + + + + + + + + + + + + + + + + km/h + + + + + + + + + + + + + + A3 + A3 模擬值3 + + + + + + + + + + + + + GAlt + GALT GPS高度 + + + + + + + + + + + + + + + + + + + + + + + Meters + m + + + + + + + + + + + + + A4 + A4 模擬值4 + + + + + + + + + + + + + GSpd + GSpd GPS速度 + + + + + + + + + + + + + Tmp1 + Tmp1 温度1 + + + + + + + + + + + + + Hdg + Hdg 航向角 + + + + + + + + + + + + + Degrees + ° + + + + + + + + + + + + + Tmp2 + Tmp2 温度2 + + + + + + + + + + + + + + + + + + + + + + + °C + + + + + + + + + + + + + + Date + Date 日期 + + + + + + + + + + + + + + + + + + + + + + + RPM + Rpm + + + + + + + + + + + + + GPS + + + + + + + + + + + + + + Fuel + Fule 燃油 + + + + + + + + + + + + + % + + + + + + + + + + + + + + AccX + AccX X軸加速度 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + G + G + + + + + + + + + + + + + Fuel Qty + Fule Qty 油量 + + + + + + + + + + + + + ml + + + + + + + + + + + + + + AccY + AccY Y軸加速度 + + + + + + + + + + + + + VSpd + VSpd 垂直速度 + + + + + + + + + + + + + m/s + + + + + + + + + + + + + + AccZ + AccZ Z軸加速度 + + + + + + + + + + + + + Alt + Alt 高度 + + + + Log File + Log 文件 + + + + LOG Files (*.csv) + LOG文件 (*.csv) + + + + ERROR - invalid file + 錯誤 無效的文件 + + + + ThrottlePage + + + Yes + 使用油門通道 + + + + No + 不使用油門通道 + + + + <br>Throttle Channel: + <br>油門通道: + + + + Timer + + + + + + + + + + Countdown + 倒數報數 + + + + + + + + + + + Minute Call + 分鐘提示 + + + + TimerData + + + TMR + + + + + Timer %1 + 計時器[Timer] %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. + + + + + m + + + + + h + + + + + s + + + + + TimerPanel + + + Silent + 静音 [Silent] + + + + Beeps + 蜂鳴 [Beeps] + + + + Voice + 語音 [Voice] + + + + Haptic + 振動 [Haptic] + + + + Not persistent + 關機不記憶 [Not persistent] + + + + Persistent (flight) + 關機記憶 隨Flight重設 [Flight] + + + + Persistent (manual reset) + 關機記憶 手動重設 [manual reset] + + + + Trainer + + + + + + + + + + Form + 表單 + + + + + + + + + + + Mode + 模式 + + + + + + + + + + + Input + 輸入 + + + + + + + + + + + Weight + 比例 + + + + + + + + + + + Rud + 方向通道 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + 關閉 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) + += (相加) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) + := (取代) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 + 通道1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 + 通道2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 + 通道3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 + 通道4 + + + + + + + + + + + Ele + 升降通道 + + + + + + + + + + + Thr + 油門通道 + + + + + + + + + + + Ail + 副翼通道 + + + + TrainerSimulator + + + + + + + + + + + + Trainer simulator + 教練功能模擬 + + + + TreeModel + + + 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. + + + + + VTailPage + + + First Tail Channel: + 第一個V尾通道: + + + + Second Tail Channel: + 第二個V尾通道: + + + + VirtualJoystickWidget + + + Hld Y + + + + + Hold Vertical stick position. + + + + + Fix Y + 固定 Y + + + + Prevent Vertical movement of stick. + + + + + Fix X + 固定 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 + 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>經常把不用的的模型配置刪除是好習慣! + + + + 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 + 選擇電調或油門舵機插在哪個通道上.<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>飛翼機翼後緣的舵面控制飛機繞縱軸的滾轉和繞橫軸的仰俯. 這些舵面叫做升降副翼. + + + + 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 + 模型使用一個或兩個通道來控制副翼.<br>如果使用一個通道, 則需要使用Y線來控制兩個副翼舵機.<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. + 空氣剎車在高級滑翔機中用來降低空速, 它們很少見於普通固定翼中. + + + + Models use two channels to control the elevons.<br>Select these two channels + 模型使用2個通道控制升降副翼 <br>選擇這兩個通道 + + + + 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 + 選擇方向舵或升降舵通道.<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. + 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 + 選擇你的多旋翼的控制通道.<br><br>油门 - Spektrum: 通道1, Futaba: 通道3<br>偏航 - Spektrum: 通道4, Futaba: 通道4<br>仰俯 - Spektrum: 通道3, Futaba: 通道2<br>滚转 - Spektrum: 通道2, Futaba: 通道1 + + + + There is no help available for the current page. + 當前頁面沒有幫助信息. + + + + Model Wizard Help + 模型嚮導幫助 + + + + WizardPrinter + + + Plane + 固定翼 + + + + Multicopter + 多軸 + + + + Helicopter + 直升機 + + + + Model Name: + 模型名稱: + + + + Model Type: + 模型種類: + + + + Options: + 選項: + + + + Channel %1: + 通道 %1: + + + + burnConfigDialog + + + + + + + + + + Programmer Configuration + 編程器配置 + + + + + + + + + + + + + + + + + + + Location of sam-ba executable + 定位 sam-ba 可執行文件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The location of the AVRDUDE executable. + AVRDUDE可執行文件位置. + + + + + + + + + + + DFU-Util Location + DFU-Util 軟體位置 + + + + + + + + + + + Location of AVRDUDE executable + AVRDUDE可執行文件位置 + + + + + + + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. + 使用這個按鈕定位AVRDUDE可執行文件. + + + + + + + + + + + + + + + + + + + + + + + + + + + Browse... + 瀏覽... + + + + + + + + + + + Programmer + 編程器 + + + + + + + + + + + Programmer used for communicating with the controller. +Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. + 與遙控器通訊用的編程器. +請參考編程器文檔和AVRDUDE文檔來選擇合適的編程器. + + + + + + + + + + + List all available programmers. + 列出所有可用的编程器. + + + + + + + + + + + List Available + 列出可用 + + + + + + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call + 每次調用時將會把更多的參數將會傳到給AVRDUDE + + + + + + + + + + + + + + + + + + + Extra arguments used in AVRDUDE. +This can be used for providing extra information to AVRDUDE. + +Please only use this if you know what you are doing. There are no error checks and you could cripple your controller. + 用於AVRDUDE的更多參數. +可用來為AVRDUDE提供更多的信息. + +僅當你知道在做什麼時使用. 這裡不進行錯誤檢查所以你可能把遙控器變磚. + + + + + + + + + + + Extra Arguments + 更多參數 + + + + + + + + + + + Show AVRDUDE help + 顯示AVRDUDE幫助 + + + + + + + + + + + Show Help + 顯示幫助 + + + + + + + + + + + Communication port to the programmer. + + 編程器通訊端口. + + + + + + + + + + + + + + + + + + + + Port + 端口 + + + + + + + + + + + AVRDUDE Location + AVRDUDE 位置 + + + + + + + + + + + MCU + MCU + + + + + + + + + + + + + + + + + + + CPU of your TX + 你的遥控器所用CPU + + + + + + + + + + + + + + + + + + + CPU present on your 9x radio +Should be m64 for stock radios +m2560 for v4.1 boards + 你的9x遙控器的CPU +零售版遙控器應為m64 +v4.1版電路板應為m2560 + + + + + + + + + + + at91sam3s8-9xr + at91sam3s8-9xr + + + + + + + + + + + SAM-BA Location + SAM-BA 位置 + + + + + + + + + + + ARM MCU + ARM MCU + + + + + + + + + + + sam-ba serial port + sam-ba 串口 + + + + + + + + + + + Alternate device + 其他設備 + + + + + + + + + + + Use advanced controls + 使用高級控制項 + + + + DFU-UTIL Configuration + DFU-UTIL 配置 + + + + SAM-BA Configuration + SAM-BA 配置 + + + + AVRDUDE Configuration + AVRDUDE 配置 + + + + + + Select Location + 選擇位置 + + + + List available programmers + 列出可用的编程器 + + + + Avrdude help + AVRDUDE 幫助 + + + + <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. + <b><u>警告</u></b><br>一般來說CPU類型將會根據固件文件自動選擇<br>如果你更改CPU類型, EEPROM可能會不兼容. + + + + joystickDialog + + + + + + + + + + + + Configure Joystick + 配置遊戲桿 + + + + + + + + + + + + + Ch2 + 遊戲桿通道2 + + + + + + + + + + + + + Ch1 + 遊戲桿通道1 + + + + + + + + + + + + + Ch4 + 遊戲桿通道4 + + + + + + + + + + + + + Ch6 + 遊戲桿通道6 + + + + + + + + + + + + + Ch3 + 遊戲桿通道3 + + + + + + + + + + + + + Ch5 + 遊戲桿通道5 + + + + + + + + + + + + + Ch7 + 遊戲桿通道7 + + + + + + + + + + + + + Ch8 + 遊戲桿通道8 + + + + + + + + + + + + + Instructions + 指令 + + + + + + + + + + + + + Enable + + + + + + + + + + + + + + Cancel + 取消 + + + + + + + + + + + + + Back + + + + + + + + + + + + + + Start + 開始通道 [CH] + + + + Next + 下一步 + + + + + + + + + + + + + Ok + 確定 + + + + Not Assigned + + + + + Stick + + + + + Knob/Slider %1 + + + + + No joysticks found + 找不到遊戲桿 + + + + Cannot open joystick. + 找不到遊戲桿. + + + + 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 + + + + + Place sticks and pots in middle position. +Press Next when done + + + + + Map joystick channels to controls using comboboxes. +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 without saving. + + + + + Calibration not complete, save anyway? + + + + + preferencesDialog + + + Preferences + 偏好設置 + + + + Simu BackLight + 模擬器背光 + + + + Simulator capture folder + 模擬器截圖保存目錄 + + + + Joystick + 遊戲桿 + + + + Remember simulator switches + + + + + Enable + 允许 + + + + Use clipboard only + 抓圖僅保存在剪貼板中 + + + + Calibrate + 校準 + + + + Blue + 藍色 + + + + Green + 绿色 + + + + Red + 红色 + + + + Orange + 橙色 + + + + Yellow + 黄色 + + + + + Open Folder + 打開文件夾 + + + + Personal splash library + 個人開機畫面庫 + + + + Include companion splashes + + + + + Only user defined splashes + 只顯示用戶自定義啟動畫面 + + + + Splash library behaviour + 開機圖片庫行為 + + + + Custom TX splash screen + 自定義遙控器開機畫面 + + + + Open Image + 打開圖片 + + + + + ... + + + + + Invert Pixels + 負片效果 + + + diff --git a/radio/src/audio.cpp b/radio/src/audio.cpp index ac7294877..3013fc449 100644 --- a/radio/src/audio.cpp +++ b/radio/src/audio.cpp @@ -518,8 +518,6 @@ AudioQueue::AudioQueue() #if !defined(SIMU) void audioTask(void * pdata) { - audioWaitReady(); - while (!audioQueue.started()) { RTOS_WAIT_TICKS(1); } diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index c63d21709..39354f3f8 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -214,7 +214,13 @@ enum ModuleIndex { }; #endif -#if defined(RADIO_FAMILY_T16) || (defined(RADIO_T12) && defined(INTERNAL_MODULE_MULTI)) || defined(ALLOW_TRAINER_MULTI) +#if defined(RADIO_T16) && !defined(INTERNAL_MODULE_MULTI) +#if defined(BLUETOOTH) + #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH +#else + #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE +#endif +#elif defined(INTERNAL_MODULE_MULTI) || defined(ALLOW_TRAINER_MULTI) #define TRAINER_MODE_MAX() TRAINER_MODE_MULTI #elif defined(BLUETOOTH) #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index dbdc09eb1..e8272de3c 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -165,8 +165,13 @@ void menuModelCurveOne(event_t event) } break; -#if defined(NAVIGATION_X7) - case EVT_KEY_LONG(KEY_MENU): +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_FIRST(KEY_MODEL): + pushMenu(menuChannelsView); + killEvents(event); + break; +#elif defined(NAVIGATION_X7) + case EVT_KEY_FIRST(KEY_MENU): pushMenu(menuChannelsView); killEvents(event); break; diff --git a/radio/src/gui/128x64/model_input_edit.cpp b/radio/src/gui/128x64/model_input_edit.cpp index 077d84cb3..f3208f194 100644 --- a/radio/src/gui/128x64/model_input_edit.cpp +++ b/radio/src/gui/128x64/model_input_edit.cpp @@ -49,8 +49,13 @@ enum ExposFields { void menuModelExpoOne(event_t event) { -#if defined(NAVIGATION_X7) - if (event == EVT_KEY_LONG(KEY_MENU)) { +#if defined(NAVIGATION_X7_TX12) + if (event == EVT_KEY_FIRST(KEY_MODEL)) { + pushMenu(menuChannelsView); + killEvents(event); + } +#elif defined(NAVIGATION_X7) + if (event == EVT_KEY_FIRST(KEY_MENU)) { pushMenu(menuChannelsView); killEvents(event); } diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp index a0168b0d7..f03e34a9c 100644 --- a/radio/src/gui/128x64/model_mix_edit.cpp +++ b/radio/src/gui/128x64/model_mix_edit.cpp @@ -85,8 +85,13 @@ void drawOffsetBar(uint8_t x, uint8_t y, MixData * md) void menuModelMixOne(event_t event) { -#if defined(NAVIGATION_X7) - if (event == EVT_KEY_LONG(KEY_MENU)) { +#if defined(NAVIGATION_X7_TX12) + if (event == EVT_KEY_FIRST(KEY_MODEL)) { + pushMenu(menuChannelsView); + killEvents(event); + } +#elif defined(NAVIGATION_X7) + if (event == EVT_KEY_FIRST(KEY_MENU)) { pushMenu(menuChannelsView); killEvents(event); } diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 24f2b39fc..c7e1a1313 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -203,7 +203,16 @@ void menuModelSelect(event_t event) } break; -#if defined(NAVIGATION_X7) +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_FIRST(KEY_PAGEUP): + chainMenu(menuTabModel[DIM(menuTabModel)-1]); + killEvents(event); + break; + + case EVT_KEY_FIRST(KEY_PAGEDN): + chainMenu(menuModelSetup); + break; +#elif defined(NAVIGATION_X7) case EVT_KEY_LONG(KEY_PAGE): chainMenu(menuTabModel[DIM(menuTabModel)-1]); killEvents(event); diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index 23f1e6230..49a749533 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -236,14 +236,7 @@ void menuModelTelemetry(event_t event) break; case ITEM_TELEMETRY_RSSI_LABEL: -#if defined(MULTIMODULE) - if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A || g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT)) - lcdDrawTextAlignedLeft(y, "RQly"); - else - lcdDrawTextAlignedLeft(y, "RSSI"); -#else - lcdDrawTextAlignedLeft(y, "RSSI"); -#endif + lcdDrawTextAlignedLeft(y, getRssiLabel()); break; case ITEM_TELEMETRY_RSSI_SOURCE: { diff --git a/radio/src/gui/128x64/view_about.cpp b/radio/src/gui/128x64/view_about.cpp index aaec50b32..02e8e4508 100644 --- a/radio/src/gui/128x64/view_about.cpp +++ b/radio/src/gui/128x64/view_about.cpp @@ -42,7 +42,10 @@ enum AboutScreens { #define ABOUT_X 2 #define ABOUT_INDENT 4 -#if defined(NAVIGATION_X7) +#if defined(NAVIGATION_X7_TX12) +#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP) +#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN) +#elif defined(NAVIGATION_X7) #define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE) #define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) #else diff --git a/radio/src/gui/128x64/view_channels.cpp b/radio/src/gui/128x64/view_channels.cpp index ccd8fc9b3..f71d833c1 100644 --- a/radio/src/gui/128x64/view_channels.cpp +++ b/radio/src/gui/128x64/view_channels.cpp @@ -26,7 +26,12 @@ constexpr coord_t CHANNEL_GAUGE_OFFSET = CHANNEL_VALUE_OFFSET; constexpr coord_t CHANNEL_BAR_WIDTH = 70; constexpr coord_t CHANNEL_PROPERTIES_OFFSET = CHANNEL_GAUGE_OFFSET + CHANNEL_BAR_WIDTH + 2; -#if defined(NAVIGATION_X7) +#if defined(NAVIGATION_X7_TX12) +#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP) +#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN) +#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT +#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT +#elif defined(NAVIGATION_X7) #define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE) #define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) #define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT @@ -54,7 +59,7 @@ void menuChannelsViewCommon(event_t event) memclear(&reusableBuffer.viewChannels, sizeof(reusableBuffer.viewChannels)); break; - case EVT_KEY_FIRST(KEY_ENTER): + case EVT_KEY_BREAK(KEY_ENTER): reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView; break; } diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index f90474ad8..111c6bee7 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -286,7 +286,16 @@ void displayVoltageOrAlarm() #define displayVoltageOrAlarm() displayBattVoltage() #endif -#if defined(NAVIGATION_X7) || defined(NAVIGATION_TBS) +#if defined(NAVIGATION_X7_TX12) +#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER) +#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_FIRST(KEY_PAGEUP) +#define EVT_KEY_NEXT_VIEW EVT_KEY_FIRST(KEY_PAGEDN) +#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT +#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT +#define EVT_KEY_MODEL_MENU EVT_KEY_LONG(KEY_MODEL) +#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_SYS) +#define EVT_KEY_TELEMETRY EVT_KEY_FIRST(KEY_TELE) +#elif defined(NAVIGATION_X7) || defined(NAVIGATION_TBS) #define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER) #define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) #define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT diff --git a/radio/src/gui/128x64/view_statistics.cpp b/radio/src/gui/128x64/view_statistics.cpp index 2296e93b0..2b46be36e 100644 --- a/radio/src/gui/128x64/view_statistics.cpp +++ b/radio/src/gui/128x64/view_statistics.cpp @@ -31,14 +31,21 @@ void menuStatisticsView(event_t event) switch (event) { case EVT_KEY_FIRST(KEY_UP): -#if defined(NAVIGATION_X7) +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_BREAK(KEY_PAGEDN): +#elif defined(NAVIGATION_X7) case EVT_KEY_BREAK(KEY_PAGE): #endif + chainMenu(menuStatisticsDebug); break; case EVT_KEY_FIRST(KEY_DOWN): -#if defined(NAVIGATION_X7) +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_BREAK(KEY_PAGEUP): + killEvents(event); + chainMenu(menuStatisticsDebug2); +#elif defined(NAVIGATION_X7) case EVT_KEY_LONG(KEY_PAGE): killEvents(event); chainMenu(menuStatisticsDebug2); @@ -133,7 +140,12 @@ void menuStatisticsDebug(event_t event) break; case EVT_KEY_FIRST(KEY_UP): -#if defined(NAVIGATION_X7) +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_BREAK(KEY_PAGEDN): + disableVBatBridge(); + chainMenu(menuStatisticsDebug2); + break; +#elif defined(NAVIGATION_X7) case EVT_KEY_BREAK(KEY_PAGE): disableVBatBridge(); chainMenu(menuStatisticsDebug2); @@ -141,7 +153,9 @@ void menuStatisticsDebug(event_t event) #endif case EVT_KEY_FIRST(KEY_DOWN): -#if defined(NAVIGATION_X7) +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_BREAK(KEY_PAGEUP): +#elif defined(NAVIGATION_X7) case EVT_KEY_LONG(KEY_PAGE): #endif killEvents(event); @@ -264,14 +278,18 @@ void menuStatisticsDebug2(event_t event) break; case EVT_KEY_FIRST(KEY_UP): -#if defined(NAVIGATION_X7) +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_BREAK(KEY_PAGEDN): +#elif defined(NAVIGATION_X7) case EVT_KEY_BREAK(KEY_PAGE): #endif chainMenu(menuStatisticsView); return; case EVT_KEY_FIRST(KEY_DOWN): -#if defined(NAVIGATION_X7) +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_BREAK(KEY_PAGEUP): +#elif defined(NAVIGATION_X7) case EVT_KEY_LONG(KEY_PAGE): #endif killEvents(event); diff --git a/radio/src/gui/212x64/model_telemetry.cpp b/radio/src/gui/212x64/model_telemetry.cpp index fc35f0024..3d4ef894a 100644 --- a/radio/src/gui/212x64/model_telemetry.cpp +++ b/radio/src/gui/212x64/model_telemetry.cpp @@ -227,14 +227,7 @@ void menuModelTelemetry(event_t event) break; case ITEM_TELEMETRY_RSSI_LABEL: -#if defined(MULTIMODULE) - if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A || g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT)) - lcdDrawTextAlignedLeft(y, "RQly"); - else - lcdDrawTextAlignedLeft(y, "RSSI"); -#else - lcdDrawTextAlignedLeft(y, "RSSI"); -#endif + lcdDrawTextAlignedLeft(y, getRssiLabel()); break; case ITEM_TELEMETRY_RSSI_SOURCE: { diff --git a/radio/src/gui/colorlcd/model_telemetry.cpp b/radio/src/gui/colorlcd/model_telemetry.cpp index 14c999274..9c711c39d 100644 --- a/radio/src/gui/colorlcd/model_telemetry.cpp +++ b/radio/src/gui/colorlcd/model_telemetry.cpp @@ -393,11 +393,7 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex) this->window = window; // RSSI - if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && - g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) - new Subtitle(window, grid.getLineSlot(), "RSNR"); - else - new Subtitle(window, grid.getLineSlot(), "RSSI"); + new Subtitle(window, grid.getLineSlot(), getRssiLabel()); grid.nextLine(); new StaticText(window, grid.getLabelSlot(true), STR_LOWALARM); diff --git a/radio/src/gui/common/stdlcd/model_mixes.cpp b/radio/src/gui/common/stdlcd/model_mixes.cpp index d5324e509..103083486 100644 --- a/radio/src/gui/common/stdlcd/model_mixes.cpp +++ b/radio/src/gui/common/stdlcd/model_mixes.cpp @@ -479,6 +479,13 @@ void menuModelMixAll(event_t event) s_currCh = ch; if (!s_copyMode) { attr = INVERS; + displayHeaderChannelName(ch - 1); +#if LCD_W >= 212 + if (g_model.limitData[ch - 1].name[0] != '\0') { + coord_t xPos = MIX_HDR_GAUGE_POS_X - FWNUM * 5 - 50; + lcdDrawFilledRect(lcdNextPos, 0, lcdNextPos - xPos, MENU_HEADER_HEIGHT, SOLID, FILL_WHITE | GREY_DEFAULT); + } +#endif } } if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index caedaa074..eb90a4705 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -262,6 +262,8 @@ void onHardwareAntennaSwitchConfirm(const char * result) #define SWITCH_TYPE_MAX(sw) (SWITCH_3POS) #elif defined(PCBX9E) #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) +#elif defined(RADIO_TX12) + #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) #else #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH <= sw) ? SWITCH_2POS : SWITCH_3POS) #endif diff --git a/radio/src/gui/common/stdlcd/view_telemetry.cpp b/radio/src/gui/common/stdlcd/view_telemetry.cpp index 61b506269..d4b2bac0b 100644 --- a/radio/src/gui/common/stdlcd/view_telemetry.cpp +++ b/radio/src/gui/common/stdlcd/view_telemetry.cpp @@ -34,6 +34,9 @@ enum NavigationDirection { #if defined(NAVIGATION_XLITE) #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && IS_SHIFT_PRESSED()) #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && IS_SHIFT_PRESSED()) +#elif defined(NAVIGATION_X7_TX12) + #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_UP)) + #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_DOWN)) #elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_PAGE)) #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_BREAK(KEY_PAGE)) diff --git a/radio/src/gui/navigation/navigation_x7.cpp b/radio/src/gui/navigation/navigation_x7.cpp index bc835a375..ac4a4bbdd 100644 --- a/radio/src/gui/navigation/navigation_x7.cpp +++ b/radio/src/gui/navigation/navigation_x7.cpp @@ -217,7 +217,11 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t if (menuTab) { int cc = curr; switch (event) { +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_FIRST(KEY_PAGEUP): +#else case EVT_KEY_LONG(KEY_PAGE): +#endif if (s_editMode>0) break; @@ -228,7 +232,11 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t killEvents(event); break; +#if defined(NAVIGATION_X7_TX12) + case EVT_KEY_FIRST(KEY_PAGEDN): +#else case EVT_KEY_BREAK(KEY_PAGE): +#endif if (s_editMode>0) break; diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt index eb31f6b36..afd583ab2 100644 --- a/radio/src/lua/CMakeLists.txt +++ b/radio/src/lua/CMakeLists.txt @@ -28,5 +28,6 @@ if(PYTHONINTERP_FOUND) 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(tx12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12) 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 6ade36501..2e8a22f95 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -40,6 +40,8 @@ #include "lua/lua_exports_x7.inc" #elif defined(RADIO_T12) #include "lua/lua_exports_t12.inc" +#elif defined(RADIO_TX12) + #include "lua/lua_exports_tx12.inc" #elif defined(PCBX9LITES) #include "lua/lua_exports_x9lites.inc" #elif defined(PCBX9LITE) @@ -1788,7 +1790,9 @@ const luaR_value_entry opentxConstants[] = { #endif #if !defined(PCBXLITE) && !defined(PCBX9LITE) { "MIXSRC_SF", MIXSRC_SF }, +#if !defined(RADIO_TX12) { "MIXSRC_SH", MIXSRC_SH }, +#endif #endif { "MIXSRC_CH1", MIXSRC_CH1 }, { "SWSRC_LAST", SWSRC_LAST_LOGICAL_SWITCH }, @@ -1876,10 +1880,17 @@ const luaR_value_entry opentxConstants[] = { { "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) }, { "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) }, #elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) +#if defined(RADIO_TX12) + { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_BREAK(KEY_PAGEUP) }, + { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGEDN) }, + { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MODEL) }, + { "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_MODEL) }, +#else { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_PAGE) }, { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGE) }, { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MENU) }, { "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_MENU) }, +#endif { "EVT_VIRTUAL_ENTER", EVT_KEY_BREAK(KEY_ENTER) }, { "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) }, { "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) }, diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 7161c48a8..fe84d0bbd 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -553,6 +553,8 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim); #define ROTARY_ENCODER_GRANULARITY (2 << g_eeGeneral.rotarySteps) #elif defined(RADIO_FAMILY_T16) && !defined(RADIO_T18) #define ROTARY_ENCODER_GRANULARITY (1) +#elif defined(RADIO_TX12) + #define ROTARY_ENCODER_GRANULARITY (1) #else #define ROTARY_ENCODER_GRANULARITY (2) #endif diff --git a/radio/src/pulses/ghost.cpp b/radio/src/pulses/ghost.cpp index 478202b57..03f098fe2 100755 --- a/radio/src/pulses/ghost.cpp +++ b/radio/src/pulses/ghost.cpp @@ -52,7 +52,7 @@ uint8_t createGhostChannelsFrame(uint8_t * frame, int16_t * pulses) uint32_t bits = 0; uint8_t bitsavailable = 0; for (int i = 0; i < 4; i++) { - uint32_t value = limit(0, GHST_RC_CTR_VAL_12BIT + (((pulses[i]) << 3) / 5), 2 * GHST_RC_CTR_VAL_12BIT); + uint32_t value = limit(0, GHST_RC_CTR_VAL_12BIT + (((pulses[i] + 2 * PPM_CH_CENTER(i) - 2 * PPM_CENTER) << 3) / 5), 2 * GHST_RC_CTR_VAL_12BIT); bits |= value << bitsavailable; bitsavailable += GHST_CH_BITS_12; while (bitsavailable >= 8) { @@ -64,7 +64,8 @@ uint8_t createGhostChannelsFrame(uint8_t * frame, int16_t * pulses) // second 4 lower speed, 8 bit channels for (int i = 4; i < 8; ++i) { - *buf++ = limit(0, GHST_RC_CTR_VAL_8BIT + (((pulses[i + ghostUpper4Offset]) >> 1) / 5), 2 * GHST_RC_CTR_VAL_8BIT); + uint8_t channelIndex = i + ghostUpper4Offset; + *buf++ = limit(0, GHST_RC_CTR_VAL_8BIT + (((pulses[channelIndex] + 2 * PPM_CH_CENTER(channelIndex) - 2 * PPM_CENTER) >> 1) / 5), 2 * GHST_RC_CTR_VAL_8BIT); } *buf++ = crc8(crc_start, GHST_UL_RC_CHANS_SIZE - 1); diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index ee2b1157a..da72601e9 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -715,4 +715,20 @@ inline void getMultiOptionValues(int8_t multi_proto, int8_t & min, int8_t & max) } #endif +inline const char * getRssiLabel() +{ +#if defined(MULTIMODULE) + if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A + || g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT)) { + return "RQly"; + } +#endif +#if defined(GHOST) + if (telemetryProtocol == PROTOCOL_TELEMETRY_GHOST) { + return "RQly"; + } +#endif + return "RSSI"; +} + #endif // _MODULES_HELPERS_H_ diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 6f390068e..d13ef205f 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -144,6 +144,8 @@ const char * getBasename(const char * path); #define OTX_FOURCC 0x3978746F // otx for Taranis X-Lite #elif defined(RADIO_T12) #define OTX_FOURCC 0x3D78746F // otx for Jumper T12 +#elif defined(RADIO_TX12) + #define OTX_FOURCC 0x4178746F // otx for Radiomaster TX12 #elif defined(PCBX7) #define OTX_FOURCC 0x3678746F // otx for Taranis X7 / X7S / X7 Express / X7S Express #elif defined(PCBX9LITES) diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 9e18ef0f9..613f6a53c 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -334,6 +334,14 @@ void OpenTxSim::updateKeysAndSwitches(bool start) KEY_Left, KEY_LEFT, KEY_Up, KEY_UP, KEY_Down, KEY_DOWN, +#elif defined(RADIO_TX12) + KEY_Page_Up, KEY_PAGEUP, + KEY_Page_Down, KEY_PAGEDN, + KEY_Return, KEY_ENTER, + KEY_Up, KEY_MODEL, + KEY_Down, KEY_EXIT, + KEY_Right, KEY_TELE, + KEY_Left, KEY_SYS, #elif defined(PCBTARANIS) KEY_Page_Up, KEY_MENU, #if defined(KEYS_GPIO_REG_PAGE) diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index 81af2c299..0bf0f3b25 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -51,8 +51,9 @@ void preModelLoad() if (pulsesStarted()) { pausePulses(); } - pauseMixerCalculations(); + + stopTrainer(); } void postRadioSettingsLoad() diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index 3667ec077..4694ab849 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -313,7 +313,7 @@ char * getSwitchName(char * dest, swsrc_t idx) } else { *dest++ = 'S'; -#if defined(PCBX7) +#if defined(PCBX7) && !defined(RADIO_TX12) if (swinfo.quot >= 5) *dest++ = 'H' + swinfo.quot - 5; else if (swinfo.quot == 4) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 8657b9b8c..06b14f7a7 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -126,9 +126,15 @@ uint64_t check3PosSwitchPosition(uint8_t idx, uint8_t sw, bool startup) void getSwitchesPosition(bool startup) { uint64_t newPos = 0; +#if defined(RADIO_TX12) + CHECK_2POS(SW_SA); + CHECK_3POS(0, SW_SB); + CHECK_3POS(1, SW_SC); +#else CHECK_3POS(0, SW_SA); CHECK_3POS(1, SW_SB); CHECK_3POS(2, SW_SC); +#endif #if defined(PCBX9LITES) CHECK_2POS(SW_SD); @@ -146,6 +152,10 @@ void getSwitchesPosition(bool startup) #elif defined(PCBXLITE) CHECK_3POS(3, SW_SD); // no SWE, SWF, SWG and SWH on XLITE +#elif defined(RADIO_TX12) + CHECK_2POS(SW_SD); + CHECK_3POS(2, SW_SE); + CHECK_3POS(3, SW_SF); #elif defined(PCBX7) CHECK_3POS(3, SW_SD); CHECK_2POS(SW_SF); diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 62eb5a7eb..c6f5ee182 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -44,6 +44,8 @@ const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,-1, 1,1, 1, 1}; #elif defined(PCBX9D) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1, 1}; +#elif defined(RADIO_TX12) + const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, -1,-1, 1, 1}; #elif defined(PCBX7) const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1, 1}; #elif defined(PCBX9LITE) diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 17a18dbcc..4896f90c1 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -95,7 +95,7 @@ if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X9 ) endif() -if(PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) +if(BLUETOOTH) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../../../../../targets/common/arm/stm32/bluetooth_driver.cpp diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index 83a07d9d2..cf63d3f2e 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -247,7 +247,7 @@ int main() backlightInit(); backlightEnable(); -#if defined(PCBX7) || defined(PCBXLITE) +#if defined(BLUETOOTH) // we shutdown the bluetooth module now to be sure it will be detected on firmware start bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, false); #endif diff --git a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp index 00b3c76f8..570e134b1 100644 --- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp +++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp @@ -71,7 +71,7 @@ void rotaryEncoderInit() void rotaryEncoderCheck() { -#if defined(RADIO_FAMILY_T16) && !defined(RADIO_T18) +#if (defined(RADIO_FAMILY_T16) && !defined(RADIO_T18)) || defined(RADIO_TX12) static uint8_t state = 0; uint8_t pins = ROTARY_ENCODER_POSITION(); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 3122c130c..6d240c126 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -576,9 +576,9 @@ void usbJoystickUpdate(); #define USB_MANUFACTURER 'J', 'u', 'm', 'p', 'e', 'r', ' ', ' ' /* 8 bytes */ #define USB_PRODUCT 'T', '1', '8', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */ #elif defined(RADIO_TX16S) - #define USB_NAME "RadioMas TX16S" - #define USB_MANUFACTURER 'R', 'a', 'd', 'i', 'o', 'M', 'a', 's' /* 8 bytes */ - #define USB_PRODUCT 'T', 'X', '1', '6', 'S', ' ', ' ', ' ' /* 8 Bytes */ + #define USB_NAME "RM TX16S" + #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */ + #define USB_PRODUCT 'R', 'M', ' ', 'T', 'X', '1', '6', 'S' /* 8 Bytes */ #elif defined(PCBX10) #define USB_NAME "FrSky X10" #define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ @@ -596,7 +596,6 @@ void audioConsumeCurrentBuffer(); #define audioEnableIrq() // interrupts must stay enabled on Horus #if defined(PCBX12S) #define setSampleRate(freq) -void audioWaitReady(); #else void setSampleRate(uint32_t frequency); #define audioWaitReady() diff --git a/radio/src/targets/nv14/board.h b/radio/src/targets/nv14/board.h index d08e002b3..db90d841d 100644 --- a/radio/src/targets/nv14/board.h +++ b/radio/src/targets/nv14/board.h @@ -443,7 +443,6 @@ void audioOn(); void audioOff(); bool isAudioReady(); bool audioChipReset(); -void audioWaitReady(); #define SPI_SPEED_2 0 #define SPI_SPEED_4 1 diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index a5ef72185..51c24d920 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -130,6 +130,18 @@ elseif(PCB STREQUAL X7) set(LUA_EXPORT lua_export_t12) add_definitions(-DRADIO_T12) add_definitions(-DEEPROM_VARIANT=0x4001) + elseif(PCBREV STREQUAL TX12) + option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) + set(FLAVOUR tx12) + 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(ROTARY_ENCODER YES) + set(LUA_EXPORT lua_export_tx12) + set(BLUETOOTH NO) + add_definitions(-DRADIO_TX12) + add_definitions(-DEEPROM_VARIANT=0x4002) elseif(PCBREV STREQUAL ACCESS) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) @@ -308,7 +320,7 @@ if(INTERNAL_MODULE_SERIAL) ${TARGET_SRC} ../common/arm/stm32/intmodule_serial_driver.cpp ) -elseif(NOT (PCB STREQUAL X7 AND PCBREV STREQUAL T12)) +elseif(INTERNAL_MODULE_PXX1 OR INTERNAL_MODULE_PXX2) set(TARGET_SRC ${TARGET_SRC} intmodule_pulses_driver.cpp diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 521ab1d9b..b038fc0f7 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -265,10 +265,16 @@ void boardOff() // this function must not return! } +#if defined (RADIO_TX12) + #define BATTERY_DIVIDER 22830 +#else + #define BATTERY_DIVIDER 26214 +#endif + uint16_t getBatteryVoltage() { int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose - instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration) ) / 26214; + instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration) ) / BATTERY_DIVIDER; instant_vbat += 20; // add 0.2V because of the diode TODO check if this is needed, but removal will break existing calibrations! return (uint16_t)instant_vbat; } diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 0ac977e57..d9092fcdc 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -24,8 +24,12 @@ #include #include "definitions.h" #include "opentx_constants.h" -#include "hal.h" #include "board_common.h" +#include "hal.h" + +#if defined(RADIO_TX12) + #define NAVIGATION_X7_TX12 +#endif #if defined(ROTARY_ENCODER_NAVIGATION) // Rotary Encoder driver @@ -238,6 +242,26 @@ enum EnumKeys KEY_PAGE, #endif +#if defined(KEYS_GPIO_REG_PAGEUP) + KEY_PAGEUP, +#endif + +#if defined(KEYS_GPIO_REG_PAGEDN) + KEY_PAGEDN, +#endif + +#if defined(KEYS_GPIO_REG_SYS) + KEY_SYS, +#endif + +#if defined(KEYS_GPIO_REG_MDL) + KEY_MODEL, +#endif + +#if defined(KEYS_GPIO_REG_TELE) + KEY_TELE, +#endif + #if defined(KEYS_GPIO_REG_PLUS) KEY_PLUS, KEY_MINUS, @@ -307,8 +331,11 @@ enum EnumSwitches SW_SG, SW_SH }; -#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH) - +#if defined(RADIO_TX12) + #define IS_3POS(x) ((x) != SW_SA && (x) != SW_SD) +#else + #define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH) +#endif enum EnumSwitchesPositions { SW_SA0, @@ -323,7 +350,7 @@ enum EnumSwitchesPositions SW_SD0, SW_SD1, SW_SD2, -#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES) +#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_TX12) SW_SE0, SW_SE1, SW_SE2, @@ -338,7 +365,7 @@ enum EnumSwitchesPositions SW_SG1, SW_SG2, #endif -#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7) +#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_TX12)) SW_SH0, SW_SH1, SW_SH2, @@ -410,6 +437,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(RADIO_TX12) + #define NUM_SWITCHES 8 + #define STORAGE_NUM_SWITCHES NUM_SWITCHES + #define DEFAULT_SWITCH_CONFIG (SWITCH_3POS << 10) + (SWITCH_3POS << 8) + (SWITCH_TOGGLE << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_TOGGLE << 0) + #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); #elif defined(PCBX7ACCESS) #define NUM_SWITCHES 7 #define STORAGE_NUM_SWITCHES 8 @@ -434,8 +466,8 @@ enum EnumSwitchesPositions #define NUM_SWITCHES 18 // yes, it's perfect like that ! #define STORAGE_NUM_SWITCHES NUM_SWITCHES #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) + #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent + #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) #elif defined(RADIO_X9DP2019) #define NUM_SWITCHES 9 #define STORAGE_NUM_SWITCHES NUM_SWITCHES @@ -674,9 +706,15 @@ uint8_t isBacklightEnabled(); #if !defined(SIMU) void usbJoystickUpdate(); #endif -#define USB_NAME "FrSky Taranis" -#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ -#define USB_PRODUCT 'T', 'a', 'r', 'a', 'n', 'i', 's', ' ' /* 8 Bytes */ +#if defined(RADIO_TX12) + #define USB_NAME "Radiomaster TX12" + #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */ + #define USB_PRODUCT 'R', 'M', ' ', 'T', 'X', '1', '2', ' ' /* 8 Bytes */ +#else + #define USB_NAME "FrSky Taranis" + #define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ + #define USB_PRODUCT 'T', 'a', 'r', 'a', 'n', 'i', 's', ' ' /* 8 Bytes */ +#endif #if defined(__cplusplus) && !defined(SIMU) } @@ -744,7 +782,6 @@ void audioEnd() ; void dacStart(); void dacStop(); void setSampleRate(uint32_t frequency); -#define audioWaitReady() #define VOLUME_LEVEL_MAX 23 #define VOLUME_LEVEL_DEF 12 #if !defined(SOFTWARE_VOLUME) @@ -848,7 +885,11 @@ void ledBlue(); #define IS_LCD_RESET_NEEDED() true #define LCD_CONTRAST_MIN 10 #define LCD_CONTRAST_MAX 30 -#define LCD_CONTRAST_DEFAULT 15 +#if defined(RADIO_TX12) + #define LCD_CONTRAST_DEFAULT 21 +#else + #define LCD_CONTRAST_DEFAULT 15 +#endif #endif #if defined(PCBX9D) || defined(PCBX9E) || (defined(PCBX9DP) && PCBREV < 2019) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 41d9ef1bf..eb6880d09 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -65,6 +65,21 @@ #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_TX12) + #define KEYS_GPIO_REG_PAGEUP GPIOD->IDR + #define KEYS_GPIO_PIN_PAGEUP GPIO_Pin_3 // PD.03 + #define KEYS_GPIO_REG_PAGEDN GPIOD->IDR + #define KEYS_GPIO_PIN_PAGEDN GPIO_Pin_7 // PD.07 + #define KEYS_GPIO_REG_EXIT GPIOB->IDR + #define KEYS_GPIO_PIN_EXIT GPIO_Pin_3 // PB.03 + #define KEYS_GPIO_REG_ENTER GPIOA->IDR + #define KEYS_GPIO_PIN_ENTER GPIO_Pin_13 // PA.13 + #define KEYS_GPIO_REG_SYS GPIOB->IDR + #define KEYS_GPIO_PIN_SYS GPIO_Pin_4 // PB.04 + #define KEYS_GPIO_REG_MDL GPIOE->IDR + #define KEYS_GPIO_PIN_MDL GPIO_Pin_11 // PE.11 + #define KEYS_GPIO_REG_TELE GPIOD->IDR + #define KEYS_GPIO_PIN_TELE GPIO_Pin_2 // PD.02 #elif defined(PCBX7) #define KEYS_GPIO_REG_PAGE GPIOD->IDR #define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 @@ -162,7 +177,23 @@ #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10 #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource12 +#elif defined(RADIO_TX12) + #define ROTARY_ENCODER_NAVIGATION + #define ROTARY_ENCODER_GPIO GPIOE + #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.9 + #define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_10 // PE.10 + #define ROTARY_ENCODER_POSITION() ((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x03) + #define ROTARY_ENCODER_EXTI_LINE1 EXTI_Line9 + #define ROTARY_ENCODER_EXTI_LINE2 EXTI_Line10 + #define ROTARY_ENCODER_EXTI_IRQn1 EXTI9_5_IRQn + #define ROTARY_ENCODER_EXTI_IRQHandler1 EXTI9_5_IRQHandler + #define ROTARY_ENCODER_EXTI_IRQn2 EXTI15_10_IRQn + #define ROTARY_ENCODER_EXTI_IRQHandler2 EXTI15_10_IRQHandler + #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE + #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource9 + #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource10 #endif + #if defined(ROTARY_ENCODER_NAVIGATION) #define ROTARY_ENCODER_RCC_APB1Periph RCC_APB1Periph_TIM5 #define ROTARY_ENCODER_TIMER TIM5 @@ -302,6 +333,11 @@ #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_1 // PE.01 #define SWITCHES_GPIO_REG_A_L GPIOE->IDR #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00 +#elif defined(RADIO_TX12) + #define STORAGE_SWITCH_A + #define HARDWARE_SWITCH_A + #define SWITCHES_GPIO_REG_A GPIOC->IDR + #define SWITCHES_GPIO_PIN_A GPIO_Pin_13 // PC.13 #elif defined(PCBX7) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A @@ -369,6 +405,13 @@ #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02 #define SWITCHES_GPIO_REG_C_H GPIOE->IDR #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_3 // PE.03 +#elif defined(RADIO_TX12) + #define STORAGE_SWITCH_C + #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 #elif defined(PCBX7) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C @@ -411,6 +454,11 @@ #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_4 // PB.04 #define SWITCHES_GPIO_REG_D_H GPIOB->IDR #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_5 // PB.05 +#elif defined(RADIO_TX12) + #define STORAGE_SWITCH_D + #define HARDWARE_SWITCH_D + #define SWITCHES_GPIO_REG_D GPIOE->IDR + #define SWITCHES_GPIO_PIN_D GPIO_Pin_8 // PE.08 #elif defined(PCBX7) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D @@ -452,6 +500,13 @@ #define HARDWARE_SWITCH_E #define SWITCHES_GPIO_REG_E GPIOA->IDR #define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PA.05 +#elif defined(RADIO_TX12) + #define STORAGE_SWITCH_E + #define HARDWARE_SWITCH_E + #define SWITCHES_GPIO_REG_E_H GPIOE->IDR + #define SWITCHES_GPIO_PIN_E_H GPIO_Pin_13 // PE.13 + #define SWITCHES_GPIO_REG_E_L GPIOE->IDR + #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_7 // PE.07 #elif defined(PCBX7) // no SWE #else @@ -483,6 +538,13 @@ #define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03 #elif defined(PCBX9LITE) // no SWF +#elif defined(RADIO_TX12) + #define STORAGE_SWITCH_F + #define HARDWARE_SWITCH_F + #define SWITCHES_GPIO_REG_F_L GPIOE->IDR + #define SWITCHES_GPIO_PIN_F_L GPIO_Pin_1 // PE.01 + #define SWITCHES_GPIO_REG_F_H GPIOE->IDR + #define SWITCHES_GPIO_PIN_F_H GPIO_Pin_2 // PE.02 #elif defined(PCBX7) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F @@ -530,6 +592,7 @@ #define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14 #elif defined(PCBXLITE) || defined(PCBX9LITE) // no SWH +#elif defined(RADIO_TX12) #elif defined(PCBX7) #define STORAGE_SWITCH_H #define HARDWARE_SWITCH_H @@ -558,7 +621,16 @@ #define SWITCHES_GPIO_REG_I GPIOC->IDR #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13 #define STORAGE_SWITCH_J -#elif defined(PCBX7) +#elif defined(RADIO_TX12) + #define STORAGE_SWITCH_I + #define HARDWARE_SWITCH_I + #define SWITCHES_GPIO_REG_I GPIOE->IDR + #define SWITCHES_GPIO_PIN_I GPIO_Pin_14 // PE.14 + #define STORAGE_SWITCH_J + #define HARDWARE_SWITCH_J + #define SWITCHES_GPIO_REG_J GPIOD->IDR + #define SWITCHES_GPIO_PIN_J GPIO_Pin_14 // PD.14 +#elif defined(PCBX7) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I #define SWITCHES_GPIO_REG_I GPIOC->IDR @@ -668,11 +740,18 @@ #define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_5) #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14) #elif defined(RADIO_T12) - #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) + #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) #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_TX12) + #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_13 | GPIO_Pin_5) + #define KEYS_GPIOB_PINS (GPIO_Pin_3 | GPIO_Pin_4) + #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_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_8| 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 @@ -1079,8 +1158,10 @@ #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5 #define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) -#elif defined(RADIO_T12) +#elif defined(RADIO_T12) || defined(RADIO_TX12) #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) + #define INTMODULE_RCC_APB1Periph (RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2) + #define INTMODULE_RCC_APB2Periph 0 #define INTMODULE_PWR_GPIO GPIOC #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // PC.06 #define INTMODULE_GPIO GPIOB @@ -1092,8 +1173,6 @@ #define INTMODULE_GPIO_AF GPIO_AF_USART3 #define INTMODULE_USART_IRQn USART3_IRQn #define INTMODULE_USART_IRQHandler USART3_IRQHandler - #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2 - #define INTMODULE_RCC_APB2Periph RCC_APB1Periph_USART3 #define INTMODULE_TIMER TIM2 #define INTMODULE_TIMER_IRQn TIM2_IRQn #define INTMODULE_TIMER_IRQHandler TIM2_IRQHandler @@ -1169,30 +1248,6 @@ #define EXTMODULE_USART_TX_DMA_STREAM DMA2_Stream6 #define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_5 #define EXTMODULE_USART_RX_DMA_STREAM DMA2_Stream1 -#elif defined(RADIO_T12) - //Jumper T12v2 external module configured - #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) - #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8 - #define EXTMODULE_PWR_GPIO GPIOD - #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // JUMPER EXT PD.08 // X7 EXT is PD.08 - #define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) - #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) - #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) - #define EXTMODULE_TX_GPIO GPIOA - #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 // JUMPER EXT PA.07 // X7 EXT is PA.07 - #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7 - #define EXTMODULE_TIMER TIM8 - #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N - #define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn - #define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler - #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 - #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 - #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn - #define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler - #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1 - #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(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) @@ -1217,22 +1272,22 @@ #define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC2NP #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #else - #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) - #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8 - #define EXTMODULE_PWR_GPIO GPIOD - #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 - #define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) - #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) - #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) - #define EXTMODULE_TX_GPIO GPIOA - #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 // PA.07 - #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7 - #define EXTMODULE_TIMER TIM8 - #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N - #define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn - #define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler - #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 // TIM8_UP - #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 // TIM8_UP + #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) + #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8 + #define EXTMODULE_PWR_GPIO GPIOD + #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 + #define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) + #define EXTMODULE_TX_GPIO GPIOA + #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 + #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7 // PA.07 + #define EXTMODULE_TIMER TIM8 + #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N + #define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn + #define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler + #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 + #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn #define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1 @@ -1376,7 +1431,7 @@ #define TELEMETRY_EXTI_IRQn EXTI9_5_IRQn #define TELEMETRY_EXTI_TRIGGER EXTI_Trigger_Rising -#if defined(RADIO_X7) || defined(RADIO_X7ACCESS) +#if defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TX12) #define TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER #elif defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) #define TELEMETRY_EXTI_IRQHandler EXTI9_5_IRQHandler @@ -1389,7 +1444,7 @@ #define TELEMETRY_TIMER_IRQHandler TIM1_TRG_COM_TIM11_IRQHandler // PCBREV -#if defined(PCBX7) +#if defined(RADIO_X7) #define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define PCBREV_GPIO GPIOA #define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14 @@ -1472,7 +1527,7 @@ #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) +#elif defined(RADIO_X7) || defined(RADIO_TX12) #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC @@ -1657,6 +1712,9 @@ #define KEYS_BACKLIGHT_RCC_AHB1Periph 0 // LCD driver +#if defined(RADIO_TX12) || defined(RADIO_T12) + #define LCD_VERTICAL_INVERT +#endif #if defined(PCBX9E) #define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3 @@ -1849,6 +1907,12 @@ #define AUDIO_SPEAKER_ENABLE_GPIO_PIN GPIO_Pin_14 // PD.14 #define HEADPHONE_TRAINER_SWITCH_GPIO GPIOD #define HEADPHONE_TRAINER_SWITCH_GPIO_PIN GPIO_Pin_9 // PD.09 +#elif defined(RADIO_TX12) + #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1) + #define AUDIO_MUTE_GPIO GPIOE + #define AUDIO_MUTE_GPIO_PIN GPIO_Pin_12 // PE.12 + #define AUDIO_UNMUTE_DELAY 150 // ms + #define AUDIO_MUTE_DELAY 500 // ms #else #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1) #endif @@ -1937,7 +2001,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(RADIO_X9DP2019) +#elif defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(PCBXLITE) || defined(PCBX9LITES) || defined(RADIO_X9DP2019) #define STORAGE_BLUETOOTH #define BT_RCC_APB1Periph RCC_APB1Periph_USART3 #define BT_RCC_APB2Periph 0 @@ -1969,7 +2033,7 @@ #define BT_USART_IRQn USART3_IRQn // #define BT_DMA_Stream_RX DMA1_Stream1 // #define BT_DMA_Channel_RX DMA_Channel_4 -#elif defined(PCBX9D) || defined(PCBX9DP) +#elif defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_T12) || defined(RADIO_TX12) #define STORAGE_BLUETOOTH #define BT_RCC_AHB1Periph 0 #define BT_RCC_APB1Periph 0 diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index 0699a1c50..6883740c4 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -37,6 +37,31 @@ uint32_t readKeys() result |= 1 << KEY_PAGE; #endif +#if defined(KEYS_GPIO_PIN_PAGEUP) + if (~KEYS_GPIO_REG_PAGEUP & KEYS_GPIO_PIN_PAGEUP) + result |= 1 << KEY_PAGEUP; +#endif + +#if defined(KEYS_GPIO_PIN_PAGEDN) + if (~KEYS_GPIO_REG_PAGEDN & KEYS_GPIO_PIN_PAGEDN) + result |= 1 << KEY_PAGEDN; +#endif + +#if defined(KEYS_GPIO_PIN_SYS) + if (~KEYS_GPIO_REG_SYS & KEYS_GPIO_PIN_SYS) + result |= 1 << KEY_SYS; +#endif + +#if defined(KEYS_GPIO_PIN_MDL) + if (~KEYS_GPIO_REG_MDL & KEYS_GPIO_PIN_MDL) + result |= 1 << KEY_MODEL; +#endif + +#if defined(KEYS_GPIO_PIN_TELE) + if (~KEYS_GPIO_REG_TELE & KEYS_GPIO_PIN_TELE) + result |= 1 << KEY_TELE; +#endif + if (~KEYS_GPIO_REG_EXIT & KEYS_GPIO_PIN_EXIT) result |= 1 << KEY_EXIT; @@ -115,7 +140,7 @@ void readKeysAndTrims() { uint8_t index = 0; uint32_t keys_input = readKeys(); - for (uint8_t i = 1; i != uint8_t(1 << TRM_BASE); i <<= 1) { + for (unsigned i = 1; i != unsigned(1 << TRM_BASE); i <<= 1) { keys[index++].input(keys_input & i); } @@ -175,10 +200,15 @@ uint32_t switchState(uint8_t index) uint32_t xxx = 0; switch (index) { +#if defined(RADIO_TX12) + ADD_2POS_CASE(A); + ADD_3POS_CASE(B, 1); + ADD_3POS_CASE(C, 2); +#else ADD_3POS_CASE(A, 0); ADD_3POS_CASE(B, 1); ADD_3POS_CASE(C, 2); - +#endif #if defined(PCBX9LITES) ADD_2POS_CASE(D); ADD_2POS_CASE(E); @@ -201,6 +231,10 @@ uint32_t switchState(uint8_t index) ADD_2POS_CASE(H); ADD_2POS_CASE(I); // no SWJ on XLITE +#elif defined(RADIO_TX12) + ADD_2POS_CASE(D); + ADD_3POS_CASE(E, 4); + ADD_3POS_CASE(F, 5); #elif defined(PCBX7) ADD_3POS_CASE(D, 3); ADD_2POS_CASE(F); diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp index 6936ae85f..e1efa8e15 100644 --- a/radio/src/targets/taranis/lcd_driver_spi.cpp +++ b/radio/src/targets/taranis/lcd_driver_spi.cpp @@ -20,7 +20,7 @@ #include "opentx.h" -#if defined(RADIO_T12) +#if defined(RADIO_T12) || defined(RADIO_TX12) #define LCD_CONTRAST_OFFSET -10 #else #define LCD_CONTRAST_OFFSET 160 @@ -107,8 +107,8 @@ void lcdHardwareInit() #if LCD_W == 128 void lcdStart() { -#if defined(RADIO_T12) - // Jumper has the screen inverted. +#if defined(LCD_VERTICAL_INVERT) + // T12 and TX12 have the screen inverted. lcdWriteCommand(0xe2); // (14) Soft reset lcdWriteCommand(0xa0); // Set seg lcdWriteCommand(0xc8); // Set com @@ -201,7 +201,7 @@ void lcdRefresh(bool wait) for (uint8_t y=0; y < 8; y++, p+=LCD_W) { lcdWriteCommand(0x10); // Column addr 0 lcdWriteCommand(0xB0 | y); // Page addr y -#if !defined(RADIO_T12) +#if !defined(LCD_VERTICAL_INVERT) lcdWriteCommand(0x04); #endif diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index f0068232b..c16d6feca 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -122,8 +122,8 @@ void telemetryPortInvertedInit(uint32_t baudrate) probeTimeFromStartBit = 25; break; case 57600: - bitLength = 35; //34 was used before - I prefer to use use 35 because of lower error - probeTimeFromStartBit = 52; //round down - 48 used in original implementation + bitLength = 35; + probeTimeFromStartBit = 48; break; default: bitLength = 2000000/baudrate; //because of 0,5 us tick diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp index 265045130..b81a7487e 100644 --- a/radio/src/telemetry/crossfire.cpp +++ b/radio/src/telemetry/crossfire.cpp @@ -178,10 +178,9 @@ void processCrossfireTelemetryFrame() case FLIGHT_MODE_ID: { const CrossfireSensor & sensor = crossfireSensors[FLIGHT_MODE_INDEX]; - for (int i=0; i(16, telemetryRxBuffer[1]-2); i+=4) { - uint32_t value = *((uint32_t *)&telemetryRxBuffer[3+i]); - setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId, value, sensor.unit, i); - } + auto textLength = min(16, telemetryRxBuffer[1]); + telemetryRxBuffer[textLength] = '\0'; + setTelemetryText(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId, (const char *)telemetryRxBuffer + 3); break; } diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index 398c15961..e88807062 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -204,6 +204,7 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32 } } else if (unit == UNIT_TEXT) { + // Should be handled at telemetry protocol level return; } else { diff --git a/radio/src/telemetry/telemetry_sensors.h b/radio/src/telemetry/telemetry_sensors.h index e2fbcd498..8a44ae547 100644 --- a/radio/src/telemetry/telemetry_sensors.h +++ b/radio/src/telemetry/telemetry_sensors.h @@ -26,6 +26,7 @@ constexpr int8_t TELEMETRY_SENSOR_TIMEOUT_UNAVAILABLE = -2; constexpr int8_t TELEMETRY_SENSOR_TIMEOUT_OLD = -1; constexpr int8_t TELEMETRY_SENSOR_TIMEOUT_START = 125; // * 160ms = 20s +constexpr uint8_t TELEMETRY_SENSOR_TEXT_LENGTH = 16; class TelemetryItem { @@ -74,7 +75,7 @@ class TelemetryItem // pilot latitude is stored in max // distFromEarthAxis is stored in value } gps; - char text[16]; + char text[TELEMETRY_SENSOR_TEXT_LENGTH]; }; TelemetryItem() diff --git a/radio/src/trainer.cpp b/radio/src/trainer.cpp index 209af5d77..78b0ef60a 100644 --- a/radio/src/trainer.cpp +++ b/radio/src/trainer.cpp @@ -48,6 +48,11 @@ void checkTrainerSignalWarning() } #if defined(PCBSKY9X) +void stopTrainer() +{ + stop_trainer_capture(); +} + void checkTrainerSettings() { uint8_t requiredTrainerMode = SLAVE_MODE(); @@ -55,50 +60,59 @@ void checkTrainerSettings() if (requiredTrainerMode != currentTrainerMode) { currentTrainerMode = requiredTrainerMode; if (requiredTrainerMode) - stop_trainer_capture(); + stopTrainer(); else init_trainer_capture(); } } #else +void stopTrainer() +{ + switch (currentTrainerMode) { + case TRAINER_MODE_MASTER_TRAINER_JACK: + stop_trainer_capture(); + break; + + case TRAINER_MODE_SLAVE: + stop_trainer_ppm(); + break; + +#if defined(TRAINER_MODULE_CPPM) + case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: + stop_trainer_module_cppm(); + break; +#endif + +#if defined(TRAINER_MODULE_SBUS) + case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: + stop_trainer_module_sbus(); + break; +#endif + +#if defined(TRAINER_BATTERY_COMPARTMENT) + case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: +#if defined(AUX_SERIAL) + if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER) + auxSerialStop(); +#endif +#if defined(AUX2_SERIAL) + if (g_eeGeneral.aux2SerialMode == UART_MODE_SBUS_TRAINER) + aux2SerialStop(); +#endif + break; +#endif + } + + currentTrainerMode = 0xFF; +} + void checkTrainerSettings() { uint8_t requiredTrainerMode = g_model.trainerData.mode; if (requiredTrainerMode != currentTrainerMode) { - switch (currentTrainerMode) { - case TRAINER_MODE_MASTER_TRAINER_JACK: - stop_trainer_capture(); - break; - - case TRAINER_MODE_SLAVE: - stop_trainer_ppm(); - break; - -#if defined(TRAINER_MODULE_CPPM) - case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: - stop_trainer_module_cppm(); - break; -#endif - -#if defined(TRAINER_MODULE_SBUS) - case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: - stop_trainer_module_sbus(); - break; -#endif - -#if defined(HARDWARE_TRAINER_AUX_SERIAL) - case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: -#if defined(AUX_SERIAL) - if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER) - auxSerialStop(); -#endif -#if defined(AUX2_SERIAL) - if (g_eeGeneral.aux2SerialMode == UART_MODE_SBUS_TRAINER) - aux2SerialStop(); -#endif - break; -#endif + if (currentTrainerMode != 0xFF) { + stopTrainer(); } currentTrainerMode = requiredTrainerMode; @@ -120,7 +134,7 @@ void checkTrainerSettings() break; #endif -#if defined(HARDWARE_TRAINER_AUX_SERIAL) +#if defined(TRAINER_BATTERY_COMPARTMENT) case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: #if defined(AUX_SERIAL) if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER) diff --git a/radio/src/trainer.h b/radio/src/trainer.h index e3c67acac..1222d4f55 100644 --- a/radio/src/trainer.h +++ b/radio/src/trainer.h @@ -35,6 +35,7 @@ extern uint8_t currentTrainerMode; void checkTrainerSignalWarning(); void checkTrainerSettings(); +void stopTrainer(); void forceResetTrainerSettings(); // Needs to be inlined to avoid slow function calls in ISR routines diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 405357146..c69fb2a0f 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -291,6 +291,9 @@ #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Dolů\0""Nhoru""Vprvo""Vlevo" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Mínus" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 7857a73d6..09507c3ea 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -300,6 +300,9 @@ #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 00fdc3c4d..26f69a06e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -300,6 +300,9 @@ #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index e14407ad5..c312a285d 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -297,6 +297,9 @@ #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 22f762ca1..cc5cd85aa 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -318,6 +318,9 @@ #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index fce9f02f9..d3d10c169 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -320,6 +320,9 @@ #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Moins" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 52b3533bf..e763ed311 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -324,6 +324,9 @@ #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 8703e420e..b29a4a94a 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -298,6 +298,9 @@ #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 81730567d..594b4b901 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -318,6 +318,9 @@ #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 0095604d3..1041db2fa 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -305,8 +305,22 @@ #define LEN_VSWASHTYPE "\004" #define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0" -#define LEN_VKEYS "\005" -#define TR_VKEYS TR("Menu\0""Sair\0""Desce""Sobe\0""Direi""Esqda", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus") +#if defined(PCBHORUS) + #define LEN_VKEYS "\005" + #define TR_VKEYS "PGUP\0""PGDN\0""ENTER""MDL\0 ""RTN\0 ""TELE\0""SYS\0 " +#elif defined(RADIO_T12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" +#elif defined(PCBTARANIS) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" +#else + #define LEN_VKEYS "\005" + #define TR_VKEYS "Menu\0""Exit\0""Ned\0 ""Upp\0 ""Höger""Vänst" +#endif #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index d44058c7d..12ffb51fc 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -310,11 +310,14 @@ #define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0 " #if defined(PCBHORUS) - #define LEN_VKEYS "\005" - #define TR_VKEYS "PGUP\0""PGDN\0""ENTER""MDL\0 ""RTN\0 ""TELE\0""SYS\0 " + #define LEN_VKEYS "\005" + #define TR_VKEYS "PGUP\0""PGDN\0""ENTER""MDL\0 ""RTN\0 ""TELE\0""SYS\0 " #elif defined(RADIO_T12) #define LEN_VKEYS "\005" #define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" +#elif defined(RADIO_TX12) + #define LEN_VKEYS "\005" + #define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0" #elif defined(PCBTARANIS) #define LEN_VKEYS "\005" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 602cc171d..3f66d013b 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -44,6 +44,9 @@ #elif defined(RADIO_T12) #define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"S2\0" #define TR_SW_VSRCRAW STR_CHAR_SWITCH"SA\0" STR_CHAR_SWITCH"SB\0" STR_CHAR_SWITCH"SC\0" STR_CHAR_SWITCH"SD\0" STR_CHAR_SWITCH"SG\0" STR_CHAR_SWITCH"SH\0" STR_CHAR_SWITCH"SI\0" STR_CHAR_SWITCH"SJ\0" +#elif defined(RADIO_TX12) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SI\0""\312SJ\0" #elif defined(PCBX7) #define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"S2\0" #define TR_SW_VSRCRAW STR_CHAR_SWITCH"SA\0" STR_CHAR_SWITCH"SB\0" STR_CHAR_SWITCH"SC\0" STR_CHAR_SWITCH"SD\0" STR_CHAR_SWITCH"SF\0" STR_CHAR_SWITCH"SH\0" STR_CHAR_SWITCH"SI\0" STR_CHAR_SWITCH"SJ\0" diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index c27e6b58a..907e358dd 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -146,6 +146,11 @@ def main(): cmake_options["PCBREV"] = "T12" firmware_options = options_jumper_t12 maxsize = 65536 * 8 + elif board_name == "tx12": + cmake_options["PCB"] = "X7" + cmake_options["PCBREV"] = "TX12" + firmware_options = options_radiomaster_tx12 + maxsize = 65536 * 8 elif board_name == "t16": cmake_options["PCB"] = "X10" cmake_options["PCBREV"] = "T16" diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 8b34e6bf6..f4438db44 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -246,6 +246,18 @@ options_jumper_t18 = { "bluetooth": ("BLUETOOTH", "YES", "NO"), } +options_radiomaster_tx12 = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "nogvars": ("GVARS", "NO", "YES"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), + "afhds3": ("AFHDS3", "YES", "NO") +} + options_radiomaster_tx16s = { "noheli": ("HELI", "NO", "YES"), "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh index fbf8f7166..a0406f691 100755 --- a/tools/build-companion-nightly.sh +++ b/tools/build-companion-nightly.sh @@ -70,6 +70,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=TX12 ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X9D ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt diff --git a/tools/build-companion-release.sh b/tools/build-companion-release.sh index b73ce8ed2..463645dc2 100755 --- a/tools/build-companion-release.sh +++ b/tools/build-companion-release.sh @@ -70,6 +70,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=TX12 ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X9D ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt diff --git a/tools/build-radiomaster.py b/tools/build-radiomaster.py index 83faa31bb..985bc705a 100755 --- a/tools/build-radiomaster.py +++ b/tools/build-radiomaster.py @@ -18,6 +18,16 @@ boards = { "PCB": "X10", "PCBREV": "TX16S", "DEFAULT_MODE": "2", + }, + "TX12_1": { + "PCB": "X7", + "PCBREV": "TX12", + "DEFAULT_MODE": "1", + }, + "TX12_2": { + "PCB": "X7", + "PCBREV": "TX12", + "DEFAULT_MODE": "2", } } diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index a9c7090ea..b9a336b01 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -112,6 +112,15 @@ if [[ " X7 ALL " =~ \ ${FLAVOR}\ ]] ; then make -j"${CORES}" tests-radio fi +if [[ " X7ACCESS X7 ALL " =~ \ ${FLAVOR}\ ]] ; then + # OpenTX on X7 ACCESS + rm -rf ./* + cmake "${COMMON_OPTIONS}" -DPCB=X7 -DPCBREV=ACCESS -DHELI=YES -DGVARS=YES "${SRCDIR}" + make -j"${CORES}" ${FIRMARE_TARGET} + make -j"${CORES}" libsimulator + make -j"${CORES}" tests-radio +fi + if [[ " T12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then # OpenTX on T12 rm -rf ./* || true @@ -121,6 +130,15 @@ if [[ " T12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then make -j"${CORES}" tests-radio fi +if [[ " TX12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then + # OpenTX on TX12 + rm -rf ./* + cmake "${COMMON_OPTIONS}" -DPCB=X7 -DPCBREV=TX12 -DHELI=YES -DGVARS=YES "${SRCDIR}" + make -j"${CORES}" ${FIRMARE_TARGET} + make -j"${CORES}" libsimulator + make -j"${CORES}" tests-radio +fi + if [[ " XLITE ALL " =~ \ ${FLAVOR}\ ]] ; then # OpenTX on X-Lite rm -rf ./* || true