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

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

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

* chore: Add some EL18 CI bits

* fix(afhds): cmake defs

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

* chore(cpn): separate AFHDS2A and AFHDS3

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

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

* chore(cpn): update Flysky int module test

* fix(cpn): compile error

* fix(cpn): afhds2a max channels

* fix: TR_MODULE_PROTOCOLS

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

* fix(cpn): rebase compile error

* fix(cpn): bit indexes

* fix(cpn): emi toString

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

* enh(cpn): add support for Flysky EL18

* fix(cpn): available protocols

* fix(cpn): rebase moduledata

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

* Separate AFHDS2A and AFHDS3 UI settings.

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

* Fix name.

---------

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