1
0
Fork 0
mirror of https://github.com/EdgeTX/edgetx.git synced 2025-07-24 08:45:15 +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)
{
switch (board) {
case BOARD_X12S:
case BOARD_HORUS_X12S:
return 0x3478746F;
case BOARD_X10:
case BOARD_X10_EXPRESS:
@ -82,8 +82,8 @@ uint32_t Boards::getFourCC(Type board)
case BOARD_MEGA2560:
case BOARD_GRUVIN9X:
return 0x3178746F;
case BOARD_STOCK:
case BOARD_M128:
case BOARD_9X_M64:
case BOARD_9X_M128:
return 0;
case BOARD_JUMPER_T12:
return 0x3D78746F;
@ -97,9 +97,9 @@ uint32_t Boards::getFourCC(Type board)
int Boards::getEEpromSize(Board::Type board)
{
switch (board) {
case BOARD_STOCK:
case BOARD_9X_M64:
return EESIZE_STOCK;
case BOARD_M128:
case BOARD_9X_M128:
return EESIZE_M128;
case BOARD_MEGA2560:
case BOARD_GRUVIN9X:
@ -121,7 +121,7 @@ int Boards::getEEpromSize(Board::Type board)
return EESIZE_TARANIS;
case BOARD_UNKNOWN:
return EESIZE_MAX;
case BOARD_X12S:
case BOARD_HORUS_X12S:
case BOARD_X10:
case BOARD_X10_EXPRESS:
return 0;
@ -133,9 +133,9 @@ int Boards::getEEpromSize(Board::Type board)
int Boards::getFlashSize(Type board)
{
switch (board) {
case BOARD_STOCK:
case BOARD_9X_M64:
return FSIZE_STOCK;
case BOARD_M128:
case BOARD_9X_M128:
return FSIZE_M128;
case BOARD_MEGA2560:
case BOARD_GRUVIN9X:
@ -155,7 +155,7 @@ int Boards::getFlashSize(Type board)
case BOARD_TARANIS_X9E:
case BOARD_JUMPER_T12:
return FSIZE_TARANIS;
case BOARD_X12S:
case BOARD_HORUS_X12S:
case BOARD_X10:
case BOARD_X10_EXPRESS:
return FSIZE_HORUS;
@ -479,9 +479,9 @@ bool Boards::isBoardCompatible(Type board1, Type board2)
QString Boards::getBoardName(Board::Type board)
{
switch (board) {
case BOARD_STOCK:
case BOARD_9X_M64:
return "9X";
case BOARD_M128:
case BOARD_9X_M128:
return "9X128";
case BOARD_GRUVIN9X:
return "Gruvin9x";
@ -511,7 +511,7 @@ QString Boards::getBoardName(Board::Type board)
return "9XR-PRO";
case BOARD_AR9X:
return "AR9X";
case BOARD_X12S:
case BOARD_HORUS_X12S:
return "Horus X12S";
case BOARD_X10:
return "Horus X10/X10S";

View file

@ -32,8 +32,8 @@ namespace Board {
enum Type
{
BOARD_UNKNOWN = -1,
BOARD_STOCK = 0,
BOARD_M128,
BOARD_9X_M64 = 0,
BOARD_9X_M128,
BOARD_MEGA2560,
BOARD_GRUVIN9X,
BOARD_SKY9X,
@ -44,7 +44,7 @@ namespace Board {
BOARD_TARANIS_X9DP,
BOARD_TARANIS_X9DP_2019,
BOARD_TARANIS_X9E,
BOARD_X12S,
BOARD_HORUS_X12S,
BOARD_X10,
BOARD_X10_EXPRESS,
BOARD_TARANIS_XLITE,
@ -187,29 +187,129 @@ class Boards
// temporary aliases for transition period, use Boards class instead.
#define getBoardCapability(b__, c__) Boards::getCapability(b__, c__)
#define IS_9X(board) (board==Board::BOARD_STOCK || board==Board::BOARD_M128)
#define IS_STOCK(board) (board==Board::BOARD_STOCK)
#define IS_M128(board) (board==Board::BOARD_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)
#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)
#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)
#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)
#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))
#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)
#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))
#define IS_STM32(board) (IS_TARANIS(board) || IS_HORUS(board))
#define IS_ARM(board) (IS_STM32(board) || IS_SKY9X(board))
#define HAS_LARGE_LCD(board) (IS_HORUS(board) || IS_TARANIS_X9(board))
inline bool IS_9X(Board::Type board)
{
return board == Board::BOARD_9X_M64 || board == Board::BOARD_9X_M128;
}
inline bool IS_STOCK(Board::Type board)
{
return board == Board::BOARD_9X_M64;
}
inline bool IS_M128(Board::Type board)
{
return board == Board::BOARD_9X_M128;
}
inline bool IS_2560(Board::Type board)
{
return board == Board::BOARD_GRUVIN9X || board == Board::BOARD_MEGA2560;
}
inline bool IS_SKY9X(Board::Type board)
{
return board == Board::BOARD_SKY9X || board == Board::BOARD_9XRPRO || board == Board::BOARD_AR9X;
}
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_

View file

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

View file

@ -151,7 +151,8 @@ class GeneralSettings {
int backgroundVolume;
unsigned int mavbaud;
unsigned int switchUnlockStates;
unsigned int auxSerialMode; // UartModes
unsigned int auxSerialMode;
int antennaMode;
unsigned int backlightColor;
CustomFunctionData customFn[CPN_MAX_SPECIAL_FUNCTIONS];
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
{
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);
}

View file

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

View file

@ -716,7 +716,7 @@ class FlightModeField: public TransformedField {
trim = 501 + phase.trimRef[i] - (phase.trimRef[i] > index ? 1 : 0);
else
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;
trimExt[i] = (trim & 0x03);
}
@ -747,7 +747,7 @@ class FlightModeField: public TransformedField {
}
else {
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);
else
trim = trimBase[i];
@ -2067,10 +2067,10 @@ class ModuleUnionField: public UnionField<unsigned int> {
ModuleData::PXX& pxx = module.pxx;
internalField.Append(new UnsignedField<2>(this, pxx.power));
internalField.Append(new SpareBitsField<2>(this));
internalField.Append(new BoolField<1>(this, pxx.receiver_telem_off));
internalField.Append(new BoolField<1>(this, pxx.receiver_channel_9_16));
internalField.Append(new BoolField<1>(this, pxx.external_antenna));
internalField.Append(new BoolField<1>(this, pxx.sport_out));
internalField.Append(new BoolField<1>(this, pxx.receiverTelemetryOff));
internalField.Append(new BoolField<1>(this, pxx.receiverHigherChannels));
internalField.Append(new SignedField<2>(this, pxx.antennaMode));
internalField.Append(new SpareBitsField<8>(this));
}
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 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]));
}
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<2>(this, generalData.trainer.mix[i].mode));
internalField.Append(new SignedField<8>(this, generalData.trainer.mix[i].weight));

View file

@ -58,9 +58,9 @@ OpenTxEepromInterface::~OpenTxEepromInterface()
const char * OpenTxEepromInterface::getName()
{
switch (board) {
case BOARD_STOCK:
case BOARD_9X_M64:
return "OpenTX for 9X board";
case BOARD_M128:
case BOARD_9X_M128:
return "OpenTX for M128 / 9X board";
case BOARD_MEGA2560:
return "OpenTX for MEGA2560 board";
@ -90,7 +90,7 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for 9XR-PRO";
case BOARD_AR9X:
return "OpenTX for ar9x board / 9X";
case BOARD_X12S:
case BOARD_HORUS_X12S:
return "OpenTX for FrSky Horus";
case BOARD_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)
{
switch (board) {
case BOARD_STOCK:
case BOARD_9X_M64:
return 216;
case BOARD_GRUVIN9X:
case BOARD_MEGA2560:
case BOARD_M128:
case BOARD_9X_M128:
return 217;
default:
return 219;
@ -317,7 +317,7 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
efile->EeFsCreate(eeprom, size, board, version);
if (board == BOARD_M128) {
if (board == BOARD_9X_M128) {
variant |= M128_VARIANT;
}
else if (IS_TARANIS_X9E(board)) {
@ -433,7 +433,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
return 0;
else if (IS_ARM(board))
return 60;
else if (board == BOARD_M128)
else if (board == BOARD_9X_M128)
return 30;
else if (IS_2560(board))
return 30;
@ -512,7 +512,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case CustomFunctions:
if (IS_ARM(board))
return 64;
else if (IS_2560(board) || board == BOARD_M128)
else if (IS_2560(board) || board == BOARD_9X_M128)
return 24;
else
return 16;
@ -703,9 +703,9 @@ int OpenTxFirmware::getCapability(::Capability capability)
case HasMahPersistent:
return (IS_ARM(board) ? true : false);
case SimulatorVariant:
if (board == BOARD_STOCK)
if (board == BOARD_9X_M64)
return SIMU_STOCK_VARIANTS;
else if (board == BOARD_M128)
else if (board == BOARD_9X_M128)
return SIMU_M128_VARIANTS;
else if (IS_TARANIS_X9E(board))
return TARANIS_X9E_VARIANT;
@ -944,7 +944,7 @@ EepromLoadErrors OpenTxEepromInterface::checkVersion(unsigned int version)
bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int variant)
{
bool variantError = false;
if (board == BOARD_M128 && !(variant & M128_VARIANT)) {
if (board == BOARD_9X_M128 && !(variant & M128_VARIANT)) {
if (version == 212) {
uint8_t tmp[1000];
for (int i = 1; i < 31; i++) {
@ -1267,7 +1267,7 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware);
/* 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);
firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement"));
firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version"));
@ -1301,10 +1301,10 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware);
// 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-9xr128", Firmware::tr("Turnigy 9XR with m128 chip"), BOARD_M128), true);
registerOpenTxFirmware(new OpenTxFirmware("opentx-9x", Firmware::tr("9X with stock board"), BOARD_STOCK), true);
registerOpenTxFirmware(new OpenTxFirmware("opentx-9x128", Firmware::tr("9X with stock board and m128 chip"), BOARD_M128), 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_9X_M128), 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_9X_M128), 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);

View file

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

View file

@ -183,6 +183,18 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
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)) {
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 ||
protocol==PULSES_ACCESS_R9M_LITE || protocol==PULSES_ACCESS_R9M_LITE_PRO)
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;
break;
case PULSES_LP45:
@ -486,16 +486,18 @@ void ModulePanel::update()
ui->ppmFrameLength->setMaximum(firmware->getCapability(PPMFrameLength));
ui->ppmFrameLength->setValue(22.5+((double)module.ppm.frameLength)*0.5);
// Antenna selection on Horus and xlite
ui->label_antenna->setVisible(mask & MASK_ANTENNA);
ui->antennaMode->setVisible(mask & MASK_ANTENNA);
if IS_HORUS_X12S(board) {
ui->antennaMode->setItemText(1,tr("Ext. + Int"));
// Antenna mode on Horus and XLite
if (mask & MASK_ANTENNA) {
ui->antennaMode->clear();
ui->antennaMode->addItem(tr("Ask"), -1);
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 {
ui->antennaMode->setItemText(1,tr("External"));
ui->antennaLabel->hide();
ui->antennaMode->hide();
}
ui->antennaMode->setCurrentIndex(module.pxx.external_antenna);
// R9M options
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)
{
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_ppmOutputType_currentIndexChanged(int index);
void on_ppmFrameLength_editingFinished();
void on_antennaMode_currentIndexChanged(int index);
void on_rxNumber_editingFinished();
void on_failsafeMode_currentIndexChanged(int value);
void onMultiProtocolChanged(int index);

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1042</width>
<height>375</height>
<width>1075</width>
<height>434</height>
</rect>
</property>
<property name="windowTitle">
@ -252,7 +252,7 @@
<item row="4" column="1">
<layout class="QHBoxLayout" name="rx1Layout">
<property name="spacing">
<number>-1</number>
<number>6</number>
</property>
<property name="topMargin">
<number>0</number>
@ -595,7 +595,7 @@
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_antenna">
<widget class="QLabel" name="antennaLabel">
<property name="maximumSize">
<size>
<width>16777215</width>
@ -611,7 +611,7 @@
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="antennaMode">
<widget class="AutoComboBox" name="antennaMode">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -621,16 +621,6 @@
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
<item>
<property name="text">
<string>Internal</string>
</property>
</item>
<item>
<property name="text">
<string>Ext. + Int.</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
@ -732,6 +722,26 @@
</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="2" column="0">
<widget class="QLabel" name="label_multiProtocol">
<property name="text">
@ -775,6 +785,50 @@
</property>
</widget>
</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">
<widget class="QLabel" name="label_failsafeMode">
<property name="maximumSize">
@ -883,70 +937,6 @@
</item>
</widget>
</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">
<spacer name="horizontalSpacer_3">
<property name="orientation">
@ -1069,6 +1059,13 @@ QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; pad
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>AutoComboBox</class>
<extends>QComboBox</extends>
<header>autocombobox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>protocol</tabstop>
<tabstop>channelsStart</tabstop>

View file

@ -223,7 +223,6 @@ QString ModelPrinter::printModule(int idx)
if (module.protocol == PULSES_PXX_R9M) {
str << printLabelValue(tr("Sub Type"), module.subTypeToString());
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";
if (IS_2560(board))
args << "m2560";
else if (board == Board::BOARD_M128)
else if (board == Board::BOARD_9X_M128)
args << "m128";
else
args << mcu;

View file

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

View file

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

View file

@ -86,7 +86,7 @@ void RleFile::EeFsCreate(uint8_t *eeprom, int size, Board::Type board, unsigned
}
else {
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;
eeFsLinkSize = 1;

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

View file

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

View file

@ -183,8 +183,7 @@ void title(const char * s);
title(name)
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);
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
void onDeleteModelConfirm(const char * result)
{
if (result == STR_OK) {
storageCheck(true);
eeDeleteModel(menuVerticalPosition); // delete file
s_copyMode = 0;
}
}
void onModelSelectMenu(const char * result)
{
int8_t sub = menuVerticalPosition;
@ -51,7 +60,7 @@ void onModelSelectMenu(const char * result)
}
#endif
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);
}
#if defined(SDCARD)
@ -68,14 +77,6 @@ void onModelSelectMenu(const char * result)
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;
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;

View file

@ -87,7 +87,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS,
ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND,
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,
#endif
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 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)
#define ANTENNA_ROW
#if defined(BLUETOOTH)
#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)),
#else
@ -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_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW
#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_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW)
#define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW
#elif defined(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_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
@ -271,7 +286,7 @@ void onBluetoothConnectMenu(const char * result)
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_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* RxNum */ \
ANTENNA_ROW \
EXTERNAL_ANTENNA_ROW \
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* Failsafe */ \
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* Range check and Register buttons */ \
IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* Module options */ \
@ -282,16 +297,6 @@ void onBluetoothConnectMenu(const char * result)
#define INTERNAL_MODULE_ROWS
#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)
{
int8_t old_editMode = s_editMode;
@ -369,6 +374,9 @@ void menuModelSetup(event_t event)
if (event == EVT_ENTRY || event == EVT_ENTRY_UP) {
memclear(&reusableBuffer.moduleSetup, sizeof(reusableBuffer.moduleSetup));
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))
@ -1375,20 +1383,23 @@ void menuModelSetup(event_t event)
}
break;
#if defined(EXTERNAL_ANTENNA)
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA:
{
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);
if (newAntennaSel != g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna && newAntennaSel == XJT_EXTERNAL_ANTENNA) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onAntennaSwitchConfirm);
const char * w = STR_ANTENNACONFIRM2;
SET_WARNING_INFO(w, strlen(w), 0);
reusableBuffer.moduleSetup.antennaMode = editChoice(MODEL_SETUP_2ND_COLUMN, y, INDENT TR_ANTENNA, 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; });
if (event && !s_editMode && reusableBuffer.moduleSetup.antennaMode != g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode) {
if (reusableBuffer.moduleSetup.antennaMode == ANTENNA_MODE_EXTERNAL && !isExternalAntennaEnabled()) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onModelAntennaSwitchConfirm);
SET_WARNING_INFO(STR_ANTENNACONFIRM2, sizeof(TR_ANTENNACONFIRM2), 0);
}
else {
g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna = newAntennaSel;
g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode = reusableBuffer.moduleSetup.antennaMode;
checkExternalAntenna();
}
}
break;
}
#endif
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS:

View file

@ -50,16 +50,24 @@
#define RSSSI_X (30)
#define RSSSI_Y (31)
#define RSSI_MAX 105
#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() - g_model.rssiAlarms.getWarningRssi()) > bar*(i-1)) {
lcdDrawFilledRect(RSSSI_X + i*4, RSSSI_Y - 2*i, 3, 2*i, SOLID, 0);
if (TELEMETRY_RSSI() > 0) {
auto warningRSSI = g_model.rssiAlarms.getWarningRssi();
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
displayTrims(mode);
// RSSI gauge
if (TELEMETRY_RSSI() > 0) {
drawRSSIGauge();
}
// RSSI gauge / external antenna
drawExternalAntennaAndRSSI();
}
if (view_base < VIEW_INPUTS) {

View file

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

View file

@ -70,11 +70,11 @@ void title(const char * s)
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);
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;
}

View file

@ -209,7 +209,7 @@ void title(const char * s);
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);
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);
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;
}
@ -397,10 +398,10 @@ void menuModelSetup(event_t event)
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;
uint8_t k = i+menuVerticalOffset;
for (int j=0; j<=k; j++) {
uint8_t k = i + menuVerticalOffset;
for (int j = 0; j <= k; j++) {
if (mstate_tab[j] == HIDDEN_ROW)
k++;
}
@ -408,7 +409,7 @@ void menuModelSetup(event_t event)
LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS);
LcdFlags attr = (sub == k ? blink : 0);
switch(k) {
switch (k) {
case ITEM_MODEL_SETUP_NAME:
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));

View file

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

View file

@ -81,11 +81,11 @@ void title(const char * s)
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);
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;
}

View file

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

View file

@ -26,6 +26,7 @@ extern const uint8_t LBM_DOT[];
// Main view icons
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_1[];
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)
{
if (handler != popupMenuHandler) {
killAllEvents();
AUDIO_KEY_PRESS();
popupMenuHandler = handler;
}
@ -582,7 +583,10 @@ inline void POPUP_WARNING(const char * s)
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;
warningType = WARNING_TYPE_CONFIRM;

View file

@ -219,6 +219,27 @@ bool menuModelWizard(event_t event)
}
#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)
{
if (result == STR_SELECT_MODEL) {
@ -233,7 +254,7 @@ void onModelSelectMenu(const char * result)
chainMenu(menuMainView);
}
else if (result == STR_DELETE_MODEL) {
POPUP_CONFIRMATION(STR_DELETEMODEL);
POPUP_CONFIRMATION(STR_DELETEMODEL, onDeleteModelConfirm);
SET_WARNING_INFO(currentModel->modelName, LEN_MODEL_NAME, 0);
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);
}
else {
POPUP_CONFIRMATION(STR_DELETEMODEL);
POPUP_CONFIRMATION(STR_DELETEMODEL, onDeleteModelConfirm);
SET_WARNING_INFO(currentCategory->name, LEN_MODEL_FILENAME, 0);
deleteMode = MODE_DELETE_CATEGORY;
}
@ -322,26 +343,6 @@ void initModelsList()
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();
switch(event) {
case 0:

View file

@ -72,7 +72,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS,
ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND,
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,
#endif
ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE,
@ -509,17 +509,22 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW()
#define REGISTRATION_ID_ROWS
#endif
#if defined(EXTERNAL_ANTENNA)
#define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)), // Antenna
void onAntennaSwitchConfirm(const char * result)
#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.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
#define ANTENNA_ROW
#define EXTERNAL_ANTENNA_ROW
#endif
bool menuModelSetup(event_t event)
@ -559,7 +564,7 @@ bool menuModelSetup(event_t event)
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_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum
ANTENNA_ROW
EXTERNAL_ANTENNA_ROW
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)),
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* Range check and Register buttons */ \
IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* Module options */ \
@ -586,8 +591,12 @@ bool menuModelSetup(event_t event)
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;
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
reusableBuffer.moduleSetup.antennaMode = g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode;
#endif
}
if (menuEvent) {
@ -597,10 +606,10 @@ bool menuModelSetup(event_t event)
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;
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)
k++;
}
@ -608,7 +617,7 @@ bool menuModelSetup(event_t event)
LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS);
LcdFlags attr = (sub == k ? blink : 0);
switch(k) {
switch (k) {
case ITEM_MODEL_SETUP_NAME:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODELNAME);
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;
#if defined(EXTERNAL_ANTENNA)
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA:
{
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ANTENNASELECTION);
uint8_t newAntennaSel = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VANTENNATYPES, g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna, 0, 1, attr, event);
if (newAntennaSel != g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna && newAntennaSel == XJT_EXTERNAL_ANTENNA) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onAntennaSwitchConfirm);
const char * w = STR_ANTENNACONFIRM2;
SET_WARNING_INFO(w, strlen(w), 0);
lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_ANTENNA);
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; });
if (event && !s_editMode && reusableBuffer.moduleSetup.antennaMode != g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode) {
if (reusableBuffer.moduleSetup.antennaMode == ANTENNA_MODE_EXTERNAL && !isExternalAntennaEnabled()) {
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onModelAntennaSwitchConfirm);
SET_WARNING_INFO(STR_ANTENNACONFIRM2, sizeof(TR_ANTENNACONFIRM2), 0);
}
else {
g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna = newAntennaSel;
g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode = reusableBuffer.moduleSetup.antennaMode;
checkExternalAntenna();
}
}
break;
}
#endif
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL:

View file

@ -58,9 +58,15 @@ enum MenuRadioHardwareItems {
ITEM_RADIO_HARDWARE_BLUETOOTH_MODE,
ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE,
ITEM_RADIO_HARDWARE_BLUETOOTH_NAME,
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA,
#endif
#if defined(AUX_SERIAL)
ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE,
#endif
ITEM_RADIO_HARDWARE_JITTER_FILTER,
ITEM_RADIO_HARDWARE_MAX
};
@ -76,6 +82,23 @@ enum MenuRadioHardwareItems {
// 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)
#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)
{
MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, {
@ -100,10 +123,22 @@ bool menuRadioHardware(event_t event)
BLUETOOTH_ROWS,
EXTERNAL_ANTENNA_ROW
0, /* aux serial mode */
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;
for (int i=0; i<NUM_BODY_LINES; ++i) {
@ -242,15 +277,32 @@ bool menuRadioHardware(event_t event)
break;
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);
break;
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);
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)
case ITEM_RADIO_HARDWARE_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:
{
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);
break;
}

View file

@ -72,6 +72,19 @@ void getSelectionFullPath(char * lfn)
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)
{
TCHAR lfn[_MAX_LFN+1];
@ -85,7 +98,7 @@ void onSdManagerMenu(const char * result)
pushMenu(menuRadioSdManagerInfo);
}
else if (result == STR_SD_FORMAT) {
POPUP_CONFIRMATION(STR_CONFIRM_FORMAT);
POPUP_CONFIRMATION(STR_CONFIRM_FORMAT, onSdFormatConfirm);
}
else if (result == STR_COPY_FILE) {
clipboard.type = CLIPBOARD_TYPE_SD_FILE;
@ -165,17 +178,6 @@ void onSdManagerMenu(const char * result)
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);
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;
#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);
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);
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);
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);
#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);
}
#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 */
lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_SCALE, MENU_TITLE_DISABLE_COLOR);
if (requiredSpeakerVolume == 0 || g_eeGeneral.beepMode == e_mode_quiet)

View file

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

View file

@ -58,7 +58,7 @@ class Widget
virtual const char * getErrorMessage() const
{
return NULL;
return nullptr;
}
inline ZoneOptionValue * getOptionValue(unsigned int index) const
@ -83,7 +83,7 @@ void registerWidget(const WidgetFactory * factory);
class WidgetFactory
{
public:
WidgetFactory(const char * name, const ZoneOption * options=NULL):
WidgetFactory(const char * name, const ZoneOption * options=nullptr):
name(name),
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);
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 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);
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event);
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);
if (result == STR_BINDING_1_8_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = false;
g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = false;
if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_25_8CH;
}
}
else if (result == STR_BINDING_1_8_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false;
g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = true;
g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = false;
if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) {
g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_100_16CH_NOTELEM;
}
}
else if (result == STR_BINDING_9_16_TELEM_ON) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = false;
g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = true;
}
else if (result == STR_BINDING_9_16_TELEM_OFF) {
g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true;
g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true;
g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = true;
g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = true;
}
else {
return;
@ -66,13 +66,13 @@ void startBindMenu(uint8_t moduleIdx)
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;
if (isTelemAllowedOnBind(moduleIdx))
selection += 1;
}
if (isTelemAllowedOnBind(moduleIdx) && g_model.moduleData[moduleIdx].pxx.receiver_telem_off)
if (isTelemAllowedOnBind(moduleIdx) && g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff)
selection += 1;
POPUP_MENU_SELECT_ITEM(selection);

View file

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

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details.
*/
#include "opentx.h"
#include <opentx.h>
#if defined(PCBSKY9X)
#define HW_SETTINGS_COLUMN (2+(15*FW))
@ -169,6 +169,10 @@ enum {
ITEM_RADIO_HARDWARE_BLUETOOTH_NAME,
#endif
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA,
#endif
#if defined(AUX_SERIAL)
ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE,
#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),
#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)
#define SWITCH_TYPE_MAX(sw) (sw == MIXSRC_SD-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS)
#elif defined(PCBXLITES)
@ -298,6 +319,8 @@ void menuRadioHardware(event_t event)
BLUETOOTH_ROWS
EXTERNAL_ANTENNA_ROW
AUX_SERIAL_ROWS
0 /* ADC filter */,
@ -324,6 +347,9 @@ void menuRadioHardware(event_t event)
}
else if (event == EVT_ENTRY) {
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++) {
@ -546,6 +572,22 @@ void menuRadioHardware(event_t event)
break;
#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)
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);

View file

@ -85,16 +85,16 @@ void menuRadioTools(event_t event)
uint8_t index = 0;
#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);
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);
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);
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);
#endif

View file

@ -110,7 +110,6 @@ void drawCurve(coord_t offset=0);
#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);
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);
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags flags, event_t event);
void drawFatalErrorScreen(const char * message);

View file

@ -314,7 +314,9 @@ void guiMain(event_t evt)
const char * result = runPopupMenu(evt);
if (result) {
TRACE("popupMenuHandler(%s)", result);
popupMenuHandler(result);
auto handler = popupMenuHandler;
popupMenuHandler = nullptr;
handler(result);
if (menuEvent == 0) {
evt = EVT_REFRESH;
continue;
@ -453,7 +455,9 @@ void guiMain(event_t evt)
const char * result = runPopupMenu(evt);
if (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();
}
#endif // GUI

View file

@ -568,7 +568,8 @@ void flightReset(uint8_t check=true);
PACK(struct GlobalData {
uint8_t unexpectedShutdown:1;
uint8_t sdcardPresent:1;
uint8_t spare:6;
uint8_t externalAntennaEnabled: 1;
uint8_t spare:5;
});
extern GlobalData globalData;
@ -1106,6 +1107,7 @@ union ReusableBuffer
struct {
char msg[64];
uint8_t r9mPower;
int8_t antennaMode;
BindInformation bindInformation;
struct {
union {
@ -1165,13 +1167,17 @@ union ReusableBuffer
uint32_t updateTime;
ModuleSettings moduleSettings;
ReceiverSettings receiverSettings; // when dealing with receiver settings, we also need module settings
} hardwareAndSettings;
} hardwareAndSettings; // moduleOptions, receiverOptions, radioVersion
struct {
ModuleInformation modules[NUM_MODULES];
uint8_t linesCount;
} radioTools;
struct {
int8_t antennaMode;
} radioHardware;
struct {
uint8_t stickMode;
} 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 {
MODULE_TYPE_NONE = 0,
MODULE_TYPE_PPM,
@ -164,3 +187,14 @@ enum FailsafeModes {
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);
}
extern bool isExternalAntennaEnabled();
#endif // _MODULES_HELPERS_H_

View file

@ -52,27 +52,27 @@ template <class PxxTransport>
void Pxx1Pulses<PxxTransport>::addExtraFlags(uint8_t module)
{
// 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 (module == INTERNAL_MODULE) {
extra_flags |= (g_model.moduleData[module].pxx.external_antenna << 0);
#if defined(EXTERNAL_ANTENNA)
if (module == INTERNAL_MODULE && isExternalAntennaEnabled()) {
extraFlags |= (1 << 0);
}
#endif
extra_flags |= (g_model.moduleData[module].pxx.receiver_telem_off << 1);
extra_flags |= (g_model.moduleData[module].pxx.receiver_channel_9_16 << 2);
extraFlags |= (g_model.moduleData[module].pxx.receiverTelemetryOff << 1);
extraFlags |= (g_model.moduleData[module].pxx.receiverHigherChannels << 2);
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))
extra_flags |= (1 << 6);
extraFlags |= (1 << 6);
}
// Disable S.PORT if internal module is active
if (module == EXTERNAL_MODULE && isSportLineUsedByInternalModule()) {
extra_flags |= (1 << 5);
extraFlags |= (1 << 5);
}
PxxTransport::addByte(extra_flags);
PxxTransport::addByte(extraFlags);
}
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++) {
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]);
}

View file

@ -166,8 +166,8 @@ PACK(typedef struct {
struct {
uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W
uint8_t spare1:2;
uint8_t receiver_telem_off:1; // false = receiver telem enabled
uint8_t receiver_channel_9_16:1; // false = pwm out 1-8, true 9-16
uint8_t receiverTelemetryOff:1; // false = receiver telem enabled
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 fast:1;
uint8_t spare2;

View file

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

View file

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

View file

@ -63,6 +63,56 @@ void postRadioSettingsLoad()
#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)
{
#if defined(PXX2)
@ -122,6 +172,7 @@ void postModelLoad(bool alarms)
LOAD_MODEL_BITMAP();
LUA_LOAD_MODEL_SCRIPTS();
SEND_FAILSAFE_1S();
}

View file

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

View file

@ -510,7 +510,7 @@ void backlightEnable(uint8_t dutyCycle = 0);
#else
#define BACKLIGHT_LEVEL_MIN 46
#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 isBacklightEnabled() true

View file

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

View file

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

View file

@ -145,7 +145,7 @@ elseif(PCB STREQUAL XLITE)
set(HAPTIC YES)
set(LUA_EXPORT lua_export_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(-DPWR_BUTTON_${PWR_BUTTON})
set(PXX2 ON)
@ -165,7 +165,7 @@ elseif(PCB STREQUAL XLITES)
set(HAPTIC YES)
set(LUA_EXPORT lua_export_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(-DPWR_BUTTON_${PWR_BUTTON})
set(GUI_DIR 128x64)

View file

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

View file

@ -73,11 +73,11 @@ ISTR(VSENSORTYPES);
ISTR(VFORMULAS);
ISTR(VPREC);
ISTR(VCELLINDEX);
ISTR(VANTENNATYPES);
ISTR(AUX_SERIAL_MODES);
ISTR(SWTYPES);
ISTR(POTTYPES);
ISTR(SLIDERTYPES);
ISTR(ANTENNA_MODES);
#if defined(PCBSKY9X) && defined(REVX)
ISTR(VOUTPUT_TYPE);
@ -139,6 +139,7 @@ const char STR_CURVE[] = TR_CURVE;
const char STR_FLMODE[] = TR_FLMODE;
const char STR_MIXWARNING[] = TR_MIXWARNING;
const char STR_OFF[] = TR_OFF;
const char STR_ANTENNA[] = TR_ANTENNA;
const char STR_NO_INFORMATION[] = TR_NO_INFORMATION;
const char STR_MULTPX[] = TR_MULTPX;
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_OFF[] = TR_BINDING_CH9_16_TELEM_OFF;
const char STR_CHANNELRANGE[] = TR_CHANNELRANGE;
const char STR_ANTENNASELECTION[] = TR_ANTENNASELECTION;
const char STR_ANTENNACONFIRM1[] = TR_ANTENNACONFIRM1;
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_FCC_WARN_LINE1[] = TR_MODULE_PROTOCOL_FCC_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_VPREC[];
extern const char STR_VCELLINDEX[];
extern const char STR_VANTENNATYPES[];
#if defined(BLUETOOTH)
extern const char STR_BLUETOOTH[];
@ -249,6 +248,7 @@ extern const char STR_CURVE[];
extern const char STR_FLMODE[];
extern const char STR_MIXWARNING[];
extern const char STR_OFF[];
extern const char STR_ANTENNA[];
extern const char STR_NO_INFORMATION[];
extern const char STR_MULTPX[];
extern const char STR_DELAYDOWN[];
@ -732,6 +732,9 @@ extern const char STR_CHANNELRANGE[];
extern const char STR_ANTENNASELECTION[];
extern const char STR_ANTENNACONFIRM1[];
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_FCC_WARN_LINE1[];
extern const char STR_MODULE_PROTOCOL_EU_WARN_LINE1[];

View file

@ -374,14 +374,6 @@
#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"
#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 TR_GYROS "GyrX""GyrY"
@ -482,6 +474,7 @@
#define TR_FLMODE "Režim"
#define TR_MIXWARNING "Varování"
#define TR_OFF "VYP"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("Není info.", "Žádná informace")
#define TR_MULTPX TR("Mat.operace", "Operace")
#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_TELEMETRY_NEWSENSOR INDENT "Přidat senzor ručně"
#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?"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Vyžaduje FLEX"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Vyžaduje FCC"

View file

@ -377,14 +377,6 @@
#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"
#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 TR_GYROS "GyrX""GyrY"
@ -484,6 +476,7 @@
#define TR_FLMODE TR("Phase", "Phasen")
#define TR_MIXWARNING "Warnung"
#define TR_OFF "AUS"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Wirkung"
#define TR_DELAYDOWN "Verz. Dn"
@ -932,8 +925,16 @@
#define TR_UNIT "Einheit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Sensor hinzufügen ..."
#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"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -377,14 +377,6 @@
#define LEN_VCELLINDEX "\007"
#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 TR_GYROS "GyrX""GyrY"
@ -484,6 +476,7 @@
#define TR_FLMODE TR("Mode", "Modes")
#define TR_MIXWARNING "Warning"
#define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multiplex"
#define TR_DELAYDOWN "Delay dn"
@ -805,6 +798,7 @@
#else
#define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0"
#endif
#define TR_SD_INFO_TITLE "SD INFO"
#define TR_SD_TYPE "Type:"
#define TR_SD_SPEED "Speed:"
@ -932,8 +926,16 @@
#define TR_UNIT "Unit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..."
#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 "Really switch?"
#define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires FLEX non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -392,14 +392,6 @@
#define LEN_VCELLINDEX "\007"
#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 TR_GYROS "GyrX""GyrY"
@ -504,6 +496,7 @@
#define TR_FLMODE TR("Modo","Modos")
#define TR_MIXWARNING "Aviso"
#define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multpx"
#define TR_DELAYDOWN "Delay Dn"
@ -952,8 +945,16 @@
#define TR_UNIT "Unit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..."
#define TR_CHANNELRANGE INDENT "Gama de canales"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", TR(INDENT "Antenna", INDENT "Antenna selection"))
#define TR_ANTENNACONFIRM1 "Really switch?"
#define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -392,14 +392,6 @@
#define LEN_VCELLINDEX "\007"
#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 TR_GYROS "GyrX""GyrY"
@ -496,6 +488,7 @@
#define TR_FLMODE TR("Mode","Modes")
#define TR_MIXWARNING "Warning"
#define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multpx"
#define TR_DELAYDOWN "Delay Dn"
@ -945,8 +938,16 @@
#define TR_UNIT "Unit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..."
#define TR_CHANNELRANGE INDENT "Channel Range"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", TR(INDENT "Antenna", INDENT "Antenna selection"))
#define TR_ANTENNACONFIRM1 "Really switch?"
#define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -394,14 +394,6 @@
#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 "
#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 TR_GYROS "GyrX""GyrY"
@ -502,6 +494,7 @@
#define TR_FLMODE TR("Phase", "Phases")
#define TR_MIXWARNING "Alerte"
#define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Opération"
#define TR_DELAYDOWN "Retard bas"
@ -947,8 +940,16 @@
#define TR_UNIT "Unité"
#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_ANTENNASELECTION TR(INDENT "Antenne", INDENT "Choix antenne")
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Nécessite firm."
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -395,14 +395,6 @@
#define LEN_VCELLINDEX "\010"
#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 TR_GYROS "GyrX""GyrY"
@ -503,6 +495,7 @@
#define TR_FLMODE "Fase"
#define TR_MIXWARNING "Avviso"
#define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "MultPx"
#define TR_DELAYDOWN "Post.Giù "
@ -946,8 +939,16 @@
#define TR_UNIT "Unita"
#define TR_TELEMETRY_NEWSENSOR INDENT "Aggiungi nuovo sensore..."
#define TR_CHANNELRANGE INDENT "Numero Canali"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection")
#define TR_ANTENNACONFIRM1 "Really switch?"
#define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -377,14 +377,6 @@ TR_GYR_VSRCRAW
#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 "
#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 TR_GYROS "GyrX""GyrY"
@ -484,6 +476,7 @@ TR_GYR_VSRCRAW
#define TR_FLMODE TR("Mode", "Modes")
#define TR_MIXWARNING "Melding"
#define TR_OFF "UIT"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multpx"
#define TR_DELAYDOWN "Vertr.Dn"
@ -934,8 +927,16 @@ TR_GYR_VSRCRAW
#define TR_UNIT "Eenheid"
#define TR_TELEMETRY_NEWSENSOR INDENT "Sensor toevoegen ..."
#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?"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -395,14 +395,6 @@
#define LEN_VCELLINDEX "\007"
#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 TR_GYROS "GyrX""GyrY"
@ -503,6 +495,7 @@
#define TR_FLMODE "Tryb"
#define TR_MIXWARNING "UWAGA"
#define TR_OFF "Wył."
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Złącz."
#define TR_DELAYDOWN "Opózn.(-)"
@ -946,8 +939,16 @@
#define TR_UNIT "Jedn"
#define TR_TELEMETRY_NEWSENSOR INDENT "Dodaj nowy czujnik..."
#define TR_CHANNELRANGE TR(INDENT "ZakrKn",INDENT "Zakres kanału")
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection")
#define TR_ANTENNACONFIRM1 "Really switch?"
#define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -377,14 +377,6 @@
#define LEN_VCELLINDEX "\007"
#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 TR_GYROS "GyrX""GyrY"
@ -489,6 +481,7 @@
#define TR_FLMODE "Fase"
#define TR_MIXWARNING "Aviso"
#define TR_OFF "OFF"
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Aplicar"
#define TR_DELAYDOWN "Atraso Dn"
@ -936,8 +929,16 @@
#define TR_UNIT "Unit"
#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..."
#define TR_CHANNELRANGE INDENT "Channel Range"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection")
#define TR_ANTENNACONFIRM1 "Really switch?"
#define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"

View file

@ -390,14 +390,6 @@
#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"
#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 TR_GYROS "GyrX""GyrY"
@ -502,6 +494,7 @@
#define TR_FLMODE TR("Läge","Flyglägen")
#define TR_MIXWARNING "Varning"
#define TR_OFF "Av "
#define TR_ANTENNA "Antenna"
#define TR_NO_INFORMATION TR("No info", "No information")
#define TR_MULTPX "Multpx"
#define TR_DELAYDOWN "Dröj Ned"
@ -946,8 +939,16 @@
#define TR_UNIT "Enhet"
#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till sensor..."
#define TR_CHANNELRANGE INDENT "Kanalområde"
#define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection")
#define TR_ANTENNACONFIRM1 "Really switch?"
#define TR_ANTENNACONFIRM1 "EXT. ANTENNA"
#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_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non"
#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC"