1
0
Fork 0
mirror of https://github.com/EdgeTX/edgetx.git synced 2025-07-25 17:25:10 +03:00

External antenna configuration: proposal for #4285 (#6656)

External antenna configuration
This commit is contained in:
Bertrand Songis 2019-09-06 11:26:18 +02:00 committed by GitHub
parent 5d2aefaefb
commit 6c530c6f7b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
80 changed files with 1669 additions and 1253 deletions

View file

@ -56,7 +56,7 @@ void Boards::setBoardType(const Type & board)
uint32_t Boards::getFourCC(Type board) uint32_t Boards::getFourCC(Type board)
{ {
switch (board) { switch (board) {
case BOARD_X12S: case BOARD_HORUS_X12S:
return 0x3478746F; return 0x3478746F;
case BOARD_X10: case BOARD_X10:
case BOARD_X10_EXPRESS: case BOARD_X10_EXPRESS:
@ -82,8 +82,8 @@ uint32_t Boards::getFourCC(Type board)
case BOARD_MEGA2560: case BOARD_MEGA2560:
case BOARD_GRUVIN9X: case BOARD_GRUVIN9X:
return 0x3178746F; return 0x3178746F;
case BOARD_STOCK: case BOARD_9X_M64:
case BOARD_M128: case BOARD_9X_M128:
return 0; return 0;
case BOARD_JUMPER_T12: case BOARD_JUMPER_T12:
return 0x3D78746F; return 0x3D78746F;
@ -97,9 +97,9 @@ uint32_t Boards::getFourCC(Type board)
int Boards::getEEpromSize(Board::Type board) int Boards::getEEpromSize(Board::Type board)
{ {
switch (board) { switch (board) {
case BOARD_STOCK: case BOARD_9X_M64:
return EESIZE_STOCK; return EESIZE_STOCK;
case BOARD_M128: case BOARD_9X_M128:
return EESIZE_M128; return EESIZE_M128;
case BOARD_MEGA2560: case BOARD_MEGA2560:
case BOARD_GRUVIN9X: case BOARD_GRUVIN9X:
@ -121,7 +121,7 @@ int Boards::getEEpromSize(Board::Type board)
return EESIZE_TARANIS; return EESIZE_TARANIS;
case BOARD_UNKNOWN: case BOARD_UNKNOWN:
return EESIZE_MAX; return EESIZE_MAX;
case BOARD_X12S: case BOARD_HORUS_X12S:
case BOARD_X10: case BOARD_X10:
case BOARD_X10_EXPRESS: case BOARD_X10_EXPRESS:
return 0; return 0;
@ -133,9 +133,9 @@ int Boards::getEEpromSize(Board::Type board)
int Boards::getFlashSize(Type board) int Boards::getFlashSize(Type board)
{ {
switch (board) { switch (board) {
case BOARD_STOCK: case BOARD_9X_M64:
return FSIZE_STOCK; return FSIZE_STOCK;
case BOARD_M128: case BOARD_9X_M128:
return FSIZE_M128; return FSIZE_M128;
case BOARD_MEGA2560: case BOARD_MEGA2560:
case BOARD_GRUVIN9X: case BOARD_GRUVIN9X:
@ -155,7 +155,7 @@ int Boards::getFlashSize(Type board)
case BOARD_TARANIS_X9E: case BOARD_TARANIS_X9E:
case BOARD_JUMPER_T12: case BOARD_JUMPER_T12:
return FSIZE_TARANIS; return FSIZE_TARANIS;
case BOARD_X12S: case BOARD_HORUS_X12S:
case BOARD_X10: case BOARD_X10:
case BOARD_X10_EXPRESS: case BOARD_X10_EXPRESS:
return FSIZE_HORUS; return FSIZE_HORUS;
@ -479,9 +479,9 @@ bool Boards::isBoardCompatible(Type board1, Type board2)
QString Boards::getBoardName(Board::Type board) QString Boards::getBoardName(Board::Type board)
{ {
switch (board) { switch (board) {
case BOARD_STOCK: case BOARD_9X_M64:
return "9X"; return "9X";
case BOARD_M128: case BOARD_9X_M128:
return "9X128"; return "9X128";
case BOARD_GRUVIN9X: case BOARD_GRUVIN9X:
return "Gruvin9x"; return "Gruvin9x";
@ -511,7 +511,7 @@ QString Boards::getBoardName(Board::Type board)
return "9XR-PRO"; return "9XR-PRO";
case BOARD_AR9X: case BOARD_AR9X:
return "AR9X"; return "AR9X";
case BOARD_X12S: case BOARD_HORUS_X12S:
return "Horus X12S"; return "Horus X12S";
case BOARD_X10: case BOARD_X10:
return "Horus X10/X10S"; return "Horus X10/X10S";

View file

@ -32,8 +32,8 @@ namespace Board {
enum Type enum Type
{ {
BOARD_UNKNOWN = -1, BOARD_UNKNOWN = -1,
BOARD_STOCK = 0, BOARD_9X_M64 = 0,
BOARD_M128, BOARD_9X_M128,
BOARD_MEGA2560, BOARD_MEGA2560,
BOARD_GRUVIN9X, BOARD_GRUVIN9X,
BOARD_SKY9X, BOARD_SKY9X,
@ -44,7 +44,7 @@ namespace Board {
BOARD_TARANIS_X9DP, BOARD_TARANIS_X9DP,
BOARD_TARANIS_X9DP_2019, BOARD_TARANIS_X9DP_2019,
BOARD_TARANIS_X9E, BOARD_TARANIS_X9E,
BOARD_X12S, BOARD_HORUS_X12S,
BOARD_X10, BOARD_X10,
BOARD_X10_EXPRESS, BOARD_X10_EXPRESS,
BOARD_TARANIS_XLITE, BOARD_TARANIS_XLITE,
@ -187,29 +187,129 @@ class Boards
// temporary aliases for transition period, use Boards class instead. // temporary aliases for transition period, use Boards class instead.
#define getBoardCapability(b__, c__) Boards::getCapability(b__, c__) #define getBoardCapability(b__, c__) Boards::getCapability(b__, c__)
#define IS_9X(board) (board==Board::BOARD_STOCK || board==Board::BOARD_M128) inline bool IS_9X(Board::Type board)
#define IS_STOCK(board) (board==Board::BOARD_STOCK) {
#define IS_M128(board) (board==Board::BOARD_M128) return board == Board::BOARD_9X_M64 || board == Board::BOARD_9X_M128;
#define IS_2560(board) (board==Board::BOARD_GRUVIN9X || board==Board::BOARD_MEGA2560) }
#define IS_SKY9X(board) (board==Board::BOARD_SKY9X || board==Board::BOARD_9XRPRO || board==Board::BOARD_AR9X)
#define IS_9XRPRO(board) (board==Board::BOARD_9XRPRO) inline bool IS_STOCK(Board::Type board)
#define IS_JUMPER_T12(board) (board==Board::BOARD_JUMPER_T12) {
#define IS_TARANIS_XLITE(board) (board==Board::BOARD_TARANIS_XLITE || board==Board::BOARD_TARANIS_XLITES) return board == Board::BOARD_9X_M64;
#define IS_TARANIS_XLITES(board) (board==Board::BOARD_TARANIS_XLITES) }
#define IS_TARANIS_X7(board) (board==Board::BOARD_TARANIS_X7)
#define IS_TARANIS_X9LITE(board) (board==Board::BOARD_TARANIS_X9LITE) inline bool IS_M128(Board::Type board)
#define IS_TARANIS_X9(board) (board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9DP_2019 || board==Board::BOARD_TARANIS_X9E) {
#define IS_TARANIS_X9D(board) (board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9DP_2019) return board == Board::BOARD_9X_M128;
#define IS_TARANIS_PLUS(board) (board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9E) }
#define IS_TARANIS_X9E(board) (board==Board::BOARD_TARANIS_X9E)
#define IS_TARANIS(board) (IS_TARANIS_X9(board) || IS_TARANIS_X7(board) || IS_TARANIS_X9LITE(board) || IS_TARANIS_XLITE(board) || IS_JUMPER_T12(board)) inline bool IS_2560(Board::Type board)
#define IS_TARANIS_SMALL(board) (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || IS_JUMPER_T12(board)) {
#define IS_HORUS_X12S(board) (board==Board::BOARD_X12S) return board == Board::BOARD_GRUVIN9X || board == Board::BOARD_MEGA2560;
#define IS_HORUS_X10(board) (board==Board::BOARD_X10 || board==Board::BOARD_X10_EXPRESS) }
#define IS_HORUS(board) (IS_HORUS_X12S(board) || IS_HORUS_X10(board))
#define IS_HORUS_OR_TARANIS(board) (IS_HORUS(board) || IS_TARANIS(board)) inline bool IS_SKY9X(Board::Type board)
#define IS_STM32(board) (IS_TARANIS(board) || IS_HORUS(board)) {
#define IS_ARM(board) (IS_STM32(board) || IS_SKY9X(board)) return board == Board::BOARD_SKY9X || board == Board::BOARD_9XRPRO || board == Board::BOARD_AR9X;
#define HAS_LARGE_LCD(board) (IS_HORUS(board) || IS_TARANIS_X9(board)) }
inline bool IS_9XRPRO(Board::Type board)
{
return board == Board::BOARD_9XRPRO;
}
inline bool IS_JUMPER_T12(Board::Type board)
{
return board == Board::BOARD_JUMPER_T12;
}
inline bool IS_TARANIS_XLITE(Board::Type board)
{
return board == Board::BOARD_TARANIS_XLITE || board == Board::BOARD_TARANIS_XLITES;
}
inline bool IS_TARANIS_XLITES(Board::Type board)
{
return board == Board::BOARD_TARANIS_XLITES;
}
inline bool IS_TARANIS_X7(Board::Type board)
{
return board == Board::BOARD_TARANIS_X7;
}
inline bool IS_TARANIS_X9LITE(Board::Type board)
{
return board == Board::BOARD_TARANIS_X9LITE;
}
inline bool IS_TARANIS_X9(Board::Type board)
{
return board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9DP_2019 || board==Board::BOARD_TARANIS_X9E;
}
inline bool IS_TARANIS_X9D(Board::Type board)
{
return board == Board::BOARD_TARANIS_X9D || board == Board::BOARD_TARANIS_X9DP || board == Board::BOARD_TARANIS_X9DP_2019;
}
inline bool IS_TARANIS_PLUS(Board::Type board)
{
return board == Board::BOARD_TARANIS_X9DP || board == Board::BOARD_TARANIS_X9E;
}
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);
}
inline bool IS_HORUS_X10(Board::Type board)
{
return board == Board::BOARD_X10 || board == Board::BOARD_X10_EXPRESS;
}
inline bool IS_HORUS_X12S(Board::Type board)
{
return board == Board::BOARD_HORUS_X12S;
}
inline bool IS_HORUS(Board::Type board)
{
return IS_HORUS_X12S(board) || IS_HORUS_X10(board);
}
inline bool IS_HORUS_OR_TARANIS(Board::Type board)
{
return IS_HORUS(board) || IS_TARANIS(board);
}
inline bool IS_STM32(Board::Type board)
{
return IS_TARANIS(board) || IS_HORUS(board);
}
inline bool IS_ARM(Board::Type board)
{
return IS_STM32(board) || IS_SKY9X(board);
}
inline bool HAS_LARGE_LCD(Board::Type board)
{
return IS_HORUS(board) || IS_TARANIS_X9(board);
}
inline bool HAS_EXTERNAL_ANTENNA(Board::Type board)
{
return (IS_HORUS(board) && board != Board::BOARD_X10_EXPRESS) || (IS_TARANIS_XLITE(board) && !IS_TARANIS_XLITES(board));
}
#endif // _BOARDS_H_ #endif // _BOARDS_H_

View file

@ -32,7 +32,7 @@
#define FILE_MODEL(n) (1+n) #define FILE_MODEL(n) (1+n)
Er9xInterface::Er9xInterface(): Er9xInterface::Er9xInterface():
EEPROMInterface(Board::BOARD_STOCK), EEPROMInterface(Board::BOARD_9X_M64),
efile(new RleFile()) efile(new RleFile())
{ {
} }
@ -120,13 +120,13 @@ unsigned long Er9xInterface::load(RadioData &radioData, const uint8_t *eeprom, i
std::bitset<NUM_ERRORS> errors; std::bitset<NUM_ERRORS> errors;
if (size != Boards::getEEpromSize(Board::BOARD_STOCK)) { if (size != Boards::getEEpromSize(Board::BOARD_9X_M64)) {
dbg << "wrong size"; dbg << "wrong size";
errors.set(WRONG_SIZE); errors.set(WRONG_SIZE);
return errors.to_ulong(); return errors.to_ulong();
} }
if (!efile->EeFsOpen((uint8_t *)eeprom, size, Board::BOARD_STOCK)) { if (!efile->EeFsOpen((uint8_t *)eeprom, size, Board::BOARD_9X_M64)) {
dbg << "wrong file system"; dbg << "wrong file system";
errors.set(WRONG_FILE_SYSTEM); errors.set(WRONG_FILE_SYSTEM);
return errors.to_ulong(); return errors.to_ulong();

View file

@ -151,7 +151,8 @@ class GeneralSettings {
int backgroundVolume; int backgroundVolume;
unsigned int mavbaud; unsigned int mavbaud;
unsigned int switchUnlockStates; unsigned int switchUnlockStates;
unsigned int auxSerialMode; // UartModes unsigned int auxSerialMode;
int antennaMode;
unsigned int backlightColor; unsigned int backlightColor;
CustomFunctionData customFn[CPN_MAX_SPECIAL_FUNCTIONS]; CustomFunctionData customFn[CPN_MAX_SPECIAL_FUNCTIONS];
char switchName[CPN_MAX_SWITCHES][3+1]; char switchName[CPN_MAX_SWITCHES][3+1];

View file

@ -96,10 +96,6 @@ QString ModuleData::subTypeToString(int type) const
QString ModuleData::powerValueToString(Firmware * fw) const QString ModuleData::powerValueToString(Firmware * fw) const
{ {
const QStringList & strRef = powerValueStrings(subType, fw); const QStringList & strRef = powerValueStrings(subType, fw);
// EU module with telemetry can only be < 100/200mW.
if (pxx.sport_out && subType == MODULE_SUBTYPE_R9M_EU && pxx.power > 1)
return CPN_STR_UNKNOWN_ITEM;
return strRef.value(pxx.power, CPN_STR_UNKNOWN_ITEM); return strRef.value(pxx.power, CPN_STR_UNKNOWN_ITEM);
} }

View file

@ -169,10 +169,9 @@ class ModuleData {
struct PXX { struct PXX {
unsigned int power; // 0 10 mW, 1 100 mW, 2 500 mW, 3 1W unsigned int power; // 0 10 mW, 1 100 mW, 2 500 mW, 3 1W
bool receiver_telem_off; // false = receiver telem enabled bool receiverTelemetryOff; // false = receiver telem enabled
bool receiver_channel_9_16; // false = pwm out 1-8, true 9-16 bool receiverHigherChannels; // false = pwm out 1-8, true 9-16
bool external_antenna; // false = internal antenna, true = external antenna int antennaMode; // false = internal antenna, true = external antenna
bool sport_out;
} pxx; } pxx;
struct Access { struct Access {

View file

@ -716,7 +716,7 @@ class FlightModeField: public TransformedField {
trim = 501 + phase.trimRef[i] - (phase.trimRef[i] > index ? 1 : 0); trim = 501 + phase.trimRef[i] - (phase.trimRef[i] > index ? 1 : 0);
else else
trim = std::max(-500, std::min(500, phase.trim[i])); trim = std::max(-500, std::min(500, phase.trim[i]));
if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) { if (board == BOARD_9X_M64 || (board == BOARD_9X_M128 && version >= 215)) {
trimBase[i] = trim >> 2; trimBase[i] = trim >> 2;
trimExt[i] = (trim & 0x03); trimExt[i] = (trim & 0x03);
} }
@ -747,7 +747,7 @@ class FlightModeField: public TransformedField {
} }
else { else {
int trim; int trim;
if (board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) if (board == BOARD_9X_M64 || (board == BOARD_9X_M128 && version >= 215))
trim = ((trimBase[i]) << 2) + (trimExt[i] & 0x03); trim = ((trimBase[i]) << 2) + (trimExt[i] & 0x03);
else else
trim = trimBase[i]; trim = trimBase[i];
@ -2067,10 +2067,10 @@ class ModuleUnionField: public UnionField<unsigned int> {
ModuleData::PXX& pxx = module.pxx; ModuleData::PXX& pxx = module.pxx;
internalField.Append(new UnsignedField<2>(this, pxx.power)); internalField.Append(new UnsignedField<2>(this, pxx.power));
internalField.Append(new SpareBitsField<2>(this)); internalField.Append(new SpareBitsField<2>(this));
internalField.Append(new BoolField<1>(this, pxx.receiver_telem_off)); internalField.Append(new BoolField<1>(this, pxx.receiverTelemetryOff));
internalField.Append(new BoolField<1>(this, pxx.receiver_channel_9_16)); internalField.Append(new BoolField<1>(this, pxx.receiverHigherChannels));
internalField.Append(new BoolField<1>(this, pxx.external_antenna)); internalField.Append(new SignedField<2>(this, pxx.antennaMode));
internalField.Append(new BoolField<1>(this, pxx.sport_out)); internalField.Append(new SpareBitsField<8>(this));
} }
bool select(const unsigned int& attr) const override { bool select(const unsigned int& attr) const override {
@ -2558,12 +2558,19 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
} }
internalField.Append(new UnsignedField<8>(this, generalData.vBatWarn)); internalField.Append(new UnsignedField<8>(this, generalData.vBatWarn));
internalField.Append(new SignedField<8>(this, generalData.txVoltageCalibration)); internalField.Append(new SignedField<8>(this, generalData.txVoltageCalibration));
internalField.Append(new SignedField<8>(this, generalData.backlightMode));
for (int i=0; i<CPN_MAX_STICKS; i++) { internalField.Append(new SignedField<3>(this, generalData.backlightMode));
if (version >= 219)
internalField.Append(new SignedField<2>(this, generalData.antennaMode));
else
internalField.Append(new SpareBitsField<2>(this));
internalField.Append(new SpareBitsField<3>(this));
for (int i=0; i<4; i++) {
internalField.Append(new SignedField<16>(this, generalData.trainer.calib[i])); internalField.Append(new SignedField<16>(this, generalData.trainer.calib[i]));
} }
for (int i=0; i<CPN_MAX_STICKS; i++) {
for (int i=0; i<4; i++) {
internalField.Append(new UnsignedField<6>(this, generalData.trainer.mix[i].src)); internalField.Append(new UnsignedField<6>(this, generalData.trainer.mix[i].src));
internalField.Append(new UnsignedField<2>(this, generalData.trainer.mix[i].mode)); internalField.Append(new UnsignedField<2>(this, generalData.trainer.mix[i].mode));
internalField.Append(new SignedField<8>(this, generalData.trainer.mix[i].weight)); internalField.Append(new SignedField<8>(this, generalData.trainer.mix[i].weight));

View file

@ -58,9 +58,9 @@ OpenTxEepromInterface::~OpenTxEepromInterface()
const char * OpenTxEepromInterface::getName() const char * OpenTxEepromInterface::getName()
{ {
switch (board) { switch (board) {
case BOARD_STOCK: case BOARD_9X_M64:
return "OpenTX for 9X board"; return "OpenTX for 9X board";
case BOARD_M128: case BOARD_9X_M128:
return "OpenTX for M128 / 9X board"; return "OpenTX for M128 / 9X board";
case BOARD_MEGA2560: case BOARD_MEGA2560:
return "OpenTX for MEGA2560 board"; return "OpenTX for MEGA2560 board";
@ -90,7 +90,7 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for 9XR-PRO"; return "OpenTX for 9XR-PRO";
case BOARD_AR9X: case BOARD_AR9X:
return "OpenTX for ar9x board / 9X"; return "OpenTX for ar9x board / 9X";
case BOARD_X12S: case BOARD_HORUS_X12S:
return "OpenTX for FrSky Horus"; return "OpenTX for FrSky Horus";
case BOARD_X10: case BOARD_X10:
return "OpenTX for FrSky X10"; return "OpenTX for FrSky X10";
@ -273,11 +273,11 @@ unsigned long OpenTxEepromInterface::load(RadioData &radioData, const uint8_t *
uint8_t OpenTxEepromInterface::getLastDataVersion(Board::Type board) uint8_t OpenTxEepromInterface::getLastDataVersion(Board::Type board)
{ {
switch (board) { switch (board) {
case BOARD_STOCK: case BOARD_9X_M64:
return 216; return 216;
case BOARD_GRUVIN9X: case BOARD_GRUVIN9X:
case BOARD_MEGA2560: case BOARD_MEGA2560:
case BOARD_M128: case BOARD_9X_M128:
return 217; return 217;
default: default:
return 219; return 219;
@ -317,7 +317,7 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
efile->EeFsCreate(eeprom, size, board, version); efile->EeFsCreate(eeprom, size, board, version);
if (board == BOARD_M128) { if (board == BOARD_9X_M128) {
variant |= M128_VARIANT; variant |= M128_VARIANT;
} }
else if (IS_TARANIS_X9E(board)) { else if (IS_TARANIS_X9E(board)) {
@ -433,7 +433,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
return 0; return 0;
else if (IS_ARM(board)) else if (IS_ARM(board))
return 60; return 60;
else if (board == BOARD_M128) else if (board == BOARD_9X_M128)
return 30; return 30;
else if (IS_2560(board)) else if (IS_2560(board))
return 30; return 30;
@ -512,7 +512,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case CustomFunctions: case CustomFunctions:
if (IS_ARM(board)) if (IS_ARM(board))
return 64; return 64;
else if (IS_2560(board) || board == BOARD_M128) else if (IS_2560(board) || board == BOARD_9X_M128)
return 24; return 24;
else else
return 16; return 16;
@ -703,9 +703,9 @@ int OpenTxFirmware::getCapability(::Capability capability)
case HasMahPersistent: case HasMahPersistent:
return (IS_ARM(board) ? true : false); return (IS_ARM(board) ? true : false);
case SimulatorVariant: case SimulatorVariant:
if (board == BOARD_STOCK) if (board == BOARD_9X_M64)
return SIMU_STOCK_VARIANTS; return SIMU_STOCK_VARIANTS;
else if (board == BOARD_M128) else if (board == BOARD_9X_M128)
return SIMU_M128_VARIANTS; return SIMU_M128_VARIANTS;
else if (IS_TARANIS_X9E(board)) else if (IS_TARANIS_X9E(board))
return TARANIS_X9E_VARIANT; return TARANIS_X9E_VARIANT;
@ -944,7 +944,7 @@ EepromLoadErrors OpenTxEepromInterface::checkVersion(unsigned int version)
bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int variant) bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int variant)
{ {
bool variantError = false; bool variantError = false;
if (board == BOARD_M128 && !(variant & M128_VARIANT)) { if (board == BOARD_9X_M128 && !(variant & M128_VARIANT)) {
if (version == 212) { if (version == 212) {
uint8_t tmp[1000]; uint8_t tmp[1000];
for (int i = 1; i < 31; i++) { for (int i = 1; i < 31; i++) {
@ -1267,7 +1267,7 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware); registerOpenTxFirmware(firmware);
/* FrSky X12 (Horus) board */ /* FrSky X12 (Horus) board */
firmware = new OpenTxFirmware("opentx-x12s", Firmware::tr("FrSky Horus X12S"), BOARD_X12S); firmware = new OpenTxFirmware("opentx-x12s", Firmware::tr("FrSky Horus X12S"), BOARD_HORUS_X12S);
addOpenTxFrskyOptions(firmware); addOpenTxFrskyOptions(firmware);
firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement")); firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement"));
firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version")); firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version"));
@ -1301,10 +1301,10 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware); registerOpenTxFirmware(firmware);
// These are kept only for import purposes, marked as deprecated to hide from UI. // These are kept only for import purposes, marked as deprecated to hide from UI.
registerOpenTxFirmware(new OpenTxFirmware("opentx-9xr", Firmware::tr("Turnigy 9XR"), BOARD_STOCK), true); registerOpenTxFirmware(new OpenTxFirmware("opentx-9xr", Firmware::tr("Turnigy 9XR"), BOARD_9X_M64), true);
registerOpenTxFirmware(new OpenTxFirmware("opentx-9xr128", Firmware::tr("Turnigy 9XR with m128 chip"), BOARD_M128), true); registerOpenTxFirmware(new OpenTxFirmware("opentx-9xr128", Firmware::tr("Turnigy 9XR with m128 chip"), BOARD_9X_M128), true);
registerOpenTxFirmware(new OpenTxFirmware("opentx-9x", Firmware::tr("9X with stock board"), BOARD_STOCK), true); registerOpenTxFirmware(new OpenTxFirmware("opentx-9x", Firmware::tr("9X with stock board"), BOARD_9X_M64), true);
registerOpenTxFirmware(new OpenTxFirmware("opentx-9x128", Firmware::tr("9X with stock board and m128 chip"), BOARD_M128), true); registerOpenTxFirmware(new OpenTxFirmware("opentx-9x128", Firmware::tr("9X with stock board and m128 chip"), BOARD_9X_M128), true);
registerOpenTxFirmware(new OpenTxFirmware("opentx-gruvin9x", Firmware::tr("9X with Gruvin9x board"), BOARD_GRUVIN9X), true); registerOpenTxFirmware(new OpenTxFirmware("opentx-gruvin9x", Firmware::tr("9X with Gruvin9x board"), BOARD_GRUVIN9X), true);
registerOpenTxFirmware(new OpenTxFirmware("opentx-mega2560", Firmware::tr("DIY MEGA2560 radio"), BOARD_MEGA2560), true); registerOpenTxFirmware(new OpenTxFirmware("opentx-mega2560", Firmware::tr("DIY MEGA2560 radio"), BOARD_MEGA2560), true);

View file

@ -48,7 +48,7 @@ RawSourceRange RawSource::getRange(const ModelData * model, const GeneralSetting
RawSourceRange result; RawSourceRange result;
Firmware * firmware = Firmware::getCurrentVariant(); Firmware * firmware = Firmware::getCurrentVariant();
int board = firmware->getBoard(); Board::Type board = firmware->getBoard();
switch (type) { switch (type) {
case SOURCE_TYPE_TELEMETRY: case SOURCE_TYPE_TELEMETRY:

View file

@ -183,6 +183,18 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
ui->bluetoothWidget->hide(); ui->bluetoothWidget->hide();
} }
if ((IS_HORUS(board) && board != Board::BOARD_X10_EXPRESS) || (IS_TARANIS_XLITE(board) && !IS_TARANIS_XLITES(board))) {
ui->antennaMode->addItem(tr("Internal"), -2);
ui->antennaMode->addItem(tr("Ask"), -1);
ui->antennaMode->addItem(tr("Per model"), 0);
ui->antennaMode->addItem(IS_HORUS_X12S(board) ? tr("Internal + External") : tr("External"), 1);
ui->antennaMode->setField(generalSettings.antennaMode, this);
}
else {
ui->antennaLabel->hide();
ui->antennaMode->hide();
}
if (IS_HORUS_OR_TARANIS(board)) { if (IS_HORUS_OR_TARANIS(board)) {
ui->filterEnable->setChecked(!generalSettings.jitterFilter); ui->filterEnable->setChecked(!generalSettings.jitterFilter);
} }

File diff suppressed because it is too large Load diff

View file

@ -400,7 +400,7 @@ void ModulePanel::update()
else if (protocol==PULSES_ACCESS_ISRM || protocol==PULSES_ACCESS_R9M || else if (protocol==PULSES_ACCESS_ISRM || protocol==PULSES_ACCESS_R9M ||
protocol==PULSES_ACCESS_R9M_LITE || protocol==PULSES_ACCESS_R9M_LITE_PRO) protocol==PULSES_ACCESS_R9M_LITE || protocol==PULSES_ACCESS_R9M_LITE_PRO)
mask |= MASK_RX_NUMBER | MASK_ACCESS; mask |= MASK_RX_NUMBER | MASK_ACCESS;
if ((IS_HORUS(board) || board == Board::BOARD_TARANIS_XLITE) && moduleIdx == 0) if (moduleIdx == 0 && HAS_EXTERNAL_ANTENNA(board) && generalSettings.antennaMode == 0 /* per model */)
mask |= MASK_ANTENNA; mask |= MASK_ANTENNA;
break; break;
case PULSES_LP45: case PULSES_LP45:
@ -486,16 +486,18 @@ void ModulePanel::update()
ui->ppmFrameLength->setMaximum(firmware->getCapability(PPMFrameLength)); ui->ppmFrameLength->setMaximum(firmware->getCapability(PPMFrameLength));
ui->ppmFrameLength->setValue(22.5+((double)module.ppm.frameLength)*0.5); ui->ppmFrameLength->setValue(22.5+((double)module.ppm.frameLength)*0.5);
// Antenna selection on Horus and xlite // Antenna mode on Horus and XLite
ui->label_antenna->setVisible(mask & MASK_ANTENNA); if (mask & MASK_ANTENNA) {
ui->antennaMode->setVisible(mask & MASK_ANTENNA); ui->antennaMode->clear();
if IS_HORUS_X12S(board) { ui->antennaMode->addItem(tr("Ask"), -1);
ui->antennaMode->setItemText(1,tr("Ext. + Int")); ui->antennaMode->addItem(tr("Internal"), 0);
ui->antennaMode->addItem(IS_HORUS_X12S(board) ? tr("Internal + External") : tr("External"), 1);
ui->antennaMode->setField(module.pxx.antennaMode, this);
} }
else { else {
ui->antennaMode->setItemText(1,tr("External")); ui->antennaLabel->hide();
ui->antennaMode->hide();
} }
ui->antennaMode->setCurrentIndex(module.pxx.external_antenna);
// R9M options // R9M options
ui->r9mPower->setVisible(mask & MASK_R9M); ui->r9mPower->setVisible(mask & MASK_R9M);
@ -642,14 +644,6 @@ void ModulePanel::on_ppmPolarity_currentIndexChanged(int index)
} }
} }
void ModulePanel::on_antennaMode_currentIndexChanged(int index)
{
if (!lock && module.pxx.external_antenna != (bool)index) {
module.pxx.external_antenna = index;
emit modified();
}
}
void ModulePanel::on_r9mPower_currentIndexChanged(int index) void ModulePanel::on_r9mPower_currentIndexChanged(int index)
{ {
if (!lock && module.pxx.power != (unsigned int)index) { if (!lock && module.pxx.power != (unsigned int)index) {

View file

@ -80,7 +80,6 @@ class ModulePanel : public ModelPanel
void on_ppmPolarity_currentIndexChanged(int index); void on_ppmPolarity_currentIndexChanged(int index);
void on_ppmOutputType_currentIndexChanged(int index); void on_ppmOutputType_currentIndexChanged(int index);
void on_ppmFrameLength_editingFinished(); void on_ppmFrameLength_editingFinished();
void on_antennaMode_currentIndexChanged(int index);
void on_rxNumber_editingFinished(); void on_rxNumber_editingFinished();
void on_failsafeMode_currentIndexChanged(int value); void on_failsafeMode_currentIndexChanged(int value);
void onMultiProtocolChanged(int index); void onMultiProtocolChanged(int index);

View file

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1042</width> <width>1075</width>
<height>375</height> <height>434</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -252,7 +252,7 @@
<item row="4" column="1"> <item row="4" column="1">
<layout class="QHBoxLayout" name="rx1Layout"> <layout class="QHBoxLayout" name="rx1Layout">
<property name="spacing"> <property name="spacing">
<number>-1</number> <number>6</number>
</property> </property>
<property name="topMargin"> <property name="topMargin">
<number>0</number> <number>0</number>
@ -595,7 +595,7 @@
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_antenna"> <widget class="QLabel" name="antennaLabel">
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>16777215</width> <width>16777215</width>
@ -611,7 +611,7 @@
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QComboBox" name="antennaMode"> <widget class="AutoComboBox" name="antennaMode">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed"> <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -621,16 +621,6 @@
<property name="sizeAdjustPolicy"> <property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum> <enum>QComboBox::AdjustToContents</enum>
</property> </property>
<item>
<property name="text">
<string>Internal</string>
</property>
</item>
<item>
<property name="text">
<string>Ext. + Int.</string>
</property>
</item>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="5" column="0">
@ -732,6 +722,26 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QLabel" name="registrationIdLabel">
<property name="text">
<string>Registration ID</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="registrationId">
<property name="inputMask">
<string notr="true"/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_multiProtocol"> <widget class="QLabel" name="label_multiProtocol">
<property name="text"> <property name="text">
@ -775,6 +785,50 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="warning_r9mFlex">
<property name="palette">
<palette>
<active>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>198</red>
<green>17</green>
<blue>36</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>198</red>
<green>17</green>
<blue>36</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>106</red>
<green>104</green>
<blue>100</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="text">
<string>WARNING: Requires non-certified firmware!</string>
</property>
</widget>
</item>
<item row="5" column="0"> <item row="5" column="0">
<widget class="QLabel" name="label_failsafeMode"> <widget class="QLabel" name="label_failsafeMode">
<property name="maximumSize"> <property name="maximumSize">
@ -883,70 +937,6 @@
</item> </item>
</widget> </widget>
</item> </item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="warning_r9mFlex">
<property name="palette">
<palette>
<active>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>198</red>
<green>17</green>
<blue>36</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>198</red>
<green>17</green>
<blue>36</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>106</red>
<green>104</green>
<blue>100</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="text">
<string>WARNING: Requires non-certified firmware!</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="registrationIdLabel">
<property name="text">
<string>Registration ID</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="registrationId">
<property name="inputMask">
<string notr="true"/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="7" column="0" colspan="2"> <item row="7" column="0" colspan="2">
<spacer name="horizontalSpacer_3"> <spacer name="horizontalSpacer_3">
<property name="orientation"> <property name="orientation">
@ -1069,6 +1059,13 @@ QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; pad
</item> </item>
</layout> </layout>
</widget> </widget>
<customwidgets>
<customwidget>
<class>AutoComboBox</class>
<extends>QComboBox</extends>
<header>autocombobox.h</header>
</customwidget>
</customwidgets>
<tabstops> <tabstops>
<tabstop>protocol</tabstop> <tabstop>protocol</tabstop>
<tabstop>channelsStart</tabstop> <tabstop>channelsStart</tabstop>

View file

@ -223,7 +223,6 @@ QString ModelPrinter::printModule(int idx)
if (module.protocol == PULSES_PXX_R9M) { if (module.protocol == PULSES_PXX_R9M) {
str << printLabelValue(tr("Sub Type"), module.subTypeToString()); str << printLabelValue(tr("Sub Type"), module.subTypeToString());
str << printLabelValue(tr("RF Output Power"), module.powerValueToString(firmware)); str << printLabelValue(tr("RF Output Power"), module.powerValueToString(firmware));
str << printLabelValue(tr("Telemetry"), printBoolean(module.pxx.sport_out, BOOLEAN_ENABLEDISABLE));
} }
} }
} }

View file

@ -55,7 +55,7 @@ QStringList getAvrdudeArgs(const QString & cmd, const QString & filename)
args << "-c" << programmer << "-p"; args << "-c" << programmer << "-p";
if (IS_2560(board)) if (IS_2560(board))
args << "m2560"; args << "m2560";
else if (board == Board::BOARD_M128) else if (board == Board::BOARD_9X_M128)
args << "m128"; args << "m128";
else else
args << mcu; args << mcu;

View file

@ -29,12 +29,8 @@ class AutoComboBox: public QComboBox
Q_OBJECT Q_OBJECT
public: public:
explicit AutoComboBox(QWidget *parent = 0): explicit AutoComboBox(QWidget *parent = nullptr):
QComboBox(parent), QComboBox(parent)
field(NULL),
panel(NULL),
next(0),
lock(false)
{ {
connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentIndexChanged(int))); connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentIndexChanged(int)));
} }
@ -67,14 +63,14 @@ class AutoComboBox: public QComboBox
updateValue(); updateValue();
} }
void setField(unsigned int & field, GenericPanel * panel=NULL) void setField(unsigned int & field, GenericPanel * panel=nullptr)
{ {
this->field = (int *)&field; this->field = (int *)&field;
this->panel = panel; this->panel = panel;
updateValue(); updateValue();
} }
void setField(int & field, GenericPanel * panel=NULL) void setField(int & field, GenericPanel * panel=nullptr)
{ {
this->field = &field; this->field = &field;
this->panel = panel; this->panel = panel;
@ -113,10 +109,10 @@ class AutoComboBox: public QComboBox
} }
protected: protected:
int * field; int * field = nullptr;
GenericPanel * panel; GenericPanel * panel = nullptr;
int next; int next = 0;
bool lock; bool lock = false;
}; };
#endif // _AUTOCOMBOBOX_H_ #endif // _AUTOCOMBOBOX_H_

View file

@ -77,7 +77,7 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_TARANIS_X9E: case Board::BOARD_TARANIS_X9E:
radioUiWidget = new SimulatedUIWidgetX9E(simulator, this); radioUiWidget = new SimulatedUIWidgetX9E(simulator, this);
break; break;
case Board::BOARD_X12S: case Board::BOARD_HORUS_X12S:
radioUiWidget = new SimulatedUIWidgetX12(simulator, this); radioUiWidget = new SimulatedUIWidgetX12(simulator, this);
break; break;
case Board::BOARD_X10: case Board::BOARD_X10:

View file

@ -86,7 +86,7 @@ void RleFile::EeFsCreate(uint8_t *eeprom, int size, Board::Type board, unsigned
} }
else { else {
eeFs = (EeFs *)eeprom; eeFs = (EeFs *)eeprom;
eeFsVersion = (IS_2560(board) || board==Board::BOARD_M128) ? 5 : 4; eeFsVersion = (IS_2560(board) || board==Board::BOARD_9X_M128) ? 5 : 4;
eeFsBlockSize = 16; eeFsBlockSize = 16;
eeFsLinkSize = 1; eeFsLinkSize = 1;

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

View file

@ -446,10 +446,9 @@ PACK(struct ModuleData {
NOBACKUP(struct { NOBACKUP(struct {
uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W
uint8_t spare1:2; uint8_t spare1:2;
uint8_t receiver_telem_off:1; // false = receiver telem enabled uint8_t receiverTelemetryOff:1; // false = receiver telem enabled
uint8_t receiver_channel_9_16:1; // false = pwm out 1-8, true 9-16 uint8_t receiverHigherChannels:1; // false = pwm out 1-8, true 9-16
uint8_t external_antenna:1; // false = internal antenna, true = external antenna int8_t antennaMode:2;
uint8_t fast:1; // TODO: to be used later by external module (fast means serial @ high speed)
uint8_t spare2; uint8_t spare2;
} pxx); } pxx);
NOBACKUP(struct { NOBACKUP(struct {
@ -672,13 +671,13 @@ PACK(struct TrainerData {
NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]); \ NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]); \
NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME]); \ NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME]); \
NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \ NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \
NOBACKUP(uint8_t spare4:1); \ NOBACKUP(uint8_t spare5:1); \
NOBACKUP(uint8_t blOffBright:7); \ NOBACKUP(uint8_t blOffBright:7); \
NOBACKUP(char bluetoothName[LEN_BLUETOOTH_NAME]); NOBACKUP(char bluetoothName[LEN_BLUETOOTH_NAME]);
#elif defined(PCBTARANIS) #elif defined(PCBTARANIS)
#if defined(STORAGE_BLUETOOTH) #if defined(STORAGE_BLUETOOTH)
#define BLUETOOTH_FIELDS \ #define BLUETOOTH_FIELDS \
uint8_t spare4; \ uint8_t spare5; \
char bluetoothName[LEN_BLUETOOTH_NAME]; char bluetoothName[LEN_BLUETOOTH_NAME];
#else #else
#define BLUETOOTH_FIELDS #define BLUETOOTH_FIELDS
@ -696,7 +695,7 @@ PACK(struct TrainerData {
#elif defined(PCBSKY9X) #elif defined(PCBSKY9X)
#define EXTRA_GENERAL_FIELDS \ #define EXTRA_GENERAL_FIELDS \
int8_t txCurrentCalibration; \ int8_t txCurrentCalibration; \
int8_t spare4; \ int8_t spare5; \
uint8_t mAhWarn; \ uint8_t mAhWarn; \
uint16_t mAhUsed; \ uint16_t mAhUsed; \
int8_t temperatureCalib; \ int8_t temperatureCalib; \
@ -722,7 +721,7 @@ PACK(struct TrainerData {
#if defined(BUZZER) #if defined(BUZZER)
#define BUZZER_FIELD int8_t buzzerMode:2 // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) #define BUZZER_FIELD int8_t buzzerMode:2 // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware)
#else #else
#define BUZZER_FIELD int8_t spare3:2 #define BUZZER_FIELD int8_t spare4:2
#endif #endif
PACK(struct RadioData { PACK(struct RadioData {
@ -734,7 +733,9 @@ PACK(struct RadioData {
N_HORUS_FIELD(uint8_t contrast); N_HORUS_FIELD(uint8_t contrast);
NOBACKUP(uint8_t vBatWarn); NOBACKUP(uint8_t vBatWarn);
NOBACKUP(int8_t txVoltageCalibration); NOBACKUP(int8_t txVoltageCalibration);
NOBACKUP(int8_t backlightMode); uint8_t backlightMode:3;
int8_t antennaMode:2;
int8_t spare1:3;
NOBACKUP(TrainerData trainer); NOBACKUP(TrainerData trainer);
NOBACKUP(uint8_t view); // index of view in main screen NOBACKUP(uint8_t view); // index of view in main screen
NOBACKUP(BUZZER_FIELD); /* 2bits */ NOBACKUP(BUZZER_FIELD); /* 2bits */
@ -755,7 +756,7 @@ PACK(struct RadioData {
NOBACKUP(uint8_t templateSetup); // RETA order for receiver channels NOBACKUP(uint8_t templateSetup); // RETA order for receiver channels
NOBACKUP(int8_t PPM_Multiplier); NOBACKUP(int8_t PPM_Multiplier);
NOBACKUP(int8_t hapticLength); NOBACKUP(int8_t hapticLength);
N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t spare1)); N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t spare2));
N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse)); N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse));
NOBACKUP(int8_t beepLength:3); NOBACKUP(int8_t beepLength:3);
NOBACKUP(int8_t hapticStrength:3); NOBACKUP(int8_t hapticStrength:3);
@ -778,7 +779,7 @@ PACK(struct RadioData {
NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); NOBACKUP(uint8_t disableRssiPoweroffAlarm:1);
NOBACKUP(uint8_t USBMode:2); NOBACKUP(uint8_t USBMode:2);
NOBACKUP(uint8_t jackMode:2); NOBACKUP(uint8_t jackMode:2);
NOBACKUP(uint8_t spare2:1); NOBACKUP(uint8_t spare3:1);
NOBACKUP(char ttsLanguage[2]); NOBACKUP(char ttsLanguage[2]);
NOBACKUP(int8_t beepVolume:4); NOBACKUP(int8_t beepVolume:4);
NOBACKUP(int8_t wavVolume:4); NOBACKUP(int8_t wavVolume:4);

View file

@ -183,8 +183,7 @@ void title(const char * s);
title(name) title(name)
typedef int choice_t; typedef int choice_t;
choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable = nullptr);
choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event);
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, const char * label, LcdFlags attr, event_t event); uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, const char * label, LcdFlags attr, event_t event);
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event); swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event);

View file

@ -22,6 +22,15 @@
#define MODELSEL_W LCD_W #define MODELSEL_W LCD_W
void onDeleteModelConfirm(const char * result)
{
if (result == STR_OK) {
storageCheck(true);
eeDeleteModel(menuVerticalPosition); // delete file
s_copyMode = 0;
}
}
void onModelSelectMenu(const char * result) void onModelSelectMenu(const char * result)
{ {
int8_t sub = menuVerticalPosition; int8_t sub = menuVerticalPosition;
@ -51,7 +60,7 @@ void onModelSelectMenu(const char * result)
} }
#endif #endif
else if (result == STR_DELETE_MODEL) { else if (result == STR_DELETE_MODEL) {
POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); POPUP_CONFIRMATION(STR_DELETEMODEL, onDeleteModelConfirm);
SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), ZCHAR); SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), ZCHAR);
} }
#if defined(SDCARD) #if defined(SDCARD)
@ -68,14 +77,6 @@ void onModelSelectMenu(const char * result)
void menuModelSelect(event_t event) void menuModelSelect(event_t event)
{ {
if (warningResult) {
warningResult = 0;
storageCheck(true);
eeDeleteModel(menuVerticalPosition); // delete file
s_copyMode = 0;
event = EVT_ENTRY_UP;
}
event_t _event_ = event; event_t _event_ = event;
if ((s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT) || IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event)) { if ((s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT) || IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event)) {
_event_ = 0; _event_ = 0;

View file

@ -87,7 +87,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS, ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS,
ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND, ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND,
ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM, ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM,
#if defined(EXTERNAL_ANTENNA) #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA, ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA,
#endif #endif
ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE,
@ -221,8 +221,25 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW()
#define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) #define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL())
#define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW)
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
#define EXTERNAL_ANTENNA_ROW ((isModuleXJT(INTERNAL_MODULE) && g_eeGeneral.antennaMode == ANTENNA_MODE_PER_MODEL) ? (uint8_t)0 : HIDDEN_ROW),
void onModelAntennaSwitchConfirm(const char * result)
{
if (result == STR_OK) {
// Switch to external antenna confirmation
g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode = ANTENNA_MODE_EXTERNAL;
globalData.externalAntennaEnabled = true;
storageDirty(EE_MODEL);
}
else {
reusableBuffer.moduleSetup.antennaMode = g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode;
}
}
#else
#define EXTERNAL_ANTENNA_ROW
#endif
#if defined(PCBX7) || defined(PCBX9LITE) #if defined(PCBX7) || defined(PCBX9LITE)
#define ANTENNA_ROW
#if defined(BLUETOOTH) #if defined(BLUETOOTH)
#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)),
#else #else
@ -231,12 +248,10 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW()
#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) #define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW)
#define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW
#elif defined(PCBXLITES) #elif defined(PCBXLITES)
#define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)),
#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW))
#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) #define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW)
#define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW #define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW
#elif defined(PCBXLITE) #elif defined(PCBXLITE)
#define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)),
#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW))
#define TRAINER_ROWS IF_BT_TRAINER_ON(LABEL(Trainer)), IF_BT_TRAINER_ON(0), IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), IF_BT_TRAINER_ON(TRAINER_CHANNELS_ROW), HIDDEN_ROW /* xlite has only BT trainer, so never PPM */ #define TRAINER_ROWS IF_BT_TRAINER_ON(LABEL(Trainer)), IF_BT_TRAINER_ON(0), IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), IF_BT_TRAINER_ON(TRAINER_CHANNELS_ROW), HIDDEN_ROW /* xlite has only BT trainer, so never PPM */
#else #else
@ -271,7 +286,7 @@ void onBluetoothConnectMenu(const char * result)
INTERNAL_MODULE_CHANNELS_ROWS, \ INTERNAL_MODULE_CHANNELS_ROWS, \
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1)), \ IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1)), \
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* RxNum */ \ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* RxNum */ \
ANTENNA_ROW \ EXTERNAL_ANTENNA_ROW \
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* Failsafe */ \ IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* Failsafe */ \
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* Range check and Register buttons */ \ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* Range check and Register buttons */ \
IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* Module options */ \ IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* Module options */ \
@ -282,16 +297,6 @@ void onBluetoothConnectMenu(const char * result)
#define INTERNAL_MODULE_ROWS #define INTERNAL_MODULE_ROWS
#endif #endif
#if defined(EXTERNAL_ANTENNA)
void onAntennaSwitchConfirm(const char * result)
{
if (result == STR_OK) {
// Switch to external antenna confirmation
g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna = XJT_EXTERNAL_ANTENNA;
}
}
#endif
void menuModelSetup(event_t event) void menuModelSetup(event_t event)
{ {
int8_t old_editMode = s_editMode; int8_t old_editMode = s_editMode;
@ -369,6 +374,9 @@ void menuModelSetup(event_t event)
if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { if (event == EVT_ENTRY || event == EVT_ENTRY_UP) {
memclear(&reusableBuffer.moduleSetup, sizeof(reusableBuffer.moduleSetup)); memclear(&reusableBuffer.moduleSetup, sizeof(reusableBuffer.moduleSetup));
reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power;
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
reusableBuffer.moduleSetup.antennaMode = g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode;
#endif
} }
#if (defined(DSM2) || defined(PXX)) #if (defined(DSM2) || defined(PXX))
@ -1375,20 +1383,23 @@ void menuModelSetup(event_t event)
} }
break; break;
#if defined(EXTERNAL_ANTENNA) #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA: case ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA:
{ reusableBuffer.moduleSetup.antennaMode = editChoice(MODEL_SETUP_2ND_COLUMN, y, INDENT TR_ANTENNA, STR_ANTENNA_MODES,
uint8_t newAntennaSel = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_ANTENNASELECTION, STR_VANTENNATYPES, g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna, 0, 1, attr, event); reusableBuffer.moduleSetup.antennaMode == ANTENNA_MODE_PER_MODEL ? ANTENNA_MODE_INTERNAL : reusableBuffer.moduleSetup.antennaMode,
if (newAntennaSel != g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna && newAntennaSel == XJT_EXTERNAL_ANTENNA) { ANTENNA_MODE_INTERNAL, ANTENNA_MODE_EXTERNAL, attr, event,
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onAntennaSwitchConfirm); [](int value) { return value != ANTENNA_MODE_PER_MODEL; });
const char * w = STR_ANTENNACONFIRM2; if (event && !s_editMode && reusableBuffer.moduleSetup.antennaMode != g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode) {
SET_WARNING_INFO(w, strlen(w), 0); if (reusableBuffer.moduleSetup.antennaMode == ANTENNA_MODE_EXTERNAL && !isExternalAntennaEnabled()) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onModelAntennaSwitchConfirm);
SET_WARNING_INFO(STR_ANTENNACONFIRM2, sizeof(TR_ANTENNACONFIRM2), 0);
} }
else { else {
g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna = newAntennaSel; g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode = reusableBuffer.moduleSetup.antennaMode;
checkExternalAntenna();
}
} }
break; break;
}
#endif #endif
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS: case ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS:

View file

@ -50,16 +50,24 @@
#define RSSSI_X (30) #define RSSSI_X (30)
#define RSSSI_Y (31) #define RSSSI_Y (31)
#define RSSI_MAX 105 #define RSSI_MAX 105
#define TRIM_LEN 23 #define TRIM_LEN 23
void drawRSSIGauge() void drawExternalAntennaAndRSSI()
{ {
uint8_t bar = (RSSI_MAX - g_model.rssiAlarms.getWarningRssi()) / 4; #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
if (isModuleXJT(INTERNAL_MODULE) && isExternalAntennaEnabled()) {
lcdDrawText(VBATT_X-1, VBATT_Y+8, "E", TINSIZE);
}
#endif
for(uint8_t i=1; i<5; i++) { if (TELEMETRY_RSSI() > 0) {
if((TELEMETRY_RSSI() - g_model.rssiAlarms.getWarningRssi()) > bar*(i-1)) { auto warningRSSI = g_model.rssiAlarms.getWarningRssi();
lcdDrawFilledRect(RSSSI_X + i*4, RSSSI_Y - 2*i, 3, 2*i, SOLID, 0); int8_t value = TELEMETRY_RSSI() - warningRSSI;
uint8_t step = (RSSI_MAX - warningRSSI) / 4;
for (uint8_t i = 1; i < 5; i++) {
if (value > step * (i - 1)) {
lcdDrawFilledRect(RSSSI_X + i * 4, RSSSI_Y - 2 * i + 1, 3, 2 * i - 1, SOLID, 0);
}
} }
} }
} }
@ -407,10 +415,8 @@ void menuMainView(event_t event)
// Trims sliders // Trims sliders
displayTrims(mode); displayTrims(mode);
// RSSI gauge // RSSI gauge / external antenna
if (TELEMETRY_RSSI() > 0) { drawExternalAntennaAndRSSI();
drawRSSIGauge();
}
} }
if (view_base < VIEW_INPUTS) { if (view_base < VIEW_INPUTS) {

View file

@ -111,7 +111,6 @@ void menuStatisticsDebug(event_t event)
switch (event) { switch (event) {
case EVT_ENTRY: case EVT_ENTRY:
case EVT_ENTRY_UP: case EVT_ENTRY_UP:
enableVBatBridge();
break; break;
case EVT_KEY_LONG(KEY_ENTER): case EVT_KEY_LONG(KEY_ENTER):

View file

@ -70,11 +70,11 @@ void title(const char * s)
lcdDrawText(0, 0, s, INVERS); lcdDrawText(0, 0, s, INVERS);
} }
choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event) choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable)
{ {
drawFieldLabel(x, y, label); drawFieldLabel(x, y, label);
if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr);
if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL); if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL, isValueAvailable);
return value; return value;
} }

View file

@ -209,7 +209,7 @@ void title(const char * s);
typedef int choice_t; typedef int choice_t;
choice_t editChoice(coord_t x, coord_t y, const char *label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event); choice_t editChoice(coord_t x, coord_t y, const char *label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable = nullptr);
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, const char *label, LcdFlags attr, event_t event); uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, const char *label, LcdFlags attr, event_t event);
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event); swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event);

View file

@ -384,7 +384,8 @@ void menuModelSetup(event_t event)
MENU_CHECK(menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_LINES_COUNT); MENU_CHECK(menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_LINES_COUNT);
title(STR_MENUSETUP); title(STR_MENUSETUP);
if (event == EVT_ENTRY) { if (event == EVT_ENTRY || event == EVT_ENTRY_UP) {
memclear(&reusableBuffer.moduleSetup, sizeof(reusableBuffer.moduleSetup));
reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power;
} }
@ -397,10 +398,10 @@ void menuModelSetup(event_t event)
int sub = menuVerticalPosition; int sub = menuVerticalPosition;
for (int i=0; i<NUM_BODY_LINES; ++i) { for (int i = 0; i < NUM_BODY_LINES; ++i) {
coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH; coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH;
uint8_t k = i+menuVerticalOffset; uint8_t k = i + menuVerticalOffset;
for (int j=0; j<=k; j++) { for (int j = 0; j <= k; j++) {
if (mstate_tab[j] == HIDDEN_ROW) if (mstate_tab[j] == HIDDEN_ROW)
k++; k++;
} }
@ -408,7 +409,7 @@ void menuModelSetup(event_t event)
LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS); LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS);
LcdFlags attr = (sub == k ? blink : 0); LcdFlags attr = (sub == k ? blink : 0);
switch(k) { switch (k) {
case ITEM_MODEL_SETUP_NAME: case ITEM_MODEL_SETUP_NAME:
editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_MODELNAME, g_model.header.name, sizeof(g_model.header.name), event, attr); editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_MODELNAME, g_model.header.name, sizeof(g_model.header.name), event, attr);
memcpy(modelHeaders[g_eeGeneral.currModel].name, g_model.header.name, sizeof(g_model.header.name)); memcpy(modelHeaders[g_eeGeneral.currModel].name, g_model.header.name, sizeof(g_model.header.name));

View file

@ -115,12 +115,7 @@ void menuStatisticsDebug(event_t event)
} }
#endif #endif
switch(event) { switch (event) {
case EVT_ENTRY:
case EVT_ENTRY_UP:
enableVBatBridge();
break;
case EVT_KEY_LONG(KEY_ENTER): case EVT_KEY_LONG(KEY_ENTER):
g_eeGeneral.globalTimer = 0; g_eeGeneral.globalTimer = 0;
sessionTimer = 0; sessionTimer = 0;

View file

@ -81,11 +81,11 @@ void title(const char * s)
lcdDrawText(0, 0, s, INVERS); lcdDrawText(0, 0, s, INVERS);
} }
choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event) choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable)
{ {
drawFieldLabel(x, y, label); drawFieldLabel(x, y, label);
if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr);
if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL); if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL, isValueAvailable);
return value; return value;
} }

View file

@ -64,6 +64,10 @@ const uint8_t LBM_TOPMENU_TXBATT[] = {
#include "mask_txbat.lbm" #include "mask_txbat.lbm"
}; };
const uint8_t LBM_TOPMENU_ANTENNA[] = {
#include "mask_antenna.lbm"
};
const uint8_t LBM_HTRIM_FRAME[] = { const uint8_t LBM_HTRIM_FRAME[] = {
#include "mask_htrim_frame.lbm" #include "mask_htrim_frame.lbm"
}; };

View file

@ -26,6 +26,7 @@ extern const uint8_t LBM_DOT[];
// Main view icons // Main view icons
extern const uint8_t LBM_TOPMENU_USB[]; extern const uint8_t LBM_TOPMENU_USB[];
extern const uint8_t LBM_TOPMENU_ANTENNA[];
extern const uint8_t LBM_TOPMENU_VOLUME_0[]; extern const uint8_t LBM_TOPMENU_VOLUME_0[];
extern const uint8_t LBM_TOPMENU_VOLUME_1[]; extern const uint8_t LBM_TOPMENU_VOLUME_1[];
extern const uint8_t LBM_TOPMENU_VOLUME_2[]; extern const uint8_t LBM_TOPMENU_VOLUME_2[];

View file

@ -548,6 +548,7 @@ inline void POPUP_MENU_SELECT_ITEM(uint8_t index)
inline void POPUP_MENU_START(PopupMenuHandler handler) inline void POPUP_MENU_START(PopupMenuHandler handler)
{ {
if (handler != popupMenuHandler) { if (handler != popupMenuHandler) {
killAllEvents();
AUDIO_KEY_PRESS(); AUDIO_KEY_PRESS();
popupMenuHandler = handler; popupMenuHandler = handler;
} }
@ -582,7 +583,10 @@ inline void POPUP_WARNING(const char * s)
popupFunc = runPopupWarning; popupFunc = runPopupWarning;
} }
inline void POPUP_CONFIRMATION(const char *s, void (* confirmHandler)(const char *) = nullptr) typedef void (* PopupMenuHandler)(const char * result);
extern PopupMenuHandler popupMenuHandler;
inline void POPUP_CONFIRMATION(const char *s, PopupMenuHandler confirmHandler)
{ {
warningText = s; warningText = s;
warningType = WARNING_TYPE_CONFIRM; warningType = WARNING_TYPE_CONFIRM;

View file

@ -219,6 +219,27 @@ bool menuModelWizard(event_t event)
} }
#endif #endif
void onDeleteModelConfirm(const char * result)
{
if (result == STR_OK) {
if (deleteMode == MODE_DELETE_CATEGORY) {
modelslist.removeCategory(currentCategory);
modelslist.save();
setCurrentCategory(currentCategoryIndex > 0 ? currentCategoryIndex-1 : currentCategoryIndex);
}
else if (deleteMode == MODE_DELETE_MODEL){
int modelIndex = MODEL_INDEX();
modelslist.removeModel(currentCategory, currentModel);
s_copyMode = 0;
putEvent(EVT_REFRESH);
if (modelIndex > 0) {
modelIndex--;
}
setCurrentModel(modelIndex);
}
}
}
void onModelSelectMenu(const char * result) void onModelSelectMenu(const char * result)
{ {
if (result == STR_SELECT_MODEL) { if (result == STR_SELECT_MODEL) {
@ -233,7 +254,7 @@ void onModelSelectMenu(const char * result)
chainMenu(menuMainView); chainMenu(menuMainView);
} }
else if (result == STR_DELETE_MODEL) { else if (result == STR_DELETE_MODEL) {
POPUP_CONFIRMATION(STR_DELETEMODEL); POPUP_CONFIRMATION(STR_DELETEMODEL, onDeleteModelConfirm);
SET_WARNING_INFO(currentModel->modelName, LEN_MODEL_NAME, 0); SET_WARNING_INFO(currentModel->modelName, LEN_MODEL_NAME, 0);
deleteMode = MODE_DELETE_MODEL; deleteMode = MODE_DELETE_MODEL;
} }
@ -279,7 +300,7 @@ void onModelSelectMenu(const char * result)
SET_WARNING_INFO(STR_CAT_NOT_EMPTY, sizeof(TR_CAT_NOT_EMPTY), 0); SET_WARNING_INFO(STR_CAT_NOT_EMPTY, sizeof(TR_CAT_NOT_EMPTY), 0);
} }
else { else {
POPUP_CONFIRMATION(STR_DELETEMODEL); POPUP_CONFIRMATION(STR_DELETEMODEL, onDeleteModelConfirm);
SET_WARNING_INFO(currentCategory->name, LEN_MODEL_FILENAME, 0); SET_WARNING_INFO(currentCategory->name, LEN_MODEL_FILENAME, 0);
deleteMode = MODE_DELETE_CATEGORY; deleteMode = MODE_DELETE_CATEGORY;
} }
@ -322,26 +343,6 @@ void initModelsList()
bool menuModelSelect(event_t event) bool menuModelSelect(event_t event)
{ {
if (warningResult) {
warningResult = 0;
if (deleteMode == MODE_DELETE_CATEGORY) {
TRACE("DELETE CATEGORY");
modelslist.removeCategory(currentCategory);
modelslist.save();
setCurrentCategory(currentCategoryIndex > 0 ? currentCategoryIndex-1 : currentCategoryIndex);
}
else if (deleteMode == MODE_DELETE_MODEL){
int modelIndex = MODEL_INDEX();
modelslist.removeModel(currentCategory, currentModel);
s_copyMode = 0;
event = EVT_REFRESH;
if (modelIndex > 0) {
modelIndex--;
}
setCurrentModel(modelIndex);
}
}
const std::list<ModelsCategory*>& cats = modelslist.getCategories(); const std::list<ModelsCategory*>& cats = modelslist.getCategories();
switch(event) { switch(event) {
case 0: case 0:

View file

@ -72,7 +72,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS, ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS,
ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND, ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND,
ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM, ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM,
#if defined(EXTERNAL_ANTENNA) #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA, ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA,
#endif #endif
ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE,
@ -509,17 +509,22 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW()
#define REGISTRATION_ID_ROWS #define REGISTRATION_ID_ROWS
#endif #endif
#if defined(EXTERNAL_ANTENNA) #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
#define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)), // Antenna #define EXTERNAL_ANTENNA_ROW ((isModuleXJT(INTERNAL_MODULE) && g_eeGeneral.antennaMode == ANTENNA_MODE_PER_MODEL) ? (uint8_t)0 : HIDDEN_ROW),
void onAntennaSwitchConfirm(const char * result) void onModelAntennaSwitchConfirm(const char * result)
{ {
if (result == STR_OK) { if (result == STR_OK) {
// Switch to external antenna confirmation // Switch to external antenna confirmation
g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna = XJT_EXTERNAL_ANTENNA; g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode = ANTENNA_MODE_EXTERNAL;
globalData.externalAntennaEnabled = true;
storageDirty(EE_MODEL);
}
else {
reusableBuffer.moduleSetup.antennaMode = g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode;
} }
} }
#else #else
#define ANTENNA_ROW #define EXTERNAL_ANTENNA_ROW
#endif #endif
bool menuModelSetup(event_t event) bool menuModelSetup(event_t event)
@ -559,7 +564,7 @@ bool menuModelSetup(event_t event)
INTERNAL_MODULE_CHANNELS_ROWS, INTERNAL_MODULE_CHANNELS_ROWS,
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))), IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))),
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum
ANTENNA_ROW EXTERNAL_ANTENNA_ROW
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)),
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* Range check and Register buttons */ \ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* Range check and Register buttons */ \
IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* Module options */ \ IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* Module options */ \
@ -586,8 +591,12 @@ bool menuModelSetup(event_t event)
TRAINER_ROWS TRAINER_ROWS
}); });
if (event == EVT_ENTRY) { if (event == EVT_ENTRY || event == EVT_ENTRY_UP) {
memclear(&reusableBuffer.moduleSetup, sizeof(reusableBuffer.moduleSetup));
reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power;
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
reusableBuffer.moduleSetup.antennaMode = g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode;
#endif
} }
if (menuEvent) { if (menuEvent) {
@ -597,10 +606,10 @@ bool menuModelSetup(event_t event)
int sub = menuVerticalPosition; int sub = menuVerticalPosition;
for (uint8_t i=0; i<NUM_BODY_LINES; ++i) { for (uint8_t i = 0; i < NUM_BODY_LINES; ++i) {
coord_t y = MENU_CONTENT_TOP + i*FH; coord_t y = MENU_CONTENT_TOP + i*FH;
uint8_t k = i + menuVerticalOffset; uint8_t k = i + menuVerticalOffset;
for (int j=0; j<=k; j++) { for (int j = 0; j <= k; j++) {
if (mstate_tab[j] == HIDDEN_ROW) if (mstate_tab[j] == HIDDEN_ROW)
k++; k++;
} }
@ -608,7 +617,7 @@ bool menuModelSetup(event_t event)
LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS); LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS);
LcdFlags attr = (sub == k ? blink : 0); LcdFlags attr = (sub == k ? blink : 0);
switch(k) { switch (k) {
case ITEM_MODEL_SETUP_NAME: case ITEM_MODEL_SETUP_NAME:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODELNAME); lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODELNAME);
editName(MODEL_SETUP_2ND_COLUMN, y, g_model.header.name, sizeof(g_model.header.name), event, attr); editName(MODEL_SETUP_2ND_COLUMN, y, g_model.header.name, sizeof(g_model.header.name), event, attr);
@ -968,21 +977,21 @@ bool menuModelSetup(event_t event)
} }
break; break;
#if defined(EXTERNAL_ANTENNA) #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA: case ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA:
{ lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_ANTENNA);
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ANTENNASELECTION); reusableBuffer.moduleSetup.antennaMode = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_ANTENNA_MODES, reusableBuffer.moduleSetup.antennaMode == ANTENNA_MODE_PER_MODEL ? ANTENNA_MODE_INTERNAL : reusableBuffer.moduleSetup.antennaMode, ANTENNA_MODE_INTERNAL, ANTENNA_MODE_EXTERNAL, attr, event, [](int value) { return value != ANTENNA_MODE_PER_MODEL; });
uint8_t newAntennaSel = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VANTENNATYPES, g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna, 0, 1, attr, event); if (event && !s_editMode && reusableBuffer.moduleSetup.antennaMode != g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode) {
if (newAntennaSel != g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna && newAntennaSel == XJT_EXTERNAL_ANTENNA) { if (reusableBuffer.moduleSetup.antennaMode == ANTENNA_MODE_EXTERNAL && !isExternalAntennaEnabled()) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onAntennaSwitchConfirm); POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onModelAntennaSwitchConfirm);
const char * w = STR_ANTENNACONFIRM2; SET_WARNING_INFO(STR_ANTENNACONFIRM2, sizeof(TR_ANTENNACONFIRM2), 0);
SET_WARNING_INFO(w, strlen(w), 0);
} }
else { else {
g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna = newAntennaSel; g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode = reusableBuffer.moduleSetup.antennaMode;
checkExternalAntenna();
}
} }
break; break;
}
#endif #endif
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL: case ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL:

View file

@ -58,9 +58,15 @@ enum MenuRadioHardwareItems {
ITEM_RADIO_HARDWARE_BLUETOOTH_MODE, ITEM_RADIO_HARDWARE_BLUETOOTH_MODE,
ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE, ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE,
ITEM_RADIO_HARDWARE_BLUETOOTH_NAME, ITEM_RADIO_HARDWARE_BLUETOOTH_NAME,
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA,
#endif
#if defined(AUX_SERIAL) #if defined(AUX_SERIAL)
ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE, ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE,
#endif #endif
ITEM_RADIO_HARDWARE_JITTER_FILTER, ITEM_RADIO_HARDWARE_JITTER_FILTER,
ITEM_RADIO_HARDWARE_MAX ITEM_RADIO_HARDWARE_MAX
}; };
@ -76,6 +82,23 @@ enum MenuRadioHardwareItems {
// TODO should be moved to the HAL // TODO should be moved to the HAL
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SI-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SJ-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SI-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SJ-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
#define EXTERNAL_ANTENNA_ROW 0,
void onHardwareAntennaSwitchConfirm(const char * result)
{
if (result == STR_OK) {
// Switch to external antenna confirmation
g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode;
storageDirty(EE_GENERAL);
}
else {
reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode;
}
}
#else
#define EXTERNAL_ANTENNA_ROW
#endif
bool menuRadioHardware(event_t event) bool menuRadioHardware(event_t event)
{ {
MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, { MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, {
@ -100,10 +123,22 @@ bool menuRadioHardware(event_t event)
BLUETOOTH_ROWS, BLUETOOTH_ROWS,
EXTERNAL_ANTENNA_ROW
0, /* aux serial mode */ 0, /* aux serial mode */
0, /* ADC filter */ 0, /* ADC filter */
}); });
if (menuEvent) {
disableVBatBridge();
}
else if (event == EVT_ENTRY) {
enableVBatBridge();
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode;
#endif
}
uint8_t sub = menuVerticalPosition; uint8_t sub = menuVerticalPosition;
for (int i=0; i<NUM_BODY_LINES; ++i) { for (int i=0; i<NUM_BODY_LINES; ++i) {
@ -242,15 +277,32 @@ bool menuRadioHardware(event_t event)
break; break;
case ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE: case ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE:
lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_PIN_CODE); lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BLUETOOTH_PIN_CODE);
lcdDrawText(HW_SETTINGS_COLUMN+50, y, "000000", 0); lcdDrawText(HW_SETTINGS_COLUMN+50, y, "000000", 0);
break; break;
case ITEM_RADIO_HARDWARE_BLUETOOTH_NAME: case ITEM_RADIO_HARDWARE_BLUETOOTH_NAME:
lcdDrawText(INDENT_WIDTH, y, STR_NAME); lcdDrawText(MENUS_MARGIN_LEFT, y, STR_NAME);
editName(HW_SETTINGS_COLUMN+50, y, g_eeGeneral.bluetoothName, LEN_BLUETOOTH_NAME, event, attr); editName(HW_SETTINGS_COLUMN+50, y, g_eeGeneral.bluetoothName, LEN_BLUETOOTH_NAME, event, attr);
break; break;
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
case ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ANTENNA);
reusableBuffer.radioHardware.antennaMode = editChoice(HW_SETTINGS_COLUMN+50, y, STR_ANTENNA_MODES, reusableBuffer.radioHardware.antennaMode, ANTENNA_MODE_INTERNAL, ANTENNA_MODE_EXTERNAL, attr, event);
if (!s_editMode && reusableBuffer.radioHardware.antennaMode != g_eeGeneral.antennaMode) {
if (!isExternalAntennaEnabled() && (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_EXTERNAL || (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_PER_MODEL && g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode == ANTENNA_MODE_EXTERNAL))) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onHardwareAntennaSwitchConfirm);
SET_WARNING_INFO(STR_ANTENNACONFIRM2, sizeof(TR_ANTENNACONFIRM2), 0);
}
else {
g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode;
checkExternalAntenna();
}
}
break;
#endif
#if defined(AUX_SERIAL) #if defined(AUX_SERIAL)
case ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE: case ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_AUX_SERIAL_MODE); lcdDrawText(MENUS_MARGIN_LEFT, y, STR_AUX_SERIAL_MODE);
@ -264,7 +316,7 @@ bool menuRadioHardware(event_t event)
case ITEM_RADIO_HARDWARE_JITTER_FILTER: case ITEM_RADIO_HARDWARE_JITTER_FILTER:
{ {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_JITTER_FILTER); lcdDrawText(MENUS_MARGIN_LEFT, y, STR_JITTER_FILTER);
uint8_t b = 1-g_eeGeneral.jitterFilter; uint8_t b = 1 - g_eeGeneral.jitterFilter;
g_eeGeneral.jitterFilter = 1 - editCheckBox(b, HW_SETTINGS_COLUMN+50, y, attr, event); g_eeGeneral.jitterFilter = 1 - editCheckBox(b, HW_SETTINGS_COLUMN+50, y, attr, event);
break; break;
} }

View file

@ -72,6 +72,19 @@ void getSelectionFullPath(char * lfn)
strcat(lfn, reusableBuffer.sdManager.lines[menuVerticalPosition - menuVerticalOffset]); strcat(lfn, reusableBuffer.sdManager.lines[menuVerticalPosition - menuVerticalOffset]);
} }
void onSdFormatConfirm(const char * result)
{
if (result == STR_OK) {
showMessageBox(STR_FORMATTING);
logsClose();
audioQueue.stopSD();
if(sdCardFormat()) {
f_chdir("/");
REFRESH_FILES();
}
}
}
void onSdManagerMenu(const char * result) void onSdManagerMenu(const char * result)
{ {
TCHAR lfn[_MAX_LFN+1]; TCHAR lfn[_MAX_LFN+1];
@ -85,7 +98,7 @@ void onSdManagerMenu(const char * result)
pushMenu(menuRadioSdManagerInfo); pushMenu(menuRadioSdManagerInfo);
} }
else if (result == STR_SD_FORMAT) { else if (result == STR_SD_FORMAT) {
POPUP_CONFIRMATION(STR_CONFIRM_FORMAT); POPUP_CONFIRMATION(STR_CONFIRM_FORMAT, onSdFormatConfirm);
} }
else if (result == STR_COPY_FILE) { else if (result == STR_COPY_FILE) {
clipboard.type = CLIPBOARD_TYPE_SD_FILE; clipboard.type = CLIPBOARD_TYPE_SD_FILE;
@ -165,17 +178,6 @@ void onSdManagerMenu(const char * result)
bool menuRadioSdManager(event_t _event) bool menuRadioSdManager(event_t _event)
{ {
if (warningResult) {
warningResult = 0;
showMessageBox(STR_FORMATTING);
logsClose();
audioQueue.stopSD();
if(sdCardFormat()) {
f_chdir("/");
REFRESH_FILES();
}
}
event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event);
SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SD_MANAGER, reusableBuffer.sdManager.count); SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SD_MANAGER, reusableBuffer.sdManager.count);

View file

@ -86,16 +86,16 @@ bool menuRadioTools(event_t event)
uint8_t index = 0; uint8_t index = 0;
#if defined(PXX2) #if defined(PXX2)
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER))
addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE); addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE);
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER))
addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE); addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE);
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE);
#endif #endif

View file

@ -69,6 +69,12 @@ void drawTopBar()
lcdDrawSolidFilledRect(LCD_W-90 + i * 6, 38 - height, 4, height, TELEMETRY_RSSI() >= rssiBarsValue[i] ? MENU_TITLE_COLOR : MENU_TITLE_DISABLE_COLOR); lcdDrawSolidFilledRect(LCD_W-90 + i * 6, 38 - height, 4, height, TELEMETRY_RSSI() >= rssiBarsValue[i] ? MENU_TITLE_COLOR : MENU_TITLE_DISABLE_COLOR);
} }
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
if (isModuleXJT(INTERNAL_MODULE) && isExternalAntennaEnabled()) {
lcdDrawBitmapPattern(LCD_W-94, 4, LBM_TOPMENU_ANTENNA, MENU_TITLE_COLOR);
}
#endif
/* Audio volume */ /* Audio volume */
lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_SCALE, MENU_TITLE_DISABLE_COLOR); lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_SCALE, MENU_TITLE_DISABLE_COLOR);
if (requiredSpeakerVolume == 0 || g_eeGeneral.beepMode == e_mode_quiet) if (requiredSpeakerVolume == 0 || g_eeGeneral.beepMode == e_mode_quiet)

View file

@ -98,7 +98,6 @@ bool menuStatsDebug(event_t event)
switch(event) { switch(event) {
case EVT_ENTRY: case EVT_ENTRY:
case EVT_ENTRY_UP: case EVT_ENTRY_UP:
enableVBatBridge();
break; break;
case EVT_KEY_FIRST(KEY_ENTER): case EVT_KEY_FIRST(KEY_ENTER):

View file

@ -58,7 +58,7 @@ class Widget
virtual const char * getErrorMessage() const virtual const char * getErrorMessage() const
{ {
return NULL; return nullptr;
} }
inline ZoneOptionValue * getOptionValue(unsigned int index) const inline ZoneOptionValue * getOptionValue(unsigned int index) const
@ -83,7 +83,7 @@ void registerWidget(const WidgetFactory * factory);
class WidgetFactory class WidgetFactory
{ {
public: public:
WidgetFactory(const char * name, const ZoneOption * options=NULL): WidgetFactory(const char * name, const ZoneOption * options=nullptr):
name(name), name(name),
options(options) options(options)
{ {

View file

@ -44,9 +44,9 @@ void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att
} }
} }
int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event) int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable)
{ {
if (attr & INVERS) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL); if (attr & INVERS) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL, isValueAvailable);
if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr);
return value; return value;
} }

View file

@ -25,7 +25,7 @@
void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix); void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix);
void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att); void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att);
int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event); int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable=nullptr);
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags attr, event_t event); uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags attr, event_t event);
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event); swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event);
void drawFatalErrorScreen(const char * message); void drawFatalErrorScreen(const char * message);

View file

@ -24,26 +24,26 @@ void onBindMenu(const char * result)
uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE);
if (result == STR_BINDING_1_8_TELEM_ON) { if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = false;
if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) { if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_25_8CH; g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_25_8CH;
} }
} }
else if (result == STR_BINDING_1_8_TELEM_OFF) { else if (result == STR_BINDING_1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = false;
if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) { if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_100_16CH_NOTELEM; g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_100_16CH_NOTELEM;
} }
} }
else if (result == STR_BINDING_9_16_TELEM_ON) { else if (result == STR_BINDING_9_16_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = true;
} }
else if (result == STR_BINDING_9_16_TELEM_OFF) { else if (result == STR_BINDING_9_16_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = true;
} }
else { else {
return; return;
@ -66,13 +66,13 @@ void startBindMenu(uint8_t moduleIdx)
POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF);
} }
if (isBindCh9To16Allowed(moduleIdx) && g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16) { if (isBindCh9To16Allowed(moduleIdx) && g_model.moduleData[moduleIdx].pxx.receiverHigherChannels) {
selection += 1; selection += 1;
if (isTelemAllowedOnBind(moduleIdx)) if (isTelemAllowedOnBind(moduleIdx))
selection += 1; selection += 1;
} }
if (isTelemAllowedOnBind(moduleIdx) && g_model.moduleData[moduleIdx].pxx.receiver_telem_off) if (isTelemAllowedOnBind(moduleIdx) && g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff)
selection += 1; selection += 1;
POPUP_MENU_SELECT_ITEM(selection); POPUP_MENU_SELECT_ITEM(selection);

View file

@ -107,12 +107,15 @@ enum
inline void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler) inline void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler)
{ {
if (s != warningText) {
killAllEvents();
warningText = s; warningText = s;
warningInfoText = nullptr; warningInfoText = nullptr;
warningType = WARNING_TYPE_CONFIRM; warningType = WARNING_TYPE_CONFIRM;
popupFunc = runPopupWarning; popupFunc = runPopupWarning;
popupMenuHandler = handler; popupMenuHandler = handler;
} }
}
inline void POPUP_INPUT(const char * s, PopupFunc func) inline void POPUP_INPUT(const char * s, PopupFunc func)
{ {
@ -144,8 +147,9 @@ enum
inline void POPUP_MENU_ADD_ITEM(const char * s) inline void POPUP_MENU_ADD_ITEM(const char * s)
{ {
popupMenuOffsetType = MENU_OFFSET_INTERNAL; popupMenuOffsetType = MENU_OFFSET_INTERNAL;
if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) {
popupMenuItems[popupMenuItemsCount++] = s; popupMenuItems[popupMenuItemsCount++] = s;
}
} }
#if defined(SDCARD) #if defined(SDCARD)
@ -162,6 +166,7 @@ inline void POPUP_MENU_SELECT_ITEM(uint8_t index)
inline void POPUP_MENU_START(PopupMenuHandler handler) inline void POPUP_MENU_START(PopupMenuHandler handler)
{ {
if (handler != popupMenuHandler) { if (handler != popupMenuHandler) {
killAllEvents();
AUDIO_KEY_PRESS(); AUDIO_KEY_PRESS();
popupMenuHandler = handler; popupMenuHandler = handler;
} }

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "opentx.h" #include <opentx.h>
#if defined(PCBSKY9X) #if defined(PCBSKY9X)
#define HW_SETTINGS_COLUMN (2+(15*FW)) #define HW_SETTINGS_COLUMN (2+(15*FW))
@ -169,6 +169,10 @@ enum {
ITEM_RADIO_HARDWARE_BLUETOOTH_NAME, ITEM_RADIO_HARDWARE_BLUETOOTH_NAME,
#endif #endif
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA,
#endif
#if defined(AUX_SERIAL) #if defined(AUX_SERIAL)
ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE, ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE,
#endif #endif
@ -221,6 +225,23 @@ enum {
#define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? -1 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), #define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? -1 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0),
#endif #endif
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
#define EXTERNAL_ANTENNA_ROW 0,
void onHardwareAntennaSwitchConfirm(const char * result)
{
if (result == STR_OK) {
// Switch to external antenna confirmation
g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode;
storageDirty(EE_GENERAL);
}
else {
reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode;
}
}
#else
#define EXTERNAL_ANTENNA_ROW
#endif
#if defined(PCBX9LITE) #if defined(PCBX9LITE)
#define SWITCH_TYPE_MAX(sw) (sw == MIXSRC_SD-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS) #define SWITCH_TYPE_MAX(sw) (sw == MIXSRC_SD-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS)
#elif defined(PCBXLITES) #elif defined(PCBXLITES)
@ -298,6 +319,8 @@ void menuRadioHardware(event_t event)
BLUETOOTH_ROWS BLUETOOTH_ROWS
EXTERNAL_ANTENNA_ROW
AUX_SERIAL_ROWS AUX_SERIAL_ROWS
0 /* ADC filter */, 0 /* ADC filter */,
@ -324,6 +347,9 @@ void menuRadioHardware(event_t event)
} }
else if (event == EVT_ENTRY) { else if (event == EVT_ENTRY) {
enableVBatBridge(); enableVBatBridge();
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode;
#endif
} }
for (uint8_t i=0; i<NUM_BODY_LINES; i++) { for (uint8_t i=0; i<NUM_BODY_LINES; i++) {
@ -546,6 +572,22 @@ void menuRadioHardware(event_t event)
break; break;
#endif #endif
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
case ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA:
reusableBuffer.radioHardware.antennaMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_ANTENNA, STR_ANTENNA_MODES, reusableBuffer.radioHardware.antennaMode, ANTENNA_MODE_INTERNAL, ANTENNA_MODE_EXTERNAL, attr, event);
if (!s_editMode && reusableBuffer.radioHardware.antennaMode != g_eeGeneral.antennaMode) {
if (!isExternalAntennaEnabled() && (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_EXTERNAL || (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_PER_MODEL && g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode == ANTENNA_MODE_EXTERNAL))) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onHardwareAntennaSwitchConfirm);
SET_WARNING_INFO(STR_ANTENNACONFIRM2, sizeof(TR_ANTENNACONFIRM2), 0);
}
else {
g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode;
checkExternalAntenna();
}
}
break;
#endif
#if defined(AUX_SERIAL) #if defined(AUX_SERIAL)
case ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE: case ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE:
g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODE, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event); g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODE, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event);

View file

@ -85,16 +85,16 @@ void menuRadioTools(event_t event)
uint8_t index = 0; uint8_t index = 0;
#if defined(PXX2) #if defined(PXX2)
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER))
addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE); addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE);
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER))
addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE); addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE);
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE);
#endif #endif

View file

@ -110,7 +110,6 @@ void drawCurve(coord_t offset=0);
#if defined(COLORLCD) #if defined(COLORLCD)
void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags=0, const char * prefix=nullptr, const char * suffix=nullptr); void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags=0, const char * prefix=nullptr, const char * suffix=nullptr);
int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags flags, event_t event);
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags flags, event_t event); uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags flags, event_t event);
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags flags, event_t event); swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags flags, event_t event);
void drawFatalErrorScreen(const char * message); void drawFatalErrorScreen(const char * message);

View file

@ -314,7 +314,9 @@ void guiMain(event_t evt)
const char * result = runPopupMenu(evt); const char * result = runPopupMenu(evt);
if (result) { if (result) {
TRACE("popupMenuHandler(%s)", result); TRACE("popupMenuHandler(%s)", result);
popupMenuHandler(result); auto handler = popupMenuHandler;
popupMenuHandler = nullptr;
handler(result);
if (menuEvent == 0) { if (menuEvent == 0) {
evt = EVT_REFRESH; evt = EVT_REFRESH;
continue; continue;
@ -453,7 +455,9 @@ void guiMain(event_t evt)
const char * result = runPopupMenu(evt); const char * result = runPopupMenu(evt);
if (result) { if (result) {
TRACE("popupMenuHandler(%s)", result); TRACE("popupMenuHandler(%s)", result);
popupMenuHandler(result); auto handler = popupMenuHandler;
popupMenuHandler = nullptr;
handler(result);
} }
} }

View file

@ -910,6 +910,10 @@ void checkAll()
} }
} }
#if defined(EXTERNAL_ANTENNA) && defined(INTERNAL_MODULE_PXX1)
checkExternalAntenna();
#endif
START_SILENCE_PERIOD(); START_SILENCE_PERIOD();
} }
#endif // GUI #endif // GUI

View file

@ -568,7 +568,8 @@ void flightReset(uint8_t check=true);
PACK(struct GlobalData { PACK(struct GlobalData {
uint8_t unexpectedShutdown:1; uint8_t unexpectedShutdown:1;
uint8_t sdcardPresent:1; uint8_t sdcardPresent:1;
uint8_t spare:6; uint8_t externalAntennaEnabled: 1;
uint8_t spare:5;
}); });
extern GlobalData globalData; extern GlobalData globalData;
@ -1106,6 +1107,7 @@ union ReusableBuffer
struct { struct {
char msg[64]; char msg[64];
uint8_t r9mPower; uint8_t r9mPower;
int8_t antennaMode;
BindInformation bindInformation; BindInformation bindInformation;
struct { struct {
union { union {
@ -1165,13 +1167,17 @@ union ReusableBuffer
uint32_t updateTime; uint32_t updateTime;
ModuleSettings moduleSettings; ModuleSettings moduleSettings;
ReceiverSettings receiverSettings; // when dealing with receiver settings, we also need module settings ReceiverSettings receiverSettings; // when dealing with receiver settings, we also need module settings
} hardwareAndSettings; } hardwareAndSettings; // moduleOptions, receiverOptions, radioVersion
struct { struct {
ModuleInformation modules[NUM_MODULES]; ModuleInformation modules[NUM_MODULES];
uint8_t linesCount; uint8_t linesCount;
} radioTools; } radioTools;
struct {
int8_t antennaMode;
} radioHardware;
struct { struct {
uint8_t stickMode; uint8_t stickMode;
} generalSettings; } generalSettings;

View file

@ -1,3 +1,26 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef _MODULES_CONSTANTS_H_
#define _MODULES_CONSTANTS_H_
enum ModuleType { enum ModuleType {
MODULE_TYPE_NONE = 0, MODULE_TYPE_NONE = 0,
MODULE_TYPE_PPM, MODULE_TYPE_PPM,
@ -164,3 +187,14 @@ enum FailsafeModes {
FAILSAFE_RECEIVER, FAILSAFE_RECEIVER,
FAILSAFE_LAST = FAILSAFE_RECEIVER FAILSAFE_LAST = FAILSAFE_RECEIVER
}; };
enum AntennaModes {
ANTENNA_MODE_INTERNAL = -2,
ANTENNA_MODE_ASK = -1,
ANTENNA_MODE_PER_MODEL = 0,
ANTENNA_MODE_EXTERNAL = 1,
ANTENNA_MODE_FIRST = ANTENNA_MODE_INTERNAL,
ANTENNA_MODE_LAST = ANTENNA_MODE_EXTERNAL
};
#endif // _MODULES_CONSTANTS_H_

View file

@ -0,0 +1,43 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "opentx.h"
#if defined(EXTERNAL_ANTENNA)
bool isExternalAntennaEnabled()
{
switch (g_eeGeneral.antennaMode) {
case ANTENNA_MODE_INTERNAL:
return false;
case ANTENNA_MODE_EXTERNAL:
return true;
case ANTENNA_MODE_PER_MODEL:
switch (g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode) {
case ANTENNA_MODE_EXTERNAL:
case ANTENNA_MODE_ASK:
return globalData.externalAntennaEnabled;
default:
return false;
}
default:
return globalData.externalAntennaEnabled;
}
}
#endif

View file

@ -479,4 +479,6 @@ inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType)
setDefaultPpmFrameLength(moduleIdx); setDefaultPpmFrameLength(moduleIdx);
} }
extern bool isExternalAntennaEnabled();
#endif // _MODULES_HELPERS_H_ #endif // _MODULES_HELPERS_H_

View file

@ -52,27 +52,27 @@ template <class PxxTransport>
void Pxx1Pulses<PxxTransport>::addExtraFlags(uint8_t module) void Pxx1Pulses<PxxTransport>::addExtraFlags(uint8_t module)
{ {
// Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) // Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise)
uint8_t extra_flags = 0; uint8_t extraFlags = 0;
#if defined(PCBHORUS) || defined(PCBXLITE) #if defined(EXTERNAL_ANTENNA)
if (module == INTERNAL_MODULE) { if (module == INTERNAL_MODULE && isExternalAntennaEnabled()) {
extra_flags |= (g_model.moduleData[module].pxx.external_antenna << 0); extraFlags |= (1 << 0);
} }
#endif #endif
extra_flags |= (g_model.moduleData[module].pxx.receiver_telem_off << 1); extraFlags |= (g_model.moduleData[module].pxx.receiverTelemetryOff << 1);
extra_flags |= (g_model.moduleData[module].pxx.receiver_channel_9_16 << 2); extraFlags |= (g_model.moduleData[module].pxx.receiverHigherChannels << 2);
if (isModuleR9MNonAccess(module)) { if (isModuleR9MNonAccess(module)) {
extra_flags |= (min<uint8_t>(g_model.moduleData[module].pxx.power, isModuleR9M_FCC_VARIANT(module) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); extraFlags |= (min<uint8_t>(g_model.moduleData[module].pxx.power, isModuleR9M_FCC_VARIANT(module) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3);
if (isModuleR9M_EUPLUS(module)) if (isModuleR9M_EUPLUS(module))
extra_flags |= (1 << 6); extraFlags |= (1 << 6);
} }
// Disable S.PORT if internal module is active // Disable S.PORT if internal module is active
if (module == EXTERNAL_MODULE && isSportLineUsedByInternalModule()) { if (module == EXTERNAL_MODULE && isSportLineUsedByInternalModule()) {
extra_flags |= (1 << 5); extraFlags |= (1 << 5);
} }
PxxTransport::addByte(extra_flags); PxxTransport::addByte(extraFlags);
} }
template <class PxxTransport> template <class PxxTransport>

View file

@ -243,7 +243,7 @@ void Pxx2Pulses::setupAccstBindFrame(uint8_t module)
for (uint8_t i=0; i<PXX2_LEN_RX_NAME; i++) { for (uint8_t i=0; i<PXX2_LEN_RX_NAME; i++) {
Pxx2Transport::addByte(0x00); Pxx2Transport::addByte(0x00);
} }
Pxx2Transport::addByte((g_model.moduleData[module].pxx.receiver_channel_9_16 << 7) + (g_model.moduleData[module].pxx.receiver_telem_off << 6)); Pxx2Transport::addByte((g_model.moduleData[module].pxx.receiverHigherChannels << 7) + (g_model.moduleData[module].pxx.receiverTelemetryOff << 6));
Pxx2Transport::addByte(g_model.header.modelId[module]); Pxx2Transport::addByte(g_model.header.modelId[module]);
} }

View file

@ -166,8 +166,8 @@ PACK(typedef struct {
struct { struct {
uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W
uint8_t spare1:2; uint8_t spare1:2;
uint8_t receiver_telem_off:1; // false = receiver telem enabled uint8_t receiverTelemetryOff:1; // false = receiver telem enabled
uint8_t receiver_channel_9_16:1; // false = pwm out 1-8, true 9-16 uint8_t receiverHigherChannels:1; // false = pwm out 1-8, true 9-16
uint8_t external_antenna:1; // false = internal antenna, true = external antenna uint8_t external_antenna:1; // false = internal antenna, true = external antenna
uint8_t fast:1; uint8_t fast:1;
uint8_t spare2; uint8_t spare2;

View file

@ -176,7 +176,6 @@ const char * eeRestoreModel(uint8_t i_fileDst, char *model_name);
// For conversions // For conversions
void loadRadioSettings(); void loadRadioSettings();
void loadModel(int index, bool alarms=true);
bool eepromOpen(); bool eepromOpen();
void eeLoadModelName(uint8_t id, char * name); void eeLoadModelName(uint8_t id, char * name);

View file

@ -52,6 +52,7 @@ void storageFlushCurrentModel();
void postRadioSettingsLoad(); void postRadioSettingsLoad();
void preModelLoad(); void preModelLoad();
void postModelLoad(bool alarms); void postModelLoad(bool alarms);
void checkExternalAntenna();
#if defined(EEPROM_RLC) #if defined(EEPROM_RLC)
#include "eeprom_common.h" #include "eeprom_common.h"

View file

@ -63,6 +63,56 @@ void postRadioSettingsLoad()
#endif #endif
} }
#if defined(EXTERNAL_ANTENNA) && defined(INTERNAL_MODULE_PXX1)
void onAntennaSelection(const char * result)
{
if (result == STR_USE_INTERNAL_ANTENNA) {
globalData.externalAntennaEnabled = false;
}
else if (result == STR_USE_EXTERNAL_ANTENNA) {
globalData.externalAntennaEnabled = true;
}
else {
checkExternalAntenna();
}
}
void onAntennaSwitchConfirm(const char * result)
{
if (result == STR_OK) {
// Switch to external antenna confirmation
globalData.externalAntennaEnabled = true;
}
}
void checkExternalAntenna()
{
if (isModuleXJT(INTERNAL_MODULE)) {
if (g_eeGeneral.antennaMode == ANTENNA_MODE_EXTERNAL) {
globalData.externalAntennaEnabled = true;
}
else if (g_eeGeneral.antennaMode == ANTENNA_MODE_PER_MODEL && g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode == ANTENNA_MODE_EXTERNAL) {
if (!globalData.externalAntennaEnabled) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onAntennaSwitchConfirm);
SET_WARNING_INFO(STR_ANTENNACONFIRM2, sizeof(TR_ANTENNACONFIRM2), 0);
}
}
else if (g_eeGeneral.antennaMode == ANTENNA_MODE_ASK || (g_eeGeneral.antennaMode == ANTENNA_MODE_PER_MODEL && g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode == ANTENNA_MODE_ASK)) {
globalData.externalAntennaEnabled = false;
POPUP_MENU_ADD_ITEM(STR_USE_INTERNAL_ANTENNA);
POPUP_MENU_ADD_ITEM(STR_USE_EXTERNAL_ANTENNA);
POPUP_MENU_START(onAntennaSelection);
}
else {
globalData.externalAntennaEnabled = false;
}
}
else {
globalData.externalAntennaEnabled = false;
}
}
#endif
void postModelLoad(bool alarms) void postModelLoad(bool alarms)
{ {
#if defined(PXX2) #if defined(PXX2)
@ -122,6 +172,7 @@ void postModelLoad(bool alarms)
LOAD_MODEL_BITMAP(); LOAD_MODEL_BITMAP();
LUA_LOAD_MODEL_SCRIPTS(); LUA_LOAD_MODEL_SCRIPTS();
SEND_FAILSAFE_1S(); SEND_FAILSAFE_1S();
} }

View file

@ -214,6 +214,7 @@ set(PULSES_SRC
${PULSES_SRC} ${PULSES_SRC}
pulses.cpp pulses.cpp
ppm.cpp ppm.cpp
modules_helpers.cpp
) )
if(DSM2) if(DSM2)

View file

@ -510,7 +510,7 @@ void backlightEnable(uint8_t dutyCycle = 0);
#else #else
#define BACKLIGHT_LEVEL_MIN 46 #define BACKLIGHT_LEVEL_MIN 46
#endif #endif
#define BACKLIGHT_ENABLE() backlightEnable(globalData.unexpectedShutdown ? BACKLIGHT_LEVEL_MAX : BACKLIGHT_LEVEL_MAX-g_eeGeneral.backlightBright) #define BACKLIGHT_ENABLE() backlightEnable(globalData.unexpectedShutdown ? BACKLIGHT_LEVEL_MAX : BACKLIGHT_LEVEL_MAX - g_eeGeneral.backlightBright)
#define BACKLIGHT_DISABLE() backlightEnable(globalData.unexpectedShutdown ? BACKLIGHT_LEVEL_MAX : ((g_eeGeneral.blOffBright == BACKLIGHT_LEVEL_MIN) && (g_eeGeneral.backlightMode != e_backlight_mode_off)) ? 0 : g_eeGeneral.blOffBright) #define BACKLIGHT_DISABLE() backlightEnable(globalData.unexpectedShutdown ? BACKLIGHT_LEVEL_MAX : ((g_eeGeneral.blOffBright == BACKLIGHT_LEVEL_MIN) && (g_eeGeneral.backlightMode != e_backlight_mode_off)) ? 0 : g_eeGeneral.blOffBright)
#define isBacklightEnabled() true #define isBacklightEnabled() true

View file

@ -566,6 +566,7 @@
// Internal Module // Internal Module
#define HARDWARE_INTERNAL_MODULE #define HARDWARE_INTERNAL_MODULE
#define EXTERNAL_ANTENNA
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2)
#define INTMODULE_PWR_GPIO GPIOA #define INTMODULE_PWR_GPIO GPIOA
#define INTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08 #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08

View file

@ -602,7 +602,7 @@ class OpenTxSimulatorFactory: public SimulatorFactory
virtual Board::Type type() virtual Board::Type type()
{ {
#if defined(PCBX12S) #if defined(PCBX12S)
return Board::BOARD_X12S; return Board::BOARD_HORUS_X12S;
#elif defined(PCBX10) #elif defined(PCBX10)
return Board::BOARD_X10; return Board::BOARD_X10;
#elif defined(PCBX7) #elif defined(PCBX7)
@ -612,7 +612,7 @@ class OpenTxSimulatorFactory: public SimulatorFactory
#elif defined(PCBTARANIS) #elif defined(PCBTARANIS)
return Board::BOARD_TARANIS_X9D; return Board::BOARD_TARANIS_X9D;
#else #else
return Board::BOARD_STOCK; return Board::BOARD_9X_M64;
#endif #endif
} }
}; };

View file

@ -145,7 +145,7 @@ elseif(PCB STREQUAL XLITE)
set(HAPTIC YES) set(HAPTIC YES)
set(LUA_EXPORT lua_export_xlite) set(LUA_EXPORT lua_export_xlite)
set(FLAVOUR xlite) set(FLAVOUR xlite)
add_definitions(-DPCBXLITE -DSOFTWARE_VOLUME -DEXTERNAL_ANTENNA -DSTICKS_PWM) add_definitions(-DPCBXLITE -DSOFTWARE_VOLUME -DSTICKS_PWM)
add_definitions(-DEEPROM_VARIANT=0x2000) add_definitions(-DEEPROM_VARIANT=0x2000)
add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) add_definitions(-DPWR_BUTTON_${PWR_BUTTON})
set(PXX2 ON) set(PXX2 ON)
@ -165,7 +165,7 @@ elseif(PCB STREQUAL XLITES)
set(HAPTIC YES) set(HAPTIC YES)
set(LUA_EXPORT lua_export_xlites) set(LUA_EXPORT lua_export_xlites)
set(FLAVOUR xlites) set(FLAVOUR xlites)
add_definitions(-DPCBXLITES -DPCBXLITE -DSOFTWARE_VOLUME -DEXTERNAL_ANTENNA -DSTICKS_PWM -DHARDWARE_POWER_MANAGEMENT_UNIT) add_definitions(-DPCBXLITES -DPCBXLITE -DSOFTWARE_VOLUME -DSTICKS_PWM -DHARDWARE_POWER_MANAGEMENT_UNIT)
add_definitions(-DEEPROM_VARIANT=0x1000) add_definitions(-DEEPROM_VARIANT=0x1000)
add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) add_definitions(-DPWR_BUTTON_${PWR_BUTTON})
set(GUI_DIR 128x64) set(GUI_DIR 128x64)

View file

@ -907,6 +907,9 @@
#if !defined(RADIO_T12) #if !defined(RADIO_T12)
#define HARDWARE_INTERNAL_MODULE #define HARDWARE_INTERNAL_MODULE
#endif #endif
#if defined(PCBXLITE)
#define EXTERNAL_ANTENNA
#endif
#if defined(PCBXLITES) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) #if defined(PCBXLITES) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019)
#define INTERNAL_MODULE_PXX2 #define INTERNAL_MODULE_PXX2
#else #else

View file

@ -73,11 +73,11 @@ ISTR(VSENSORTYPES);
ISTR(VFORMULAS); ISTR(VFORMULAS);
ISTR(VPREC); ISTR(VPREC);
ISTR(VCELLINDEX); ISTR(VCELLINDEX);
ISTR(VANTENNATYPES);
ISTR(AUX_SERIAL_MODES); ISTR(AUX_SERIAL_MODES);
ISTR(SWTYPES); ISTR(SWTYPES);
ISTR(POTTYPES); ISTR(POTTYPES);
ISTR(SLIDERTYPES); ISTR(SLIDERTYPES);
ISTR(ANTENNA_MODES);
#if defined(PCBSKY9X) && defined(REVX) #if defined(PCBSKY9X) && defined(REVX)
ISTR(VOUTPUT_TYPE); ISTR(VOUTPUT_TYPE);
@ -139,6 +139,7 @@ const char STR_CURVE[] = TR_CURVE;
const char STR_FLMODE[] = TR_FLMODE; const char STR_FLMODE[] = TR_FLMODE;
const char STR_MIXWARNING[] = TR_MIXWARNING; const char STR_MIXWARNING[] = TR_MIXWARNING;
const char STR_OFF[] = TR_OFF; const char STR_OFF[] = TR_OFF;
const char STR_ANTENNA[] = TR_ANTENNA;
const char STR_NO_INFORMATION[] = TR_NO_INFORMATION; const char STR_NO_INFORMATION[] = TR_NO_INFORMATION;
const char STR_MULTPX[] = TR_MULTPX; const char STR_MULTPX[] = TR_MULTPX;
const char STR_DELAYDOWN[] = TR_DELAYDOWN; const char STR_DELAYDOWN[] = TR_DELAYDOWN;
@ -453,9 +454,10 @@ const char STR_BINDING_1_8_TELEM_OFF[] = TR_BINDING_CH1_8_TELEM_OFF;
const char STR_BINDING_9_16_TELEM_ON[] = TR_BINDING_CH9_16_TELEM_ON; const char STR_BINDING_9_16_TELEM_ON[] = TR_BINDING_CH9_16_TELEM_ON;
const char STR_BINDING_9_16_TELEM_OFF[] = TR_BINDING_CH9_16_TELEM_OFF; const char STR_BINDING_9_16_TELEM_OFF[] = TR_BINDING_CH9_16_TELEM_OFF;
const char STR_CHANNELRANGE[] = TR_CHANNELRANGE; const char STR_CHANNELRANGE[] = TR_CHANNELRANGE;
const char STR_ANTENNASELECTION[] = TR_ANTENNASELECTION;
const char STR_ANTENNACONFIRM1[] = TR_ANTENNACONFIRM1; const char STR_ANTENNACONFIRM1[] = TR_ANTENNACONFIRM1;
const char STR_ANTENNACONFIRM2[] = TR_ANTENNACONFIRM2; const char STR_ANTENNACONFIRM2[] = TR_ANTENNACONFIRM2;
const char STR_USE_INTERNAL_ANTENNA[] = TR_USE_INTERNAL_ANTENNA;
const char STR_USE_EXTERNAL_ANTENNA[] = TR_USE_EXTERNAL_ANTENNA;
const char STR_MODULE_PROTOCOL_FLEX_WARN_LINE1[] = TR_MODULE_PROTOCOL_FLEX_WARN_LINE1; const char STR_MODULE_PROTOCOL_FLEX_WARN_LINE1[] = TR_MODULE_PROTOCOL_FLEX_WARN_LINE1;
const char STR_MODULE_PROTOCOL_FCC_WARN_LINE1[] = TR_MODULE_PROTOCOL_FCC_WARN_LINE1; const char STR_MODULE_PROTOCOL_FCC_WARN_LINE1[] = TR_MODULE_PROTOCOL_FCC_WARN_LINE1;
const char STR_MODULE_PROTOCOL_EU_WARN_LINE1[] = TR_MODULE_PROTOCOL_EU_WARN_LINE1; const char STR_MODULE_PROTOCOL_EU_WARN_LINE1[] = TR_MODULE_PROTOCOL_EU_WARN_LINE1;

View file

@ -169,7 +169,6 @@ extern const char STR_VSENSORTYPES[];
extern const char STR_VFORMULAS[]; extern const char STR_VFORMULAS[];
extern const char STR_VPREC[]; extern const char STR_VPREC[];
extern const char STR_VCELLINDEX[]; extern const char STR_VCELLINDEX[];
extern const char STR_VANTENNATYPES[];
#if defined(BLUETOOTH) #if defined(BLUETOOTH)
extern const char STR_BLUETOOTH[]; extern const char STR_BLUETOOTH[];
@ -249,6 +248,7 @@ extern const char STR_CURVE[];
extern const char STR_FLMODE[]; extern const char STR_FLMODE[];
extern const char STR_MIXWARNING[]; extern const char STR_MIXWARNING[];
extern const char STR_OFF[]; extern const char STR_OFF[];
extern const char STR_ANTENNA[];
extern const char STR_NO_INFORMATION[]; extern const char STR_NO_INFORMATION[];
extern const char STR_MULTPX[]; extern const char STR_MULTPX[];
extern const char STR_DELAYDOWN[]; extern const char STR_DELAYDOWN[];
@ -732,6 +732,9 @@ extern const char STR_CHANNELRANGE[];
extern const char STR_ANTENNASELECTION[]; extern const char STR_ANTENNASELECTION[];
extern const char STR_ANTENNACONFIRM1[]; extern const char STR_ANTENNACONFIRM1[];
extern const char STR_ANTENNACONFIRM2[]; extern const char STR_ANTENNACONFIRM2[];
extern const char STR_ANTENNA_MODES[];
extern const char STR_USE_INTERNAL_ANTENNA[];
extern const char STR_USE_EXTERNAL_ANTENNA[];
extern const char STR_MODULE_PROTOCOL_FLEX_WARN_LINE1[]; extern const char STR_MODULE_PROTOCOL_FLEX_WARN_LINE1[];
extern const char STR_MODULE_PROTOCOL_FCC_WARN_LINE1[]; extern const char STR_MODULE_PROTOCOL_FCC_WARN_LINE1[];
extern const char STR_MODULE_PROTOCOL_EU_WARN_LINE1[]; extern const char STR_MODULE_PROTOCOL_EU_WARN_LINE1[];

View file

@ -374,14 +374,6 @@
#define LEN_VCELLINDEX "\007" #define LEN_VCELLINDEX "\007"
#define TR_VCELLINDEX "Nízký\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Nejvíce""Delta\0" #define TR_VCELLINDEX "Nízký\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Nejvíce""Delta\0"
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\007"
#define TR_VANTENNATYPES "Interní""Externí"
#else
#define LEN_VANTENNATYPES "\007"
#define TR_VANTENNATYPES "Interní""Ext+Int"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -482,6 +474,7 @@
#define TR_FLMODE "Režim" #define TR_FLMODE "Režim"
#define TR_MIXWARNING "Varování" #define TR_MIXWARNING "Varování"
#define TR_OFF "VYP" #define TR_OFF "VYP"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("Není info.", "Žádná informace") #define TR_NO_INFORMATION TR("Není info.", "Žádná informace")
#define TR_MULTPX TR("Mat.operace", "Operace") #define TR_MULTPX TR("Mat.operace", "Operace")
#define TR_DELAYDOWN TR3("Zpoždění Vyp", "Zdržet(x)", "Zpoždění Vyp") #define TR_DELAYDOWN TR3("Zpoždění Vyp", "Zdržet(x)", "Zpoždění Vyp")
@ -926,8 +919,16 @@
#define TR_UNIT "Jednotky" #define TR_UNIT "Jednotky"
#define TR_TELEMETRY_NEWSENSOR INDENT "Přidat senzor ručně" #define TR_TELEMETRY_NEWSENSOR INDENT "Přidat senzor ručně"
#define TR_CHANNELRANGE TR(INDENT "Kanály", INDENT "Rozsah kanálů") #define TR_CHANNELRANGE TR(INDENT "Kanály", INDENT "Rozsah kanálů")
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Volba antény")
#define TR_ANTENNACONFIRM1 "Opravdu přepnout?" #define TR_ANTENNACONFIRM1 "Opravdu přepnout?"
#if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Zkont. anténu", "Ujisti se že je anténa připojena!") #define TR_ANTENNACONFIRM2 TR("Zkont. anténu", "Ujisti se že je anténa připojena!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Vyžaduje FLEX" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Vyžaduje FLEX"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Vyžaduje FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Vyžaduje FCC"

View file

@ -377,14 +377,6 @@
#define LEN_VCELLINDEX "\012" // "\007" ursprünglich #define LEN_VCELLINDEX "\012" // "\007" ursprünglich
#define TR_VCELLINDEX "Niedrigst\0""1. Zelle\0 ""2. Zelle\0 ""3. Zelle\0 ""4. Zelle\0 ""5. Zelle\0 ""6. Zelle\0 ""Höchster\0 ""Differenz\0" #define TR_VCELLINDEX "Niedrigst\0""1. Zelle\0 ""2. Zelle\0 ""3. Zelle\0 ""4. Zelle\0 ""5. Zelle\0 ""6. Zelle\0 ""Höchster\0 ""Differenz\0"
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""External"
#else
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -484,6 +476,7 @@
#define TR_FLMODE TR("Phase", "Phasen") #define TR_FLMODE TR("Phase", "Phasen")
#define TR_MIXWARNING "Warnung" #define TR_MIXWARNING "Warnung"
#define TR_OFF "AUS" #define TR_OFF "AUS"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Wirkung" #define TR_MULTPX "Wirkung"
#define TR_DELAYDOWN "Verz. Dn" #define TR_DELAYDOWN "Verz. Dn"
@ -932,8 +925,16 @@
#define TR_UNIT "Einheit" #define TR_UNIT "Einheit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Sensor hinzufügen ..." #define TR_TELEMETRY_NEWSENSOR INDENT "Sensor hinzufügen ..."
#define TR_CHANNELRANGE TR(INDENT "Kanäle", INDENT "Ausgangs Kanäle") //wg 9XR-Pro #define TR_CHANNELRANGE TR(INDENT "Kanäle", INDENT "Ausgangs Kanäle") //wg 9XR-Pro
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenne auswählen")
#define TR_ANTENNACONFIRM1 "Ant. umschalten" #define TR_ANTENNACONFIRM1 "Ant. umschalten"
#if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Check antenna", "Ist eine externe Antenne installiert?") #define TR_ANTENNACONFIRM2 TR("Check antenna", "Ist eine externe Antenne installiert?")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -377,14 +377,6 @@
#define LEN_VCELLINDEX "\007" #define LEN_VCELLINDEX "\007"
#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0" #define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""External"
#else
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -484,6 +476,7 @@
#define TR_FLMODE TR("Mode", "Modes") #define TR_FLMODE TR("Mode", "Modes")
#define TR_MIXWARNING "Warning" #define TR_MIXWARNING "Warning"
#define TR_OFF "OFF" #define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multiplex" #define TR_MULTPX "Multiplex"
#define TR_DELAYDOWN "Delay dn" #define TR_DELAYDOWN "Delay dn"
@ -805,6 +798,7 @@
#else #else
#define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0"
#endif #endif
#define TR_SD_INFO_TITLE "SD INFO" #define TR_SD_INFO_TITLE "SD INFO"
#define TR_SD_TYPE "Type:" #define TR_SD_TYPE "Type:"
#define TR_SD_SPEED "Speed:" #define TR_SD_SPEED "Speed:"
@ -932,8 +926,16 @@
#define TR_UNIT "Unit" #define TR_UNIT "Unit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." #define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..."
#define TR_CHANNELRANGE TR(INDENT "Ch. Range", INDENT "Channel Range") #define TR_CHANNELRANGE TR(INDENT "Ch. Range", INDENT "Channel Range")
#define TR_ANTENNASELECTION TR(INDENT "Antenna", TR(INDENT "Antenna", INDENT "Antenna selection")) #define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#define TR_ANTENNACONFIRM1 "Really switch?" #if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires FLEX non" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires FLEX non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -392,14 +392,6 @@
#define LEN_VCELLINDEX "\007" #define LEN_VCELLINDEX "\007"
#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0" #define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""External"
#else
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -504,6 +496,7 @@
#define TR_FLMODE TR("Modo","Modos") #define TR_FLMODE TR("Modo","Modos")
#define TR_MIXWARNING "Aviso" #define TR_MIXWARNING "Aviso"
#define TR_OFF "OFF" #define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multpx" #define TR_MULTPX "Multpx"
#define TR_DELAYDOWN "Delay Dn" #define TR_DELAYDOWN "Delay Dn"
@ -952,8 +945,16 @@
#define TR_UNIT "Unit" #define TR_UNIT "Unit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." #define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..."
#define TR_CHANNELRANGE INDENT "Gama de canales" #define TR_CHANNELRANGE INDENT "Gama de canales"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", TR(INDENT "Antenna", INDENT "Antenna selection")) #define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#define TR_ANTENNACONFIRM1 "Really switch?" #if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -392,14 +392,6 @@
#define LEN_VCELLINDEX "\007" #define LEN_VCELLINDEX "\007"
#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0" #define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""External"
#else
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -496,6 +488,7 @@
#define TR_FLMODE TR("Mode","Modes") #define TR_FLMODE TR("Mode","Modes")
#define TR_MIXWARNING "Warning" #define TR_MIXWARNING "Warning"
#define TR_OFF "OFF" #define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multpx" #define TR_MULTPX "Multpx"
#define TR_DELAYDOWN "Delay Dn" #define TR_DELAYDOWN "Delay Dn"
@ -945,8 +938,16 @@
#define TR_UNIT "Unit" #define TR_UNIT "Unit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." #define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..."
#define TR_CHANNELRANGE INDENT "Channel Range" #define TR_CHANNELRANGE INDENT "Channel Range"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", TR(INDENT "Antenna", INDENT "Antenna selection")) #define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#define TR_ANTENNACONFIRM1 "Really switch?" #if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -394,14 +394,6 @@
#define LEN_VCELLINDEX "\007" #define LEN_VCELLINDEX "\007"
#define TR_VCELLINDEX "Mini.\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Maxi.\0 ""Diff.\0 " #define TR_VCELLINDEX "Mini.\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Maxi.\0 ""Diff.\0 "
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\007"
#define TR_VANTENNATYPES "Interne""Externe"
#else
#define LEN_VANTENNATYPES "\007"
#define TR_VANTENNATYPES "Interne""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -502,6 +494,7 @@
#define TR_FLMODE TR("Phase", "Phases") #define TR_FLMODE TR("Phase", "Phases")
#define TR_MIXWARNING "Alerte" #define TR_MIXWARNING "Alerte"
#define TR_OFF "OFF" #define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Opération" #define TR_MULTPX "Opération"
#define TR_DELAYDOWN "Retard bas" #define TR_DELAYDOWN "Retard bas"
@ -947,8 +940,16 @@
#define TR_UNIT "Unité" #define TR_UNIT "Unité"
#define TR_TELEMETRY_NEWSENSOR TR(INDENT"Nouveau capteur...", INDENT "Ajout d'un nouveau capteur...") #define TR_TELEMETRY_NEWSENSOR TR(INDENT"Nouveau capteur...", INDENT "Ajout d'un nouveau capteur...")
#define TR_CHANNELRANGE TR(INDENT "Canaux", INDENT "Plage de canaux") #define TR_CHANNELRANGE TR(INDENT "Canaux", INDENT "Plage de canaux")
#define TR_ANTENNASELECTION TR(INDENT "Antenne", INDENT "Choix antenne")
#define TR_ANTENNACONFIRM1 "Vraiment changer?" #define TR_ANTENNACONFIRM1 "Vraiment changer?"
#if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\021"
#define TR_ANTENNA_MODES "Interne\0 ""Ask\0 ""Par modèle\0 ""Interne + Externe"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Vérif antenne", "Installer l'antenne d'abord!") #define TR_ANTENNACONFIRM2 TR("Vérif antenne", "Installer l'antenne d'abord!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Nécessite firm." #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Nécessite firm."
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -395,14 +395,6 @@
#define LEN_VCELLINDEX "\010" #define LEN_VCELLINDEX "\010"
#define TR_VCELLINDEX "Minore\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Maggiore""Delta\0" #define TR_VCELLINDEX "Minore\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Maggiore""Delta\0"
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""External"
#else
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -503,6 +495,7 @@
#define TR_FLMODE "Fase" #define TR_FLMODE "Fase"
#define TR_MIXWARNING "Avviso" #define TR_MIXWARNING "Avviso"
#define TR_OFF "OFF" #define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "MultPx" #define TR_MULTPX "MultPx"
#define TR_DELAYDOWN "Post.Giù " #define TR_DELAYDOWN "Post.Giù "
@ -946,8 +939,16 @@
#define TR_UNIT "Unita" #define TR_UNIT "Unita"
#define TR_TELEMETRY_NEWSENSOR INDENT "Aggiungi nuovo sensore..." #define TR_TELEMETRY_NEWSENSOR INDENT "Aggiungi nuovo sensore..."
#define TR_CHANNELRANGE INDENT "Numero Canali" #define TR_CHANNELRANGE INDENT "Numero Canali"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#define TR_ANTENNACONFIRM1 "Really switch?" #if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -377,14 +377,6 @@ TR_GYR_VSRCRAW
#define LEN_VCELLINDEX "\007" #define LEN_VCELLINDEX "\007"
#define TR_VCELLINDEX "Laagste""1e Cel\0""2e Cel\0""3e Cel\0""4e Cel\0""5e Cel\0""6e Cel\0""Hoogste""Delta\0 " #define TR_VCELLINDEX "Laagste""1e Cel\0""2e Cel\0""3e Cel\0""4e Cel\0""5e Cel\0""6e Cel\0""Hoogste""Delta\0 "
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""External"
#else
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -484,6 +476,7 @@ TR_GYR_VSRCRAW
#define TR_FLMODE TR("Mode", "Modes") #define TR_FLMODE TR("Mode", "Modes")
#define TR_MIXWARNING "Melding" #define TR_MIXWARNING "Melding"
#define TR_OFF "UIT" #define TR_OFF "UIT"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multpx" #define TR_MULTPX "Multpx"
#define TR_DELAYDOWN "Vertr.Dn" #define TR_DELAYDOWN "Vertr.Dn"
@ -934,8 +927,16 @@ TR_GYR_VSRCRAW
#define TR_UNIT "Eenheid" #define TR_UNIT "Eenheid"
#define TR_TELEMETRY_NEWSENSOR INDENT "Sensor toevoegen ..." #define TR_TELEMETRY_NEWSENSOR INDENT "Sensor toevoegen ..."
#define TR_CHANNELRANGE TR(INDENT "Kanalen", INDENT "Uitgangs Kanalen") //wg 9XR-Pro #define TR_CHANNELRANGE TR(INDENT "Kanalen", INDENT "Uitgangs Kanalen") //wg 9XR-Pro
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection")
#define TR_ANTENNACONFIRM1 "Antennes wisselen?" #define TR_ANTENNACONFIRM1 "Antennes wisselen?"
#if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Check antenna", "Is er zeker een antenne geplaatst!") #define TR_ANTENNACONFIRM2 TR("Check antenna", "Is er zeker een antenne geplaatst!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -395,14 +395,6 @@
#define LEN_VCELLINDEX "\007" #define LEN_VCELLINDEX "\007"
#define TR_VCELLINDEX "Niskie\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Wysokie""Delta\0" #define TR_VCELLINDEX "Niskie\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Wysokie""Delta\0"
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""External"
#else
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -503,6 +495,7 @@
#define TR_FLMODE "Tryb" #define TR_FLMODE "Tryb"
#define TR_MIXWARNING "UWAGA" #define TR_MIXWARNING "UWAGA"
#define TR_OFF "Wył." #define TR_OFF "Wył."
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Złącz." #define TR_MULTPX "Złącz."
#define TR_DELAYDOWN "Opózn.(-)" #define TR_DELAYDOWN "Opózn.(-)"
@ -946,8 +939,16 @@
#define TR_UNIT "Jedn" #define TR_UNIT "Jedn"
#define TR_TELEMETRY_NEWSENSOR INDENT "Dodaj nowy czujnik..." #define TR_TELEMETRY_NEWSENSOR INDENT "Dodaj nowy czujnik..."
#define TR_CHANNELRANGE TR(INDENT "ZakrKn",INDENT "Zakres kanału") #define TR_CHANNELRANGE TR(INDENT "ZakrKn",INDENT "Zakres kanału")
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#define TR_ANTENNACONFIRM1 "Really switch?" #if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -377,14 +377,6 @@
#define LEN_VCELLINDEX "\007" #define LEN_VCELLINDEX "\007"
#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0" #define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""External"
#else
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -489,6 +481,7 @@
#define TR_FLMODE "Fase" #define TR_FLMODE "Fase"
#define TR_MIXWARNING "Aviso" #define TR_MIXWARNING "Aviso"
#define TR_OFF "OFF" #define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Aplicar" #define TR_MULTPX "Aplicar"
#define TR_DELAYDOWN "Atraso Dn" #define TR_DELAYDOWN "Atraso Dn"
@ -936,8 +929,16 @@
#define TR_UNIT "Unit" #define TR_UNIT "Unit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." #define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..."
#define TR_CHANNELRANGE INDENT "Channel Range" #define TR_CHANNELRANGE INDENT "Channel Range"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#define TR_ANTENNACONFIRM1 "Really switch?" #if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -390,14 +390,6 @@
#define LEN_VCELLINDEX "\010" #define LEN_VCELLINDEX "\010"
#define TR_VCELLINDEX "Lägsta\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Högsta\0 ""Skillnad" #define TR_VCELLINDEX "Lägsta\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Högsta\0 ""Skillnad"
#if defined(PCBX10) || defined(PCBXLITE)
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""External"
#else
#define LEN_VANTENNATYPES "\010"
#define TR_VANTENNATYPES "Internal""Ext+Int\0"
#endif
#define LEN_GYROS "\004" #define LEN_GYROS "\004"
#define TR_GYROS "GyrX""GyrY" #define TR_GYROS "GyrX""GyrY"
@ -502,6 +494,7 @@
#define TR_FLMODE TR("Läge","Flyglägen") #define TR_FLMODE TR("Läge","Flyglägen")
#define TR_MIXWARNING "Varning" #define TR_MIXWARNING "Varning"
#define TR_OFF "Av " #define TR_OFF "Av "
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information") #define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multpx" #define TR_MULTPX "Multpx"
#define TR_DELAYDOWN "Dröj Ned" #define TR_DELAYDOWN "Dröj Ned"
@ -946,8 +939,16 @@
#define TR_UNIT "Enhet" #define TR_UNIT "Enhet"
#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till sensor..." #define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till sensor..."
#define TR_CHANNELRANGE INDENT "Kanalområde" #define TR_CHANNELRANGE INDENT "Kanalområde"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#define TR_ANTENNACONFIRM1 "Really switch?" #if defined(PCBX12S)
#define LEN_ANTENNA_MODES "\023"
#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External"
#else
#define LEN_ANTENNA_MODES "\011"
#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External"
#endif
#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna")
#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna")
#define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!")
#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non" #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"