feat: add support for ExpressLRS optional arming method (#5641)
Co-authored-by: elecpower <elecpower@users.noreply.github.com>
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include "yaml_generalsettings.h"
|
||||
#include "eeprominterface.h"
|
||||
#include "rawsource.h"
|
||||
#include "yaml_rawswitch.h"
|
||||
#include "multiprotocols.h"
|
||||
|
||||
// type: TYPE_MULTIMODULE
|
||||
@@ -242,6 +243,8 @@ Node convert<ModuleData>::encode(const ModuleData& rhs)
|
||||
Node crsf;
|
||||
YamlTelemetryBaudrate br(&rhs.crsf.telemetryBaudrate);
|
||||
crsf["telemetryBaudrate"] = br.value;
|
||||
crsf["crsfArmingMode"] = rhs.crsf.crsfArmingMode;
|
||||
crsf["crsfArmingTrigger"] = rhs.crsf.crsfArmingTrigger;
|
||||
mod["crsf"] = crsf;
|
||||
} break;
|
||||
case PULSES_LEMON_DSMP: {
|
||||
@@ -399,6 +402,8 @@ bool convert<ModuleData>::decode(const Node& node, ModuleData& rhs)
|
||||
YamlTelemetryBaudrate telemetryBaudrate;
|
||||
crsf["telemetryBaudrate"] >> telemetryBaudrate.value;
|
||||
telemetryBaudrate.toCpn(&rhs.crsf.telemetryBaudrate, getCurrentFirmware()->getBoard());
|
||||
crsf["crsfArmingMode"] >> rhs.crsf.crsfArmingMode;
|
||||
crsf["crsfArmingTrigger"] >> rhs.crsf.crsfArmingTrigger;
|
||||
} else if (mod["dsmp"]) {
|
||||
Node dsmp = mod["dsmp"];
|
||||
dsmp["flags"] >> rhs.dsmp.flags;
|
||||
|
||||
@@ -770,3 +770,35 @@ AbstractStaticItemModel * ModuleData::afhds3EmiItemModel()
|
||||
mdl->loadItemList();
|
||||
return mdl;
|
||||
}
|
||||
|
||||
QString ModuleData::crsfArmingModeToString() const
|
||||
{
|
||||
return crsfArmingModeToString(crsf.crsfArmingMode);
|
||||
}
|
||||
|
||||
// static
|
||||
QString ModuleData::crsfArmingModeToString(int mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case CRSF_ARMING_MODE_CH5:
|
||||
return tr("CH5");
|
||||
case CRSF_ARMING_MODE_SWITCH:
|
||||
return tr("Switch");
|
||||
default:
|
||||
return CPN_STR_UNKNOWN_ITEM;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
AbstractStaticItemModel * ModuleData::crsfArmingModeItemModel()
|
||||
{
|
||||
AbstractStaticItemModel * mdl = new AbstractStaticItemModel();
|
||||
mdl->setName(AIM_MODULE_CRSFARMINGMODE);
|
||||
|
||||
for (int i = 0; i < CRSF_ARMING_MODE_COUNT; i++) {
|
||||
mdl->appendToItemList(crsfArmingModeToString(i), i);
|
||||
}
|
||||
|
||||
mdl->loadItemList();
|
||||
return mdl;
|
||||
}
|
||||
|
||||
@@ -23,9 +23,12 @@
|
||||
|
||||
#include "constants.h"
|
||||
#include "radio/src/MultiProtoDefs.h"
|
||||
#include "rawswitch.h"
|
||||
|
||||
#include <QtCore>
|
||||
|
||||
constexpr char AIM_MODULE_CRSFARMINGMODE[] {"moduledata.crsfArmingMode"};
|
||||
|
||||
class Firmware;
|
||||
class RadioDataConversionState;
|
||||
class AbstractStaticItemModel;
|
||||
@@ -114,6 +117,12 @@ class ModuleData {
|
||||
Q_DECLARE_TR_FUNCTIONS(ModuleData)
|
||||
|
||||
public:
|
||||
enum CrsfArmingMode {
|
||||
CRSF_ARMING_MODE_CH5,
|
||||
CRSF_ARMING_MODE_SWITCH,
|
||||
CRSF_ARMING_MODE_COUNT
|
||||
};
|
||||
|
||||
ModuleData()
|
||||
{
|
||||
clear();
|
||||
@@ -191,6 +200,8 @@ class ModuleData {
|
||||
|
||||
struct CRSF {
|
||||
unsigned int telemetryBaudrate;
|
||||
unsigned int crsfArmingMode;
|
||||
RawSwitch crsfArmingTrigger;
|
||||
} crsf;
|
||||
|
||||
struct Access {
|
||||
@@ -203,7 +214,7 @@ class ModuleData {
|
||||
unsigned int flags;
|
||||
} dsmp;
|
||||
|
||||
void clear() { memset(this, 0, sizeof(ModuleData)); }
|
||||
void clear() { memset(reinterpret_cast<void *>(this), 0, sizeof(ModuleData)); }
|
||||
void convert(RadioDataConversionState & cstate);
|
||||
bool isPxx2Module() const;
|
||||
bool supportRxNum() const;
|
||||
@@ -234,4 +245,8 @@ class ModuleData {
|
||||
static AbstractStaticItemModel * afhds2aMode2ItemModel();
|
||||
static AbstractStaticItemModel * afhds3PhyModeItemModel();
|
||||
static AbstractStaticItemModel * afhds3EmiItemModel();
|
||||
|
||||
QString crsfArmingModeToString() const;
|
||||
static QString crsfArmingModeToString(int mode);
|
||||
static AbstractStaticItemModel * crsfArmingModeItemModel();
|
||||
};
|
||||
|
||||
@@ -34,11 +34,13 @@
|
||||
|
||||
#include <QDir>
|
||||
|
||||
constexpr char FIM_TIMERSWITCH[] {"Timer Switch"};
|
||||
constexpr char FIM_THRSOURCE[] {"Throttle Source"};
|
||||
// constexpr char FIM_TRAINERMODE[] {"Trainer Mode"};
|
||||
constexpr char FIM_ANTENNAMODE[] {"Antenna Mode"};
|
||||
constexpr char FIM_HATSMODE[] {"Hats Mode"};
|
||||
constexpr char FIM_TIMERSWITCH[] {"Timer Switch"};
|
||||
constexpr char FIM_THRSOURCE[] {"Throttle Source"};
|
||||
// constexpr char FIM_TRAINERMODE[] {"Trainer Mode"};
|
||||
constexpr char FIM_ANTENNAMODE[] {"Antenna Mode"};
|
||||
constexpr char FIM_HATSMODE[] {"Hats Mode"};
|
||||
constexpr char FIM_CRSFARMSWITCH[] {"CRSF Arming Switch"};
|
||||
|
||||
|
||||
TimerPanel::TimerPanel(QWidget * parent, ModelData & model, TimerData & timer, GeneralSettings & generalSettings, Firmware * firmware,
|
||||
QWidget * prevFocus, FilteredItemModelFactory * panelFilteredModels, CompoundItemModelFactory * panelItemModels):
|
||||
@@ -230,11 +232,13 @@ void TimerPanel::onModeChanged(int index)
|
||||
#define MASK_CHANNELMAP (1<<20)
|
||||
#define MASK_MULTI_BAYANG_OPT (1<<21)
|
||||
#define MASK_AFHDS (1<<22)
|
||||
#define MASK_CSRF_ARMING_MODE (1<<23)
|
||||
#define MASK_CSRF_ARMING_TRIGGER (1<<24)
|
||||
|
||||
quint8 ModulePanel::failsafesValueDisplayType = ModulePanel::FAILSAFE_DISPLAY_PERCENT;
|
||||
|
||||
ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & module, GeneralSettings & generalSettings, Firmware * firmware, int moduleIdx,
|
||||
FilteredItemModelFactory * panelFilteredItemModels):
|
||||
FilteredItemModelFactory * panelFilteredItemModels, CompoundItemModelFactory * panelItemModels):
|
||||
ModelPanel(parent, model, generalSettings, firmware),
|
||||
module(module),
|
||||
moduleIdx(moduleIdx),
|
||||
@@ -310,6 +314,11 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul
|
||||
|
||||
ui->registrationId->setText(model.registrationId);
|
||||
|
||||
if (panelItemModels) {
|
||||
ui->crsfArmingMode->setModel(panelItemModels->getItemModel(AIM_MODULE_CRSFARMINGMODE));
|
||||
ui->crsfArmingTrigger->setModel(panelFilteredItemModels->getItemModel(FIM_CRSFARMSWITCH));
|
||||
}
|
||||
|
||||
setupFailsafes();
|
||||
|
||||
disableMouseScrolling();
|
||||
@@ -350,6 +359,21 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul
|
||||
emit modified();
|
||||
});
|
||||
|
||||
connect(ui->crsfArmingMode, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=] (int index)
|
||||
{
|
||||
this->module.crsf.crsfArmingMode = ui->crsfArmingMode->currentData().toInt();
|
||||
if (this->module.crsf.crsfArmingMode != ModuleData::CRSF_ARMING_MODE_SWITCH)
|
||||
this->module.crsf.crsfArmingTrigger = RawSwitch(SWITCH_TYPE_NONE);
|
||||
update();
|
||||
emit modified();
|
||||
});
|
||||
|
||||
connect(ui->crsfArmingTrigger, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=] (int index)
|
||||
{
|
||||
this->module.crsf.crsfArmingTrigger = RawSwitch(ui->crsfArmingTrigger->currentData().toInt());
|
||||
emit modified();
|
||||
});
|
||||
|
||||
lock = false;
|
||||
}
|
||||
|
||||
@@ -505,10 +529,15 @@ void ModulePanel::update()
|
||||
max_rx_num = 20;
|
||||
break;
|
||||
case PULSES_CROSSFIRE:
|
||||
mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_BAUDRATE;
|
||||
mask |= MASK_CHANNELS_RANGE | MASK_RX_NUMBER | MASK_BAUDRATE | MASK_CSRF_ARMING_MODE;
|
||||
module.channelsCount = 16;
|
||||
ui->telemetryBaudrate->setModel(ModuleData::telemetryBaudrateItemModel(protocol));
|
||||
ui->telemetryBaudrate->setField(module.crsf.telemetryBaudrate);
|
||||
ui->crsfArmingMode->setCurrentIndex(module.crsf.crsfArmingMode);
|
||||
if (module.crsf.crsfArmingMode == ModuleData::CRSF_ARMING_MODE_SWITCH) {
|
||||
mask |= MASK_CSRF_ARMING_TRIGGER;
|
||||
ui->crsfArmingTrigger->setCurrentIndex(ui->crsfArmingTrigger->findData(RawSwitch(module.crsf.crsfArmingTrigger).toValue()));
|
||||
}
|
||||
break;
|
||||
case PULSES_GHOST:
|
||||
mask |= MASK_CHANNELS_RANGE | MASK_GHOST | MASK_BAUDRATE;
|
||||
@@ -602,6 +631,9 @@ void ModulePanel::update()
|
||||
ui->channelsCount->setMaximum(module.getMaxChannelCount());
|
||||
ui->channelsCount->setValue(module.channelsCount);
|
||||
ui->channelsCount->setSingleStep(firmware->getCapability(HasPPMStart) ? 1 : 2);
|
||||
ui->label_crsfArmingMode->setVisible(mask & MASK_CSRF_ARMING_MODE);
|
||||
ui->crsfArmingMode->setVisible(mask & MASK_CSRF_ARMING_MODE);
|
||||
ui->crsfArmingTrigger->setVisible(mask & MASK_CSRF_ARMING_TRIGGER);
|
||||
|
||||
// PPM settings fields
|
||||
ui->label_ppmPolarity->setVisible(mask & MASK_SBUSPPM_FIELDS);
|
||||
@@ -1563,17 +1595,24 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge
|
||||
FIM_TIMERSWITCH);
|
||||
connectItemModelEvents(panelFilteredModels->getItemModel(FIM_TIMERSWITCH));
|
||||
|
||||
panelFilteredModels->registerItemModel(new FilteredItemModel(sharedItemModels->getItemModel(AbstractItemModel::IMID_RawSwitch),
|
||||
RawSwitch::SpecialFunctionsContext),
|
||||
FIM_CRSFARMSWITCH);
|
||||
connectItemModelEvents(panelFilteredModels->getItemModel(FIM_CRSFARMSWITCH));
|
||||
|
||||
panelFilteredModels->registerItemModel(new FilteredItemModel(sharedItemModels->getItemModel(AbstractItemModel::IMID_ThrSource)),
|
||||
FIM_THRSOURCE);
|
||||
connectItemModelEvents(panelFilteredModels->getItemModel(FIM_THRSOURCE));
|
||||
|
||||
panelFilteredModels->registerItemModel(new FilteredItemModel(GeneralSettings::hatsModeItemModel(false)), FIM_HATSMODE);
|
||||
|
||||
panelItemModels = new CompoundItemModelFactory(&generalSettings, &model);
|
||||
panelItemModels->registerItemModel(TimerData::countdownBeepItemModel());
|
||||
panelItemModels->registerItemModel(TimerData::countdownStartItemModel());
|
||||
panelItemModels->registerItemModel(TimerData::persistentItemModel());
|
||||
panelItemModels->registerItemModel(TimerData::modeItemModel());
|
||||
panelItemModels->registerItemModel(TimerData::showElapsedItemModel());
|
||||
panelFilteredModels->registerItemModel(new FilteredItemModel(GeneralSettings::hatsModeItemModel(false)), FIM_HATSMODE);
|
||||
panelItemModels->registerItemModel(ModuleData::crsfArmingModeItemModel());
|
||||
|
||||
Board::Type board = firmware->getBoard();
|
||||
|
||||
@@ -1807,7 +1846,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge
|
||||
}
|
||||
|
||||
for (int i = firmware->getCapability(NumFirstUsableModule); i < firmware->getCapability(NumModules); i++) {
|
||||
modules[i] = new ModulePanel(this, model, model.moduleData[i], generalSettings, firmware, i, panelFilteredModels);
|
||||
modules[i] = new ModulePanel(this, model, model.moduleData[i], generalSettings, firmware, i, panelFilteredModels, panelItemModels);
|
||||
ui->modulesLayout->addWidget(modules[i]);
|
||||
connect(modules[i], &ModulePanel::modified, this, &SetupPanel::modified);
|
||||
connect(modules[i], &ModulePanel::updateItemModels, this, &SetupPanel::onModuleUpdateItemModels);
|
||||
|
||||
@@ -76,7 +76,7 @@ class ModulePanel : public ModelPanel
|
||||
|
||||
public:
|
||||
ModulePanel(QWidget * parent, ModelData & model, ModuleData & module, GeneralSettings & generalSettings, Firmware * firmware, int moduleIdx,
|
||||
FilteredItemModelFactory * panelFilteredItemModels = nullptr);
|
||||
FilteredItemModelFactory * panelFilteredItemModels = nullptr, CompoundItemModelFactory * panelItemModels = nullptr);
|
||||
virtual ~ModulePanel();
|
||||
virtual void update();
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1075</width>
|
||||
<height>527</height>
|
||||
<height>543</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -429,6 +429,23 @@
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="15" column="0">
|
||||
<widget class="QLabel" name="label_crsfArmingMode">
|
||||
<property name="text">
|
||||
<string>Arm using</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="15" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_crsfarm">
|
||||
<item>
|
||||
<widget class="QComboBox" name="crsfArmingMode"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="crsfArmingTrigger"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
|
||||
@@ -234,6 +234,12 @@ QString ModelPrinter::printModule(int idx)
|
||||
if (module.protocol == PULSES_GHOST) {
|
||||
str << printLabelValue(tr("Raw 12 bits"), printBoolean(module.ghost.raw12bits, BOOLEAN_YN));
|
||||
}
|
||||
if (module.protocol == PULSES_CROSSFIRE) {
|
||||
str << printLabelValue(tr("Arming mode"), module.crsfArmingModeToString());
|
||||
if (module.crsf.crsfArmingMode == ModuleData::CRSF_ARMING_MODE_SWITCH) {
|
||||
str << printLabelValue(tr("Switch"), RawSwitch(module.crsf.crsfArmingTrigger).toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
result = str.join(" ");
|
||||
|
||||
@@ -10252,6 +10252,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation type="unfinished">Číslo přijímače</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>Arm mód</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10111,6 +10111,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>Modtager nummer.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>Aktiver m.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation>KA5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="482"/>
|
||||
<source>CH </source>
|
||||
|
||||
@@ -10233,6 +10233,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>Empfänger Nr.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>Armen via</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10031,6 +10031,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation type="unfinished">Arm using</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="596"/>
|
||||
<source>RF Output Power</source>
|
||||
|
||||
@@ -10291,6 +10291,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>Receptor Nº.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>Modo Arm.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10273,6 +10273,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>Vastaanotin No.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation type="unfinished">Arm using</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10301,6 +10301,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>Récepteur No.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>Mod. Arm.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10133,6 +10133,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation type="unfinished">Arm using</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation>ערוץ 5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="788"/>
|
||||
<source>Low power mode</source>
|
||||
|
||||
@@ -10278,6 +10278,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>Numero Ricev.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>Modo arm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10177,6 +10177,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>受信機 No.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>アーム ロック解除</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="596"/>
|
||||
<source>RF Output Power</source>
|
||||
|
||||
@@ -10138,6 +10138,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation type="unfinished">Arm using</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10271,6 +10271,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>Nr odbiornika.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation type="unfinished">Arm using</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation>KN5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10133,6 +10133,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>Armar via</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="788"/>
|
||||
<source>Low power mode</source>
|
||||
|
||||
@@ -10224,6 +10224,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>Номер приёмника</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>Arm режим</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10118,6 +10118,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>Mottagarnummer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>Aktivera m.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation>KA5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="482"/>
|
||||
<source>CH </source>
|
||||
|
||||
@@ -10361,6 +10361,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Receiver No.</source>
|
||||
<translation>接收机编号 [Receiver No.].</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>解锁类型</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1050"/>
|
||||
<source>Output type</source>
|
||||
|
||||
@@ -10371,6 +10371,21 @@ p, li { white-space: pre-wrap; }
|
||||
<source>Open Drain</source>
|
||||
<translation>開漏輸出 [Open Drain]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Arm using</source>
|
||||
<translation>解鎖類型</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>CH5</source>
|
||||
<translation type="unfinished">CH5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="507"/>
|
||||
<source>Switch</source>
|
||||
<translation type="unfinished">Switch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../modeledit/setup_module.ui" line="1072"/>
|
||||
<source>Push Pull</source>
|
||||
|
||||
@@ -189,6 +189,13 @@ enum ModuleIndex {
|
||||
SPORT_MODULE = MAX_MODULES
|
||||
};
|
||||
|
||||
enum ArmingMode {
|
||||
ARMING_MODE_FIRST = 0,
|
||||
ARMING_MODE_CH5 = ARMING_MODE_FIRST,
|
||||
ARMING_MODE_SWITCH = 1,
|
||||
ARMING_MODE_LAST = ARMING_MODE_SWITCH,
|
||||
};
|
||||
|
||||
enum TrainerMode {
|
||||
TRAINER_MODE_OFF,
|
||||
TRAINER_MODE_MASTER_TRAINER_JACK,
|
||||
|
||||
@@ -535,9 +535,13 @@ PACK(struct ModuleData {
|
||||
uint8_t telemetryBaudrate:3;
|
||||
uint8_t spare1:4 SKIP;
|
||||
} ghost);
|
||||
NOBACKUP(struct {
|
||||
NOBACKUP(PACK(struct {
|
||||
uint8_t telemetryBaudrate:3;
|
||||
} crsf);
|
||||
uint8_t crsfArmingMode:1;
|
||||
uint8_t spare2:4 SKIP;
|
||||
int16_t crsfArmingTrigger:10 CUST(r_swtchSrc,w_swtchSrc);
|
||||
int16_t spare3:6;
|
||||
}) crsf);
|
||||
NOBACKUP(struct {
|
||||
uint8_t flags;
|
||||
} dsmp);
|
||||
|
||||
@@ -119,6 +119,10 @@ enum MenuModelSetupItems {
|
||||
#if defined(CROSSFIRE) || defined(GHOST)
|
||||
ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE,
|
||||
ITEM_MODEL_SETUP_INTERNAL_MODULE_SERIALSTATUS,
|
||||
#if defined(CROSSFIRE)
|
||||
ITEM_MODEL_SETUP_INTERNAL_MODULE_ARMING_MODE,
|
||||
ITEM_MODEL_SETUP_INTERNAL_MODULE_ARMING_TRIGGER,
|
||||
#endif
|
||||
#endif
|
||||
#if defined(MULTIMODULE)
|
||||
ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL,
|
||||
@@ -155,6 +159,10 @@ enum MenuModelSetupItems {
|
||||
#if defined(CROSSFIRE) || defined(GHOST)
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE,
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_SERIALSTATUS,
|
||||
#if defined(CROSSFIRE)
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_MODE,
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_TRIGGER,
|
||||
#endif
|
||||
#endif
|
||||
#if defined(MULTIMODULE)
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL,
|
||||
@@ -268,9 +276,13 @@ static uint8_t VIEWOPT_ROW(uint8_t value) { return expandState.viewOpt ? value :
|
||||
#else
|
||||
#define IF_MODULE_BAUDRATE_ADJUST(module, xxx) (isModuleCrossfire(module) ? (uint8_t)(xxx) : HIDDEN_ROW)
|
||||
#endif
|
||||
#define IF_MODULE_ARMED(module, xxx) (CRSF_ELRS_MIN_VER(module, 4, 0) ? (uint8_t)(xxx) : HIDDEN_ROW)
|
||||
#define IF_MODULE_ARMED_TRIGGER(module, xxx) ((CRSF_ELRS_MIN_VER(module, 4, 0) && g_model.moduleData[module].crsf.crsfArmingMode) ? (uint8_t)(xxx) : HIDDEN_ROW)
|
||||
#else
|
||||
#define IF_MODULE_SYNCED(module, xxx)
|
||||
#define IF_MODULE_BAUDRATE_ADJUST(module, xxx)
|
||||
#define IF_MODULE_ARMED(module, xxx)
|
||||
#define IF_MODULE_ARMED_TRIGGER(module, xxx)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -471,6 +483,8 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event)
|
||||
LABEL(InternalModule), \
|
||||
MODULE_TYPE_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE */ \
|
||||
IF_MODULE_SYNCED(INTERNAL_MODULE, 0), /* Sync rate + errors */ \
|
||||
IF_MODULE_ARMED(INTERNAL_MODULE, 0), /* Arming Mode */ \
|
||||
IF_MODULE_ARMED_TRIGGER(INTERNAL_MODULE, 0),/* Arming Trigger */ \
|
||||
MULTIMODULE_TYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL */ \
|
||||
MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \
|
||||
MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \
|
||||
@@ -498,6 +512,8 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event)
|
||||
MODULE_TYPE_ROWS(EXTERNAL_MODULE), \
|
||||
IF_MODULE_BAUDRATE_ADJUST(EXTERNAL_MODULE, 0), /* Baudrate */ \
|
||||
IF_MODULE_SYNCED(EXTERNAL_MODULE, 0), /* Sync rate + errors */ \
|
||||
IF_MODULE_ARMED(EXTERNAL_MODULE, 0), /* Arming Mode */ \
|
||||
IF_MODULE_ARMED_TRIGGER(EXTERNAL_MODULE, 0), /* Arming TRIGGER */ \
|
||||
MULTIMODULE_TYPE_ROWS(EXTERNAL_MODULE) /* PROTOCOL */ \
|
||||
MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) /* SUBTYPE */ \
|
||||
MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) \
|
||||
@@ -1410,6 +1426,31 @@ void menuModelSetup(event_t event)
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(CROSSFIRE)
|
||||
#if defined(HARDWARE_INTERNAL_MODULE)
|
||||
case ITEM_MODEL_SETUP_INTERNAL_MODULE_ARMING_MODE:
|
||||
#endif
|
||||
#if defined(HARDWARE_EXTERNAL_MODULE)
|
||||
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_MODE:
|
||||
#endif
|
||||
g_model.moduleData[moduleIdx].crsf.crsfArmingMode =
|
||||
editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_CRSF_ARMING_MODE, STR_CRSF_ARMING_MODES,
|
||||
g_model.moduleData[moduleIdx].crsf.crsfArmingMode, ARMING_MODE_FIRST, ARMING_MODE_LAST, attr, event, INDENT_WIDTH);
|
||||
break;
|
||||
|
||||
#if defined(HARDWARE_INTERNAL_MODULE)
|
||||
case ITEM_MODEL_SETUP_INTERNAL_MODULE_ARMING_TRIGGER:
|
||||
#endif
|
||||
#if defined(HARDWARE_EXTERNAL_MODULE)
|
||||
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_TRIGGER:
|
||||
#endif
|
||||
lcdDrawTextIndented(y, STR_SWITCH);
|
||||
drawSwitch(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].crsf.crsfArmingTrigger, attr);
|
||||
if(attr)
|
||||
CHECK_INCDEC_SWITCH(event, g_model.moduleData[moduleIdx].crsf.crsfArmingTrigger, SWSRC_FIRST, SWSRC_LAST, EE_MODEL, isSwitchAvailableForArming);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
#if defined(HARDWARE_INTERNAL_MODULE)
|
||||
case ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL:
|
||||
|
||||
@@ -125,6 +125,10 @@ enum MenuModelSetupItems {
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE,
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_SERIALSTATUS,
|
||||
#endif
|
||||
#if defined(CROSSFIRE)
|
||||
ITEM_MODEL_SETUP_ARMING_MODE,
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_TRIGGER,
|
||||
#endif
|
||||
#if defined (MULTIMODULE)
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL,
|
||||
ITEM_MODEL_SETUP_EXTERNAL_MODULE_DSM_CLONED,
|
||||
@@ -420,9 +424,13 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW()
|
||||
#else
|
||||
#define IF_MODULE_BAUDRATE_ADJUST(module, xxx) (isModuleCrossfire(module) ? (uint8_t)(xxx) : HIDDEN_ROW)
|
||||
#endif
|
||||
#define IF_MODULE_ARMED(module, xxx) (CRSF_ELRS_MIN_VER(module, 4, 0) ? (uint8_t)(xxx) : HIDDEN_ROW)
|
||||
#define IF_MODULE_ARMED_TRIGGER(module, xxx) ((CRSF_ELRS_MIN_VER(module, 4, 0) && g_model.moduleData[module].crsf.crsfArmingMode) ? (uint8_t)(xxx) : HIDDEN_ROW)
|
||||
#else
|
||||
#define IF_MODULE_SYNCED(module, xxx)
|
||||
#define IF_MODULE_BAUDRATE_ADJUST(module, xxx)
|
||||
#define IF_MODULE_ARMED(module, xxx)
|
||||
#define IF_MODULE_ARMED_TRIGGER(module, xxx)
|
||||
#endif
|
||||
|
||||
#if defined(PXX2)
|
||||
@@ -546,6 +554,8 @@ void menuModelSetup(event_t event)
|
||||
EXTERNAL_MODULE_TYPE_ROW(), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE
|
||||
IF_MODULE_BAUDRATE_ADJUST(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_BAUDRATE
|
||||
IF_MODULE_SYNCED(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_SERIALSTATUS
|
||||
IF_MODULE_ARMED(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_ARMING_MODE
|
||||
IF_MODULE_ARMED_TRIGGER(EXTERNAL_MODULE, 0), // ITEM_MODEL_SETUP_ARMING_TRIGGER
|
||||
MULTIMODULE_TYPE_ROW(EXTERNAL_MODULE) // ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL
|
||||
MULTIMODULE_DSM_CLONED_RAW(EXTERNAL_MODULE), // ITEM_MODEL_SETUP_EXTERNAL_MODULE_DSM_CLONED
|
||||
MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) // ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS + ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS
|
||||
@@ -1266,6 +1276,21 @@ void menuModelSetup(event_t event)
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(CROSSFIRE)
|
||||
case ITEM_MODEL_SETUP_ARMING_MODE:
|
||||
g_model.moduleData[EXTERNAL_MODULE].crsf.crsfArmingMode =
|
||||
editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_CRSF_ARMING_MODE, STR_CRSF_ARMING_MODES,
|
||||
g_model.moduleData[EXTERNAL_MODULE].crsf.crsfArmingMode, ARMING_MODE_FIRST, ARMING_MODE_LAST, attr, event, INDENT_WIDTH);
|
||||
break;
|
||||
|
||||
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_ARMING_TRIGGER:
|
||||
lcdDrawTextIndented(y, STR_SWITCH);
|
||||
drawSwitch(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].crsf.crsfArmingTrigger, attr);
|
||||
if(attr)
|
||||
CHECK_INCDEC_SWITCH(event, g_model.moduleData[EXTERNAL_MODULE].crsf.crsfArmingTrigger, SWSRC_FIRST, SWSRC_LAST, EE_MODEL, isSwitchAvailableForArming);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL:
|
||||
{
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
CrossfireSettings::CrossfireSettings(Window* parent, const FlexGridLayout& g,
|
||||
uint8_t moduleIdx) :
|
||||
Window(parent, rect_t{}), md(&g_model.moduleData[moduleIdx])
|
||||
Window(parent, rect_t{}), md(&g_model.moduleData[moduleIdx]), moduleIdx(moduleIdx)
|
||||
{
|
||||
FlexGridLayout grid(g);
|
||||
setFlexLayout();
|
||||
@@ -66,4 +66,39 @@ CrossfireSettings::CrossfireSettings(Window* parent, const FlexGridLayout& g,
|
||||
sprintf(msg, "%d Hz", 1000000 / getMixerSchedulerPeriod());
|
||||
return std::string(msg);
|
||||
});
|
||||
|
||||
moduleIdx = moduleIdx;
|
||||
|
||||
auto armingLine = newLine(grid);
|
||||
lblArmMode = new StaticText(armingLine, rect_t{}, STR_CRSF_ARMING_MODE);
|
||||
auto box = new Window(armingLine, rect_t{});
|
||||
box->padAll(PAD_TINY);
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW, PAD_SMALL);
|
||||
choArmMode = new Choice(box, rect_t{}, STR_CRSF_ARMING_MODES, 0, 1, GET_SET_DEFAULT(md->crsf.crsfArmingMode));
|
||||
choArmSwitch = new SwitchChoice(box, rect_t{}, SWSRC_FIRST, SWSRC_LAST, GET_SET_DEFAULT(md->crsf.crsfArmingTrigger));
|
||||
choArmSwitch->setAvailableHandler([=](int sw) { return isSwitchAvailableForArming(sw); });
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void CrossfireSettings::update() {
|
||||
if(CRSF_ELRS_MIN_VER(moduleIdx, 4, 0)) {
|
||||
lblArmMode->show();
|
||||
choArmMode->show();
|
||||
|
||||
if(md->crsf.crsfArmingMode == ARMING_MODE_SWITCH)
|
||||
choArmSwitch->show();
|
||||
else
|
||||
choArmSwitch->hide();
|
||||
} else {
|
||||
lblArmMode->hide();
|
||||
choArmMode->hide();
|
||||
choArmSwitch->hide();
|
||||
}
|
||||
}
|
||||
|
||||
void CrossfireSettings::checkEvents() {
|
||||
update();
|
||||
|
||||
Window::checkEvents();
|
||||
}
|
||||
|
||||
@@ -23,14 +23,20 @@
|
||||
|
||||
#include "window.h"
|
||||
#include "module_setup.h"
|
||||
#include "switchchoice.h"
|
||||
|
||||
struct ModuleData;
|
||||
|
||||
class CrossfireSettings : public Window, public ModuleOptions
|
||||
{
|
||||
ModuleData* md;
|
||||
StaticText *lblArmMode;
|
||||
Choice *choArmMode;
|
||||
SwitchChoice *choArmSwitch;
|
||||
uint8_t moduleIdx;
|
||||
|
||||
void update() override {}
|
||||
void checkEvents() override;
|
||||
void update() override;
|
||||
|
||||
public:
|
||||
CrossfireSettings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx);
|
||||
|
||||
@@ -536,6 +536,11 @@ bool isSwitchAvailableInMixes(int swtch)
|
||||
return isSwitchAvailable(swtch, MixesContext);
|
||||
}
|
||||
|
||||
bool isSwitchAvailableForArming(int swtch)
|
||||
{
|
||||
return isSwitchAvailable(swtch, ModelCustomFunctionsContext);
|
||||
}
|
||||
|
||||
#if defined(COLORLCD)
|
||||
bool isSwitch2POSWarningStateAvailable(int state)
|
||||
{
|
||||
|
||||
@@ -72,6 +72,7 @@ bool isSwitchAvailable(int swtch, SwitchContext context);
|
||||
bool isSerialModeAvailable(uint8_t port_nr, int mode);
|
||||
bool isSwitchAvailableInLogicalSwitches(int swtch);
|
||||
bool isSwitchAvailableInCustomFunctions(int swtch);
|
||||
bool isSwitchAvailableForArming(int swtch);
|
||||
bool isSwitchAvailableInMixes(int swtch);
|
||||
bool isPxx2IsrmChannelsCountAllowed(int channels);
|
||||
bool isModuleUsingSport(uint8_t moduleBay, uint8_t moduleType);
|
||||
|
||||
@@ -93,11 +93,21 @@ uint8_t createCrossfireModelIDFrame(uint8_t moduleIdx, uint8_t * frame)
|
||||
}
|
||||
|
||||
// Range for pulses (channels output) is [-1024:+1024]
|
||||
uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses)
|
||||
uint8_t createCrossfireChannelsFrame(uint8_t moduleIdx, uint8_t * frame, int16_t * pulses)
|
||||
{
|
||||
//
|
||||
// sends channel data and also communicates commanded armed status in arming mode Switch.
|
||||
// frame len 24 -> arming mode CH5: module will use channel 5
|
||||
// frame len 25 -> arming mode Switch: send commanded armed status in extra byte after channel data
|
||||
//
|
||||
ModuleData *md = &g_model.moduleData[moduleIdx];
|
||||
|
||||
uint8_t armingMode = md->crsf.crsfArmingMode; // 0 = Channel mode, 1 = Switch mode
|
||||
uint8_t lenAdjust = (armingMode == ARMING_MODE_SWITCH) ? 1 : 0;
|
||||
|
||||
uint8_t * buf = frame;
|
||||
*buf++ = MODULE_ADDRESS;
|
||||
*buf++ = 24; // 1(ID) + 22 + 1(CRC)
|
||||
*buf++ = 24 + lenAdjust; // 1(ID) + 22(channel data) + (+1 extra byte if Switch mode) + 1(CRC)
|
||||
uint8_t * crc_start = buf;
|
||||
*buf++ = CHANNELS_ID;
|
||||
uint32_t bits = 0;
|
||||
@@ -112,7 +122,14 @@ uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses)
|
||||
bitsavailable -= 8;
|
||||
}
|
||||
}
|
||||
*buf++ = crc8(crc_start, 23);
|
||||
|
||||
if (armingMode == ARMING_MODE_SWITCH) {
|
||||
swsrc_t sw = md->crsf.crsfArmingTrigger;
|
||||
|
||||
*buf++ = (sw != SWSRC_NONE) && getSwitch(sw, 0); // commanded armed status in Switch mode
|
||||
}
|
||||
|
||||
*buf++ = crc8(crc_start, 23 + lenAdjust);
|
||||
return buf - frame;
|
||||
}
|
||||
|
||||
@@ -152,12 +169,12 @@ static void setupPulsesCrossfire(uint8_t module, uint8_t*& p_buf,
|
||||
if(moduleAlive[module] == false) { // if the module was dead and came back to live, e.g. reset
|
||||
moduleAlive[module] = true; // declare the module as alive
|
||||
moduleState[module].counter = CRSF_FRAME_MODELID; // and send it the modelID again
|
||||
TRACE("[XF] sending ModelID after module reset");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (moduleState[module].counter == CRSF_FRAME_MODELID) {
|
||||
TRACE("[XF] ModelID %d", g_model.header.modelId[module]);
|
||||
p_buf += createCrossfireModelIDFrame(module, p_buf);
|
||||
moduleState[module].counter = CRSF_FRAME_MODELID_SENT;
|
||||
} else if (moduleState[module].counter == CRSF_FRAME_MODELID_SENT && crossfireModuleStatus[module].queryCompleted == false) {
|
||||
@@ -167,7 +184,7 @@ static void setupPulsesCrossfire(uint8_t module, uint8_t*& p_buf,
|
||||
moduleState[module].mode = MODULE_MODE_NORMAL;
|
||||
} else {
|
||||
/* TODO: nChannels */
|
||||
p_buf += createCrossfireChannelsFrame(p_buf, channels);
|
||||
p_buf += createCrossfireChannelsFrame(module, p_buf, channels);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -602,6 +602,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -618,7 +622,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -630,6 +630,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -646,7 +650,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -627,6 +627,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -643,7 +647,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -627,6 +627,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -643,7 +647,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -630,6 +630,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -646,7 +650,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -603,6 +603,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -619,7 +623,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -603,6 +603,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -619,7 +623,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -629,6 +629,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -645,7 +649,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -601,6 +601,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -617,7 +621,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -602,6 +602,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -618,7 +622,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -602,6 +602,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -618,7 +622,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -601,6 +601,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -617,7 +621,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -605,6 +605,10 @@ static const struct YamlNode struct_anonymous_11[] = {
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_12[] = {
|
||||
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
|
||||
YAML_UNSIGNED( "crsfArmingMode", 1 ),
|
||||
YAML_PADDING( 4 ),
|
||||
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
|
||||
YAML_PADDING( 6 ),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_anonymous_13[] = {
|
||||
@@ -621,7 +625,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
|
||||
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
|
||||
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
|
||||
YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
|
||||
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
|
||||
YAML_END
|
||||
};
|
||||
|
||||
@@ -270,6 +270,17 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer,
|
||||
crossfireModuleStatus[module].major = rxBuffer[14 + nameSize];
|
||||
crossfireModuleStatus[module].minor = rxBuffer[15 + nameSize];
|
||||
crossfireModuleStatus[module].revision = rxBuffer[16 + nameSize];
|
||||
|
||||
ModuleData *md = &g_model.moduleData[module];
|
||||
|
||||
if(!CRSF_ELRS_MIN_VER(module, 4, 0) &&
|
||||
(md->crsf.crsfArmingMode != ARMING_MODE_CH5 || md->crsf.crsfArmingMode != SWSRC_NONE)) {
|
||||
md->crsf.crsfArmingMode = ARMING_MODE_CH5;
|
||||
md->crsf.crsfArmingTrigger = SWSRC_NONE;
|
||||
|
||||
storageDirty(EE_MODEL);
|
||||
}
|
||||
|
||||
crossfireModuleStatus[module].queryCompleted = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -119,8 +119,6 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer,
|
||||
uint8_t rxBufferCount);
|
||||
void crossfireSetDefault(int index, uint8_t id, uint8_t subId);
|
||||
|
||||
uint8_t createCrossfireModelIDFrame(uint8_t* frame);
|
||||
|
||||
const uint32_t CROSSFIRE_BAUDRATES[] = {
|
||||
115200,
|
||||
400000,
|
||||
@@ -158,6 +156,11 @@ const uint8_t CROSSFIRE_FRAME_PERIODS[] = {
|
||||
% DIM(CROSSFIRE_BAUDRATES)
|
||||
#endif
|
||||
|
||||
#define CRSF_ELRS_MIN_VER(moduleIdx, maj, min) \
|
||||
(crossfireModuleStatus[moduleIdx].isELRS \
|
||||
&& crossfireModuleStatus[moduleIdx].major >= maj \
|
||||
&& crossfireModuleStatus[moduleIdx].minor >= min)
|
||||
|
||||
#if defined(HARDWARE_INTERNAL_MODULE)
|
||||
#define INT_CROSSFIRE_BR_IDX CROSSFIRE_STORE_TO_INDEX(g_eeGeneral.internalModuleBaudrate)
|
||||
#define INT_CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[INT_CROSSFIRE_BR_IDX]
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
#if defined(CROSSFIRE)
|
||||
|
||||
uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses);
|
||||
uint8_t createCrossfireChannelsFrame(uint8_t moduleIdx, uint8_t * frame, int16_t * pulses);
|
||||
TEST(Crossfire, createCrossfireChannelsFrame)
|
||||
{
|
||||
int16_t pulsesStart[MAX_TRAINER_CHANNELS];
|
||||
@@ -36,7 +36,7 @@ TEST(Crossfire, createCrossfireChannelsFrame)
|
||||
pulsesStart[i] = -1024 + (2048 / MAX_TRAINER_CHANNELS) * i;
|
||||
}
|
||||
|
||||
createCrossfireChannelsFrame(crossfire, pulsesStart);
|
||||
createCrossfireChannelsFrame(EXTERNAL_MODULE, crossfire, pulsesStart);
|
||||
|
||||
// TODO check
|
||||
}
|
||||
|
||||
@@ -80,6 +80,7 @@ ISTR(AFHDS3_POWERS);
|
||||
ISTR(FLYSKY_PULSE_PROTO);
|
||||
ISTR(FLYSKY_SERIAL_PROTO);
|
||||
ISTR(CURVE_TYPES);
|
||||
ISTR(CRSF_ARMING_MODES);
|
||||
ISTR(VSENSORTYPES);
|
||||
ISTR(VFORMULAS);
|
||||
ISTR(VPREC);
|
||||
@@ -538,6 +539,7 @@ const char STR_TEMP_CALIB[] = TR_TEMP_CALIB;
|
||||
const char STR_TIME[] = TR_TIME;
|
||||
const char STR_MAXBAUDRATE[] = TR_MAXBAUDRATE;
|
||||
const char STR_BAUDRATE[] = TR_BAUDRATE;
|
||||
const char STR_CRSF_ARMING_MODE[] = TR_CRSF_ARMING_MODE;
|
||||
const char STR_SAMPLE_MODE[] = TR_SAMPLE_MODE;
|
||||
const char STR_SD_INFO_TITLE[] = TR_SD_INFO_TITLE;
|
||||
const char STR_SD_SPEED[] = TR_SD_SPEED;
|
||||
|
||||
@@ -825,6 +825,8 @@ extern const char STR_TEMP_CALIB[];
|
||||
extern const char STR_TIME[];
|
||||
extern const char STR_MAXBAUDRATE[];
|
||||
extern const char STR_BAUDRATE[];
|
||||
extern const char STR_CRSF_ARMING_MODE[];
|
||||
extern const char* const STR_CRSF_ARMING_MODES[];
|
||||
extern const char STR_SAMPLE_MODE[];
|
||||
extern const char* const STR_SAMPLE_MODES[];
|
||||
extern const char STR_BLUETOOTH_BAUDRATE[];
|
||||
|
||||
@@ -710,6 +710,8 @@
|
||||
#define TR_TIME "时间"
|
||||
#define TR_MAXBAUDRATE "最大带宽"
|
||||
#define TR_BAUDRATE "波特率"
|
||||
#define TR_CRSF_ARMING_MODE "解锁类型"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE "采样模式"
|
||||
#define TR_SAMPLE_MODES "标准","OneBit"
|
||||
#define TR_LOADING "加载中..."
|
||||
|
||||
@@ -721,6 +721,8 @@
|
||||
#define TR_TIME "Čas"
|
||||
#define TR_MAXBAUDRATE "Max baudů"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE "Arm mód"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE "Vzorkovací režim"
|
||||
#define TR_SAMPLE_MODES "Normální","OneBit"
|
||||
#define TR_LOADING "Načítání..."
|
||||
|
||||
@@ -714,6 +714,8 @@
|
||||
#define TR_TIME "Tid"
|
||||
#define TR_MAXBAUDRATE "Max bauds"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE TR("Aktiver m.", "Aktiver med")
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE "Måle tilstand"
|
||||
#define TR_SAMPLE_MODES "Normal","EnBit"
|
||||
#define TR_LOADING "Indlæser..."
|
||||
|
||||
@@ -708,6 +708,8 @@
|
||||
#define TR_TEMP_CALIB "Temp. abgl."
|
||||
#define TR_TIME "Uhrzeit:"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE "Armen via"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_MAXBAUDRATE "Max Baud"
|
||||
#define TR_SAMPLE_MODE "Abtastmodus"
|
||||
#define TR_SAMPLE_MODES "Normal","OneBit"
|
||||
|
||||
@@ -712,6 +712,8 @@
|
||||
#define TR_TIME "Time"
|
||||
#define TR_MAXBAUDRATE "Max bauds"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE "Arm using"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE TR("Sampling","Sample Mode")
|
||||
#define TR_SAMPLE_MODES "Normal","OneBit"
|
||||
#define TR_LOADING "Loading..."
|
||||
|
||||
@@ -705,6 +705,8 @@
|
||||
#define TR_TIME "Hora"
|
||||
#define TR_MAXBAUDRATE "Máx bauds"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE TR("Modo Arm.", "Modo Armado")
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE "Modo de muestra"
|
||||
#define TR_SAMPLE_MODES "Normal","OneBit"
|
||||
#define TR_LOADING "Loading..."
|
||||
|
||||
@@ -719,6 +719,8 @@
|
||||
#define TR_TIME "Aika"
|
||||
#define TR_MAXBAUDRATE "Max bauds"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE "Arm using"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE TR("Sampling","Sample Mode")
|
||||
#define TR_SAMPLE_MODES "Normal","OneBit"
|
||||
#define TR_LOADING "Loading..."
|
||||
|
||||
@@ -710,6 +710,8 @@
|
||||
#define TR_TIME "Heure"
|
||||
#define TR_MAXBAUDRATE "Max bauds"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE TR("Mod. Arm.", "Mode d'armement")
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE "Mode"
|
||||
#define TR_SAMPLE_MODES "Normal","OneBit"
|
||||
#define TR_LOADING "Chargement..."
|
||||
|
||||
@@ -713,6 +713,8 @@
|
||||
#define TR_TIME "זמן"
|
||||
#define TR_MAXBAUDRATE "Max bauds"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE "Arm using"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE "Sample Mode"
|
||||
#define TR_SAMPLE_MODES "Normal","OneBit"
|
||||
#define TR_LOADING "...טוען"
|
||||
|
||||
@@ -708,6 +708,8 @@
|
||||
#define TR_TIME "Ora"
|
||||
#define TR_MAXBAUDRATE "Max Bauds"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE TR("Modo arm", "Modo d'armamento")
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE "Modo Semplice"
|
||||
#define TR_SAMPLE_MODES "Normale","OneBit"
|
||||
#define TR_LOADING "Caricamento..."
|
||||
|
||||
@@ -713,6 +713,8 @@
|
||||
#define TR_TIME "時間"
|
||||
#define TR_MAXBAUDRATE "最大ボーレート"
|
||||
#define TR_BAUDRATE "ボーレート"
|
||||
#define TR_CRSF_ARMING_MODE "アーム ロック解除"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE "サンプルモード"
|
||||
#define TR_SAMPLE_MODES "標準","OneBit"
|
||||
#define TR_LOADING "読み込み中..."
|
||||
|
||||
@@ -706,6 +706,8 @@
|
||||
#define TR_TIME "Tijd:"
|
||||
#define TR_MAXBAUDRATE "Max bauds"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE "Arm using"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE TR("Sampling","Sample Mode")
|
||||
#define TR_SAMPLE_MODES "Normal""OneBit"
|
||||
#define TR_LOADING "Loading..."
|
||||
|
||||
@@ -707,6 +707,8 @@
|
||||
#define TR_TIME "Czas"
|
||||
#define TR_MAXBAUDRATE "Max bauds"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE "Arm using"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE TR("Sampling","Sample Mode")
|
||||
#define TR_SAMPLE_MODES "Normal","OneBit"
|
||||
#define TR_LOADING "Ładowanie..."
|
||||
|
||||
@@ -717,6 +717,8 @@
|
||||
#define TR_TIME "Hora"
|
||||
#define TR_MAXBAUDRATE "Bauds Max"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE TR("Armar via", "Armar usando")
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE TR("Sampling","Sample Mode")
|
||||
#define TR_SAMPLE_MODES "Normal","OneBit"
|
||||
#define TR_LOADING "Carregando..."
|
||||
|
||||
@@ -716,6 +716,8 @@
|
||||
#define TR_TIME "Время"
|
||||
#define TR_MAXBAUDRATE "Макс скорость"
|
||||
#define TR_BAUDRATE "Скор пер"
|
||||
#define TR_CRSF_ARMING_MODE "Arm режим"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE TR("Реж выб","Реж выб")
|
||||
#define TR_SAMPLE_MODES "Обыч","Один бит"
|
||||
#define TR_LOADING "Загрузка..."
|
||||
|
||||
@@ -723,6 +723,8 @@
|
||||
#define TR_TEMP_CALIB "Temp. kalib."
|
||||
#define TR_TIME "Tid"
|
||||
#define TR_BAUDRATE "Baudrate"
|
||||
#define TR_CRSF_ARMING_MODE TR("Aktivera m.", "Aktivera med")
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_MAXBAUDRATE "Max bauds"
|
||||
#define TR_SAMPLE_MODE TR("Sampling","Sample Mode")
|
||||
#define TR_SAMPLE_MODES "Normal","OneBit"
|
||||
|
||||
@@ -715,6 +715,8 @@
|
||||
#define TR_TIME "時間"
|
||||
#define TR_MAXBAUDRATE "最大帶寬"
|
||||
#define TR_BAUDRATE "波特率"
|
||||
#define TR_CRSF_ARMING_MODE "解鎖類型"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE "採樣模式"
|
||||
#define TR_SAMPLE_MODES "標準","OneBit"
|
||||
#define TR_LOADING "加載中..."
|
||||
|
||||
@@ -716,6 +716,8 @@
|
||||
#define TR_TIME "Час"
|
||||
#define TR_MAXBAUDRATE "Max швидкість"
|
||||
#define TR_BAUDRATE "Швидкість"
|
||||
#define TR_CRSF_ARMING_MODE "Arm using"
|
||||
#define TR_CRSF_ARMING_MODES TR_CH"5", TR_SWITCH
|
||||
#define TR_SAMPLE_MODE TR("Вибірка","Режим вибірки")
|
||||
#define TR_SAMPLE_MODES "Нормальний","OneBit"
|
||||
#define TR_LOADING "Завантаження..."
|
||||
|
||||
Reference in New Issue
Block a user