chores(flysky): Separate AFHDS2A and AFHDS3 into 2 different module type (#3783)

* chores(flysky): separate AFHDS2A and AFHDS3 into 2 different module type

This should allow to remove some of the hacks added earlier.

* chore: Add some EL18 CI bits

* fix(afhds): cmake defs

* fix(ci): add el18 to commit-tests.sh

* chore(cpn): separate AFHDS2A and AFHDS3

* chore(cpn): remove binary import of afhds and legacy fxFreq field for afhds3

* fix(cpn): limit available internal afhds protocols to those supported by hardware

* chore(cpn): update Flysky int module test

* fix(cpn): compile error

* fix(cpn): afhds2a max channels

* fix: TR_MODULE_PROTOCOLS

* enh(cpn): more support for afhds2a and 3

* fix(cpn): rebase compile error

* fix(cpn): bit indexes

* fix(cpn): emi toString

* fix(cpn): limit available internal afhds protocols to those supported by hardware

* enh(cpn): add support for Flysky EL18

* fix(cpn): available protocols

* fix(cpn): rebase moduledata

* chore(cpn): add module fields to model print

* Separate AFHDS2A and AFHDS3 UI settings.

* Fix AFHDS3 conversion from old subtype value.
Fix 'Channel Range' layout on portrait LCD.

* Fix name.

---------

Co-authored-by: Peter Feerick <peter.feerick@gmail.com>
Co-authored-by: elecpower <neilh713@tpg.com.au>
Co-authored-by: Phil Mitchell <phil.a.mitchell@gmail.com>
This commit is contained in:
Raphael Coeffic
2023-09-07 19:24:03 +10:00
committed by GitHub
co-authored by Peter Feerick elecpower Phil Mitchell
parent 9515d29c9d
commit c4f1e7127d
59 changed files with 1098 additions and 463 deletions
+4 -3
View File
@@ -46,7 +46,10 @@ jobs:
strategy:
matrix:
target:
- x9dp2019
- tx16s
- nv14
- el18
- t12
- t16
- t18
@@ -54,13 +57,11 @@ jobs:
- tlite
- t20
- tx12
- tx16s
- x10
- x12s
- x7
- x9d
- x9dp
- x9dp2019
- x9e
- x9lite
- x9lites
@@ -92,7 +93,7 @@ jobs:
strategy:
matrix:
target:
- nv14
- nv14;el18
- t12
- t16
- t18
+1 -1
View File
@@ -18,7 +18,7 @@ jobs:
strategy:
matrix:
target:
- nv14
- nv14;el18
- t12
- t16
- t18
+2
View File
@@ -346,6 +346,8 @@ elseif(PCB STREQUAL X10 AND PCBREV STREQUAL TX16S)
set(FLAVOUR tx16s)
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T18)
set(FLAVOUR t18)
elseif(PCB STREQUAL NV14 AND PCBREV STREQUAL EL18)
set(FLAVOUR el18)
else()
string(TOLOWER ${PCB} FLAVOUR)
endif()
-1
View File
@@ -24,7 +24,6 @@ set(firmwares_SRCS
sensordata.cpp
telem_data.cpp
timerdata.cpp
afhds3.cpp
ersky9x/ersky9xeeprom.cpp
ersky9x/ersky9xinterface.cpp
opentx/opentxeeprom.cpp
-12
View File
@@ -1,12 +0,0 @@
#include "afhds3.h"
#include "macros.h"
QString Afhds3Data::protocolToString(unsigned int protocol) {
const char * const afhds3Protocols[] = {
"PWM/IBUS",
"PWM/SBUS",
"PPM/IBUS",
"PPM/SBUS",
};
return CHECK_IN_ARRAY(afhds3Protocols, protocol);
}
-12
View File
@@ -1,12 +0,0 @@
#ifndef AFHDS3_H
#define AFHDS3_H
#include <QtCore>
class Afhds3Data
{
Q_DECLARE_TR_FUNCTIONS(Afhds3)
public:
static QString protocolToString(unsigned int protocol);
};
#endif // AFHDS3_H
+33 -36
View File
@@ -109,6 +109,8 @@ uint32_t Boards::getFourCC(Type board)
return 0x4378746F;
case BOARD_FLYSKY_NV14:
return 0x3A78746F;
case BOARD_FLYSKY_EL18:
return 0x3A78746F; // TODO: check this
default:
return 0;
}
@@ -153,6 +155,7 @@ int Boards::getEEpromSize(Board::Type board)
case BOARD_JUMPER_T18:
case BOARD_RADIOMASTER_TX16S:
case BOARD_FLYSKY_NV14:
case BOARD_FLYSKY_EL18:
return 0;
default:
return 0;
@@ -196,6 +199,7 @@ int Boards::getFlashSize(Type board)
case BOARD_JUMPER_T18:
case BOARD_RADIOMASTER_TX16S:
case BOARD_FLYSKY_NV14:
case BOARD_FLYSKY_EL18:
return FSIZE_HORUS;
case BOARD_UNKNOWN:
return FSIZE_MAX;
@@ -342,7 +346,7 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index)
if (index < DIM(switches))
return switches[index];
}
else if (IS_FLYSKY_NV14(board)) {
else if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board)) {
const Board::SwitchInfo switches[] = {
{SWITCH_2POS, "SA"},
{SWITCH_3POS, "SB"},
@@ -434,7 +438,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return 7;
else if (IS_HORUS_X12S(board))
return 3;
else if (IS_FLYSKY_NV14(board))
else if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board))
return 2;
else
return 3;
@@ -466,10 +470,11 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return 0;
case MaxAnalogs:
return getCapability(board, Board::Sticks) + getCapability(board, Board::Pots) + getCapability(board, Board::Sliders) + getCapability(board, Board::MouseAnalogs) + getCapability(board, Board::GyroAnalogs);
return getCapability(board, Board::Sticks) + getCapability(board, Board::Pots) + getCapability(board, Board::Sliders) +
getCapability(board, Board::MouseAnalogs) + getCapability(board, Board::GyroAnalogs);
case MultiposPots:
if (IS_HORUS_OR_TARANIS(board) && !IS_FLYSKY_NV14(board))
if (IS_HORUS_OR_TARANIS(board) && !(IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board)))
return getCapability(board, Board::Pots);
else
return 0;
@@ -492,7 +497,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
board == BOARD_JUMPER_TPRO || board == BOARD_BETAFPV_LR3PRO ||
board == BOARD_IFLIGHT_COMMANDO8)
return 4;
else if (board == BOARD_FLYSKY_NV14)
else if (board == BOARD_FLYSKY_NV14 || board == BOARD_FLYSKY_EL18)
return 8;
else if (board == BOARD_RADIOMASTER_TX12_MK2 || board == BOARD_RADIOMASTER_BOXER)
return 6;
@@ -527,7 +532,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return getCapability(board, Board::Switches);
case SwitchPositions:
if (IS_HORUS_OR_TARANIS(board) || IS_FLYSKY_NV14(board))
if (IS_HORUS_OR_TARANIS(board) || IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board))
return getCapability(board, Board::Switches) * 3;
else
return 9;
@@ -537,7 +542,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
case NumTrims:
if (IS_FAMILY_HORUS_OR_T16(board) && !IS_FLYSKY_NV14(board))
if (IS_FAMILY_HORUS_OR_T16(board) && !(IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board)))
return 6;
else if (IS_IFLIGHT_COMMANDO8(board))
return 0;
@@ -563,12 +568,12 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return (IS_STM32(board) && !IS_RADIOMASTER_T8(board));
case HasAudioMuteGPIO:
// All color lcd (including NV14) except Horus X12S
// All color lcd (including NV14 and EL18) except Horus X12S
// TX12, TX12MK2, ZORRO, BOXER, T8, TLITE, TPRO, LR3PRO, COMMANDO8
return (IS_FAMILY_HORUS_OR_T16(board) && !IS_HORUS_X12S(board)) || IS_FAMILY_T12(board);
case SportMaxBaudRate:
if (IS_FAMILY_T16(board) || IS_FLYSKY_NV14(board) || IS_TARANIS_X7_ACCESS(board) ||
if (IS_FAMILY_T16(board) || IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board) || IS_TARANIS_X7_ACCESS(board) ||
(IS_TARANIS(board) && !IS_TARANIS_XLITE(board) && !IS_TARANIS_X7(board) && !IS_TARANIS_X9LITE(board)))
return 400000; // 400K and higher
else
@@ -685,31 +690,16 @@ StringTagMappingTable Boards::getAnalogNamesLookupTable(Board::Type board, const
});
}
} else if (IS_RADIOMASTER_BOXER(board)) {
if (version < adcVersion) {
tbl.insert(tbl.end(), {
{tr("S1").toStdString(), "POT1"},
{tr("S2").toStdString(), "POT2"},
{tr("S3").toStdString(), "POT3"},
});
} else {
tbl.insert(tbl.end(), {
{tr("S1").toStdString(), "P1", 4},
{tr("S2").toStdString(), "P2", 5},
{tr("S3").toStdString(), "P3", 6},
});
}
} else if ((IS_TARANIS_SMALL(board) && !IS_JUMPER_TLITE(board)) || IS_FLYSKY_NV14(board)) {
if (version < adcVersion) {
tbl.insert(tbl.end(), {
{tr("S1").toStdString(), "POT1"},
{tr("S2").toStdString(), "POT2"},
});
} else {
tbl.insert(tbl.end(), {
{tr("S1").toStdString(), "P1", 4},
{tr("S2").toStdString(), "P2", 5},
});
}
tbl.insert(tbl.end(), {
{tr("S1").toStdString(), "POT1"},
{tr("S2").toStdString(), "POT2"},
{tr("S3").toStdString(), "POT3"},
});
} else if ((IS_TARANIS_SMALL(board) && !IS_JUMPER_TLITE(board)) || IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board)) {
tbl.insert(tbl.end(), {
{tr("S1").toStdString(), "POT1"},
{tr("S2").toStdString(), "POT2"},
});
} else if (IS_TARANIS_X9(board)) {
if (version < adcVersion) {
tbl.insert(tbl.end(), {
@@ -872,6 +862,8 @@ QString Boards::getBoardName(Board::Type board)
return "Radiomaster T8";
case BOARD_FLYSKY_NV14:
return "FlySky NV14";
case BOARD_FLYSKY_EL18:
return "FlySky EL18";
case BOARD_BETAFPV_LR3PRO:
return "BETAFPV LR3PRO";
case BOARD_IFLIGHT_COMMANDO8:
@@ -1043,7 +1035,9 @@ QList<int> Boards::getSupportedInternalModules(Board::Type board)
if (IS_TARANIS_X9DP_2019(board) || IS_TARANIS_X7_ACCESS(board)) {
modules.append({(int)MODULE_TYPE_ISRM_PXX2});
} else if (IS_FLYSKY_NV14(board)) {
modules.append({(int)MODULE_TYPE_FLYSKY});
modules.append({(int)MODULE_TYPE_FLYSKY_AFHDS2A});
} else if (IS_FLYSKY_EL18(board)) {
modules.append({(int)MODULE_TYPE_FLYSKY_AFHDS3});
} else if (IS_FAMILY_HORUS_OR_T16(board) || IS_FAMILY_T12(board)
|| (IS_TARANIS_SMALL(board) && IS_ACCESS_RADIO(board))) {
modules.append({
@@ -1098,7 +1092,10 @@ int Boards::getDefaultInternalModules(Board::Type board)
return (int)MODULE_TYPE_CROSSFIRE;
case BOARD_FLYSKY_NV14:
return (int)MODULE_TYPE_FLYSKY;
return (int)MODULE_TYPE_FLYSKY_AFHDS2A;
case BOARD_FLYSKY_EL18:
return (int)MODULE_TYPE_FLYSKY_AFHDS3;
default:
return (int)MODULE_TYPE_NONE;
+2 -2
View File
@@ -440,7 +440,7 @@ inline bool IS_FAMILY_HORUS(Board::Type board)
inline bool IS_FAMILY_HORUS_OR_T16(Board::Type board)
{
return IS_FAMILY_HORUS(board) || IS_FAMILY_T16(board) || IS_FLYSKY_NV14(board)/*generally*/;
return IS_FAMILY_HORUS(board) || IS_FAMILY_T16(board) || IS_FLYSKY_NV14(board)/*generally*/ || IS_FLYSKY_EL18(board)/*generally*/;
}
inline bool IS_HORUS_OR_TARANIS(Board::Type board)
@@ -450,7 +450,7 @@ inline bool IS_HORUS_OR_TARANIS(Board::Type board)
inline bool IS_STM32(Board::Type board)
{
return IS_TARANIS(board) || IS_FAMILY_HORUS_OR_T16(board) || IS_FLYSKY_NV14(board);
return IS_TARANIS(board) || IS_FAMILY_HORUS_OR_T16(board) || IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board);
}
inline bool IS_ARM(Board::Type board)
@@ -112,7 +112,9 @@ const YamlLookupTable internalModuleLut = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
};
YamlTelemetryBaudrate::YamlTelemetryBaudrate(
@@ -54,8 +54,8 @@
// channelsStart: 0
// channelsCount: 18
// failsafeMode: NOT_SET
// mod:
// afhds3:
// mod:
// afhds3:
// emi: 2
// telemetry: 1
// phyMode: 2
@@ -78,10 +78,15 @@ static const YamlLookupTable protocolLut = {
{ PULSES_ACCESS_R9M_LITE_PRO, "TYPE_R9M_LITE_PRO_PXX2" },
{ PULSES_SBUS, "TYPE_SBUS" },
{ PULSES_XJT_LITE_X16, "TYPE_XJT_LITE_PXX2" },
{ PULSES_AFHDS3, "TYPE_FLYSKY" },
{ PULSES_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ PULSES_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ PULSES_LEMON_DSMP, "TYPE_LEMON_DSMP" },
};
static const YamlLookupTable oldprotocolLut = {
{ PULSES_FLYSKY_AFHDS2A, "TYPE_FLYSKY" },
};
static const YamlLookupTable xjtLut = {
{ 0, "D16" },
{ 1, "D8" },
@@ -111,9 +116,10 @@ static const YamlLookupTable dsmLut = {
{ 2, "DSMX" },
};
// depreciated - used for decoding and converting module subtype to protocol
static const YamlLookupTable afhdsLut = {
{ 0, "AFHDS3" },
{ 1, "AFHDS2A" } // could be complete nonsense, CHECK IT!
{ 0, "AFHDS2A" },
{ 1, "AFHDS3" }
};
static const YamlLookupTable failsafeLut = {
@@ -166,7 +172,7 @@ Node convert<ModuleData>::encode(const ModuleData& rhs)
break;
case PULSES_PPM:
node["subType"] = LookupValue(ppmLut, subtype);
break;
break;
case PULSES_MULTIMODULE: {
int rfProtocol = rhs.multi.rfProtocol + 1;
int subType = rhs.subType;
@@ -175,10 +181,6 @@ Node convert<ModuleData>::encode(const ModuleData& rhs)
st_str += std::to_string(subType);
node["subType"] = st_str;
} break;
case PULSES_AFHDS3: {
node["subType"] = LookupValue(afhdsLut, subtype);
break;
}
}
node["channelsStart"] = rhs.channelsStart;
@@ -246,9 +248,20 @@ Node convert<ModuleData>::encode(const ModuleData& rhs)
dsmp["flags"] = rhs.dsmp.flags;
mod["dsmp"] = dsmp;
} break;
// TODO: flysky
// TODO: afhds3
case PULSES_AFHDS3: {
case PULSES_FLYSKY_AFHDS2A: {
Node flysky;
for (int i = 0; i < 4; i++) {
flysky["rx_id"][std::to_string(i)]["val"] = rhs.flysky.rxId[i];
}
flysky["mode"] = rhs.flysky.mode;
flysky["rfPower"] = rhs.flysky.rfPower;
flysky["reserved"] = rhs.flysky.reserved;
for (int i = 0; i < 2; i++) {
flysky["rx_freq"][std::to_string(i)]["val"] = rhs.flysky.rxFreq[i];
}
mod["flysky"] = flysky;
} break;
case PULSES_FLYSKY_AFHDS3: {
Node afhds3;
afhds3["emi"] = rhs.afhds3.emi;
afhds3["telemetry"] = rhs.afhds3.telemetry;
@@ -275,6 +288,8 @@ Node convert<ModuleData>::encode(const ModuleData& rhs)
bool convert<ModuleData>::decode(const Node& node, ModuleData& rhs)
{
node["type"] >> protocolLut >> rhs.protocol;
if (rhs.protocol < 0)
node["type"] >> oldprotocolLut >> rhs.protocol;
Node subType;
node["subType"] >> subType;
@@ -319,6 +334,12 @@ bool convert<ModuleData>::decode(const Node& node, ModuleData& rhs)
} catch(...) {}
}
} break;
case PULSES_FLYSKY_AFHDS2A: {
int subProto = 0;
subType >> afhdsLut >> subProto;
rhs.protocol += subProto;
rhs.subType = 0;
} break;
}
node["channelsStart"] >> rhs.channelsStart;
@@ -381,15 +402,37 @@ bool convert<ModuleData>::decode(const Node& node, ModuleData& rhs)
Node dsmp = mod["dsmp"];
dsmp["flags"] >> rhs.dsmp.flags;
} else if (mod["flysky"]) {
// TODO: flysky
Node flysky = mod["flysky"];
for (int i = 0; i < 4; i++) {
if (flysky["rx_id"][std::to_string(i)]) {
Node rxid = flysky["rx_id"][std::to_string(i)];
if (rxid.IsMap()) {
if (rxid["val"]) {
rxid["val"] >> rhs.flysky.rxId[i];
}
}
}
}
flysky["mode"] >> rhs.flysky.mode;
flysky["rfPower"] >> rhs.flysky.rfPower;
flysky["reserved"] >> rhs.flysky.reserved;
for (int i = 0; i < 2; i++) {
if (flysky["rx_freq"][std::to_string(i)]) {
Node rxfreq = flysky["rx_freq"][std::to_string(i)];
if (rxfreq.IsMap()) {
if (rxfreq["val"]) {
rxfreq["val"] >> rhs.flysky.rxFreq[i];
}
}
}
}
} else if (mod["afhds3"]) {
// TODO: afhds3
Node afhds3 = mod["afhds3"];
afhds3["emi"] >> rhs.afhds3.emi;
afhds3["telemetry"] >> rhs.afhds3.telemetry;
afhds3["phyMode"] >> rhs.afhds3.phyMode;
afhds3["reserved"] >> rhs.afhds3.reserved;
afhds3["rfPower"] >> rhs.afhds3.rfPower;
Node afhds3 = mod["afhds3"];
afhds3["emi"] >> rhs.afhds3.emi;
afhds3["telemetry"] >> rhs.afhds3.telemetry;
afhds3["phyMode"] >> rhs.afhds3.phyMode;
afhds3["reserved"] >> rhs.afhds3.reserved;
afhds3["rfPower"] >> rhs.afhds3.rfPower;
}
}
+95 -15
View File
@@ -21,11 +21,11 @@
#include "moduledata.h"
#include "eeprominterface.h"
#include "multiprotocols.h"
#include "afhds3.h"
#include "radiodataconversionstate.h"
#include "compounditemmodels.h"
#include "generalsettings.h"
#include "appdata.h"
#include "helpers.h"
#include <QPair>
#include <QVector>
@@ -90,8 +90,10 @@ bool ModuleData::isAvailable(PulsesProtocol proto, int port)
return fw->getCapability(HasIntModuleMulti);
case PULSES_CROSSFIRE:
return fw->getCapability(HasIntModuleCRSF) || fw->getCapability(HasIntModuleELRS);
case PULSES_AFHDS3:
return fw->getCapability(HasIntModuleFlySky);
case PULSES_FLYSKY_AFHDS2A:
return IS_FLYSKY_NV14(board);
case PULSES_FLYSKY_AFHDS3:
return IS_FLYSKY_EL18(board);
default:
return false;
}
@@ -112,7 +114,8 @@ bool ModuleData::isAvailable(PulsesProtocol proto, int port)
case PULSES_SBUS:
case PULSES_MULTIMODULE:
case PULSES_CROSSFIRE:
case PULSES_AFHDS3:
case PULSES_FLYSKY_AFHDS2A:
case PULSES_FLYSKY_AFHDS3:
case PULSES_GHOST:
return true;
case PULSES_ACCESS_R9M:
@@ -263,8 +266,6 @@ QString ModuleData::subTypeToString(int type) const
return CHECK_IN_ARRAY(ppmSubTypeStrings, type);
case PULSES_PXX_R9M:
return CHECK_IN_ARRAY(strings, type);
case PULSES_AFHDS3:
return Afhds3Data::protocolToString(type);
default:
return CPN_STR_UNKNOWN_ITEM;
}
@@ -273,7 +274,7 @@ QString ModuleData::subTypeToString(int type) const
QString ModuleData::powerValueToString(Firmware * fw) const
{
const QStringList & strRef = powerValueStrings((enum PulsesProtocol)protocol, subType, fw);
return strRef.value(protocol == PULSES_AFHDS3 ? afhds3.rfPower : pxx.power, CPN_STR_UNKNOWN_ITEM);
return strRef.value(protocol == PULSES_FLYSKY_AFHDS3 ? afhds3.rfPower : pxx.power, CPN_STR_UNKNOWN_ITEM);
}
// static
@@ -313,7 +314,7 @@ QString ModuleData::protocolToString(unsigned int protocol)
tr("FrSky ACCESS R9M Lite"),
tr("FrSky ACCESS R9M Lite Pro"),
tr("FrSky XJT lite (D16)"), tr("FrSky XJT lite (D8)"), tr("FrSky XJT lite (LR12)"),
tr("AFHDS3"),
tr("Flysky AFHDS2A"), tr("Flysky AFHDS3"),
tr("Ghost"),
tr("Lemon-Rx DSMP"),
};
@@ -335,7 +336,7 @@ QStringList ModuleData::powerValueStrings(enum PulsesProtocol protocol, int subT
};
switch(protocol) {
case PULSES_AFHDS3:
case PULSES_FLYSKY_AFHDS3:
return afhds3Strings;
default:
int strIdx = 0;
@@ -359,7 +360,8 @@ bool ModuleData::hasFailsafes(Firmware * fw) const
protocol == PULSES_ACCESS_R9M_LITE_PRO ||
protocol == PULSES_XJT_LITE_X16 ||
protocol == PULSES_MULTIMODULE ||
protocol == PULSES_AFHDS3
protocol == PULSES_FLYSKY_AFHDS2A ||
protocol == PULSES_FLYSKY_AFHDS3
);
}
@@ -397,7 +399,9 @@ int ModuleData::getMaxChannelCount()
else
return 16;
break;
case PULSES_AFHDS3:
case PULSES_FLYSKY_AFHDS2A:
return 14;
case PULSES_FLYSKY_AFHDS3:
return 18;
case PULSES_LEMON_DSMP:
return 12;
@@ -450,7 +454,8 @@ int ModuleData::getTypeFromProtocol(unsigned int protocol)
{ PULSES_XJT_LITE_D8, MODULE_TYPE_XJT_LITE_PXX2 },
{ PULSES_XJT_LITE_LR12, MODULE_TYPE_XJT_LITE_PXX2 },
{ PULSES_AFHDS3, MODULE_TYPE_FLYSKY },
{ PULSES_FLYSKY_AFHDS2A, MODULE_TYPE_FLYSKY_AFHDS2A },
{ PULSES_FLYSKY_AFHDS3, MODULE_TYPE_FLYSKY_AFHDS3 },
{ PULSES_LEMON_DSMP, MODULE_TYPE_LEMON_DSMP },
};
@@ -495,7 +500,8 @@ QString ModuleData::typeToString(int type)
"R9MLP ACCESS",
"SBUS",
"XJT Lite",
"FLYSKY",
"Flysky AFHDS2A",
"Flysky AFHDS3",
"Lemon-Rx DSMP",
};
@@ -548,7 +554,8 @@ bool ModuleData::isProtocolAvailable(int moduleidx, unsigned int protocol, Gener
case MODULE_TYPE_CROSSFIRE:
case MODULE_TYPE_MULTIMODULE:
case MODULE_TYPE_GHOST:
case MODULE_TYPE_FLYSKY:
case MODULE_TYPE_FLYSKY_AFHDS2A:
case MODULE_TYPE_FLYSKY_AFHDS3:
case MODULE_TYPE_LEMON_DSMP:
case MODULE_TYPE_R9M_LITE_PXX1:
case MODULE_TYPE_R9M_LITE_PXX2:
@@ -570,7 +577,8 @@ bool ModuleData::isProtocolAvailable(int moduleidx, unsigned int protocol, Gener
case MODULE_TYPE_CROSSFIRE:
case MODULE_TYPE_MULTIMODULE:
case MODULE_TYPE_GHOST:
case MODULE_TYPE_FLYSKY:
case MODULE_TYPE_FLYSKY_AFHDS2A:
case MODULE_TYPE_FLYSKY_AFHDS3:
case MODULE_TYPE_LEMON_DSMP:
return true;
default:
@@ -683,3 +691,75 @@ AbstractStaticItemModel * ModuleData::telemetryBaudrateItemModel(unsigned int p
mdl->loadItemList();
return mdl;
}
QString ModuleData::afhds2aMode1ToString() const
{
return afhds2aMode1List.at(Helpers::getBitmappedValue(flysky.mode, 0));
}
QString ModuleData::afhds2aMode2ToString() const
{
return afhds2aMode2List.at(Helpers::getBitmappedValue(flysky.mode, 1));
}
QString ModuleData::afhds3PhyModeToString() const
{
return afhds3PhyModeList.at(afhds3.phyMode);
}
QString ModuleData::afhds3EmiToString() const
{
return afhds3EmiList.at(afhds3.emi - 1);
}
AbstractStaticItemModel * ModuleData::afhds2aMode1ItemModel()
{
AbstractStaticItemModel * mdl = new AbstractStaticItemModel();
mdl->setName("moduledata.afhds2aMode1");
for (int i = 0; i < afhds2aMode1List.size(); i++) {
mdl->appendToItemList(afhds2aMode1List.at(i), i);
}
mdl->loadItemList();
return mdl;
}
AbstractStaticItemModel * ModuleData::afhds2aMode2ItemModel()
{
AbstractStaticItemModel * mdl = new AbstractStaticItemModel();
mdl->setName("moduledata.afhds2aMode2");
for (int i = 0; i < afhds2aMode2List.size(); i++) {
mdl->appendToItemList(afhds2aMode2List.at(i), i);
}
mdl->loadItemList();
return mdl;
}
AbstractStaticItemModel * ModuleData::afhds3PhyModeItemModel()
{
AbstractStaticItemModel * mdl = new AbstractStaticItemModel();
mdl->setName("moduledata.afhds3PhyMode");
for (int i = 0; i < afhds3PhyModeList.size(); i++) {
mdl->appendToItemList(afhds3PhyModeList.at(i), i);
}
mdl->loadItemList();
return mdl;
}
AbstractStaticItemModel * ModuleData::afhds3EmiItemModel()
{
AbstractStaticItemModel * mdl = new AbstractStaticItemModel();
mdl->setName("moduledata.afhds3Emi");
for (int i = 0; i < afhds3EmiList.size(); i++) {
mdl->appendToItemList(afhds3EmiList.at(i), i + 1); // Note: 1 based
}
mdl->loadItemList();
return mdl;
}
+46 -6
View File
@@ -47,7 +47,8 @@ enum ModuleType {
MODULE_TYPE_R9M_LITE_PRO_PXX2,
MODULE_TYPE_SBUS,
MODULE_TYPE_XJT_LITE_PXX2,
MODULE_TYPE_FLYSKY, //no more protocols possible because of 4 bits value
MODULE_TYPE_FLYSKY_AFHDS2A,
MODULE_TYPE_FLYSKY_AFHDS3,
MODULE_TYPE_LEMON_DSMP,
MODULE_TYPE_COUNT,
MODULE_TYPE_MAX = MODULE_TYPE_COUNT - 1
@@ -83,7 +84,8 @@ enum PulsesProtocol {
PULSES_XJT_LITE_X16,
PULSES_XJT_LITE_D8,
PULSES_XJT_LITE_LR12,
PULSES_AFHDS3,
PULSES_FLYSKY_AFHDS2A,
PULSES_FLYSKY_AFHDS3,
PULSES_GHOST,
PULSES_LEMON_DSMP,
PULSES_PROTOCOL_LAST
@@ -102,6 +104,11 @@ enum ModuleSubtypeR9M {
constexpr int PXX2_MAX_RECEIVERS_PER_MODULE = 3;
constexpr int PXX2_LEN_RX_NAME = 8;
static const QStringList afhds2aMode1List({"PWM", "PPM"});
static const QStringList afhds2aMode2List({"IBUS", "SBUS"});
static const QStringList afhds3PhyModeList({"Classic 18ch", "C-Fast 10ch", "Routine 18ch", "Fast 8ch", "Lora 12ch"});
static const QStringList afhds3EmiList({"CE", "FCC"});
class ModuleData {
Q_DECLARE_TR_FUNCTIONS(ModuleData)
@@ -118,7 +125,7 @@ class ModuleData {
unsigned int subType;
bool invertedSerial;
unsigned int channelsStart;
int channelsCount; // 0=8 channels
int channelsCount;
unsigned int failsafeMode;
struct PPM {
@@ -137,13 +144,36 @@ class ModuleData {
int optionValue;
} multi;
struct Afhds3 {
unsigned int rxFreq;
struct Flysky {
unsigned int rxId[4];
unsigned int mode;
unsigned int rfPower;
unsigned int reserved;
unsigned int rxFreq[2];
void setDefault() {
rxId[0] = rxId[1] = rxId[2] = rxId[3] = 0;
mode = 3;
rfPower = 0;
rxFreq[0] = 50;
rxFreq[1] = 0;
}
} flysky;
struct Afhds3 {
unsigned int emi;
unsigned int telemetry;
unsigned int phyMode;
unsigned int reserved;
unsigned int rfPower;
void setDefault() {
emi = 1;
telemetry = 0;
phyMode = 0;
reserved = 0;
rfPower = 0;
}
} afhds3;
struct PXX {
@@ -191,6 +221,16 @@ class ModuleData {
static AbstractStaticItemModel * internalModuleItemModel(int board = -1);
static bool isProtocolAvailable(int moduleidx, unsigned int protocol, GeneralSettings & generalSettings);
static AbstractStaticItemModel * protocolItemModel(GeneralSettings & settings);
static AbstractStaticItemModel * telemetryBaudrateItemModel(unsigned int protocol);
static AbstractStaticItemModel * telemetryBaudrateItemModel(unsigned int protocol);
static bool isAvailable(PulsesProtocol proto, int port = 0); // moved from OpenTxFirmware EdgeTX v2.9 - TODO remove and use isProtocolAvailable
QString afhds2aMode1ToString() const;
QString afhds2aMode2ToString() const;
QString afhds3PhyModeToString() const;
QString afhds3EmiToString() const;
static AbstractStaticItemModel * afhds2aMode1ItemModel();
static AbstractStaticItemModel * afhds2aMode2ItemModel();
static AbstractStaticItemModel * afhds3PhyModeItemModel();
static AbstractStaticItemModel * afhds3EmiItemModel();
};
@@ -2211,40 +2211,6 @@ class ModuleUnionField: public UnionField<unsigned int> {
unsigned int version;
};
class Afhds3Field: public UnionField::TransformedMember {
public:
Afhds3Field(DataField * parent, ModuleData& module):
UnionField::TransformedMember(parent, internalField),
internalField(this, "AFHDS3")
{
ModuleData::Afhds3& afhds3 = module.afhds3;
internalField.Append(new UnsignedField<3>(this, minBindPower));
internalField.Append(new UnsignedField<3>(this, afhds3.rfPower));
internalField.Append(new UnsignedField<1>(this, emissionFCC));
internalField.Append(new BoolField<1>(this, operationModeUnicast));
internalField.Append(new BoolField<1>(this, operationModeUnicast));
internalField.Append(new UnsignedField<16>(this, defaultFailSafeTimout));
internalField.Append(new UnsignedField<16>(this, afhds3.rxFreq));
}
bool select(const unsigned int& attr) const override {
return attr == PULSES_AFHDS3;
}
void beforeExport() override {}
void afterImport() override {}
private:
StructField internalField;
unsigned int minBindPower = 0;
unsigned int emissionFCC = 0;
unsigned int defaultFailSafeTimout = 1000;
bool operationModeUnicast = true;
};
class AccessField: public UnionField::TransformedMember {
public:
AccessField(DataField * parent, ModuleData& module):
@@ -2331,7 +2297,6 @@ class ModuleUnionField: public UnionField<unsigned int> {
{
if (version >= 219) {
Append(new AccessField(parent, module));
Append(new Afhds3Field(parent, module));
Append(new GhostField(parent, module));
}
Append(new PxxField(parent, module, version));
@@ -112,10 +112,6 @@ class ProtocolsConversionTable: public ConversionTable
addConversion(PULSES_XJT_LITE_X16, val);
addConversion(PULSES_XJT_LITE_D8, val);
addConversion(PULSES_XJT_LITE_LR12, val++);
if (version >= 219) {
addConversion(PULSES_AFHDS3, val++);
}
}
};
@@ -116,6 +116,8 @@ const char * OpenTxEepromInterface::getName()
return "EdgeTX for FrSky X10 Express";
case BOARD_FLYSKY_NV14:
return "EdgeTX for FlySky NV14";
case BOARD_FLYSKY_EL18:
return "EdgeTX for FlySky EL18";
case BOARD_BETAFPV_LR3PRO:
return "EdgeTx for BETAFPV LR3PRO";
case BOARD_IFLIGHT_COMMANDO8:
@@ -656,7 +658,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case HasSDLogs:
return true;
case LcdWidth:
if (IS_FLYSKY_NV14(board))
if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board))
return 320;
else if (IS_FAMILY_HORUS_OR_T16(board))
return 480;
@@ -667,7 +669,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
else
return 128;
case LcdHeight:
if (IS_FLYSKY_NV14(board))
if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board))
return 480;
else if (IS_FAMILY_HORUS_OR_T16(board))
return 272;
@@ -761,7 +763,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
else
return 40;
case HasAuxSerialMode:
return (IS_FAMILY_HORUS_OR_T16(board) && !IS_FLYSKY_NV14(board)) ||
return (IS_FAMILY_HORUS_OR_T16(board) && !(IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board))) ||
(IS_TARANIS_X9(board) && !IS_TARANIS_X9DP_2019(board)) ||
IS_RADIOMASTER_ZORRO(board) || IS_RADIOMASTER_TX12_MK2(board);
case HasAux2SerialMode:
@@ -770,7 +772,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
return IS_FAMILY_HORUS_OR_T16(board) || IS_RADIOMASTER_ZORRO(board) ||
IS_JUMPER_TPRO(board) || IS_RADIOMASTER_TX12_MK2(board) || IS_RADIOMASTER_BOXER(board);
case HasBluetooth:
return (IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_TARANIS_X9DP_2019(board) || IS_FLYSKY_NV14(board)) ? true : false;
return (IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) ||
IS_TARANIS_X9DP_2019(board) || IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board)) ? true : false;
case HasADCJitterFilter:
return IS_HORUS_OR_TARANIS(board);
case HasTelemetryBaudrate:
@@ -801,7 +804,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
return id.contains("internalelrs") || IS_RADIOMASTER_TX12_MK2(board) ||
IS_IFLIGHT_COMMANDO8(board) || IS_RADIOMASTER_BOXER(board);
case HasIntModuleFlySky:
return id.contains("afhds3") || IS_FLYSKY_NV14(board);
return id.contains("afhds2a") || id.contains("afhds3") ||
IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board);
default:
return 0;
}
@@ -1136,13 +1140,15 @@ enum RfOptions {
NONE = 0,
EU = 1 << 0,
FLEX = 1 << 1,
AFHDS3 = 1 << 2
AFHDS2A = 1 << 2,
AFHDS3 = 1 << 3,
};
void addOpenTxRfOptions(OpenTxFirmware * firmware, uint8_t options)
{
static const Firmware::Option opt_eu("eu", Firmware::tr("Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015"));
static const Firmware::Option opt_fl("flexr9m", Firmware::tr("Enable non certified firmwares"));
static const Firmware::Option opt_afhds2a("afhds2a", Firmware::tr("Enable AFHDS2A support"));
static const Firmware::Option opt_afhds3("afhds3", Firmware::tr("Enable AFHDS3 support"));
@@ -1152,6 +1158,8 @@ void addOpenTxRfOptions(OpenTxFirmware * firmware, uint8_t options)
firmware->addOption(opt_eu);
else if ((options & FLEX) != 0)
firmware->addOption(opt_fl);
if ((options & AFHDS2A) != 0)
firmware->addOption(opt_afhds2a);
if ((options & AFHDS3) != 0)
firmware->addOption(opt_afhds3);
}
@@ -1205,7 +1213,7 @@ void registerOpenTxFirmwares()
firmware->addOption("noras", Firmware::tr("Disable RAS (SWR)"));
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3);
addOpenTxRfOptions(firmware, EU + FLEX + AFHDS2A + AFHDS3);
/* FrSky Taranis X9D+ 2019 board */
firmware = new OpenTxFirmware(FIRMWAREID("x9d+2019"), Firmware::tr("FrSky Taranis X9D+ 2019"), BOARD_TARANIS_X9DP_2019, "x9dp2019");
@@ -1219,7 +1227,7 @@ void registerOpenTxFirmwares()
firmware->addOption("haptic", Firmware::tr("Haptic module installed"));
addOpenTxTaranisOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3);
addOpenTxRfOptions(firmware, EU + FLEX + AFHDS2A + AFHDS3);
/* FrSky Taranis X9E board */
firmware = new OpenTxFirmware(FIRMWAREID("x9e"), Firmware::tr("FrSky Taranis X9E"), BOARD_TARANIS_X9E);
@@ -1365,7 +1373,7 @@ void registerOpenTxFirmwares()
firmware->addOption("internalelrs", Firmware::tr("Select if internal ELRS module is installed"));
addOpenTxFontOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX + AFHDS3);
addOpenTxRfOptions(firmware, FLEX + AFHDS2A + AFHDS3);
/* Radiomaster Boxer board */
firmware = new OpenTxFirmware(FIRMWAREID("boxer"), QCoreApplication::translate("Firmware", "Radiomaster Boxer"), Board::BOARD_RADIOMASTER_BOXER);
@@ -1375,7 +1383,7 @@ void registerOpenTxFirmwares()
firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen"));
addOpenTxFontOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX + AFHDS3);
addOpenTxRfOptions(firmware, FLEX + AFHDS2A + AFHDS3);
/* Radiomaster T8 board */
firmware = new OpenTxFirmware(FIRMWAREID("t8"), QCoreApplication::translate("Firmware", "Radiomaster T8"), BOARD_RADIOMASTER_T8);
@@ -1409,7 +1417,14 @@ void registerOpenTxFirmwares()
firmware = new OpenTxFirmware(FIRMWAREID("nv14"), QCoreApplication::translate("Firmware", "FlySky NV14"), BOARD_FLYSKY_NV14);
addOpenTxFrskyOptions(firmware);
firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module"));
addOpenTxRfOptions(firmware, FLEX + AFHDS3);
addOpenTxRfOptions(firmware, FLEX + AFHDS2A + AFHDS3);
registerOpenTxFirmware(firmware);
/* FlySky EL18 board */
firmware = new OpenTxFirmware(FIRMWAREID("el18"), QCoreApplication::translate("Firmware", "FlySky EL18"), BOARD_FLYSKY_EL18);
addOpenTxFrskyOptions(firmware);
firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module"));
addOpenTxRfOptions(firmware, FLEX + AFHDS2A + AFHDS3);
registerOpenTxFirmware(firmware);
/* BETAFPV LR3PRO board */
+69 -18
View File
@@ -225,6 +225,7 @@ void TimerPanel::onModeChanged(int index)
#define MASK_MULTI_DSM_OPT (1<<19)
#define MASK_CHANNELMAP (1<<20)
#define MASK_MULTI_BAYANG_OPT (1<<21)
#define MASK_AFHDS (1<<22)
quint8 ModulePanel::failsafesValueDisplayType = ModulePanel::FAILSAFE_DISPLAY_PERCENT;
@@ -320,9 +321,32 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul
connect(ui->clearRx1, SIGNAL(clicked()), this, SLOT(onClearAccessRxClicked()));
connect(ui->clearRx2, SIGNAL(clicked()), this, SLOT(onClearAccessRxClicked()));
connect(ui->clearRx3, SIGNAL(clicked()), this, SLOT(onClearAccessRxClicked()));
connect(ui->cboAfhdsOpt1, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=] (int index)
{
if (lock)
return;
if (this->module.protocol == PULSES_FLYSKY_AFHDS2A)
Helpers::setBitmappedValue(this->module.flysky.mode, ui->cboAfhdsOpt1->currentData().toInt(), 1);
else
this->module.afhds3.phyMode = ui->cboAfhdsOpt1->currentData().toInt();
emit modified();
});
connect(ui->cboAfhdsOpt2, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=] (int index)
{
if (lock)
return;
if (this->module.protocol == PULSES_FLYSKY_AFHDS2A)
Helpers::setBitmappedValue(this->module.flysky.mode, ui->cboAfhdsOpt2->currentData().toInt(), 0);
else
this->module.afhds3.emi = ui->cboAfhdsOpt2->currentData().toInt();
emit modified();
});
lock = false;
}
ModulePanel::~ModulePanel()
@@ -529,10 +553,10 @@ void ModulePanel::update()
if (pdef.disableChannelMap)
mask |= MASK_CHANNELMAP;
break;
case PULSES_AFHDS3:
module.channelsCount = 18;
mask |= MASK_CHANNELS_RANGE| MASK_CHANNELS_COUNT | MASK_FAILSAFES;
mask |= MASK_SUBTYPES | MASK_RX_FREQ | MASK_RF_POWER;
case PULSES_FLYSKY_AFHDS3:
mask |= MASK_RX_NUMBER;
case PULSES_FLYSKY_AFHDS2A:
mask |= MASK_CHANNELS_RANGE| MASK_CHANNELS_COUNT | MASK_FAILSAFES | MASK_AFHDS;
break;
case PULSES_LEMON_DSMP:
mask |= MASK_CHANNELS_RANGE;
@@ -638,9 +662,6 @@ void ModulePanel::update()
if (firmware->getCapability(HasModuleR9MFlex))
i = 2;
break;
case PULSES_AFHDS3:
numEntries = 4;
break;
case PULSES_PPM:
numEntries = PPM_NUM_SUBTYPES;
break;
@@ -755,11 +776,33 @@ void ModulePanel::update()
ui->clearRx3->setVisible((mask & MASK_ACCESS) && (module.access.receivers & (1 << 2)));
ui->rx3->setVisible((mask & MASK_ACCESS) && (module.access.receivers & (1 << 2)));
// AFHFS
if (mask & MASK_AFHDS) {
if (protocol == PULSES_FLYSKY_AFHDS2A) {
ui->label_afhds->setText(tr("Options"));
ui->cboAfhdsOpt1->setModel(ModuleData::afhds2aMode1ItemModel());
ui->cboAfhdsOpt1->setCurrentIndex(Helpers::getBitmappedValue(module.flysky.mode, 1));
ui->cboAfhdsOpt2->setModel(ModuleData::afhds2aMode2ItemModel());
ui->cboAfhdsOpt2->setCurrentIndex(Helpers::getBitmappedValue(module.flysky.mode, 0));
}
else {
ui->label_afhds->setText(tr("Type"));
ui->cboAfhdsOpt1->setModel(ModuleData::afhds3PhyModeItemModel());
ui->cboAfhdsOpt1->setCurrentIndex(ui->cboAfhdsOpt1->findData(module.afhds3.phyMode));
ui->cboAfhdsOpt2->setModel(ModuleData::afhds3EmiItemModel());
ui->cboAfhdsOpt2->setCurrentIndex(ui->cboAfhdsOpt2->findData(module.afhds3.emi));
}
}
ui->label_afhds->setVisible(mask & MASK_AFHDS);
ui->cboAfhdsOpt1->setVisible(mask & MASK_AFHDS);
ui->cboAfhdsOpt2->setVisible(mask & MASK_AFHDS);
// Failsafes
ui->label_failsafeMode->setVisible(mask & MASK_FAILSAFES);
ui->failsafeMode->setVisible(mask & MASK_FAILSAFES);
//hide reciever mode for afhds3
qobject_cast<QListView *>(ui->failsafeMode->view())->setRowHidden(FAILSAFE_RECEIVER, protocol == PULSES_AFHDS3);
if ((mask & MASK_FAILSAFES) && module.failsafeMode == FAILSAFE_CUSTOM) {
if (ui->failsafesGroupBox->isHidden()) {
@@ -813,6 +856,12 @@ void ModulePanel::onProtocolChanged(int index)
ui->telemetryBaudrate->setCurrentIndex(1);
}
}
else if (module.protocol == PULSES_FLYSKY_AFHDS2A) {
module.flysky.setDefault();
}
else if (module.protocol == PULSES_FLYSKY_AFHDS3) {
module.afhds3.setDefault();
}
emit protocolChanged();
emit updateItemModels();
@@ -832,7 +881,11 @@ void ModulePanel::on_r9mPower_currentIndexChanged(int index)
{
if (!lock) {
if (module.protocol == PULSES_AFHDS3 && module.afhds3.rfPower != (unsigned int)index) {
if (module.protocol == PULSES_FLYSKY_AFHDS2A && module.flysky.rfPower != (unsigned int)index) {
module.flysky.rfPower = index;
emit modified();
}
else if (module.protocol == PULSES_FLYSKY_AFHDS3 && module.afhds3.rfPower != (unsigned int)index) {
module.afhds3.rfPower = index;
emit modified();
}
@@ -978,19 +1031,17 @@ void ModulePanel::onSubTypeChanged()
if (!lock && module.subType != type) {
lock=true;
module.subType = type;
if (module.protocol != PULSES_AFHDS3) {
update();
}
emit modified();
lock = false;
}
}
void ModulePanel::onRfFreqChanged(int freq) {
if (module.afhds3.rxFreq != (unsigned int)freq) {
module.afhds3.rxFreq = (unsigned int)freq;
emit modified();
}
// TODO fix for AFHDS2A
//if (module.afhds3.rxFreq != (unsigned int)freq) {
// module.afhds3.rxFreq = (unsigned int)freq;
// emit modified();
//}
}
void ModulePanel::on_disableTelem_stateChanged(int state)
+27 -10
View File
@@ -232,7 +232,7 @@
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<item row="6" column="0" colspan="2">
<widget class="QLabel" name="warning_r9mFlex">
<property name="palette">
<palette>
@@ -276,7 +276,7 @@
</property>
</widget>
</item>
<item row="6" column="0">
<item row="7" column="0">
<widget class="QLabel" name="label_failsafeMode">
<property name="maximumSize">
<size>
@@ -292,7 +292,7 @@
</property>
</widget>
</item>
<item row="6" column="1">
<item row="7" column="1">
<widget class="QComboBox" name="failsafeMode">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
@@ -336,7 +336,7 @@
</item>
</widget>
</item>
<item row="7" column="0">
<item row="8" column="0">
<widget class="QLabel" name="label_trainerMode">
<property name="maximumSize">
<size>
@@ -352,7 +352,7 @@
</property>
</widget>
</item>
<item row="7" column="1">
<item row="8" column="1">
<widget class="AutoComboBox" name="trainerMode">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
@@ -371,35 +371,35 @@
</property>
</widget>
</item>
<item row="8" column="1">
<item row="9" column="1">
<widget class="QCheckBox" name="disableTelem">
<property name="text">
<string>Disable Telemetry</string>
</property>
</widget>
</item>
<item row="11" column="1">
<item row="12" column="1">
<widget class="QCheckBox" name="disableChMap">
<property name="text">
<string>Disable Ch. Map</string>
</property>
</widget>
</item>
<item row="12" column="1">
<item row="13" column="1">
<widget class="QCheckBox" name="racingMode">
<property name="text">
<string>Racing Mode</string>
</property>
</widget>
</item>
<item row="13" column="1">
<item row="14" column="1">
<widget class="QCheckBox" name="raw12bits">
<property name="text">
<string>Raw 12 bits</string>
</property>
</widget>
</item>
<item row="15" column="0" colspan="2">
<item row="16" column="0" colspan="2">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@@ -412,6 +412,23 @@
</property>
</spacer>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_afhds">
<property name="text">
<string>Options</string>
</property>
</widget>
</item>
<item row="5" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QComboBox" name="cboAfhdsOpt1"/>
</item>
<item>
<widget class="QComboBox" name="cboAfhdsOpt2"/>
</item>
</layout>
</item>
</layout>
</item>
<item row="0" column="1">
+7 -5
View File
@@ -215,7 +215,8 @@ QString ModelPrinter::printModule(int idx)
str << printLabelValue(tr("Delay"), QString("%1us").arg(module.ppm.delay));
}
else {
if (!(module.protocol == PULSES_PXX_XJT_D8 || module.protocol == PULSES_CROSSFIRE || module.protocol == PULSES_GHOST || module.protocol == PULSES_SBUS)) {
if (!(module.protocol == PULSES_PXX_XJT_D8 || module.protocol == PULSES_CROSSFIRE ||
module.protocol == PULSES_GHOST || module.protocol == PULSES_SBUS || module.protocol == PULSES_FLYSKY_AFHDS2A)) {
str << printLabelValue(tr("Receiver"), QString::number(module.modelId));
}
if (module.protocol == PULSES_MULTIMODULE) {
@@ -227,10 +228,11 @@ QString ModelPrinter::printModule(int idx)
str << printLabelValue(tr("Sub Type"), module.subTypeToString());
str << printLabelValue(tr("RF Output Power"), module.powerValueToString(firmware));
}
if (module.protocol == PULSES_AFHDS3) {
str << printLabelValue(tr("Output Type"), module.subTypeToString());
str << printLabelValue(tr("RF Output Power"), module.powerValueToString(firmware));
str << printLabelValue(tr("RX Output Frequency"), QString("%1Hz").arg(module.afhds3.rxFreq));
if (module.protocol == PULSES_FLYSKY_AFHDS2A) {
str << printLabelValue(tr("Options"), module.afhds2aMode1ToString() + " " + module.afhds2aMode2ToString());
}
if (module.protocol == PULSES_FLYSKY_AFHDS3) {
str << printLabelValue(tr("Type"), module.afhds3PhyModeToString() + " " + module.afhds3EmiToString());
}
if (module.protocol == PULSES_GHOST) {
str << printLabelValue(tr("Raw 12 bits"), printBoolean(module.ghost.raw12bits, BOOLEAN_YN));
+2
View File
@@ -25,6 +25,7 @@ set(simulation_SRCS
simulateduiwidgetT8.cpp
simulateduiwidgetTX16S.cpp
simulateduiwidgetNV14.cpp
simulateduiwidgetEL18.cpp
simulatorinterface.cpp
simulatormainwindow.cpp
simulatorstartupdialog.cpp
@@ -61,6 +62,7 @@ set(simulation_UIS
simulateduiwidgetT8.ui
simulateduiwidgetTX16S.ui
simulateduiwidgetNV14.ui
simulateduiwidgetEL18.ui
simulatormainwindow.ui
simulatorstartupdialog.ui
simulatorwidget.ui
+14 -1
View File
@@ -124,6 +124,7 @@ namespace Ui {
class SimulatedUIWidgetBoxer;
class SimulatedUIWidgetT8;
class SimulatedUIWidgetNV14;
class SimulatedUIWidgetEL18;
}
class SimulatedUIWidget9X: public SimulatedUIWidget
@@ -241,7 +242,7 @@ class SimulatedUIWidgetX12: public SimulatedUIWidget
class SimulatedUIWidgetLR3PRO: public SimulatedUIWidget
{
Q_OBJECT
public:
explicit SimulatedUIWidgetLR3PRO(SimulatorInterface * simulator, QWidget * parent = NULL);
virtual ~SimulatedUIWidgetLR3PRO();
@@ -394,4 +395,16 @@ class SimulatedUIWidgetNV14: public SimulatedUIWidget
Ui::SimulatedUIWidgetNV14 * ui;
};
class SimulatedUIWidgetEL18: public SimulatedUIWidget
{
Q_OBJECT
public:
explicit SimulatedUIWidgetEL18(SimulatorInterface * simulator, QWidget * parent = nullptr);
virtual ~SimulatedUIWidgetEL18();
private:
Ui::SimulatedUIWidgetEL18 * ui;
};
#endif // SIMULATEDUIWIDGET_H
@@ -0,0 +1,76 @@
/*
* 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.
*/
// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h
#include "simulateduiwidget.h"
#include "ui_simulateduiwidgetEL18.h"
SimulatedUIWidgetEL18::SimulatedUIWidgetEL18(SimulatorInterface *simulator, QWidget * parent):
SimulatedUIWidget(simulator, parent),
ui(new Ui::SimulatedUIWidgetEL18)
{
RadioUiAction * act;
ui->setupUi(this);
// add actions in order of appearance on the help menu
// Note: the EL18 has no physical buttons though at some point the trim joystick is repurposed
// allow for colorlcd key events and see what works
// the mouse click areas do not map to visual buttons on the background images
act = new RadioUiAction(12, QList<int>() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL);
addRadioWidget(ui->rightbuttons->addArea(QRect(10, 1, 80, 35), "NV14/left.png", act));
m_mouseMidClickAction = new RadioUiAction(2, QList<int>() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN);
addRadioWidget(ui->rightbuttons->addArea(QRect(10, 40, 80, 35), "NV14/left.png", m_mouseMidClickAction));
act = new RadioUiAction(14, QList<int>() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS);
addRadioWidget(ui->leftbuttons->addArea(QRect(10, 80, 80, 35), "NV14/left.png", act));
act = new RadioUiAction(13, QList<int>() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE);
addRadioWidget(ui->leftbuttons->addArea(QRect(10, 120, 80, 35), "NV14/left.png", act));
act = new RadioUiAction(5, QList<int>() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN);
addRadioWidget(ui->leftbuttons->addArea(QRect(10, 160, 80, 35), "NV14/left.png", act));
act = new RadioUiAction(4, QList<int>() << Qt::Key_PageUp, SIMU_STR_HLP_KEY_PGUP, SIMU_STR_HLP_ACT_PGUP);
addRadioWidget(ui->leftbuttons->addArea(QRect(10, 200, 80, 35), "NV14/left.png", act));
act = new RadioUiAction(1, QList<int>() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace,
SIMU_STR_HLP_KEY_DN % "<br>" % SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_RTN);
addRadioWidget(ui->leftbuttons->addArea(QRect(10, 240, 80, 35), "NV14/left.png", act));
m_scrollUpAction = new RadioUiAction(-1, QList<int>() << Qt::Key_Minus, SIMU_STR_HLP_KEY_MIN % "|" % SIMU_STR_HLP_MOUSE_UP, SIMU_STR_HLP_ACT_ROT_LFT);
m_scrollDnAction = new RadioUiAction(-1, QList<int>() << Qt::Key_Plus << Qt::Key_Equal, SIMU_STR_HLP_KEY_PLS % "|" % SIMU_STR_HLP_MOUSE_DN, SIMU_STR_HLP_ACT_ROT_RGT);
connectScrollActions();
addRadioWidget(ui->leftbuttons->addArea(QRect(10, 280, 30, 30), "NV14/left.png", m_screenshotAction));
m_backlightColors << QColor(47, 123, 227);
setLcd(ui->lcd);
}
SimulatedUIWidgetEL18::~SimulatedUIWidgetEL18()
{
delete ui;
}
@@ -0,0 +1,206 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SimulatedUIWidgetEL18</class>
<widget class="QWidget" name="SimulatedUIWidgetEL18">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>520</width>
<height>500</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>520</width>
<height>500</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>520</width>
<height>500</height>
</size>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="2" rowspan="3">
<widget class="ButtonsWidget" name="rightbuttons" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>500</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>500</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/NV14/right.png)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="LcdWidget" name="lcd" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>480</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>320</width>
<height>480</height>
</size>
</property>
<property name="font">
<font>
<pointsize>5</pointsize>
</font>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="3">
<widget class="ButtonsWidget" name="leftbuttons" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>500</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>500</height>
</size>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/NV14/left.png);</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QWidget" name="top" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>10</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>320</width>
<height>10</height>
</size>
</property>
<property name="font">
<font>
<pointsize>5</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/NV14/top.png)</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QWidget" name="bottom" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>10</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>320</width>
<height>10</height>
</size>
</property>
<property name="font">
<font>
<pointsize>5</pointsize>
<kerning>false</kerning>
</font>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/NV14/bottom.png)</string>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>LcdWidget</class>
<extends>QWidget</extends>
<header>lcdwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>ButtonsWidget</class>
<extends>QWidget</extends>
<header>buttonswidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
@@ -128,6 +128,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_FLYSKY_NV14:
radioUiWidget = new SimulatedUIWidgetNV14(simulator, this);
break;
case Board::BOARD_FLYSKY_EL18:
radioUiWidget = new SimulatedUIWidgetEL18(simulator, this);
break;
default:
radioUiWidget = new SimulatedUIWidget9X(simulator, this);
break;
+1 -1
View File
@@ -1,7 +1,7 @@
{
"targets": [
["BETAFPV LiteRadio 3 Pro", "lr3pro-"],
["Flysky EL18", "nv14-"],
["Flysky EL18", "el18-"],
["Flysky NV14", "nv14-"],
["FrSky Horus X10", "x10-"],
["FrSky Horus X10 Access", "x10-access-"],
+1 -1
View File
@@ -455,7 +455,7 @@ PACK(struct PpmModule {
});
PACK(struct ModuleData {
uint8_t type ENUM(ModuleType);
uint8_t type ENUM(ModuleType) CUST(r_moduleType, w_moduleType);
CUST_ATTR(subType,r_modSubtype,w_modSubtype);
uint8_t channelsStart;
int8_t channelsCount CUST(r_channelsCount,w_channelsCount); // 0=8 channels
+7 -5
View File
@@ -138,11 +138,13 @@ if(CROSSFIRE)
add_gui_src(crossfire_settings.cpp)
endif()
if(AFHDS2 OR AFHDS3)
add_gui_src(flysky_settings.cpp)
if(AFHDS3)
add_gui_src(afhds3_options.cpp)
endif()
if(AFHDS2)
add_gui_src(afhds2a_settings.cpp)
endif()
if(AFHDS3)
add_gui_src(afhds3_settings.cpp)
add_gui_src(afhds3_options.cpp)
endif()
if(MULTIMODULE)
+141
View File
@@ -0,0 +1,141 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* 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 "afhds2a_settings.h"
#include "opentx.h"
#include "pulses/flysky.h"
#define SET_DIRTY() storageDirty(EE_MODEL)
class FSProtoOpts : public FormWindow
{
std::function<uint8_t()> _getMode;
std::function<void(uint8_t)> _setMode;
public:
FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
std::function<void(uint8_t)> setMode);
};
FSProtoOpts::FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
std::function<void(uint8_t)> setMode) :
FormWindow(parent, rect_t{}),
_getMode(std::move(getMode)),
_setMode(std::move(setMode))
{
setFlexLayout(LV_FLEX_FLOW_ROW);
// PPM / PWM
new Choice(
this, rect_t{}, STR_FLYSKY_PULSE_PROTO, 0, 1,
[=]() -> int { return _getMode() >> 1; },
[=](int v) {
_setMode((_getMode() & 1) | ((v & 1) << 1));
SET_DIRTY();
});
// SBUS / iBUS
new Choice(
this, rect_t{}, STR_FLYSKY_SERIAL_PROTO, 0, 1,
[=]() -> int { return _getMode() & 1; },
[=](int v) {
_setMode((_getMode() & 2) | (v & 1));
SET_DIRTY();
});
}
AFHDS2ASettings::AFHDS2ASettings(Window* parent, const FlexGridLayout& g,
uint8_t moduleIdx) :
FormWindow(parent, rect_t{}),
moduleIdx(moduleIdx),
md(&g_model.moduleData[moduleIdx]),
grid(g)
{
setFlexLayout();
FormWindow::Line* line;
// RX options:
line = newLine(&grid);
afhds2OptionsLabel = new StaticText(line, rect_t{}, STR_OPTIONS, 0, COLOR_THEME_PRIMARY1);
afhds2ProtoOpts = new FSProtoOpts(
line, [=]() { return md->flysky.mode; },
[=](uint8_t v) { md->flysky.mode = v; });
#if defined(PCBNV14)
if (getNV14RfFwVersion() >= 0x1000E) {
line = newLine(&grid);
static const char* _rf_power[] = {"Default", "High"};
afhds2RFPowerText = new StaticText(line, rect_t{}, STR_MULTI_RFPOWER);
afhds2RFPowerChoice = new Choice(line, rect_t{}, _rf_power, 0, 1,
GET_DEFAULT(md->flysky.rfPower),
[=](int32_t newValue) -> void {
md->flysky.rfPower = newValue;
resetPulsesAFHDS2();
});
#endif
}
hideAFHDS2Options();
}
void AFHDS2ASettings::hideAFHDS2Options()
{
lv_obj_add_flag(afhds2OptionsLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(afhds2ProtoOpts->getLvObj(), LV_OBJ_FLAG_HIDDEN);
#if defined(PCBNV14)
if (afhds2RFPowerText != nullptr)
lv_obj_add_flag(afhds2RFPowerText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
if (afhds2RFPowerChoice != nullptr)
lv_obj_add_flag(afhds2RFPowerChoice->getLvObj(), LV_OBJ_FLAG_HIDDEN);
#endif
}
void AFHDS2ASettings::showAFHDS2Options()
{
lv_obj_clear_flag(afhds2OptionsLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(afhds2ProtoOpts->getLvObj(), LV_OBJ_FLAG_HIDDEN);
#if defined(PCBNV14)
if (afhds2RFPowerText != nullptr)
lv_obj_clear_flag(afhds2RFPowerText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
if (afhds2RFPowerChoice != nullptr)
{
lv_obj_clear_flag(afhds2RFPowerChoice->getLvObj(), LV_OBJ_FLAG_HIDDEN);
lv_event_send(afhds2RFPowerChoice->getLvObj(), LV_EVENT_VALUE_CHANGED, nullptr);
}
#endif
}
void AFHDS2ASettings::checkEvents() {
FormWindow::checkEvents();
}
void AFHDS2ASettings::update()
{
lastRefresh = get_tmr10ms();
if (isModuleAFHDS2A(moduleIdx)) {
showAFHDS2Options();
} else {
hideAFHDS2Options();
}
}
+51
View File
@@ -0,0 +1,51 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* 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.
*/
#pragma once
#include "form.h"
#include "choice.h"
#include "module_setup.h"
struct ModuleData;
class AFHDS2ASettings : public FormWindow, public ModuleOptions
{
uint8_t moduleIdx;
ModuleData* md;
FlexGridLayout grid;
tmr10ms_t lastRefresh = 0;
Window* afhds2OptionsLabel = nullptr;
Window* afhds2ProtoOpts = nullptr;
#if defined(PCBNV14)
Window* afhds2RFPowerText = nullptr;
Window* afhds2RFPowerChoice = nullptr;
#endif
void hideAFHDS2Options();
void showAFHDS2Options();
void checkEvents() override;
void update() override;
public:
AFHDS2ASettings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx);
};
@@ -19,18 +19,9 @@
* GNU General Public License for more details.
*/
#include "flysky_settings.h"
#include "opentx.h"
#if defined(AFHDS3)
#include "afhds3_settings.h"
#include "afhds3_options.h"
#endif
#include "pulses/flysky.h"
#include "pulses/afhds3.h"
#include "pulses/afhds3_config.h"
#define SET_DIRTY() storageDirty(EE_MODEL)
#include "opentx.h"
static const char* _afhds3_region[] = { "CE", "FCC" };
@@ -44,44 +35,13 @@ static const char* _afhds3_phy_mode[] = {
"Lora 12ch",
};
class FSProtoOpts : public FormWindow
{
std::function<uint8_t()> _getMode;
std::function<void(uint8_t)> _setMode;
public:
FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
std::function<void(uint8_t)> setMode);
};
#include "pulses/flysky.h"
#include "pulses/afhds3.h"
#include "pulses/afhds3_config.h"
FSProtoOpts::FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
std::function<void(uint8_t)> setMode) :
FormWindow(parent, rect_t{}),
_getMode(std::move(getMode)),
_setMode(std::move(setMode))
{
setFlexLayout(LV_FLEX_FLOW_ROW);
#define SET_DIRTY() storageDirty(EE_MODEL)
// PPM / PWM
new Choice(
this, rect_t{}, STR_FLYSKY_PULSE_PROTO, 0, 1,
[=]() -> int { return _getMode() >> 1; },
[=](int v) {
_setMode((_getMode() & 1) | ((v & 1) << 1));
SET_DIRTY();
});
// SBUS / iBUS
new Choice(
this, rect_t{}, STR_FLYSKY_SERIAL_PROTO, 0, 1,
[=]() -> int { return _getMode() & 1; },
[=](int v) {
_setMode((_getMode() & 2) | (v & 1));
SET_DIRTY();
});
}
FlySkySettings::FlySkySettings(Window* parent, const FlexGridLayout& g,
AFHDS3Settings::AFHDS3Settings(Window* parent, const FlexGridLayout& g,
uint8_t moduleIdx) :
FormWindow(parent, rect_t{}),
moduleIdx(moduleIdx),
@@ -92,33 +52,6 @@ FlySkySettings::FlySkySettings(Window* parent, const FlexGridLayout& g,
FormWindow::Line* line;
#if defined(AFHDS2)
// RX options:
line = newLine(&grid);
afhds2OptionsLabel = new StaticText(line, rect_t{}, STR_OPTIONS, 0, COLOR_THEME_PRIMARY1);
afhds2ProtoOpts = new FSProtoOpts(
line, [=]() { return md->flysky.mode; },
[=](uint8_t v) { md->flysky.mode = v; });
#if defined(PCBNV14)
if (getNV14RfFwVersion() >= 0x1000E) {
line = newLine(&grid);
static const char* _rf_power[] = {"Default", "High"};
afhds2RFPowerText = new StaticText(line, rect_t{}, STR_MULTI_RFPOWER);
afhds2RFPowerChoice = new Choice(line, rect_t{}, _rf_power, 0, 1,
GET_DEFAULT(md->flysky.rfPower),
[=](int32_t newValue) -> void {
md->flysky.rfPower = newValue;
resetPulsesAFHDS2();
});
#endif
}
hideAFHDS2Options();
#endif
#if defined(AFHDS3)
// Status
line = newLine(&grid);
afhds3StatusLabel = new StaticText(line, rect_t{}, STR_MODULE_STATUS, 0, COLOR_THEME_PRIMARY1);
@@ -164,40 +97,9 @@ FlySkySettings::FlySkySettings(Window* parent, const FlexGridLayout& g,
}
hideAFHDS3Options();
#endif
}
#if defined(AFHDS2)
void FlySkySettings::hideAFHDS2Options()
{
lv_obj_add_flag(afhds2OptionsLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(afhds2ProtoOpts->getLvObj(), LV_OBJ_FLAG_HIDDEN);
#if defined(PCBNV14)
if (afhds2RFPowerText != nullptr)
lv_obj_add_flag(afhds2RFPowerText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
if (afhds2RFPowerChoice != nullptr)
lv_obj_add_flag(afhds2RFPowerChoice->getLvObj(), LV_OBJ_FLAG_HIDDEN);
#endif
}
void FlySkySettings::showAFHDS2Options()
{
lv_obj_clear_flag(afhds2OptionsLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(afhds2ProtoOpts->getLvObj(), LV_OBJ_FLAG_HIDDEN);
#if defined(PCBNV14)
if (afhds2RFPowerText != nullptr)
lv_obj_clear_flag(afhds2RFPowerText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
if (afhds2RFPowerChoice != nullptr)
{
lv_obj_clear_flag(afhds2RFPowerChoice->getLvObj(), LV_OBJ_FLAG_HIDDEN);
lv_event_send(afhds2RFPowerChoice->getLvObj(), LV_EVENT_VALUE_CHANGED, nullptr);
}
#endif
}
#endif
#if defined(AFHDS3)
void FlySkySettings::hideAFHDS3Options()
void AFHDS3Settings::hideAFHDS3Options()
{
lv_obj_add_flag(afhds3StatusLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(afhds3StatusText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
@@ -205,7 +107,7 @@ void FlySkySettings::hideAFHDS3Options()
lv_obj_add_flag(afhds3TypeForm->getLvObj(), LV_OBJ_FLAG_HIDDEN);
}
void FlySkySettings::showAFHDS3Options()
void AFHDS3Settings::showAFHDS3Options()
{
lv_obj_clear_flag(afhds3StatusLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(afhds3StatusText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
@@ -228,31 +130,21 @@ void FlySkySettings::showAFHDS3Options()
lv_obj_clear_state(afhds3Emi->getLvObj(), LV_STATE_DISABLED);
}
}
#endif
void FlySkySettings::checkEvents() {
void AFHDS3Settings::checkEvents() {
if (afhds3::getConfig(moduleIdx)->others.lastUpdated > lastRefresh) {
update();
}
FormWindow::checkEvents();
}
void FlySkySettings::update()
void AFHDS3Settings::update()
{
lastRefresh = get_tmr10ms();
#if defined(AFHDS2)
if (isModuleAFHDS2A(moduleIdx)) {
showAFHDS2Options();
} else {
hideAFHDS2Options();
}
#endif
#if defined(AFHDS3)
if (isModuleAFHDS3(moduleIdx)) {
showAFHDS3Options();
} else {
hideAFHDS3Options();
}
#endif
}
@@ -27,25 +27,13 @@
struct ModuleData;
class FlySkySettings : public FormWindow, public ModuleOptions
class AFHDS3Settings : public FormWindow, public ModuleOptions
{
uint8_t moduleIdx;
ModuleData* md;
FlexGridLayout grid;
tmr10ms_t lastRefresh = 0;
#if defined(AFHDS2)
Window* afhds2OptionsLabel = nullptr;
Window* afhds2ProtoOpts = nullptr;
#if defined(PCBNV14)
Window* afhds2RFPowerText = nullptr;
Window* afhds2RFPowerChoice = nullptr;
#endif
void hideAFHDS2Options();
void showAFHDS2Options();
#endif
#if defined(AFHDS3)
Window* afhds3StatusLabel = nullptr;
Window* afhds3StatusText = nullptr;
Window* afhds3TypeLabel = nullptr;
@@ -55,11 +43,10 @@ class FlySkySettings : public FormWindow, public ModuleOptions
Choice *afhds3RfPower = nullptr;
void hideAFHDS3Options();
void showAFHDS3Options();
#endif
void checkEvents() override;
void update() override;
public:
FlySkySettings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx);
AFHDS3Settings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx);
};
+6
View File
@@ -57,12 +57,18 @@ void ChannelRange::build()
chStart = new NumberEdit(this, rect_t{}, 1, 1, GET_DEFAULT(1 + getChannelsStart()));
chStart->setSetValueHandler([=](int newValue) { setStart(newValue); });
chStart->setPrefix(STR_CH);
#if LCD_H > LCD_W
chStart->setWidth(LCD_W/3-10);
#endif
chEnd = new NumberEdit(this, rect_t{}, 8, 8,
GET_DEFAULT(getChannelsStart() + 8 + getChannelsCount()));
chEnd->setPrefix(STR_CH);
chEnd->setSetValueHandler([=](int newValue) { setEnd(newValue); });
#if LCD_H > LCD_W
chEnd->setWidth(LCD_W/3-10);
#endif
}
void ChannelRange::setStart(uint8_t newValue)
+18 -36
View File
@@ -46,8 +46,12 @@
#include "crossfire_settings.h"
#endif
#if defined(AFHDS2) || defined(AFHDS3)
#include "flysky_settings.h"
#if defined(AFHDS2)
#include "afhds2a_settings.h"
#endif
#if defined(AFHDS3)
#include "afhds3_settings.h"
#endif
#if defined(AFHDS2)
@@ -213,9 +217,14 @@ void ModuleWindow::updateModule()
modOpts = new CrossfireSettings(this, grid, moduleIdx);
}
#endif
#if defined(AFHDS2) || defined(AFHDS3)
else if (isModuleFlySky(moduleIdx)) {
modOpts = new FlySkySettings(this, grid, moduleIdx);
#if defined(AFHDS2)
else if (isModuleAFHDS2A(moduleIdx)) {
modOpts = new AFHDS2ASettings(this, grid, moduleIdx);
}
#endif
#if defined(AFHDS3)
else if (isModuleAFHDS3(moduleIdx)) {
modOpts = new AFHDS3Settings(this, grid, moduleIdx);
}
#endif
#if defined(MULTIMODULE)
@@ -306,7 +315,7 @@ void ModuleWindow::updateModule()
}
#endif
#if defined(AFHDS2)
if (isModuleFlySky(moduleIdx)) resetPulsesAFHDS2();
if (isModuleAFHDS2A(moduleIdx)) resetPulsesAFHDS2();
#endif
if (isModuleDSMP(moduleIdx)) restartModule(moduleIdx);
return 0;
@@ -325,7 +334,7 @@ void ModuleWindow::updateModule()
#endif
moduleState[moduleIdx].mode = MODULE_MODE_BIND;
#if defined(AFHDS2)
if (isModuleFlySky(moduleIdx)) {
if (isModuleAFHDS2A(moduleIdx)) {
resetPulsesAFHDS2();
}
#endif
@@ -363,13 +372,13 @@ void ModuleWindow::updateModule()
} else {
moduleState[moduleIdx].mode = MODULE_MODE_RANGECHECK;
#if defined(AFHDS2)
if (isModuleFlySky(moduleIdx)) {
if (isModuleAFHDS2A(moduleIdx)) {
resetPulsesAFHDS2();
}
#endif
startRSSIDialog([=]() {
#if defined(AFHDS2)
if (isModuleFlySky(moduleIdx)) {
if (isModuleAFHDS2A(moduleIdx)) {
resetPulsesAFHDS2();
}
#endif
@@ -626,33 +635,6 @@ void ModuleSubTypeChoice::update()
setTextHandler(nullptr);
}
#endif
#if defined(AFHDS2) || defined(AFHDS3)
else if (isModuleFlySky(moduleIdx)) {
setMin(0);
setMax(FLYSKY_SUBTYPE_AFHDS2A);
setValues(STR_FLYSKY_PROTOCOLS);
setGetValueHandler(GET_DEFAULT(md->subType));
setSetValueHandler(SET_DEFAULT(md->subType));
#if defined(PCBNV14) && !defined(SIMU)
if (moduleIdx == INTERNAL_MODULE) {
if (hardwareOptions.pcbrev == PCBREV_NV14) {
md->subType = FLYSKY_SUBTYPE_AFHDS2A;
setAvailableHandler([](int v) { return v == FLYSKY_SUBTYPE_AFHDS2A; });
} else {
md->subType = FLYSKY_SUBTYPE_AFHDS3;
setAvailableHandler([](int v) { return v == FLYSKY_SUBTYPE_AFHDS3; });
}
}
#elif !defined(SIMU)
md->subType = FLYSKY_SUBTYPE_AFHDS3;
setAvailableHandler([](int v) { return v == FLYSKY_SUBTYPE_AFHDS3; });
#else
setAvailableHandler(nullptr);
#endif
setTextHandler(nullptr);
}
#endif
#if defined(MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
setMin(0);
+18 -4
View File
@@ -773,7 +773,8 @@ bool isModuleUsingSport(uint8_t moduleBay, uint8_t moduleType)
case MODULE_TYPE_ISRM_PXX2:
case MODULE_TYPE_R9M_LITE_PXX2:
case MODULE_TYPE_R9M_LITE_PRO_PXX2:
case MODULE_TYPE_FLYSKY:
case MODULE_TYPE_FLYSKY_AFHDS2A:
case MODULE_TYPE_FLYSKY_AFHDS3:
return false;
case MODULE_TYPE_XJT_PXX1:
@@ -823,8 +824,11 @@ bool isInternalModuleSupported(int moduleType)
#if defined(INTERNAL_MODULE_PPM)
case MODULE_TYPE_PPM: return true;
#endif
#if defined(INTERNAL_MODULE_AFHDS2A) || defined(INTERNAL_MODULE_AFHDS3)
case MODULE_TYPE_FLYSKY: return true;
#if defined(INTERNAL_MODULE_AFHDS2A)
case MODULE_TYPE_FLYSKY_AFHDS2A: return true;
#endif
#if defined(INTERNAL_MODULE_AFHDS3)
case MODULE_TYPE_FLYSKY_AFHDS3: return true;
#endif
}
return false;
@@ -963,7 +967,17 @@ bool isExternalModuleAvailable(int moduleType)
#endif
#if !defined(AFHDS3)
if (moduleType == MODULE_TYPE_FLYSKY)
if (moduleType == MODULE_TYPE_FLYSKY_AFHDS3)
return false;
#endif
#if !defined(AFHDS2)
if (moduleType == MODULE_TYPE_FLYSKY_AFHDS2A)
return false;
#endif
#if !defined(AFHDS3)
if (moduleType == MODULE_TYPE_FLYSKY_AFHDS3)
return false;
#endif
+2 -6
View File
@@ -40,7 +40,8 @@ enum ModuleType {
MODULE_TYPE_R9M_LITE_PRO_PXX2,
MODULE_TYPE_SBUS,
MODULE_TYPE_XJT_LITE_PXX2,
MODULE_TYPE_FLYSKY,
MODULE_TYPE_FLYSKY_AFHDS2A,
MODULE_TYPE_FLYSKY_AFHDS3,
MODULE_TYPE_LEMON_DSMP,
MODULE_TYPE_COUNT SKIP,
MODULE_TYPE_MAX SKIP = MODULE_TYPE_COUNT - 1
@@ -132,11 +133,6 @@ enum ModuleSubtypeDSM2 {
DSM2_PROTO_DSMX,
};
enum ModuleSubtypeFlysky {
FLYSKY_SUBTYPE_AFHDS3=0,
FLYSKY_SUBTYPE_AFHDS2A
};
enum FailsafeModes {
FAILSAFE_NOT_SET,
FAILSAFE_HOLD,
+30 -27
View File
@@ -33,7 +33,7 @@
#include "telemetry/multi.h"
#endif
#if defined(PCBNV14)
#if defined(PCBNV14) && defined(AFHDS2)
extern uint32_t NV14internalModuleFwVersion;
#endif
@@ -398,22 +398,19 @@ inline bool isModuleSBUS(uint8_t moduleIdx)
return g_model.moduleData[moduleIdx].type == MODULE_TYPE_SBUS;
}
inline bool isModuleFlySky(uint8_t idx)
{
return
(g_model.moduleData[idx].type == MODULE_TYPE_FLYSKY);
}
inline bool isModuleAFHDS2A(uint8_t idx)
{
return isModuleFlySky(idx)
&& (g_model.moduleData[idx].subType == FLYSKY_SUBTYPE_AFHDS2A);
return (g_model.moduleData[idx].type == MODULE_TYPE_FLYSKY_AFHDS2A);
}
inline bool isModuleAFHDS3(uint8_t idx)
{
return isModuleFlySky(idx)
&& (g_model.moduleData[idx].subType == FLYSKY_SUBTYPE_AFHDS3);
return (g_model.moduleData[idx].type == MODULE_TYPE_FLYSKY_AFHDS3);
}
inline bool isModuleFlySky(uint8_t idx)
{
return (isModuleAFHDS2A(idx) || isModuleAFHDS3(idx));
}
inline bool isModuleDSMP(uint8_t idx)
@@ -439,7 +436,8 @@ static const int8_t maxChannelsModules_M8[] = {
0, // MODULE_TYPE_R9M_LITE_PRO_PXX2: index NOT USED
8, // MODULE_TYPE_SBUS
0, // MODULE_TYPE_XJT_LITE_PXX2: index NOT USED
6, // MODULE_TYPE_FLYSKY: 14 channels for AFHDS2A, AFHDS3 special cased
6, // MODULE_TYPE_FLYSKY_AFHDS2A: 14 channels
10,// MODULE_TYPE_FLYSKY_AFHDS3: 18 channels
4, // MODULE_TYPE_LEMON_DSMP: 12 channels for DSMX
};
@@ -484,8 +482,6 @@ inline int8_t maxModuleChannels_M8(uint8_t moduleIdx)
} else {
return 8; // always 16 channels in FCC / FLEX
}
} else if (isModuleAFHDS3(moduleIdx)) {
return 10;
} else if (isModuleMultimoduleDSM2(moduleIdx)) {
return 4; // 12 channels
} else if (isModuleDSMP(moduleIdx) &&
@@ -641,7 +637,7 @@ inline bool isModuleBindRangeAvailable(uint8_t moduleIdx)
inline uint32_t getNV14RfFwVersion()
{
#if defined(PCBNV14)
#if defined(PCBNV14) && defined(AFHDS2)
return NV14internalModuleFwVersion;
#else
return 0;
@@ -651,11 +647,11 @@ inline uint32_t getNV14RfFwVersion()
inline bool isModuleRangeAvailable(uint8_t moduleIdx)
{
bool ret = isModuleBindRangeAvailable(moduleIdx) && !IS_RX_MULTI(moduleIdx);
#if defined(PCBNV14)
#if defined(PCBNV14) && defined(AFHDS2)
ret = ret &&
(!isModuleFlySky(moduleIdx) || NV14internalModuleFwVersion >= 0x1000E);
#else
ret = ret && (!isModuleFlySky(moduleIdx));
(!isModuleAFHDS2A(moduleIdx) || NV14internalModuleFwVersion >= 0x1000E);
#elif defined(AFHDS3)
ret = ret && (!isModuleAFHDS3(moduleIdx));
#endif
return ret;
}
@@ -805,21 +801,25 @@ inline void resetAccessAuthenticationCount()
globalData.authenticationCount = 0;
}
inline void resetAfhdsOptions(uint8_t moduleIdx)
inline void resetAfhds3Options(uint8_t moduleIdx)
{
#if defined(AFHDS3)
auto & data = g_model.moduleData[moduleIdx];
data.subType = FLYSKY_SUBTYPE_AFHDS3;
data.subType = 0;
data.afhds3.emi = 2; // FCC
data.afhds3.telemetry = 1;
data.afhds3.phyMode = 0;
#elif defined(AFHDS2)
auto & data = g_model.moduleData[moduleIdx];
data.subType = FLYSKY_SUBTYPE_AFHDS2A;
data.flysky.setDefault();
#endif
}
inline void resetAfhds2AOptions(uint8_t moduleIdx)
{
#if defined(AFHDS2)
auto & data = g_model.moduleData[moduleIdx];
data.subType = 0;
data.flysky.setDefault();
#endif
}
inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType)
{
@@ -831,8 +831,11 @@ inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType)
moduleData.sbus.refreshRate = -31;
else if (moduleData.type == MODULE_TYPE_PPM)
setDefaultPpmFrameLength(moduleIdx);
else if (moduleData.type == MODULE_TYPE_FLYSKY) {
resetAfhdsOptions(moduleIdx);
else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS2A) {
resetAfhds2AOptions(moduleIdx);
}
else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS3) {
resetAfhds3Options(moduleIdx);
}
else
resetAccessAuthenticationCount();
+9 -7
View File
@@ -329,13 +329,15 @@ uint8_t getRequiredProtocol(uint8_t module)
break;
#endif
#if defined(AFHDS3) || defined(AFHDS2)
case MODULE_TYPE_FLYSKY:
if (isModuleAFHDS3(module)) {
protocol = PROTOCOL_CHANNELS_AFHDS3;
} else if (isModuleAFHDS2A(module)) {
protocol = PROTOCOL_CHANNELS_AFHDS2A;
}
#if defined(AFHDS2)
case MODULE_TYPE_FLYSKY_AFHDS2A:
protocol = PROTOCOL_CHANNELS_AFHDS2A;
break;
#endif
#if defined(AFHDS3)
case MODULE_TYPE_FLYSKY_AFHDS3:
protocol = PROTOCOL_CHANNELS_AFHDS3;
break;
#endif
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -616,7 +617,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
@@ -531,9 +531,10 @@ static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs)
case MODULE_TYPE_R9M_LITE_PRO_PXX2:
case MODULE_TYPE_XJT_LITE_PXX2:
return 5;
case MODULE_TYPE_FLYSKY:
if (mod_data->subType == FLYSKY_SUBTYPE_AFHDS2A) return 6;
if (mod_data->subType == FLYSKY_SUBTYPE_AFHDS3) return 7;
case MODULE_TYPE_FLYSKY_AFHDS2A:
return 6;
case MODULE_TYPE_FLYSKY_AFHDS3:
return 7;
break;
case MODULE_TYPE_GHOST:
return 8;
@@ -1888,6 +1889,28 @@ static bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf,
return w_mixSrcRaw(nullptr, src, wf, opaque);
}
extern const struct YamlIdStr enum_ModuleType[];
static const struct YamlIdStr enum_old_ModuleType[] = {
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY" },
{ 0, NULL }
};
static uint32_t r_moduleType(const YamlNode* node, const char* val, uint8_t val_len)
{
uint32_t type = yaml_parse_enum(enum_ModuleType, val, val_len);
if (!type && val_len > 0) {
type = yaml_parse_enum(enum_old_ModuleType, val, val_len);
}
return type;
}
bool w_moduleType(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque)
{
const char* str = yaml_output_enum(val, enum_ModuleType);
return str ? wf(opaque, str, strlen(str)) : true;
}
static const struct YamlIdStr enum_XJT_Subtypes[] = {
{ MODULE_SUBTYPE_PXX1_ACCST_D16, "D16" },
{ MODULE_SUBTYPE_PXX1_ACCST_D8, "D8" },
@@ -1912,9 +1935,11 @@ static const struct YamlIdStr enum_R9M_Subtypes[] = {
{ 0, NULL }
};
enum ModuleSubtypeFlysky { FLYSKY_SUBTYPE_AFHDS3 = 0, FLYSKY_SUBTYPE_AFHDS2A };
static const struct YamlIdStr enum_FLYSKY_Subtypes[] = {
{ FLYSKY_SUBTYPE_AFHDS3, "AFHDS3" },
{ FLYSKY_SUBTYPE_AFHDS2A, "AFHDS2A" },
{ FLYSKY_SUBTYPE_AFHDS3, "AFHDS3" },
{ 0, NULL }
};
@@ -1944,8 +1969,11 @@ static void r_modSubtype(void* user, uint8_t* data, uint32_t bitoffs,
md->subType = yaml_parse_enum(enum_ISRM_Subtypes, val, val_len);
} else if (isModuleTypeR9MNonAccess(md->type)) {
md->subType = yaml_parse_enum(enum_R9M_Subtypes, val, val_len);
} else if (md->type == MODULE_TYPE_FLYSKY) {
md->subType = yaml_parse_enum(enum_FLYSKY_Subtypes, val, val_len);
} else if (md->type == MODULE_TYPE_FLYSKY_AFHDS2A) {
// Flysky sub-types have been converted into separate module types
auto sub_type = yaml_parse_enum(enum_FLYSKY_Subtypes, val, val_len);
if (sub_type == FLYSKY_SUBTYPE_AFHDS3)
md->type = MODULE_TYPE_FLYSKY_AFHDS3;
} else if (md->type == MODULE_TYPE_MULTIMODULE) {
#if defined(MULTIMODULE)
// Read type/subType by the book (see MPM documentation)
@@ -2002,8 +2030,6 @@ static bool w_modSubtype(void* user, uint8_t* data, uint32_t bitoffs,
str = yaml_output_enum(val, enum_ISRM_Subtypes);
} else if (md->type == MODULE_TYPE_R9M_PXX1 || md->type == MODULE_TYPE_R9M_LITE_PXX1) {
str = yaml_output_enum(val, enum_R9M_Subtypes);
} else if (md->type == MODULE_TYPE_FLYSKY) {
str = yaml_output_enum(val, enum_FLYSKY_Subtypes);
} else if (md->type == MODULE_TYPE_MULTIMODULE) {
#if defined(MULTIMODULE)
// Use type/subType by the book (see MPM documentation)
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -654,7 +655,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -614,7 +615,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -614,7 +615,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -661,7 +662,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -661,7 +662,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -617,7 +618,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -617,7 +618,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -614,7 +615,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
@@ -620,7 +621,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 8, enum_ModuleType),
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
+13 -8
View File
@@ -2,7 +2,6 @@ option(DISK_CACHE "Enable SD card disk cache" ON)
option(UNEXPECTED_SHUTDOWN "Enable the Unexpected Shutdown screen" ON)
option(STICKS_DEAD_ZONE "Enable sticks dead zone" YES)
option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" ON)
option(AFHDS2 "Support for AFHDS2" ON)
option(GHOST "Ghost TX Module" ON)
option(PXX1 "PXX1 protocol support" ON)
option(PXX2 "PXX2 protocol support" OFF)
@@ -39,13 +38,22 @@ set(RF_BAUD_RATE 921600 230400 115200 57600 38400 19200 9600 4800 2400 1200)
set(PCB_RF_BAUD 921600 CACHE STRING "INTERNAL_MODULE_BAUDRATE: ${RF_BAUD_RATE}")
set_property(CACHE PCB_RF_BAUD PROPERTY STRINGS ${RF_BAUD_RATE})
set(FLAVOUR nv14)
add_definitions(-DPCBNV14 -DPCBFLYSKY -DAFHDS2_BAUDRATE=${PCB_RF_BAUD})
add_definitions(-DBATTERY_CHARGE -DUSE_TRIMS_AS_BUTTONS)
# defines existing internal modules
set(INTERNAL_MODULES AFHDS2A;AFHDS3 CACHE STRING "Internal modules")
set(DEFAULT_INTERNAL_MODULE FLYSKY CACHE STRING "Default internal module")
if (PCBREV STREQUAL EL18)
set(FLAVOUR el18)
# defines existing internal modules
set(INTERNAL_MODULES AFHDS3 CACHE STRING "Internal modules")
set(DEFAULT_INTERNAL_MODULE FLYSKY_AFHDS3 CACHE STRING "Default internal module")
set(AFHDS3 ON)
else()
set(FLAVOUR nv14)
# defines existing internal modules
set(INTERNAL_MODULES AFHDS2A CACHE STRING "Internal modules")
set(DEFAULT_INTERNAL_MODULE FLYSKY_AFHDS2A CACHE STRING "Default internal module")
set(AFHDS2 ON)
endif()
set(BITMAPS_TARGET nv14_bitmaps)
set(FONTS_TARGET x12_fonts)
@@ -81,9 +89,6 @@ if(STICKS_DEAD_ZONE)
add_definitions(-DSTICK_DEAD_ZONE)
endif()
set(AFHDS2 ON)
set(AFHDS3 ON)
# VCP CLI
set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough")
set(CLI ON CACHE BOOL "Enable CLI")
+8 -2
View File
@@ -234,9 +234,15 @@ bool isBacklightEnabled();
#if !defined(SIMU)
void usbJoystickUpdate();
#endif
#define USB_NAME "FlySky NV14"
#define USB_MANUFACTURER 'F', 'l', 'y', 'S', 'k', 'y', ' ', ' ' /* 8 bytes */
#if (PCBREV == EL18)
#define USB_NAME "Flysky EL18"
#define USB_MANUFACTURER 'F', 'l', 'y', 's', 'k', 'y', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'E', 'L', '1', '8', ' ', ' ', ' ', ' ' /* 8 Bytes */
#else
#define USB_NAME "Flysky NV14"
#define USB_MANUFACTURER 'F', 'l', 'y', 's', 'k', 'y', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'N', 'V', '1', '4', ' ', ' ', ' ', ' ' /* 8 Bytes */
#endif
#if defined(__cplusplus) && !defined(SIMU)
}
+4 -5
View File
@@ -139,19 +139,18 @@ rxStatStruct *getRxStatLabels() {
rxStat.unit = STR_RXSTAT_UNIT_PERCENT;
break;
case MODULE_TYPE_FLYSKY:
#if defined (PCBNV14)
#if defined (PCBNV14) && defined(AFHDS2)
case MODULE_TYPE_FLYSKY_AFHDS2A:
extern uint32_t NV14internalModuleFwVersion;
if(moduleToUse == INTERNAL_MODULE) {
if(g_model.moduleData[INTERNAL_MODULE].subType == FLYSKY_SUBTYPE_AFHDS2A &&
NV14internalModuleFwVersion >= 0x1000E) {
if(NV14internalModuleFwVersion >= 0x1000E) {
rxStat.label = STR_RXSTAT_LABEL_SIGNAL;
rxStat.unit = STR_RXSTAT_UNIT_NOUNIT ;
}
}
#endif
break;
#endif
}
return &rxStat;
-1
View File
@@ -70,7 +70,6 @@ ISTR(USBMODES);
ISTR(JACK_MODES);
ISTR(VFAILSAFE);
ISTR(VTRAINERMODES);
ISTR(FLYSKY_PROTOCOLS);
ISTR(MODULE_PROTOCOLS);
ISTR(R9M_REGION);
ISTR(R9M_FCC_POWER_VALUES);
-1
View File
@@ -201,7 +201,6 @@ extern const char* const STR_ISRM_RF_PROTOCOLS[];
extern const char* const STR_R9M_PXX2_RF_PROTOCOLS[];
extern const char* const STR_PPM_PROTOCOLS[];
extern const char* const STR_DSM_PROTOCOLS[];
extern const char* const STR_FLYSKY_PROTOCOLS[];
extern const char* const STR_CRSF_BAUDRATE[];
extern const char* const STR_PPM_POL[];
extern const char* const STR_SBUS_INVERSION_VALUES[];
+2 -2
View File
@@ -65,10 +65,10 @@
"R9MLP ACCESS", \
"SBUS", \
"XJT Lite", \
"FLYSKY", \
"AFHDS2A", \
"AFHDS3", \
TR("Lemon DSMP","LemonRx DSMP")
#define TR_FLYSKY_PROTOCOLS "AFHDS3","AFHDS2A"
#define TR_XJT_ACCST_RF_PROTOCOLS "D16","D8","LR12"
#define TR_ISRM_RF_PROTOCOLS "ACCESS","D16","LR12"
+1 -1
View File
@@ -258,7 +258,7 @@ LEGACY_NAMES = [
"targets": {
"commando8",
"lr3pro",
"nv14",
"nv14", "el18",
"t8", "t12",
"tlite", "tlitef4", "tpro", "tprov2",
"tx12", "tx12mk2",
+8
View File
@@ -6,6 +6,14 @@ POT_CONFIG = {
"P2": {"default": "WITH_DETENT"},
"P3": {"default": "MULTIPOS_SWITCH"}
},
"el18": {
"P1": { "default": "WITHOUT_DETENT"},
"P2": { "default": "WITHOUT_DETENT"}
},
"nv14": {
"P1": { "default": "WITHOUT_DETENT"},
"P2": { "default": "WITHOUT_DETENT"}
},
"tpro": {
"P1": {"default": "WITH_DETENT"},
"P2": {"default": "WITH_DETENT"}
+10
View File
@@ -19,6 +19,16 @@ SWITCH_CONFIG = {
"SB": {"default": "3POS", "display": [1, 0]},
"SD": {"default": "2POS", "display": [1, 1]}
},
"el18": {
"SA": { "default": "2POS" },
"SB": { "default": "3POS" },
"SC": { "default": "3POS" },
"SD": { "default": "2POS" },
"SE": { "default": "2POS" },
"SF": { "default": "3POS" },
"SG": { "default": "3POS" },
"SH": { "default": "TOGGLE" }
},
"lr3pro": {
# left side
"SA": {"default": "3POS", "display": [0, 0]},
+5
View File
@@ -13,6 +13,11 @@ boards = {
"PCB": "NV14",
"DEFAULT_MODE": "1",
},
"EL18": {
"PCB": "NV14",
"PCBREV": "EL18",
"DEFAULT_MODE": "1",
},
}
translations = [
+3
View File
@@ -185,6 +185,9 @@ do
nv14)
BUILD_OPTIONS+="-DPCB=NV14"
;;
el18)
BUILD_OPTIONS+="-DPCB=NV14 -DPCBREV=EL18"
;;
commando8)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=COMMANDO8"
;;
+3
View File
@@ -145,6 +145,9 @@ do
nv14)
BUILD_OPTIONS+="-DPCB=NV14"
;;
el18)
BUILD_OPTIONS+="-DPCB=NV14 -DPCBREV=EL18"
;;
commando8)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=COMMANDO8"
;;