chores(flysky): Separate AFHDS2A and AFHDS3 into 2 different module type (#3783)
* chores(flysky): separate AFHDS2A and AFHDS3 into 2 different module type This should allow to remove some of the hacks added earlier. * chore: Add some EL18 CI bits * fix(afhds): cmake defs * fix(ci): add el18 to commit-tests.sh * chore(cpn): separate AFHDS2A and AFHDS3 * chore(cpn): remove binary import of afhds and legacy fxFreq field for afhds3 * fix(cpn): limit available internal afhds protocols to those supported by hardware * chore(cpn): update Flysky int module test * fix(cpn): compile error * fix(cpn): afhds2a max channels * fix: TR_MODULE_PROTOCOLS * enh(cpn): more support for afhds2a and 3 * fix(cpn): rebase compile error * fix(cpn): bit indexes * fix(cpn): emi toString * fix(cpn): limit available internal afhds protocols to those supported by hardware * enh(cpn): add support for Flysky EL18 * fix(cpn): available protocols * fix(cpn): rebase moduledata * chore(cpn): add module fields to model print * Separate AFHDS2A and AFHDS3 UI settings. * Fix AFHDS3 conversion from old subtype value. Fix 'Channel Range' layout on portrait LCD. * Fix name. --------- Co-authored-by: Peter Feerick <peter.feerick@gmail.com> Co-authored-by: elecpower <neilh713@tpg.com.au> Co-authored-by: Phil Mitchell <phil.a.mitchell@gmail.com>
This commit is contained in:
co-authored by
Peter Feerick
elecpower
Phil Mitchell
parent
9515d29c9d
commit
c4f1e7127d
@@ -455,7 +455,7 @@ PACK(struct PpmModule {
|
||||
});
|
||||
|
||||
PACK(struct ModuleData {
|
||||
uint8_t type ENUM(ModuleType);
|
||||
uint8_t type ENUM(ModuleType) CUST(r_moduleType, w_moduleType);
|
||||
CUST_ATTR(subType,r_modSubtype,w_modSubtype);
|
||||
uint8_t channelsStart;
|
||||
int8_t channelsCount CUST(r_channelsCount,w_channelsCount); // 0=8 channels
|
||||
|
||||
@@ -138,11 +138,13 @@ if(CROSSFIRE)
|
||||
add_gui_src(crossfire_settings.cpp)
|
||||
endif()
|
||||
|
||||
if(AFHDS2 OR AFHDS3)
|
||||
add_gui_src(flysky_settings.cpp)
|
||||
if(AFHDS3)
|
||||
add_gui_src(afhds3_options.cpp)
|
||||
endif()
|
||||
if(AFHDS2)
|
||||
add_gui_src(afhds2a_settings.cpp)
|
||||
endif()
|
||||
|
||||
if(AFHDS3)
|
||||
add_gui_src(afhds3_settings.cpp)
|
||||
add_gui_src(afhds3_options.cpp)
|
||||
endif()
|
||||
|
||||
if(MULTIMODULE)
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Copyright (C) EdgeTX
|
||||
*
|
||||
* Based on code named
|
||||
* opentx - https://github.com/opentx/opentx
|
||||
* th9x - http://code.google.com/p/th9x
|
||||
* er9x - http://code.google.com/p/er9x
|
||||
* gruvin9x - http://code.google.com/p/gruvin9x
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "afhds2a_settings.h"
|
||||
#include "opentx.h"
|
||||
|
||||
#include "pulses/flysky.h"
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
class FSProtoOpts : public FormWindow
|
||||
{
|
||||
std::function<uint8_t()> _getMode;
|
||||
std::function<void(uint8_t)> _setMode;
|
||||
|
||||
public:
|
||||
FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
|
||||
std::function<void(uint8_t)> setMode);
|
||||
};
|
||||
|
||||
FSProtoOpts::FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
|
||||
std::function<void(uint8_t)> setMode) :
|
||||
FormWindow(parent, rect_t{}),
|
||||
_getMode(std::move(getMode)),
|
||||
_setMode(std::move(setMode))
|
||||
{
|
||||
setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
|
||||
// PPM / PWM
|
||||
new Choice(
|
||||
this, rect_t{}, STR_FLYSKY_PULSE_PROTO, 0, 1,
|
||||
[=]() -> int { return _getMode() >> 1; },
|
||||
[=](int v) {
|
||||
_setMode((_getMode() & 1) | ((v & 1) << 1));
|
||||
SET_DIRTY();
|
||||
});
|
||||
|
||||
// SBUS / iBUS
|
||||
new Choice(
|
||||
this, rect_t{}, STR_FLYSKY_SERIAL_PROTO, 0, 1,
|
||||
[=]() -> int { return _getMode() & 1; },
|
||||
[=](int v) {
|
||||
_setMode((_getMode() & 2) | (v & 1));
|
||||
SET_DIRTY();
|
||||
});
|
||||
}
|
||||
|
||||
AFHDS2ASettings::AFHDS2ASettings(Window* parent, const FlexGridLayout& g,
|
||||
uint8_t moduleIdx) :
|
||||
FormWindow(parent, rect_t{}),
|
||||
moduleIdx(moduleIdx),
|
||||
md(&g_model.moduleData[moduleIdx]),
|
||||
grid(g)
|
||||
{
|
||||
setFlexLayout();
|
||||
|
||||
FormWindow::Line* line;
|
||||
|
||||
// RX options:
|
||||
line = newLine(&grid);
|
||||
afhds2OptionsLabel = new StaticText(line, rect_t{}, STR_OPTIONS, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
afhds2ProtoOpts = new FSProtoOpts(
|
||||
line, [=]() { return md->flysky.mode; },
|
||||
[=](uint8_t v) { md->flysky.mode = v; });
|
||||
|
||||
#if defined(PCBNV14)
|
||||
if (getNV14RfFwVersion() >= 0x1000E) {
|
||||
line = newLine(&grid);
|
||||
static const char* _rf_power[] = {"Default", "High"};
|
||||
afhds2RFPowerText = new StaticText(line, rect_t{}, STR_MULTI_RFPOWER);
|
||||
afhds2RFPowerChoice = new Choice(line, rect_t{}, _rf_power, 0, 1,
|
||||
GET_DEFAULT(md->flysky.rfPower),
|
||||
[=](int32_t newValue) -> void {
|
||||
md->flysky.rfPower = newValue;
|
||||
resetPulsesAFHDS2();
|
||||
});
|
||||
#endif
|
||||
}
|
||||
|
||||
hideAFHDS2Options();
|
||||
}
|
||||
|
||||
void AFHDS2ASettings::hideAFHDS2Options()
|
||||
{
|
||||
lv_obj_add_flag(afhds2OptionsLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
lv_obj_add_flag(afhds2ProtoOpts->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
#if defined(PCBNV14)
|
||||
if (afhds2RFPowerText != nullptr)
|
||||
lv_obj_add_flag(afhds2RFPowerText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
if (afhds2RFPowerChoice != nullptr)
|
||||
lv_obj_add_flag(afhds2RFPowerChoice->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
#endif
|
||||
}
|
||||
|
||||
void AFHDS2ASettings::showAFHDS2Options()
|
||||
{
|
||||
lv_obj_clear_flag(afhds2OptionsLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
lv_obj_clear_flag(afhds2ProtoOpts->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
#if defined(PCBNV14)
|
||||
if (afhds2RFPowerText != nullptr)
|
||||
lv_obj_clear_flag(afhds2RFPowerText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
if (afhds2RFPowerChoice != nullptr)
|
||||
{
|
||||
lv_obj_clear_flag(afhds2RFPowerChoice->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
lv_event_send(afhds2RFPowerChoice->getLvObj(), LV_EVENT_VALUE_CHANGED, nullptr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void AFHDS2ASettings::checkEvents() {
|
||||
FormWindow::checkEvents();
|
||||
}
|
||||
|
||||
void AFHDS2ASettings::update()
|
||||
{
|
||||
lastRefresh = get_tmr10ms();
|
||||
if (isModuleAFHDS2A(moduleIdx)) {
|
||||
showAFHDS2Options();
|
||||
} else {
|
||||
hideAFHDS2Options();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (C) EdgeTX
|
||||
*
|
||||
* Based on code named
|
||||
* opentx - https://github.com/opentx/opentx
|
||||
* th9x - http://code.google.com/p/th9x
|
||||
* er9x - http://code.google.com/p/er9x
|
||||
* gruvin9x - http://code.google.com/p/gruvin9x
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "form.h"
|
||||
#include "choice.h"
|
||||
#include "module_setup.h"
|
||||
|
||||
struct ModuleData;
|
||||
|
||||
class AFHDS2ASettings : public FormWindow, public ModuleOptions
|
||||
{
|
||||
uint8_t moduleIdx;
|
||||
ModuleData* md;
|
||||
FlexGridLayout grid;
|
||||
tmr10ms_t lastRefresh = 0;
|
||||
|
||||
Window* afhds2OptionsLabel = nullptr;
|
||||
Window* afhds2ProtoOpts = nullptr;
|
||||
#if defined(PCBNV14)
|
||||
Window* afhds2RFPowerText = nullptr;
|
||||
Window* afhds2RFPowerChoice = nullptr;
|
||||
#endif
|
||||
void hideAFHDS2Options();
|
||||
void showAFHDS2Options();
|
||||
|
||||
void checkEvents() override;
|
||||
void update() override;
|
||||
|
||||
public:
|
||||
AFHDS2ASettings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx);
|
||||
};
|
||||
+11
-119
@@ -19,18 +19,9 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "flysky_settings.h"
|
||||
#include "opentx.h"
|
||||
|
||||
#if defined(AFHDS3)
|
||||
#include "afhds3_settings.h"
|
||||
#include "afhds3_options.h"
|
||||
#endif
|
||||
|
||||
#include "pulses/flysky.h"
|
||||
#include "pulses/afhds3.h"
|
||||
#include "pulses/afhds3_config.h"
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
#include "opentx.h"
|
||||
|
||||
static const char* _afhds3_region[] = { "CE", "FCC" };
|
||||
|
||||
@@ -44,44 +35,13 @@ static const char* _afhds3_phy_mode[] = {
|
||||
"Lora 12ch",
|
||||
};
|
||||
|
||||
class FSProtoOpts : public FormWindow
|
||||
{
|
||||
std::function<uint8_t()> _getMode;
|
||||
std::function<void(uint8_t)> _setMode;
|
||||
|
||||
public:
|
||||
FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
|
||||
std::function<void(uint8_t)> setMode);
|
||||
};
|
||||
#include "pulses/flysky.h"
|
||||
#include "pulses/afhds3.h"
|
||||
#include "pulses/afhds3_config.h"
|
||||
|
||||
FSProtoOpts::FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
|
||||
std::function<void(uint8_t)> setMode) :
|
||||
FormWindow(parent, rect_t{}),
|
||||
_getMode(std::move(getMode)),
|
||||
_setMode(std::move(setMode))
|
||||
{
|
||||
setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
// PPM / PWM
|
||||
new Choice(
|
||||
this, rect_t{}, STR_FLYSKY_PULSE_PROTO, 0, 1,
|
||||
[=]() -> int { return _getMode() >> 1; },
|
||||
[=](int v) {
|
||||
_setMode((_getMode() & 1) | ((v & 1) << 1));
|
||||
SET_DIRTY();
|
||||
});
|
||||
|
||||
// SBUS / iBUS
|
||||
new Choice(
|
||||
this, rect_t{}, STR_FLYSKY_SERIAL_PROTO, 0, 1,
|
||||
[=]() -> int { return _getMode() & 1; },
|
||||
[=](int v) {
|
||||
_setMode((_getMode() & 2) | (v & 1));
|
||||
SET_DIRTY();
|
||||
});
|
||||
}
|
||||
|
||||
FlySkySettings::FlySkySettings(Window* parent, const FlexGridLayout& g,
|
||||
AFHDS3Settings::AFHDS3Settings(Window* parent, const FlexGridLayout& g,
|
||||
uint8_t moduleIdx) :
|
||||
FormWindow(parent, rect_t{}),
|
||||
moduleIdx(moduleIdx),
|
||||
@@ -92,33 +52,6 @@ FlySkySettings::FlySkySettings(Window* parent, const FlexGridLayout& g,
|
||||
|
||||
FormWindow::Line* line;
|
||||
|
||||
#if defined(AFHDS2)
|
||||
// RX options:
|
||||
line = newLine(&grid);
|
||||
afhds2OptionsLabel = new StaticText(line, rect_t{}, STR_OPTIONS, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
afhds2ProtoOpts = new FSProtoOpts(
|
||||
line, [=]() { return md->flysky.mode; },
|
||||
[=](uint8_t v) { md->flysky.mode = v; });
|
||||
|
||||
#if defined(PCBNV14)
|
||||
if (getNV14RfFwVersion() >= 0x1000E) {
|
||||
line = newLine(&grid);
|
||||
static const char* _rf_power[] = {"Default", "High"};
|
||||
afhds2RFPowerText = new StaticText(line, rect_t{}, STR_MULTI_RFPOWER);
|
||||
afhds2RFPowerChoice = new Choice(line, rect_t{}, _rf_power, 0, 1,
|
||||
GET_DEFAULT(md->flysky.rfPower),
|
||||
[=](int32_t newValue) -> void {
|
||||
md->flysky.rfPower = newValue;
|
||||
resetPulsesAFHDS2();
|
||||
});
|
||||
#endif
|
||||
}
|
||||
|
||||
hideAFHDS2Options();
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS3)
|
||||
// Status
|
||||
line = newLine(&grid);
|
||||
afhds3StatusLabel = new StaticText(line, rect_t{}, STR_MODULE_STATUS, 0, COLOR_THEME_PRIMARY1);
|
||||
@@ -164,40 +97,9 @@ FlySkySettings::FlySkySettings(Window* parent, const FlexGridLayout& g,
|
||||
}
|
||||
|
||||
hideAFHDS3Options();
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(AFHDS2)
|
||||
void FlySkySettings::hideAFHDS2Options()
|
||||
{
|
||||
lv_obj_add_flag(afhds2OptionsLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
lv_obj_add_flag(afhds2ProtoOpts->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
#if defined(PCBNV14)
|
||||
if (afhds2RFPowerText != nullptr)
|
||||
lv_obj_add_flag(afhds2RFPowerText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
if (afhds2RFPowerChoice != nullptr)
|
||||
lv_obj_add_flag(afhds2RFPowerChoice->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
#endif
|
||||
}
|
||||
|
||||
void FlySkySettings::showAFHDS2Options()
|
||||
{
|
||||
lv_obj_clear_flag(afhds2OptionsLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
lv_obj_clear_flag(afhds2ProtoOpts->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
#if defined(PCBNV14)
|
||||
if (afhds2RFPowerText != nullptr)
|
||||
lv_obj_clear_flag(afhds2RFPowerText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
if (afhds2RFPowerChoice != nullptr)
|
||||
{
|
||||
lv_obj_clear_flag(afhds2RFPowerChoice->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
lv_event_send(afhds2RFPowerChoice->getLvObj(), LV_EVENT_VALUE_CHANGED, nullptr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS3)
|
||||
void FlySkySettings::hideAFHDS3Options()
|
||||
void AFHDS3Settings::hideAFHDS3Options()
|
||||
{
|
||||
lv_obj_add_flag(afhds3StatusLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
lv_obj_add_flag(afhds3StatusText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
@@ -205,7 +107,7 @@ void FlySkySettings::hideAFHDS3Options()
|
||||
lv_obj_add_flag(afhds3TypeForm->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
}
|
||||
|
||||
void FlySkySettings::showAFHDS3Options()
|
||||
void AFHDS3Settings::showAFHDS3Options()
|
||||
{
|
||||
lv_obj_clear_flag(afhds3StatusLabel->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
lv_obj_clear_flag(afhds3StatusText->getLvObj(), LV_OBJ_FLAG_HIDDEN);
|
||||
@@ -228,31 +130,21 @@ void FlySkySettings::showAFHDS3Options()
|
||||
lv_obj_clear_state(afhds3Emi->getLvObj(), LV_STATE_DISABLED);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void FlySkySettings::checkEvents() {
|
||||
void AFHDS3Settings::checkEvents() {
|
||||
if (afhds3::getConfig(moduleIdx)->others.lastUpdated > lastRefresh) {
|
||||
update();
|
||||
}
|
||||
FormWindow::checkEvents();
|
||||
}
|
||||
|
||||
void FlySkySettings::update()
|
||||
void AFHDS3Settings::update()
|
||||
{
|
||||
lastRefresh = get_tmr10ms();
|
||||
#if defined(AFHDS2)
|
||||
if (isModuleAFHDS2A(moduleIdx)) {
|
||||
showAFHDS2Options();
|
||||
} else {
|
||||
hideAFHDS2Options();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS3)
|
||||
if (isModuleAFHDS3(moduleIdx)) {
|
||||
showAFHDS3Options();
|
||||
} else {
|
||||
hideAFHDS3Options();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
+2
-15
@@ -27,25 +27,13 @@
|
||||
|
||||
struct ModuleData;
|
||||
|
||||
class FlySkySettings : public FormWindow, public ModuleOptions
|
||||
class AFHDS3Settings : public FormWindow, public ModuleOptions
|
||||
{
|
||||
uint8_t moduleIdx;
|
||||
ModuleData* md;
|
||||
FlexGridLayout grid;
|
||||
tmr10ms_t lastRefresh = 0;
|
||||
|
||||
#if defined(AFHDS2)
|
||||
Window* afhds2OptionsLabel = nullptr;
|
||||
Window* afhds2ProtoOpts = nullptr;
|
||||
#if defined(PCBNV14)
|
||||
Window* afhds2RFPowerText = nullptr;
|
||||
Window* afhds2RFPowerChoice = nullptr;
|
||||
#endif
|
||||
void hideAFHDS2Options();
|
||||
void showAFHDS2Options();
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS3)
|
||||
Window* afhds3StatusLabel = nullptr;
|
||||
Window* afhds3StatusText = nullptr;
|
||||
Window* afhds3TypeLabel = nullptr;
|
||||
@@ -55,11 +43,10 @@ class FlySkySettings : public FormWindow, public ModuleOptions
|
||||
Choice *afhds3RfPower = nullptr;
|
||||
void hideAFHDS3Options();
|
||||
void showAFHDS3Options();
|
||||
#endif
|
||||
|
||||
void checkEvents() override;
|
||||
void update() override;
|
||||
|
||||
public:
|
||||
FlySkySettings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx);
|
||||
AFHDS3Settings(Window* parent, const FlexGridLayout& g, uint8_t moduleIdx);
|
||||
};
|
||||
@@ -57,12 +57,18 @@ void ChannelRange::build()
|
||||
chStart = new NumberEdit(this, rect_t{}, 1, 1, GET_DEFAULT(1 + getChannelsStart()));
|
||||
chStart->setSetValueHandler([=](int newValue) { setStart(newValue); });
|
||||
chStart->setPrefix(STR_CH);
|
||||
#if LCD_H > LCD_W
|
||||
chStart->setWidth(LCD_W/3-10);
|
||||
#endif
|
||||
|
||||
chEnd = new NumberEdit(this, rect_t{}, 8, 8,
|
||||
GET_DEFAULT(getChannelsStart() + 8 + getChannelsCount()));
|
||||
|
||||
chEnd->setPrefix(STR_CH);
|
||||
chEnd->setSetValueHandler([=](int newValue) { setEnd(newValue); });
|
||||
#if LCD_H > LCD_W
|
||||
chEnd->setWidth(LCD_W/3-10);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ChannelRange::setStart(uint8_t newValue)
|
||||
|
||||
@@ -46,8 +46,12 @@
|
||||
#include "crossfire_settings.h"
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS2) || defined(AFHDS3)
|
||||
#include "flysky_settings.h"
|
||||
#if defined(AFHDS2)
|
||||
#include "afhds2a_settings.h"
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS3)
|
||||
#include "afhds3_settings.h"
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS2)
|
||||
@@ -213,9 +217,14 @@ void ModuleWindow::updateModule()
|
||||
modOpts = new CrossfireSettings(this, grid, moduleIdx);
|
||||
}
|
||||
#endif
|
||||
#if defined(AFHDS2) || defined(AFHDS3)
|
||||
else if (isModuleFlySky(moduleIdx)) {
|
||||
modOpts = new FlySkySettings(this, grid, moduleIdx);
|
||||
#if defined(AFHDS2)
|
||||
else if (isModuleAFHDS2A(moduleIdx)) {
|
||||
modOpts = new AFHDS2ASettings(this, grid, moduleIdx);
|
||||
}
|
||||
#endif
|
||||
#if defined(AFHDS3)
|
||||
else if (isModuleAFHDS3(moduleIdx)) {
|
||||
modOpts = new AFHDS3Settings(this, grid, moduleIdx);
|
||||
}
|
||||
#endif
|
||||
#if defined(MULTIMODULE)
|
||||
@@ -306,7 +315,7 @@ void ModuleWindow::updateModule()
|
||||
}
|
||||
#endif
|
||||
#if defined(AFHDS2)
|
||||
if (isModuleFlySky(moduleIdx)) resetPulsesAFHDS2();
|
||||
if (isModuleAFHDS2A(moduleIdx)) resetPulsesAFHDS2();
|
||||
#endif
|
||||
if (isModuleDSMP(moduleIdx)) restartModule(moduleIdx);
|
||||
return 0;
|
||||
@@ -325,7 +334,7 @@ void ModuleWindow::updateModule()
|
||||
#endif
|
||||
moduleState[moduleIdx].mode = MODULE_MODE_BIND;
|
||||
#if defined(AFHDS2)
|
||||
if (isModuleFlySky(moduleIdx)) {
|
||||
if (isModuleAFHDS2A(moduleIdx)) {
|
||||
resetPulsesAFHDS2();
|
||||
}
|
||||
#endif
|
||||
@@ -363,13 +372,13 @@ void ModuleWindow::updateModule()
|
||||
} else {
|
||||
moduleState[moduleIdx].mode = MODULE_MODE_RANGECHECK;
|
||||
#if defined(AFHDS2)
|
||||
if (isModuleFlySky(moduleIdx)) {
|
||||
if (isModuleAFHDS2A(moduleIdx)) {
|
||||
resetPulsesAFHDS2();
|
||||
}
|
||||
#endif
|
||||
startRSSIDialog([=]() {
|
||||
#if defined(AFHDS2)
|
||||
if (isModuleFlySky(moduleIdx)) {
|
||||
if (isModuleAFHDS2A(moduleIdx)) {
|
||||
resetPulsesAFHDS2();
|
||||
}
|
||||
#endif
|
||||
@@ -626,33 +635,6 @@ void ModuleSubTypeChoice::update()
|
||||
setTextHandler(nullptr);
|
||||
}
|
||||
#endif
|
||||
#if defined(AFHDS2) || defined(AFHDS3)
|
||||
else if (isModuleFlySky(moduleIdx)) {
|
||||
setMin(0);
|
||||
setMax(FLYSKY_SUBTYPE_AFHDS2A);
|
||||
setValues(STR_FLYSKY_PROTOCOLS);
|
||||
setGetValueHandler(GET_DEFAULT(md->subType));
|
||||
setSetValueHandler(SET_DEFAULT(md->subType));
|
||||
|
||||
#if defined(PCBNV14) && !defined(SIMU)
|
||||
if (moduleIdx == INTERNAL_MODULE) {
|
||||
if (hardwareOptions.pcbrev == PCBREV_NV14) {
|
||||
md->subType = FLYSKY_SUBTYPE_AFHDS2A;
|
||||
setAvailableHandler([](int v) { return v == FLYSKY_SUBTYPE_AFHDS2A; });
|
||||
} else {
|
||||
md->subType = FLYSKY_SUBTYPE_AFHDS3;
|
||||
setAvailableHandler([](int v) { return v == FLYSKY_SUBTYPE_AFHDS3; });
|
||||
}
|
||||
}
|
||||
#elif !defined(SIMU)
|
||||
md->subType = FLYSKY_SUBTYPE_AFHDS3;
|
||||
setAvailableHandler([](int v) { return v == FLYSKY_SUBTYPE_AFHDS3; });
|
||||
#else
|
||||
setAvailableHandler(nullptr);
|
||||
#endif
|
||||
setTextHandler(nullptr);
|
||||
}
|
||||
#endif
|
||||
#if defined(MULTIMODULE)
|
||||
else if (isModuleMultimodule(moduleIdx)) {
|
||||
setMin(0);
|
||||
|
||||
@@ -773,7 +773,8 @@ bool isModuleUsingSport(uint8_t moduleBay, uint8_t moduleType)
|
||||
case MODULE_TYPE_ISRM_PXX2:
|
||||
case MODULE_TYPE_R9M_LITE_PXX2:
|
||||
case MODULE_TYPE_R9M_LITE_PRO_PXX2:
|
||||
case MODULE_TYPE_FLYSKY:
|
||||
case MODULE_TYPE_FLYSKY_AFHDS2A:
|
||||
case MODULE_TYPE_FLYSKY_AFHDS3:
|
||||
return false;
|
||||
|
||||
case MODULE_TYPE_XJT_PXX1:
|
||||
@@ -823,8 +824,11 @@ bool isInternalModuleSupported(int moduleType)
|
||||
#if defined(INTERNAL_MODULE_PPM)
|
||||
case MODULE_TYPE_PPM: return true;
|
||||
#endif
|
||||
#if defined(INTERNAL_MODULE_AFHDS2A) || defined(INTERNAL_MODULE_AFHDS3)
|
||||
case MODULE_TYPE_FLYSKY: return true;
|
||||
#if defined(INTERNAL_MODULE_AFHDS2A)
|
||||
case MODULE_TYPE_FLYSKY_AFHDS2A: return true;
|
||||
#endif
|
||||
#if defined(INTERNAL_MODULE_AFHDS3)
|
||||
case MODULE_TYPE_FLYSKY_AFHDS3: return true;
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
@@ -963,7 +967,17 @@ bool isExternalModuleAvailable(int moduleType)
|
||||
#endif
|
||||
|
||||
#if !defined(AFHDS3)
|
||||
if (moduleType == MODULE_TYPE_FLYSKY)
|
||||
if (moduleType == MODULE_TYPE_FLYSKY_AFHDS3)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
#if !defined(AFHDS2)
|
||||
if (moduleType == MODULE_TYPE_FLYSKY_AFHDS2A)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
#if !defined(AFHDS3)
|
||||
if (moduleType == MODULE_TYPE_FLYSKY_AFHDS3)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -40,7 +40,8 @@ enum ModuleType {
|
||||
MODULE_TYPE_R9M_LITE_PRO_PXX2,
|
||||
MODULE_TYPE_SBUS,
|
||||
MODULE_TYPE_XJT_LITE_PXX2,
|
||||
MODULE_TYPE_FLYSKY,
|
||||
MODULE_TYPE_FLYSKY_AFHDS2A,
|
||||
MODULE_TYPE_FLYSKY_AFHDS3,
|
||||
MODULE_TYPE_LEMON_DSMP,
|
||||
MODULE_TYPE_COUNT SKIP,
|
||||
MODULE_TYPE_MAX SKIP = MODULE_TYPE_COUNT - 1
|
||||
@@ -132,11 +133,6 @@ enum ModuleSubtypeDSM2 {
|
||||
DSM2_PROTO_DSMX,
|
||||
};
|
||||
|
||||
enum ModuleSubtypeFlysky {
|
||||
FLYSKY_SUBTYPE_AFHDS3=0,
|
||||
FLYSKY_SUBTYPE_AFHDS2A
|
||||
};
|
||||
|
||||
enum FailsafeModes {
|
||||
FAILSAFE_NOT_SET,
|
||||
FAILSAFE_HOLD,
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#include "telemetry/multi.h"
|
||||
#endif
|
||||
|
||||
#if defined(PCBNV14)
|
||||
#if defined(PCBNV14) && defined(AFHDS2)
|
||||
extern uint32_t NV14internalModuleFwVersion;
|
||||
#endif
|
||||
|
||||
@@ -398,22 +398,19 @@ inline bool isModuleSBUS(uint8_t moduleIdx)
|
||||
return g_model.moduleData[moduleIdx].type == MODULE_TYPE_SBUS;
|
||||
}
|
||||
|
||||
inline bool isModuleFlySky(uint8_t idx)
|
||||
{
|
||||
return
|
||||
(g_model.moduleData[idx].type == MODULE_TYPE_FLYSKY);
|
||||
}
|
||||
|
||||
inline bool isModuleAFHDS2A(uint8_t idx)
|
||||
{
|
||||
return isModuleFlySky(idx)
|
||||
&& (g_model.moduleData[idx].subType == FLYSKY_SUBTYPE_AFHDS2A);
|
||||
return (g_model.moduleData[idx].type == MODULE_TYPE_FLYSKY_AFHDS2A);
|
||||
}
|
||||
|
||||
inline bool isModuleAFHDS3(uint8_t idx)
|
||||
{
|
||||
return isModuleFlySky(idx)
|
||||
&& (g_model.moduleData[idx].subType == FLYSKY_SUBTYPE_AFHDS3);
|
||||
return (g_model.moduleData[idx].type == MODULE_TYPE_FLYSKY_AFHDS3);
|
||||
}
|
||||
|
||||
inline bool isModuleFlySky(uint8_t idx)
|
||||
{
|
||||
return (isModuleAFHDS2A(idx) || isModuleAFHDS3(idx));
|
||||
}
|
||||
|
||||
inline bool isModuleDSMP(uint8_t idx)
|
||||
@@ -439,7 +436,8 @@ static const int8_t maxChannelsModules_M8[] = {
|
||||
0, // MODULE_TYPE_R9M_LITE_PRO_PXX2: index NOT USED
|
||||
8, // MODULE_TYPE_SBUS
|
||||
0, // MODULE_TYPE_XJT_LITE_PXX2: index NOT USED
|
||||
6, // MODULE_TYPE_FLYSKY: 14 channels for AFHDS2A, AFHDS3 special cased
|
||||
6, // MODULE_TYPE_FLYSKY_AFHDS2A: 14 channels
|
||||
10,// MODULE_TYPE_FLYSKY_AFHDS3: 18 channels
|
||||
4, // MODULE_TYPE_LEMON_DSMP: 12 channels for DSMX
|
||||
};
|
||||
|
||||
@@ -484,8 +482,6 @@ inline int8_t maxModuleChannels_M8(uint8_t moduleIdx)
|
||||
} else {
|
||||
return 8; // always 16 channels in FCC / FLEX
|
||||
}
|
||||
} else if (isModuleAFHDS3(moduleIdx)) {
|
||||
return 10;
|
||||
} else if (isModuleMultimoduleDSM2(moduleIdx)) {
|
||||
return 4; // 12 channels
|
||||
} else if (isModuleDSMP(moduleIdx) &&
|
||||
@@ -641,7 +637,7 @@ inline bool isModuleBindRangeAvailable(uint8_t moduleIdx)
|
||||
|
||||
inline uint32_t getNV14RfFwVersion()
|
||||
{
|
||||
#if defined(PCBNV14)
|
||||
#if defined(PCBNV14) && defined(AFHDS2)
|
||||
return NV14internalModuleFwVersion;
|
||||
#else
|
||||
return 0;
|
||||
@@ -651,11 +647,11 @@ inline uint32_t getNV14RfFwVersion()
|
||||
inline bool isModuleRangeAvailable(uint8_t moduleIdx)
|
||||
{
|
||||
bool ret = isModuleBindRangeAvailable(moduleIdx) && !IS_RX_MULTI(moduleIdx);
|
||||
#if defined(PCBNV14)
|
||||
#if defined(PCBNV14) && defined(AFHDS2)
|
||||
ret = ret &&
|
||||
(!isModuleFlySky(moduleIdx) || NV14internalModuleFwVersion >= 0x1000E);
|
||||
#else
|
||||
ret = ret && (!isModuleFlySky(moduleIdx));
|
||||
(!isModuleAFHDS2A(moduleIdx) || NV14internalModuleFwVersion >= 0x1000E);
|
||||
#elif defined(AFHDS3)
|
||||
ret = ret && (!isModuleAFHDS3(moduleIdx));
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
@@ -805,21 +801,25 @@ inline void resetAccessAuthenticationCount()
|
||||
globalData.authenticationCount = 0;
|
||||
}
|
||||
|
||||
inline void resetAfhdsOptions(uint8_t moduleIdx)
|
||||
inline void resetAfhds3Options(uint8_t moduleIdx)
|
||||
{
|
||||
#if defined(AFHDS3)
|
||||
auto & data = g_model.moduleData[moduleIdx];
|
||||
data.subType = FLYSKY_SUBTYPE_AFHDS3;
|
||||
data.subType = 0;
|
||||
data.afhds3.emi = 2; // FCC
|
||||
data.afhds3.telemetry = 1;
|
||||
data.afhds3.phyMode = 0;
|
||||
#elif defined(AFHDS2)
|
||||
auto & data = g_model.moduleData[moduleIdx];
|
||||
data.subType = FLYSKY_SUBTYPE_AFHDS2A;
|
||||
data.flysky.setDefault();
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void resetAfhds2AOptions(uint8_t moduleIdx)
|
||||
{
|
||||
#if defined(AFHDS2)
|
||||
auto & data = g_model.moduleData[moduleIdx];
|
||||
data.subType = 0;
|
||||
data.flysky.setDefault();
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType)
|
||||
{
|
||||
@@ -831,8 +831,11 @@ inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType)
|
||||
moduleData.sbus.refreshRate = -31;
|
||||
else if (moduleData.type == MODULE_TYPE_PPM)
|
||||
setDefaultPpmFrameLength(moduleIdx);
|
||||
else if (moduleData.type == MODULE_TYPE_FLYSKY) {
|
||||
resetAfhdsOptions(moduleIdx);
|
||||
else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS2A) {
|
||||
resetAfhds2AOptions(moduleIdx);
|
||||
}
|
||||
else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS3) {
|
||||
resetAfhds3Options(moduleIdx);
|
||||
}
|
||||
else
|
||||
resetAccessAuthenticationCount();
|
||||
|
||||
@@ -329,13 +329,15 @@ uint8_t getRequiredProtocol(uint8_t module)
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS3) || defined(AFHDS2)
|
||||
case MODULE_TYPE_FLYSKY:
|
||||
if (isModuleAFHDS3(module)) {
|
||||
protocol = PROTOCOL_CHANNELS_AFHDS3;
|
||||
} else if (isModuleAFHDS2A(module)) {
|
||||
protocol = PROTOCOL_CHANNELS_AFHDS2A;
|
||||
}
|
||||
#if defined(AFHDS2)
|
||||
case MODULE_TYPE_FLYSKY_AFHDS2A:
|
||||
protocol = PROTOCOL_CHANNELS_AFHDS2A;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS3)
|
||||
case MODULE_TYPE_FLYSKY_AFHDS3:
|
||||
protocol = PROTOCOL_CHANNELS_AFHDS3;
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -616,7 +617,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -531,9 +531,10 @@ static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs)
|
||||
case MODULE_TYPE_R9M_LITE_PRO_PXX2:
|
||||
case MODULE_TYPE_XJT_LITE_PXX2:
|
||||
return 5;
|
||||
case MODULE_TYPE_FLYSKY:
|
||||
if (mod_data->subType == FLYSKY_SUBTYPE_AFHDS2A) return 6;
|
||||
if (mod_data->subType == FLYSKY_SUBTYPE_AFHDS3) return 7;
|
||||
case MODULE_TYPE_FLYSKY_AFHDS2A:
|
||||
return 6;
|
||||
case MODULE_TYPE_FLYSKY_AFHDS3:
|
||||
return 7;
|
||||
break;
|
||||
case MODULE_TYPE_GHOST:
|
||||
return 8;
|
||||
@@ -1888,6 +1889,28 @@ static bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf,
|
||||
return w_mixSrcRaw(nullptr, src, wf, opaque);
|
||||
}
|
||||
|
||||
extern const struct YamlIdStr enum_ModuleType[];
|
||||
|
||||
static const struct YamlIdStr enum_old_ModuleType[] = {
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static uint32_t r_moduleType(const YamlNode* node, const char* val, uint8_t val_len)
|
||||
{
|
||||
uint32_t type = yaml_parse_enum(enum_ModuleType, val, val_len);
|
||||
if (!type && val_len > 0) {
|
||||
type = yaml_parse_enum(enum_old_ModuleType, val, val_len);
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
bool w_moduleType(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque)
|
||||
{
|
||||
const char* str = yaml_output_enum(val, enum_ModuleType);
|
||||
return str ? wf(opaque, str, strlen(str)) : true;
|
||||
}
|
||||
|
||||
static const struct YamlIdStr enum_XJT_Subtypes[] = {
|
||||
{ MODULE_SUBTYPE_PXX1_ACCST_D16, "D16" },
|
||||
{ MODULE_SUBTYPE_PXX1_ACCST_D8, "D8" },
|
||||
@@ -1912,9 +1935,11 @@ static const struct YamlIdStr enum_R9M_Subtypes[] = {
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
enum ModuleSubtypeFlysky { FLYSKY_SUBTYPE_AFHDS3 = 0, FLYSKY_SUBTYPE_AFHDS2A };
|
||||
|
||||
static const struct YamlIdStr enum_FLYSKY_Subtypes[] = {
|
||||
{ FLYSKY_SUBTYPE_AFHDS3, "AFHDS3" },
|
||||
{ FLYSKY_SUBTYPE_AFHDS2A, "AFHDS2A" },
|
||||
{ FLYSKY_SUBTYPE_AFHDS3, "AFHDS3" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -1944,8 +1969,11 @@ static void r_modSubtype(void* user, uint8_t* data, uint32_t bitoffs,
|
||||
md->subType = yaml_parse_enum(enum_ISRM_Subtypes, val, val_len);
|
||||
} else if (isModuleTypeR9MNonAccess(md->type)) {
|
||||
md->subType = yaml_parse_enum(enum_R9M_Subtypes, val, val_len);
|
||||
} else if (md->type == MODULE_TYPE_FLYSKY) {
|
||||
md->subType = yaml_parse_enum(enum_FLYSKY_Subtypes, val, val_len);
|
||||
} else if (md->type == MODULE_TYPE_FLYSKY_AFHDS2A) {
|
||||
// Flysky sub-types have been converted into separate module types
|
||||
auto sub_type = yaml_parse_enum(enum_FLYSKY_Subtypes, val, val_len);
|
||||
if (sub_type == FLYSKY_SUBTYPE_AFHDS3)
|
||||
md->type = MODULE_TYPE_FLYSKY_AFHDS3;
|
||||
} else if (md->type == MODULE_TYPE_MULTIMODULE) {
|
||||
#if defined(MULTIMODULE)
|
||||
// Read type/subType by the book (see MPM documentation)
|
||||
@@ -2002,8 +2030,6 @@ static bool w_modSubtype(void* user, uint8_t* data, uint32_t bitoffs,
|
||||
str = yaml_output_enum(val, enum_ISRM_Subtypes);
|
||||
} else if (md->type == MODULE_TYPE_R9M_PXX1 || md->type == MODULE_TYPE_R9M_LITE_PXX1) {
|
||||
str = yaml_output_enum(val, enum_R9M_Subtypes);
|
||||
} else if (md->type == MODULE_TYPE_FLYSKY) {
|
||||
str = yaml_output_enum(val, enum_FLYSKY_Subtypes);
|
||||
} else if (md->type == MODULE_TYPE_MULTIMODULE) {
|
||||
#if defined(MULTIMODULE)
|
||||
// Use type/subType by the book (see MPM documentation)
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -654,7 +655,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -614,7 +615,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -614,7 +615,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -661,7 +662,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -661,7 +662,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -617,7 +618,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -617,7 +618,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -614,7 +615,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -35,7 +35,8 @@ const struct YamlIdStr enum_ModuleType[] = {
|
||||
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
|
||||
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
|
||||
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
|
||||
{ MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
|
||||
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
|
||||
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -620,7 +621,7 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
|
||||
};
|
||||
static const struct YamlNode struct_ModuleData[] = {
|
||||
YAML_IDX,
|
||||
YAML_ENUM("type", 8, enum_ModuleType),
|
||||
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
|
||||
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
|
||||
YAML_UNSIGNED( "channelsStart", 8 ),
|
||||
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
|
||||
|
||||
@@ -2,7 +2,6 @@ option(DISK_CACHE "Enable SD card disk cache" ON)
|
||||
option(UNEXPECTED_SHUTDOWN "Enable the Unexpected Shutdown screen" ON)
|
||||
option(STICKS_DEAD_ZONE "Enable sticks dead zone" YES)
|
||||
option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" ON)
|
||||
option(AFHDS2 "Support for AFHDS2" ON)
|
||||
option(GHOST "Ghost TX Module" ON)
|
||||
option(PXX1 "PXX1 protocol support" ON)
|
||||
option(PXX2 "PXX2 protocol support" OFF)
|
||||
@@ -39,13 +38,22 @@ set(RF_BAUD_RATE 921600 230400 115200 57600 38400 19200 9600 4800 2400 1200)
|
||||
set(PCB_RF_BAUD 921600 CACHE STRING "INTERNAL_MODULE_BAUDRATE: ${RF_BAUD_RATE}")
|
||||
set_property(CACHE PCB_RF_BAUD PROPERTY STRINGS ${RF_BAUD_RATE})
|
||||
|
||||
set(FLAVOUR nv14)
|
||||
add_definitions(-DPCBNV14 -DPCBFLYSKY -DAFHDS2_BAUDRATE=${PCB_RF_BAUD})
|
||||
add_definitions(-DBATTERY_CHARGE -DUSE_TRIMS_AS_BUTTONS)
|
||||
|
||||
# defines existing internal modules
|
||||
set(INTERNAL_MODULES AFHDS2A;AFHDS3 CACHE STRING "Internal modules")
|
||||
set(DEFAULT_INTERNAL_MODULE FLYSKY CACHE STRING "Default internal module")
|
||||
if (PCBREV STREQUAL EL18)
|
||||
set(FLAVOUR el18)
|
||||
# defines existing internal modules
|
||||
set(INTERNAL_MODULES AFHDS3 CACHE STRING "Internal modules")
|
||||
set(DEFAULT_INTERNAL_MODULE FLYSKY_AFHDS3 CACHE STRING "Default internal module")
|
||||
set(AFHDS3 ON)
|
||||
else()
|
||||
set(FLAVOUR nv14)
|
||||
# defines existing internal modules
|
||||
set(INTERNAL_MODULES AFHDS2A CACHE STRING "Internal modules")
|
||||
set(DEFAULT_INTERNAL_MODULE FLYSKY_AFHDS2A CACHE STRING "Default internal module")
|
||||
set(AFHDS2 ON)
|
||||
endif()
|
||||
|
||||
set(BITMAPS_TARGET nv14_bitmaps)
|
||||
set(FONTS_TARGET x12_fonts)
|
||||
@@ -81,9 +89,6 @@ if(STICKS_DEAD_ZONE)
|
||||
add_definitions(-DSTICK_DEAD_ZONE)
|
||||
endif()
|
||||
|
||||
set(AFHDS2 ON)
|
||||
set(AFHDS3 ON)
|
||||
|
||||
# VCP CLI
|
||||
set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough")
|
||||
set(CLI ON CACHE BOOL "Enable CLI")
|
||||
|
||||
@@ -234,9 +234,15 @@ bool isBacklightEnabled();
|
||||
#if !defined(SIMU)
|
||||
void usbJoystickUpdate();
|
||||
#endif
|
||||
#define USB_NAME "FlySky NV14"
|
||||
#define USB_MANUFACTURER 'F', 'l', 'y', 'S', 'k', 'y', ' ', ' ' /* 8 bytes */
|
||||
#if (PCBREV == EL18)
|
||||
#define USB_NAME "Flysky EL18"
|
||||
#define USB_MANUFACTURER 'F', 'l', 'y', 's', 'k', 'y', ' ', ' ' /* 8 bytes */
|
||||
#define USB_PRODUCT 'E', 'L', '1', '8', ' ', ' ', ' ', ' ' /* 8 Bytes */
|
||||
#else
|
||||
#define USB_NAME "Flysky NV14"
|
||||
#define USB_MANUFACTURER 'F', 'l', 'y', 's', 'k', 'y', ' ', ' ' /* 8 bytes */
|
||||
#define USB_PRODUCT 'N', 'V', '1', '4', ' ', ' ', ' ', ' ' /* 8 Bytes */
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus) && !defined(SIMU)
|
||||
}
|
||||
|
||||
@@ -139,19 +139,18 @@ rxStatStruct *getRxStatLabels() {
|
||||
rxStat.unit = STR_RXSTAT_UNIT_PERCENT;
|
||||
break;
|
||||
|
||||
case MODULE_TYPE_FLYSKY:
|
||||
#if defined (PCBNV14)
|
||||
#if defined (PCBNV14) && defined(AFHDS2)
|
||||
case MODULE_TYPE_FLYSKY_AFHDS2A:
|
||||
extern uint32_t NV14internalModuleFwVersion;
|
||||
|
||||
if(moduleToUse == INTERNAL_MODULE) {
|
||||
if(g_model.moduleData[INTERNAL_MODULE].subType == FLYSKY_SUBTYPE_AFHDS2A &&
|
||||
NV14internalModuleFwVersion >= 0x1000E) {
|
||||
if(NV14internalModuleFwVersion >= 0x1000E) {
|
||||
rxStat.label = STR_RXSTAT_LABEL_SIGNAL;
|
||||
rxStat.unit = STR_RXSTAT_UNIT_NOUNIT ;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
return &rxStat;
|
||||
|
||||
@@ -70,7 +70,6 @@ ISTR(USBMODES);
|
||||
ISTR(JACK_MODES);
|
||||
ISTR(VFAILSAFE);
|
||||
ISTR(VTRAINERMODES);
|
||||
ISTR(FLYSKY_PROTOCOLS);
|
||||
ISTR(MODULE_PROTOCOLS);
|
||||
ISTR(R9M_REGION);
|
||||
ISTR(R9M_FCC_POWER_VALUES);
|
||||
|
||||
@@ -201,7 +201,6 @@ extern const char* const STR_ISRM_RF_PROTOCOLS[];
|
||||
extern const char* const STR_R9M_PXX2_RF_PROTOCOLS[];
|
||||
extern const char* const STR_PPM_PROTOCOLS[];
|
||||
extern const char* const STR_DSM_PROTOCOLS[];
|
||||
extern const char* const STR_FLYSKY_PROTOCOLS[];
|
||||
extern const char* const STR_CRSF_BAUDRATE[];
|
||||
extern const char* const STR_PPM_POL[];
|
||||
extern const char* const STR_SBUS_INVERSION_VALUES[];
|
||||
|
||||
@@ -65,10 +65,10 @@
|
||||
"R9MLP ACCESS", \
|
||||
"SBUS", \
|
||||
"XJT Lite", \
|
||||
"FLYSKY", \
|
||||
"AFHDS2A", \
|
||||
"AFHDS3", \
|
||||
TR("Lemon DSMP","LemonRx DSMP")
|
||||
|
||||
#define TR_FLYSKY_PROTOCOLS "AFHDS3","AFHDS2A"
|
||||
#define TR_XJT_ACCST_RF_PROTOCOLS "D16","D8","LR12"
|
||||
#define TR_ISRM_RF_PROTOCOLS "ACCESS","D16","LR12"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user