feat: add support for ExpressLRS optional arming method (#5641)

Co-authored-by: elecpower <elecpower@users.noreply.github.com>
This commit is contained in:
Michael
2024-11-22 21:32:40 +10:00
committed by GitHub
co-authored by elecpower
parent ebb5d39a14
commit 8fd3d50add
69 changed files with 654 additions and 38 deletions
@@ -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;
+32
View File
@@ -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;
}
+16 -1
View File
@@ -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();
};
+48 -9
View File
@@ -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);
+1 -1
View File
@@ -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();
+18 -1
View File
@@ -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">
+6
View File
@@ -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>
+7
View File
@@ -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,
+6 -2
View File
@@ -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);
+41
View File
@@ -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:
+25
View File
@@ -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);
+5
View File
@@ -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)
{
+1
View File
@@ -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);
+22 -5
View File
@@ -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
};
+11
View File
@@ -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;
}
+5 -2
View File
@@ -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]
+2 -2
View File
@@ -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
}
+2
View File
@@ -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;
+2
View File
@@ -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[];
+2
View File
@@ -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 "加载中..."
+2
View File
@@ -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í..."
+2
View File
@@ -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..."
+2
View File
@@ -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"
+2
View File
@@ -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..."
+2
View File
@@ -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..."
+2
View File
@@ -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..."
+2
View File
@@ -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..."
+2
View File
@@ -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 "...טוען"
+2
View File
@@ -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..."
+2
View File
@@ -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 "読み込み中..."
+2
View File
@@ -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..."
+2
View File
@@ -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..."
+2
View File
@@ -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..."
+2
View File
@@ -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 "Загрузка..."
+2
View File
@@ -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"
+2
View File
@@ -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 "加載中..."
+2
View File
@@ -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 "Завантаження..."