From 94764d8fa97e156eac7e20f37420eaa5f5611d0a Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 18 Apr 2021 15:00:24 +0200 Subject: [PATCH 001/110] Updated X10 generated structs --- radio/src/gui/colorlcd/layout.h | 7 ++ radio/src/gui/colorlcd/widgets_container.h | 7 ++ .../storage/yaml/yaml_datastructs_funcs.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x10.cpp | 88 +++++++++++-------- 4 files changed, 67 insertions(+), 37 deletions(-) diff --git a/radio/src/gui/colorlcd/layout.h b/radio/src/gui/colorlcd/layout.h index 080cae4ad..226e38b72 100644 --- a/radio/src/gui/colorlcd/layout.h +++ b/radio/src/gui/colorlcd/layout.h @@ -33,7 +33,14 @@ constexpr uint32_t LAYOUT_REFRESH = 1000 / 2; // 2 Hz class BitmapBuffer; +#if !defined(YAML_GENERATOR) typedef WidgetsContainerPersistentData LayoutPersistentData; +#else +struct LayoutPersistentData { + ZonePersistentData zones[MAX_LAYOUT_ZONES]; + ZoneOptionValueTyped options[MAX_LAYOUT_OPTIONS]; +}; +#endif class LayoutFactory { diff --git a/radio/src/gui/colorlcd/widgets_container.h b/radio/src/gui/colorlcd/widgets_container.h index 31ea3f352..56b1f854e 100644 --- a/radio/src/gui/colorlcd/widgets_container.h +++ b/radio/src/gui/colorlcd/widgets_container.h @@ -67,7 +67,14 @@ struct WidgetsContainerPersistentData { ZoneOptionValueTyped options[O]; }; +#if !defined(YAML_GENERATOR) typedef WidgetsContainerPersistentData TopBarPersistentData; +#else +struct TopBarPersistentData { + ZonePersistentData zones[MAX_TOPBAR_ZONES]; + ZoneOptionValueTyped options[MAX_TOPBAR_OPTIONS]; +}; +#endif class WidgetsContainer: public FormGroup { diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 0781764c2..385a61d32 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -150,7 +150,7 @@ static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) case MODULE_TYPE_XJT_PXX1: case MODULE_TYPE_R9M_PXX1: case MODULE_TYPE_R9M_LITE_PXX1: - case MODULE_TYPE_R9M_LITE_PRO_PXX1: + //case MODULE_TYPE_R9M_LITE_PRO_PXX1: return 3; case MODULE_TYPE_SBUS: return 4; diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 7d2c14d72..5710beab0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -189,11 +189,11 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX1, "TYPE_R9M_LITE_PRO_PXX1" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, { 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_AFHDS3, "TYPE_AFHDS3" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -275,7 +275,7 @@ static const struct YamlNode struct_ZoneOptionValueTyped[] = { YAML_UNION("value", 64, union_ZoneOptionValue_elmts, select_zov), YAML_END }; -static const struct YamlNode struct_ThemeBase__PersistentData[] = { +static const struct YamlNode struct_OpenTxTheme__PersistentData[] = { YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), YAML_END }; @@ -289,7 +289,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightMode", 3 ), YAML_SIGNED( "antennaMode", 2 ), YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_PADDING( 2 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), @@ -340,7 +341,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED( "varioRange", 8 ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 8 ), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_UNSIGNED( "aux2SerialMode", 4 ), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), @@ -351,7 +353,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "blOffBright", 7 ), YAML_STRING("bluetoothName", 10), YAML_STRING("themeName", 8), - YAML_STRUCT("themeData", 480, struct_ThemeBase__PersistentData, NULL), + YAML_STRUCT("themeData", 480, struct_OpenTxTheme__PersistentData, NULL), YAML_STRING("ownerRegistrationID", 8), YAML_END }; @@ -523,12 +525,16 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 2 ), - YAML_PADDING( 3 ), + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), YAML_UNSIGNED( "customProto", 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_UNSIGNED( "spare", 6 ), YAML_END }; static const struct YamlNode struct_anonymous_7[] = { @@ -557,13 +563,23 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), YAML_END }; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; static const struct YamlNode union_anonymous_4_elmts[] = { YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), - YAML_STRUCT("multi", 16, struct_anonymous_6, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -579,8 +595,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 3 ), - YAML_PADDING( 5 ), + YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -611,61 +626,61 @@ static const struct YamlNode struct_string_32[] = { YAML_STRING("val", 4), YAML_END }; -static const struct YamlNode union_anonymous_10_elmts[] = { +static const struct YamlNode union_anonymous_11_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_12[] = { +static const struct YamlNode struct_anonymous_13[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_12, NULL), +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_14[] = { +static const struct YamlNode struct_anonymous_15[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_13_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_14, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_15, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_16, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_17, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_18, NULL), +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_10_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_11_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -678,20 +693,20 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_13_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), YAML_END }; -static const struct YamlNode struct_Widget__PersistentData[] = { +static const struct YamlNode struct_WidgetPersistentData[] = { YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), YAML_END }; static const struct YamlNode struct_ZonePersistentData[] = { YAML_IDX, YAML_STRING("widgetName", 10), - YAML_STRUCT("widgetData", 480, struct_Widget__PersistentData, NULL), + YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), YAML_END }; -static const struct YamlNode struct_Layout__PersistentData[] = { +static const struct YamlNode struct_LayoutPersistentData[] = { YAML_ARRAY("zones", 576, 10, struct_ZonePersistentData, NULL), YAML_ARRAY("options", 96, 10, struct_ZoneOptionValueTyped, NULL), YAML_END @@ -699,10 +714,10 @@ static const struct YamlNode struct_Layout__PersistentData[] = { static const struct YamlNode struct_CustomScreenData[] = { YAML_IDX, YAML_STRING("LayoutId", 10), - YAML_STRUCT("layoutData", 6720, struct_Layout__PersistentData, NULL), + YAML_STRUCT("layoutData", 6720, struct_LayoutPersistentData, NULL), YAML_END }; -static const struct YamlNode struct_Topbar__PersistentData[] = { +static const struct YamlNode struct_TopBarPersistentData[] = { YAML_ARRAY("zones", 576, 4, struct_ZonePersistentData, NULL), YAML_ARRAY("options", 96, 1, struct_ZoneOptionValueTyped, NULL), YAML_END @@ -737,7 +752,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED( "rssiSource", 8 ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), - YAML_PADDING( 6 ), + YAML_UNSIGNED( "spare1", 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), YAML_UNSIGNED( "potsWarnMode", 2 ), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), @@ -748,7 +764,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("potsWarnPosition", 8, 9, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_ARRAY("screenData", 6800, 5, struct_CustomScreenData, NULL), - YAML_STRUCT("topbarData", 2400, struct_Topbar__PersistentData, NULL), + YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END From a4701ef988ca5699622b634783ce5414f26cf2ef Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 18 Apr 2021 17:29:29 +0200 Subject: [PATCH 002/110] Fix crash on partial model load (model select) --- radio/src/storage/sdcard_yaml.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 39404835c..792205e0f 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -138,6 +138,13 @@ const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, u // YAML reader TRACE("YAML model reader"); + if (size < sizeof(g_model)) { + // TODO: Partial load for ModelButton::load() + // -> maybe we should have a summary in modelslist.yml? + memset(buffer, 0, size); + return nullptr; + } + char path[256]; getModelPath(path, filename); From 9a31683bee8b2141b8c571e9a34e29d7521e1eff Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 18 Apr 2021 18:28:49 +0200 Subject: [PATCH 003/110] Init value types properly from factory option defs This is needed to dump the options with the proper type into yaml file. --- .../colorlcd/layouts/layout_factory_impl.h | 25 +++++++++++++------ radio/src/gui/colorlcd/widget.h | 14 ++++++++--- .../colorlcd/widgets/widgets_container_impl.h | 5 +--- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/radio/src/gui/colorlcd/layouts/layout_factory_impl.h b/radio/src/gui/colorlcd/layouts/layout_factory_impl.h index 3fc285e9d..7297db763 100644 --- a/radio/src/gui/colorlcd/layouts/layout_factory_impl.h +++ b/radio/src/gui/colorlcd/layouts/layout_factory_impl.h @@ -134,7 +134,7 @@ class BaseLayoutFactory: public LayoutFactory Layout * create(Layout::PersistentData * persistentData) const override { - initPersistentData(persistentData); + initPersistentData(persistentData, true); Layout * layout = new T(this, persistentData); if (layout) { layout->create(); @@ -144,6 +144,7 @@ class BaseLayoutFactory: public LayoutFactory Layout * load(Layout::PersistentData * persistentData) const override { + initPersistentData(persistentData, false); Layout * layout = new T(this, persistentData); if (layout) { layout->load(); @@ -151,16 +152,24 @@ class BaseLayoutFactory: public LayoutFactory return layout; } - void initPersistentData(Layout::PersistentData * persistentData) const override + void initPersistentData(Layout::PersistentData* persistentData, + bool setDefault) const override { - memset(persistentData, 0, sizeof(Layout::PersistentData)); + if (setDefault) { + memset(persistentData, 0, sizeof(Layout::PersistentData)); + } if (options) { int i = 0; - for (const ZoneOption * option = options; option->name; option++, i++) { - TRACE("LayoutFactory::initPersistentData() setting option '%s'", option->name); - // TODO compiler bug? The CPU freezes ... persistentData->options[i++] = option->deflt; - memcpy(&persistentData->options[i].value, &option->deflt, sizeof(ZoneOptionValue)); - persistentData->options[i].type = zoneValueEnumFromType(option->type); + for (const ZoneOption* option = options; option->name; option++, i++) { + TRACE("LayoutFactory::initPersistentData() setting option '%s'", + option->name); + // TODO compiler bug? The CPU freezes ... persistentData->options[i++] + // = option->deflt; + auto optVal = &persistentData->options[i]; + if (setDefault) { + memcpy(&optVal->value, &option->deflt, sizeof(ZoneOptionValue)); + } + optVal->type = zoneValueEnumFromType(option->type); } } } diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index 3ab4700c7..3f3d91341 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -148,16 +148,22 @@ class WidgetFactory return name; } - void initPersistentData(Widget::PersistentData * persistentData) const + void initPersistentData(Widget::PersistentData * persistentData, bool setDefault) const { - memset(persistentData, 0, sizeof(Widget::PersistentData)); + if (setDefault) { + memset(persistentData, 0, sizeof(Widget::PersistentData)); + } if (options) { int i = 0; for (const ZoneOption * option = options; option->name; option++, i++) { TRACE("WidgetFactory::initPersistentData() setting option '%s'", option->name); // TODO compiler bug? The CPU freezes ... persistentData->options[i++] = option->deflt; - memcpy(&persistentData->options[i].value, &option->deflt, sizeof(ZoneOptionValue)); - persistentData->options[i].type = zoneValueEnumFromType(option->type); + auto optVal = &persistentData->options[i]; + if (setDefault) { + // reset to default value + memcpy(&optVal->value, &option->deflt, sizeof(ZoneOptionValue)); + } + optVal->type = zoneValueEnumFromType(option->type); } } } diff --git a/radio/src/gui/colorlcd/widgets/widgets_container_impl.h b/radio/src/gui/colorlcd/widgets/widgets_container_impl.h index 4bb647fe6..fb4a6bde2 100644 --- a/radio/src/gui/colorlcd/widgets/widgets_container_impl.h +++ b/radio/src/gui/colorlcd/widgets/widgets_container_impl.h @@ -167,10 +167,7 @@ class BaseWidgetFactory: public WidgetFactory Widget * create(FormGroup * parent, const rect_t & rect, Widget::PersistentData * persistentData, bool init = true) const override { - if (init) { - initPersistentData(persistentData); - } - + initPersistentData(persistentData, init); return new T(this, parent, rect, persistentData); } }; From e10439ce873e27437f6e38b699a8166cdd34f903 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 18 Apr 2021 18:40:42 +0200 Subject: [PATCH 004/110] Updated directly loadable version to libclang-6.0 --- radio/util/generate_yaml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/util/generate_yaml.py b/radio/util/generate_yaml.py index fa4733ae3..e9dc1b937 100644 --- a/radio/util/generate_yaml.py +++ b/radio/util/generate_yaml.py @@ -484,7 +484,7 @@ CLANG_LIB_LOCATIONS = [ '/usr/local/Cellar/llvm/6.0.0/lib/libclang.dylib', '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libclang.dylib', '/Library/Developer/CommandLineTools/usr/lib/libclang.dylib', - '/usr/lib/x86_64-linux-gnu/libclang-3.8.so.1' + '/usr/lib/x86_64-linux-gnu/libclang-6.0.so.1' ] # set clang lib file From cbde43cbeb3f6a1e150d17e4d07e95275b514d75 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 18 Apr 2021 18:44:20 +0200 Subject: [PATCH 005/110] Updated generated yaml model for X12S --- .../storage/yaml/yaml_datastructs_x12s.cpp | 88 +++++++++++-------- 1 file changed, 52 insertions(+), 36 deletions(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 1d3a8cb57..869b235b6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -190,11 +190,11 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX1, "TYPE_R9M_LITE_PRO_PXX1" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, { 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_AFHDS3, "TYPE_AFHDS3" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -276,7 +276,7 @@ static const struct YamlNode struct_ZoneOptionValueTyped[] = { YAML_UNION("value", 64, union_ZoneOptionValue_elmts, select_zov), YAML_END }; -static const struct YamlNode struct_ThemeBase__PersistentData[] = { +static const struct YamlNode struct_OpenTxTheme__PersistentData[] = { YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), YAML_END }; @@ -290,7 +290,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightMode", 3 ), YAML_SIGNED( "antennaMode", 2 ), YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_PADDING( 2 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), @@ -341,7 +342,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED( "varioRange", 8 ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 8 ), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_UNSIGNED( "aux2SerialMode", 4 ), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), @@ -352,7 +354,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "blOffBright", 7 ), YAML_STRING("bluetoothName", 10), YAML_STRING("themeName", 8), - YAML_STRUCT("themeData", 480, struct_ThemeBase__PersistentData, NULL), + YAML_STRUCT("themeData", 480, struct_OpenTxTheme__PersistentData, NULL), YAML_STRING("ownerRegistrationID", 8), YAML_END }; @@ -524,12 +526,16 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 2 ), - YAML_PADDING( 3 ), + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), YAML_UNSIGNED( "customProto", 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_UNSIGNED( "spare", 6 ), YAML_END }; static const struct YamlNode struct_anonymous_7[] = { @@ -558,13 +564,23 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), YAML_END }; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; static const struct YamlNode union_anonymous_4_elmts[] = { YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), - YAML_STRUCT("multi", 16, struct_anonymous_6, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -580,8 +596,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 3 ), - YAML_PADDING( 5 ), + YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -612,61 +627,61 @@ static const struct YamlNode struct_string_32[] = { YAML_STRING("val", 4), YAML_END }; -static const struct YamlNode union_anonymous_10_elmts[] = { +static const struct YamlNode union_anonymous_11_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_12[] = { +static const struct YamlNode struct_anonymous_13[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_12, NULL), +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_14[] = { +static const struct YamlNode struct_anonymous_15[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_13_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_14, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_15, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_16, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_17, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_18, NULL), +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_10_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_11_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -679,20 +694,20 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_13_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), YAML_END }; -static const struct YamlNode struct_Widget__PersistentData[] = { +static const struct YamlNode struct_WidgetPersistentData[] = { YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), YAML_END }; static const struct YamlNode struct_ZonePersistentData[] = { YAML_IDX, YAML_STRING("widgetName", 10), - YAML_STRUCT("widgetData", 480, struct_Widget__PersistentData, NULL), + YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), YAML_END }; -static const struct YamlNode struct_Layout__PersistentData[] = { +static const struct YamlNode struct_LayoutPersistentData[] = { YAML_ARRAY("zones", 576, 10, struct_ZonePersistentData, NULL), YAML_ARRAY("options", 96, 10, struct_ZoneOptionValueTyped, NULL), YAML_END @@ -700,10 +715,10 @@ static const struct YamlNode struct_Layout__PersistentData[] = { static const struct YamlNode struct_CustomScreenData[] = { YAML_IDX, YAML_STRING("LayoutId", 10), - YAML_STRUCT("layoutData", 6720, struct_Layout__PersistentData, NULL), + YAML_STRUCT("layoutData", 6720, struct_LayoutPersistentData, NULL), YAML_END }; -static const struct YamlNode struct_Topbar__PersistentData[] = { +static const struct YamlNode struct_TopBarPersistentData[] = { YAML_ARRAY("zones", 576, 4, struct_ZonePersistentData, NULL), YAML_ARRAY("options", 96, 1, struct_ZoneOptionValueTyped, NULL), YAML_END @@ -738,7 +753,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED( "rssiSource", 8 ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), - YAML_PADDING( 6 ), + YAML_UNSIGNED( "spare1", 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), YAML_UNSIGNED( "potsWarnMode", 2 ), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), @@ -749,7 +765,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("potsWarnPosition", 8, 9, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_ARRAY("screenData", 6800, 5, struct_CustomScreenData, NULL), - YAML_STRUCT("topbarData", 2400, struct_Topbar__PersistentData, NULL), + YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END From 713579b238d7bcd9fccffa6e742c81a46acad3e2 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 07:36:59 +0200 Subject: [PATCH 006/110] Added basic support for PartialModel load --- radio/src/datastructs.h | 5 +++++ radio/src/storage/sdcard_yaml.cpp | 17 +++++++++++------ radio/src/storage/yaml/CMakeLists.txt | 2 +- radio/src/storage/yaml/yaml_datastructs.h | 1 + radio/src/storage/yaml/yaml_datastructs_x10.cpp | 13 ++++++++++++- .../src/storage/yaml/yaml_datastructs_x12s.cpp | 13 ++++++++++++- 6 files changed, 42 insertions(+), 9 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 8dbd2bb10..99b4a9dbf 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -602,6 +602,11 @@ PACK(struct CustomScreenData { #define SCRIPT_DATA #endif +PACK(struct PartialModel { + ModelHeader header; + TimerData timers[MAX_TIMERS]; +}); + PACK(struct ModelData { ModelHeader header; TimerData timers[MAX_TIMERS]; diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 792205e0f..5866fcbfe 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -138,18 +138,23 @@ const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, u // YAML reader TRACE("YAML model reader"); - if (size < sizeof(g_model)) { - // TODO: Partial load for ModelButton::load() - // -> maybe we should have a summary in modelslist.yml? - memset(buffer, 0, size); - return nullptr; + const YamlNode* data_nodes = nullptr; + if (size == sizeof(g_model)) { + data_nodes = get_modeldata_nodes(); + } + else if (size == sizeof(PartialModel)) { + data_nodes = get_partialmodel_nodes(); + } + else { + TRACE("cannot find YAML data nodes for object size (size=%d)", size); + return "YAML size error"; } char path[256]; getModelPath(path, filename); YamlTreeWalker tree; - tree.reset(get_modeldata_nodes(), buffer); + tree.reset(data_nodes, buffer); // wipe memory before reading YAML memset(buffer,0,size); diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index 0d24f7050..cc2e4bb35 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -17,7 +17,7 @@ endif() set(YAML_GEN ${RADIO_DIRECTORY}/util/generate_yaml.py) set(YAML_GEN_TEMPLATE ${RADIO_DIRECTORY}/util/yaml_parser.tmpl) -SET(YAML_NODES "\"RadioData,ModelData\"") +SET(YAML_NODES "\"RadioData,ModelData,PartialModel\"") set(YAML_GEN_ARGS myeeprom.h ${YAML_GEN_TEMPLATE} ${YAML_NODES} -DYAML_GENERATOR) get_property(flags DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY COMPILE_DEFINITIONS) diff --git a/radio/src/storage/yaml/yaml_datastructs.h b/radio/src/storage/yaml/yaml_datastructs.h index b60981579..5e245a019 100644 --- a/radio/src/storage/yaml/yaml_datastructs.h +++ b/radio/src/storage/yaml/yaml_datastructs.h @@ -26,5 +26,6 @@ struct YamlNode; const YamlNode* get_radiodata_nodes(); const YamlNode* get_modeldata_nodes(); +const YamlNode* get_partialmodel_nodes(); #endif diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 5710beab0..c6fc153b2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -769,8 +769,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRING("modelRegistrationID", 8), YAML_END }; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; -#define MAX_RADIODATA_MODELDATA_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); @@ -784,4 +789,10 @@ const YamlNode* get_modeldata_nodes() { return &__ModelData_root_node; } +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 869b235b6..9ec6ea4ab 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -770,8 +770,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRING("modelRegistrationID", 8), YAML_END }; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; -#define MAX_RADIODATA_MODELDATA_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); @@ -785,4 +790,10 @@ const YamlNode* get_modeldata_nodes() { return &__ModelData_root_node; } +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} From 09738f365d709b1c71e918bff559a00f14580ab7 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 08:27:38 +0200 Subject: [PATCH 007/110] Use max version number for YAML (provisional) TODO: this needs to be changed once there is a proper version number assigned. --- radio/src/storage/sdcard_yaml.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 5866fcbfe..a6cc1c7a3 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -169,7 +169,8 @@ const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, u } } //#endif - + + *version = 255; // max version number return readYamlFile(path, YamlTreeWalker::get_parser_calls(), &tree); } From fcab8f2b241b4418605029ec74d101d62984667d Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 08:28:42 +0200 Subject: [PATCH 008/110] Hide YAML traces behind DEBUG_YAML --- radio/src/CMakeLists.txt | 5 +++++ radio/src/debug.h | 6 ++++++ radio/src/storage/yaml/yaml_parser.cpp | 20 ++++++++++---------- radio/src/storage/yaml/yaml_tree_walker.cpp | 2 +- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 0d72f1aeb..6c10b140b 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -44,6 +44,7 @@ option(TEMPLATES "Model templates menu" OFF) option(TRACE_SIMPGMSPACE "Turn on traces in simpgmspace.cpp" ON) option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF) option(DEBUG_WINDOWS "Turn on windows traces" OFF) +option(DEBUG_YAML "Turn on YAML traces" OFF) option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF) option(NANO "Use nano newlib and binalloc") option(TEST_BUILD_WARNING "Warn this is a test build" OFF) @@ -377,6 +378,10 @@ if(DEBUG_WINDOWS) add_definitions(-DDEBUG_WINDOWS) endif() +if(DEBUG_YAML) + add_definitions(-DDEBUG_YAML) +endif() + if(FRSKY_STICKS) add_definitions(-DFRSKY_STICKS) endif() diff --git a/radio/src/debug.h b/radio/src/debug.h index 7eed0b864..d616f7f24 100644 --- a/radio/src/debug.h +++ b/radio/src/debug.h @@ -93,6 +93,12 @@ uint8_t aux2SerialTracesEnabled(); #define TRACE_LUA_INTERNALS_WITH_LINEINFO(L, f_, ...) #endif +#if defined(DEBUG_YAML) +#define TRACE_YAML(f_, ...) TRACE(f_, ##__VA_ARGS__) +#else +#define TRACE_YAML(f_, ...) +#endif + #if defined(DEBUG) && !defined(SIMU) #define TIME_MEASURE_START(id) uint16_t t0 ## id = getTmr2MHz() #define TIME_MEASURE_STOP(id) TRACE("Measure(" # id ") = %.1fus", float((uint16_t)(getTmr2MHz() - t0 ## id))/2) diff --git a/radio/src/storage/yaml/yaml_parser.cpp b/radio/src/storage/yaml/yaml_parser.cpp index bc0b0a224..69794505f 100644 --- a/radio/src/storage/yaml/yaml_parser.cpp +++ b/radio/src/storage/yaml/yaml_parser.cpp @@ -80,7 +80,7 @@ YamlParser::parse(const char* buffer, unsigned int size) if(s_len < MAX_STR) \ s[s_len++] = c; \ else { \ - TRACE("STRING_OVERFLOW"); \ + TRACE_YAML("STRING_OVERFLOW"); \ return STRING_OVERFLOW; \ } \ } @@ -109,7 +109,7 @@ YamlParser::parse(const char* buffer, unsigned int size) // go up as many levels as necessary do { if (!toParent()) { - TRACE("STOP (no parent)!\n"); + TRACE_YAML("STOP (no parent)!\n"); return DONE_PARSING; } } while (indent < getLastIndent()); @@ -123,7 +123,7 @@ YamlParser::parse(const char* buffer, unsigned int size) // go down one level else if (indent > getLastIndent()) { if (!toChild()) { - TRACE("STOP (stack full)!\n"); + TRACE_YAML("STOP (stack full)!\n"); return DONE_PARSING; // ERROR } } @@ -142,7 +142,7 @@ YamlParser::parse(const char* buffer, unsigned int size) if (*c == ' ') {// assumes nothing else comes after spaces start node_found = calls->find_node(ctx, scratch_buf, scratch_len); if (!node_found) { - TRACE("YAML_PARSER: Could not find node '%.*s' (1)\n", + TRACE_YAML("YAML_PARSER: Could not find node '%.*s' (1)\n", scratch_len, scratch_buf); } state = ps_AttrSP; @@ -156,7 +156,7 @@ YamlParser::parse(const char* buffer, unsigned int size) if (state == ps_Attr) { node_found = calls->find_node(ctx, scratch_buf, scratch_len); if (!node_found) { - TRACE("YAML_PARSER: Could not find node '%.*s' (2)\n", + TRACE_YAML("YAML_PARSER: Could not find node '%.*s' (2)\n", scratch_len, scratch_buf); } } @@ -167,7 +167,7 @@ YamlParser::parse(const char* buffer, unsigned int size) if (state == ps_Attr) { node_found = calls->find_node(ctx, scratch_buf, scratch_len); if (!node_found) { - TRACE("YAML_PARSER: Could not find node '%.*s' (3)\n", + TRACE_YAML("YAML_PARSER: Could not find node '%.*s' (3)\n", scratch_len, scratch_buf); } } @@ -210,12 +210,12 @@ YamlParser::parse(const char* buffer, unsigned int size) break; } //TODO: more escapes needed??? - TRACE("unknown escape char '%c'",*c); + TRACE_YAML("unknown escape char '%c'",*c); return DONE_PARSING; case ps_ValEsc2: if(scratch_len >= MAX_STR) { - TRACE("STRING_OVERFLOW"); + TRACE_YAML("STRING_OVERFLOW"); return STRING_OVERFLOW; } else if (*c >= '0' && *c <= '9') { @@ -228,7 +228,7 @@ YamlParser::parse(const char* buffer, unsigned int size) state = ps_ValEsc3; break; } - TRACE("wrong hex digit '%c'",*c); + TRACE_YAML("wrong hex digit '%c'",*c); return DONE_PARSING; case ps_ValEsc3: @@ -242,7 +242,7 @@ YamlParser::parse(const char* buffer, unsigned int size) state = ps_ValQuo; break; } - TRACE("wrong hex digit '%c'",*c); + TRACE_YAML("wrong hex digit '%c'",*c); return DONE_PARSING; case ps_Val: diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index 88f15ac5a..4a2e0db28 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -358,7 +358,7 @@ bool YamlTreeWalker::isElmtEmpty(uint8_t* data) bit_ofs = getLevelOfs(); - TRACE(""); + TRACE_YAML(""); return false;//node->u._array.u.select_member; //TODO! // // assume structs aligned on 8bit boundaries // && !node->_array.is_active(data + (bit_ofs >> 3)); From d747072e1e2fde263e84828990ed2d0f8dfd5a9f Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 09:11:50 +0200 Subject: [PATCH 009/110] TODO reminders --- .../storage/yaml/yaml_datastructs_funcs.cpp | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 385a61d32..bba5c8ce5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -380,3 +380,24 @@ static bool fmd_is_active(uint8_t* data, uint32_t bitoffs) return is_active; } + +static uint32_t r_swtchWarn(const YamlNode* node, const char* val, uint8_t val_len) +{ + //TODO: read from string like 'AdBuC-' + // -> reads: + // - Switch A: must be DOWN + // - Switch B: must be UP + // - Switch C: must be MIDDLE + // + // -> switches not in the list shall not be checked + // + // -> refer to getSwitchWarningString() (strhelpers.cpp) + return 0; +} + +static bool w_swtchWarn(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + //TODO: + // -> refer to getSwitchWarningString() (strhelpers.cpp) + return true; +} From 1ccf6be019841add744e7e873d7c5065d70c1031 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 09:53:15 +0200 Subject: [PATCH 010/110] Fixed padding bits --- radio/src/datastructs.h | 6 +++--- radio/src/storage/yaml/yaml_datastructs_x10.cpp | 6 +++--- radio/src/storage/yaml/yaml_datastructs_x12s.cpp | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 99b4a9dbf..64ad53f58 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -440,7 +440,7 @@ PACK(struct ModuleData { int8_t optionValue; uint8_t receiverTelemetryOff:1; uint8_t receiverHigherChannels:1; - uint8_t spare:6; + uint8_t spare:6 SKIP; } multi); NOBACKUP(struct { uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W @@ -647,7 +647,7 @@ PACK(struct ModelData { NOBACKUP(RssiAlarmData rssiAlarms); - uint8_t spare1:3; + uint8_t spare1:3 SKIP; uint8_t thrTrimSw:3; uint8_t potsWarnMode:2; @@ -737,7 +737,7 @@ PACK(struct TrainerData { }); #if defined(COLORLCD) - #define SPLASH_MODE uint8_t splashSpares:3 + #define SPLASH_MODE uint8_t splashSpares:3 SKIP #else #define SPLASH_MODE int8_t splashMode:3 #endif diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index c6fc153b2..29cc08b86 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -304,7 +304,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "adjustRTC", 1 ), YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_UNSIGNED( "splashSpares", 3 ), + YAML_PADDING( 3 ), YAML_SIGNED( "hapticMode", 2 ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), @@ -534,7 +534,7 @@ static const struct YamlNode struct_anonymous_6[] = { YAML_SIGNED( "optionValue", 8 ), YAML_UNSIGNED( "receiverTelemetryOff", 1 ), YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_UNSIGNED( "spare", 6 ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_7[] = { @@ -752,7 +752,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED( "rssiSource", 8 ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), - YAML_UNSIGNED( "spare1", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), YAML_UNSIGNED( "potsWarnMode", 2 ), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 9ec6ea4ab..adba40f99 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -305,7 +305,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "adjustRTC", 1 ), YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_UNSIGNED( "splashSpares", 3 ), + YAML_PADDING( 3 ), YAML_SIGNED( "hapticMode", 2 ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), @@ -535,7 +535,7 @@ static const struct YamlNode struct_anonymous_6[] = { YAML_SIGNED( "optionValue", 8 ), YAML_UNSIGNED( "receiverTelemetryOff", 1 ), YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_UNSIGNED( "spare", 6 ), + YAML_PADDING( 6 ), YAML_END }; static const struct YamlNode struct_anonymous_7[] = { @@ -753,7 +753,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED( "rssiSource", 8 ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), - YAML_UNSIGNED( "spare1", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), YAML_UNSIGNED( "potsWarnMode", 2 ), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), From cbfff0f16885a9e87e556d1166cc61b1e5998f00 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 11:08:21 +0200 Subject: [PATCH 011/110] yaml: switch warning state (de-)serialize --- radio/src/datastructs.h | 2 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 74 +++++++++++++++++-- .../src/storage/yaml/yaml_datastructs_x10.cpp | 2 +- .../storage/yaml/yaml_datastructs_x12s.cpp | 2 +- 4 files changed, 72 insertions(+), 8 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 64ad53f58..c7dc781eb 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -559,7 +559,7 @@ typedef uint8_t swarnenable_t; #if defined(COLORLCD) #define SWITCHES_WARNING_DATA \ - NOBACKUP(swarnstate_t switchWarningState); + NOBACKUP(swarnstate_t switchWarningState CUST(r_swtchWarn,w_swtchWarn)); #else #define SWITCHES_WARNING_DATA \ swarnstate_t switchWarningState; \ diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index bba5c8ce5..b9d21b662 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -383,7 +383,8 @@ static bool fmd_is_active(uint8_t* data, uint32_t bitoffs) static uint32_t r_swtchWarn(const YamlNode* node, const char* val, uint8_t val_len) { - //TODO: read from string like 'AdBuC-' + // Read from string like 'AdBuC-': + // // -> reads: // - Switch A: must be DOWN // - Switch B: must be UP @@ -391,13 +392,76 @@ static uint32_t r_swtchWarn(const YamlNode* node, const char* val, uint8_t val_l // // -> switches not in the list shall not be checked // - // -> refer to getSwitchWarningString() (strhelpers.cpp) - return 0; + swarnstate_t swtchWarn = 0; + while(val_len--) { + + signed swtch = *(val++) - 'A'; + if (swtch >= NUM_SWITCHES) + break; + + unsigned state = 0; + switch (*(val++)) { + case 'u': + state = 1; + break; + case '-': + state = 2; + break; + case 'd': + state = 3; + break; + default: + // no check + break; + } + + // 3 bits per switch + swtchWarn |= (state << (3*swtch)); + } + + return swtchWarn; } static bool w_swtchWarn(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - //TODO: - // -> refer to getSwitchWarningString() (strhelpers.cpp) + for (int i = 0; i < NUM_SWITCHES; i++) { + if (SWITCH_EXISTS(i)) { + + // decode check state + // -> 3 bits per switch + auto state = (val >> (3*i)) & 0x07; + + // state == 0 -> no check + // state == 1 -> UP + // state == 2 -> MIDDLE + // state == 3 -> DOWN + char swtchWarn[2] = {(char)('A' + i), 0}; + + switch (state) { + case 0: + break; + case 1: + swtchWarn[1] = 'u'; + break; + case 2: + swtchWarn[1] = '-'; + break; + case 3: + swtchWarn[1] = 'd'; + break; + default: + // this should never happen + swtchWarn[1] = 'x'; + break; + } + + if (swtchWarn[1] != 0) { + if (!wf(opaque, swtchWarn, 2)) { + return false; + } + } + } + } + return true; } diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 29cc08b86..d476bc22e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -747,7 +747,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 32 ), + YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED( "rssiSource", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index adba40f99..824249a3c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -748,7 +748,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 32 ), + YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED( "rssiSource", 8 ), From ea483e4dc91f9aed3da772d74777fe2da2c0f89d Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 11:26:58 +0200 Subject: [PATCH 012/110] Use custom [r/w]_mixSrcRaw in ExpoData as well. --- radio/src/datastructs.h | 2 +- radio/src/storage/yaml/yaml_datastructs_x10.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index c7dc781eb..c4afe3a9d 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -96,7 +96,7 @@ PACK(struct MixData { PACK(struct ExpoData { uint16_t mode:2; uint16_t scale:14; - uint16_t srcRaw:10 ENUM(MixSources); + uint16_t srcRaw:10 ENUM(MixSources) CUST(r_mixSrcRaw,w_mixSrcRaw); int16_t carryTrim:6; uint32_t chn:5; int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index d476bc22e..43fd4f620 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -423,7 +423,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), - YAML_ENUM("srcRaw", 10, enum_MixSources), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), From 9436e171a77234b2a3759c6a7c62b6f4e48a8b60 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 11:28:55 +0200 Subject: [PATCH 013/110] Change ExpoData to custom functions for X12S as well. --- radio/src/storage/yaml/yaml_datastructs_x12s.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 824249a3c..222605562 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -424,7 +424,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), - YAML_ENUM("srcRaw", 10, enum_MixSources), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), From e1736294c859a4585144ee9442ae659e7a88d5a1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 19 Apr 2021 23:44:50 +0200 Subject: [PATCH 014/110] Use a list attribute name as model category --- radio/src/storage/modelslist.cpp | 3 ++- radio/src/storage/yaml/yaml_modelslist.cpp | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index f9db2954d..4430d2104 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -262,9 +262,10 @@ void ModelsCategory::save(FIL * file) f_puts("]", file); f_putc('\n', file); #else - f_puts("- name: ", file); + f_puts("- ", file); f_puts(name, file); f_putc('\n', file); + //f_puts(" models:\n", file); #endif for (list::iterator it = begin(); it != end(); ++it) { (*it)->save(file); diff --git a/radio/src/storage/yaml/yaml_modelslist.cpp b/radio/src/storage/yaml/yaml_modelslist.cpp index 7be9062aa..dd3384751 100644 --- a/radio/src/storage/yaml/yaml_modelslist.cpp +++ b/radio/src/storage/yaml/yaml_modelslist.cpp @@ -89,6 +89,12 @@ static bool find_node(void* ctx, char* buf, uint8_t len) memcpy(mi->current_attr, buf, len); mi->current_attr[len] = '\0'; + list& cats = mi->root->getCategories(); + if (mi->level == modelslist_iter::Category) { + ModelsCategory* cat = new ModelsCategory(buf,len); + cats.push_back(cat); + } + return true; } @@ -97,10 +103,6 @@ static void set_attr(void* ctx, char* buf, uint8_t len) modelslist_iter* mi = (modelslist_iter*)ctx; list& cats = mi->root->getCategories(); switch(mi->level) { - case modelslist_iter::Category: { - ModelsCategory* cat = new ModelsCategory(buf,len); - cats.push_back(cat); - } break; case modelslist_iter::Model: if (!strcmp(mi->current_attr,"filename")) { From d2ddb2e53594e97cdab3c8f157c28f6263d28330 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 9 May 2021 20:53:00 +0200 Subject: [PATCH 015/110] Fix compilation error --- radio/src/lua/widgets.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index d514ef50a..2f175680f 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -332,9 +332,7 @@ class LuaWidgetFactory: public WidgetFactory Widget * create(FormGroup * parent, const rect_t & rect, Widget::PersistentData * persistentData, bool init=true) const override { if (lsWidgets == 0) return 0; - if (init) { - initPersistentData(persistentData); - } + initPersistentData(persistentData, init); luaSetInstructionsLimit(lsWidgets, WIDGET_SCRIPTS_MAX_INSTRUCTIONS); lua_rawgeti(lsWidgets, LUA_REGISTRYINDEX, createFunction); From fa521fa1dacfaa37d8c45a0cb86643627a068525 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 31 May 2021 18:05:07 +0200 Subject: [PATCH 016/110] Updated YAML data structs --- radio/src/storage/yaml/yaml_datastructs_x10.cpp | 5 +++-- radio/src/storage/yaml/yaml_datastructs_x12s.cpp | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 43fd4f620..5a5479957 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -29,7 +29,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_LOGS, "LOGS" }, { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_DISABLE_TOUCH, "DISABLE_TOUCH" }, + { FUNC_RACING_MODE, "RACING_MODE" }, { FUNC_MAX, "MAX" }, { 0, NULL } }; @@ -559,7 +559,8 @@ static const struct YamlNode struct_string_64[] = { YAML_END }; static const struct YamlNode struct_anonymous_9[] = { - YAML_UNSIGNED( "receivers", 8 ), + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 222605562..df848eaf5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -29,7 +29,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_LOGS, "LOGS" }, { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_DISABLE_TOUCH, "DISABLE_TOUCH" }, + { FUNC_RACING_MODE, "RACING_MODE" }, { FUNC_MAX, "MAX" }, { 0, NULL } }; @@ -560,7 +560,8 @@ static const struct YamlNode struct_string_64[] = { YAML_END }; static const struct YamlNode struct_anonymous_9[] = { - YAML_UNSIGNED( "receivers", 8 ), + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), YAML_END }; From c2f42879a411549d5078953e98cb5000aa128a39 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 31 May 2021 22:13:50 +0200 Subject: [PATCH 017/110] Test with X7 family --- radio/src/CMakeLists.txt | 1 + radio/src/storage/yaml/CMakeLists.txt | 2 + .../src/storage/yaml/yaml_datastructs_x7.cpp | 756 ++++++++++++++++++ radio/src/targets/horus/CMakeLists.txt | 1 - radio/src/targets/taranis/CMakeLists.txt | 9 +- 5 files changed, 766 insertions(+), 3 deletions(-) create mode 100644 radio/src/storage/yaml/yaml_datastructs_x7.cpp diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 6c10b140b..60d890678 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -57,6 +57,7 @@ option(TBS_RELEASE "Used to build TBS released firmware" OFF) option(IMRC_RELEASE "Used to build IMRC released firmware" OFF) option(HARDWARE_TRAINER_MULTI "Allow multi trainer" OFF) option(BOOTLOADER "Include Bootloader" ON) +option(YAML_STORAGE "Enable YAML storage" NO) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index cc2e4bb35..5025a6057 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -10,6 +10,8 @@ if(PCB STREQUAL X12S) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x12s.cpp) elseif(PCB STREQUAL X10) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x10.cpp) +elseif(PCB STREQUAL X7) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x7.cpp) else() message(FATAL_ERROR "PCB '${PCB}' is not supported by YAML storage") endif() diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp new file mode 100644 index 000000000..ac621d122 --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -0,0 +1,756 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "splashMode", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 5f257e6c5..94e55a1a1 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -33,7 +33,6 @@ else() set(LINKER_SCRIPT targets/horus/stm32f4_flash.ld) endif() -option(YAML_STORAGE "Enable YAML storage" NO) if(YAML_STORAGE) set(STORAGE_FORMAT YAML) endif() diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 64e6a45db..0b718e896 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -418,8 +418,13 @@ endif() set(HSE_VALUE 12000000) set(SDCARD YES) -set(STORAGE EEPROM) -set(STORAGE_FORMAT RLC) +if(YAML_STORAGE) + set(STORAGE SDCARD) + set(STORAGE_FORMAT YAML) +else() + set(STORAGE EEPROM) + set(STORAGE_FORMAT RLC) +endif() set(TARGET_DIR taranis) set(PPM_LIMITS_SYMETRICAL YES) From 72859ad6d12ede3ba34c5205f7cea024aff2c70b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 1 Jun 2021 06:34:57 +0200 Subject: [PATCH 018/110] WiP --- radio/src/dataconstants.h | 18 +++++++----------- radio/src/datastructs.h | 1 + radio/src/main.cpp | 3 +++ radio/src/opentx.cpp | 3 +++ radio/src/sdcard.h | 2 +- radio/src/storage/yaml/yaml_datastructs.cpp | 2 ++ .../storage/yaml/yaml_datastructs_funcs.cpp | 6 +++++- 7 files changed, 22 insertions(+), 13 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 5040b1117..b43013d3c 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -253,16 +253,10 @@ enum UartModes { UART_MODE_MAX = UART_MODE_COUNT-1 }; -#if defined(PCBHORUS) || defined(PCBNV14) - #define LEN_SWITCH_NAME 3 - #define LEN_ANA_NAME 3 - #define LEN_MODEL_FILENAME 16 - #define LEN_BLUETOOTH_NAME 10 -#else - #define LEN_SWITCH_NAME 3 - #define LEN_ANA_NAME 3 - #define LEN_BLUETOOTH_NAME 10 -#endif +#define LEN_SWITCH_NAME 3 +#define LEN_ANA_NAME 3 +#define LEN_MODEL_FILENAME 16 +#define LEN_BLUETOOTH_NAME 10 enum TelemetryProtocol { @@ -626,7 +620,7 @@ enum MixSources { MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") MIXSRC_POT3, LUA_EXPORT("s3", "Potentiometer 3") MIXSRC_POT4, LUA_EXPORT("s4", "Potentiometer 4 (X9E only)") - MIXSRC_FIRST_SLIDER, + MIXSRC_FIRST_SLIDER SKIP, MIXSRC_SLIDER1 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("ls", "Left slider") MIXSRC_SLIDER2, LUA_EXPORT("rs", "Right slider") MIXSRC_SLIDER3, LUA_EXPORT("lcs", "Left center slider (X9E only)") @@ -635,9 +629,11 @@ enum MixSources { #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBNV14) MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") + MIXSRC_FIRST_SLIDER SKIP = MIXSRC_POT2, MIXSRC_LAST_POT SKIP = MIXSRC_POT2, #elif defined(PCBX9LITE) MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") + MIXSRC_FIRST_SLIDER SKIP = MIXSRC_POT1, MIXSRC_LAST_POT SKIP = MIXSRC_POT1, #elif defined(PCBTARANIS) MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index c4afe3a9d..f5ea7944d 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -780,6 +780,7 @@ PACK(struct TrainerData { swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]; \ char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME]; \ + char currModelFilename[LEN_MODEL_FILENAME+1]; \ BLUETOOTH_FIELDS #else #define EXTRA_GENERAL_FIELDS diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 51900b854..280d857ee 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -532,8 +532,11 @@ void perMain() if ((!usbPlugged() || (getSelectedUsbMode() == USB_UNSELECTED_MODE)) && !SD_CARD_PRESENT() && !globalData.unexpectedShutdown) { + // TODO: implement for b/w +#if defined(COLORLCD) drawFatalErrorScreen(STR_NO_SDCARD); return; +#endif } #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 9e65c0dbc..dd48f424a 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1977,7 +1977,10 @@ int main() #if !defined(EEPROM) if (!SD_CARD_PRESENT() && !UNEXPECTED_SHUTDOWN()) { + // TODO: b/w SD card fatal screen +#if defined(COLORLCD) runFatalErrorScreen(STR_NO_SDCARD); +#endif } #endif diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 0bd0c3133..e1ab079e0 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -54,7 +54,7 @@ #define LEN_FILE_PATH_MAX (sizeof(SCRIPTS_TELEM_PATH)+1) // longest + "/" -#if defined(COLORLCD) +#if defined(SDCARD_YAML) || defined(SDCARD_RAW) #define RADIO_FILENAME "radio.bin" const char RADIO_MODELSLIST_PATH[] = RADIO_PATH PATH_SEPARATOR "models.txt"; const char RADIO_SETTINGS_PATH[] = RADIO_PATH PATH_SEPARATOR RADIO_FILENAME; diff --git a/radio/src/storage/yaml/yaml_datastructs.cpp b/radio/src/storage/yaml/yaml_datastructs.cpp index 3db8e0398..b89a560b3 100644 --- a/radio/src/storage/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs.cpp @@ -28,6 +28,8 @@ #include "yaml_datastructs_x10.cpp" #elif defined(PCBX12S) #include "yaml_datastructs_x12s.cpp" +#elif defined(PCBX7) +#include "yaml_datastructs_x7.cpp" #else #error "Board not supported by YAML storage" #endif diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index b9d21b662..187c69f5c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -126,6 +126,7 @@ static bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, return wf(opaque, s, strlen(s)); } +#if defined(COLORLCD) static uint8_t select_zov(uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; @@ -133,6 +134,7 @@ static uint8_t select_zov(uint8_t* data, uint32_t bitoffs) ZoneOptionValueEnum* p_zovt = (ZoneOptionValueEnum*)data; return *p_zovt; } +#endif static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) { @@ -144,13 +146,13 @@ static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) case MODULE_TYPE_PPM: case MODULE_TYPE_DSM2: case MODULE_TYPE_CROSSFIRE: + case MODULE_TYPE_GHOST: return 1; case MODULE_TYPE_MULTIMODULE: return 2; case MODULE_TYPE_XJT_PXX1: case MODULE_TYPE_R9M_PXX1: case MODULE_TYPE_R9M_LITE_PXX1: - //case MODULE_TYPE_R9M_LITE_PRO_PXX1: return 3; case MODULE_TYPE_SBUS: return 4; @@ -160,6 +162,8 @@ static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) case MODULE_TYPE_R9M_LITE_PRO_PXX2: case MODULE_TYPE_XJT_LITE_PXX2: return 5; + case MODULE_TYPE_AFHDS3: + return 7; } return 0; } From ce75a1a48df406392b0f0148bd2822ab58adeda4 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 2 Aug 2021 18:43:38 +0200 Subject: [PATCH 019/110] Compilation fixes after rebase --- radio/src/gui/colorlcd/layout.h | 34 ++++++++++++------- radio/src/storage/conversions/conversions.cpp | 2 +- .../conversions/conversions_219_220.cpp | 2 +- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/radio/src/gui/colorlcd/layout.h b/radio/src/gui/colorlcd/layout.h index 226e38b72..2418db9a7 100644 --- a/radio/src/gui/colorlcd/layout.h +++ b/radio/src/gui/colorlcd/layout.h @@ -44,19 +44,29 @@ struct LayoutPersistentData { class LayoutFactory { - public: - LayoutFactory(const char * id, const char * name); - const char * getId() const { return id; } - const char * getName() const { return name; } - virtual void drawThumb(BitmapBuffer * dc, uint16_t x, uint16_t y, LcdFlags flags) const = 0; - virtual const ZoneOption * getOptions() const = 0; - virtual WidgetsContainer * create(LayoutPersistentData * persistentData) const = 0; - virtual WidgetsContainer * load(LayoutPersistentData * persistentData) const = 0; - virtual void initPersistentData(LayoutPersistentData * persistentData) const = 0; + public: + LayoutFactory(const char* id, const char* name); - protected: - const char * id; - const char * name; + const char* getId() const { return id; } + const char* getName() const { return name; } + + virtual void drawThumb(BitmapBuffer* dc, uint16_t x, uint16_t y, + LcdFlags flags) const = 0; + + virtual const ZoneOption* getOptions() const = 0; + + virtual WidgetsContainer* create( + LayoutPersistentData* persistentData) const = 0; + + virtual WidgetsContainer* load( + LayoutPersistentData* persistentData) const = 0; + + virtual void initPersistentData(LayoutPersistentData* persistentData, + bool setDefault) const = 0; + + protected: + const char* id; + const char* name; }; WidgetsContainer * loadLayout(const char * name, LayoutPersistentData * persistentData); diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 1a9216b4d..cdd2ebef4 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -22,7 +22,7 @@ #include "opentx.h" #include "conversions.h" -#if defined(COLORLCD) +#if defined(COLORLCD) && !defined(SDCARD_YAML) #include "storage/modelslist.h" #include "storage/sdcard_common.h" diff --git a/radio/src/storage/conversions/conversions_219_220.cpp b/radio/src/storage/conversions/conversions_219_220.cpp index 6227964b5..a05875eaa 100644 --- a/radio/src/storage/conversions/conversions_219_220.cpp +++ b/radio/src/storage/conversions/conversions_219_220.cpp @@ -213,7 +213,7 @@ void convertModelData_219_to_220(ModelData &model) if (defaultLayout) { strcpy(newModel.screenData[0].LayoutId, defaultLayout->getId()); - defaultLayout->initPersistentData(&newModel.screenData[0].layoutData); + defaultLayout->initPersistentData(&newModel.screenData[0].layoutData, true); } #endif free(oldModelAllocated); From 6c73b5ba0a73ed4275facac6b46fff6a21b80477 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 3 Aug 2021 11:00:33 +0200 Subject: [PATCH 020/110] WiP TODO: support conversions from BIN to YAML. --- radio/src/CMakeLists.txt | 4 +- radio/src/storage/conversions/conversions.cpp | 7 ++- radio/src/storage/sdcard_common.h | 7 ++- radio/src/storage/sdcard_raw.cpp | 46 +++++++++++-------- radio/src/storage/sdcard_raw.h | 2 +- 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 60d890678..532e28b32 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -160,7 +160,9 @@ if(${STORAGE} STREQUAL SDCARD) set(SRC ${SRC} storage/sdcard_raw.cpp) add_definitions(-DSDCARD_RAW) elseif(${STORAGE_FORMAT} STREQUAL YAML) - set(SRC ${SRC} storage/sdcard_yaml.cpp) + # TODO: how do we check if the conversions + # should be done from SD card or EEPROM? + set(SRC ${SRC} storage/sdcard_yaml.cpp storage/sdcard_raw.cpp) add_definitions(-DSDCARD_YAML) include(storage/yaml/CMakeLists.txt) #add_subdirectory(storage/yaml) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index cdd2ebef4..b638f9898 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -22,7 +22,7 @@ #include "opentx.h" #include "conversions.h" -#if defined(COLORLCD) && !defined(SDCARD_YAML) +#if defined(COLORLCD) #include "storage/modelslist.h" #include "storage/sdcard_common.h" @@ -99,7 +99,10 @@ void convertRadioData(int version) char path[256]; getModelPath(path, filename); - error = writeFile(path, (uint8_t *)&g_model, sizeof(g_model)); + + //TODO: if YAML is used, output to YAML directly + error = writeFileBin(path, (uint8_t *)&g_model, sizeof(g_model)); + //TODO: what should be done with this error? } diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index 0c2eef0e4..04673ef2d 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -35,8 +35,11 @@ #endif // opens radio.bin or model file -const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version); -const char * writeFile(const char * fullpath, const uint8_t * data, uint16_t size); +const char* openFileBin(const char* fullpath, FIL* file, uint16_t* size, + uint8_t* version); + +const char* writeFileBin(const char* fullpath, const uint8_t* data, + uint16_t size); void getModelPath(char * path, const char * filename); diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index 517346138..ff5a2c8e8 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -23,9 +23,9 @@ #include "modelslist.h" #include "conversions/conversions.h" -const char * writeFile(const char * filename, const uint8_t * data, uint16_t size) +const char * writeFileBin(const char * filename, const uint8_t * data, uint16_t size) { - TRACE("writeFile(%s)", filename); + TRACE("writeFileBin(%s)", filename); FIL file; unsigned char buf[8]; @@ -57,22 +57,32 @@ const char * writeFile(const char * filename, const uint8_t * data, uint16_t siz return NULL; } -const char * writeModel() +// TODO: move to "common" +const char * writeModelBin() { char path[256]; getModelPath(path, g_eeGeneral.currModelFilename); sdCheckAndCreateDirectory(MODELS_PATH); - return writeFile(path, (uint8_t *)&g_model, sizeof(g_model)); + return writeFileBin(path, (uint8_t *)&g_model, sizeof(g_model)); } -const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version) +// TODO: move partly to common +const char * openFile(const char * fullpath, FIL * file) { FRESULT result = f_open(file, fullpath, FA_OPEN_EXISTING | FA_READ); if (result != FR_OK) { return SDCARD_ERROR(result); } + return nullptr; +} + +const char* openFileBin(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version) +{ + const char* err = openFile(fullpath, file); + if (err) return err; + if (f_size(file) < 8) { f_close(file); return STR_INCOMPATIBLE; @@ -81,16 +91,15 @@ const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_ UINT read; char buf[8]; - result = f_read(file, (uint8_t *)buf, sizeof(buf), &read); + FRESULT result = f_read(file, (uint8_t *)buf, sizeof(buf), &read); if ((result != FR_OK) || (read != sizeof(buf))) { f_close(file); return SDCARD_ERROR(result); } - //TODO: move this code into some checkCompatibleFormat() - *version = (uint8_t)buf[4]; - if (*(uint32_t*)&buf[0] != OTX_FOURCC || *version < FIRST_CONV_EEPROM_VER || *version > EEPROM_VER || buf[5] != 'M') { + if (*(uint32_t *)&buf[0] != OTX_FOURCC || *version < FIRST_CONV_EEPROM_VER || + *version > EEPROM_VER || buf[5] != 'M') { f_close(file); return STR_INCOMPATIBLE; } @@ -99,7 +108,8 @@ const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_ return nullptr; } -const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize, uint8_t * version) +static const char *loadFile(const char *fullpath, uint8_t *data, + uint16_t maxsize, uint8_t *version) { FIL file; UINT read; @@ -107,7 +117,7 @@ const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize, u TRACE("loadFile(%s)", fullpath); - const char * err = openFile(fullpath, &file, &size, version); + const char * err = openFileBin(fullpath, &file, &size, version); if (err) return err; @@ -122,7 +132,7 @@ const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize, u return nullptr; } -const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) +const char * readModelBin(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) { char path[256]; getModelPath(path, filename); @@ -130,7 +140,7 @@ const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, u } -const char * loadRadioSettings(const char * path) +const char * loadRadioSettingsBin(const char * path) { uint8_t version; const char * error = loadFile(path, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral), &version); @@ -150,17 +160,17 @@ const char * loadRadioSettings(const char * path) return nullptr; } -const char * loadRadioSettings() +const char * loadRadioSettingsBin() { - return loadRadioSettings(RADIO_SETTINGS_PATH); + return loadRadioSettingsBin(RADIO_SETTINGS_PATH); } -const char * writeGeneralSettings() +const char * writeGeneralSettingsBin() { - return writeFile(RADIO_SETTINGS_PATH, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral)); + return writeFileBin(RADIO_SETTINGS_PATH, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral)); } -void storageCreateModelsList() +void storageCreateModelsListBin() { FIL file; diff --git a/radio/src/storage/sdcard_raw.h b/radio/src/storage/sdcard_raw.h index 1a7c02831..7ac88873b 100644 --- a/radio/src/storage/sdcard_raw.h +++ b/radio/src/storage/sdcard_raw.h @@ -24,6 +24,6 @@ #include "FatFs/ff.h" -const char * openFile(const char * fullpath, FIL* file, uint16_t* size); +//const char * openFileBin(const char * fullpath, FIL* file, uint16_t* size); #endif From 5a367a5221633a3ada42d34083b28aabddba6ef1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 14 Aug 2021 07:53:20 +0200 Subject: [PATCH 021/110] Bin to Yaml conversions --- radio/src/CMakeLists.txt | 5 +- radio/src/myeeprom.h | 6 +- radio/src/storage/conversions/conversions.cpp | 30 ++++++-- radio/src/storage/modelslist.cpp | 75 ++++++++++++------- radio/src/storage/modelslist.h | 5 ++ radio/src/storage/sdcard_common.cpp | 1 + radio/src/storage/sdcard_raw.cpp | 4 +- radio/src/storage/sdcard_raw.h | 15 +++- radio/src/storage/sdcard_yaml.cpp | 43 +++++++++-- radio/src/storage/sdcard_yaml.h | 24 ++++++ 10 files changed, 162 insertions(+), 46 deletions(-) create mode 100644 radio/src/storage/sdcard_yaml.h diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 532e28b32..6423d3575 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -57,7 +57,7 @@ option(TBS_RELEASE "Used to build TBS released firmware" OFF) option(IMRC_RELEASE "Used to build IMRC released firmware" OFF) option(HARDWARE_TRAINER_MULTI "Allow multi trainer" OFF) option(BOOTLOADER "Include Bootloader" ON) -option(YAML_STORAGE "Enable YAML storage" NO) +option(YAML_STORAGE "Enable YAML storage" OFF) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") @@ -160,12 +160,9 @@ if(${STORAGE} STREQUAL SDCARD) set(SRC ${SRC} storage/sdcard_raw.cpp) add_definitions(-DSDCARD_RAW) elseif(${STORAGE_FORMAT} STREQUAL YAML) - # TODO: how do we check if the conversions - # should be done from SD card or EEPROM? set(SRC ${SRC} storage/sdcard_yaml.cpp storage/sdcard_raw.cpp) add_definitions(-DSDCARD_YAML) include(storage/yaml/CMakeLists.txt) - #add_subdirectory(storage/yaml) endif() elseif(${STORAGE} STREQUAL EEPROM) set(SRC ${SRC} storage/eeprom_common.cpp) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 56ab0a560..47b36c773 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -25,7 +25,11 @@ #include "datastructs.h" #include "libopenui/src/bitfield.h" -#define EEPROM_VER 220 +#if defined(SDCARD_YAML) + #define EEPROM_VER 255 +#else + #define EEPROM_VER 220 +#endif #define FIRST_CONV_EEPROM_VER 219 #define GET_MODULE_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index b638f9898..456420c38 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -25,6 +25,8 @@ #if defined(COLORLCD) #include "storage/modelslist.h" #include "storage/sdcard_common.h" +#include "storage/sdcard_raw.h" +#include "storage/sdcard_yaml.h" static void drawProgressScreen(const char* filename, int progress, int total) { @@ -73,9 +75,11 @@ void convertRadioData(int version) if (version == 219) { convertRadioData_219_to_220(g_eeGeneral); storageDirty(EE_GENERAL); - storageCheck(true); } #endif + g_eeGeneral.version = EEPROM_VER; + storageDirty(EE_GENERAL); + storageCheck(true); converted++; #if defined(SIMU) @@ -87,22 +91,32 @@ void convertRadioData(int version) for (auto model_ptr : *category_ptr) { uint8_t model_version; - const char* filename = model_ptr->modelFilename; + char* filename = model_ptr->modelFilename; TRACE("converting '%s' (%d/%d)", filename, converted, to_convert); drawProgressScreen(filename, converted, to_convert); - error = readModel(filename, (uint8_t *)&g_model, sizeof(g_model), &model_version); + error = readModelBin(filename, (uint8_t *)&g_model, sizeof(g_model), &model_version); if (!error) { convertModelData(model_version); +#if defined(SDCARD_YAML) + //TODO: convert filename & output to YAML directly + const char* ext = strrchr(filename, '.'); + if ((ext != nullptr) && !strncmp(ext, MODELS_EXT, 4)) { + memcpy((void*)ext, (void*)YAML_EXT, sizeof(YAML_EXT) - 1); + } + if (!strncmp(filename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME)) { + strncpy(g_eeGeneral.currModelFilename, filename, LEN_MODEL_FILENAME+1); + } + error = writeModelYaml(filename); +#else char path[256]; getModelPath(path, filename); - //TODO: if YAML is used, output to YAML directly error = writeFileBin(path, (uint8_t *)&g_model, sizeof(g_model)); - +#endif //TODO: what should be done with this error? } @@ -114,6 +128,12 @@ void convertRadioData(int version) } } +#if defined(SDCARD_YAML) + modelslist.save(); + storageDirty(EE_GENERAL); + storageCheck(true); +#endif + // reload models list modelslist.clear(); modelslist.load(); diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 4430d2104..b2010d07d 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -136,7 +136,7 @@ bool ModelCell::fetchRfData() uint16_t size; uint8_t version; - const char * err = openFile(buf, &file, &size, &version); + const char * err = openFileBin(buf, &file, &size, &version); if (err || version != EEPROM_VER) return false; FSIZE_t start_offset = f_tell(&file); @@ -299,23 +299,15 @@ void ModelsList::clear() init(); } -bool ModelsList::load() +bool ModelsList::loadTxt() { char line[LEN_MODELS_IDX_LINE+1]; ModelsCategory * category = nullptr; ModelCell * model = nullptr; - if (loaded) - return true; - -#if !defined(SDCARD_YAML) FRESULT result = f_open(&file, RADIO_MODELSLIST_PATH, FA_OPEN_EXISTING | FA_READ); -#else - FRESULT result = f_open(&file, RADIO_MODELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ); -#endif if (result == FR_OK) { -#if !defined(SDCARD_YAML) // TXT reader while (readNextLine(line, LEN_MODELS_IDX_LINE)) { int len = strlen(line); // TODO could be returned by readNextLine @@ -339,7 +331,20 @@ bool ModelsList::load() modelsCount += 1; } } -#else + + f_close(&file); + return true; + } + + return false; +} + +#if defined(SDCARD_YAML) +bool ModelsList::loadYaml() +{ + char line[LEN_MODELS_IDX_LINE+1]; + FRESULT result = f_open(&file, RADIO_MODELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ); + if (result == FR_OK) { // YAML reader TRACE("YAML modelslist reader"); @@ -357,26 +362,45 @@ bool ModelsList::load() break; } - // debug output - //modelslist.dump(); -#endif - f_close(&file); + return true; } + return false; +} +#endif + +bool ModelsList::load() +{ + if (loaded) + return true; + + bool res = false; +#if !defined(SDCARD_YAML) + res = loadTxt(); +#else + FILINFO fno; + if (f_stat(RADIO_MODELSLIST_YAML_PATH, &fno) != FR_OK) { + res = loadTxt(); + } else { + res = loadYaml(); + } +#endif + if (!currentModel) { - if (model) { - currentModel = model; + if (categories.empty()) { + currentCategory = new ModelsCategory("Models"); + categories.push_back(currentCategory); + } else { + currentCategory = *categories.begin(); + if (!currentCategory->empty()) { + currentModel = *currentCategory->begin(); + } } - else { - category = new ModelsCategory("Models"); - categories.push_back(category); - } - currentCategory = category; } loaded = true; - return true; + return res; } void ModelsList::save() @@ -386,10 +410,7 @@ void ModelsList::save() #else FRESULT result = f_open(&file, RADIO_MODELSLIST_YAML_PATH, FA_CREATE_ALWAYS | FA_WRITE); #endif - - if (result != FR_OK) { - return; - } + if (result != FR_OK) return; for (list::iterator it = categories.begin(); it != categories.end(); ++it) { diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 3551f73c5..42c16c400 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -157,6 +157,11 @@ public: protected: FIL file; + + bool loadTxt(); +#if defined(SDCARD_YAML) + bool loadYaml(); +#endif }; extern ModelsList modelslist; diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index 0ffb78699..b0c0de252 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -158,6 +158,7 @@ void storageReadAll() if (!strncmp(g_eeGeneral.ttsLanguage, languagePacks[i]->id, 2)) { currentLanguagePackIdx = i; currentLanguagePack = languagePacks[i]; + break; } } diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index ff5a2c8e8..dcb5c24dc 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -170,7 +170,8 @@ const char * writeGeneralSettingsBin() return writeFileBin(RADIO_SETTINGS_PATH, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral)); } -void storageCreateModelsListBin() +#if !defined(SDCARD_YAML) +void storageCreateModelsList() { FIL file; @@ -180,3 +181,4 @@ void storageCreateModelsListBin() f_close(&file); } } +#endif diff --git a/radio/src/storage/sdcard_raw.h b/radio/src/storage/sdcard_raw.h index 7ac88873b..09d904a45 100644 --- a/radio/src/storage/sdcard_raw.h +++ b/radio/src/storage/sdcard_raw.h @@ -24,6 +24,19 @@ #include "FatFs/ff.h" -//const char * openFileBin(const char * fullpath, FIL* file, uint16_t* size); +#if !defined(SDCARD_YAML) +#define writeModel writeModelBin +#define loadRadioSettings loadRadioSettingsBin +#define writeGeneralSettings writeGeneralSettingsBin +#define readModel readModelBin +#endif + +const char* loadRadioSettingsBin(); +const char * writeGeneralSettingsBin(); + +const char* openFileBin(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version); +const char* readModelBin(const char* filename, uint8_t* buffer, uint32_t size, + uint8_t* version); +const char * writeModelBin(); #endif diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index a6cc1c7a3..add78d309 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -22,6 +22,7 @@ #include "opentx.h" #include "storage.h" #include "sdcard_common.h" +#include "sdcard_raw.h" #include "modelslist.h" @@ -74,8 +75,7 @@ void storageCreateModelsList() // SDCARD storage interface // - -const char * loadRadioSettings() +const char * loadRadioSettingsYaml() { // YAML reader TRACE("YAML radio settings reader"); @@ -86,6 +86,16 @@ const char * loadRadioSettings() return readYamlFile(RADIO_SETTINGS_YAML_PATH, YamlTreeWalker::get_parser_calls(), &tree); } +const char * loadRadioSettings() +{ + FILINFO fno; + if (f_stat(RADIO_SETTINGS_YAML_PATH, &fno) != FR_OK) { + return loadRadioSettingsBin(); + } + + return loadRadioSettingsYaml(); +} + struct yaml_writer_ctx { FIL* file; FRESULT result; @@ -133,7 +143,7 @@ const char * writeGeneralSettings() } -const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) +const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) { // YAML reader TRACE("YAML model reader"); @@ -159,7 +169,7 @@ const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, u // wipe memory before reading YAML memset(buffer,0,size); - //#if defined(FLIGHT_MODES) && defined(GVARS) +#if defined(FLIGHT_MODES) && defined(GVARS) // reset GVars to default values // Note: taken from opentx.cpp::modelDefault() //TODO: new func in gvars @@ -168,19 +178,33 @@ const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, u g_model.flightModeData[p].gvars[i] = GVAR_MAX+1; } } - //#endif +#endif *version = 255; // max version number return readYamlFile(path, YamlTreeWalker::get_parser_calls(), &tree); } -const char * writeModel() +const char* readModel(const char* filename, uint8_t* buffer, uint32_t size, + uint8_t* version) +{ + const char* ext = strrchr(filename, '.'); + if (ext != nullptr) { + if (!strncmp(ext, YAML_EXT, 4)) { + return readModelYaml(filename, buffer, size, version); + } + + return readModelBin(filename, buffer, size, version); + } + return nullptr; +} + +const char * writeModelYaml(const char* filename) { // YAML reader TRACE("YAML model writer"); char path[256]; - getModelPath(path, g_eeGeneral.currModelFilename); + getModelPath(path, filename); FIL file; @@ -206,3 +230,8 @@ const char * writeModel() f_close(&file); return NULL; } + +const char * writeModel() +{ + return writeModelYaml(g_eeGeneral.currModelFilename); +} diff --git a/radio/src/storage/sdcard_yaml.h b/radio/src/storage/sdcard_yaml.h new file mode 100644 index 000000000..9b39edb7e --- /dev/null +++ b/radio/src/storage/sdcard_yaml.h @@ -0,0 +1,24 @@ +/* + * 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 + +const char * writeModelYaml(const char* filename); From 985a8760bb87bb21e22aeab8f09eeb2385de6342 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 17 Aug 2021 12:04:49 +0200 Subject: [PATCH 022/110] WiP --- radio/src/datastructs.h | 41 +- radio/src/gui/128x64/CMakeLists.txt | 8 +- radio/src/gui/128x64/model_select_sd.cpp | 459 ++++++++++++++++++ radio/src/gui/128x64/model_setup.cpp | 9 + radio/src/gui/common/stdlcd/model_notes.cpp | 4 + .../src/gui/common/stdlcd/radio_hardware.cpp | 2 + radio/src/gui/common/stdlcd/view_text.cpp | 4 + radio/src/storage/conversions/conversions.cpp | 2 +- radio/src/storage/sdcard_common.cpp | 20 + radio/src/storage/sdcard_common.h | 7 + .../src/storage/yaml/yaml_datastructs_x7.cpp | 5 +- 11 files changed, 550 insertions(+), 11 deletions(-) create mode 100644 radio/src/gui/128x64/model_select_sd.cpp diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index f5ea7944d..89c623f12 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -763,7 +763,8 @@ PACK(struct TrainerData { NOBACKUP(uint8_t spare5:1 SKIP); \ NOBACKUP(uint8_t blOffBright:7); \ NOBACKUP(char bluetoothName[LEN_BLUETOOTH_NAME]); -#elif defined(PCBTARANIS) //|| defined(PCBNV14) + #define CURR_MODEL_FILENAME +#elif defined(PCBTARANIS) #if defined(STORAGE_BLUETOOTH) #define BLUETOOTH_FIELDS \ uint8_t spare5 SKIP; \ @@ -780,10 +781,13 @@ PACK(struct TrainerData { swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]; \ char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME]; \ - char currModelFilename[LEN_MODEL_FILENAME+1]; \ BLUETOOTH_FIELDS + #if defined(SDCARD_YAML) + #define CURR_MODEL_FILENAME char currModelFilename[LEN_MODEL_FILENAME+1] + #endif #else #define EXTRA_GENERAL_FIELDS + #define CURR_MODEL_FILENAME #endif #if defined(COLORLCD) && !defined(BACKUP) @@ -879,6 +883,9 @@ PACK(struct RadioData { GYRO_FIELDS NOBACKUP(int8_t uartSampleMode:2); // See UartSampleModes +#if defined(PCBTARANIS) + CURR_MODEL_FILENAME; +#endif }); #undef SWITCHES_WARNING_DATA @@ -985,19 +992,39 @@ static inline void check_struct() CHKSIZE(TrainerData, 16); #if defined(PCBXLITES) - CHKSIZE(RadioData, 861); + #if !defined(SDCARD_YAML) + CHKSIZE(RadioData, 861); + #else + CHKSIZE(RadioData, 878); + #endif CHKSIZE(ModelData, 6157); #elif defined(PCBXLITE) - CHKSIZE(RadioData, 859); + #if !defined(SDCARD_YAML) + CHKSIZE(RadioData, 859); + #else + CHKSIZE(RadioData, 876); + #endif CHKSIZE(ModelData, 6157); #elif defined(PCBX7) - CHKSIZE(RadioData, 865); + #if !defined(SDCARD_YAML) + CHKSIZE(RadioData, 865); + #else + CHKSIZE(RadioData, 882); + #endif CHKSIZE(ModelData, 6157); #elif defined(PCBX9E) - CHKSIZE(RadioData, 961); + #if !defined(SDCARD_YAML) + CHKSIZE(RadioData, 961); + #else + CHKSIZE(RadioData, 978); + #endif CHKSIZE(ModelData, 6614); #elif defined(PCBX9D) || defined(PCBX9DP) - CHKSIZE(RadioData, 899); + #if !defined(SDCARD_YAML) + CHKSIZE(RadioData, 899); + #else + CHKSIZE(RadioData, 916); + #endif CHKSIZE(ModelData, 6604); #elif defined(PCBHORUS) CHKSIZE(RadioData, 902); diff --git a/radio/src/gui/128x64/CMakeLists.txt b/radio/src/gui/128x64/CMakeLists.txt index eabf0fd51..1fe1b2fca 100644 --- a/radio/src/gui/128x64/CMakeLists.txt +++ b/radio/src/gui/128x64/CMakeLists.txt @@ -1,3 +1,9 @@ +if(${STORAGE} STREQUAL SDCARD) + set(MODEL_SELECT_SRC model_select_sd.cpp) +else() + set(MODEL_SELECT_SRC model_select.cpp) +endif() + set(GUI_SRC ${GUI_SRC} lcd.cpp @@ -5,8 +11,8 @@ set(GUI_SRC popups.cpp widgets.cpp startup_shutdown.cpp + ${MODEL_SELECT_SRC} menu_model.cpp - model_select.cpp model_setup.cpp model_failsafe.cpp model_logical_switches.cpp diff --git a/radio/src/gui/128x64/model_select_sd.cpp b/radio/src/gui/128x64/model_select_sd.cpp new file mode 100644 index 000000000..6f96aabe2 --- /dev/null +++ b/radio/src/gui/128x64/model_select_sd.cpp @@ -0,0 +1,459 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include "opentx.h" +#include "storage/modelslist.h" + + +#define CATEGORIES_WIDTH 62 +#define MODELSEL_W 62 +#define PHASE_ONE_FIRST_LINE (1 + 1 * FH) + +enum ModelSelectMode { + MODE_SELECT_MODEL, + MODE_RENAME_CATEGORY, + MODE_MOVE_MODEL, +}; + +enum ModelDeleteMode { + MODE_DELETE_MODEL, + MODE_DELETE_CATEGORY, +}; + +struct { + uint8_t selectMode, deleteMode; + ModelsCategory * currentCategory = nullptr; + int currentCategoryIndex; + int16_t subModelIndex = -1; + bool modelSelected = false; + ModelCell * currentModel = nullptr; + ModelCell * selectedModel = nullptr; + tmr10ms_t preEnterTime; + bool preEnterValid = false; + bool categorySelectMode = false; + uint16_t categoriesVerticalOffset = 0; + uint16_t categoriesVerticalPosition = 0; +} modelSelect; + +bool eeModelExists(uint8_t id) +{ + int index = 0; + + for (ModelsCategory::iterator it = modelSelect.currentCategory->begin(); it != modelSelect.currentCategory->end(); ++it, ++index) { + if (id == index){ + return true; + } + } + + return false; +} + +void setCurrentModel(unsigned int index) +{ + std::list::iterator it = modelSelect.currentCategory->begin(); + std::advance(it, index); + modelSelect.currentModel = *it; +} + +void getSelectedModel(unsigned int index) +{ + std::list::iterator it = modelSelect.currentCategory->begin(); + std::advance(it, index); + modelSelect.selectedModel = *it; +} + +void setCurrentCategory(unsigned int index) +{ + modelSelect.currentCategoryIndex = index; + const std::list& cats = modelslist.getCategories(); + std::list::const_iterator it = cats.begin(); + std::advance(it, index); + modelSelect.currentCategory = *it; + modelSelect.categoriesVerticalPosition = index; + modelSelect.categoriesVerticalOffset = limit(modelSelect.categoriesVerticalPosition - 4, modelSelect.categoriesVerticalOffset, min(modelSelect.categoriesVerticalPosition, max(0, cats.size() - 5))); +} + +void initModelsList() +{ + modelslist.load(); + + modelSelect.categoriesVerticalOffset = 0; + bool found = false; + int index = 0; + const std::list& cats = modelslist.getCategories(); + for (std::list::const_iterator it = cats.begin(); it != cats.end(); ++it, ++index) { + if (*it == modelslist.getCurrentCategory()) { + setCurrentCategory(index); + found = true; + break; + } + } + if (!found) { + setCurrentCategory(0); + } + + menuVerticalOffset = 0; + found = false; + index = 0; + for (ModelsCategory::iterator it = modelSelect.currentCategory->begin(); it != modelSelect.currentCategory->end(); ++it, ++index) { + if (*it == modelslist.getCurrentModel()) { + setCurrentModel(index); + menuVerticalPosition = index; + found = true; + break; + } + } + if (!found) { + modelslist.addModel(modelSelect.currentCategory, g_eeGeneral.currModelFilename); + setCurrentModel(0); + modelslist.setCurrentModel(modelSelect.currentModel); + modelslist.save(); + storageDirty(EE_GENERAL); + storageDirty(EE_MODEL); + storageCheck(true); + } +} + + +void onModelSelectMenu(const char * result) +{ + if (result == STR_SELECT_MODEL) { + setCurrentModel(menuVerticalPosition); + storageFlushCurrentModel(); + storageCheck(true); + memcpy(g_eeGeneral.currModelFilename, modelSelect.currentModel->modelFilename, LEN_MODEL_FILENAME); + modelslist.setCurrentModel(modelSelect.currentModel); + loadModel(g_eeGeneral.currModelFilename, true); + modelslist.setCurrentCategory(modelSelect.currentCategory); + modelslist.save(); +#if defined(INTERNAL_MODULE_CRSF) + if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) { + crossfireTurnOnRf(); + bkregSetStatusFlag(CRSF_SET_MODEL_ID_PENDING); + } + else { + crossfireTurnOffRf(false); + } +#endif + storageDirty(EE_GENERAL); + storageCheck(true); + } + else if (result == STR_DELETE_MODEL) { + getSelectedModel(menuVerticalPosition); + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); + SET_WARNING_INFO(modelSelect.selectedModel->modelName, LEN_MODEL_NAME, 0); + modelSelect.deleteMode = MODE_DELETE_MODEL; + } + else if (result == STR_CREATE_MODEL) { + storageCheck(true); + modelslist.addModel(modelSelect.currentCategory, createModel()); + modelSelect.selectMode = MODE_SELECT_MODEL; + setCurrentModel(modelSelect.currentCategory->size() - 1 ); + modelslist.setCurrentModel(modelSelect.currentModel); + modelslist.onNewModelCreated(modelSelect.currentModel, &g_model); + modelslist.setCurrentCategory(modelSelect.currentCategory); + modelslist.save(); +#if defined(INTERNAL_MODULE_CRSF) + if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) { + crossfireTurnOnRf(); + bkregSetStatusFlag(CRSF_SET_MODEL_ID_PENDING); + } + else { + crossfireTurnOffRf(false); + } +#endif + storageDirty(EE_GENERAL); + storageCheck(true); + menuVerticalPosition = modelSelect.currentCategory->size() - 1; + } + else if (result == STR_DUPLICATE_MODEL) { + char duplicatedFilename[LEN_MODEL_FILENAME + 1]; + setCurrentModel(menuVerticalPosition); + memcpy(duplicatedFilename, modelSelect.currentModel->modelFilename, sizeof(duplicatedFilename)); + if (findNextFileIndex(duplicatedFilename, LEN_MODEL_FILENAME, MODELS_PATH)) { + sdCopyFile(modelSelect.currentModel->modelFilename, MODELS_PATH, duplicatedFilename, MODELS_PATH); + ModelCell* dup_model = modelslist.addModel(modelSelect.currentCategory, duplicatedFilename); + dup_model->fetchRfData(); + menuVerticalPosition = modelSelect.currentCategory->size() - 1; + } + else { + POPUP_WARNING("Invalid File"); + } + } + else if (result == STR_MOVE_MODEL) { + setCurrentModel(menuVerticalPosition); + modelSelect.selectMode = MODE_MOVE_MODEL; + modelSelect.categorySelectMode = true; + } + else if (result == STR_CREATE_CATEGORY) { + modelSelect.currentCategory = modelslist.createCategory(); + setCurrentCategory(modelslist.getCategories().size() - 1); + modelslist.save(); + storageDirty(EE_GENERAL); + storageCheck(true); + } + else if (result == STR_RENAME_CATEGORY) { + modelSelect.selectMode = MODE_RENAME_CATEGORY; + s_editMode = EDIT_MODIFY_STRING; + editNameCursorPos = 0; + } + else if (result == STR_DELETE_CATEGORY) { + if (modelSelect.currentCategory->size() > 0){ + POPUP_WARNING(STR_DELETE_ERROR); + SET_WARNING_INFO(STR_CAT_NOT_EMPTY, sizeof(TR_CAT_NOT_EMPTY), 0); + } + else { + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); + SET_WARNING_INFO(modelSelect.currentCategory->name, LEN_MODEL_FILENAME, 0); + modelSelect.deleteMode = MODE_DELETE_CATEGORY; + } + } +} + +void menuModelSelect(event_t event) +{ + int8_t old_editMode = s_editMode; + + if (warningResult) { + warningResult = 0; + + if (modelSelect.deleteMode == MODE_DELETE_CATEGORY) { + TRACE("DELETE CATEGORY"); + modelslist.removeCategory(modelSelect.currentCategory); + modelslist.save(); + setCurrentCategory(modelSelect.currentCategoryIndex > 0 ? modelSelect.currentCategoryIndex-1 : modelSelect.currentCategoryIndex); + } + else if (modelSelect.deleteMode == MODE_DELETE_MODEL) { + int modelIndex = menuVerticalPosition; + setCurrentModel(modelIndex); + modelslist.removeModel(modelSelect.currentCategory, modelSelect.currentModel); + modelSelect.selectMode = 0; + menuVerticalPosition = modelSelect.currentCategory->size()-1; + } + } + + const std::list& cats = modelslist.getCategories(); + + title(STR_MENUMODELSEL); + drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), 0); + + event_t _event_ = ((event==EVT_KEY_BREAK(KEY_ENTER) || event==EVT_KEY_LONG(KEY_ENTER)) ? 0 : event); + check_submenu_simple(_event_, modelSelect.currentCategory ? modelSelect.currentCategory->size() : 30); + + switch (event) { + case EVT_ENTRY: + modelSelect.selectMode = MODE_SELECT_MODEL; + initModelsList(); + modelSelect.preEnterValid = false; + modelSelect.categorySelectMode = false; + break; + case EVT_KEY_BREAK(KEY_ENTER): + if (modelSelect.selectMode == MODE_MOVE_MODEL) { + modelSelect.selectMode = MODE_SELECT_MODEL; + modelSelect.categorySelectMode = false; + } + killEvents(event); + break; + case EVT_KEY_FIRST(KEY_EXIT): + switch (modelSelect.selectMode) { + case MODE_MOVE_MODEL: + modelSelect.selectMode = MODE_SELECT_MODEL; + break; + } + break; + case EVT_KEY_FIRST(KEY_ENTER): + if (!modelSelect.preEnterValid) { + modelSelect.preEnterValid = true; + modelSelect.preEnterTime = get_tmr10ms(); + } + else { + modelSelect.preEnterValid = false; + modelSelect.categorySelectMode = !modelSelect.categorySelectMode; + // if (modelSelect.categorySelectMode) + // AUDIO_CATEGORY_ENABLE(); + // else + // AUDIO_CATEGORY_DISABLE(); + } + break; +#if 0 + case EVT_KEY_BREAK(KEY_PAGE): + { + if (modelSelect.categorySelectMode) { + if (modelSelect.categoriesVerticalPosition >= cats.size() - 1) + modelSelect.categoriesVerticalPosition = 0; + else + modelSelect.categoriesVerticalPosition += 1; + + if (modelSelect.selectMode == MODE_SELECT_MODEL) { + setCurrentCategory(modelSelect.categoriesVerticalPosition); + menuVerticalPosition = 0; + } + if (modelSelect.selectMode == MODE_MOVE_MODEL) { + ModelsCategory * previous_category = modelSelect.currentCategory; + ModelCell * model = modelSelect.currentModel; + setCurrentCategory(modelSelect.categoriesVerticalPosition); + modelslist.moveModel(model, previous_category, modelSelect.currentCategory); + menuVerticalPosition = modelSelect.currentCategory->size()-1; + } + + modelSelect.subModelIndex = -1; + modelSelect.modelSelected = false; + killEvents(event); + } + else { + chainMenu(menuModelSetup); + } + break; + } + + case EVT_KEY_LONG(KEY_PAGE): + { + if (modelSelect.categorySelectMode) { + if (modelSelect.categoriesVerticalPosition == 0) + modelSelect.categoriesVerticalPosition = cats.size() - 1; + else + modelSelect.categoriesVerticalPosition -= 1; + + if (modelSelect.selectMode == MODE_SELECT_MODEL) { + setCurrentCategory(modelSelect.categoriesVerticalPosition); + menuVerticalPosition = 0; + } + if (modelSelect.selectMode == MODE_MOVE_MODEL) { + ModelsCategory * previous_category = modelSelect.currentCategory; + ModelCell * model = modelSelect.currentModel; + setCurrentCategory(modelSelect.categoriesVerticalPosition); + modelslist.moveModel(model, previous_category, modelSelect.currentCategory); + } + + modelSelect.subModelIndex = -1; + modelSelect.modelSelected = false; + killEvents(event); + } + else { + chainMenu(menuTabModel[DIM(menuTabModel)-1]); + killEvents(event); + } + break; + } +#endif + case EVT_KEY_LONG(KEY_ENTER): + if (modelSelect.selectMode == MODE_SELECT_MODEL) { + killEvents(event); + if (!modelSelect.modelSelected && !modelSelect.currentCategory->empty()) { + POPUP_MENU_ADD_ITEM(STR_SELECT_MODEL); + } + POPUP_MENU_ADD_ITEM(STR_CREATE_MODEL); + if (!modelSelect.currentCategory->empty()) { + if (modelSelect.currentModel) { + POPUP_MENU_ADD_ITEM(STR_DUPLICATE_MODEL); + POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); + } + if (!modelSelect.modelSelected) { + POPUP_MENU_ADD_ITEM(STR_DELETE_MODEL); + } + } + POPUP_MENU_ADD_ITEM(STR_CREATE_CATEGORY); + POPUP_MENU_ADD_ITEM(STR_RENAME_CATEGORY); + if (cats.size() > 1) { + POPUP_MENU_ADD_ITEM(STR_DELETE_CATEGORY); + } + POPUP_MENU_START(onModelSelectMenu); + } + killEvents(event); + break; + default: + break; + } + + if (modelSelect.preEnterValid && (get_tmr10ms() - modelSelect.preEnterTime) > 50) { + modelSelect.preEnterValid = false; + } + + int index = 0; + coord_t y = 18; + + drawVerticalScrollbar(CATEGORIES_WIDTH - 1, y - 1, 4 * (FH + 7) - 5, modelSelect.categoriesVerticalOffset, cats.size(), 5); + + // Categories + for (std::list::const_iterator it = cats.begin(); it != cats.end(); ++it, ++index) { + if (index >= modelSelect.categoriesVerticalOffset && index < modelSelect.categoriesVerticalOffset + 5) { + coord_t y = MENU_HEADER_HEIGHT * 2 + 1 + (index - modelSelect.categoriesVerticalOffset) * FH * 4 / 3; + uint8_t k = index ; + + if (modelSelect.selectMode == MODE_RENAME_CATEGORY && modelSelect.currentCategory == *it) { + lcdDrawSolidFilledRect(9, y, MODELSEL_W - 1 - 9, 7); + lcdDrawRect(8, y - 1, MODELSEL_W - 1 - 7, 9, DOTTED); + editName(4, y, modelSelect.currentCategory->name, sizeof(modelSelect.currentCategory->name), event, 1, 0, old_editMode); + if (s_editMode == 0 || event == EVT_KEY_BREAK(KEY_EXIT)) { + modelslist.save(); + modelSelect.selectMode = MODE_SELECT_MODEL; + } + } + else { + lcdDrawSizedText(2, y, (*it)->name, strlen((*it)->name), ((modelSelect.categoriesVerticalPosition == k) ? INVERS : 0)); + } + if (modelSelect.selectMode == MODE_MOVE_MODEL && modelSelect.categoriesVerticalPosition == k) { + lcdDrawSolidFilledRect(9, y, MODELSEL_W - 1 - 9, 7); + lcdDrawRect(8, y - 1, MODELSEL_W - 1 - 7, 9, modelSelect.selectMode == COPY_MODE ? SOLID : DOTTED); + } + } + } + + // Models + index = 0; + bool selected = false; + bool current = false; + + for (uint8_t i = 0; i < modelSelect.currentCategory->size(); i++) { + coord_t y = MENU_HEADER_HEIGHT*2 + 1 + i*FH; + uint8_t k = i+menuVerticalOffset; + + if (k >= modelSelect.currentCategory->size()) + break; + + std::list::iterator it = modelSelect.currentCategory->begin(); + std::advance(it, k); + + selected = ((modelSelect.selectMode == MODE_SELECT_MODEL || modelSelect.selectMode == MODE_MOVE_MODEL) && k == menuVerticalPosition); + current = !strncmp((*it)->modelFilename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME); + + if (current) { + lcdDrawChar(9 * FW + 11, y, '*'); + lcdDrawText(9 * FW + 18, y, g_model.header.name, LEADING0 | ((selected) ? INVERS : 0)); + modelSelect.subModelIndex = k; + } + else { + lcdDrawText(9 * FW + 18, y, (*it)->modelName, LEADING0 | ((selected) ? INVERS : 0)); + } + + y += 16; + + if (selected) { + lcdDrawText(5, LCD_H - FH - 1, (*it)->modelFilename, SMLSIZE); + } + } + + if (modelSelect.subModelIndex == menuVerticalPosition) { + modelSelect.modelSelected = true; + } + else { + modelSelect.modelSelected = false; + } +} + diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 60c2db265..68b0dd210 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -21,6 +21,11 @@ #include "opentx.h" +#if !defined(EEPROM) +#include "storage/sdcard_common.h" +#include "storage/modelslist.h" +#endif + // TODO find why we need this (for REGISTER at least) #if defined(PCBXLITE) #define EVT_BUTTON_PRESSED() EVT_KEY_FIRST(KEY_ENTER) @@ -1414,7 +1419,11 @@ void menuModelSetup(event_t event) } else if (event == EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); +#if defined(EEPROM) uint8_t newVal = findNextUnusedModelId(g_eeGeneral.currModel, moduleIdx); +#else + uint8_t newVal = modelslist.findNextUnusedModelId(moduleIdx); +#endif if (newVal != g_model.header.modelId[moduleIdx]) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx] = newVal; storageDirty(EE_MODEL); diff --git a/radio/src/gui/common/stdlcd/model_notes.cpp b/radio/src/gui/common/stdlcd/model_notes.cpp index 9eabf3153..e8388043f 100644 --- a/radio/src/gui/common/stdlcd/model_notes.cpp +++ b/radio/src/gui/common/stdlcd/model_notes.cpp @@ -25,8 +25,12 @@ void menuModelNotes(event_t event) { if (event == EVT_ENTRY) { strcpy(reusableBuffer.viewText.filename, MODELS_PATH "/"); +#if defined(EEPROM) char *buf = strcat_modelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)], g_eeGeneral.currModel); strcpy(buf, TEXT_EXT); +#else + strcat_currentmodelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)]); +#endif } menuTextView(event); diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index e1a7c08aa..23a8b86bb 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -695,6 +695,7 @@ void menuRadioHardware(event_t event) } break; +#if defined(EEPROM) case ITEM_RADIO_BACKUP_EEPROM: if (LCD_W < 212) lcdDrawText(LCD_W / 2, y, BUTTON(STR_EEBACKUP), attr | CENTERED); @@ -716,6 +717,7 @@ void menuRadioHardware(event_t event) POPUP_CONFIRMATION(STR_CONFIRMRESET, onFactoryResetConfirm); } break; +#endif } } } diff --git a/radio/src/gui/common/stdlcd/view_text.cpp b/radio/src/gui/common/stdlcd/view_text.cpp index 6c3ebff08..5dbc23c9e 100644 --- a/radio/src/gui/common/stdlcd/view_text.cpp +++ b/radio/src/gui/common/stdlcd/view_text.cpp @@ -34,8 +34,12 @@ void readModelNotes() LED_ERROR_BEGIN(); strcpy(reusableBuffer.viewText.filename, MODELS_PATH "/"); +#if defined(EEPROM) char *buf = strcat_modelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)], g_eeGeneral.currModel); strcpy(buf, TEXT_EXT); +#else + strcat_currentmodelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)]); +#endif waitKeysReleased(); event_t event = EVT_ENTRY; diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 456420c38..8f8666cf7 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -22,7 +22,7 @@ #include "opentx.h" #include "conversions.h" -#if defined(COLORLCD) +#if defined(SDCARD_RAW) || defined(SDCARD_YAML) #include "storage/modelslist.h" #include "storage/sdcard_common.h" #include "storage/sdcard_raw.h" diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index b0c0de252..b2d2aadff 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -26,6 +26,10 @@ #include "conversions/conversions.h" #include "model_init.h" +//#if !defined(EEPROM_SDCARD) +ModelHeader modelHeaders[MAX_MODELS]; +//#endif + // defined either in sdcard_raw.cpp or sdcard_yaml.cpp void storageCreateModelsList(); @@ -183,3 +187,19 @@ void storageReadAll() } } +void checkModelIdUnique(uint8_t index, uint8_t module) +{ + if (isModuleXJTD8(module)) + return; + + char * warn_buf = reusableBuffer.moduleSetup.msg; + + // cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 + size_t warn_buf_len = sizeof(reusableBuffer.moduleSetup.msg) - WARNING_LINE_LEN - 2; + if (!modelslist.isModelIdUnique(module,warn_buf,warn_buf_len)) { + if (warn_buf[0] != 0) { + POPUP_WARNING(STR_MODELIDUSED); + SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.moduleSetup.msg), 0); + } + } +} diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index 04673ef2d..fb3d6192c 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -34,6 +34,10 @@ #define MODEL_FILENAME_PATTERN "model.yml" #endif +//#if !defined(EEPROM) +extern ModelHeader modelHeaders[MAX_MODELS]; +//#endif + // opens radio.bin or model file const char* openFileBin(const char* fullpath, FIL* file, uint16_t* size, uint8_t* version); @@ -53,4 +57,7 @@ const char * writeGeneralSettings(); const char * loadRadioSettings(const char * path); const char * loadRadioSettings(); + +void checkModelIdUnique(uint8_t index, uint8_t module); + #endif // _SDCARD_RAW_H_ diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index ac621d122..fc2de09a6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -261,8 +261,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "adjustRTC", 1 ), YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_UNSIGNED( "splashMode", 1 ), - YAML_PADDING( 2 ), + YAML_SIGNED( "splashMode", 3 ), YAML_SIGNED( "hapticMode", 2 ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), @@ -310,6 +309,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { From 7da2615d4fe245e07b82aa4bae88d06010405cdf Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 28 Aug 2021 09:48:42 +0200 Subject: [PATCH 023/110] yaml: do not copy '\r' or '\n' into attribute name --- radio/src/storage/yaml/yaml_parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/storage/yaml/yaml_parser.cpp b/radio/src/storage/yaml/yaml_parser.cpp index 69794505f..c782f2329 100644 --- a/radio/src/storage/yaml/yaml_parser.cpp +++ b/radio/src/storage/yaml/yaml_parser.cpp @@ -148,7 +148,7 @@ YamlParser::parse(const char* buffer, unsigned int size) state = ps_AttrSP; break; } - if (*c != ':') + if ((*c != ':') && (*c != '\r') && (*c != '\n')) CONCAT_STR(scratch_buf, scratch_len, *c); // trap case ps_AttrSP: From 82fec817f1f5b50f12d7d7f473bd17fcc51d8cd4 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 28 Aug 2021 09:49:54 +0200 Subject: [PATCH 024/110] yaml_ use EEPROM_VER = 221 --- radio/src/myeeprom.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 47b36c773..23afbc136 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -26,7 +26,7 @@ #include "libopenui/src/bitfield.h" #if defined(SDCARD_YAML) - #define EEPROM_VER 255 + #define EEPROM_VER 221 #else #define EEPROM_VER 220 #endif From faaa5b928a0b310e4678f26c484895681c77aed2 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 28 Aug 2021 09:50:19 +0200 Subject: [PATCH 025/110] define away COLORLCD specifics --- radio/src/storage/conversions/conversions.cpp | 6 ++++++ radio/src/storage/sdcard_common.cpp | 3 +++ 2 files changed, 9 insertions(+) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 8f8666cf7..f3b0ce343 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -30,6 +30,7 @@ static void drawProgressScreen(const char* filename, int progress, int total) { +#if defined(COLORLCD) OpenTxTheme* l_theme = static_cast(theme); lcd->reset(); @@ -46,18 +47,23 @@ static void drawProgressScreen(const char* filename, int progress, int total) WDG_RESET(); lcdRefresh(); +#else + // TODO: BW progress screen +#endif } void convertRadioData(int version) { TRACE("convertRadioData(%d)", version); +#if defined(COLORLCD) // the theme has not been loaded before static_cast(theme)->load(); // Init backlight mode before entering alert screens requiredBacklightBright = BACKLIGHT_FORCED_ON; g_eeGeneral.blOffBright = 20; +#endif RAISE_ALERT(STR_STORAGE_WARNING, STR_SDCARD_CONVERSION_REQUIRE, NULL, AU_NONE); diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index b2d2aadff..d53fa9ef6 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -187,6 +187,7 @@ void storageReadAll() } } +#if !defined(COLORLCD) void checkModelIdUnique(uint8_t index, uint8_t module) { if (isModuleXJTD8(module)) @@ -203,3 +204,5 @@ void checkModelIdUnique(uint8_t index, uint8_t module) } } } +#endif + From e48762e453b008df6414a535b1a24b07e7855166 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 28 Aug 2021 09:50:53 +0200 Subject: [PATCH 026/110] use proper define for KEY_PAGE defined --- radio/src/gui/128x64/model_select_sd.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_select_sd.cpp b/radio/src/gui/128x64/model_select_sd.cpp index 6f96aabe2..4961220be 100644 --- a/radio/src/gui/128x64/model_select_sd.cpp +++ b/radio/src/gui/128x64/model_select_sd.cpp @@ -291,7 +291,8 @@ void menuModelSelect(event_t event) // AUDIO_CATEGORY_DISABLE(); } break; -#if 0 + +#if defined(KEYS_GPIO_REG_PAGE) case EVT_KEY_BREAK(KEY_PAGE): { if (modelSelect.categorySelectMode) { From 7e110ce4b17deb561cb1ddfa8d51c0664fc22cb9 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 28 Aug 2021 09:55:05 +0200 Subject: [PATCH 027/110] Add empty CURR_MODEL_FILENAME in case SD card storage is not used --- radio/src/datastructs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 89c623f12..e33784736 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -784,6 +784,8 @@ PACK(struct TrainerData { BLUETOOTH_FIELDS #if defined(SDCARD_YAML) #define CURR_MODEL_FILENAME char currModelFilename[LEN_MODEL_FILENAME+1] + #else + #define CURR_MODEL_FILENAME #endif #else #define EXTRA_GENERAL_FIELDS From 20a1fa38c4f60fbbe207c993ec08d61e102b94d5 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 28 Aug 2021 10:00:57 +0200 Subject: [PATCH 028/110] Enable YAML storage by default --- radio/src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 6423d3575..328cdd152 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -57,7 +57,7 @@ option(TBS_RELEASE "Used to build TBS released firmware" OFF) option(IMRC_RELEASE "Used to build IMRC released firmware" OFF) option(HARDWARE_TRAINER_MULTI "Allow multi trainer" OFF) option(BOOTLOADER "Include Bootloader" ON) -option(YAML_STORAGE "Enable YAML storage" OFF) +option(YAML_STORAGE "Enable YAML storage" ON) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") From 630e6918eae1bc5017f03c05840f1e1e5ec64c33 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 28 Aug 2021 11:57:44 +0200 Subject: [PATCH 029/110] Added more B/W targets --- radio/src/storage/yaml/CMakeLists.txt | 14 + radio/src/storage/yaml/yaml_datastructs.cpp | 20 +- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 762 ++++++++++++++++ .../storage/yaml/yaml_datastructs_x9dp.cpp | 762 ++++++++++++++++ .../src/storage/yaml/yaml_datastructs_x9e.cpp | 812 ++++++++++++++++++ .../storage/yaml/yaml_datastructs_x9lite.cpp | 742 ++++++++++++++++ .../storage/yaml/yaml_datastructs_x9lites.cpp | 752 ++++++++++++++++ .../storage/yaml/yaml_datastructs_xlite.cpp | 749 ++++++++++++++++ .../storage/yaml/yaml_datastructs_xlites.cpp | 753 ++++++++++++++++ 9 files changed, 5363 insertions(+), 3 deletions(-) create mode 100644 radio/src/storage/yaml/yaml_datastructs_x9d.cpp create mode 100644 radio/src/storage/yaml/yaml_datastructs_x9dp.cpp create mode 100644 radio/src/storage/yaml/yaml_datastructs_x9e.cpp create mode 100644 radio/src/storage/yaml/yaml_datastructs_x9lite.cpp create mode 100644 radio/src/storage/yaml/yaml_datastructs_x9lites.cpp create mode 100644 radio/src/storage/yaml/yaml_datastructs_xlite.cpp create mode 100644 radio/src/storage/yaml/yaml_datastructs_xlites.cpp diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index 5025a6057..13278adcb 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -12,6 +12,20 @@ elseif(PCB STREQUAL X10) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x10.cpp) elseif(PCB STREQUAL X7) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x7.cpp) +elseif(PCB STREQUAL X9LITE) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x9lite.cpp) +elseif(PCB STREQUAL X9LITES) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x9lites.cpp) +elseif(PCB STREQUAL XLITE) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_xlite.cpp) +elseif(PCB STREQUAL XLITES) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_xlites.cpp) +elseif(PCB STREQUAL X9E) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x9e.cpp) +elseif(PCB STREQUAL X9D) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x9d.cpp) +elseif(PCB STREQUAL X9D+) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x9dp.cpp) else() message(FATAL_ERROR "PCB '${PCB}' is not supported by YAML storage") endif() diff --git a/radio/src/storage/yaml/yaml_datastructs.cpp b/radio/src/storage/yaml/yaml_datastructs.cpp index b89a560b3..080605e73 100644 --- a/radio/src/storage/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs.cpp @@ -25,11 +25,25 @@ #include "yaml_datastructs_funcs.cpp" #if defined(PCBX10) -#include "yaml_datastructs_x10.cpp" + #include "yaml_datastructs_x10.cpp" #elif defined(PCBX12S) -#include "yaml_datastructs_x12s.cpp" + #include "yaml_datastructs_x12s.cpp" #elif defined(PCBX7) -#include "yaml_datastructs_x7.cpp" + #include "yaml_datastructs_x7.cpp" +#elif defined(PCBX9LITE) + #include "yaml_datastructs_x9lite.cpp" +#elif defined(PCBX9LITES) + #include "yaml_datastructs_x9lites.cpp" +#elif defined(PCBXLITE) + #include "yaml_datastructs_xlite.cpp" +#elif defined(PCBXLITES) + #include "yaml_datastructs_xlites.cpp" +#elif defined(PCBX9E) + #include "yaml_datastructs_x9e.cpp" +#elif defined(PCBX9D) + #include "yaml_datastructs_x9d.cpp" +#elif defined(PCBX9DP) + #include "yaml_datastructs_x9dp.cpp" #else #error "Board not supported by YAML storage" #endif diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp new file mode 100644 index 000000000..2a978e441 --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -0,0 +1,762 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_POT3, "POT3" }, + { MIXSRC_SLIDER1, "SLIDER1" }, + { MIXSRC_SLIDER2, "SLIDER2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 64, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 9, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 32 ), + YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 9, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 9, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 12), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_STRING("bitmap", 10), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 10), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode struct_string_32[] = { + YAML_IDX, + YAML_STRING("val", 4), + YAML_END +}; +static const struct YamlNode union_anonymous_10_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_12[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_12, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_14, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_15, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_16, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_17, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_18, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_10_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_11_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_13_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 104, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 32 ), + YAML_UNSIGNED( "switchWarningEnable", 16 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED( "voltsSource", 8 ), + YAML_UNSIGNED( "altitudeSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_x9dp.cpp b/radio/src/storage/yaml/yaml_datastructs_x9dp.cpp new file mode 100644 index 000000000..2a978e441 --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_x9dp.cpp @@ -0,0 +1,762 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_POT3, "POT3" }, + { MIXSRC_SLIDER1, "SLIDER1" }, + { MIXSRC_SLIDER2, "SLIDER2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 64, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 9, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 32 ), + YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 9, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 9, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 12), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_STRING("bitmap", 10), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 10), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode struct_string_32[] = { + YAML_IDX, + YAML_STRING("val", 4), + YAML_END +}; +static const struct YamlNode union_anonymous_10_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_12[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_12, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_14, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_15, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_16, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_17, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_18, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_10_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_11_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_13_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 104, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 32 ), + YAML_UNSIGNED( "switchWarningEnable", 16 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED( "voltsSource", 8 ), + YAML_UNSIGNED( "altitudeSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp new file mode 100644 index 000000000..ba286e560 --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -0,0 +1,812 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_POT3, "POT3" }, + { MIXSRC_POT4, "POT4" }, + { MIXSRC_SLIDER1, "SLIDER1" }, + { MIXSRC_SLIDER2, "SLIDER2" }, + { MIXSRC_SLIDER3, "SLIDER3" }, + { MIXSRC_SLIDER4, "SLIDER4" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SK, "SK" }, + { MIXSRC_SL, "SL" }, + { MIXSRC_SM, "SM" }, + { MIXSRC_SN, "SN" }, + { MIXSRC_SO, "SO" }, + { MIXSRC_SP, "SP" }, + { MIXSRC_SQ, "SQ" }, + { MIXSRC_SR, "SR" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_SK0, "SK0" }, + { SWSRC_SK1, "SK1" }, + { SWSRC_SK2, "SK2" }, + { SWSRC_SL0, "SL0" }, + { SWSRC_SL1, "SL1" }, + { SWSRC_SL2, "SL2" }, + { SWSRC_SM0, "SM0" }, + { SWSRC_SM1, "SM1" }, + { SWSRC_SM2, "SM2" }, + { SWSRC_SN0, "SN0" }, + { SWSRC_SN1, "SN1" }, + { SWSRC_SN2, "SN2" }, + { SWSRC_SO0, "SO0" }, + { SWSRC_SO1, "SO1" }, + { SWSRC_SO2, "SO2" }, + { SWSRC_SP0, "SP0" }, + { SWSRC_SP1, "SP1" }, + { SWSRC_SP2, "SP2" }, + { SWSRC_SQ0, "SQ0" }, + { SWSRC_SQ1, "SQ1" }, + { SWSRC_SQ2, "SQ2" }, + { SWSRC_SR0, "SR0" }, + { SWSRC_SR1, "SR1" }, + { SWSRC_SR2, "SR2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 64, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 64 ), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 18, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 12, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 12), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_STRING("bitmap", 10), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 10), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode struct_string_32[] = { + YAML_IDX, + YAML_STRING("val", 4), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 104, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 64 ), + YAML_UNSIGNED( "switchWarningEnable", 32 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED( "voltsSource", 8 ), + YAML_UNSIGNED( "altitudeSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "toplcdTimer", 8 ), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp new file mode 100644 index 000000000..ccdd8f071 --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -0,0 +1,742 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 5, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 5, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 5, struct_string_24, NULL), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp new file mode 100644 index 000000000..79a29f41d --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -0,0 +1,752 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 5, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 7, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 5, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp new file mode 100644 index 000000000..48bd6b028 --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -0,0 +1,749 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 6, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp new file mode 100644 index 000000000..4e176f40f --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -0,0 +1,753 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_GYRO1, "GYRO1" }, + { MIXSRC_GYRO2, "GYRO2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 6, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "gyroMax", 8 ), + YAML_SIGNED( "gyroOffset", 8 ), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + From 5e0d0131b490c7ed18e5c16039b717ba34439319 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 29 Aug 2021 09:01:23 +0200 Subject: [PATCH 030/110] Added EEPROM conversions to YAML --- radio/src/CMakeLists.txt | 8 ++- radio/src/gui/128x64/model_select_sd.cpp | 5 +- radio/src/opentx.cpp | 4 +- radio/src/simu.cpp | 2 +- radio/src/storage/conversions/conversions.cpp | 53 ++++++++++++++++--- radio/src/storage/eeprom_rlc.cpp | 13 ++++- radio/src/storage/eeprom_rlc.h | 6 +++ radio/src/storage/modelslist.cpp | 4 +- radio/src/storage/modelslist.h | 2 +- radio/src/storage/sdcard_common.h | 9 ++-- radio/src/storage/sdcard_yaml.cpp | 17 +++++- radio/src/targets/taranis/CMakeLists.txt | 3 +- radio/src/translations.cpp | 4 +- 13 files changed, 105 insertions(+), 25 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 328cdd152..00810590b 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -160,9 +160,15 @@ if(${STORAGE} STREQUAL SDCARD) set(SRC ${SRC} storage/sdcard_raw.cpp) add_definitions(-DSDCARD_RAW) elseif(${STORAGE_FORMAT} STREQUAL YAML) - set(SRC ${SRC} storage/sdcard_yaml.cpp storage/sdcard_raw.cpp) + set(SRC ${SRC} storage/sdcard_yaml.cpp) add_definitions(-DSDCARD_YAML) include(storage/yaml/CMakeLists.txt) + if (${STORAGE_CONVERT} STREQUAL EEPROM_RLC) + set(SRC ${SRC} storage/eeprom_rlc.cpp) + add_definitions(-DEEPROM_RLC) + else() + set(SRC ${SRC} storage/sdcard_raw.cpp) + endif() endif() elseif(${STORAGE} STREQUAL EEPROM) set(SRC ${SRC} storage/eeprom_common.cpp) diff --git a/radio/src/gui/128x64/model_select_sd.cpp b/radio/src/gui/128x64/model_select_sd.cpp index 4961220be..3659509b9 100644 --- a/radio/src/gui/128x64/model_select_sd.cpp +++ b/radio/src/gui/128x64/model_select_sd.cpp @@ -55,8 +55,9 @@ bool eeModelExists(uint8_t id) { int index = 0; - for (ModelsCategory::iterator it = modelSelect.currentCategory->begin(); it != modelSelect.currentCategory->end(); ++it, ++index) { - if (id == index){ + for (ModelsCategory::iterator it = modelSelect.currentCategory->begin(); + it != modelSelect.currentCategory->end(); ++it, ++index) { + if (id == index) { return true; } } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index dd48f424a..5e6c2c64b 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -702,7 +702,7 @@ static void checkFailsafe() #if defined(GUI) void checkAll() { -#if defined(EEPROM_RLC) +#if defined(EEPROM_RLC) && !defined(SDCARD_RAW) && !defined(SDCARD_YAML) checkLowEEPROM(); #endif @@ -753,7 +753,7 @@ void checkAll() #endif // GUI -#if defined(EEPROM_RLC) +#if defined(EEPROM_RLC) && !defined(SDCARD_RAW) && !defined(SDCARD_YAML) void checkLowEEPROM() { if (g_eeGeneral.disableMemoryWarning) return; diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 0ccf895ae..95dcb95a2 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -630,7 +630,7 @@ int main(int argc, char ** argv) simuInit(); -#if defined(EEPROM) +#if defined(EEPROM) || defined(EEPROM_RLC) startEepromThread(argc >= 2 ? argv[1] : "eeprom.bin"); #endif startAudioThread(); diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index f3b0ce343..2888f6ba2 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -27,7 +27,9 @@ #include "storage/sdcard_common.h" #include "storage/sdcard_raw.h" #include "storage/sdcard_yaml.h" +#endif +#if !defined(EEPROM_RLC) static void drawProgressScreen(const char* filename, int progress, int total) { #if defined(COLORLCD) @@ -158,15 +160,36 @@ void convertModelData(int version) #endif } -#if defined(EEPROM) +#if defined(EEPROM) || defined(EEPROM_RLC) +#include "storage/eeprom_common.h" + void eeConvertModel(int id, int version) { eeLoadModelData(id); convertModelData(version); uint8_t currModel = g_eeGeneral.currModel; g_eeGeneral.currModel = id; + +#if !defined(EEPROM) + char filename[LEN_MODEL_FILENAME+1]; + memset(filename, 0, sizeof(filename)); + char* s = strAppend(filename, MODEL_FILENAME_PREFIX); + s = strAppendUnsigned(s, id + 1, 2); + s = strAppend(s, MODEL_FILENAME_SUFFIX); + memcpy(g_eeGeneral.currModelFilename, filename, sizeof(g_eeGeneral.currModelFilename)); + + if (!modelslist.getCurrentCategory()) { + ModelsCategory* cat = modelslist.createCategory("Models", false); + modelslist.setCurrentCategory(cat); + } + ModelCell* model = modelslist.addModel(modelslist.getCurrentCategory(), + filename, false); + model->setModelName(g_model.header.name); +#endif + storageDirty(EE_MODEL); storageCheck(true); + g_eeGeneral.currModel = currModel; } @@ -178,6 +201,9 @@ bool eeConvert() case 219: msg = "EEprom Data v219"; break; + case 220: + msg = "EEprom Data v220"; + break; default: return false; } @@ -203,12 +229,15 @@ bool eeConvert() convertRadioData_219_to_220(g_eeGeneral); } #endif - + g_eeGeneral.version = EEPROM_VER; storageDirty(EE_GENERAL); storageCheck(true); -#if defined(COLORLCD) -#elif LCD_W >= 212 +#if !defined(EEPROM) + modelslist.clear(); +#endif + +#if LCD_W >= 212 lcdDrawRect(60, 6*FH+4, 132, 3); #else lcdDrawRect(10, 6*FH+4, 102, 3); @@ -216,18 +245,30 @@ bool eeConvert() // Models conversion for (uint8_t id=0; id= 212 +#if LCD_W >= 212 lcdDrawSolidHorizontalLine(61, 6*FH+5, 10+id*2, FORCE); #else lcdDrawSolidHorizontalLine(11, 6*FH+5, 10+(id*3)/2, FORCE); #endif lcdRefresh(); + +#if defined(SIMU) + RTOS_WAIT_MS(100); +#endif + +#if defined(SDCARD_RAW) || defined(SDCARD_YAML) + if (eeModelExistsRlc(id)) { +#else if (eeModelExists(id)) { +#endif eeConvertModel(id, conversionVersionStart); } } +#if !defined(EEPROM) + modelslist.save(); +#endif + return true; } #endif diff --git a/radio/src/storage/eeprom_rlc.cpp b/radio/src/storage/eeprom_rlc.cpp index b7c865e49..d30d516bd 100644 --- a/radio/src/storage/eeprom_rlc.cpp +++ b/radio/src/storage/eeprom_rlc.cpp @@ -23,6 +23,9 @@ #include #include "opentx.h" #include "../timers.h" + +#include "storage/eeprom_common.h" +#include "storage/eeprom_rlc.h" #include "conversions/conversions.h" uint8_t s_write_err = 0; // error reasons @@ -154,6 +157,7 @@ void eepromCheck() ENABLE_SYNC_WRITE(false); } +#if !defined(SDCARD_RAW) && !defined(SDCARD_YAML) void storageFormat() { ENABLE_SYNC_WRITE(true); @@ -179,6 +183,7 @@ void storageFormat() ENABLE_SYNC_WRITE(false); } +#endif bool eepromOpen() { @@ -444,7 +449,7 @@ bool RlcFile::copy(uint8_t i_fileDst, uint8_t i_fileSrc) return true; } -#if defined(SDCARD) +#if defined(SDCARD) && !defined(SDCARD_RAW) && !defined(SDCARD_YAML) const char * eeBackupModel(uint8_t i_fileSrc) { char * buf = reusableBuffer.modelsel.mainname; @@ -827,11 +832,16 @@ void eeLoadModelName(uint8_t id, char *name) } } +#if defined(SDCARD_RAW) || defined(SDCARD_YAML) +bool eeModelExistsRlc(uint8_t id) +#else bool eeModelExists(uint8_t id) +#endif { return EFile::exists(FILE_MODEL(id)); } +#if !defined(SDCARD_RAW) && !defined(SDCARD_YAML) void storageCheck(bool immediately) { if (immediately) { @@ -851,6 +861,7 @@ void storageCheck(bool immediately) theFile.writeRlc(FILE_MODEL(g_eeGeneral.currModel), FILE_TYP_MODEL, (uint8_t*)&g_model, sizeof(g_model), immediately); } } +#endif void eeLoadModelHeader(uint8_t id, ModelHeader *header) { diff --git a/radio/src/storage/eeprom_rlc.h b/radio/src/storage/eeprom_rlc.h index 150b39353..cb67208f3 100644 --- a/radio/src/storage/eeprom_rlc.h +++ b/radio/src/storage/eeprom_rlc.h @@ -175,8 +175,10 @@ const char * eeBackupModel(uint8_t i_fileSrc); const char * eeRestoreModel(uint8_t i_fileDst, char *model_name); #endif +#if !defined(SDCARD_RAW) && !defined(SDCARD_YAML) // For conversions void loadRadioSettings(); +#endif bool eepromOpen(); void eeLoadModelName(uint8_t id, char * name); @@ -206,4 +208,8 @@ inline bool isEepromStart(const void * buffer) void eepromBackup(); +#if defined(SDCARD_RAW) || defined(SDCARD_YAML) +bool eeModelExistsRlc(uint8_t id); +#endif + #endif // _EEPROM_RLC_H_ diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index b2010d07d..500536c07 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -478,11 +478,11 @@ ModelsCategory * ModelsList::createCategory(const char* name, bool save) return result; } -ModelCell * ModelsList::addModel(ModelsCategory * category, const char * name) +ModelCell * ModelsList::addModel(ModelsCategory * category, const char * name, bool save) { ModelCell * result = category->addModel(name); modelsCount++; - save(); + if (save) this->save(); return result; } diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 42c16c400..1d9bef172 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -145,7 +145,7 @@ public: ModelsCategory * createCategory(const char * name, bool save=true); void removeCategory(ModelsCategory * category); - ModelCell * addModel(ModelsCategory * category, const char * name); + ModelCell * addModel(ModelsCategory * category, const char * name, bool save=true); void removeModel(ModelsCategory * category, ModelCell * model); void moveModel(ModelsCategory * category, ModelCell * model, int8_t step); void moveModel(ModelCell * model, ModelsCategory * previous_category, ModelsCategory * new_category); diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index fb3d6192c..80e6f9895 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -26,13 +26,14 @@ #define DEFAULT_CATEGORY "Models" +#define MODEL_FILENAME_PREFIX "model" #if defined(SDCARD_RAW) -#define DEFAULT_MODEL_FILENAME "model1.bin" -#define MODEL_FILENAME_PATTERN "model.bin" +#define MODEL_FILENAME_SUFFIX ".bin" #elif defined(SDCARD_YAML) -#define DEFAULT_MODEL_FILENAME "model1.yml" -#define MODEL_FILENAME_PATTERN "model.yml" +#define MODEL_FILENAME_SUFFIX ".yml" #endif +#define DEFAULT_MODEL_FILENAME MODEL_FILENAME_PREFIX "1" MODEL_FILENAME_SUFFIX +#define MODEL_FILENAME_PATTERN MODEL_FILENAME_PREFIX MODEL_FILENAME_SUFFIX //#if !defined(EEPROM) extern ModelHeader modelHeaders[MAX_MODELS]; diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index add78d309..1fb3906aa 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -30,6 +30,10 @@ #include "yaml/yaml_parser.h" #include "yaml/yaml_datastructs.h" +#if defined(EEPROM_RLC) + #include "storage/eeprom_rlc.h" +#endif + const char * readYamlFile(const char* fullpath, const YamlParserCalls* calls, void* parser_ctx) { FIL file; @@ -90,7 +94,15 @@ const char * loadRadioSettings() { FILINFO fno; if (f_stat(RADIO_SETTINGS_YAML_PATH, &fno) != FR_OK) { - return loadRadioSettingsBin(); +#if !defined(EEPROM_RLC) + return loadRadioSettingsBin(); +#else + // Load from EEPROM + if (!eepromOpen() || !eeLoadGeneral(true)) { + return "ERROR"; + } + return nullptr; +#endif } return loadRadioSettingsYaml(); @@ -192,8 +204,9 @@ const char* readModel(const char* filename, uint8_t* buffer, uint32_t size, if (!strncmp(ext, YAML_EXT, 4)) { return readModelYaml(filename, buffer, size, version); } - +#if !defined(EEPROM_RLC) return readModelBin(filename, buffer, size, version); +#endif } return nullptr; } diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 0b718e896..9ff09a043 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -420,7 +420,8 @@ set(HSE_VALUE 12000000) set(SDCARD YES) if(YAML_STORAGE) set(STORAGE SDCARD) - set(STORAGE_FORMAT YAML) + set(STORAGE_FORMAT YAML) + set(STORAGE_CONVERT EEPROM_RLC) else() set(STORAGE EEPROM) set(STORAGE_FORMAT RLC) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 0f0b3a6a7..781be3064 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -822,9 +822,7 @@ const char STR_REPEAT_AT_ZERO[] = TR_REPEAT_AT_ZERO; const char STR_BAD_RADIO_DATA[] = TR_BADEEPROMDATA; const char STR_STORAGE_FORMAT[] = TR_EEPROMFORMATTING; const char STR_STORAGE_WARNING[] = TR_EEPROMWARN; -const char STR_EEPROM_CONVERTING[] = TR_EEPROM_CONVERTING; const char STR_EEPROMLOWMEM[] = TR_EEPROMLOWMEM; -const char STR_EEPROMOVERFLOW[] = TR_EEPROMOVERFLOW; #else const char STR_BAD_RADIO_DATA[] = TR_BAD_RADIO_DATA; const char STR_STORAGE_WARNING[] = TR_STORAGE_WARNING; @@ -832,6 +830,8 @@ const char STR_STORAGE_FORMAT[] = TR_STORAGE_FORMAT; const char STR_SDCARD_CONVERSION_REQUIRE[] = TR_SDCARD_CONVERSION_REQUIRE; const char STR_CONVERTING[] = TR_CONVERTING; #endif +const char STR_EEPROMOVERFLOW[] = TR_EEPROMOVERFLOW; +const char STR_EEPROM_CONVERTING[] = TR_EEPROM_CONVERTING; #if defined(LUA) const char STR_MENUCUSTOMSCRIPTS[] = TR_MENUCUSTOMSCRIPTS; From f21bcd6987f16ec4c40e1b66ee7c674955e64510 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 29 Aug 2021 09:05:52 +0200 Subject: [PATCH 031/110] Added missing STORAGE_CONVERT cmake var to Horus-like targets --- radio/src/targets/horus/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 94e55a1a1..de680a60b 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -34,7 +34,8 @@ else() endif() if(YAML_STORAGE) - set(STORAGE_FORMAT YAML) + set(STORAGE_FORMAT YAML) + set(STORAGE_CONVERT SDCARD_RAW) endif() # for size report script From 8a9154db768cab7c8aa87e72cfb59d231c9b8455 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 29 Aug 2021 09:28:30 +0200 Subject: [PATCH 032/110] Force disable YAML on X9D-like targets (UI missing) --- radio/src/targets/taranis/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 9ff09a043..592889249 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -15,6 +15,7 @@ add_definitions(-DPCBFRSKY) if(PCB STREQUAL X9E) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) + set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(STICKS "STANDARD" CACHE STRING "Sticks type (STANDARD/HORUS)") set(CPU_TYPE STM32F4) @@ -48,6 +49,7 @@ if(PCB STREQUAL X9E) set(ROTARY_ENCODER YES) add_definitions(-DMANUFACTURER_FRSKY) elseif(PCB STREQUAL X9D+) + set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) set(HAPTIC YES) set(LUA_EXPORT lua_export_x9d) add_definitions(-DPCBX9DP -DPCBX9) @@ -96,6 +98,7 @@ elseif(PCB STREQUAL X9D+) set(STATUS_LEDS NO) endif() elseif(PCB STREQUAL X9D) + set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) set(FLAVOUR x9d) From a26a43ee1d21a0cf1ffd3ee9c5a3e8580e6103b5 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 29 Aug 2021 09:28:55 +0200 Subject: [PATCH 033/110] Use specific generated YAML bindings on X7 variants --- radio/src/storage/yaml/CMakeLists.txt | 12 +- radio/src/storage/yaml/yaml_datastructs.cpp | 12 +- .../src/storage/yaml/yaml_datastructs_t12.cpp | 757 ++++++++++++++++++ .../src/storage/yaml/yaml_datastructs_t8.cpp | 747 +++++++++++++++++ .../storage/yaml/yaml_datastructs_tlite.cpp | 757 ++++++++++++++++++ .../storage/yaml/yaml_datastructs_tx12.cpp | 757 ++++++++++++++++++ 6 files changed, 3040 insertions(+), 2 deletions(-) create mode 100644 radio/src/storage/yaml/yaml_datastructs_t12.cpp create mode 100644 radio/src/storage/yaml/yaml_datastructs_t8.cpp create mode 100644 radio/src/storage/yaml/yaml_datastructs_tlite.cpp create mode 100644 radio/src/storage/yaml/yaml_datastructs_tx12.cpp diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index 13278adcb..458201e53 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -11,7 +11,17 @@ if(PCB STREQUAL X12S) elseif(PCB STREQUAL X10) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x10.cpp) elseif(PCB STREQUAL X7) - set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x7.cpp) + if(PCBREV STREQUAL T12) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_t12.cpp) + elseif(PCBREV STREQUAL TLITE) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tlite.cpp) + elseif(PCBREV STREQUAL TX12) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tx12.cpp) + elseif(PCBREV STREQUAL T8) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_t8.cpp) + else() + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x7.cpp) + endif() elseif(PCB STREQUAL X9LITE) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x9lite.cpp) elseif(PCB STREQUAL X9LITES) diff --git a/radio/src/storage/yaml/yaml_datastructs.cpp b/radio/src/storage/yaml/yaml_datastructs.cpp index 080605e73..27f4b6109 100644 --- a/radio/src/storage/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs.cpp @@ -29,7 +29,17 @@ #elif defined(PCBX12S) #include "yaml_datastructs_x12s.cpp" #elif defined(PCBX7) - #include "yaml_datastructs_x7.cpp" + #if defined(RADIO_T12) + #include "yaml_datastructs_t12.cpp" + #elif defined(RADIO_TLITE) + #include "yaml_datastructs_tlite.cpp" + #elif defined(RADIO_TX12) + #include "yaml_datastructs_tx12.cpp" + #elif defined(RADIO_T8) + #include "yaml_datastructs_t8.cpp" + #else + #include "yaml_datastructs_x7.cpp" + #endif #elif defined(PCBX9LITE) #include "yaml_datastructs_x9lite.cpp" #elif defined(PCBX9LITES) diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp new file mode 100644 index 000000000..fc2de09a6 --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -0,0 +1,757 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp new file mode 100644 index 000000000..e1f34b27d --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -0,0 +1,747 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_10_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_12[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_12, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_14, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_15, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_16, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_17, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_18, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_10_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_11_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_13_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp new file mode 100644 index 000000000..fc2de09a6 --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -0,0 +1,757 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp new file mode 100644 index 000000000..7a88c336a --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -0,0 +1,757 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_UNSIGNED( "mode", 2 ), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_UNSIGNED( "variant", 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_UNSIGNED( "chkSum", 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_UNSIGNED( "backlightMode", 3 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED( "beepMode", 2 ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED( "hapticLength", 8 ), + YAML_SIGNED( "beepLength", 3 ), + YAML_SIGNED( "hapticStrength", 3 ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED( "speakerPitch", 8 ), + YAML_SIGNED( "speakerVolume", 8 ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED( "beepVolume", 4 ), + YAML_SIGNED( "wavVolume", 4 ), + YAML_SIGNED( "varioVolume", 4 ), + YAML_SIGNED( "backgroundVolume", 4 ), + YAML_SIGNED( "varioPitch", 8 ), + YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), + YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_STRING("currModelFilename", 17), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED( "value", 22 ), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_UNSIGNED( "mltpx", 2 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_IDX, + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_11_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_15[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + From 679c5aef31e963616a619fba737f85f883dc9b2c Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 29 Aug 2021 09:45:02 +0200 Subject: [PATCH 034/110] Fixed EEPROM tests --- radio/src/tests/eeprom.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/radio/src/tests/eeprom.cpp b/radio/src/tests/eeprom.cpp index b74e32e86..1cd36ff83 100644 --- a/radio/src/tests/eeprom.cpp +++ b/radio/src/tests/eeprom.cpp @@ -23,7 +23,8 @@ extern const char * eepromFile; -#if !defined(EEPROM) && defined(SDCARD) +#if defined(RTC_BACKUP_RAM) +#include "storage/rtc_backup.h" namespace Backup { #define BACKUP #include "datastructs.h" @@ -45,7 +46,9 @@ TEST(Storage, BackupAndRestore) } #endif -#if defined(EEPROM_RLC) +#if defined(EEPROM) && defined(EEPROM_RLC) +#include "storage/eeprom_rlc.h" + TEST(Eeprom, 100_random_writes) { eepromFile = NULL; // in memory From f8ab3770e4a2b2bb227f45e95aac8297c376c791 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 9 Oct 2021 13:28:39 +0200 Subject: [PATCH 035/110] Updated generated yaml parser structs --- radio/src/dataconstants.h | 5 - radio/src/datastructs.h | 48 ++- radio/src/myeeprom.h | 8 +- radio/src/storage/yaml/CMakeLists.txt | 9 +- radio/src/storage/yaml/yaml_datastructs.cpp | 15 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 98 ++++++- ...cts_x9dp.cpp => yaml_datastructs_nv14.cpp} | 276 +++++++++++------- .../src/storage/yaml/yaml_datastructs_t12.cpp | 133 ++++++--- .../src/storage/yaml/yaml_datastructs_t8.cpp | 141 ++++++--- .../storage/yaml/yaml_datastructs_tlite.cpp | 133 ++++++--- .../storage/yaml/yaml_datastructs_tx12.cpp | 133 ++++++--- .../src/storage/yaml/yaml_datastructs_x10.cpp | 134 ++++++--- .../storage/yaml/yaml_datastructs_x12s.cpp | 133 ++++++--- .../src/storage/yaml/yaml_datastructs_x7.cpp | 133 ++++++--- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 141 ++++++--- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 133 ++++++--- .../storage/yaml/yaml_datastructs_x9lite.cpp | 133 ++++++--- .../storage/yaml/yaml_datastructs_x9lites.cpp | 133 ++++++--- .../storage/yaml/yaml_datastructs_xlite.cpp | 133 ++++++--- .../storage/yaml/yaml_datastructs_xlites.cpp | 133 ++++++--- radio/src/targets/nv14/CMakeLists.txt | 5 + radio/src/targets/taranis/CMakeLists.txt | 6 +- tools/generate-yaml.sh | 107 +++++++ 23 files changed, 1649 insertions(+), 674 deletions(-) rename radio/src/storage/yaml/{yaml_datastructs_x9dp.cpp => yaml_datastructs_nv14.cpp} (75%) create mode 100755 tools/generate-yaml.sh diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index b43013d3c..d1f4351d7 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -765,13 +765,8 @@ enum MixSources { MIXSRC_TX_VOLTAGE, LUA_EXPORT("tx-voltage", "Transmitter battery voltage [volts]") MIXSRC_TX_TIME, LUA_EXPORT("clock", "RTC clock [minutes from midnight]") -#if defined(INTERNAL_GPS) MIXSRC_TX_GPS, MIXSRC_FIRST_RESERVE SKIP, -#else - MIXSRC_FIRST_RESERVE SKIP, - MIXSRC_RESERVE2 SKIP, -#endif MIXSRC_RESERVE3 SKIP, MIXSRC_RESERVE4 SKIP, MIXSRC_LAST_RESERVE SKIP, diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index e33784736..38232478c 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -76,11 +76,11 @@ PACK(struct MixData { uint16_t srcRaw:10 CUST(r_mixSrcRaw,w_mixSrcRaw); // srcRaw=0 means not used uint16_t carryTrim:1; uint16_t mixWarn:2; // mixer warning - uint16_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint16_t mltpx:2 ENUM(MixerMultiplex); uint16_t spare:1 SKIP; int32_t offset:14; int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); - uint32_t flightModes:9; + uint32_t flightModes:9; //TODO ?? CurveRef curve; uint8_t delayUp; uint8_t delayDown; @@ -100,7 +100,7 @@ PACK(struct ExpoData { int16_t carryTrim:6; uint32_t chn:5; int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); - uint32_t flightModes:9; + uint32_t flightModes:9; //TODO ?? int32_t weight:8 CUST(in_read_weight,in_write_weight); int32_t spare:1 SKIP; NOBACKUP(char name[LEN_EXPOMIX_NAME]); @@ -229,9 +229,9 @@ PACK(struct GVarData { PACK(struct TimerData { uint32_t start:22; - int32_t swtch:10; + int32_t swtch:10 CUST(r_swtchSrc,w_swtchSrc); int32_t value:22; - uint32_t mode:3; // timer mode (OFF, ON, Start, THs, TH%, THt) + uint32_t mode:3 ENUM(TimerModes); uint32_t countdownBeep:2; uint32_t minuteBeep:1; uint32_t persistent:2; @@ -461,7 +461,6 @@ PACK(struct ModuleData { uint8_t racingMode:1; char receiverName[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; } pxx2); -#if defined(AFHDS2) NOBACKUP(struct { uint8_t rx_id[4]; uint8_t mode:3; @@ -477,8 +476,6 @@ PACK(struct ModuleData { rx_freq[1] = 0; } } flysky); -#endif -#if defined(AFHDS3) NOBACKUP(PACK(struct { uint8_t bindPower:3; uint8_t runPower:3; @@ -499,7 +496,6 @@ PACK(struct ModuleData { rx_freq[1] = value >> 8; } } afhds3)); -#endif } NAME(mod) FUNC(select_mod_type); // Helper functions to set both of the rfProto protocol at the same time @@ -810,15 +806,15 @@ PACK(struct TrainerData { PACK(struct RadioData { NOBACKUP(uint8_t version); - NOBACKUP(uint16_t variant); + NOBACKUP(uint16_t variant SKIP); CalibData calib[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS]; - NOBACKUP(uint16_t chkSum); + NOBACKUP(uint16_t chkSum SKIP); N_HORUS_FIELD(int8_t currModel); N_HORUS_FIELD(uint8_t contrast); NOBACKUP(uint8_t vBatWarn); NOBACKUP(int8_t txVoltageCalibration); - uint8_t backlightMode:3; - int8_t antennaMode:2; + uint8_t backlightMode:3 ENUM(BacklightMode); + int8_t antennaMode:2 ENUM(AntennaModes); uint8_t disableRtcWarning:1; uint8_t keysBacklight:1; int8_t spare1:1 SKIP; @@ -826,7 +822,7 @@ PACK(struct RadioData { NOBACKUP(uint8_t view); // index of view in main screen NOBACKUP(BUZZER_FIELD); /* 2bits */ NOBACKUP(uint8_t fai:1); - NOBACKUP(int8_t beepMode:2); // -2=quiet, -1=only alarms, 0=no keys, 1=all + NOBACKUP(int8_t beepMode:2 ENUM(BeeperMode) CUST(r_beeperMode,w_beeperMode)); NOBACKUP(uint8_t alarmsFlash:1); NOBACKUP(uint8_t disableMemoryWarning:1); NOBACKUP(uint8_t disableAlarmWarning:1); @@ -836,20 +832,20 @@ PACK(struct RadioData { NOBACKUP(uint8_t inactivityTimer); uint8_t telemetryBaudrate:3; SPLASH_MODE; /* 3bits */ - int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + int8_t hapticMode:2 CUST(r_beeperMode,w_beeperMode); int8_t switchesDelay; NOBACKUP(uint8_t lightAutoOff); NOBACKUP(uint8_t templateSetup); // RETA order for receiver channels NOBACKUP(int8_t PPM_Multiplier); - NOBACKUP(int8_t hapticLength); + NOBACKUP(int8_t hapticLength CUST(r_5pos,w_5pos)); N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t spare2 SKIP)); N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse)); - NOBACKUP(int8_t beepLength:3); - NOBACKUP(int8_t hapticStrength:3); + NOBACKUP(int8_t beepLength:3 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t hapticStrength:3 CUST(r_5pos,w_5pos)); NOBACKUP(uint8_t gpsFormat:1); NOBACKUP(uint8_t unexpectedShutdown:1); - NOBACKUP(uint8_t speakerPitch); - NOBACKUP(int8_t speakerVolume); + NOBACKUP(uint8_t speakerPitch CUST(r_spPitch,w_spPitch)); + NOBACKUP(int8_t speakerVolume CUST(r_vol,w_vol)); NOBACKUP(int8_t vBatMin CUST(r_vbat_min,w_vbat_min)); NOBACKUP(int8_t vBatMax CUST(r_vbat_max,w_vbat_max)); @@ -867,12 +863,12 @@ PACK(struct RadioData { NOBACKUP(uint8_t jackMode:2); NOBACKUP(uint8_t sportUpdatePower:1 SKIP); NOBACKUP(char ttsLanguage[2]); - NOBACKUP(int8_t beepVolume:4); - NOBACKUP(int8_t wavVolume:4); - NOBACKUP(int8_t varioVolume:4); - NOBACKUP(int8_t backgroundVolume:4); - NOBACKUP(int8_t varioPitch); - NOBACKUP(int8_t varioRange); + NOBACKUP(int8_t beepVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t wavVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t varioVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t backgroundVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t varioPitch CUST(r_vPitch,w_vPitch)); + NOBACKUP(int8_t varioRange CUST(r_vPitch,w_vPitch)); NOBACKUP(int8_t varioRepeat); CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS] FUNC(cfn_is_active); diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 23afbc136..fda84317a 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -157,9 +157,11 @@ enum CurveRefType { #define TRIM_LAST TRIM_AIL #endif -#define MLTPX_ADD 0 -#define MLTPX_MUL 1 -#define MLTPX_REP 2 +enum MixerMultiplex { + MLTPX_ADD = 0, + MLTPX_MUL = 1, + MLTPX_REP = 2, +}; #define GV1_SMALL 128 #define GV1_LARGE 1024 diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index 458201e53..386a1e2f4 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -6,10 +6,15 @@ set(SRC ${SRC} storage/yaml/yaml_tree_walker.cpp storage/yaml/yaml_modelslist.cpp storage/yaml/yaml_datastructs.cpp) +# Warning: this file must be kept in sync with 'yaml_datastructs.cpp' +# in the same directory. + if(PCB STREQUAL X12S) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x12s.cpp) elseif(PCB STREQUAL X10) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x10.cpp) +elseif(PCB STREQUAL NV14) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_nv14.cpp) elseif(PCB STREQUAL X7) if(PCBREV STREQUAL T12) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_t12.cpp) @@ -32,10 +37,8 @@ elseif(PCB STREQUAL XLITES) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_xlites.cpp) elseif(PCB STREQUAL X9E) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x9e.cpp) -elseif(PCB STREQUAL X9D) +elseif((PCB STREQUAL X9D) OR (PCB STREQUAL X9D+)) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x9d.cpp) -elseif(PCB STREQUAL X9D+) - set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_x9dp.cpp) else() message(FATAL_ERROR "PCB '${PCB}' is not supported by YAML storage") endif() diff --git a/radio/src/storage/yaml/yaml_datastructs.cpp b/radio/src/storage/yaml/yaml_datastructs.cpp index 27f4b6109..c5cfeced6 100644 --- a/radio/src/storage/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs.cpp @@ -22,12 +22,17 @@ #include "opentx.h" #include "yaml_node.h" +// Warning: this file must be kept in sync with the CMakeLists.txt +// in the same directory. + #include "yaml_datastructs_funcs.cpp" -#if defined(PCBX10) - #include "yaml_datastructs_x10.cpp" -#elif defined(PCBX12S) +#if defined(PCBX12S) #include "yaml_datastructs_x12s.cpp" +#elif defined(PCBX10) + #include "yaml_datastructs_x10.cpp" +#elif defined(PCBNV14) + #include "yaml_datastructs_nv14.cpp" #elif defined(PCBX7) #if defined(RADIO_T12) #include "yaml_datastructs_t12.cpp" @@ -50,10 +55,8 @@ #include "yaml_datastructs_xlites.cpp" #elif defined(PCBX9E) #include "yaml_datastructs_x9e.cpp" -#elif defined(PCBX9D) +#elif defined(PCBX9D) || defined(PCBX9DP) #include "yaml_datastructs_x9d.cpp" -#elif defined(PCBX9DP) - #include "yaml_datastructs_x9dp.cpp" #else #error "Board not supported by YAML storage" #endif diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 187c69f5c..bc27df350 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -141,7 +141,8 @@ static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) data += bitoffs >> 3UL; data -= offsetof(ModuleData, ppm); - switch(((ModuleData*)data)->type) { + ModuleData* mod_data = reinterpret_cast(data); + switch(mod_data->type) { case MODULE_TYPE_NONE: case MODULE_TYPE_PPM: case MODULE_TYPE_DSM2: @@ -162,8 +163,11 @@ static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) case MODULE_TYPE_R9M_LITE_PRO_PXX2: case MODULE_TYPE_XJT_LITE_PXX2: return 5; - case MODULE_TYPE_AFHDS3: - return 7; + case MODULE_TYPE_FLYSKY: + if (mod_data->subType == FLYSKY_SUBTYPE_AFHDS2A) + return 6; + if (mod_data->subType == FLYSKY_SUBTYPE_AFHDS3) + return 7; } return 0; } @@ -171,6 +175,7 @@ static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) static uint8_t select_custom_fn(uint8_t* data, uint32_t bitoffs) { // always use 'all' + //TODO return 1; } @@ -298,8 +303,19 @@ static uint32_t r_swtchSrc(const YamlNode* node, const char* val, uint8_t val_le ival = SWSRC_FIRST_LOGICAL_SWITCH + yaml_str2int(val+1, val_len-1) - 1; } - //TODO: Flight modes ('FM[0-9]') - //TODO: Sensors ('Sensor[0-9]') + else if (val_len == 3 + && val[0] == 'F' + && val[1] == 'M' + && (val[2] >= '0' && val[2] <= '9')) { + + ival = SWSRC_FIRST_FLIGHT_MODE + (val[3] - '0'); + } + else if (val_len >= 2 + && val[0] == 'T' + && (val[1] >= '0' && val[1] <= '9')) { + + ival = SWSRC_FIRST_SENSOR + yaml_str2int(val+1, val_len-1) - 1; + } else { ival = yaml_parse_enum(enum_SwitchSources, val, val_len); } @@ -340,14 +356,16 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, else if (sval >= SWSRC_FIRST_FLIGHT_MODE && sval <= SWSRC_LAST_FLIGHT_MODE) { - //TODO - return true; + wf(opaque, "FM", 2); + str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE + 1); + return wf(opaque,str, strlen(str)); } else if (sval >= SWSRC_FIRST_SENSOR && sval <= SWSRC_LAST_SENSOR) { - //TODO - return true; + wf(opaque, "T", 2); + str = yaml_unsigned2str(sval - SWSRC_FIRST_SENSOR + 1); + return wf(opaque,str, strlen(str)); } str = yaml_output_enum(sval, enum_SwitchSources); @@ -469,3 +487,65 @@ static bool w_swtchWarn(const YamlNode* node, uint32_t val, yaml_writer_func wf, return true; } + +extern const struct YamlIdStr enum_BeeperMode[]; + +static uint32_t r_beeperMode(const YamlNode* node, const char* val, uint8_t val_len) +{ + return yaml_parse_enum(enum_BeeperMode, val, val_len); +} + +static bool w_beeperMode(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val,node->size); + const char* str = yaml_output_enum(sval, enum_BeeperMode); + return wf(opaque, str, strlen(str)); +} + +static uint32_t r_5pos(const YamlNode* node, const char* val, uint8_t val_len) +{ + return (uint32_t)(yaml_str2int(val, val_len) - 2); +} + +static bool w_5pos(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val,node->size); + char* s = yaml_signed2str(sval + 2); + return wf(opaque, s, strlen(s)); +} + +static uint32_t r_vol(const YamlNode* node, const char* val, uint8_t val_len) +{ + return (uint32_t)(yaml_str2int(val, val_len) - VOLUME_LEVEL_DEF); +} + +static bool w_vol(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val,node->size); + char* s = yaml_signed2str(sval + VOLUME_LEVEL_DEF); + return wf(opaque, s, strlen(s)); +} + +static uint32_t r_spPitch(const YamlNode* node, const char* val, uint8_t val_len) +{ + return (uint32_t)(yaml_str2int(val, val_len) / 15); +} + +static bool w_spPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + char* s = yaml_signed2str(val * 15); + return wf(opaque, s, strlen(s)); +} + +static uint32_t r_vPitch(const YamlNode* node, const char* val, uint8_t val_len) +{ + return (uint32_t)(yaml_str2int(val, val_len) / 10); +} + +static bool w_vPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val,node->size); + char* s = yaml_signed2str(sval * 10); + return wf(opaque, s, strlen(s)); +} + diff --git a/radio/src/storage/yaml/yaml_datastructs_x9dp.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp similarity index 75% rename from radio/src/storage/yaml/yaml_datastructs_x9dp.cpp rename to radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 2a978e441..a391ad232 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9dp.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,30 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_ZoneOptionValueEnum[] = { + { ZOV_Unsigned, "Unsigned" }, + { ZOV_Signed, "Signed" }, + { ZOV_Bool, "Bool" }, + { ZOV_String, "String" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -41,9 +89,6 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_Ail, "Ail" }, { MIXSRC_POT1, "POT1" }, { MIXSRC_POT2, "POT2" }, - { MIXSRC_POT3, "POT3" }, - { MIXSRC_SLIDER1, "SLIDER1" }, - { MIXSRC_SLIDER2, "SLIDER2" }, { MIXSRC_MAX, "MAX" }, { MIXSRC_CYC1, "CYC1" }, { MIXSRC_CYC2, "CYC2" }, @@ -60,7 +105,6 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_SF, "SF" }, { MIXSRC_SG, "SG" }, { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, { MIXSRC_SW1, "SW1" }, { MIXSRC_CH1, "CH1" }, { MIXSRC_CH2, "CH2" }, @@ -81,6 +125,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -136,9 +181,6 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_SH0, "SH0" }, { SWSRC_SH1, "SH1" }, { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, @@ -172,7 +214,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -207,32 +249,32 @@ static const struct YamlNode struct_TrainerData[] = { YAML_END }; static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 8), + YAML_STRING("name", 6), YAML_END }; static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_PADDING( 16 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_PADDING( 16 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 64, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 48, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 48, struct_anonymous_3, NULL), YAML_END }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), YAML_UNSIGNED( "active", 8 ), YAML_END }; @@ -241,17 +283,34 @@ static const struct YamlNode struct_string_24[] = { YAML_STRING("val", 3), YAML_END }; +static const struct YamlNode union_ZoneOptionValue_elmts[] = { + YAML_UNSIGNED( "unsignedValue", 32 ), + YAML_SIGNED( "signedValue", 32 ), + YAML_UNSIGNED( "boolValue", 32 ), + YAML_STRING("stringValue", 8), + YAML_END +}; +static const struct YamlNode struct_ZoneOptionValueTyped[] = { + YAML_IDX, + YAML_ENUM("type", 32, enum_ZoneOptionValueEnum), + YAML_UNION("value", 64, union_ZoneOptionValue_elmts, select_zov), + YAML_END +}; +static const struct YamlNode struct_OpenTxTheme__PersistentData[] = { + YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 9, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -259,7 +318,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -268,19 +327,21 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "adjustRTC", 1 ), YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_PADDING( 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_PADDING( 8 ), + YAML_UNSIGNED( "stickReverse", 8 ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -297,27 +358,29 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_UNSIGNED( "switchUnlockStates", 32 ), + YAML_UNSIGNED( "aux2SerialMode", 4 ), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 9, struct_string_24, NULL), + YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), + YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), + YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), YAML_ARRAY("anaNames", 24, 9, struct_string_24, NULL), - YAML_PADDING( 8 ), + YAML_STRING("currModelFilename", 17), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "blOffBright", 7 ), YAML_STRING("bluetoothName", 10), + YAML_STRING("themeName", 8), + YAML_STRUCT("themeData", 480, struct_OpenTxTheme__PersistentData, NULL), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { @@ -326,17 +389,17 @@ static const struct YamlNode struct_unsigned_8[] = { YAML_END }; static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 12), + YAML_STRING("name", 15), YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_STRING("bitmap", 10), + YAML_STRING("bitmap", 14), YAML_END }; static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -356,7 +419,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -474,7 +537,7 @@ static const struct YamlNode struct_VarioData[] = { }; static const struct YamlNode struct_RssiAlarmData[] = { YAML_SIGNED( "disabled", 1 ), - YAML_PADDING( 1 ), + YAML_UNSIGNED( "flysky_telemetry", 1 ), YAML_SIGNED( "warning", 6 ), YAML_PADDING( 2 ), YAML_SIGNED( "critical", 6 ), @@ -527,6 +590,25 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), YAML_END }; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; static const struct YamlNode union_anonymous_4_elmts[] = { YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), @@ -534,6 +616,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -560,7 +644,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED( "source", 8 ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -580,61 +664,61 @@ static const struct YamlNode struct_string_32[] = { YAML_STRING("val", 4), YAML_END }; -static const struct YamlNode union_anonymous_10_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_12[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_12, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_14[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_13_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_14, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_15, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_16, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_17, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_18, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_10_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_11_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -647,44 +731,37 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_13_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; -static const struct YamlNode struct_FrSkyBarData[] = { +static const struct YamlNode struct_WidgetPersistentData[] = { + YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_ZonePersistentData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), + YAML_STRING("widgetName", 10), + YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LayoutPersistentData[] = { + YAML_ARRAY("zones", 576, 10, struct_ZonePersistentData, NULL), + YAML_ARRAY("options", 96, 10, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomScreenData[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_STRING("LayoutId", 10), + YAML_STRUCT("layoutData", 6720, struct_LayoutPersistentData, NULL), YAML_END }; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData[] = { - YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), +static const struct YamlNode struct_TopBarPersistentData[] = { + YAML_ARRAY("zones", 576, 2, struct_ZonePersistentData, NULL), + YAML_ARRAY("options", 96, 1, struct_ZoneOptionValueTyped, NULL), YAML_END }; static const struct YamlNode struct_ModelData[] = { - YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), YAML_UNSIGNED( "telemetryProtocol", 3 ), YAML_UNSIGNED( "thrTrim", 1 ), @@ -704,17 +781,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 32 ), - YAML_UNSIGNED( "switchWarningEnable", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED( "rssiSource", 8 ), - YAML_UNSIGNED( "voltsSource", 8 ), - YAML_UNSIGNED( "altitudeSource", 8 ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), @@ -722,19 +796,19 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("scriptsData", 192, 9, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_ARRAY("screenData", 6800, 5, struct_CustomScreenData, NULL), + YAML_STRUCT("topbarData", 1248, struct_TopBarPersistentData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END }; static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index fc2de09a6..bb99cd833 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -77,6 +118,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -165,7 +207,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -236,15 +278,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -252,7 +294,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -262,18 +304,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -290,12 +332,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -326,9 +368,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -348,7 +390,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -520,12 +562,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -535,7 +587,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -577,61 +630,61 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -644,7 +697,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index e1f34b27d..bb99cd833 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -77,6 +118,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -165,7 +207,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -236,15 +278,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -252,7 +294,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -262,18 +304,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -290,12 +332,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -326,9 +368,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -348,7 +390,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -519,6 +561,25 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), YAML_END }; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; static const struct YamlNode union_anonymous_4_elmts[] = { YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), @@ -526,6 +587,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -567,61 +630,61 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; -static const struct YamlNode union_anonymous_10_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_12[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_12, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_14[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_13_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_14, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_15, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_16, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_17, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_18, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_10_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_11_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -634,7 +697,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_13_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index fc2de09a6..bb99cd833 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -77,6 +118,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -165,7 +207,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -236,15 +278,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -252,7 +294,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -262,18 +304,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -290,12 +332,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -326,9 +368,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -348,7 +390,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -520,12 +562,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -535,7 +587,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -577,61 +630,61 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -644,7 +697,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 7a88c336a..29ed5ef37 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -77,6 +118,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -165,7 +207,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -236,15 +278,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -252,7 +294,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -262,18 +304,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -290,12 +332,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -326,9 +368,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -348,7 +390,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -520,12 +562,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -535,7 +587,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -577,61 +630,61 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -644,7 +697,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 5a5479957..a65a97de0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -40,6 +64,23 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_String, "String" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -95,6 +136,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -193,7 +235,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -281,13 +323,13 @@ static const struct YamlNode struct_OpenTxTheme__PersistentData[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 15, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -295,7 +337,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -305,18 +347,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_PADDING( 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -333,12 +375,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -355,6 +397,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_STRING("themeName", 8), YAML_STRUCT("themeData", 480, struct_OpenTxTheme__PersistentData, NULL), YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { @@ -371,9 +414,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -393,7 +436,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -565,12 +608,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -580,7 +633,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -627,61 +681,61 @@ static const struct YamlNode struct_string_32[] = { YAML_STRING("val", 4), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -694,7 +748,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_WidgetPersistentData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index df848eaf5..1e4703333 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -40,6 +64,23 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_String, "String" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -194,7 +235,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -282,13 +323,13 @@ static const struct YamlNode struct_OpenTxTheme__PersistentData[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 15, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -296,7 +337,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -306,18 +347,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_PADDING( 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -334,12 +375,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -356,6 +397,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_STRING("themeName", 8), YAML_STRUCT("themeData", 480, struct_OpenTxTheme__PersistentData, NULL), YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { @@ -372,9 +414,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -394,7 +436,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -566,12 +608,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -581,7 +633,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -628,61 +681,61 @@ static const struct YamlNode struct_string_32[] = { YAML_STRING("val", 4), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -695,7 +748,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_WidgetPersistentData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index fc2de09a6..bb99cd833 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -77,6 +118,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -165,7 +207,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -236,15 +278,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -252,7 +294,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -262,18 +304,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -290,12 +332,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -326,9 +368,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -348,7 +390,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -520,12 +562,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -535,7 +587,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -577,61 +630,61 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -644,7 +697,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 2a978e441..4534d0548 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -81,6 +122,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -172,7 +214,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -243,15 +285,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 9, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -259,7 +301,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -269,18 +311,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -297,12 +339,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -334,9 +376,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -356,7 +398,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -527,6 +569,25 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), YAML_END }; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; static const struct YamlNode union_anonymous_4_elmts[] = { YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), @@ -534,6 +595,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -580,61 +643,61 @@ static const struct YamlNode struct_string_32[] = { YAML_STRING("val", 4), YAML_END }; -static const struct YamlNode union_anonymous_10_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_12[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_12, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_14[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_13_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_14, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_15, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_16, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_17, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_18, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_10_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_11_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -647,7 +710,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_13_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index ba286e560..b219622d6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -93,6 +134,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -211,7 +253,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -282,15 +324,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -298,7 +340,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -308,18 +350,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -336,12 +378,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -373,9 +415,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -395,7 +437,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -567,12 +609,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -582,7 +634,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -629,61 +682,61 @@ static const struct YamlNode struct_string_32[] = { YAML_STRING("val", 4), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -696,7 +749,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index ccdd8f071..7acb1cc7c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -73,6 +114,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -152,7 +194,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -223,15 +265,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 5, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -239,7 +281,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -249,18 +291,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -277,12 +319,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -311,9 +353,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -333,7 +375,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -505,12 +547,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -520,7 +572,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -562,61 +615,61 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -629,7 +682,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 79a29f41d..95ca3f117 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -75,6 +116,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -160,7 +202,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -231,15 +273,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 5, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -247,7 +289,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -257,18 +299,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -285,12 +327,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -321,9 +363,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -343,7 +385,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -515,12 +557,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -530,7 +582,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -572,61 +625,61 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -639,7 +692,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 48bd6b028..eb75a1fee 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -75,6 +116,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -157,7 +199,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -228,15 +270,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -244,7 +286,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -254,18 +296,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -282,12 +324,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -318,9 +360,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -340,7 +382,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -512,12 +554,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -527,7 +579,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -569,61 +622,61 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -636,7 +689,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 4e176f40f..4df9eb39c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -4,6 +4,30 @@ // Enums first // +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -33,6 +57,23 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REP, "REP" }, + { 0, NULL } +}; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, { MIXSRC_Rud, "Rud" }, @@ -77,6 +118,7 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, { MIXSRC_TIMER1, "TIMER1" }, { MIXSRC_TIMER2, "TIMER2" }, { MIXSRC_TIMER3, "TIMER3" }, @@ -159,7 +201,7 @@ 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_AFHDS3, "TYPE_AFHDS3" }, + { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, { MODULE_TYPE_COUNT, "TYPE_COUNT" }, { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } @@ -230,15 +272,15 @@ static const struct YamlNode struct_string_24[] = { }; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), - YAML_UNSIGNED( "variant", 16 ), + YAML_PADDING( 16 ), YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_UNSIGNED( "chkSum", 16 ), + YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_UNSIGNED( "backlightMode", 3 ), - YAML_SIGNED( "antennaMode", 2 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), YAML_PADDING( 1 ), @@ -246,7 +288,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "view", 8 ), YAML_PADDING( 2 ), YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED( "beepMode", 2 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), YAML_UNSIGNED( "alarmsFlash", 1 ), YAML_UNSIGNED( "disableMemoryWarning", 1 ), YAML_UNSIGNED( "disableAlarmWarning", 1 ), @@ -256,18 +298,18 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "inactivityTimer", 8 ), YAML_UNSIGNED( "telemetryBaudrate", 3 ), YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED( "hapticMode", 2 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), YAML_SIGNED( "switchesDelay", 8 ), YAML_UNSIGNED( "lightAutoOff", 8 ), YAML_UNSIGNED( "templateSetup", 8 ), YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED( "hapticLength", 8 ), - YAML_SIGNED( "beepLength", 3 ), - YAML_SIGNED( "hapticStrength", 3 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), YAML_UNSIGNED( "gpsFormat", 1 ), YAML_UNSIGNED( "unexpectedShutdown", 1 ), - YAML_UNSIGNED( "speakerPitch", 8 ), - YAML_SIGNED( "speakerVolume", 8 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), YAML_UNSIGNED( "backlightBright", 8 ), @@ -284,12 +326,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "jackMode", 2 ), YAML_PADDING( 1 ), YAML_STRING("ttsLanguage", 2), - YAML_SIGNED( "beepVolume", 4 ), - YAML_SIGNED( "wavVolume", 4 ), - YAML_SIGNED( "varioVolume", 4 ), - YAML_SIGNED( "backgroundVolume", 4 ), - YAML_SIGNED( "varioPitch", 8 ), - YAML_SIGNED( "varioRange", 8 ), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), @@ -322,9 +364,9 @@ static const struct YamlNode struct_ModelHeader[] = { static const struct YamlNode struct_TimerData[] = { YAML_IDX, YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED( "swtch", 10 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_SIGNED( "value", 22 ), - YAML_UNSIGNED( "mode", 3 ), + YAML_ENUM("mode", 3, enum_TimerModes), YAML_UNSIGNED( "countdownBeep", 2 ), YAML_UNSIGNED( "minuteBeep", 1 ), YAML_UNSIGNED( "persistent", 2 ), @@ -344,7 +386,7 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "carryTrim", 1 ), YAML_UNSIGNED( "mixWarn", 2 ), - YAML_UNSIGNED( "mltpx", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), @@ -516,12 +558,22 @@ static const struct YamlNode struct_anonymous_9[] = { YAML_END }; static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { YAML_UNSIGNED( "bindPower", 3 ), YAML_UNSIGNED( "runPower", 3 ), YAML_UNSIGNED( "emi", 1 ), YAML_UNSIGNED( "telemetry", 1 ), YAML_UNSIGNED( "failsafeTimeout", 16 ), YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), YAML_END }; static const struct YamlNode union_anonymous_4_elmts[] = { @@ -531,7 +583,8 @@ static const struct YamlNode union_anonymous_4_elmts[] = { YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 48, struct_anonymous_10, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), YAML_END }; static const struct YamlNode struct_ModuleData[] = { @@ -573,61 +626,61 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; -static const struct YamlNode union_anonymous_11_elmts[] = { +static const struct YamlNode union_anonymous_12_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_13[] = { +static const struct YamlNode struct_anonymous_14[] = { YAML_UNSIGNED( "physID", 5 ), YAML_UNSIGNED( "rxIndex", 3 ), YAML_END }; -static const struct YamlNode union_anonymous_12_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_13, NULL), +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), YAML_UNSIGNED( "formula", 8 ), YAML_END }; -static const struct YamlNode struct_anonymous_15[] = { +static const struct YamlNode struct_anonymous_16[] = { YAML_UNSIGNED( "ratio", 16 ), YAML_SIGNED( "offset", 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_16[] = { +static const struct YamlNode struct_anonymous_17[] = { YAML_UNSIGNED( "source", 8 ), YAML_UNSIGNED( "index", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode struct_anonymous_17[] = { +static const struct YamlNode struct_anonymous_18[] = { YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), YAML_END }; -static const struct YamlNode struct_anonymous_18[] = { +static const struct YamlNode struct_anonymous_19[] = { YAML_UNSIGNED( "source", 8 ), YAML_PADDING( 24 ), YAML_END }; -static const struct YamlNode struct_anonymous_19[] = { +static const struct YamlNode struct_anonymous_20[] = { YAML_UNSIGNED( "gps", 8 ), YAML_UNSIGNED( "alt", 8 ), YAML_PADDING( 16 ), YAML_END }; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_15, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_16, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_17, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_18, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_19, NULL), +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), YAML_UNSIGNED( "param", 32 ), YAML_END }; static const struct YamlNode struct_TelemetrySensor[] = { YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_11_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_12_elmts, select_id2), + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), YAML_UNSIGNED( "type", 1 ), @@ -640,7 +693,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNSIGNED( "persistent", 1 ), YAML_UNSIGNED( "onlyPositive", 1 ), YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_14_elmts, select_sensor_cfg), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), YAML_END }; static const struct YamlNode struct_FrSkyBarData[] = { diff --git a/radio/src/targets/nv14/CMakeLists.txt b/radio/src/targets/nv14/CMakeLists.txt index f98789ac5..5324ccd56 100644 --- a/radio/src/targets/nv14/CMakeLists.txt +++ b/radio/src/targets/nv14/CMakeLists.txt @@ -28,6 +28,11 @@ else() set(LINKER_SCRIPT targets/nv14/stm32f4_flash.ld) endif() +if(YAML_STORAGE) + set(STORAGE_FORMAT YAML) + set(STORAGE_CONVERT SDCARD_RAW) +endif() + set(RTC_BACKUP_RAM YES) set(PPM_LIMITS_SYMETRICAL YES) # for size report script diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 592889249..737b5bacb 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -62,7 +62,7 @@ elseif(PCB STREQUAL X9D+) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(PCBREV 2014 CACHE STRING "PCB Revision") - set(AFHDS3 NO) + #set(AFHDS3 NO) add_definitions(-DPCBREV=${PCBREV}) add_definitions(-DMANUFACTURER_FRSKY) if (${PCBREV} STREQUAL 2019) @@ -119,7 +119,7 @@ elseif(PCB STREQUAL X9D) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS NO) add_definitions(-DMANUFACTURER_FRSKY) - set(AFHDS3 NO) + #set(AFHDS3 NO) elseif(PCB STREQUAL X7) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(HAPTIC YES) @@ -173,7 +173,7 @@ elseif(PCB STREQUAL X7) elseif(PCBREV STREQUAL T8) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) set(EXTERNAL_MODULE NO) - set(AFHDS3 NO) + #set(AFHDS3 NO) set(FLAVOUR t8) set(NAVIGATION_TYPE x7) set(CPU_TYPE STM32F2) diff --git a/tools/generate-yaml.sh b/tools/generate-yaml.sh new file mode 100755 index 000000000..eb8dea179 --- /dev/null +++ b/tools/generate-yaml.sh @@ -0,0 +1,107 @@ +#!/bin/bash + +# Stops on first error, echo on +set -e +set -x + +# Add GCC_ARM to PATH +if [[ -n ${GCC_ARM} ]] ; then + export PATH=${GCC_ARM}:$PATH +fi + +: ${FLAVOR:="t12;t8;tlite;tx12;tx16s;x12s;nv14;x7;x9d;x9dp;x9e;x9lite;x9lites;xlite;xlites"} +: ${SRCDIR:=$(dirname $(pwd)/"$0")/..} + +: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -DDISABLE_COMPANION=YES -Wno-dev -DYAML_STORAGE=YES "} + +# wipe build directory clean +rm -rf build && mkdir -p build && cd build + +target_names=$(echo "$FLAVOR" | tr '[:upper:]' '[:lower:]' | tr ';' '\n') + +for target_name in $target_names +do + BUILD_OPTIONS=${COMMON_OPTIONS} + + echo "Generating YAML structures for ${target_name}" + case $target_name in + + x9lite) + BUILD_OPTIONS+="-DPCB=X9LITE" + ;; + x9lites) + BUILD_OPTIONS+="-DPCB=X9LITES" + ;; + x7) + BUILD_OPTIONS+="-DPCB=X7" + ;; + x7-access) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=ACCESS -DPXX1=YES" + ;; + t12) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T12 -DINTERNAL_MODULE_MULTI=ON" + ;; + tx12) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TX12" + ;; + t8) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T8" + ;; + tlite) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TLITE" + ;; + xlite) + BUILD_OPTIONS+="-DPCB=XLITE" + ;; + xlites) + BUILD_OPTIONS+="-DPCB=XLITES" + ;; + x9d) + BUILD_OPTIONS+="-DPCB=X9D" + ;; + x9dp) + BUILD_OPTIONS+="-DPCB=X9D+" + ;; + x9dp2019) + BUILD_OPTIONS+="-DPCB=X9D+ -DPCBREV=2019" + ;; + x9e) + BUILD_OPTIONS+="-DPCB=X9E" + ;; + x10) + BUILD_OPTIONS+="-DPCB=X10" + ;; + x10-access) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=EXPRESS -DPXX1=YES" + ;; + x12s) + BUILD_OPTIONS+="-DPCB=X12S" + ;; + t16) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=T16 -DINTERNAL_MODULE_MULTI=ON" + ;; + t16-fs) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=T16 -DINTERNAL_MODULE_MULTI=ON -DFLYSKY_HALL_STICKS=ON" + ;; + t18) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=T18" + ;; + t18-fs) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=T18 -DFLYSKY_HALL_STICKS=ON" + ;; + tx16s) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=TX16S -DINTERNAL_GPS=ON" + ;; + tx16s-fs) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=TX16S -DFLYSKY_HALL_STICKS=ON" + ;; + nv14) + BUILD_OPTIONS+="-DPCB=NV14" + ;; + esac + + cmake ${BUILD_OPTIONS} "${SRCDIR}" + make yaml_data + + rm -f CMakeCache.txt +done From 4b79cdc795bdf048f62acfdf7e9347bbeedf11aa Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 9 Oct 2021 22:04:56 +0200 Subject: [PATCH 036/110] Fix some b&w target compilation --- radio/src/gui/128x64/model_setup.cpp | 6 +++--- radio/src/gui/common/stdlcd/model_notes.cpp | 6 +----- radio/src/gui/common/stdlcd/view_text.cpp | 6 +----- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 68b0dd210..4373bf497 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1111,7 +1111,7 @@ void menuModelSetup(event_t event) break; #endif -#if defined(AFHDS3) +#if defined(AFHDS3) && defined(HARDWARE_EXTERNAL_MODULE) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS_PROTOCOL: lcdDrawText(INDENT_WIDTH, y, STR_PROTOCOL); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_AFHDS3_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType, attr); @@ -1787,7 +1787,7 @@ void menuModelSetup(event_t event) break; #endif -#if defined(AFHDS3) +#if defined(AFHDS3) && defined(HARDWARE_EXTERNAL_MODULE) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_RX_FREQ: lcdDrawText(INDENT_WIDTH, y, STR_AFHDS3_RX_FREQ); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].afhds3.rxFreq(), attr | LEFT); @@ -1831,7 +1831,7 @@ void menuModelSetup(event_t event) } #endif -#if defined(AFHDS3) +#if defined(AFHDS3) && defined(HARDWARE_EXTERNAL_MODULE) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_STATUS: { lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); diff --git a/radio/src/gui/common/stdlcd/model_notes.cpp b/radio/src/gui/common/stdlcd/model_notes.cpp index e8388043f..47b452b1b 100644 --- a/radio/src/gui/common/stdlcd/model_notes.cpp +++ b/radio/src/gui/common/stdlcd/model_notes.cpp @@ -25,12 +25,8 @@ void menuModelNotes(event_t event) { if (event == EVT_ENTRY) { strcpy(reusableBuffer.viewText.filename, MODELS_PATH "/"); -#if defined(EEPROM) - char *buf = strcat_modelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)], g_eeGeneral.currModel); + char *buf = strcat_currentmodelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)], 0); strcpy(buf, TEXT_EXT); -#else - strcat_currentmodelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)]); -#endif } menuTextView(event); diff --git a/radio/src/gui/common/stdlcd/view_text.cpp b/radio/src/gui/common/stdlcd/view_text.cpp index 5dbc23c9e..0e767e698 100644 --- a/radio/src/gui/common/stdlcd/view_text.cpp +++ b/radio/src/gui/common/stdlcd/view_text.cpp @@ -34,12 +34,8 @@ void readModelNotes() LED_ERROR_BEGIN(); strcpy(reusableBuffer.viewText.filename, MODELS_PATH "/"); -#if defined(EEPROM) - char *buf = strcat_modelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)], g_eeGeneral.currModel); + char *buf = strcat_currentmodelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)], 0); strcpy(buf, TEXT_EXT); -#else - strcat_currentmodelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)]); -#endif waitKeysReleased(); event_t event = EVT_ENTRY; From 96b256cbdbf3f3eeabbe4580b4feb284293ca876 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 9 Oct 2021 22:18:20 +0200 Subject: [PATCH 037/110] Fix for targets without XPOTS --- .../storage/yaml/yaml_datastructs_funcs.cpp | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index bc27df350..f95f952a6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -288,7 +288,14 @@ static uint32_t r_swtchSrc(const YamlNode* node, const char* val, uint8_t val_le val_len--; } - if (val_len > 3 + if (val_len >= 2 + && val[0] == 'L' + && (val[1] >= '0' && val[1] <= '9')) { + + ival = SWSRC_FIRST_LOGICAL_SWITCH + yaml_str2int(val+1, val_len-1) - 1; + } +#if NUM_XPOTS > 0 + else if (val_len > 3 && val[0] == '6' && val[1] == 'P' && (val[2] >= '0' && val[2] <= '9') @@ -297,12 +304,7 @@ static uint32_t r_swtchSrc(const YamlNode* node, const char* val, uint8_t val_le ival = (val[2] - '0') * XPOTS_MULTIPOS_COUNT + (val[3] - '0') + SWSRC_FIRST_MULTIPOS_SWITCH; } - else if (val_len >= 2 - && val[0] == 'L' - && (val[1] >= '0' && val[1] <= '9')) { - - ival = SWSRC_FIRST_LOGICAL_SWITCH + yaml_str2int(val+1, val_len-1) - 1; - } +#endif else if (val_len == 3 && val[0] == 'F' && val[1] == 'M' @@ -332,8 +334,16 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, } const char* str = NULL; - if (sval >= SWSRC_FIRST_MULTIPOS_SWITCH - && sval <= SWSRC_LAST_MULTIPOS_SWITCH) { + if (sval >= SWSRC_FIRST_LOGICAL_SWITCH + && sval <= SWSRC_LAST_LOGICAL_SWITCH) { + + wf(opaque, "L", 1); + str = yaml_unsigned2str(sval - SWSRC_FIRST_LOGICAL_SWITCH + 1); + return wf(opaque,str, strlen(str)); + } +#if NUM_XPOTS > 0 + else if (sval >= SWSRC_FIRST_MULTIPOS_SWITCH + && sval <= SWSRC_LAST_MULTIPOS_SWITCH) { wf(opaque, "6P", 2); @@ -346,13 +356,7 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, str = yaml_unsigned2str(sval % XPOTS_MULTIPOS_COUNT); return wf(opaque,str, strlen(str)); } - else if (sval >= SWSRC_FIRST_LOGICAL_SWITCH - && sval <= SWSRC_LAST_LOGICAL_SWITCH) { - - wf(opaque, "L", 1); - str = yaml_unsigned2str(sval - SWSRC_FIRST_LOGICAL_SWITCH + 1); - return wf(opaque,str, strlen(str)); - } +#endif else if (sval >= SWSRC_FIRST_FLIGHT_MODE && sval <= SWSRC_LAST_FLIGHT_MODE) { From c696313a4e6b575635224cdd03053eb2aba6edfa Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 10 Oct 2021 16:16:40 +0200 Subject: [PATCH 038/110] Use simple scheme with direct model slot to model filename --- radio/src/CMakeLists.txt | 14 +- radio/src/datastructs.h | 40 +- radio/src/gui/128x64/CMakeLists.txt | 8 +- radio/src/gui/128x64/model_select.cpp | 36 +- radio/src/gui/128x64/model_select_sd.cpp | 461 ------------------ radio/src/gui/128x64/model_setup.cpp | 7 +- radio/src/gui/212x64/model_select.cpp | 34 +- radio/src/gui/gui_common.cpp | 5 +- radio/src/opentx.cpp | 2 +- radio/src/opentx.h | 19 +- radio/src/storage/conversions/conversions.cpp | 21 +- radio/src/storage/eeprom_common.cpp | 62 +-- radio/src/storage/eeprom_common.h | 5 - radio/src/storage/sdcard_common.cpp | 36 +- radio/src/storage/sdcard_common.h | 13 + radio/src/storage/sdcard_yaml.cpp | 92 +++- radio/src/storage/storage.h | 9 + radio/src/storage/storage_common.cpp | 63 +++ radio/src/storage/yaml/CMakeLists.txt | 5 +- radio/src/targets/horus/CMakeLists.txt | 5 +- radio/src/targets/taranis/CMakeLists.txt | 6 +- 21 files changed, 284 insertions(+), 659 deletions(-) delete mode 100644 radio/src/gui/128x64/model_select_sd.cpp diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 00810590b..314dde10c 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -154,10 +154,11 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}/bitmaps/${BITMAPS_DIR}) include(gui/CMakeLists.txt) set(SRC ${SRC} storage/storage_common.cpp) + if(${STORAGE} STREQUAL SDCARD) - set(SRC ${SRC} storage/modelslist.cpp storage/sdcard_common.cpp) - if(${STORAGE_FORMAT} STREQUAL BIN) - set(SRC ${SRC} storage/sdcard_raw.cpp) + set(SRC ${SRC} storage/sdcard_common.cpp) + if(${STORAGE_FORMAT} STREQUAL RAW) + set(SRC ${SRC} storage/modelslist.cpp storage/sdcard_raw.cpp) add_definitions(-DSDCARD_RAW) elseif(${STORAGE_FORMAT} STREQUAL YAML) set(SRC ${SRC} storage/sdcard_yaml.cpp) @@ -166,10 +167,14 @@ if(${STORAGE} STREQUAL SDCARD) if (${STORAGE_CONVERT} STREQUAL EEPROM_RLC) set(SRC ${SRC} storage/eeprom_rlc.cpp) add_definitions(-DEEPROM_RLC) - else() + else(${STORAGE_CONVERT} STREQUAL RAW) set(SRC ${SRC} storage/sdcard_raw.cpp) endif() endif() + if(STORAGE_MODELSLIST) + set(SRC ${SRC} storage/modelslist.cpp) + add_definitions(-DSTORAGE_MODELSLIST) + endif() elseif(${STORAGE} STREQUAL EEPROM) set(SRC ${SRC} storage/eeprom_common.cpp) add_definitions(-DEEPROM) @@ -185,6 +190,7 @@ elseif(${STORAGE} STREQUAL EEPROM) endif() endif() + include(storage/conversions/CMakeLists.txt) if(RTC_BACKUP_RAM) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 38232478c..21304de7e 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -759,7 +759,6 @@ PACK(struct TrainerData { NOBACKUP(uint8_t spare5:1 SKIP); \ NOBACKUP(uint8_t blOffBright:7); \ NOBACKUP(char bluetoothName[LEN_BLUETOOTH_NAME]); - #define CURR_MODEL_FILENAME #elif defined(PCBTARANIS) #if defined(STORAGE_BLUETOOTH) #define BLUETOOTH_FIELDS \ @@ -778,14 +777,8 @@ PACK(struct TrainerData { char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]; \ char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME]; \ BLUETOOTH_FIELDS - #if defined(SDCARD_YAML) - #define CURR_MODEL_FILENAME char currModelFilename[LEN_MODEL_FILENAME+1] - #else - #define CURR_MODEL_FILENAME - #endif #else #define EXTRA_GENERAL_FIELDS - #define CURR_MODEL_FILENAME #endif #if defined(COLORLCD) && !defined(BACKUP) @@ -881,9 +874,6 @@ PACK(struct RadioData { GYRO_FIELDS NOBACKUP(int8_t uartSampleMode:2); // See UartSampleModes -#if defined(PCBTARANIS) - CURR_MODEL_FILENAME; -#endif }); #undef SWITCHES_WARNING_DATA @@ -990,39 +980,19 @@ static inline void check_struct() CHKSIZE(TrainerData, 16); #if defined(PCBXLITES) - #if !defined(SDCARD_YAML) - CHKSIZE(RadioData, 861); - #else - CHKSIZE(RadioData, 878); - #endif + CHKSIZE(RadioData, 861); CHKSIZE(ModelData, 6157); #elif defined(PCBXLITE) - #if !defined(SDCARD_YAML) - CHKSIZE(RadioData, 859); - #else - CHKSIZE(RadioData, 876); - #endif + CHKSIZE(RadioData, 859); CHKSIZE(ModelData, 6157); #elif defined(PCBX7) - #if !defined(SDCARD_YAML) - CHKSIZE(RadioData, 865); - #else - CHKSIZE(RadioData, 882); - #endif + CHKSIZE(RadioData, 865); CHKSIZE(ModelData, 6157); #elif defined(PCBX9E) - #if !defined(SDCARD_YAML) - CHKSIZE(RadioData, 961); - #else - CHKSIZE(RadioData, 978); - #endif + CHKSIZE(RadioData, 961); CHKSIZE(ModelData, 6614); #elif defined(PCBX9D) || defined(PCBX9DP) - #if !defined(SDCARD_YAML) - CHKSIZE(RadioData, 899); - #else - CHKSIZE(RadioData, 916); - #endif + CHKSIZE(RadioData, 899); CHKSIZE(ModelData, 6604); #elif defined(PCBHORUS) CHKSIZE(RadioData, 902); diff --git a/radio/src/gui/128x64/CMakeLists.txt b/radio/src/gui/128x64/CMakeLists.txt index 1fe1b2fca..9cbd14165 100644 --- a/radio/src/gui/128x64/CMakeLists.txt +++ b/radio/src/gui/128x64/CMakeLists.txt @@ -1,9 +1,3 @@ -if(${STORAGE} STREQUAL SDCARD) - set(MODEL_SELECT_SRC model_select_sd.cpp) -else() - set(MODEL_SELECT_SRC model_select.cpp) -endif() - set(GUI_SRC ${GUI_SRC} lcd.cpp @@ -11,7 +5,7 @@ set(GUI_SRC popups.cpp widgets.cpp startup_shutdown.cpp - ${MODEL_SELECT_SRC} + model_select.cpp menu_model.cpp model_setup.cpp model_failsafe.cpp diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 351e41f35..38fcbb12f 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -27,7 +27,7 @@ void onDeleteModelConfirm(const char * result) { if (result == STR_OK) { storageCheck(true); - eeDeleteModel(menuVerticalPosition); // delete file + deleteModel(menuVerticalPosition); // delete file s_copyMode = 0; } } @@ -56,7 +56,8 @@ void onModelSelectMenu(const char * result) #if defined(SDCARD) else if (result == STR_BACKUP_MODEL) { storageCheck(true); // force writing of current model data before this is changed - POPUP_WARNING(eeBackupModel(sub)); + // TODO + //POPUP_WARNING(eeBackupModel(sub)); } else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { if (sdListFiles(MODELS_PATH, MODELS_EXT, MENU_LINE_LENGTH-1, nullptr)) @@ -73,10 +74,11 @@ void onModelSelectMenu(const char * result) else if (result != STR_EXIT) { // The user choosed a file on SD to restore storageCheck(true); - POPUP_WARNING(eeRestoreModel(sub, (char *)result)); - if (!warningText && g_eeGeneral.currModel == sub) { - eeLoadModel(sub); - } + // TODO + //POPUP_WARNING(eeRestoreModel(sub, (char *)result)); + //if (!warningText && g_eeGeneral.currModel == sub) { + // eeLoadModel(sub); + //} } #endif } @@ -108,7 +110,7 @@ void menuModelSelect(event_t event) case EVT_KEY_LONG(KEY_EXIT): killEvents(event); - if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && eeModelExists(sub)) { + if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && modelExists(sub)) { POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), 0); } @@ -135,7 +137,7 @@ void menuModelSelect(event_t event) case EVT_KEY_BREAK(KEY_ENTER): s_editMode = 0; if (READ_ONLY()) { - if (g_eeGeneral.currModel != sub && eeModelExists(sub)) { + if (g_eeGeneral.currModel != sub && modelExists(sub)) { selectModel(sub); } } @@ -146,7 +148,7 @@ void menuModelSelect(event_t event) uint8_t cur = (MAX_MODELS + sub + s_copyTgtOfs) % MAX_MODELS; if (s_copyMode == COPY_MODE) { - if (!eeCopyModel(cur, s_copySrcRow)) { + if (!copyModel(cur, s_copySrcRow)) { cur = sub; } } @@ -155,7 +157,7 @@ void menuModelSelect(event_t event) while (sub != cur) { uint8_t src = cur; cur = (s_copyTgtOfs > 0 ? cur+MAX_MODELS-1 : cur+1) % MAX_MODELS; - eeSwapModels(src, cur); + swapModels(src, cur); if (src == s_copySrcRow) s_copySrcRow = cur; else if (cur == s_copySrcRow) @@ -174,7 +176,7 @@ void menuModelSelect(event_t event) s_copyMode = 0; killEvents(event); if (g_eeGeneral.currModel != sub) { - if (eeModelExists(sub)) { + if (modelExists(sub)) { POPUP_MENU_ADD_ITEM(STR_SELECT_MODEL); POPUP_MENU_ADD_SD_ITEM(STR_BACKUP_MODEL); POPUP_MENU_ADD_ITEM(STR_COPY_MODEL); @@ -197,7 +199,7 @@ void menuModelSelect(event_t event) } POPUP_MENU_START(onModelSelectMenu); } - else if (eeModelExists(sub)) { + else if (modelExists(sub)) { s_copyMode = (s_copyMode == COPY_MODE ? MOVE_MODE : COPY_MODE); s_copyTgtOfs = 0; s_copySrcRow = -1; @@ -261,7 +263,7 @@ void menuModelSelect(event_t event) if (s_copySrcRow < 0 && s_copyMode==COPY_MODE) { s_copySrcRow = oldSub; // find a hole (in the first empty slot above / below) - sub = eeFindEmptyModel(s_copySrcRow, IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_DOWN)); + sub = findEmptyModel(s_copySrcRow, IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_DOWN)); if (sub < 0) { // no free room for duplicating the model AUDIO_ERROR(); @@ -276,14 +278,10 @@ void menuModelSelect(event_t event) break; } -#if defined(EEPROM_RLC) +#if defined(EEPROM) lcdDrawText(9*FW-(LEN_FREE-4)*FW-4, 0, STR_FREE); if (event) reusableBuffer.modelsel.eepromfree = EeFsGetFree(); lcdDrawNumber(lcdLastRightPos+3, 0, reusableBuffer.modelsel.eepromfree, LEFT); -#elif defined(EEPROM_RLC) - lcdDrawText(9*FW-(LEN_FREE-4)*FW, 0, STR_FREE); - if (event) reusableBuffer.modelsel.eepromfree = EeFsGetFree(); - lcdDrawNumber(17*FW, 0, reusableBuffer.modelsel.eepromfree, RIGHT); #endif #if defined(NAVIGATION_X7) @@ -320,7 +318,7 @@ void menuModelSelect(event_t event) k %= MAX_MODELS; - if (eeModelExists(k)) { + if (modelExists(k)) { drawModelName(4*FW, y, modelHeaders[k].name, k, 0); if (k==g_eeGeneral.currModel && (s_copyMode!=COPY_MODE || s_copySrcRow<0 || i+menuVerticalOffset!=(vertpos_t)sub)) { lcdDrawChar(1, y, '*'); diff --git a/radio/src/gui/128x64/model_select_sd.cpp b/radio/src/gui/128x64/model_select_sd.cpp deleted file mode 100644 index 3659509b9..000000000 --- a/radio/src/gui/128x64/model_select_sd.cpp +++ /dev/null @@ -1,461 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ -#include "opentx.h" -#include "storage/modelslist.h" - - -#define CATEGORIES_WIDTH 62 -#define MODELSEL_W 62 -#define PHASE_ONE_FIRST_LINE (1 + 1 * FH) - -enum ModelSelectMode { - MODE_SELECT_MODEL, - MODE_RENAME_CATEGORY, - MODE_MOVE_MODEL, -}; - -enum ModelDeleteMode { - MODE_DELETE_MODEL, - MODE_DELETE_CATEGORY, -}; - -struct { - uint8_t selectMode, deleteMode; - ModelsCategory * currentCategory = nullptr; - int currentCategoryIndex; - int16_t subModelIndex = -1; - bool modelSelected = false; - ModelCell * currentModel = nullptr; - ModelCell * selectedModel = nullptr; - tmr10ms_t preEnterTime; - bool preEnterValid = false; - bool categorySelectMode = false; - uint16_t categoriesVerticalOffset = 0; - uint16_t categoriesVerticalPosition = 0; -} modelSelect; - -bool eeModelExists(uint8_t id) -{ - int index = 0; - - for (ModelsCategory::iterator it = modelSelect.currentCategory->begin(); - it != modelSelect.currentCategory->end(); ++it, ++index) { - if (id == index) { - return true; - } - } - - return false; -} - -void setCurrentModel(unsigned int index) -{ - std::list::iterator it = modelSelect.currentCategory->begin(); - std::advance(it, index); - modelSelect.currentModel = *it; -} - -void getSelectedModel(unsigned int index) -{ - std::list::iterator it = modelSelect.currentCategory->begin(); - std::advance(it, index); - modelSelect.selectedModel = *it; -} - -void setCurrentCategory(unsigned int index) -{ - modelSelect.currentCategoryIndex = index; - const std::list& cats = modelslist.getCategories(); - std::list::const_iterator it = cats.begin(); - std::advance(it, index); - modelSelect.currentCategory = *it; - modelSelect.categoriesVerticalPosition = index; - modelSelect.categoriesVerticalOffset = limit(modelSelect.categoriesVerticalPosition - 4, modelSelect.categoriesVerticalOffset, min(modelSelect.categoriesVerticalPosition, max(0, cats.size() - 5))); -} - -void initModelsList() -{ - modelslist.load(); - - modelSelect.categoriesVerticalOffset = 0; - bool found = false; - int index = 0; - const std::list& cats = modelslist.getCategories(); - for (std::list::const_iterator it = cats.begin(); it != cats.end(); ++it, ++index) { - if (*it == modelslist.getCurrentCategory()) { - setCurrentCategory(index); - found = true; - break; - } - } - if (!found) { - setCurrentCategory(0); - } - - menuVerticalOffset = 0; - found = false; - index = 0; - for (ModelsCategory::iterator it = modelSelect.currentCategory->begin(); it != modelSelect.currentCategory->end(); ++it, ++index) { - if (*it == modelslist.getCurrentModel()) { - setCurrentModel(index); - menuVerticalPosition = index; - found = true; - break; - } - } - if (!found) { - modelslist.addModel(modelSelect.currentCategory, g_eeGeneral.currModelFilename); - setCurrentModel(0); - modelslist.setCurrentModel(modelSelect.currentModel); - modelslist.save(); - storageDirty(EE_GENERAL); - storageDirty(EE_MODEL); - storageCheck(true); - } -} - - -void onModelSelectMenu(const char * result) -{ - if (result == STR_SELECT_MODEL) { - setCurrentModel(menuVerticalPosition); - storageFlushCurrentModel(); - storageCheck(true); - memcpy(g_eeGeneral.currModelFilename, modelSelect.currentModel->modelFilename, LEN_MODEL_FILENAME); - modelslist.setCurrentModel(modelSelect.currentModel); - loadModel(g_eeGeneral.currModelFilename, true); - modelslist.setCurrentCategory(modelSelect.currentCategory); - modelslist.save(); -#if defined(INTERNAL_MODULE_CRSF) - if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) { - crossfireTurnOnRf(); - bkregSetStatusFlag(CRSF_SET_MODEL_ID_PENDING); - } - else { - crossfireTurnOffRf(false); - } -#endif - storageDirty(EE_GENERAL); - storageCheck(true); - } - else if (result == STR_DELETE_MODEL) { - getSelectedModel(menuVerticalPosition); - POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); - SET_WARNING_INFO(modelSelect.selectedModel->modelName, LEN_MODEL_NAME, 0); - modelSelect.deleteMode = MODE_DELETE_MODEL; - } - else if (result == STR_CREATE_MODEL) { - storageCheck(true); - modelslist.addModel(modelSelect.currentCategory, createModel()); - modelSelect.selectMode = MODE_SELECT_MODEL; - setCurrentModel(modelSelect.currentCategory->size() - 1 ); - modelslist.setCurrentModel(modelSelect.currentModel); - modelslist.onNewModelCreated(modelSelect.currentModel, &g_model); - modelslist.setCurrentCategory(modelSelect.currentCategory); - modelslist.save(); -#if defined(INTERNAL_MODULE_CRSF) - if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) { - crossfireTurnOnRf(); - bkregSetStatusFlag(CRSF_SET_MODEL_ID_PENDING); - } - else { - crossfireTurnOffRf(false); - } -#endif - storageDirty(EE_GENERAL); - storageCheck(true); - menuVerticalPosition = modelSelect.currentCategory->size() - 1; - } - else if (result == STR_DUPLICATE_MODEL) { - char duplicatedFilename[LEN_MODEL_FILENAME + 1]; - setCurrentModel(menuVerticalPosition); - memcpy(duplicatedFilename, modelSelect.currentModel->modelFilename, sizeof(duplicatedFilename)); - if (findNextFileIndex(duplicatedFilename, LEN_MODEL_FILENAME, MODELS_PATH)) { - sdCopyFile(modelSelect.currentModel->modelFilename, MODELS_PATH, duplicatedFilename, MODELS_PATH); - ModelCell* dup_model = modelslist.addModel(modelSelect.currentCategory, duplicatedFilename); - dup_model->fetchRfData(); - menuVerticalPosition = modelSelect.currentCategory->size() - 1; - } - else { - POPUP_WARNING("Invalid File"); - } - } - else if (result == STR_MOVE_MODEL) { - setCurrentModel(menuVerticalPosition); - modelSelect.selectMode = MODE_MOVE_MODEL; - modelSelect.categorySelectMode = true; - } - else if (result == STR_CREATE_CATEGORY) { - modelSelect.currentCategory = modelslist.createCategory(); - setCurrentCategory(modelslist.getCategories().size() - 1); - modelslist.save(); - storageDirty(EE_GENERAL); - storageCheck(true); - } - else if (result == STR_RENAME_CATEGORY) { - modelSelect.selectMode = MODE_RENAME_CATEGORY; - s_editMode = EDIT_MODIFY_STRING; - editNameCursorPos = 0; - } - else if (result == STR_DELETE_CATEGORY) { - if (modelSelect.currentCategory->size() > 0){ - POPUP_WARNING(STR_DELETE_ERROR); - SET_WARNING_INFO(STR_CAT_NOT_EMPTY, sizeof(TR_CAT_NOT_EMPTY), 0); - } - else { - POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); - SET_WARNING_INFO(modelSelect.currentCategory->name, LEN_MODEL_FILENAME, 0); - modelSelect.deleteMode = MODE_DELETE_CATEGORY; - } - } -} - -void menuModelSelect(event_t event) -{ - int8_t old_editMode = s_editMode; - - if (warningResult) { - warningResult = 0; - - if (modelSelect.deleteMode == MODE_DELETE_CATEGORY) { - TRACE("DELETE CATEGORY"); - modelslist.removeCategory(modelSelect.currentCategory); - modelslist.save(); - setCurrentCategory(modelSelect.currentCategoryIndex > 0 ? modelSelect.currentCategoryIndex-1 : modelSelect.currentCategoryIndex); - } - else if (modelSelect.deleteMode == MODE_DELETE_MODEL) { - int modelIndex = menuVerticalPosition; - setCurrentModel(modelIndex); - modelslist.removeModel(modelSelect.currentCategory, modelSelect.currentModel); - modelSelect.selectMode = 0; - menuVerticalPosition = modelSelect.currentCategory->size()-1; - } - } - - const std::list& cats = modelslist.getCategories(); - - title(STR_MENUMODELSEL); - drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), 0); - - event_t _event_ = ((event==EVT_KEY_BREAK(KEY_ENTER) || event==EVT_KEY_LONG(KEY_ENTER)) ? 0 : event); - check_submenu_simple(_event_, modelSelect.currentCategory ? modelSelect.currentCategory->size() : 30); - - switch (event) { - case EVT_ENTRY: - modelSelect.selectMode = MODE_SELECT_MODEL; - initModelsList(); - modelSelect.preEnterValid = false; - modelSelect.categorySelectMode = false; - break; - case EVT_KEY_BREAK(KEY_ENTER): - if (modelSelect.selectMode == MODE_MOVE_MODEL) { - modelSelect.selectMode = MODE_SELECT_MODEL; - modelSelect.categorySelectMode = false; - } - killEvents(event); - break; - case EVT_KEY_FIRST(KEY_EXIT): - switch (modelSelect.selectMode) { - case MODE_MOVE_MODEL: - modelSelect.selectMode = MODE_SELECT_MODEL; - break; - } - break; - case EVT_KEY_FIRST(KEY_ENTER): - if (!modelSelect.preEnterValid) { - modelSelect.preEnterValid = true; - modelSelect.preEnterTime = get_tmr10ms(); - } - else { - modelSelect.preEnterValid = false; - modelSelect.categorySelectMode = !modelSelect.categorySelectMode; - // if (modelSelect.categorySelectMode) - // AUDIO_CATEGORY_ENABLE(); - // else - // AUDIO_CATEGORY_DISABLE(); - } - break; - -#if defined(KEYS_GPIO_REG_PAGE) - case EVT_KEY_BREAK(KEY_PAGE): - { - if (modelSelect.categorySelectMode) { - if (modelSelect.categoriesVerticalPosition >= cats.size() - 1) - modelSelect.categoriesVerticalPosition = 0; - else - modelSelect.categoriesVerticalPosition += 1; - - if (modelSelect.selectMode == MODE_SELECT_MODEL) { - setCurrentCategory(modelSelect.categoriesVerticalPosition); - menuVerticalPosition = 0; - } - if (modelSelect.selectMode == MODE_MOVE_MODEL) { - ModelsCategory * previous_category = modelSelect.currentCategory; - ModelCell * model = modelSelect.currentModel; - setCurrentCategory(modelSelect.categoriesVerticalPosition); - modelslist.moveModel(model, previous_category, modelSelect.currentCategory); - menuVerticalPosition = modelSelect.currentCategory->size()-1; - } - - modelSelect.subModelIndex = -1; - modelSelect.modelSelected = false; - killEvents(event); - } - else { - chainMenu(menuModelSetup); - } - break; - } - - case EVT_KEY_LONG(KEY_PAGE): - { - if (modelSelect.categorySelectMode) { - if (modelSelect.categoriesVerticalPosition == 0) - modelSelect.categoriesVerticalPosition = cats.size() - 1; - else - modelSelect.categoriesVerticalPosition -= 1; - - if (modelSelect.selectMode == MODE_SELECT_MODEL) { - setCurrentCategory(modelSelect.categoriesVerticalPosition); - menuVerticalPosition = 0; - } - if (modelSelect.selectMode == MODE_MOVE_MODEL) { - ModelsCategory * previous_category = modelSelect.currentCategory; - ModelCell * model = modelSelect.currentModel; - setCurrentCategory(modelSelect.categoriesVerticalPosition); - modelslist.moveModel(model, previous_category, modelSelect.currentCategory); - } - - modelSelect.subModelIndex = -1; - modelSelect.modelSelected = false; - killEvents(event); - } - else { - chainMenu(menuTabModel[DIM(menuTabModel)-1]); - killEvents(event); - } - break; - } -#endif - case EVT_KEY_LONG(KEY_ENTER): - if (modelSelect.selectMode == MODE_SELECT_MODEL) { - killEvents(event); - if (!modelSelect.modelSelected && !modelSelect.currentCategory->empty()) { - POPUP_MENU_ADD_ITEM(STR_SELECT_MODEL); - } - POPUP_MENU_ADD_ITEM(STR_CREATE_MODEL); - if (!modelSelect.currentCategory->empty()) { - if (modelSelect.currentModel) { - POPUP_MENU_ADD_ITEM(STR_DUPLICATE_MODEL); - POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); - } - if (!modelSelect.modelSelected) { - POPUP_MENU_ADD_ITEM(STR_DELETE_MODEL); - } - } - POPUP_MENU_ADD_ITEM(STR_CREATE_CATEGORY); - POPUP_MENU_ADD_ITEM(STR_RENAME_CATEGORY); - if (cats.size() > 1) { - POPUP_MENU_ADD_ITEM(STR_DELETE_CATEGORY); - } - POPUP_MENU_START(onModelSelectMenu); - } - killEvents(event); - break; - default: - break; - } - - if (modelSelect.preEnterValid && (get_tmr10ms() - modelSelect.preEnterTime) > 50) { - modelSelect.preEnterValid = false; - } - - int index = 0; - coord_t y = 18; - - drawVerticalScrollbar(CATEGORIES_WIDTH - 1, y - 1, 4 * (FH + 7) - 5, modelSelect.categoriesVerticalOffset, cats.size(), 5); - - // Categories - for (std::list::const_iterator it = cats.begin(); it != cats.end(); ++it, ++index) { - if (index >= modelSelect.categoriesVerticalOffset && index < modelSelect.categoriesVerticalOffset + 5) { - coord_t y = MENU_HEADER_HEIGHT * 2 + 1 + (index - modelSelect.categoriesVerticalOffset) * FH * 4 / 3; - uint8_t k = index ; - - if (modelSelect.selectMode == MODE_RENAME_CATEGORY && modelSelect.currentCategory == *it) { - lcdDrawSolidFilledRect(9, y, MODELSEL_W - 1 - 9, 7); - lcdDrawRect(8, y - 1, MODELSEL_W - 1 - 7, 9, DOTTED); - editName(4, y, modelSelect.currentCategory->name, sizeof(modelSelect.currentCategory->name), event, 1, 0, old_editMode); - if (s_editMode == 0 || event == EVT_KEY_BREAK(KEY_EXIT)) { - modelslist.save(); - modelSelect.selectMode = MODE_SELECT_MODEL; - } - } - else { - lcdDrawSizedText(2, y, (*it)->name, strlen((*it)->name), ((modelSelect.categoriesVerticalPosition == k) ? INVERS : 0)); - } - if (modelSelect.selectMode == MODE_MOVE_MODEL && modelSelect.categoriesVerticalPosition == k) { - lcdDrawSolidFilledRect(9, y, MODELSEL_W - 1 - 9, 7); - lcdDrawRect(8, y - 1, MODELSEL_W - 1 - 7, 9, modelSelect.selectMode == COPY_MODE ? SOLID : DOTTED); - } - } - } - - // Models - index = 0; - bool selected = false; - bool current = false; - - for (uint8_t i = 0; i < modelSelect.currentCategory->size(); i++) { - coord_t y = MENU_HEADER_HEIGHT*2 + 1 + i*FH; - uint8_t k = i+menuVerticalOffset; - - if (k >= modelSelect.currentCategory->size()) - break; - - std::list::iterator it = modelSelect.currentCategory->begin(); - std::advance(it, k); - - selected = ((modelSelect.selectMode == MODE_SELECT_MODEL || modelSelect.selectMode == MODE_MOVE_MODEL) && k == menuVerticalPosition); - current = !strncmp((*it)->modelFilename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME); - - if (current) { - lcdDrawChar(9 * FW + 11, y, '*'); - lcdDrawText(9 * FW + 18, y, g_model.header.name, LEADING0 | ((selected) ? INVERS : 0)); - modelSelect.subModelIndex = k; - } - else { - lcdDrawText(9 * FW + 18, y, (*it)->modelName, LEADING0 | ((selected) ? INVERS : 0)); - } - - y += 16; - - if (selected) { - lcdDrawText(5, LCD_H - FH - 1, (*it)->modelFilename, SMLSIZE); - } - } - - if (modelSelect.subModelIndex == menuVerticalPosition) { - modelSelect.modelSelected = true; - } - else { - modelSelect.modelSelected = false; - } -} - diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4373bf497..76b243894 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1419,10 +1419,11 @@ void menuModelSetup(event_t event) } else if (event == EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); -#if defined(EEPROM) - uint8_t newVal = findNextUnusedModelId(g_eeGeneral.currModel, moduleIdx); + uint8_t newVal = 0; +#if defined(STORAGE_MODELSLIST) + newVal = modelslist.findNextUnusedModelId(moduleIdx); #else - uint8_t newVal = modelslist.findNextUnusedModelId(moduleIdx); + newVal = findNextUnusedModelId(g_eeGeneral.currModel, moduleIdx); #endif if (newVal != g_model.header.modelId[moduleIdx]) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx] = newVal; diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index 990d4aa5f..8b48001a0 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -46,7 +46,8 @@ void onModelSelectMenu(const char * result) } else if (result == STR_BACKUP_MODEL) { storageCheck(true); // force writing of current model data before this is changed - POPUP_WARNING(eeBackupModel(sub)); + //TODO + //POPUP_WARNING(eeBackupModel(sub)); } else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { if (sdListFiles(MODELS_PATH, MODELS_EXT, MENU_LINE_LENGTH-1, nullptr)) @@ -63,10 +64,11 @@ void onModelSelectMenu(const char * result) else if (result != STR_EXIT) { // The user choosed a file on SD to restore storageCheck(true); - POPUP_WARNING(eeRestoreModel(sub, (char *)result)); - if (!warningText && g_eeGeneral.currModel == sub) { - eeLoadModel(sub); - } + // TODO + // POPUP_WARNING(eeRestoreModel(sub, (char *)result)); + // if (!warningText && g_eeGeneral.currModel == sub) { + // eeLoadModel(sub); + // } } } @@ -75,7 +77,7 @@ void menuModelSelect(event_t event) if (warningResult) { warningResult = 0; storageCheck(true); - eeDeleteModel(menuVerticalPosition); // delete file + deleteModel(menuVerticalPosition); // delete file s_copyMode = 0; event = EVT_ENTRY_UP; } @@ -104,7 +106,7 @@ void menuModelSelect(event_t event) break; case EVT_KEY_LONG(KEY_EXIT): - if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && eeModelExists(sub)) { + if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && modelExists(sub)) { char * nametmp = reusableBuffer.modelsel.mainname; strcat_modelname (nametmp, sub); POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); @@ -132,7 +134,7 @@ void menuModelSelect(event_t event) case EVT_KEY_BREAK(KEY_ENTER): s_editMode = 0; if (READ_ONLY()) { - if (g_eeGeneral.currModel != sub && eeModelExists(sub)) { + if (g_eeGeneral.currModel != sub && modelExists(sub)) { selectModel(sub); } } @@ -143,7 +145,7 @@ void menuModelSelect(event_t event) uint8_t cur = (MAX_MODELS + sub + s_copyTgtOfs) % MAX_MODELS; if (s_copyMode == COPY_MODE) { - if (!eeCopyModel(cur, s_copySrcRow)) { + if (!copyModel(cur, s_copySrcRow)) { cur = sub; } } @@ -152,7 +154,7 @@ void menuModelSelect(event_t event) while (sub != cur) { uint8_t src = cur; cur = (s_copyTgtOfs > 0 ? cur+MAX_MODELS-1 : cur+1) % MAX_MODELS; - eeSwapModels(src, cur); + swapModels(src, cur); if (src == s_copySrcRow) s_copySrcRow = cur; else if (cur == s_copySrcRow) @@ -171,7 +173,7 @@ void menuModelSelect(event_t event) s_copyMode = 0; killEvents(event); if (g_eeGeneral.currModel != sub) { - if (eeModelExists(sub)) { + if (modelExists(sub)) { POPUP_MENU_ADD_ITEM(STR_SELECT_MODEL); POPUP_MENU_ADD_SD_ITEM(STR_BACKUP_MODEL); POPUP_MENU_ADD_ITEM(STR_COPY_MODEL); @@ -190,7 +192,7 @@ void menuModelSelect(event_t event) } POPUP_MENU_START(onModelSelectMenu); } - else if (eeModelExists(sub)) { + else if (modelExists(sub)) { s_copyMode = (s_copyMode == COPY_MODE ? MOVE_MODE : COPY_MODE); s_copyTgtOfs = 0; s_copySrcRow = -1; @@ -219,7 +221,7 @@ void menuModelSelect(event_t event) if (s_copySrcRow < 0 && s_copyMode==COPY_MODE) { s_copySrcRow = oldSub; // find a hole (in the first empty slot above / below) - sub = eeFindEmptyModel(s_copySrcRow, event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)); + sub = findEmptyModel(s_copySrcRow, event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)); if (sub < 0) { // no free room for duplicating the model AUDIO_ERROR(); @@ -234,9 +236,11 @@ void menuModelSelect(event_t event) break; } +#if defined(EEPROM) lcdDrawNumber(19*FW, 0, EeFsGetFree(), RIGHT); lcdDrawText(19*FW + 3, 0, STR_BYTES); lcdDrawText(lcdLastRightPos + 3, 0, STR_FREE); +#endif drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), 0); lcdDrawFilledRect(0, 0, LCD_W, FH, SOLID, FILL_WHITE|GREY_DEFAULT); @@ -267,9 +271,11 @@ void menuModelSelect(event_t event) k %= MAX_MODELS; - if (eeModelExists(k)) { + if (modelExists(k)) { drawModelName(4*FW, y, modelHeaders[k].name, k, 0); +#if defined(EEPROM) lcdDrawNumber(20*FW, y, eeModelSize(k), RIGHT); +#endif if (k==g_eeGeneral.currModel && (s_copyMode!=COPY_MODE || s_copySrcRow<0 || i+menuVerticalOffset!=(vertpos_t)sub)) lcdDrawChar(1, y, '*'); } diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 55a265b37..05b5527aa 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -843,8 +843,9 @@ bool modelHasNotes() return true; } -#if !defined(EEPROM) - buf = strAppendFilename(&filename[sizeof(MODELS_PATH)], g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME); +#if defined(STORAGE_MODELSLIST) + buf = strAppendFilename(&filename[sizeof(MODELS_PATH)], + g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME); strcpy(buf, TEXT_EXT); if (isFileAvailable(filename)) { return true; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 5e6c2c64b..3b917919d 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -335,7 +335,7 @@ void generalDefault() memcpy(g_eeGeneral.bluetoothName, defaultName, sizeof(defaultName)); #endif -#if !defined(EEPROM) +#if defined(STORAGE_MODELSLIST) strcpy(g_eeGeneral.currModelFilename, DEFAULT_MODEL_FILENAME); #endif diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 58d8219a6..7b824087a 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1188,12 +1188,23 @@ bool zexist(const char *str, uint8_t size); unsigned int effectiveLen(const char * str, unsigned int size); char * strcat_zchar(char *dest, const char *name, uint8_t size, const char spaceSym = 0, const char *defaultName=nullptr, uint8_t defaultNameSize=0, uint8_t defaultIdx=0); #define strcatFlightmodeName(dest, idx) strcat_zchar(dest, g_model.flightModeData[idx].name, LEN_FLIGHT_MODE_NAME, 0, STR_FM, PSIZE(TR_FM), idx+1) -#if defined(EEPROM) -#define strcat_modelname(dest, idx) strcat_zchar(dest, modelHeaders[idx].name, LEN_MODEL_NAME, 0, STR_MODEL, PSIZE(TR_MODEL), idx+1) -#define strcat_currentmodelname(dest, foo) strcat_modelname(dest, g_eeGeneral.currModel) + +#if !defined(STORAGE_MODELSLIST) + +#define strcat_modelname(dest, idx) \ + strcat_zchar(dest, modelHeaders[idx].name, LEN_MODEL_NAME, 0, STR_MODEL, \ + PSIZE(TR_MODEL), idx + 1) + +#define strcat_currentmodelname(dest, foo) \ + strcat_modelname(dest, g_eeGeneral.currModel) + #else -#define strcat_currentmodelname(dest, spaceSym) strcat_zchar(dest, g_model.header.name, LEN_MODEL_NAME, spaceSym) + +#define strcat_currentmodelname(dest, spaceSym) \ + strcat_zchar(dest, g_model.header.name, LEN_MODEL_NAME, spaceSym) + #endif + #define ZLEN(s) zlen(s, sizeof(s)) #define ZEXIST(s) zexist(s, sizeof(s)) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 2888f6ba2..a07feeb6c 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -170,23 +170,6 @@ void eeConvertModel(int id, int version) uint8_t currModel = g_eeGeneral.currModel; g_eeGeneral.currModel = id; -#if !defined(EEPROM) - char filename[LEN_MODEL_FILENAME+1]; - memset(filename, 0, sizeof(filename)); - char* s = strAppend(filename, MODEL_FILENAME_PREFIX); - s = strAppendUnsigned(s, id + 1, 2); - s = strAppend(s, MODEL_FILENAME_SUFFIX); - memcpy(g_eeGeneral.currModelFilename, filename, sizeof(g_eeGeneral.currModelFilename)); - - if (!modelslist.getCurrentCategory()) { - ModelsCategory* cat = modelslist.createCategory("Models", false); - modelslist.setCurrentCategory(cat); - } - ModelCell* model = modelslist.addModel(modelslist.getCurrentCategory(), - filename, false); - model->setModelName(g_model.header.name); -#endif - storageDirty(EE_MODEL); storageCheck(true); @@ -233,7 +216,7 @@ bool eeConvert() storageDirty(EE_GENERAL); storageCheck(true); -#if !defined(EEPROM) +#if defined(STORAGE_MODELSLIST) modelslist.clear(); #endif @@ -265,7 +248,7 @@ bool eeConvert() } } -#if !defined(EEPROM) +#if defined(STORAGE_MODELSLIST) modelslist.save(); #endif diff --git a/radio/src/storage/eeprom_common.cpp b/radio/src/storage/eeprom_common.cpp index d9458ac32..bcadc9dec 100644 --- a/radio/src/storage/eeprom_common.cpp +++ b/radio/src/storage/eeprom_common.cpp @@ -56,37 +56,6 @@ void eeLoadModel(uint8_t index) } } -uint8_t eeFindEmptyModel(uint8_t id, bool down) -{ - uint8_t i = id; - for (;;) { - i = (MAX_MODELS + (down ? i+1 : i-1)) % MAX_MODELS; - if (!eeModelExists(i)) break; - if (i == id) return 0xff; // no free space in directory left - } - return i; -} - -void selectModel(uint8_t sub) -{ -#if !defined(COLORLCD) - showMessageBox(STR_LOADINGMODEL); -#endif - storageFlushCurrentModel(); - storageCheck(true); // force writing of current model data before this is changed - g_eeGeneral.currModel = sub; - storageDirty(EE_GENERAL); - eeLoadModel(sub); -} - -ModelHeader modelHeaders[MAX_MODELS]; -void eeLoadModelHeaders() -{ - for (uint32_t i=0; i> 3u] |= mask; - } - - for (uint8_t id = 1; id <= getMaxRxNum(module); id++) { - uint8_t mask = 1u << (id & 7u); - if (!(usedModelIds[id >> 3u] & mask)) { - // found free ID - return id; - } - } - - // failed finding something... - return 0; -} diff --git a/radio/src/storage/eeprom_common.h b/radio/src/storage/eeprom_common.h index 09b75e04e..af7071373 100644 --- a/radio/src/storage/eeprom_common.h +++ b/radio/src/storage/eeprom_common.h @@ -32,16 +32,11 @@ void eeLoadModel(uint8_t id); uint8_t eeFindEmptyModel(uint8_t id, bool down); void selectModel(uint8_t sub); -extern ModelHeader modelHeaders[MAX_MODELS]; -void eeLoadModelHeader(uint8_t id, ModelHeader *header); -void eeLoadModelHeaders(); - void storageClearRadioSettings(); bool storageReadRadioSettings(bool allowFixes = true); void storageReadCurrentModel(); void checkModelIdUnique(uint8_t index, uint8_t module); -uint8_t findNextUnusedModelId(uint8_t index, uint8_t module); #if defined(EEPROM_RLC) #include "eeprom_rlc.h" diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index d53fa9ef6..ec7a32375 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -26,10 +26,6 @@ #include "conversions/conversions.h" #include "model_init.h" -//#if !defined(EEPROM_SDCARD) -ModelHeader modelHeaders[MAX_MODELS]; -//#endif - // defined either in sdcard_raw.cpp or sdcard_yaml.cpp void storageCreateModelsList(); @@ -71,7 +67,9 @@ void storageFormat() { sdCheckAndCreateDirectory(RADIO_PATH); sdCheckAndCreateDirectory(MODELS_PATH); +#if defined(STORAGE_MODELSLIST) storageCreateModelsList(); +#endif generalDefault(); } @@ -96,6 +94,7 @@ void storageCheck(bool immediately) } } +#if defined(STORAGE_MODELSLIST) const char * createModel() { preModelLoad(); @@ -108,6 +107,7 @@ const char * createModel() if (index > 0) { setModelDefaults(index); memcpy(g_eeGeneral.currModelFilename, filename, sizeof(g_eeGeneral.currModelFilename)); + storageDirty(EE_GENERAL); storageDirty(EE_MODEL); storageCheck(true); @@ -116,6 +116,7 @@ const char * createModel() return g_eeGeneral.currModelFilename; } +#endif const char * loadModel(const char * filename, bool alarms) { @@ -150,13 +151,20 @@ void storageReadAll() { TRACE("storageReadAll"); +#if defined(STORAGE_MODELSLIST) // Wipe models list in case // it's being reloaded after USB connection modelslist.clear(); +#endif if (loadRadioSettings() != nullptr) { storageEraseAll(true); } +#if !defined(STORAGE_MODELSLIST) + else { + loadModelHeaders(); + } +#endif for (uint8_t i = 0; languagePacks[i] != nullptr; i++) { if (!strncmp(g_eeGeneral.ttsLanguage, languagePacks[i]->id, 2)) { @@ -166,6 +174,7 @@ void storageReadAll() } } +#if defined(STORAGE_MODELSLIST) // and reload the list modelslist.load(); @@ -185,24 +194,17 @@ void storageReadAll() if (loadModel(g_eeGeneral.currModelFilename, false) != nullptr) { TRACE("No current model or SD card error"); } +#else + if (loadModel(g_eeGeneral.currModel, false) != nullptr) { + TRACE("No current model or SD card error"); + } +#endif } #if !defined(COLORLCD) void checkModelIdUnique(uint8_t index, uint8_t module) { - if (isModuleXJTD8(module)) - return; - - char * warn_buf = reusableBuffer.moduleSetup.msg; - - // cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 - size_t warn_buf_len = sizeof(reusableBuffer.moduleSetup.msg) - WARNING_LINE_LEN - 2; - if (!modelslist.isModelIdUnique(module,warn_buf,warn_buf_len)) { - if (warn_buf[0] != 0) { - POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.moduleSetup.msg), 0); - } - } + //TODO } #endif diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index 80e6f9895..f5bd06052 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -53,6 +53,19 @@ const char * loadModel(const char * filename, bool alarms=true); const char * createModel(); const char * writeModel(); +#if !defined(STORAGE_MODELSLIST) + +// index storage vs modelslist +void selectModel(uint8_t idx); +const char* loadModel(uint8_t idx, bool alarms=true); +bool modelExists(uint8_t idx); +bool copyModel(uint8_t dst, uint8_t src); +void swapModels(uint8_t id1, uint8_t id2); +int8_t deleteModel(uint8_t idx); +uint8_t findEmptyModel(uint8_t id, bool down); + +#endif + const char * loadRadioSettings(); const char * writeGeneralSettings(); diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 1fb3906aa..478c4144b 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "opentx_helpers.h" #include "storage.h" #include "sdcard_common.h" #include "sdcard_raw.h" @@ -67,6 +68,7 @@ const char * readYamlFile(const char* fullpath, const YamlParserCalls* calls, vo // Generic storage interface // +#if !defined(EEPROM_RLC) void storageCreateModelsList() { modelslist.clear(); @@ -74,6 +76,7 @@ void storageCreateModelsList() cat->addModel(DEFAULT_MODEL_FILENAME); modelslist.save(); } +#endif // // SDCARD storage interface @@ -244,7 +247,94 @@ const char * writeModelYaml(const char* filename) return NULL; } +#if !defined(STORAGE_MODELSLIST) +// EEPROM slot simulation based on file names: +// - /MODELS/model[00-99].yml + +constexpr uint8_t MODELIDX_STRLEN = sizeof(MODEL_FILENAME_PREFIX "00"); + +static void getModelNumberStr(uint8_t idx, char* model_idx) +{ + memcpy(model_idx, MODEL_FILENAME_PREFIX, sizeof(MODEL_FILENAME_PREFIX)); + model_idx[sizeof(MODEL_FILENAME_PREFIX)-1] = '0' + idx / 10; + model_idx[sizeof(MODEL_FILENAME_PREFIX)] = '0' + idx % 10; + model_idx[sizeof(MODEL_FILENAME_PREFIX)+1] = '\0'; +} +#endif + const char * writeModel() { - return writeModelYaml(g_eeGeneral.currModelFilename); +#if defined(STORAGE_MODELSLIST) + return writeModelYaml(g_eeGeneral.currModelFilename); +#else + char fname[MODELIDX_STRLEN + sizeof(YAML_EXT)]; + getModelNumberStr(g_eeGeneral.currModel, fname); + strcat(fname, YAML_EXT); + return writeModelYaml(fname); +#endif } + +#if !defined(STORAGE_MODELSLIST) +void loadModelHeader(uint8_t id, ModelHeader* header) +{ + PartialModel partial; + memclear(&partial, sizeof(PartialModel)); + + if (modelExists(id)) { + uint8_t dummy; + char fname[MODELIDX_STRLEN + sizeof(YAML_EXT)]; + getModelNumberStr(id, fname); + strcat(fname, YAML_EXT); + readModelYaml(fname, reinterpret_cast(&partial), sizeof(partial), &dummy); + memcpy(header, &partial, sizeof(ModelHeader)); + } +} + +const char * loadModel(uint8_t idx, bool alarms) +{ + char fname[MODELIDX_STRLEN + sizeof(YAML_EXT)]; + getModelNumberStr(idx, fname); + strcat(fname, YAML_EXT); + return loadModel(fname, alarms); +} + +bool modelExists(uint8_t idx) +{ + char model_idx[MODELIDX_STRLEN]; + getModelNumberStr(idx, model_idx); + GET_FILENAME(fname, MODELS_PATH, model_idx, YAML_EXT); + + FILINFO fno; + return f_stat(fname, &fno) == FR_OK; +} + +bool copyModel(uint8_t dst, uint8_t src) +{ + // TODO: overwrite possible? + char model_idx_src[MODELIDX_STRLEN]; + char model_idx_dst[MODELIDX_STRLEN]; + getModelNumberStr(src, model_idx_src); + getModelNumberStr(dst, model_idx_dst); + + GET_FILENAME(fname_src, MODELS_PATH, model_idx_src, YAML_EXT); + GET_FILENAME(fname_dst, MODELS_PATH, model_idx_dst, YAML_EXT); + + return sdCopyFile(fname_src, fname_dst); +} + +void swapModels(uint8_t id1, uint8_t id2) +{ + //TODO +} + +int8_t deleteModel(uint8_t idx) +{ + char model_idx[MODELIDX_STRLEN]; + getModelNumberStr(idx, model_idx); + + GET_FILENAME(fname, MODELS_PATH PATH_SEPARATOR MODEL_FILENAME_PREFIX, + model_idx, YAML_EXT); + + return f_unlink(fname) == FR_OK ? 0 : -1; +} +#endif diff --git a/radio/src/storage/storage.h b/radio/src/storage/storage.h index 061dedafd..9c3be9dc3 100644 --- a/radio/src/storage/storage.h +++ b/radio/src/storage/storage.h @@ -63,6 +63,15 @@ void preModelLoad(); void postModelLoad(bool alarms); void checkExternalAntenna(); +#if !defined(STORAGE_MODELSLIST) +extern ModelHeader modelHeaders[MAX_MODELS]; + +void loadModelHeader(uint8_t id, ModelHeader *header); +void loadModelHeaders(); + +uint8_t findNextUnusedModelId(uint8_t index, uint8_t module); +#endif + #if defined(EEPROM) #include "eeprom_common.h" #endif diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index 8d80875fe..5b791974e 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -237,3 +237,66 @@ void storageFlushCurrentModel() storageDirty(EE_MODEL); } } + +#if !defined(STORAGE_MODELSLIST) +void selectModel(uint8_t idx) +{ +#if !defined(COLORLCD) + showMessageBox(STR_LOADINGMODEL); +#endif + storageFlushCurrentModel(); + storageCheck(true); // force writing of current model data before this is changed + g_eeGeneral.currModel = idx; + storageDirty(EE_GENERAL); + loadModel(idx); +} + +uint8_t findEmptyModel(uint8_t id, bool down) +{ + uint8_t i = id; + for (;;) { + i = (MAX_MODELS + (down ? i+1 : i-1)) % MAX_MODELS; + if (!modelExists(i)) break; + if (i == id) return 0xff; // no free space in directory left + } + return i; +} + +ModelHeader modelHeaders[MAX_MODELS]; + +void loadModelHeaders() +{ + for (uint32_t i=0; i> 3u] |= mask; + } + + for (uint8_t id = 1; id <= getMaxRxNum(module); id++) { + uint8_t mask = 1u << (id & 7u); + if (!(usedModelIds[id >> 3u] & mask)) { + // found free ID + return id; + } + } + + // failed finding something... + return 0; +} +#endif diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index 386a1e2f4..646e1137e 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -3,9 +3,12 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) set(SRC ${SRC} storage/yaml/yaml_tree_walker.cpp storage/yaml/yaml_parser.cpp storage/yaml/yaml_bits.cpp - storage/yaml/yaml_modelslist.cpp storage/yaml/yaml_datastructs.cpp) +if(STORAGE_MODELSLIST) + set(SRC ${SRC} storage/yaml/yaml_modelslist.cpp) +endif() + # Warning: this file must be kept in sync with 'yaml_datastructs.cpp' # in the same directory. diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index de680a60b..a99063b70 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -14,7 +14,8 @@ set(CPU_TYPE STM32F4) set(HSE_VALUE 12000000) set(SDCARD YES) set(STORAGE SDCARD) -set(STORAGE_FORMAT BIN) +set(STORAGE_FORMAT RAW) +set(STORAGE_MODELSLIST YES) set(HAPTIC YES) set(GUI_DIR colorlcd) set(BITMAPS_DIR 480x272) @@ -34,8 +35,8 @@ else() endif() if(YAML_STORAGE) + set(STORAGE_CONVERT RAW) set(STORAGE_FORMAT YAML) - set(STORAGE_CONVERT SDCARD_RAW) endif() # for size report script diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 737b5bacb..619ea6867 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -15,7 +15,7 @@ add_definitions(-DPCBFRSKY) if(PCB STREQUAL X9E) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) - set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) + #set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(STICKS "STANDARD" CACHE STRING "Sticks type (STANDARD/HORUS)") set(CPU_TYPE STM32F4) @@ -49,7 +49,7 @@ if(PCB STREQUAL X9E) set(ROTARY_ENCODER YES) add_definitions(-DMANUFACTURER_FRSKY) elseif(PCB STREQUAL X9D+) - set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) + #set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) set(HAPTIC YES) set(LUA_EXPORT lua_export_x9d) add_definitions(-DPCBX9DP -DPCBX9) @@ -98,7 +98,7 @@ elseif(PCB STREQUAL X9D+) set(STATUS_LEDS NO) endif() elseif(PCB STREQUAL X9D) - set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) + #set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) set(FLAVOUR x9d) From 33d6cd95a2f49544c40821e16ec66a8ef7ff6104 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 10 Oct 2021 19:13:52 +0200 Subject: [PATCH 039/110] Conversion tests are for EEPROM only --- radio/src/tests/conversions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index c20af49c0..4453d3b32 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -31,7 +31,7 @@ void loadEEPROMFile(const char * filename) } #endif -#if defined(PCBX9DP) +#if defined(PCBX9DP) && defined(EEPROM) TEST(Conversions, ConversionX9DPFrom23) { loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+.bin"); From 218590b2773fd8f2a7c49e82a14472ba2b8c0bce Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 10 Oct 2021 19:45:42 +0200 Subject: [PATCH 040/110] Fixed NV14 CMakeLists.txt --- radio/src/targets/nv14/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/nv14/CMakeLists.txt b/radio/src/targets/nv14/CMakeLists.txt index 5324ccd56..4c98eb169 100644 --- a/radio/src/targets/nv14/CMakeLists.txt +++ b/radio/src/targets/nv14/CMakeLists.txt @@ -12,7 +12,8 @@ set(CPU_TYPE STM32F4) set(HSE_VALUE 12000000) set(SDCARD YES) set(STORAGE SDCARD) -set(STORAGE_FORMAT BIN) +set(STORAGE_FORMAT RAW) +set(STORAGE_MODELSLIST YES) set(HAPTIC YES) set(GUI_DIR colorlcd) set(BITMAPS_DIR 480x272) @@ -29,8 +30,8 @@ else() endif() if(YAML_STORAGE) + set(STORAGE_CONVERT RAW) set(STORAGE_FORMAT YAML) - set(STORAGE_CONVERT SDCARD_RAW) endif() set(RTC_BACKUP_RAM YES) From b5aca8f22e08eceb8ed592861067143848177060 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 11 Oct 2021 08:19:43 +0200 Subject: [PATCH 041/110] Fix case with invalid switch, pot & slider idx name in config --- .../storage/yaml/yaml_datastructs_funcs.cpp | 24 ++++++++++++++----- radio/src/storage/yaml/yaml_tree_walker.cpp | 21 +++++++++++++--- radio/src/storage/yaml/yaml_tree_walker.h | 1 + 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index f95f952a6..0b81420e0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -205,13 +205,17 @@ static uint8_t select_sensor_cfg(uint8_t* data, uint32_t bitoffs) static uint32_t sw_read(const char* val, uint8_t val_len) { - return yaml_parse_enum(enum_MixSources, val, val_len) - MIXSRC_FIRST_SWITCH; + uint32_t sw = yaml_parse_enum(enum_MixSources, val, val_len); + if (sw >= MIXSRC_FIRST_SWITCH) + return sw - MIXSRC_FIRST_SWITCH; + + return -1; } static bool sw_write(uint32_t idx, yaml_writer_func wf, void* opaque) { const char* str = yaml_output_enum(idx + MIXSRC_FIRST_SWITCH, enum_MixSources); - return wf(opaque, str, strlen(str)); + return str ? wf(opaque, str, strlen(str)) : true; } static const struct YamlIdStr enum_SwitchConfig[] = { @@ -230,13 +234,17 @@ static const struct YamlNode struct_switchConfig[] = { static uint32_t pot_read(const char* val, uint8_t val_len) { - return yaml_parse_enum(enum_MixSources, val, val_len) - MIXSRC_FIRST_POT; + uint32_t pot = yaml_parse_enum(enum_MixSources, val, val_len); + if (pot >= MIXSRC_FIRST_POT) + return pot - MIXSRC_FIRST_POT; + + return -1; } static bool pot_write(uint32_t idx, yaml_writer_func wf, void* opaque) { const char* str = yaml_output_enum(idx + MIXSRC_FIRST_POT, enum_MixSources); - return wf(opaque, str, strlen(str)); + return str ? wf(opaque, str, strlen(str)) : true; } static const struct YamlIdStr enum_PotConfig[] = { @@ -255,13 +263,17 @@ static const struct YamlNode struct_potConfig[] = { static uint32_t slider_read(const char* val, uint8_t val_len) { - return yaml_parse_enum(enum_MixSources, val, val_len) - MIXSRC_FIRST_SLIDER; + uint32_t sl = yaml_parse_enum(enum_MixSources, val, val_len); + if (sl >= MIXSRC_FIRST_SLIDER) + return sl - MIXSRC_FIRST_SLIDER; + + return -1; } static bool slider_write(uint32_t idx, yaml_writer_func wf, void* opaque) { const char* str = yaml_output_enum(idx + MIXSRC_FIRST_SLIDER, enum_MixSources); - return wf(opaque, str, strlen(str)); + return str ? wf(opaque, str, strlen(str)) : true; } static const struct YamlIdStr enum_SliderConfig[] = { diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index 4a2e0db28..9b4c3cf90 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -191,7 +191,8 @@ static bool yaml_output_attr(uint8_t* ptr, uint32_t bit_ofs, const YamlNode* nod YamlTreeWalker::YamlTreeWalker() : stack_level(NODE_STACK_DEPTH), virt_level(0), - anon_union(0) + anon_union(0), + idx_invalid(false) { memset(stack,0,sizeof(stack)); } @@ -201,6 +202,7 @@ void YamlTreeWalker::reset(const YamlNode* node, uint8_t* data) this->data = data; stack_level = NODE_STACK_DEPTH; virt_level = 0; + idx_invalid = false; push(); setNode(node); @@ -214,6 +216,7 @@ bool YamlTreeWalker::push() stack_level--; memset(&(stack[stack_level]), 0, sizeof(State)); + idx_invalid = false; return true; } @@ -225,6 +228,8 @@ bool YamlTreeWalker::pop() memset(&(stack[stack_level]), 0, sizeof(State)); stack_level++; + idx_invalid = false; + return true; } @@ -321,6 +326,11 @@ bool YamlTreeWalker::toNextElmt() return false; } + if (idx_invalid) { + idx_invalid = false; + stack[stack_level].elmts = 0; + } + if (getElmts() >= node->u._array.u._a.elmts - 1) return false; @@ -405,7 +415,7 @@ void YamlTreeWalker::toNextAttr() void YamlTreeWalker::setAttrValue(char* buf, uint8_t len) { - if (!buf || !len) + if (!buf || !len || idx_invalid) return; const YamlNode* attr = getAttr(); @@ -417,7 +427,12 @@ void YamlTreeWalker::setAttrValue(char* buf, uint8_t len) else i = yaml_str2uint(buf, len); + //TODO: detect -1 and set idx_invalid = true + while ((i > getElmts()) && toNextElmt()); + + if (i > getElmts()) + idx_invalid = true; } else { yaml_set_attr(data, getBitOffset(), attr, buf, len); @@ -622,7 +637,7 @@ static bool find_node(void* ctx, char* buf, uint8_t len) static void set_attr(void* ctx, char* buf, uint8_t len) { - return ((YamlTreeWalker*)ctx)->setAttrValue(buf,len); + ((YamlTreeWalker*)ctx)->setAttrValue(buf,len); } const YamlParserCalls YamlTreeWalkerCalls = { diff --git a/radio/src/storage/yaml/yaml_tree_walker.h b/radio/src/storage/yaml/yaml_tree_walker.h index ce97b2c61..8747a0124 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.h +++ b/radio/src/storage/yaml/yaml_tree_walker.h @@ -44,6 +44,7 @@ class YamlTreeWalker uint8_t stack_level; uint8_t virt_level; uint8_t anon_union; + bool idx_invalid; uint8_t* data; From 21bf580f9a5ed942f9e23785cd63b634f4c0e61c Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 11 Oct 2021 12:01:39 +0200 Subject: [PATCH 042/110] Merge switches / pots / sliders names into their config struct --- radio/src/datastructs.h | 8 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 76 +++++++++++++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 4 +- .../src/storage/yaml/yaml_datastructs_t12.cpp | 5 +- .../src/storage/yaml/yaml_datastructs_t8.cpp | 5 +- .../storage/yaml/yaml_datastructs_tlite.cpp | 5 +- .../storage/yaml/yaml_datastructs_tx12.cpp | 5 +- .../src/storage/yaml/yaml_datastructs_x10.cpp | 4 +- .../storage/yaml/yaml_datastructs_x12s.cpp | 4 +- .../src/storage/yaml/yaml_datastructs_x7.cpp | 5 +- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 5 +- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 5 +- .../storage/yaml/yaml_datastructs_x9lite.cpp | 5 +- .../storage/yaml/yaml_datastructs_x9lites.cpp | 5 +- .../storage/yaml/yaml_datastructs_xlite.cpp | 5 +- .../storage/yaml/yaml_datastructs_xlites.cpp | 5 +- radio/src/storage/yaml/yaml_node.h | 20 ++++- radio/src/storage/yaml/yaml_tree_walker.cpp | 23 ++++-- 18 files changed, 142 insertions(+), 52 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 21304de7e..d8be59c27 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -753,8 +753,8 @@ PACK(struct TrainerData { swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ uint16_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */ \ uint8_t slidersConfig ARRAY(1,struct_sliderConfig,nullptr); /* 1 bit per slider */ \ - NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]); \ - NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME]); \ + NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP); \ + NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP); \ NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \ NOBACKUP(uint8_t spare5:1 SKIP); \ NOBACKUP(uint8_t blOffBright:7); \ @@ -774,8 +774,8 @@ PACK(struct TrainerData { uint8_t backlightColor; \ swarnstate_t switchUnlockStates; \ swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ - char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]; \ - char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME]; \ + char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP; \ + char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP; \ BLUETOOTH_FIELDS #else #define EXTRA_GENERAL_FIELDS diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 0b81420e0..ee519d667 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -218,6 +218,29 @@ static bool sw_write(uint32_t idx, yaml_writer_func wf, void* opaque) return str ? wf(opaque, str, strlen(str)) : true; } +static void sw_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, const char* val, uint8_t val_len) +{ + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, switchConfig); + + RadioData* rd = reinterpret_cast(data); + strncpy(rd->switchNames[idx], val, std::min(val_len, LEN_SWITCH_NAME)); +} + +static bool sw_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, yaml_writer_func wf, void* opaque) +{ + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, switchConfig); + + RadioData* rd = reinterpret_cast(data); + const char* str = rd->switchNames[idx]; + return wf(opaque, str, strnlen(str, LEN_SWITCH_NAME)); +} + static const struct YamlIdStr enum_SwitchConfig[] = { { SWITCH_NONE, "none" }, { SWITCH_TOGGLE, "toggle" }, @@ -229,6 +252,7 @@ static const struct YamlIdStr enum_SwitchConfig[] = { static const struct YamlNode struct_switchConfig[] = { YAML_IDX_CUST( "sw", sw_read, sw_write ), YAML_ENUM( "type", 2, enum_SwitchConfig), + YAML_CUSTOM( "name", sw_name_read, sw_name_write), YAML_END }; @@ -247,6 +271,31 @@ static bool pot_write(uint32_t idx, yaml_writer_func wf, void* opaque) return str ? wf(opaque, str, strlen(str)) : true; } +static void pot_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, const char* val, uint8_t val_len) +{ + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, potsConfig); + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS; + strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); +} + +static bool pot_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, yaml_writer_func wf, void* opaque) +{ + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, potsConfig); + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS; + const char* str = rd->anaNames[idx]; + return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); +} + static const struct YamlIdStr enum_PotConfig[] = { { POT_NONE, "none" }, { POT_WITH_DETENT, "with_detent" }, @@ -258,6 +307,7 @@ static const struct YamlIdStr enum_PotConfig[] = { static const struct YamlNode struct_potConfig[] = { YAML_IDX_CUST( "pot", pot_read, pot_write ), YAML_ENUM( "type", 2, enum_PotConfig), + YAML_CUSTOM( "name", pot_name_read, pot_name_write), YAML_END }; @@ -276,6 +326,31 @@ static bool slider_write(uint32_t idx, yaml_writer_func wf, void* opaque) return str ? wf(opaque, str, strlen(str)) : true; } +static void sl_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, const char* val, uint8_t val_len) +{ + // data / bitoffs already incremented + data -= (idx + 1) / 8; + data -= offsetof(RadioData, slidersConfig); + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS + STORAGE_NUM_POTS; + strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); +} + +static bool sl_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, yaml_writer_func wf, void* opaque) +{ + // data / bitoffs already incremented + data -= (idx + 1) / 8; + data -= offsetof(RadioData, slidersConfig); + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS + STORAGE_NUM_POTS; + const char* str = rd->anaNames[idx]; + return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); +} + static const struct YamlIdStr enum_SliderConfig[] = { { SLIDER_NONE, "none" }, { SLIDER_WITH_DETENT, "with_detent" }, @@ -285,6 +360,7 @@ static const struct YamlIdStr enum_SliderConfig[] = { static const struct YamlNode struct_sliderConfig[] = { YAML_IDX_CUST( "sl", slider_read, slider_write ), YAML_ENUM( "type", 1, enum_SliderConfig), + YAML_CUSTOM( "name", sl_name_read, sl_name_write), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index a391ad232..65f9ac6c2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -371,8 +371,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), - YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 9, struct_string_24, NULL), + YAML_PADDING( 192 ), + YAML_PADDING( 216 ), YAML_STRING("currModelFilename", 17), YAML_PADDING( 1 ), YAML_UNSIGNED( "blOffBright", 7 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index bb99cd833..61595d01f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -346,13 +346,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index bb99cd833..61595d01f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -346,13 +346,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index bb99cd833..61595d01f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -346,13 +346,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 29ed5ef37..ce6681667 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -346,13 +346,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index a65a97de0..a000d62c4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -388,8 +388,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), - YAML_ARRAY("switchNames", 24, 10, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 13, struct_string_24, NULL), + YAML_PADDING( 240 ), + YAML_PADDING( 312 ), YAML_STRING("currModelFilename", 17), YAML_PADDING( 1 ), YAML_UNSIGNED( "blOffBright", 7 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 1e4703333..9c8838449 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -388,8 +388,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), - YAML_ARRAY("switchNames", 24, 10, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 13, struct_string_24, NULL), + YAML_PADDING( 240 ), + YAML_PADDING( 312 ), YAML_STRING("currModelFilename", 17), YAML_PADDING( 1 ), YAML_UNSIGNED( "blOffBright", 7 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index bb99cd833..61595d01f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -346,13 +346,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 8, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 4534d0548..03ca4ed08 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -353,13 +353,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 32 ), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 9, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 9, struct_string_24, NULL), + YAML_PADDING( 216 ), + YAML_PADDING( 216 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index b219622d6..d136d89e7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -392,13 +392,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 64 ), YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 18, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 12, struct_string_24, NULL), + YAML_PADDING( 432 ), + YAML_PADDING( 288 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 7acb1cc7c..b13641645 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -333,11 +333,10 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 5, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 5, struct_string_24, NULL), + YAML_PADDING( 120 ), + YAML_PADDING( 120 ), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 95ca3f117..717db955e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -341,13 +341,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 7, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 5, struct_string_24, NULL), + YAML_PADDING( 168 ), + YAML_PADDING( 120 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index eb75a1fee..28ea3132b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -338,13 +338,12 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 6, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 144 ), + YAML_PADDING( 144 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 4df9eb39c..707f14360 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -340,15 +340,14 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_ARRAY("switchNames", 24, 6, struct_string_24, NULL), - YAML_ARRAY("anaNames", 24, 6, struct_string_24, NULL), + YAML_PADDING( 144 ), + YAML_PADDING( 144 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), YAML_SIGNED( "gyroMax", 8 ), YAML_SIGNED( "gyroOffset", 8 ), YAML_SIGNED( "uartSampleMode", 2 ), - YAML_STRING("currModelFilename", 17), YAML_END }; static const struct YamlNode struct_unsigned_8[] = { diff --git a/radio/src/storage/yaml/yaml_node.h b/radio/src/storage/yaml/yaml_node.h index b2dc1f790..9584a1a91 100644 --- a/radio/src/storage/yaml/yaml_node.h +++ b/radio/src/storage/yaml/yaml_node.h @@ -38,7 +38,8 @@ enum YamlDataType { YDT_ARRAY, YDT_ENUM, YDT_UNION, - YDT_PADDING + YDT_PADDING, + YDT_CUSTOM }; struct YamlIdStr @@ -62,7 +63,14 @@ struct YamlNode typedef uint32_t (*cust_idx_read_func)(const char* val, uint8_t val_len); typedef bool (*cust_idx_write_func)(uint32_t idx, yaml_writer_func wf, void* opaque); - + + typedef void (*cust_read_func)(const YamlNode* node, uint8_t* data, + uint32_t bitoffs, uint16_t idx, + const char* val, uint8_t val_len); + typedef bool (*cust_write_func)(const YamlNode* node, uint8_t* data, + uint32_t bitoffs, uint16_t idx, + yaml_writer_func wf, void* opaque); + uint8_t type; uint32_t size; // bits uint8_t tag_len; @@ -92,6 +100,11 @@ struct YamlNode cust_idx_read_func read; cust_idx_write_func write; } _cust_idx; + + struct { + cust_read_func read; + cust_write_func write; + } _cust_attr; } u; }; @@ -135,6 +148,9 @@ struct YamlNode #define YAML_PADDING(bits) \ { .type=YDT_PADDING, .size=(bits) } +#define YAML_CUSTOM(tag, f_read, f_write) \ + { .type=YDT_CUSTOM, .size=0, YAML_TAG(tag), .u={._cust_attr={.read=(f_read), .write=(f_write) }} } + #define YAML_END \ { .type=YDT_NONE } diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index 9b4c3cf90..0edd4ea61 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -50,7 +50,7 @@ uint32_t yaml_parse_enum(const struct YamlIdStr* choices, const char* val, uint8 } static void yaml_set_attr(uint8_t* ptr, uint32_t bit_ofs, const YamlNode* node, - const char* val, uint8_t val_len) + uint16_t idx, const char* val, uint8_t val_len) { uint32_t i = 0; @@ -78,6 +78,10 @@ static void yaml_set_attr(uint8_t* ptr, uint32_t bit_ofs, const YamlNode* node, case YDT_ENUM: i = yaml_parse_enum(node->u._enum.choices, val, val_len); break; + case YDT_CUSTOM: + if (node->u._cust_attr.read) + node->u._cust_attr.read(node, ptr, bit_ofs, idx, val, val_len); + return; default: break; } @@ -127,7 +131,7 @@ static bool yaml_output_string(const char* str, uint32_t max_len, } static bool yaml_output_attr(uint8_t* ptr, uint32_t bit_ofs, const YamlNode* node, - yaml_writer_func wf, void* opaque) + uint16_t idx, yaml_writer_func wf, void* opaque) { if (node->type == YDT_NONE) return false; @@ -153,6 +157,11 @@ static bool yaml_output_attr(uint8_t* ptr, uint32_t bit_ofs, const YamlNode* nod if (!yaml_output_string((const char*)ptr, (node->size)>>3UL, wf, opaque)) return false; } + else if (node->type == YDT_CUSTOM) { + if (node->u._cust_attr.write + && !node->u._cust_attr.write(node, ptr, bit_ofs, idx, wf, opaque)) + return false; + } else { unsigned int i = yaml_get_bits(ptr, bit_ofs, node->size); @@ -435,7 +444,7 @@ void YamlTreeWalker::setAttrValue(char* buf, uint8_t len) idx_invalid = true; } else { - yaml_set_attr(data, getBitOffset(), attr, buf, len); + yaml_set_attr(data, getBitOffset(), attr, getElmts(), buf, len); //walker.dump_stack(); } } @@ -500,7 +509,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) for(int i=2; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(NULL, 0, node, wf, opaque)) + if (!yaml_output_attr(NULL, 0, node, getElmts(), wf, opaque)) return false; // TODO: error handling??? // grab attr idx... @@ -512,7 +521,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) for(int i=1; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(data, getBitOffset(), attr, wf, opaque)) + if (!yaml_output_attr(data, getBitOffset(), attr, getElmts(), wf, opaque)) return false; // TODO: error handling??? if (attr->type != YDT_ARRAY @@ -545,7 +554,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) for(int i=2; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(NULL, 0, getNode(), wf, opaque)) + if (!yaml_output_attr(NULL, 0, getNode(), getElmts(), wf, opaque)) return false; // TODO: error handling??? continue; } @@ -596,7 +605,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) if (!wf(opaque, "\r\n", 2)) return false; } - else if (!yaml_output_attr(data, getBitOffset(), attr, wf, opaque)) + else if (!yaml_output_attr(data, getBitOffset(), attr, getElmts(), wf, opaque)) return false; // TODO: error handling??? toNextAttr(); From 77ff5793550506c5f0a81d1cbf479a6aed3ce9cc Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 12 Oct 2021 17:28:06 +0200 Subject: [PATCH 043/110] Stick names in own config list --- radio/src/datastructs.h | 4 +++ .../storage/yaml/yaml_datastructs_funcs.cpp | 36 +++++++++++++++++-- .../storage/yaml/yaml_datastructs_nv14.cpp | 1 + .../src/storage/yaml/yaml_datastructs_t12.cpp | 1 + .../src/storage/yaml/yaml_datastructs_t8.cpp | 1 + .../storage/yaml/yaml_datastructs_tlite.cpp | 1 + .../storage/yaml/yaml_datastructs_tx12.cpp | 1 + .../src/storage/yaml/yaml_datastructs_x10.cpp | 1 + .../storage/yaml/yaml_datastructs_x12s.cpp | 1 + .../src/storage/yaml/yaml_datastructs_x7.cpp | 1 + .../src/storage/yaml/yaml_datastructs_x9d.cpp | 1 + .../src/storage/yaml/yaml_datastructs_x9e.cpp | 1 + .../storage/yaml/yaml_datastructs_x9lite.cpp | 1 + .../storage/yaml/yaml_datastructs_x9lites.cpp | 1 + .../storage/yaml/yaml_datastructs_xlite.cpp | 1 + .../storage/yaml/yaml_datastructs_xlites.cpp | 1 + radio/src/storage/yaml/yaml_defs.h | 32 +++++++++++------ radio/src/storage/yaml/yaml_node.h | 2 +- radio/src/storage/yaml/yaml_tree_walker.cpp | 2 +- radio/util/generate_yaml.py | 2 ++ radio/util/yaml_parser.tmpl | 4 ++- 21 files changed, 79 insertions(+), 17 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index d8be59c27..b8ef493b4 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -750,6 +750,7 @@ PACK(struct TrainerData { #define EXTRA_GENERAL_FIELDS \ NOBACKUP(uint8_t auxSerialMode:4); \ NOBACKUP(uint8_t aux2SerialMode:4); \ + CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ uint16_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */ \ uint8_t slidersConfig ARRAY(1,struct_sliderConfig,nullptr); /* 1 bit per slider */ \ @@ -773,6 +774,7 @@ PACK(struct TrainerData { uint8_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */\ uint8_t backlightColor; \ swarnstate_t switchUnlockStates; \ + CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP; \ char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP; \ @@ -798,6 +800,8 @@ PACK(struct TrainerData { #endif PACK(struct RadioData { + + // Real attributes NOBACKUP(uint8_t version); NOBACKUP(uint16_t variant SKIP); CalibData calib[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS]; diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index ee519d667..1d1ffec75 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -218,6 +218,36 @@ static bool sw_write(uint32_t idx, yaml_writer_func wf, void* opaque) return str ? wf(opaque, str, strlen(str)) : true; } +static void r_stick_name(const YamlNode* node, uint8_t* data, + uint32_t bitoffs, uint16_t idx, + const char* val, uint8_t val_len) +{ + data -= offsetof(RadioData, switchConfig); + RadioData* rd = reinterpret_cast(data); + strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); +} + +static bool w_stick_name(const YamlNode* node, uint8_t* data, + uint32_t bitoffs, uint16_t idx, + yaml_writer_func wf, void* opaque) +{ + data -= offsetof(RadioData, switchConfig); + RadioData* rd = reinterpret_cast(data); + return wf(opaque, rd->anaNames[idx], strnlen(rd->anaNames[idx], LEN_ANA_NAME)); +} + +static bool stick_name_valid(uint8_t* data, uint32_t bitoffs, uint16_t idx) +{ + RadioData* rd = reinterpret_cast(data); + return rd->anaNames[idx][0] != '\0'; +} + +static const struct YamlNode struct_sticksConfig[] = { + YAML_IDX, + YAML_CUSTOM( "name", r_stick_name, w_stick_name), + YAML_END +}; + static void sw_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, uint16_t idx, const char* val, uint8_t val_len) { @@ -464,19 +494,19 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, return wf(opaque, str, strlen(str)); } -static bool cfn_is_active(uint8_t* data, uint32_t bitoffs) +static bool cfn_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) { data += bitoffs >> 3UL; return ((CustomFunctionData*)data)->swtch; } -static bool gvar_is_active(uint8_t* data, uint32_t bitoffs) +static bool gvar_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) { gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); return *gvar != GVAR_MAX+1; } -static bool fmd_is_active(uint8_t* data, uint32_t bitoffs) +static bool fmd_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) { uint32_t data_ofs = bitoffs >> 3UL; if (data_ofs == offsetof(ModelData, flightModeData)) { diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 65f9ac6c2..e7681804b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -368,6 +368,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), YAML_UNSIGNED( "aux2SerialMode", 4 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 61595d01f..6d1a376cc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -345,6 +345,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), YAML_PADDING( 192 ), YAML_PADDING( 144 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 61595d01f..6d1a376cc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -345,6 +345,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), YAML_PADDING( 192 ), YAML_PADDING( 144 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 61595d01f..6d1a376cc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -345,6 +345,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), YAML_PADDING( 192 ), YAML_PADDING( 144 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index ce6681667..198068835 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -345,6 +345,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), YAML_PADDING( 192 ), YAML_PADDING( 144 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index a000d62c4..f4943e675 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -385,6 +385,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), YAML_UNSIGNED( "aux2SerialMode", 4 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 9c8838449..9b0c07a6f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -385,6 +385,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_UNSIGNED( "auxSerialMode", 4 ), YAML_UNSIGNED( "aux2SerialMode", 4 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 61595d01f..6d1a376cc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -345,6 +345,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), YAML_PADDING( 192 ), YAML_PADDING( 144 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 03ca4ed08..4a44167c8 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -352,6 +352,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 32 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_PADDING( 216 ), YAML_PADDING( 216 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index d136d89e7..76ca804e0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -391,6 +391,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 64 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), YAML_PADDING( 432 ), YAML_PADDING( 288 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index b13641645..b5f062019 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -332,6 +332,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), YAML_PADDING( 120 ), YAML_PADDING( 120 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 717db955e..af38095d0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -340,6 +340,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), YAML_PADDING( 168 ), YAML_PADDING( 120 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 28ea3132b..5acfa240d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -337,6 +337,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), YAML_PADDING( 144 ), YAML_PADDING( 144 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 707f14360..3837ff5d4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -339,6 +339,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), YAML_PADDING( 144 ), YAML_PADDING( 144 ), diff --git a/radio/src/storage/yaml/yaml_defs.h b/radio/src/storage/yaml/yaml_defs.h index bb658e882..45d5d4258 100644 --- a/radio/src/storage/yaml/yaml_defs.h +++ b/radio/src/storage/yaml/yaml_defs.h @@ -30,18 +30,26 @@ /* public definitions */ #define ENUM(label) _yaml_attribute("enum:" _yaml_note(label)) -#define SKIP _yaml_attribute("skip:true") -#define USE_IDX _yaml_attribute("idx:true") -#define FUNC(name) _yaml_attribute("func:" _yaml_note(name)) +#define SKIP _yaml_attribute("skip:true") +#define USE_IDX _yaml_attribute("idx:true") +#define FUNC(name) _yaml_attribute("func:" _yaml_note(name)) #define NAME(label) _yaml_attribute("name:" _yaml_note(label)) -#define CUST(read,write) \ - _yaml_attribute("read:" _yaml_note(read)) \ - _yaml_attribute("write:" _yaml_note(write)) +#define CUST(read, write) \ + _yaml_attribute("read:" _yaml_note(read)) \ + _yaml_attribute("write:" _yaml_note(write)) -#define ARRAY(elmt_size,elmt_type,fcn) \ - _yaml_attribute("array:" _yaml_note(elmt_size) "|" \ - _yaml_note(elmt_type) "|" _yaml_note(fcn)) +#define ARRAY(elmt_size, elmt_type, fcn) \ + _yaml_attribute("array:" _yaml_note(elmt_size) "|" _yaml_note( \ + elmt_type) "|" _yaml_note(fcn)) + +#define CUST_ATTR(tag, read, write) \ + int _dummy_##tag[0] _yaml_attribute("raw:YAML_CUSTOM(" _yaml_note( \ + #tag) "," _yaml_note(read) "," _yaml_note(write) ")") + +#define CUST_ARRAY(tag, elmt_type, fcn) \ + int _dummy_##tag[0] _yaml_attribute("raw:YAML_ARRAY(" _yaml_note( \ + #tag) ", 0, 4, " _yaml_note(elmt_type) ", " _yaml_note(fcn) ")") #else @@ -50,8 +58,10 @@ #define USE_IDX #define FUNC(name) #define NAME(label) -#define CUST(read,write) -#define ARRAY(elmt_size,elmt_type,fcn) +#define CUST(read, write) +#define ARRAY(elmt_size, elmt_type, fcn) +#define CUST_ATTR(tag, read, write) +#define CUST_ARRAY(tag, elmt_type, fcn) #endif diff --git a/radio/src/storage/yaml/yaml_node.h b/radio/src/storage/yaml/yaml_node.h index 9584a1a91..42a515b0a 100644 --- a/radio/src/storage/yaml/yaml_node.h +++ b/radio/src/storage/yaml/yaml_node.h @@ -53,7 +53,7 @@ typedef bool (*yaml_writer_func)(void* opaque, const char* str, size_t len); struct YamlNode { - typedef bool (*is_active_func)(uint8_t* data, uint32_t bitoffs); + typedef bool (*is_active_func)(uint8_t* data, uint32_t bitoffs, uint16_t idx); typedef uint32_t (*cust_to_uint_func)(const YamlNode* node, const char* val, uint8_t val_len); diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index 0edd4ea61..d5cfee6e2 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -369,7 +369,7 @@ bool YamlTreeWalker::isElmtEmpty(uint8_t* data) // assume structs aligned on 8bit boundaries if (node->u._array.u._a.is_active) - return !node->u._array.u._a.is_active(data, bit_ofs); + return !node->u._array.u._a.is_active(data, bit_ofs, getElmts()); return yaml_is_zero(data, bit_ofs, node->size); } diff --git a/radio/util/generate_yaml.py b/radio/util/generate_yaml.py index e9dc1b937..cf522e995 100644 --- a/radio/util/generate_yaml.py +++ b/radio/util/generate_yaml.py @@ -342,6 +342,8 @@ def parse_field_array(f, node): for a in ann: if a['type'] == 'idx': use_idx = True + elif a['type'] == 'raw': + f.raw = a['val'] # let's see first if it's some kind of struct/union/enum elmt_st = parse_node(RootAST, elmt_decl) diff --git a/radio/util/yaml_parser.tmpl b/radio/util/yaml_parser.tmpl index b6b84a905..52216301b 100644 --- a/radio/util/yaml_parser.tmpl +++ b/radio/util/yaml_parser.tmpl @@ -45,8 +45,10 @@ static const struct YamlNode {{ struct.name }}[] = { YAML_UNION("{{ max_len(elmt.name) }}", {{elmt.bits}}, {{elmt.var_type}}_elmts, {{ elmt.func}}), {% elif elmt.type == 'array' %} YAML_ARRAY("{{ max_len(elmt.name) }}", {{elmt.bits // elmt.length}}, {{elmt.length}}, {{elmt.var_type}}, {{ elmt.func }}), + {% elif elmt.raw %} + {{ elmt.raw }}, {% else %} - // name='{{elmt.name}}', type='{{elmt.type}}', bits='{{elmt.bits}}', is_array='{{elmt.is_array}}', var_type='{{elmt.var_type}}', kind='{{elmt.cursor.kind}}' , type.kind='{{elmt.cursor.type.kind}}' + // name='{{elmt.name}}', type='{{elmt.type}}', bits='{{elmt.bits}}', is_array='{{elmt.is_array}}', var_type='{{elmt.var_type}}', kind='{{elmt.cursor.kind}}' , type.kind='{{elmt.cursor.type.kind}}', raw='{{elmt.raw}}' {% endif %} {% endfor %} YAML_END From a8f2212f2c5316f462373f232b0ced8906eb06e6 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 14 Oct 2021 19:20:51 +0200 Subject: [PATCH 044/110] Added support for lists (without index value) --- radio/src/datastructs.h | 4 +- .../storage/yaml/yaml_datastructs_nv14.cpp | 2 - .../src/storage/yaml/yaml_datastructs_t12.cpp | 2 - .../src/storage/yaml/yaml_datastructs_t8.cpp | 2 - .../storage/yaml/yaml_datastructs_tlite.cpp | 2 - .../storage/yaml/yaml_datastructs_tx12.cpp | 2 - .../src/storage/yaml/yaml_datastructs_x10.cpp | 2 - .../storage/yaml/yaml_datastructs_x12s.cpp | 2 - .../src/storage/yaml/yaml_datastructs_x7.cpp | 2 - .../src/storage/yaml/yaml_datastructs_x9d.cpp | 2 - .../src/storage/yaml/yaml_datastructs_x9e.cpp | 2 - .../storage/yaml/yaml_datastructs_x9lite.cpp | 2 - .../storage/yaml/yaml_datastructs_x9lites.cpp | 2 - .../storage/yaml/yaml_datastructs_xlite.cpp | 2 - .../storage/yaml/yaml_datastructs_xlites.cpp | 2 - radio/src/storage/yaml/yaml_defs.h | 2 + radio/src/storage/yaml/yaml_parser.cpp | 22 +++- radio/src/storage/yaml/yaml_parser.h | 1 + radio/src/storage/yaml/yaml_tree_walker.cpp | 102 +++++++++++------- radio/src/storage/yaml/yaml_tree_walker.h | 31 +++++- radio/util/generate_yaml.py | 7 +- radio/util/yaml_parser.tmpl | 2 +- 22 files changed, 124 insertions(+), 75 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index b8ef493b4..514ed0c2d 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -618,9 +618,9 @@ PACK(struct ModelData { uint8_t extendedTrims:1; uint8_t throttleReversed:1; BeepANACenter beepANACenter; - MixData mixData[MAX_MIXERS]; + MixData mixData[MAX_MIXERS] NO_IDX; LimitData limitData[MAX_OUTPUT_CHANNELS]; - ExpoData expoData[MAX_EXPOS]; + ExpoData expoData[MAX_EXPOS] NO_IDX; CurveHeader curves[MAX_CURVES]; int8_t points[MAX_CURVE_POINTS]; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index e7681804b..a4b57d5af 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -414,7 +414,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -447,7 +446,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 6d1a376cc..925ddfeb3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -384,7 +384,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -417,7 +416,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 6d1a376cc..925ddfeb3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -384,7 +384,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -417,7 +416,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 6d1a376cc..925ddfeb3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -384,7 +384,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -417,7 +416,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 198068835..10339f3ad 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -384,7 +384,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -417,7 +416,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index f4943e675..57c58c304 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -431,7 +431,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -464,7 +463,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 9b0c07a6f..d31960c8e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -431,7 +431,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -464,7 +463,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 6d1a376cc..925ddfeb3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -384,7 +384,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -417,7 +416,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 4a44167c8..3c6ad7cf4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -392,7 +392,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -425,7 +424,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 76ca804e0..6fc3341ec 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -431,7 +431,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -464,7 +463,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index b5f062019..ee0e08ad5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -369,7 +369,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -402,7 +401,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index af38095d0..953e8576c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -379,7 +379,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -412,7 +411,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 5acfa240d..e874be5a2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -376,7 +376,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -409,7 +408,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 3837ff5d4..b93615484 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -380,7 +380,6 @@ static const struct YamlNode struct_CurveRef[] = { YAML_END }; static const struct YamlNode struct_MixData[] = { - YAML_IDX, YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), YAML_UNSIGNED( "destCh", 5 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), @@ -413,7 +412,6 @@ static const struct YamlNode struct_LimitData[] = { YAML_END }; static const struct YamlNode struct_ExpoData[] = { - YAML_IDX, YAML_UNSIGNED( "mode", 2 ), YAML_UNSIGNED( "scale", 14 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), diff --git a/radio/src/storage/yaml/yaml_defs.h b/radio/src/storage/yaml/yaml_defs.h index 45d5d4258..2f5c0e874 100644 --- a/radio/src/storage/yaml/yaml_defs.h +++ b/radio/src/storage/yaml/yaml_defs.h @@ -32,6 +32,7 @@ #define ENUM(label) _yaml_attribute("enum:" _yaml_note(label)) #define SKIP _yaml_attribute("skip:true") #define USE_IDX _yaml_attribute("idx:true") +#define NO_IDX _yaml_attribute("idx:false") #define FUNC(name) _yaml_attribute("func:" _yaml_note(name)) #define NAME(label) _yaml_attribute("name:" _yaml_note(label)) @@ -56,6 +57,7 @@ #define ENUM(label) #define SKIP #define USE_IDX +#define NO_IDX #define FUNC(name) #define NAME(label) #define CUST(read, write) diff --git a/radio/src/storage/yaml/yaml_parser.cpp b/radio/src/storage/yaml/yaml_parser.cpp index c782f2329..92e601946 100644 --- a/radio/src/storage/yaml/yaml_parser.cpp +++ b/radio/src/storage/yaml/yaml_parser.cpp @@ -35,6 +35,7 @@ void YamlParser::init(const YamlParserCalls* parser_calls, void* parser_ctx) indent = 0; level = 0; memset(indents, 0, sizeof(indents)); + saved_state = 0; calls = parser_calls; ctx = parser_ctx; @@ -43,8 +44,11 @@ void YamlParser::init(const YamlParserCalls* parser_calls, void* parser_ctx) void YamlParser::reset() { - state = ps_Indent; - indents[level] = indent; + state = saved_state; + if (state != ps_Dash) { + indents[level] = indent; + state = saved_state = ps_Indent; + } indent = scratch_len = 0; node_found = false; } @@ -105,6 +109,12 @@ YamlParser::parse(const char* buffer, unsigned int size) break; } + if (*c == '\r' || *c == '\n') { + saved_state = state; + state = ps_CRLF; + continue; + } + if (indent < getLastIndent()) { // go up as many levels as necessary do { @@ -114,6 +124,7 @@ YamlParser::parse(const char* buffer, unsigned int size) } } while (indent < getLastIndent()); + // attribute on same line as dash if (state == ps_Dash) { if (!calls->to_next_elmt(ctx)) { return DONE_PARSING; @@ -122,13 +133,15 @@ YamlParser::parse(const char* buffer, unsigned int size) } // go down one level else if (indent > getLastIndent()) { + // TODO: check dash? if (!toChild()) { TRACE_YAML("STOP (stack full)!\n"); return DONE_PARSING; // ERROR } } // same level, next element - else if (state == ps_Dash) { + else if (state == ps_Dash || saved_state == ps_Dash) { + // attribute on same line or next line as dash if (!calls->to_next_elmt(ctx)) { return DONE_PARSING; } @@ -160,6 +173,7 @@ YamlParser::parse(const char* buffer, unsigned int size) scratch_len, scratch_buf); } } + saved_state = state; state = ps_CRLF; continue; } @@ -180,6 +194,7 @@ YamlParser::parse(const char* buffer, unsigned int size) if (*c == ' ') break; if (*c == '\r' || *c == '\n'){ + saved_state = state; state = ps_CRLF; continue; } @@ -251,6 +266,7 @@ YamlParser::parse(const char* buffer, unsigned int size) if (node_found) { calls->set_attr(ctx, scratch_buf, scratch_len); } + saved_state = state; state = ps_CRLF; continue; } diff --git a/radio/src/storage/yaml/yaml_parser.h b/radio/src/storage/yaml/yaml_parser.h index a5812ec63..74b26db47 100644 --- a/radio/src/storage/yaml/yaml_parser.h +++ b/radio/src/storage/yaml/yaml_parser.h @@ -63,6 +63,7 @@ class YamlParser // parser state uint8_t state; + uint8_t saved_state; // scratch buffer w/ 16 bytes // used for attribute and values diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index d5cfee6e2..9f27dc32c 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -200,8 +200,7 @@ static bool yaml_output_attr(uint8_t* ptr, uint32_t bit_ofs, const YamlNode* nod YamlTreeWalker::YamlTreeWalker() : stack_level(NODE_STACK_DEPTH), virt_level(0), - anon_union(0), - idx_invalid(false) + anon_union(0) { memset(stack,0,sizeof(stack)); } @@ -211,7 +210,6 @@ void YamlTreeWalker::reset(const YamlNode* node, uint8_t* data) this->data = data; stack_level = NODE_STACK_DEPTH; virt_level = 0; - idx_invalid = false; push(); setNode(node); @@ -225,7 +223,6 @@ bool YamlTreeWalker::push() stack_level--; memset(&(stack[stack_level]), 0, sizeof(State)); - idx_invalid = false; return true; } @@ -237,7 +234,6 @@ bool YamlTreeWalker::pop() memset(&(stack[stack_level]), 0, sizeof(State)); stack_level++; - idx_invalid = false; return true; } @@ -261,10 +257,15 @@ bool YamlTreeWalker::findNode(const char* tag, uint8_t tag_len) { if (virt_level) return false; - + rewind(); const struct YamlNode* attr = getAttr(); + if (isArrayElmt() && attr && attr->type == YDT_IDX) { + setAttrValue((char*)tag, tag_len); + return true; + } + while(attr && attr->type != YDT_NONE) { if ((tag_len == attr->tag_len) @@ -303,11 +304,23 @@ bool YamlTreeWalker::toChild() const struct YamlNode* attr = getAttr(); if (!attr || (attr->type != YDT_ARRAY - && attr->type != YDT_UNION)) { + && attr->type != YDT_UNION + && !isArrayElmt())) { virt_level++; return true; } + bool is_array = false; + if (attr->type == YDT_ARRAY + && attr->u._array.u._a.elmts > 1) { + is_array = true; + } + + const YamlNode* parent_node = getNode(); + if (isArrayElmt() && attr->type == YDT_IDX) { + attr = parent_node; + } + if (!push()) { virt_level++; return false; @@ -317,11 +330,17 @@ bool YamlTreeWalker::toChild() setAttrOfs(getLevelOfs()); attr = getAttr(); + if (!attr) + return false; + if ((attr->type == YDT_UNION) && (attr->tag_len == 0)) { toChild(); anon_union++; } + if (is_array) + setArrayElmt(true); + return true; } @@ -335,8 +354,8 @@ bool YamlTreeWalker::toNextElmt() return false; } - if (idx_invalid) { - idx_invalid = false; + if (isIdxInvalid()) { + setIdxInvalid(false); stack[stack_level].elmts = 0; } @@ -424,7 +443,7 @@ void YamlTreeWalker::toNextAttr() void YamlTreeWalker::setAttrValue(char* buf, uint8_t len) { - if (!buf || !len || idx_invalid) + if (!buf || !len || isIdxInvalid()) return; const YamlNode* attr = getAttr(); @@ -441,10 +460,10 @@ void YamlTreeWalker::setAttrValue(char* buf, uint8_t len) while ((i > getElmts()) && toNextElmt()); if (i > getElmts()) - idx_invalid = true; + setIdxInvalid(true); } else { - yaml_set_attr(data, getBitOffset(), attr, getElmts(), buf, len); + yaml_set_attr(data, getBitOffset(), attr, getParentElmts(), buf, len); //walker.dump_stack(); } } @@ -476,6 +495,10 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) return false; } else { + + if (isParentArrayElmt() && !toParent()) + return false; + // walk to next non-empty element while (toNextElmt()) { if (!isElmtEmpty(data)) { @@ -509,7 +532,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) for(int i=2; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(NULL, 0, node, getElmts(), wf, opaque)) + if (!yaml_output_attr(NULL, 0, node, 0, wf, opaque)) return false; // TODO: error handling??? // grab attr idx... @@ -521,7 +544,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) for(int i=1; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(data, getBitOffset(), attr, getElmts(), wf, opaque)) + if (!yaml_output_attr(data, getBitOffset(), attr, 0, wf, opaque)) return false; // TODO: error handling??? if (attr->type != YDT_ARRAY @@ -554,7 +577,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) for(int i=2; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(NULL, 0, getNode(), getElmts(), wf, opaque)) + if (!yaml_output_attr(NULL, 0, getNode(),0, wf, opaque)) return false; // TODO: error handling??? continue; } @@ -567,30 +590,13 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) continue; } - if (new_elmt) { - - for(int i=2; i < getLevel(); i++) - if (!wf(opaque, " ", 3)) - return false; - - if (!wf(opaque, " - ", 3)) - return false; + // TODO: support for lists (inputs, mixers) + if (attr->type == YDT_IDX) { new_elmt = false; - } - else { for(int i=1; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - } - - if (attr->type == YDT_IDX) { - - if (!wf(opaque, attr->tag, attr->tag_len)) - return false; - - if (!wf(opaque, ": ", 2)) - return false; if (attr->u._cust_idx.write) { if (!attr->u._cust_idx.write(getElmts(),wf,opaque)) @@ -602,11 +608,33 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) return false; } - if (!wf(opaque, "\r\n", 2)) + if (!wf(opaque, ":\r\n", 3)) return false; + + toChild(); //TODO: error checking + } + else { + + // only for lists: + // - arrays have IDX upfront + // - structs are not marked as arrays + if (new_elmt && isArrayElmt()) { + for(int i=2; i < getLevel(); i++) + if (!wf(opaque, " ", 3)) + return false; + + if (!wf(opaque, " -\r\n", 4)) + return false; + } + + new_elmt = false; + for(int i=1; i < getLevel(); i++) + if (!wf(opaque, " ", 3)) + return false; + + if (!yaml_output_attr(data, getBitOffset(), attr, getParentElmts(), wf, opaque)) + return false; // TODO: error handling??? } - else if (!yaml_output_attr(data, getBitOffset(), attr, getElmts(), wf, opaque)) - return false; // TODO: error handling??? toNextAttr(); } diff --git a/radio/src/storage/yaml/yaml_tree_walker.h b/radio/src/storage/yaml/yaml_tree_walker.h index 8747a0124..c8e1f5591 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.h +++ b/radio/src/storage/yaml/yaml_tree_walker.h @@ -27,6 +27,9 @@ struct YamlParserCalls; +#define FLAG_STATE_IDX_INVALID (1 << 0) +#define FLAG_STATE_ARRAY_ELMT (1 << 1) + class YamlTreeWalker { struct State { @@ -34,6 +37,7 @@ class YamlTreeWalker uint32_t bit_ofs; int8_t attr_idx; uint16_t elmts; + uint8_t flags; inline uint32_t getOfs() { return bit_ofs + node->size * elmts; @@ -44,7 +48,6 @@ class YamlTreeWalker uint8_t stack_level; uint8_t virt_level; uint8_t anon_union; - bool idx_invalid; uint8_t* data; @@ -71,6 +74,28 @@ class YamlTreeWalker void incAttr() { stack[stack_level].attr_idx++; } void incElmts() { stack[stack_level].elmts++; } + inline bool isIdxInvalid() { + return stack[stack_level].flags & FLAG_STATE_IDX_INVALID; + } + + inline void setIdxInvalid(bool set) { + if (set) stack[stack_level].flags |= FLAG_STATE_IDX_INVALID; + else stack[stack_level].flags &= ~FLAG_STATE_IDX_INVALID; + } + + inline bool isArrayElmt() { + return stack[stack_level].flags & FLAG_STATE_ARRAY_ELMT; + } + + inline bool isParentArrayElmt() { + return !empty() && stack[stack_level + 1].flags & FLAG_STATE_ARRAY_ELMT; + } + + inline void setArrayElmt(bool set) { + if (set) stack[stack_level].flags |= FLAG_STATE_ARRAY_ELMT; + else stack[stack_level].flags &= ~FLAG_STATE_ARRAY_ELMT; + } + bool empty() { return stack_level == NODE_STACK_DEPTH; } bool full() { return stack_level == 0; } @@ -110,6 +135,10 @@ public: return stack[stack_level].elmts; } + uint16_t getParentElmts() { + return empty() ? 0 : stack[stack_level + 1].elmts; + } + // Increment the cursor until a match is found or the end of // the current collection (node of type YDT_NONE) is reached. // diff --git a/radio/util/generate_yaml.py b/radio/util/generate_yaml.py index cf522e995..b9ab0c064 100644 --- a/radio/util/generate_yaml.py +++ b/radio/util/generate_yaml.py @@ -336,12 +336,12 @@ def parse_field_array(f, node): if f.type != 'string': elmt_decl = et.get_declaration() - use_idx = False + use_idx = True ann = get_annotations(node) if len(ann) > 0: for a in ann: - if a['type'] == 'idx': - use_idx = True + if a['type'] == 'idx' and a['val'] == 'false': + use_idx = False elif a['type'] == 'raw': f.raw = a['val'] @@ -353,6 +353,7 @@ def parse_field_array(f, node): f.var_name = elmt_st.var_name # mark array usage for unions elmt_st.used_in_arrays = True + elmt_st.use_idx = use_idx elif elmt_decl.kind == CursorKind.TYPEDEF_DECL: # it's some typedef #print_error("TYPEDEF {} {}".format(f.name, elmt_decl.spelling)); diff --git a/radio/util/yaml_parser.tmpl b/radio/util/yaml_parser.tmpl index 52216301b..cbbcfbd65 100644 --- a/radio/util/yaml_parser.tmpl +++ b/radio/util/yaml_parser.tmpl @@ -22,7 +22,7 @@ const struct YamlIdStr {{ enum.name }}[] = { static const struct YamlNode {{ struct.name }}_elmts[] = { {% else %} static const struct YamlNode {{ struct.name }}[] = { - {% if struct.used_in_arrays %} + {% if struct.use_idx %} YAML_IDX, {% endif%} {% endif %} From d59bbd1020524aa68df8bab6223760d0f9227006 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 15 Oct 2021 15:10:31 +0200 Subject: [PATCH 045/110] Fix compiling taranis-like targets --- .../storage/yaml/yaml_datastructs_funcs.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 1d1ffec75..38f0c8cec 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -360,8 +360,17 @@ static void sl_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, uint16_t idx, const char* val, uint8_t val_len) { // data / bitoffs already incremented +#if defined(PCBTARANIS) + // Please note: + // slidersConfig is defined as a bit-field member, + // so let's take the next field and subtract 1 + // + data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; + data -= offsetof(RadioData, potsConfig) - 1; +#else data -= (idx + 1) / 8; data -= offsetof(RadioData, slidersConfig); +#endif RadioData* rd = reinterpret_cast(data); idx += NUM_STICKS + STORAGE_NUM_POTS; @@ -372,8 +381,17 @@ static bool sl_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, uint16_t idx, yaml_writer_func wf, void* opaque) { // data / bitoffs already incremented +#if defined(PCBTARANIS) + // Please note: + // slidersConfig is defined as a bit-field member, + // so let's take the next field and subtract 1 + // + data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; + data -= offsetof(RadioData, potsConfig) - 1; +#else data -= (idx + 1) / 8; data -= offsetof(RadioData, slidersConfig); +#endif RadioData* rd = reinterpret_cast(data); idx += NUM_STICKS + STORAGE_NUM_POTS; From c048b187b48203f31cc1dc256585bfde178aa6e3 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 15 Oct 2021 15:33:55 +0200 Subject: [PATCH 046/110] Set indexes directly rather than incrementing step by step --- radio/src/storage/yaml/yaml_tree_walker.cpp | 23 +++++++++++---------- radio/src/storage/yaml/yaml_tree_walker.h | 1 + 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index 9f27dc32c..f9f2914dd 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -356,14 +356,15 @@ bool YamlTreeWalker::toNextElmt() if (isIdxInvalid()) { setIdxInvalid(false); - stack[stack_level].elmts = 0; + setElmts(0); } - if (getElmts() >= node->u._array.u._a.elmts - 1) + if (getElmts() < node->u._array.u._a.elmts - 1) { + incElmts(); + rewind(); + } else { return false; - - incElmts(); - rewind(); + } } return true; @@ -455,16 +456,16 @@ void YamlTreeWalker::setAttrValue(char* buf, uint8_t len) else i = yaml_str2uint(buf, len); - //TODO: detect -1 and set idx_invalid = true - - while ((i > getElmts()) && toNextElmt()); - - if (i > getElmts()) + const YamlNode* node = getNode(); + if (i < node->u._array.u._a.elmts) { + setElmts(i); + rewind(); + } else { setIdxInvalid(true); + } } else { yaml_set_attr(data, getBitOffset(), attr, getParentElmts(), buf, len); - //walker.dump_stack(); } } diff --git a/radio/src/storage/yaml/yaml_tree_walker.h b/radio/src/storage/yaml/yaml_tree_walker.h index c8e1f5591..c27da5c91 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.h +++ b/radio/src/storage/yaml/yaml_tree_walker.h @@ -73,6 +73,7 @@ class YamlTreeWalker void incAttr() { stack[stack_level].attr_idx++; } void incElmts() { stack[stack_level].elmts++; } + void setElmts(uint16_t idx) { stack[stack_level].elmts = idx; } inline bool isIdxInvalid() { return stack[stack_level].flags & FLAG_STATE_IDX_INVALID; From 69c017091a247b8e89bd676167e231e49c3b15ed Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 15 Oct 2021 15:34:52 +0200 Subject: [PATCH 047/110] More stringified values --- radio/src/datastructs.h | 14 +++--- radio/src/lua/api_general.cpp | 2 +- radio/src/mixer.cpp | 8 ++-- radio/src/myeeprom.h | 12 +++-- radio/src/storage/yaml/yaml_datastructs.cpp | 2 + .../storage/yaml/yaml_datastructs_nv14.cpp | 48 ++++++++++++++++--- .../src/storage/yaml/yaml_datastructs_t12.cpp | 48 ++++++++++++++++--- .../src/storage/yaml/yaml_datastructs_t8.cpp | 48 ++++++++++++++++--- .../storage/yaml/yaml_datastructs_tlite.cpp | 48 ++++++++++++++++--- .../storage/yaml/yaml_datastructs_tx12.cpp | 48 ++++++++++++++++--- .../src/storage/yaml/yaml_datastructs_x10.cpp | 46 +++++++++++++++--- .../storage/yaml/yaml_datastructs_x12s.cpp | 43 ++++++++++++++--- .../src/storage/yaml/yaml_datastructs_x7.cpp | 48 ++++++++++++++++--- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 48 ++++++++++++++++--- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 48 ++++++++++++++++--- .../storage/yaml/yaml_datastructs_x9lite.cpp | 48 ++++++++++++++++--- .../storage/yaml/yaml_datastructs_x9lites.cpp | 48 ++++++++++++++++--- .../storage/yaml/yaml_datastructs_xlite.cpp | 48 ++++++++++++++++--- .../storage/yaml/yaml_datastructs_xlites.cpp | 48 ++++++++++++++++--- radio/src/tests/mixer.cpp | 6 +-- 20 files changed, 594 insertions(+), 115 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 514ed0c2d..6b1eb90ae 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -396,7 +396,7 @@ PACK(struct TelemetrySensor { */ PACK(struct TrainerModuleData { - uint8_t mode; + uint8_t mode ENUM(TrainerMode); uint8_t channelsStart; int8_t channelsCount; // 0=8 channels int8_t frameLength; @@ -558,7 +558,7 @@ typedef uint8_t swarnenable_t; NOBACKUP(swarnstate_t switchWarningState CUST(r_swtchWarn,w_swtchWarn)); #else #define SWITCHES_WARNING_DATA \ - swarnstate_t switchWarningState; \ + swarnstate_t switchWarningState CUST(r_swtchWarn,w_swtchWarn); \ swarnenable_t switchWarningEnable; // TODO remove it in 2.4 #endif @@ -723,7 +723,7 @@ PACK(struct CalibData { PACK(struct TrainerMix { uint8_t srcChn:6; // 0-7 = ch1-8 - uint8_t mode:2; // off,add-mode,subst-mode + uint8_t mode:2 ENUM(TrainerMultiplex); // off,add-mode,subst-mode int8_t studWeight; }); @@ -748,8 +748,8 @@ PACK(struct TrainerData { #if defined(PCBHORUS) || defined(PCBNV14) #define EXTRA_GENERAL_FIELDS \ - NOBACKUP(uint8_t auxSerialMode:4); \ - NOBACKUP(uint8_t aux2SerialMode:4); \ + NOBACKUP(uint8_t auxSerialMode:4 ENUM(UartModes)); \ + NOBACKUP(uint8_t aux2SerialMode:4 ENUM(UartModes)); \ CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ uint16_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */ \ @@ -769,7 +769,7 @@ PACK(struct TrainerData { #define BLUETOOTH_FIELDS #endif #define EXTRA_GENERAL_FIELDS \ - uint8_t auxSerialMode:4; \ + uint8_t auxSerialMode:4 ENUM(UartModes); \ uint8_t slidersConfig:4 ARRAY(1,struct_sliderConfig,nullptr); \ uint8_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */\ uint8_t backlightColor; \ @@ -849,7 +849,7 @@ PACK(struct RadioData { NOBACKUP(uint8_t backlightBright); NOBACKUP(uint32_t globalTimer); NOBACKUP(uint8_t bluetoothBaudrate:4); - NOBACKUP(uint8_t bluetoothMode:4); + NOBACKUP(uint8_t bluetoothMode:4 ENUM(BluetoothModes)); NOBACKUP(uint8_t countryCode:2); NOBACKUP(int8_t pwrOnSpeed:3); NOBACKUP(int8_t pwrOffSpeed:3); diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 607d5f657..4f17b96ff 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1878,7 +1878,7 @@ const luaR_value_entry opentxConstants[] = { { "PREC2", PREC2 }, { "VALUE", INPUT_TYPE_VALUE }, { "SOURCE", INPUT_TYPE_SOURCE }, - { "REPLACE", MLTPX_REP }, + { "REPLACE", MLTPX_REPL }, { "MIXSRC_MAX", MIXSRC_MAX }, { "MIXSRC_FIRST_INPUT", MIXSRC_FIRST_INPUT }, { "MIXSRC_Rud", MIXSRC_Rud }, diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index dc9fcb572..e19cc6637 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -480,11 +480,11 @@ void evalInputs(uint8_t mode) vStud *= td->studWeight; vStud /= 50; switch (td->mode) { - case 1: + case TRAINER_ADD: // add-mode v = limit(-RESX, v+vStud, RESX); break; - case 2: + case TRAINER_REPL: // subst-mode v = vStud; break; @@ -732,7 +732,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) swOn[i].now = swOn[i].prev = mixEnabled; } if (!mixEnabled) { - if ((md->speedDown || md->speedUp) && md->mltpx!=MLTPX_REP) { + if ((md->speedDown || md->speedUp) && md->mltpx!=MLTPX_REPL) { if (mixCondition) { v = (md->mltpx == MLTPX_ADD ? 0 : RESX); applyOffsetAndCurve = false; @@ -829,7 +829,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) int32_t * ptr = &chans[md->destCh]; // Save calculating address several times switch (md->mltpx) { - case MLTPX_REP: + case MLTPX_REPL: *ptr = dv; if (mode == e_perout_mode_normal) { for (uint8_t m=i-1; mdestCh==md->destCh; m--) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index fda84317a..c100995c1 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -158,9 +158,15 @@ enum CurveRefType { #endif enum MixerMultiplex { - MLTPX_ADD = 0, - MLTPX_MUL = 1, - MLTPX_REP = 2, + MLTPX_ADD = 0, + MLTPX_MUL = 1, + MLTPX_REPL = 2, +}; + +enum TrainerMultiplex { + TRAINER_OFF = 0, + TRAINER_ADD = 1, + TRAINER_REPL = 2, }; #define GV1_SMALL 128 diff --git a/radio/src/storage/yaml/yaml_datastructs.cpp b/radio/src/storage/yaml/yaml_datastructs.cpp index c5cfeced6..2d4f6ca6c 100644 --- a/radio/src/storage/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs.cpp @@ -60,3 +60,5 @@ #else #error "Board not supported by YAML storage" #endif + +static_assert(MAX_STR > MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN); diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index a4b57d5af..0b6d15f1f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Unsigned, "Unsigned" }, { ZOV_Signed, "Signed" }, @@ -78,7 +101,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -219,6 +242,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_OFF, "MODE_OFF" }, + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -239,7 +273,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -347,7 +381,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -366,8 +400,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), - YAML_UNSIGNED( "aux2SerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ENUM("aux2SerialMode", 4, enum_UartModes), YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), @@ -632,7 +666,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -812,7 +846,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 925ddfeb3..5b2029772 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -212,6 +235,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -232,7 +266,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -321,7 +355,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -340,7 +374,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -602,7 +636,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -756,7 +790,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -785,7 +819,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 925ddfeb3..5b2029772 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -212,6 +235,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -232,7 +266,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -321,7 +355,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -340,7 +374,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -602,7 +636,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -756,7 +790,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -785,7 +819,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 925ddfeb3..5b2029772 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -212,6 +235,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -232,7 +266,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -321,7 +355,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -340,7 +374,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -602,7 +636,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -756,7 +790,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -785,7 +819,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 10339f3ad..ece1ae5d4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -212,6 +235,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -232,7 +266,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -321,7 +355,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -340,7 +374,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -602,7 +636,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -756,7 +790,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -785,7 +819,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 57c58c304..f933b73ed 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Unsigned, "Unsigned" }, { ZOV_Signed, "Signed" }, @@ -78,7 +101,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -240,6 +263,15 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -260,7 +292,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -364,7 +396,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -383,8 +415,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), - YAML_UNSIGNED( "aux2SerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ENUM("aux2SerialMode", 4, enum_UartModes), YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), @@ -649,7 +681,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -829,7 +861,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 31 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index d31960c8e..7b7f4ed86 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Unsigned, "Unsigned" }, { ZOV_Signed, "Signed" }, @@ -78,7 +101,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -240,6 +263,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -260,7 +291,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -364,7 +395,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -383,8 +414,8 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), - YAML_UNSIGNED( "aux2SerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ENUM("aux2SerialMode", 4, enum_UartModes), YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), @@ -649,7 +680,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 925ddfeb3..5b2029772 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -212,6 +235,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -232,7 +266,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -321,7 +355,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -340,7 +374,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -602,7 +636,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -756,7 +790,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -785,7 +819,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 3c6ad7cf4..82f115868 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -219,6 +242,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -239,7 +273,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -328,7 +362,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -347,7 +381,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -610,7 +644,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -769,7 +803,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 32 ), + YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 16 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -800,7 +834,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 6fc3341ec..7f473974a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -258,6 +281,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -278,7 +312,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -367,7 +401,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -386,7 +420,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -649,7 +683,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -808,7 +842,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 64 ), + YAML_UNSIGNED_CUST( "switchWarningState", 64, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 32 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -840,7 +874,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index ee0e08ad5..0bef6d72f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -199,6 +222,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -219,7 +253,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -308,7 +342,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -327,7 +361,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -587,7 +621,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -741,7 +775,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -770,7 +804,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 953e8576c..54b2c4e6d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -207,6 +230,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -227,7 +261,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -316,7 +350,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -335,7 +369,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -597,7 +631,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -751,7 +785,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -780,7 +814,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index e874be5a2..d0fc9e196 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -204,6 +227,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -224,7 +258,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -313,7 +347,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -332,7 +366,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -594,7 +628,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -748,7 +782,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -777,7 +811,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index b93615484..793a1f216 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -21,6 +21,12 @@ const struct YamlIdStr enum_AntennaModes[] = { { ANTENNA_MODE_LAST, "MODE_LAST" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; const struct YamlIdStr enum_BeeperMode[] = { { e_mode_quiet, "mode_quiet" }, { e_mode_alarms, "mode_alarms" }, @@ -28,6 +34,13 @@ const struct YamlIdStr enum_BeeperMode[] = { { e_mode_all, "mode_all" }, { 0, NULL } }; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_Functions[] = { { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, { FUNC_TRAINER, "TRAINER" }, @@ -57,6 +70,16 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_MAX, "MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_OFF, "OFF" }, { TMRMODE_ON, "ON" }, @@ -71,7 +94,7 @@ const struct YamlIdStr enum_TimerModes[] = { const struct YamlIdStr enum_MixerMultiplex[] = { { MLTPX_ADD, "ADD" }, { MLTPX_MUL, "MUL" }, - { MLTPX_REP, "REP" }, + { MLTPX_REPL, "REPL" }, { 0, NULL } }; const struct YamlIdStr enum_MixSources[] = { @@ -206,6 +229,17 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TrainerMode[] = { + { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, + { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, + { TRAINER_MODE_MULTI, "MODE_MULTI" }, + { 0, NULL } +}; // // Structs last @@ -226,7 +260,7 @@ static const struct YamlNode struct_signed_16[] = { static const struct YamlNode struct_TrainerMix[] = { YAML_IDX, YAML_UNSIGNED( "srcChn", 6 ), - YAML_UNSIGNED( "mode", 2 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), YAML_SIGNED( "studWeight", 8 ), YAML_END }; @@ -315,7 +349,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "backlightBright", 8 ), YAML_UNSIGNED( "globalTimer", 32 ), YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_UNSIGNED( "bluetoothMode", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), YAML_UNSIGNED( "countryCode", 2 ), YAML_SIGNED( "pwrOnSpeed", 3 ), YAML_SIGNED( "pwrOffSpeed", 3 ), @@ -334,7 +368,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), YAML_SIGNED( "varioRepeat", 8 ), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_UNSIGNED( "auxSerialMode", 4 ), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), @@ -598,7 +632,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED( "mode", 8 ), + YAML_ENUM("mode", 8, enum_TrainerMode), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -752,7 +786,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), - YAML_UNSIGNED( "switchWarningState", 16 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -781,7 +815,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index 0bbd0c935..765f68aeb 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -789,12 +789,12 @@ TEST_F(MixerTest, flightModeTransition) g_model.flightModeData[1].fadeIn = 100; g_model.flightModeData[1].fadeOut = 100; g_model.mixData[0].destCh = 0; - g_model.mixData[0].mltpx = MLTPX_REP; + g_model.mixData[0].mltpx = MLTPX_REPL; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].flightModes = 0b11110; g_model.mixData[0].weight = 100; g_model.mixData[1].destCh = 0; - g_model.mixData[1].mltpx = MLTPX_REP; + g_model.mixData[1].mltpx = MLTPX_REPL; g_model.mixData[1].srcRaw = MIXSRC_MAX; g_model.mixData[1].flightModes = 0b11101; g_model.mixData[1].weight = -10; @@ -813,7 +813,7 @@ TEST_F(MixerTest, flightModeOverflow) g_model.flightModeData[0].fadeIn = 100; g_model.flightModeData[0].fadeOut = 100; g_model.mixData[0].destCh = 0; - g_model.mixData[0].mltpx = MLTPX_REP; + g_model.mixData[0].mltpx = MLTPX_REPL; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].flightModes = 0; g_model.mixData[0].weight = 250; From 61e837f0b7158b3482c200fb119264a9062172e2 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 15 Oct 2021 15:48:58 +0200 Subject: [PATCH 048/110] Clean up --- radio/src/targets/taranis/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 619ea6867..c8a53fb5d 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -15,7 +15,6 @@ add_definitions(-DPCBFRSKY) if(PCB STREQUAL X9E) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) - #set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(STICKS "STANDARD" CACHE STRING "Sticks type (STANDARD/HORUS)") set(CPU_TYPE STM32F4) @@ -49,7 +48,6 @@ if(PCB STREQUAL X9E) set(ROTARY_ENCODER YES) add_definitions(-DMANUFACTURER_FRSKY) elseif(PCB STREQUAL X9D+) - #set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) set(HAPTIC YES) set(LUA_EXPORT lua_export_x9d) add_definitions(-DPCBX9DP -DPCBX9) @@ -98,7 +96,6 @@ elseif(PCB STREQUAL X9D+) set(STATUS_LEDS NO) endif() elseif(PCB STREQUAL X9D) - #set(YAML_STORAGE OFF CACHE BOOL "Enable YAML storage" FORCE) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) set(FLAVOUR x9d) From bcc1f55b37ef512041c93d47823b63c503a59998 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 15 Oct 2021 16:08:56 +0200 Subject: [PATCH 049/110] Use full custom to cope with the strange trainer mode defs --- radio/src/datastructs.h | 2 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 36 +++++++++++++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 15 ++------ .../src/storage/yaml/yaml_datastructs_t12.cpp | 15 ++------ .../src/storage/yaml/yaml_datastructs_t8.cpp | 15 ++------ .../storage/yaml/yaml_datastructs_tlite.cpp | 15 ++------ .../storage/yaml/yaml_datastructs_tx12.cpp | 15 ++------ .../src/storage/yaml/yaml_datastructs_x10.cpp | 13 ++----- .../storage/yaml/yaml_datastructs_x12s.cpp | 10 +----- .../src/storage/yaml/yaml_datastructs_x7.cpp | 15 ++------ .../src/storage/yaml/yaml_datastructs_x9d.cpp | 15 ++------ .../src/storage/yaml/yaml_datastructs_x9e.cpp | 15 ++------ .../storage/yaml/yaml_datastructs_x9lite.cpp | 15 ++------ .../storage/yaml/yaml_datastructs_x9lites.cpp | 15 ++------ .../storage/yaml/yaml_datastructs_xlite.cpp | 15 ++------ .../storage/yaml/yaml_datastructs_xlites.cpp | 15 ++------ 16 files changed, 64 insertions(+), 177 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 6b1eb90ae..7d9af9f83 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -396,7 +396,7 @@ PACK(struct TelemetrySensor { */ PACK(struct TrainerModuleData { - uint8_t mode ENUM(TrainerMode); + uint8_t mode CUST(r_trainerMode,w_trainerMode); uint8_t channelsStart; int8_t channelsCount; // 0=8 channels int8_t frameLength; diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 38f0c8cec..8e5c46022 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -689,3 +689,39 @@ static bool w_vPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, vo return wf(opaque, s, strlen(s)); } +const struct YamlIdStr enum_TrainerMode[] = { +#if defined(PCBNV14) + { TRAINER_MODE_OFF, "OFF" }, +#endif + { TRAINER_MODE_MASTER_TRAINER_JACK, "MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "SLAVE" }, +#if defined(PCBTARANIS) || defined(PCBNV14) + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MASTER_SBUS_EXT" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MASTER_CPPM_EXT" }, +#endif +#if defined(PCBTARANIS) || defined(AUX_SERIAL) || defined(AUX2_SERIAL) + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MASTER_BATT_COMP" }, +#endif + { TRAINER_MODE_MASTER_BLUETOOTH, "MASTER_BT" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "SLAVE_BT" }, + { TRAINER_MODE_MULTI, "MASTER_MULTI" }, + { 0, NULL } +}; + +static uint32_t r_trainerMode(const YamlNode* node, const char* val, uint8_t val_len) +{ + return yaml_parse_enum(enum_TrainerMode, val, val_len); +} + +static bool w_trainerMode(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque) +{ + const char* str = nullptr; + str = yaml_output_enum(val, enum_TrainerMode); + + if (str) { + return wf(opaque, str, strlen(str)); + } + + return true; +} diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 0b6d15f1f..cf510201a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -242,17 +242,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_OFF, "MODE_OFF" }, - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -666,7 +655,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -846,7 +835,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 5b2029772..433343d0f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -235,17 +235,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -636,7 +625,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -819,7 +808,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 5b2029772..433343d0f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -235,17 +235,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -636,7 +625,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -819,7 +808,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 5b2029772..433343d0f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -235,17 +235,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -636,7 +625,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -819,7 +808,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index ece1ae5d4..658bf57bc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -235,17 +235,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -636,7 +625,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -819,7 +808,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index f933b73ed..45482c63f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -263,15 +263,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -681,7 +672,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -861,7 +852,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 31 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 7b7f4ed86..027e6d428 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -263,14 +263,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -680,7 +672,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 5b2029772..433343d0f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -235,17 +235,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -636,7 +625,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -819,7 +808,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 82f115868..4ecd1fcfb 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -242,17 +242,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -644,7 +633,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -834,7 +823,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 7f473974a..506ce0e76 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -281,17 +281,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -683,7 +672,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -874,7 +863,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 0bef6d72f..8a2b98dad 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -222,17 +222,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -621,7 +610,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -804,7 +793,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 54b2c4e6d..245a52698 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -230,17 +230,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -631,7 +620,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -814,7 +803,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index d0fc9e196..0d4de5fd3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -227,17 +227,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -628,7 +617,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -811,7 +800,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 793a1f216..aea0501cb 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -229,17 +229,6 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; -const struct YamlIdStr enum_TrainerMode[] = { - { TRAINER_MODE_MASTER_TRAINER_JACK, "MODE_MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "MODE_SLAVE" }, - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MODE_MASTER_SBUS_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MODE_MASTER_CPPM_EXTERNAL_MODULE" }, - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MODE_MASTER_BATTERY_COMPARTMENT" }, - { TRAINER_MODE_MASTER_BLUETOOTH, "MODE_MASTER_BLUETOOTH" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "MODE_SLAVE_BLUETOOTH" }, - { TRAINER_MODE_MULTI, "MODE_MULTI" }, - { 0, NULL } -}; // // Structs last @@ -632,7 +621,7 @@ static const struct YamlNode struct_ModuleData[] = { YAML_END }; static const struct YamlNode struct_TrainerModuleData[] = { - YAML_ENUM("mode", 8, enum_TrainerMode), + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), YAML_UNSIGNED( "channelsStart", 8 ), YAML_SIGNED( "channelsCount", 8 ), YAML_SIGNED( "frameLength", 8 ), @@ -815,7 +804,7 @@ static const struct YamlNode struct_PartialModel[] = { YAML_END }; -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 32 +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); From 2e4c313f017959a0194df2e5fd467ae11279a6ed Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 15 Oct 2021 19:32:11 +0200 Subject: [PATCH 050/110] Pack the frozen time capsule --- radio/src/storage/conversions/CMakeLists.txt | 2 + .../storage/conversions/yaml/CMakeLists.txt | 2 + radio/src/storage/conversions/yaml/bitfield.h | 88 ++ .../conversions/yaml/dataconstants_220.h | 1036 +++++++++++++++++ .../conversions/yaml/datastructs_220.h | 1021 ++++++++++++++++ .../src/storage/conversions/yaml/layout_220.h | 57 + .../storage/conversions/yaml/myeeprom_220.h | 282 +++++ .../conversions/yaml/yaml_datastructs.cpp | 69 ++ .../yaml/yaml_datastructs_funcs.cpp | 605 ++++++++++ .../yaml/yaml_datastructs_nv14.cpp | 858 ++++++++++++++ .../conversions/yaml/yaml_datastructs_t12.cpp | 831 +++++++++++++ .../conversions/yaml/yaml_datastructs_t8.cpp | 831 +++++++++++++ .../yaml/yaml_datastructs_tlite.cpp | 831 +++++++++++++ .../yaml/yaml_datastructs_tx12.cpp | 831 +++++++++++++ .../conversions/yaml/yaml_datastructs_x10.cpp | 875 ++++++++++++++ .../yaml/yaml_datastructs_x12s.cpp | 875 ++++++++++++++ .../conversions/yaml/yaml_datastructs_x7.cpp | 831 +++++++++++++ .../conversions/yaml/yaml_datastructs_x9d.cpp | 846 ++++++++++++++ .../conversions/yaml/yaml_datastructs_x9e.cpp | 886 ++++++++++++++ .../yaml/yaml_datastructs_x9lite.cpp | 816 +++++++++++++ .../yaml/yaml_datastructs_x9lites.cpp | 826 +++++++++++++ .../yaml/yaml_datastructs_xlite.cpp | 823 +++++++++++++ .../yaml/yaml_datastructs_xlites.cpp | 827 +++++++++++++ radio/src/storage/conversions/yaml/zone_220.h | 66 ++ 24 files changed, 15015 insertions(+) create mode 100644 radio/src/storage/conversions/yaml/CMakeLists.txt create mode 100644 radio/src/storage/conversions/yaml/bitfield.h create mode 100644 radio/src/storage/conversions/yaml/dataconstants_220.h create mode 100644 radio/src/storage/conversions/yaml/datastructs_220.h create mode 100644 radio/src/storage/conversions/yaml/layout_220.h create mode 100644 radio/src/storage/conversions/yaml/myeeprom_220.h create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp create mode 100644 radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp create mode 100644 radio/src/storage/conversions/yaml/zone_220.h diff --git a/radio/src/storage/conversions/CMakeLists.txt b/radio/src/storage/conversions/CMakeLists.txt index bf49d73c9..239e97983 100644 --- a/radio/src/storage/conversions/CMakeLists.txt +++ b/radio/src/storage/conversions/CMakeLists.txt @@ -7,4 +7,6 @@ if(STORAGE_CONVERSIONS) storage/conversions/conversions.cpp storage/conversions/conversions_219_220.cpp ) + + include(storage/conversions/yaml/CMakeLists.txt) endif() diff --git a/radio/src/storage/conversions/yaml/CMakeLists.txt b/radio/src/storage/conversions/yaml/CMakeLists.txt new file mode 100644 index 000000000..e089ee135 --- /dev/null +++ b/radio/src/storage/conversions/yaml/CMakeLists.txt @@ -0,0 +1,2 @@ +set(SRC ${SRC} + storage/conversions/yaml/yaml_datastructs.cpp) diff --git a/radio/src/storage/conversions/yaml/bitfield.h b/radio/src/storage/conversions/yaml/bitfield.h new file mode 100644 index 000000000..a0c753e0f --- /dev/null +++ b/radio/src/storage/conversions/yaml/bitfield.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * This file is based on work published at http://www.coranac.com/documents/working-with-bits-and-bitfields + * + * 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. + */ + +#ifndef BITFIELD_H +#define BITFIELD_H + +#include + +// A set of bitfield handling macros + +template +inline T bfBit(uint8_t n) +{ + return T(1) << n; +} + +#define BFBIT_SET(y, mask) ( y |= (mask) ) +#define BFBIT_CLEAR(y, mask) ( y &= ~(mask) ) +#define BFBIT_FLIP(y, mask) ( y ^= (mask) ) +#define BF_SINGLE_BIT_SET(y, i) BFBIT_SET(y, bfBit(i)) + +//! Create a bitmask of length 'len'. +template +inline T bfBitmask(uint8_t len) +{ + return bfBit(len) - 1; +} + +//! Create a bitfield mask of length 'len' starting at bit 'start'. +template +inline T bfMask(uint8_t start, uint8_t len) +{ + return bfBitmask(len) << start; +} + +//! Prepare a bitmask for insertion or combining. +template +inline T bfPrep(T x, uint8_t start, uint8_t len) +{ + return (x & bfBitmask(len)) << start; +} + +//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. +template +inline T bfGet(T y, uint8_t start, uint8_t len) +{ + return ((y)>>(start)) & bfBitmask(len); +} + +//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. +template +inline T bfSet(T to, T from, uint8_t start, uint8_t len) +{ + return (to & ~bfMask(start, len)) | bfPrep(from, start, len); +} + +template +inline T bfBitGet(T y, T mask) +{ + return (y & mask); +} + +template +inline T bfSingleBitGet(T y, uint8_t i) +{ + return bfBitGet(y, bfBit(i)); +} + +#endif //BITFIELD_H diff --git a/radio/src/storage/conversions/yaml/dataconstants_220.h b/radio/src/storage/conversions/yaml/dataconstants_220.h new file mode 100644 index 000000000..30c0cba2f --- /dev/null +++ b/radio/src/storage/conversions/yaml/dataconstants_220.h @@ -0,0 +1,1036 @@ +/* + * 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. + */ + +#ifndef _DATACONSTANTS_H_ +#define _DATACONSTANTS_H_ + +#include +#include + +// from board.h (taranis, horus, nv14) +#if defined(PCBNV14) + +#define STORAGE_NUM_SWITCHES 8 +#define STORAGE_NUM_POTS 5 +#define STORAGE_NUM_SLIDERS 0 +#define STORAGE_NUM_MOUSE_ANALOGS 0 + +#elif defined(PCBHORUS) + +#define STORAGE_NUM_SWITCHES 10 +#define STORAGE_NUM_POTS 5 +#define STORAGE_NUM_SLIDERS 4 +#define STORAGE_NUM_MOUSE_ANALOGS 2 + +#elif defined(PCBTARANIS) + +#if defined(PCBX9LITE) + // #define NUM_POTS 1 + // #define NUM_SLIDERS 0 + #define STORAGE_NUM_POTS 1 + #define STORAGE_NUM_SLIDERS 0 +#elif defined(RADIO_T8) || defined(RADIO_TLITE) + // #define NUM_POTS 0 + // #define NUM_SLIDERS 0 + #define STORAGE_NUM_POTS 2 + #define STORAGE_NUM_SLIDERS 0 +#elif defined(PCBXLITE) || defined(PCBX7) + // #define NUM_POTS 2 + // #define NUM_SLIDERS 0 + #define STORAGE_NUM_POTS 2 + #define STORAGE_NUM_SLIDERS 0 +#elif defined(PCBX9E) + // #define NUM_POTS 4 + // #define NUM_SLIDERS 4 + #define STORAGE_NUM_POTS 4 + #define STORAGE_NUM_SLIDERS 4 +#elif defined(PCBX9DP) + // #define NUM_POTS 3 + // #define NUM_SLIDERS 2 + #define STORAGE_NUM_POTS 3 + #define STORAGE_NUM_SLIDERS 2 +#else + // #define NUM_POTS 3 // TODO X9D has only 2 pots + // #define NUM_SLIDERS 2 + #define STORAGE_NUM_POTS 3 + #define STORAGE_NUM_SLIDERS 2 +#endif + +// #define NUM_XPOTS STORAGE_NUM_POTS +// #define NUM_TRIMS 4 +// #define NUM_MOUSE_ANALOGS 0 +#define STORAGE_NUM_MOUSE_ANALOGS 0 + +#if defined(PCBXLITES) || defined(PCBXLITE) +#define STORAGE_NUM_SWITCHES 6 +#elif defined(RADIO_TLITE) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_TX12) || defined(RADIO_T8) || defined(PCBX7ACCESS) || defined(PCBX7) +#define STORAGE_NUM_SWITCHES 8 +#elif defined(PCBX9LITES) +#define STORAGE_NUM_SWITCHES 7 +#elif defined(PCBX9LITE) +#define STORAGE_NUM_SWITCHES 5 +#elif defined(PCBX9E) +#define STORAGE_NUM_SWITCHES 18 +#elif defined(RADIO_X9DP2019) || defined(PCBX9D) || defined(PCBX9DP) +#define STORAGE_NUM_SWITCHES 9 +#endif + +#else +#error "Unsupported board" +#endif + +#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) + +#define NUM_STICKS 4 + +#if defined(PCBHORUS) +#define NUM_TRIMS 6 +#else +#define NUM_TRIMS 4 +#endif + +#define LUA_EXPORT(...) +#define LUA_EXPORT_MULTIPLE(...) +#define LUA_EXPORT_EXTRA(...) + +#if defined(PCBHORUS) || defined(PCBNV14) + #define MAX_MODELS 60 + #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 64 + #define MAX_LOGICAL_SWITCHES 64 + #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches + #define MAX_SCRIPTS 9 + #define MAX_INPUTS 32 + #define MIN_TRAINER_CHANNELS 4 + #define DEF_TRAINER_CHANNELS 8 + #define MAX_TRAINER_CHANNELS 16 + #define MAX_TELEMETRY_SENSORS 60 + #define MAX_CUSTOM_SCREENS 5 +#elif defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) + #define MAX_MODELS 60 + #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 64 + #define MAX_LOGICAL_SWITCHES 64 + #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches + #define MAX_SCRIPTS 7 + #define MAX_INPUTS 32 + #define MIN_TRAINER_CHANNELS 4 + #define DEF_TRAINER_CHANNELS 8 + #define MAX_TRAINER_CHANNELS 16 + #define MAX_TELEMETRY_SENSORS 60 +#elif defined(PCBTARANIS) + #define MAX_MODELS 60 + #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 64 + #define MAX_LOGICAL_SWITCHES 64 + #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches + #define MAX_SCRIPTS 7 + #define MAX_INPUTS 32 + #define MIN_TRAINER_CHANNELS 4 + #define DEF_TRAINER_CHANNELS 8 + #define MAX_TRAINER_CHANNELS 16 + #define MAX_TELEMETRY_SENSORS 40 +#else + #warning "Unknown board!" +#endif + +#define MAX_TIMERS 3 +#define NUM_CAL_PPM 4 + +enum CurveType { + CURVE_TYPE_STANDARD, + CURVE_TYPE_CUSTOM, + CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM +}; + +#define MIN_POINTS_PER_CURVE 3 +#define MAX_POINTS_PER_CURVE 17 + +#if defined(PCBHORUS) || defined(PCBNV14) + #define LEN_MODEL_NAME 15 + #define LEN_TIMER_NAME 8 + #define LEN_FLIGHT_MODE_NAME 10 + #define LEN_BITMAP_NAME 14 + #define LEN_EXPOMIX_NAME 6 + #define LEN_CHANNEL_NAME 6 + #define LEN_INPUT_NAME 4 + #define LEN_CURVE_NAME 3 + #define LEN_FUNCTION_NAME 6 + #define MAX_CURVES 32 + #define MAX_CURVE_POINTS 512 +#elif LCD_W == 212 + #define LEN_MODEL_NAME 12 + #define LEN_TIMER_NAME 8 + #define LEN_FLIGHT_MODE_NAME 10 + #define LEN_BITMAP_NAME 10 + #define LEN_EXPOMIX_NAME 6 + #define LEN_CHANNEL_NAME 6 + #define LEN_INPUT_NAME 4 + #define LEN_CURVE_NAME 3 + #define LEN_FUNCTION_NAME 8 + #define MAX_CURVES 32 + #define MAX_CURVE_POINTS 512 +#else + #define LEN_MODEL_NAME 10 + #define LEN_TIMER_NAME 3 + #define LEN_FLIGHT_MODE_NAME 6 + #define LEN_EXPOMIX_NAME 6 + #define LEN_CHANNEL_NAME 4 + #define LEN_INPUT_NAME 3 + #define LEN_CURVE_NAME 3 + #define LEN_FUNCTION_NAME 6 + #define MAX_CURVES 32 + #define MAX_CURVE_POINTS 512 +#endif + +#if defined(PCBFRSKY) || defined(PCBNV14) + #define NUM_MODULES 2 +#else + #define NUM_MODULES 1 +#endif + +#define XPOTS_MULTIPOS_COUNT 6 + +#if defined(COLORLCD) +enum MainViews { + VIEW_BLANK, + VIEW_TIMERS_ALTITUDE, + VIEW_CHANNELS, + VIEW_TELEM1, + VIEW_TELEM2, + VIEW_TELEM3, + VIEW_TELEM4, + VIEW_COUNT +}; +#elif LCD_W >= 212 +enum MainViews { + VIEW_TIMERS, + VIEW_INPUTS, + VIEW_SWITCHES, + VIEW_COUNT +}; +#else +enum MainViews { + VIEW_OUTPUTS_VALUES, + VIEW_OUTPUTS_BARS, + VIEW_INPUTS, + VIEW_TIMER2, + VIEW_CHAN_MONITOR, + VIEW_COUNT +}; +#endif + +enum BeeperMode { + e_mode_quiet = -2, + e_mode_alarms, + e_mode_nokeys, + e_mode_all +}; + +#if defined(PCBFRSKY) || defined(PCBNV14) +enum ModuleIndex { + INTERNAL_MODULE, + EXTERNAL_MODULE, + SPORT_MODULE +}; + +enum TrainerMode { +#if defined(PCBNV14) + TRAINER_MODE_OFF, +#endif + TRAINER_MODE_MASTER_TRAINER_JACK, + TRAINER_MODE_SLAVE, +#if defined(PCBTARANIS) || defined(PCBNV14) + TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, + TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, +#endif +#if defined(PCBTARANIS) || defined(AUX_SERIAL) || defined(AUX2_SERIAL) + TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, +#endif + TRAINER_MODE_MASTER_BLUETOOTH, + TRAINER_MODE_SLAVE_BLUETOOTH, + TRAINER_MODE_MULTI, +}; +#endif + +#define TRAINER_MODE_MIN() TRAINER_MODE_MASTER_TRAINER_JACK + +#if !defined(HARDWARE_EXTERNAL_MODULE) + #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE +#elif defined(RADIO_T16) && !defined(INTERNAL_MODULE_MULTI) +#if defined(BLUETOOTH) + #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH +#else + #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE +#endif +#elif defined(INTERNAL_MODULE_MULTI) || defined(ALLOW_TRAINER_MULTI) + #define TRAINER_MODE_MAX() TRAINER_MODE_MULTI +#elif defined(BLUETOOTH) + #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBNV14) + #define TRAINER_MODE_MAX() TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE +#elif defined(PCBTARANIS) + #define TRAINER_MODE_MAX() (IS_TRAINER_AUX_SERIAL() ? TRAINER_MODE_MASTER_BATTERY_COMPARTMENT : TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) +#else + #define TRAINER_MODE_MAX() TRAINER_MODE_MASTER_BATTERY_COMPARTMENT +#endif + +#if defined(HARDWARE_INTERNAL_MODULE) + #define IS_INTERNAL_MODULE_ENABLED() (g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) +#else + #define IS_INTERNAL_MODULE_ENABLED() (false) +#endif + +#define IS_EXTERNAL_MODULE_ENABLED() (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_NONE) + +#if defined(HARDWARE_INTERNAL_MODULE) + #define IS_MODULE_ENABLED(moduleIdx) (moduleIdx==INTERNAL_MODULE ? IS_INTERNAL_MODULE_ENABLED() : moduleIdx==EXTERNAL_MODULE ? IS_EXTERNAL_MODULE_ENABLED() : false) +#else + #define IS_MODULE_ENABLED(moduleIdx) (moduleIdx==EXTERNAL_MODULE ? IS_EXTERNAL_MODULE_ENABLED() : false) +#endif + +enum UartModes { +#if defined(CLI) || defined(DEBUG) + UART_MODE_DEBUG, +#else + UART_MODE_NONE, +#endif + UART_MODE_TELEMETRY_MIRROR, + UART_MODE_TELEMETRY, + UART_MODE_SBUS_TRAINER, + UART_MODE_LUA, + UART_MODE_COUNT, + UART_MODE_MAX = UART_MODE_COUNT-1 +}; + +#define LEN_SWITCH_NAME 3 +#define LEN_ANA_NAME 3 +#define LEN_MODEL_FILENAME 16 +#define LEN_BLUETOOTH_NAME 10 + +enum TelemetryProtocol +{ + PROTOCOL_TELEMETRY_FIRST, + PROTOCOL_TELEMETRY_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST, + PROTOCOL_TELEMETRY_FRSKY_D, + PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY, + PROTOCOL_TELEMETRY_CROSSFIRE, + PROTOCOL_TELEMETRY_SPEKTRUM, + PROTOCOL_TELEMETRY_FLYSKY_IBUS, + PROTOCOL_TELEMETRY_HITEC, + PROTOCOL_TELEMETRY_HOTT, + PROTOCOL_TELEMETRY_MLINK, + PROTOCOL_TELEMETRY_MULTIMODULE, + PROTOCOL_TELEMETRY_AFHDS3, + PROTOCOL_TELEMETRY_GHOST, + PROTOCOL_TELEMETRY_FLYSKY_NV14, + PROTOCOL_TELEMETRY_LAST=PROTOCOL_TELEMETRY_FLYSKY_NV14, + PROTOCOL_TELEMETRY_LUA +}; + +#define TELEM_LABEL_LEN 4 +enum TelemetryUnit { + UNIT_RAW, + UNIT_VOLTS, + UNIT_AMPS, + UNIT_MILLIAMPS, + UNIT_KTS, + UNIT_METERS_PER_SECOND, + UNIT_FEET_PER_SECOND, + UNIT_KMH, + UNIT_SPEED = UNIT_KMH, + UNIT_MPH, + UNIT_METERS, + UNIT_DIST = UNIT_METERS, + UNIT_FEET, + UNIT_CELSIUS, + UNIT_TEMPERATURE = UNIT_CELSIUS, + UNIT_FAHRENHEIT, + UNIT_PERCENT, + UNIT_MAH, + UNIT_WATTS, + UNIT_MILLIWATTS, + UNIT_DB, + UNIT_RPMS, + UNIT_G, + UNIT_DEGREE, + UNIT_RADIANS, + UNIT_MILLILITERS, + UNIT_FLOZ, + UNIT_MILLILITERS_PER_MINUTE, + UNIT_HERTZ, + UNIT_MS, + UNIT_US, + UNIT_KM, + UNIT_MAX = UNIT_KM, + UNIT_SPARE5, + UNIT_SPARE6, + UNIT_SPARE7, + UNIT_SPARE8, + UNIT_SPARE9, + UNIT_SPARE10, + UNIT_HOURS, + UNIT_MINUTES, + UNIT_SECONDS, + // FrSky format used for these fields, could be another format in the future + UNIT_FIRST_VIRTUAL, + UNIT_CELLS = UNIT_FIRST_VIRTUAL, + UNIT_DATETIME, + UNIT_GPS, + UNIT_BITFIELD, + UNIT_TEXT, + // Internal units (not stored in sensor unit) + UNIT_GPS_LONGITUDE, + UNIT_GPS_LATITUDE, + UNIT_DATETIME_YEAR, + UNIT_DATETIME_DAY_MONTH, + UNIT_DATETIME_HOUR_MIN, + UNIT_DATETIME_SEC +}; + +#if LCD_W >= 212 + #define NUM_LINE_ITEMS 3 +#else + #define NUM_LINE_ITEMS 2 +#endif + +#if defined(PCBTARANIS) + #define MAX_TELEM_SCRIPT_INPUTS 8 +#endif + +enum TelemetryScreenType { + TELEMETRY_SCREEN_TYPE_NONE, + TELEMETRY_SCREEN_TYPE_VALUES, + TELEMETRY_SCREEN_TYPE_BARS, + TELEMETRY_SCREEN_TYPE_SCRIPT, +#if defined(LUA) + TELEMETRY_SCREEN_TYPE_MAX = TELEMETRY_SCREEN_TYPE_SCRIPT +#else + TELEMETRY_SCREEN_TYPE_MAX = TELEMETRY_SCREEN_TYPE_BARS +#endif +}; +#define MAX_TELEMETRY_SCREENS 4 +#define TELEMETRY_SCREEN_TYPE(screenIndex) TelemetryScreenType((g_model.screensType >> (2*(screenIndex))) & 0x03) +#define IS_BARS_SCREEN(screenIndex) (TELEMETRY_SCREEN_TYPE(screenIndex) == TELEMETRY_SCREEN_TYPE_BARS) + +constexpr int16_t FAILSAFE_CHANNEL_HOLD = 2000; +constexpr int16_t FAILSAFE_CHANNEL_NOPULSE = 2001; + +#define LEN_SCRIPT_FILENAME 6 +#define LEN_SCRIPT_NAME 6 +#define MAX_SCRIPT_INPUTS 6 +#define MAX_SCRIPT_OUTPUTS 6 + +enum PotsWarnMode { + POTS_WARN_OFF, + POTS_WARN_MANUAL, + POTS_WARN_AUTO +}; + +#define LEN_GVAR_NAME 3 +#define GVAR_MAX 1024 +#define GVAR_MIN -GVAR_MAX + +#define RESERVE_RANGE_FOR_GVARS 10 +// even we do not spend space in EEPROM for 10 GVARS, we reserve the space inside the range of values, like offset, weight, etc. + +#define MAX_GVARS 9 + +enum SwitchSources { + SWSRC_NONE = 0, + + SWSRC_FIRST_SWITCH SKIP, + +#if defined(STORAGE_SWITCH_A) + SWSRC_SA0 = SWSRC_FIRST_SWITCH, + SWSRC_SA1, + SWSRC_SA2, +#endif + +#if defined(STORAGE_SWITCH_B) + SWSRC_SB0, + SWSRC_SB1, + SWSRC_SB2, +#endif + +#if defined(STORAGE_SWITCH_C) + SWSRC_SC0, + SWSRC_SC1, + SWSRC_SC2, +#endif + +#if defined(STORAGE_SWITCH_D) + SWSRC_SD0, + SWSRC_SD1, + SWSRC_SD2, +#endif + +#if defined(STORAGE_SWITCH_E) + SWSRC_SE0, + SWSRC_SE1, + SWSRC_SE2, +#endif + +#if defined(STORAGE_SWITCH_F) + SWSRC_SF0, + SWSRC_SF1, + SWSRC_SF2, +#endif + +#if defined(STORAGE_SWITCH_G) + SWSRC_SG0, + SWSRC_SG1, + SWSRC_SG2, +#endif + +#if defined(STORAGE_SWITCH_H) + SWSRC_SH0, + SWSRC_SH1, + SWSRC_SH2, +#endif + +#if defined(STORAGE_SWITCH_I) + SWSRC_SI0, + SWSRC_SI1, + SWSRC_SI2, +#endif + +#if defined(STORAGE_SWITCH_J) + SWSRC_SJ0, + SWSRC_SJ1, + SWSRC_SJ2, +#endif + +#if defined(STORAGE_SWITCH_K) + SWSRC_SK0, + SWSRC_SK1, + SWSRC_SK2, +#endif + +#if defined(STORAGE_SWITCH_L) + SWSRC_SL0, + SWSRC_SL1, + SWSRC_SL2, +#endif + +#if defined(STORAGE_SWITCH_M) + SWSRC_SM0, + SWSRC_SM1, + SWSRC_SM2, +#endif + +#if defined(STORAGE_SWITCH_N) + SWSRC_SN0, + SWSRC_SN1, + SWSRC_SN2, +#endif + +#if defined(STORAGE_SWITCH_O) + SWSRC_SO0, + SWSRC_SO1, + SWSRC_SO2, +#endif + +#if defined(STORAGE_SWITCH_P) + SWSRC_SP0, + SWSRC_SP1, + SWSRC_SP2, +#endif + +#if defined(STORAGE_SWITCH_Q) + SWSRC_SQ0, + SWSRC_SQ1, + SWSRC_SQ2, +#endif + +#if defined(STORAGE_SWITCH_R) + SWSRC_SR0, + SWSRC_SR1, + SWSRC_SR2, +#endif + + SWSRC_LAST_SWITCH SKIP = SWSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES_POSITIONS - 1, + +#if NUM_XPOTS > 0 + SWSRC_FIRST_MULTIPOS_SWITCH SKIP, + SWSRC_LAST_MULTIPOS_SWITCH SKIP = SWSRC_FIRST_MULTIPOS_SWITCH + (NUM_XPOTS * XPOTS_MULTIPOS_COUNT) - 1, +#endif + + SWSRC_FIRST_TRIM SKIP, + SWSRC_TrimRudLeft = SWSRC_FIRST_TRIM, + SWSRC_TrimRudRight, + SWSRC_TrimEleDown, + SWSRC_TrimEleUp, + +#if NUM_TRIMS > 2 + SWSRC_TrimThrDown, + SWSRC_TrimThrUp, + SWSRC_TrimAilLeft, + SWSRC_TrimAilRight, +#endif + +#if NUM_TRIMS > 4 + SWSRC_TrimT5Down, + SWSRC_TrimT5Up, + SWSRC_TrimT6Down, + SWSRC_TrimT6Up, +#endif + + SWSRC_FIRST_LOGICAL_SWITCH SKIP, + SWSRC_SW1 = SWSRC_FIRST_LOGICAL_SWITCH, + SWSRC_SW2, + // ... + SWSRC_LAST_LOGICAL_SWITCH SKIP = SWSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, + + SWSRC_ON, + SWSRC_ONE, + + SWSRC_FIRST_FLIGHT_MODE SKIP, + SWSRC_LAST_FLIGHT_MODE SKIP = SWSRC_FIRST_FLIGHT_MODE+MAX_FLIGHT_MODES-1, + + SWSRC_TELEMETRY_STREAMING, + + SWSRC_FIRST_SENSOR SKIP, + SWSRC_LAST_SENSOR SKIP = SWSRC_FIRST_SENSOR+MAX_TELEMETRY_SENSORS-1, + + SWSRC_RADIO_ACTIVITY, + +#if defined(DEBUG_LATENCY) + SWSRC_LATENCY_TOGGLE, +#endif + + SWSRC_COUNT SKIP, + + SWSRC_OFF = -SWSRC_ON, + + SWSRC_LAST SKIP = SWSRC_COUNT-1, + SWSRC_FIRST SKIP = -SWSRC_LAST, + + SWSRC_LAST_IN_LOGICAL_SWITCHES SKIP = SWSRC_COUNT-1, + SWSRC_LAST_IN_MIXES SKIP = SWSRC_COUNT-1, + + SWSRC_FIRST_IN_LOGICAL_SWITCHES SKIP = -SWSRC_LAST_IN_LOGICAL_SWITCHES, + SWSRC_FIRST_IN_MIXES SKIP = -SWSRC_LAST_IN_MIXES, + + SWSRC_INVERT SKIP = SWSRC_COUNT+1, +}; + +#if NUM_SWITCHES >= 8 + #define SWSRC_TRAINER SWSRC_SH2 +#else + #define SWSRC_TRAINER SWSRC_LAST_SWITCH, +#endif + +#define SWSRC_LAST_TRIM (SWSRC_FIRST_TRIM + 2 * NUM_TRIMS - 1) + +enum MixSources { + MIXSRC_NONE, + + MIXSRC_FIRST_INPUT SKIP, LUA_EXPORT_MULTIPLE("input", "Input [I%d]", MAX_INPUTS) + MIXSRC_LAST_INPUT SKIP = MIXSRC_FIRST_INPUT+MAX_INPUTS-1, + +#if defined(LUA_INPUTS) + MIXSRC_FIRST_LUA SKIP, LUA_EXPORT_MULTIPLE("lua", "Lua mix output %d", MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS) + MIXSRC_LAST_LUA SKIP = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, +#endif + + MIXSRC_FIRST_STICK SKIP, + MIXSRC_Rud = MIXSRC_FIRST_STICK, LUA_EXPORT("rud", "Rudder") + MIXSRC_Ele, LUA_EXPORT("ele", "Elevator") + MIXSRC_Thr, LUA_EXPORT("thr", "Throttle") + MIXSRC_Ail, LUA_EXPORT("ail", "Aileron") + + MIXSRC_LAST_STICK SKIP = MIXSRC_Ail, + MIXSRC_FIRST_POT SKIP, +#if defined(PCBHORUS) + MIXSRC_S1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer S1") + MIXSRC_6POS, LUA_EXPORT("6pos", "Multipos Switch") + MIXSRC_S2, LUA_EXPORT("s2", "Potentiometer S2") +#if defined(PCBX10) + MIXSRC_EXT1, LUA_EXPORT("ext1", "Ext 1") + MIXSRC_EXT2, LUA_EXPORT("ext2", "Ext 2") +#if defined(FLYSKY_HALL_STICKS) && defined(FLYSKY_HALL_STICKS_EXT3_EXT4) + MIXSRC_EXT3, LUA_EXPORT("ext3", "Ext 3") + MIXSRC_EXT4, LUA_EXPORT("ext4", "Ext 4") +#endif +#endif + MIXSRC_FIRST_SLIDER SKIP, +#if defined(PCBX12S) + MIXSRC_S3 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("s3", "Slider S3") + MIXSRC_S4, LUA_EXPORT("s4", "Slider S4") + MIXSRC_LS, LUA_EXPORT("ls", "Left rear slider") + MIXSRC_RS, LUA_EXPORT("rs", "Right rear slider") +#else + MIXSRC_LS = MIXSRC_FIRST_SLIDER, LUA_EXPORT("ls", "Left slider") + MIXSRC_RS, LUA_EXPORT("rs", "Right slider") +#endif + MIXSRC_LAST_POT SKIP = MIXSRC_RS, +#elif defined(PCBX9E) + MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") + MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") + MIXSRC_POT3, LUA_EXPORT("s3", "Potentiometer 3") + MIXSRC_POT4, LUA_EXPORT("s4", "Potentiometer 4 (X9E only)") + MIXSRC_FIRST_SLIDER SKIP, + MIXSRC_SLIDER1 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("ls", "Left slider") + MIXSRC_SLIDER2, LUA_EXPORT("rs", "Right slider") + MIXSRC_SLIDER3, LUA_EXPORT("lcs", "Left center slider (X9E only)") + MIXSRC_SLIDER4, LUA_EXPORT("rcs", "Right center slider (X9E only)") + MIXSRC_LAST_POT SKIP = MIXSRC_SLIDER4, +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBNV14) + MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") + MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") + MIXSRC_FIRST_SLIDER SKIP = MIXSRC_POT2, + MIXSRC_LAST_POT SKIP = MIXSRC_POT2, +#elif defined(PCBX9LITE) + MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") + MIXSRC_FIRST_SLIDER SKIP = MIXSRC_POT1, + MIXSRC_LAST_POT SKIP = MIXSRC_POT1, +#elif defined(PCBTARANIS) + MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") + MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") + MIXSRC_POT3, LUA_EXPORT("s3", "Potentiometer 3") + MIXSRC_FIRST_SLIDER SKIP, + MIXSRC_SLIDER1 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("ls", "Left slider") + MIXSRC_SLIDER2, LUA_EXPORT("rs", "Right slider") + MIXSRC_LAST_POT SKIP = MIXSRC_SLIDER2, +#else + MIXSRC_P1 = MIXSRC_FIRST_POT, + MIXSRC_P2, + MIXSRC_P3, + MIXSRC_LAST_POT SKIP = MIXSRC_P3, +#endif + +#if defined(PCBHORUS) + MIXSRC_MOUSE1, LUA_EXPORT("jsx", "Joystick X") + MIXSRC_MOUSE2, LUA_EXPORT("jsy", "Joystick Y") +#endif + +#if defined(GYRO) + MIXSRC_GYRO1, LUA_EXPORT("gyrx", "Gyro X") + MIXSRC_GYRO2, LUA_EXPORT("gyry", "Gyro Y") +#endif + + MIXSRC_MAX, LUA_EXPORT("max", "MAX") + + MIXSRC_FIRST_HELI SKIP, + MIXSRC_CYC1 = MIXSRC_FIRST_HELI, LUA_EXPORT("cyc1", "Cyclic 1") + MIXSRC_CYC2, LUA_EXPORT("cyc2", "Cyclic 2") + MIXSRC_CYC3, LUA_EXPORT("cyc3", "Cyclic 3") + MIXSRC_LAST_HELI SKIP = MIXSRC_CYC3, + + MIXSRC_FIRST_TRIM SKIP, + MIXSRC_TrimRud = MIXSRC_FIRST_TRIM, LUA_EXPORT("trim-rud", "Rudder trim") + MIXSRC_TrimEle, LUA_EXPORT("trim-ele", "Elevator trim") + MIXSRC_TrimThr, LUA_EXPORT("trim-thr", "Throttle trim") + MIXSRC_TrimAil, LUA_EXPORT("trim-ail", "Aileron trim") +#if defined(PCBHORUS) + MIXSRC_TrimT5, LUA_EXPORT("trim-t5", "Aux trim T5") + MIXSRC_TrimT6, LUA_EXPORT("trim-t6", "Aux trim T6") + MIXSRC_LAST_TRIM SKIP = MIXSRC_TrimT6, +#else + MIXSRC_LAST_TRIM SKIP = MIXSRC_TrimAil, +#endif + + MIXSRC_FIRST_SWITCH SKIP, + +#if defined(HARDWARE_SWITCH_A) + MIXSRC_SA = MIXSRC_FIRST_SWITCH, LUA_EXPORT("sa", "Switch A") + MIXSRC_SB, LUA_EXPORT("sb", "Switch B") + MIXSRC_SC, LUA_EXPORT("sc", "Switch C") +#endif +#if defined(HARDWARE_SWITCH_D) + MIXSRC_SD, LUA_EXPORT("sd", "Switch D") +#elif defined(STORAGE_SWITCH_D) + MIXSRC_SD, +#endif +#if defined(HARDWARE_SWITCH_E) + MIXSRC_SE, LUA_EXPORT("se", "Switch E") +#elif defined(STORAGE_SWITCH_E) + MIXSRC_SE, +#endif +#if defined(HARDWARE_SWITCH_F) + MIXSRC_SF, LUA_EXPORT("sf", "Switch F") +#elif defined(STORAGE_SWITCH_F) + MIXSRC_SF, +#endif +#if defined(HARDWARE_SWITCH_G) + MIXSRC_SG, LUA_EXPORT("sg", "Switch G") +#elif defined(STORAGE_SWITCH_G) + MIXSRC_SG, +#endif +#if defined(HARDWARE_SWITCH_H) + MIXSRC_SH, LUA_EXPORT("sh", "Switch H") +#elif defined(STORAGE_SWITCH_H) + MIXSRC_SH, +#endif +#if defined(HARDWARE_SWITCH_I) + MIXSRC_SI, LUA_EXPORT("si", "Switch I") +#elif defined(STORAGE_SWITCH_I) + MIXSRC_SI, +#endif +#if defined(HARDWARE_SWITCH_J) + MIXSRC_SJ, LUA_EXPORT("sj", "Switch J") +#elif defined(STORAGE_SWITCH_J) + MIXSRC_SJ, +#endif +#if defined(HARDWARE_SWITCH_K) + MIXSRC_SK, LUA_EXPORT("sk", "Switch K") + MIXSRC_SL, LUA_EXPORT("sl", "Switch L") + MIXSRC_SM, LUA_EXPORT("sm", "Switch M") + MIXSRC_SN, LUA_EXPORT("sn", "Switch N") + MIXSRC_SO, LUA_EXPORT("so", "Switch O") + MIXSRC_SP, LUA_EXPORT("sp", "Switch P") + MIXSRC_SQ, LUA_EXPORT("sq", "Switch Q") + MIXSRC_SR, LUA_EXPORT("sr", "Switch R") +#endif + MIXSRC_FIRST_LOGICAL_SWITCH SKIP, + MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, LUA_EXPORT_MULTIPLE("ls", "Logical switch L%d", MAX_LOGICAL_SWITCHES) + MIXSRC_LAST_LOGICAL_SWITCH SKIP = MIXSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, + + MIXSRC_FIRST_TRAINER SKIP, LUA_EXPORT_MULTIPLE("trn", "Trainer input %d", MAX_TRAINER_CHANNELS) + MIXSRC_LAST_TRAINER SKIP = MIXSRC_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, + + MIXSRC_FIRST_CH SKIP, + MIXSRC_CH1 = MIXSRC_FIRST_CH, LUA_EXPORT_MULTIPLE("ch", "Channel CH%d", MAX_OUTPUT_CHANNELS) + MIXSRC_CH2, + MIXSRC_CH3, + MIXSRC_CH4, + MIXSRC_CH5, + MIXSRC_CH6, + MIXSRC_CH7, + MIXSRC_CH8, + MIXSRC_CH9, + MIXSRC_CH10, + MIXSRC_CH11, + MIXSRC_CH12, + MIXSRC_CH13, + MIXSRC_CH14, + MIXSRC_CH15, + MIXSRC_CH16, + MIXSRC_LAST_CH SKIP = MIXSRC_CH1+MAX_OUTPUT_CHANNELS-1, + + MIXSRC_FIRST_GVAR SKIP, + MIXSRC_GVAR1 = MIXSRC_FIRST_GVAR, LUA_EXPORT_MULTIPLE("gvar", "Global variable %d", MAX_GVARS) + MIXSRC_LAST_GVAR SKIP = MIXSRC_FIRST_GVAR+MAX_GVARS-1, + + MIXSRC_TX_VOLTAGE, LUA_EXPORT("tx-voltage", "Transmitter battery voltage [volts]") + MIXSRC_TX_TIME, LUA_EXPORT("clock", "RTC clock [minutes from midnight]") + MIXSRC_TX_GPS, + MIXSRC_FIRST_RESERVE SKIP, + MIXSRC_RESERVE3 SKIP, + MIXSRC_RESERVE4 SKIP, + MIXSRC_LAST_RESERVE SKIP, + MIXSRC_FIRST_TIMER SKIP, + MIXSRC_TIMER1 = MIXSRC_FIRST_TIMER, LUA_EXPORT("timer1", "Timer 1 value [seconds]") + MIXSRC_TIMER2, LUA_EXPORT("timer2", "Timer 2 value [seconds]") + MIXSRC_TIMER3, LUA_EXPORT("timer3", "Timer 3 value [seconds]") + MIXSRC_LAST_TIMER SKIP = MIXSRC_TIMER3, + + MIXSRC_FIRST_TELEM SKIP, LUA_EXPORT_MULTIPLE("telem", "Telemetry sensor %d", MAX_TELEMETRY_SENSORS) + MIXSRC_LAST_TELEM SKIP = MIXSRC_FIRST_TELEM+3*MAX_TELEMETRY_SENSORS-1 +}; + +#if defined(__cplusplus) +static_assert(MIXSRC_FIRST_LOGICAL_SWITCH == MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES, "Wrong switches definition in MIXSRC list"); +#endif + +#define MIXSRC_FIRST (MIXSRC_NONE + 1) +#define MIXSRC_LAST MIXSRC_LAST_CH +#define MIXSRC_LAST_SWITCH (MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES - 1) +#define INPUTSRC_FIRST MIXSRC_Rud +#define INPUTSRC_LAST MIXSRC_LAST_TELEM + +enum BacklightMode { + e_backlight_mode_off = 0, + e_backlight_mode_keys = 1, + e_backlight_mode_sticks = 2, + e_backlight_mode_all = e_backlight_mode_keys+e_backlight_mode_sticks, + e_backlight_mode_on +}; + +enum Functions { + // first the functions which need a checkbox + FUNC_OVERRIDE_CHANNEL, + FUNC_TRAINER, + FUNC_INSTANT_TRIM, + FUNC_RESET, + FUNC_SET_TIMER, + FUNC_ADJUST_GVAR, + FUNC_VOLUME, + FUNC_SET_FAILSAFE, + FUNC_RANGECHECK, + FUNC_BIND, + // then the other functions + FUNC_FIRST_WITHOUT_ENABLE, + FUNC_PLAY_SOUND = FUNC_FIRST_WITHOUT_ENABLE, + FUNC_PLAY_TRACK, + FUNC_PLAY_VALUE, + FUNC_RESERVE4, + FUNC_PLAY_SCRIPT, + FUNC_RESERVE5, + FUNC_BACKGND_MUSIC, + FUNC_BACKGND_MUSIC_PAUSE, + FUNC_VARIO, + FUNC_HAPTIC, + FUNC_LOGS, + FUNC_BACKLIGHT, + FUNC_SCREENSHOT, + FUNC_RACING_MODE, +#if defined(DEBUG) + FUNC_TEST, // should remain the last before MAX as not added in Companion +#endif + FUNC_MAX +}; + +enum TimerModes { + TMRMODE_OFF, + TMRMODE_ON, + TMRMODE_START, + TMRMODE_THR, + TMRMODE_THR_REL, + TMRMODE_THR_START, + TMRMODE_COUNT, + TMRMODE_MAX = TMRMODE_COUNT - 1 +}; + +enum CountDownModes { + COUNTDOWN_SILENT, + COUNTDOWN_BEEPS, + COUNTDOWN_VOICE, +#if defined(HAPTIC) + COUNTDOWN_HAPTIC, +#endif + COUNTDOWN_COUNT +}; + +enum ResetFunctionParam { + FUNC_RESET_TIMER1, + FUNC_RESET_TIMER2, + FUNC_RESET_TIMER3, + FUNC_RESET_FLIGHT, + FUNC_RESET_TELEMETRY, + FUNC_RESET_PARAM_FIRST_TELEM, + FUNC_RESET_PARAM_LAST_TELEM = FUNC_RESET_PARAM_FIRST_TELEM + MAX_TELEMETRY_SENSORS, + FUNC_RESET_PARAMS_COUNT, + FUNC_RESET_PARAM_LAST = FUNC_RESET_PARAMS_COUNT-1, +}; + +enum AdjustGvarFunctionParam { + FUNC_ADJUST_GVAR_CONSTANT, + FUNC_ADJUST_GVAR_SOURCE, + FUNC_ADJUST_GVAR_GVAR, + FUNC_ADJUST_GVAR_INCDEC, +}; + +enum BluetoothModes { + BLUETOOTH_OFF, + BLUETOOTH_TELEMETRY, + BLUETOOTH_TRAINER, +#if defined(PCBX9E) + BLUETOOTH_MAX=BLUETOOTH_TELEMETRY +#else + BLUETOOTH_MAX=BLUETOOTH_TRAINER +#endif +}; + +enum UartSampleModes { + UART_SAMPLE_MODE_NORMAL = 0, + UART_SAMPLE_MODE_ONEBIT, + + UART_SAMPLE_MODE_MAX = UART_SAMPLE_MODE_ONEBIT +}; + +// PXX2 constants +#define PXX2_LEN_REGISTRATION_ID 8 +#define PXX2_LEN_RX_NAME 8 +#define PXX2_MAX_RECEIVERS_PER_MODULE 3 + +// from module_constants.h +enum ModuleType { + MODULE_TYPE_NONE = 0, + MODULE_TYPE_PPM, + MODULE_TYPE_XJT_PXX1, + MODULE_TYPE_ISRM_PXX2, + MODULE_TYPE_DSM2, + MODULE_TYPE_CROSSFIRE, + MODULE_TYPE_MULTIMODULE, + MODULE_TYPE_R9M_PXX1, // R9M + MODULE_TYPE_R9M_PXX2, // R9M ACCESS + MODULE_TYPE_R9M_LITE_PXX1, //R9MLite + MODULE_TYPE_R9M_LITE_PXX2, //R9MLP + MODULE_TYPE_GHOST, // Replaces MODULE_TYPE_R9M_LITE_PRO_PXX1 which doesn't exist + MODULE_TYPE_R9M_LITE_PRO_PXX2, + MODULE_TYPE_SBUS, + MODULE_TYPE_XJT_LITE_PXX2, + MODULE_TYPE_FLYSKY, //no more protocols possible because of 4 bits value + MODULE_TYPE_COUNT, + MODULE_TYPE_MAX = MODULE_TYPE_COUNT - 1 +}; + +enum AntennaModes { + ANTENNA_MODE_INTERNAL = -2, + ANTENNA_MODE_ASK = -1, + ANTENNA_MODE_PER_MODEL = 0, + ANTENNA_MODE_EXTERNAL = 1, + ANTENNA_MODE_FIRST = ANTENNA_MODE_INTERNAL, + ANTENNA_MODE_LAST = ANTENNA_MODE_EXTERNAL +}; + +// from opentx_constants.h +enum ModuleSubtypeFlysky { + FLYSKY_SUBTYPE_AFHDS3=0, + FLYSKY_SUBTYPE_AFHDS2A +}; + +enum SwitchConfig { + SWITCH_NONE, + SWITCH_TOGGLE, + SWITCH_2POS, + SWITCH_3POS, +}; + +enum PotConfig { + POT_NONE, + POT_WITH_DETENT, + POT_MULTIPOS_SWITCH, + POT_WITHOUT_DETENT +}; + +enum SliderConfig { + SLIDER_NONE, + SLIDER_WITH_DETENT, +}; + +enum CalibrationState { + CALIB_START, + CALIB_SET_MIDPOINT, + CALIB_MOVE_STICKS, + CALIB_STORE, + CALIB_FINISHED +}; + +#endif // _DATACONSTANTS_H_ diff --git a/radio/src/storage/conversions/yaml/datastructs_220.h b/radio/src/storage/conversions/yaml/datastructs_220.h new file mode 100644 index 000000000..4b92466a9 --- /dev/null +++ b/radio/src/storage/conversions/yaml/datastructs_220.h @@ -0,0 +1,1021 @@ +/* + * 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. + */ + +// No include guards here, this file may be included many times in different namespaces +// i.e. BACKUP RAM Backup/Restore functions + +#pragma once + +#include + +// from opentx_types.h +typedef uint32_t tmr10ms_t; +typedef int32_t rotenc_t; +typedef int32_t getvalue_t; +typedef uint32_t mixsrc_t; +typedef int32_t swsrc_t; +typedef int16_t safetych_t; +typedef int16_t gvar_t; +typedef uint32_t bitfield_channels_t; +typedef uint16_t FlightModesType; +typedef uint16_t source_t; + +// from globals.h +typedef uint16_t BeepANACenter; + +#include "definitions.h" + +#if defined(PCBTARANIS) + #define N_TARANIS_FIELD(x) + #define TARANIS_FIELD(x) x; +#else + #define N_TARANIS_FIELD(x) x; + #define TARANIS_FIELD(x) +#endif + +#if defined(PCBX9E) + #define TARANIS_PCBX9E_FIELD(x) x; +#else + #define TARANIS_PCBX9E_FIELD(x) +#endif + +#if defined(PCBHORUS) + #define N_HORUS_FIELD(x) + #define HORUS_FIELD(x) x; +#else + #define N_HORUS_FIELD(x) x; + #define HORUS_FIELD(x) +#endif + +#if defined(BACKUP) + #define NOBACKUP(...) +#else + #define NOBACKUP(...) __VA_ARGS__ +#endif + +#include "storage/yaml/yaml_defs.h" + +/* + * Mixer structure + */ + +PACK(struct CurveRef { + uint8_t type; + int8_t value; +}); + +PACK(struct MixData { + int16_t weight:11 CUST(in_read_weight,in_write_weight); // GV1=-1024, -GV1=1023 + uint16_t destCh:5; + uint16_t srcRaw:10 CUST(r_mixSrcRaw,w_mixSrcRaw); // srcRaw=0 means not used + uint16_t carryTrim:1; + uint16_t mixWarn:2; // mixer warning + uint16_t mltpx:2 ENUM(MixerMultiplex); + uint16_t spare:1 SKIP; + int32_t offset:14; + int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); + uint32_t flightModes:9; //TODO ?? + CurveRef curve; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + NOBACKUP(char name[LEN_EXPOMIX_NAME]); +}); + +/* + * Expo/Input structure + */ + +PACK(struct ExpoData { + uint16_t mode:2; + uint16_t scale:14; + uint16_t srcRaw:10 ENUM(MixSources) CUST(r_mixSrcRaw,w_mixSrcRaw); + int16_t carryTrim:6; + uint32_t chn:5; + int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); + uint32_t flightModes:9; //TODO ?? + int32_t weight:8 CUST(in_read_weight,in_write_weight); + int32_t spare:1 SKIP; + NOBACKUP(char name[LEN_EXPOMIX_NAME]); + int8_t offset; + CurveRef curve; +}); + +/* + * Limit structure + */ + +PACK(struct LimitData { + int32_t min:11; + int32_t max:11; + int32_t ppmCenter:10; // TODO can be reduced to 8 bits + int16_t offset:11; + uint16_t symetrical:1; + uint16_t revert:1; + uint16_t spare:3 SKIP; + int8_t curve; + NOBACKUP(char name[LEN_CHANNEL_NAME]); +}); + +/* + * LogicalSwitch structure + */ + +PACK(struct LogicalSwitchData { + uint8_t func ENUM(LogicalSwitchesFunctions); + int32_t v1:10; + int32_t v3:10; + int32_t andsw:9; // TODO rename to xswtch + uint32_t andswtype:1; // TODO rename to xswtchType (AND / OR) + uint32_t spare:2 SKIP; // anything else needed? + int16_t v2; + uint8_t delay; + uint8_t duration; +}); + +/* + * SpecialFunction structure + */ + + +#if defined(PCBTARANIS) + #define CFN_SPARE_TYPE int32_t +#else + #define CFN_SPARE_TYPE int16_t +#endif + +PACK(struct CustomFunctionData { + int16_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); + uint16_t func:7 ENUM(Functions); + PACK(union { + NOBACKUP(PACK(struct { + char name[LEN_FUNCTION_NAME]; + }) play); + + PACK(struct { + int16_t val; + uint8_t mode; + uint8_t param; + NOBACKUP(CFN_SPARE_TYPE spare SKIP); + }) all; + + NOBACKUP(PACK(struct { + int32_t val1; + NOBACKUP(CFN_SPARE_TYPE val2 SKIP); + }) clear); + }) NAME(fp) FUNC(select_custom_fn); + uint8_t active; + + bool isEmpty() const + { + return swtch == 0; + } +}); + +/* + * FlightMode structure + */ + +PACK(struct trim_t { + int16_t value:11; + uint16_t mode:5; +}); + +PACK(struct FlightModeData { + trim_t trim[NUM_TRIMS]; + NOBACKUP(char name[LEN_FLIGHT_MODE_NAME]); + int16_t swtch:9 ENUM(SwitchSources) CUST(r_swtchSrc,w_swtchSrc); // swtch of phase[0] is not used + int16_t spare:7 SKIP; + uint8_t fadeIn; + uint8_t fadeOut; + gvar_t gvars[MAX_GVARS] FUNC(gvar_is_active); +}); + +/* + * Curve structure + */ + +PACK(struct CurveHeader { + uint8_t type:1; + uint8_t smooth:1; + int8_t points:6; // describes number of points - 5 + NOBACKUP(char name[LEN_CURVE_NAME]); +}); + +/* + * GVar structure + */ + +PACK(struct GVarData { + NOBACKUP(char name[LEN_GVAR_NAME]); + uint32_t min:12; + uint32_t max:12; + uint32_t popup:1; + uint32_t prec:1; + uint32_t unit:2; + uint32_t spare:4 SKIP; +}); + +/* + * Timer structure + */ + +PACK(struct TimerData { + uint32_t start:22; + int32_t swtch:10 CUST(r_swtchSrc,w_swtchSrc); + int32_t value:22; + uint32_t mode:3 ENUM(TimerModes); + uint32_t countdownBeep:2; + uint32_t minuteBeep:1; + uint32_t persistent:2; + int32_t countdownStart:2; + NOBACKUP(char name[LEN_TIMER_NAME]); +}); + +/* + * Swash Ring structure + */ + +PACK(struct SwashRingData { + uint8_t type; + uint8_t value; + uint8_t collectiveSource; + uint8_t aileronSource; + uint8_t elevatorSource; + int8_t collectiveWeight; + int8_t aileronWeight; + int8_t elevatorWeight; +}); + +#if MAX_SCRIPTS > 0 +union ScriptDataInput { + int16_t value; + source_t source; +} FUNC(select_script_input); + +PACK(struct ScriptData { + char file[LEN_SCRIPT_FILENAME]; + char name[LEN_SCRIPT_NAME]; + ScriptDataInput inputs[MAX_SCRIPT_INPUTS]; +}); +#endif + +/* + * Frsky Telemetry structure + */ +PACK(struct RssiAlarmData { + int8_t disabled:1; +#if defined (PCBNV14) + uint8_t flysky_telemetry:1; // if set for FlySky receivers use native RSSI values instead of rescaled ones +#else + int8_t spare:1 SKIP; +#endif + int8_t warning:6; + int8_t spare2:2 SKIP; + int8_t critical:6; + inline int8_t getWarningRssi() {return 45 + warning;} + inline int8_t getCriticalRssi() {return 42 + critical;} + }); + +typedef int16_t ls_telemetry_value_t; + +#if !defined(COLORLCD) +PACK(struct FrSkyBarData { + source_t source; + ls_telemetry_value_t barMin; // minimum for bar display + ls_telemetry_value_t barMax; // ditto for max display (would usually = ratio) +}); + +PACK(struct FrSkyLineData { + source_t sources[NUM_LINE_ITEMS]; +}); + +#if defined(PCBTARANIS) +PACK(struct TelemetryScriptData { + char file[LEN_SCRIPT_FILENAME]; + int16_t inputs[MAX_TELEM_SCRIPT_INPUTS]; +}); +#endif + +union TelemetryScreenData { + FrSkyBarData bars[4]; + FrSkyLineData lines[4]; +#if defined(PCBTARANIS) + TelemetryScriptData script; +#endif +}; +#endif + +PACK(struct VarioData { + uint8_t source:7; + uint8_t centerSilent:1; + int8_t centerMax; + int8_t centerMin; + int8_t min; + int8_t max; +}); + +/* + * Telemetry Sensor structure + */ + +#define TELEMETRY_ENDPOINT_NONE 0xFF +#define TELEMETRY_ENDPOINT_SPORT 0x07 + +PACK(struct TelemetrySensor { + union { + uint16_t id; // data identifier, for FrSky we can reuse existing ones. Source unit is derived from type. + NOBACKUP(uint16_t persistentValue); + } NAME(id1) FUNC(select_id1); + union { + NOBACKUP(PACK(struct { + uint8_t physID:5; + uint8_t rxIndex:3; // 1 bit for module index, 2 bits for receiver index + }) frskyInstance); + uint8_t instance; + NOBACKUP(uint8_t formula); + } NAME(id2) FUNC(select_id2); + char label[TELEM_LABEL_LEN]; // user defined label + uint8_t subId; + uint8_t type:1; // 0=custom / 1=calculated // user can choose what unit to display each value in + uint8_t spare1:1 SKIP; + uint8_t unit:6; + uint8_t prec:2; + uint8_t autoOffset:1; + uint8_t filter:1; + uint8_t logs:1; + uint8_t persistent:1; + uint8_t onlyPositive:1; + uint8_t spare2:1 SKIP; + union { + NOBACKUP(PACK(struct { + uint16_t ratio; + int16_t offset; + }) custom); + NOBACKUP(PACK(struct { + uint8_t source; + uint8_t index; + uint16_t spare SKIP; + }) cell); + NOBACKUP(PACK(struct { + int8_t sources[4]; + }) calc); + NOBACKUP(PACK(struct { + uint8_t source; + uint8_t spare[3] SKIP; + }) consumption); + NOBACKUP(PACK(struct { + uint8_t gps; + uint8_t alt; + uint16_t spare SKIP; + }) dist); + uint32_t param; + } NAME(cfg) FUNC(select_sensor_cfg); + NOBACKUP( + void init(const char *label, uint8_t unit=UNIT_RAW, uint8_t prec=0); + void init(uint16_t id); + bool isAvailable() const; + int32_t getValue(int32_t value, uint8_t unit, uint8_t prec) const; + bool isConfigurable() const; + bool isPrecConfigurable() const; + int32_t getPrecMultiplier() const; + int32_t getPrecDivisor() const; + bool isSameInstance(TelemetryProtocol protocol, uint8_t instance); + ); +}); + +/* + * Trainer module structure + */ + +PACK(struct TrainerModuleData { + uint8_t mode CUST(r_trainerMode,w_trainerMode); + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + int8_t frameLength; + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t spare2:1 SKIP; +}); + +/* + * Module structure + */ + +// Only used in case switch and if statements as "virtual" protocol +#define MM_RF_CUSTOM_SELECTED 0xff +#define MULTI_MAX_PROTOCOLS 127 // rfProtocol:4 + rfProtocolExtra:3 +PACK(struct ModuleData { + uint8_t type:4 ENUM(ModuleType); + // TODO some refactoring is needed, rfProtocol is only used by DSM2 and MULTI, it could be merged with subType + int8_t rfProtocol:4; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + + union { + uint8_t raw[PXX2_MAX_RECEIVERS_PER_MODULE * PXX2_LEN_RX_NAME + 1]; + NOBACKUP(struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm); + NOBACKUP(struct { + uint8_t rfProtocolExtra:3; + uint8_t disableTelemetry:1; + uint8_t disableMapping:1; + uint8_t customProto:1; + uint8_t autoBindMode:1; + uint8_t lowPowerMode:1; + int8_t optionValue; + uint8_t receiverTelemetryOff:1; + uint8_t receiverHigherChannels:1; + uint8_t spare:6 SKIP; + } multi); + NOBACKUP(struct { + uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W + uint8_t spare1:2 SKIP; + uint8_t receiverTelemetryOff:1; // false = receiver telem enabled + uint8_t receiverHigherChannels:1; // false = pwm out 1-8, true 9-16 + int8_t antennaMode:2; + uint8_t spare2 SKIP; + } pxx); + NOBACKUP(struct { + uint8_t spare1:6 SKIP; + uint8_t noninverted:1; + uint8_t spare2:1 SKIP; + int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms) + } sbus); + NOBACKUP(struct { + uint8_t receivers:7; // 4 bits spare + uint8_t racingMode:1; + char receiverName[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; + } pxx2); + NOBACKUP(struct { + uint8_t rx_id[4]; + uint8_t mode:3; + uint8_t rfPower:1; + uint8_t reserved:4; + uint8_t rx_freq[2]; + + void setDefault() { + rx_id[0] = rx_id[1] = rx_id[2] = rx_id[3] = 0; + mode = 0; + rfPower = 0; + rx_freq[0] = 50; + rx_freq[1] = 0; + } + } flysky); + NOBACKUP(PACK(struct { + uint8_t bindPower:3; + uint8_t runPower:3; + uint8_t emi:1; + uint8_t telemetry:1; + uint16_t failsafeTimeout; + uint8_t rx_freq[2]; + uint8_t mode:2; + uint8_t reserved:6; + uint16_t rxFreq() + { + return (uint16_t)rx_freq[0] | (((uint16_t)rx_freq[1]) << 8); + } + + void setRxFreq(uint16_t value) + { + rx_freq[0] = value & 0xFF; + rx_freq[1] = value >> 8; + } + } afhds3)); + } NAME(mod) FUNC(select_mod_type); + + // Helper functions to set both of the rfProto protocol at the same time + NOBACKUP(inline uint8_t getMultiProtocol() const + { + return ((uint8_t) (rfProtocol & 0x0F)) + (multi.rfProtocolExtra << 4); + }) + + NOBACKUP(inline void setMultiProtocol(uint8_t proto) + { + rfProtocol = (uint8_t) (proto & 0x0F); + multi.rfProtocolExtra = (proto & 0x70) >> 4; + }) + + NOBACKUP(inline uint8_t getChannelsCount() const + { + return channelsCount + 8; + }) +}); + +/* + * Model structure + */ + +#if LEN_BITMAP_NAME > 0 +#define MODEL_HEADER_BITMAP_FIELD NOBACKUP(char bitmap[LEN_BITMAP_NAME]); +#else +#define MODEL_HEADER_BITMAP_FIELD +#endif + + +PACK(struct ModelHeader { + char name[LEN_MODEL_NAME]; // must be first for eeLoadModelName + uint8_t modelId[NUM_MODULES]; + MODEL_HEADER_BITMAP_FIELD +}); + +#if defined(COLORLCD) +typedef uint32_t swconfig_t; +typedef uint32_t swarnstate_t; +#elif defined(PCBX9E) +typedef uint64_t swconfig_t; +typedef uint64_t swarnstate_t; +typedef uint32_t swarnenable_t; +#elif defined(PCBX9D) || defined(PCBX9DP) +typedef uint32_t swconfig_t; +typedef uint32_t swarnstate_t; +typedef uint16_t swarnenable_t; // TODO remove it in 2.4 +#elif defined(PCBTARANIS) +typedef uint16_t swconfig_t; +typedef uint16_t swarnstate_t; +typedef uint8_t swarnenable_t; // TODO remove it in 2.4 +#else +typedef uint8_t swarnstate_t; +typedef uint8_t swarnenable_t; +#endif + +#if defined(COLORLCD) + #define SWITCHES_WARNING_DATA \ + NOBACKUP(swarnstate_t switchWarningState CUST(r_swtchWarn,w_swtchWarn)); +#else + #define SWITCHES_WARNING_DATA \ + swarnstate_t switchWarningState CUST(r_swtchWarn,w_swtchWarn); \ + swarnenable_t switchWarningEnable; // TODO remove it in 2.4 +#endif + +#if defined(COLORLCD) && defined(BACKUP) +#define CUSTOM_SCREENS_DATA +#elif defined(COLORLCD) +#include "layout_220.h" +PACK(struct CustomScreenData { + char LayoutId[LAYOUT_ID_LEN]; + LayoutPersistentData layoutData; +}); +#define CUSTOM_SCREENS_DATA \ + NOBACKUP(CustomScreenData screenData[MAX_CUSTOM_SCREENS]); \ + NOBACKUP(TopBarPersistentData topbarData); \ + NOBACKUP(uint8_t view); +#else +#define CUSTOM_SCREENS_DATA \ + uint8_t screensType; /* 2bits per screen (None/Gauges/Numbers/Script) */ \ + TelemetryScreenData screens[MAX_TELEMETRY_SCREENS]; \ + uint8_t view; +#endif + +#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) + #define TOPBAR_DATA \ + NOBACKUP(uint8_t voltsSource); \ + NOBACKUP(uint8_t altitudeSource); +#else + #define TOPBAR_DATA +#endif + +#if defined(PCBHORUS) || defined(PCBTARANIS) || defined(PCBNV14) + #define SCRIPT_DATA \ + NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); +#else + #define SCRIPT_DATA +#endif + +PACK(struct PartialModel { + ModelHeader header; + TimerData timers[MAX_TIMERS]; +}); + +PACK(struct ModelData { + ModelHeader header; + TimerData timers[MAX_TIMERS]; + uint8_t telemetryProtocol:3; + uint8_t thrTrim:1; // Enable Throttle Trim + uint8_t noGlobalFunctions:1; + uint8_t displayTrims:2; + uint8_t ignoreSensorIds:1; + int8_t trimInc:3; // Trim Increments + uint8_t disableThrottleWarning:1; + uint8_t displayChecklist:1; + uint8_t extendedLimits:1; + uint8_t extendedTrims:1; + uint8_t throttleReversed:1; + BeepANACenter beepANACenter; + MixData mixData[MAX_MIXERS] NO_IDX; + LimitData limitData[MAX_OUTPUT_CHANNELS]; + ExpoData expoData[MAX_EXPOS] NO_IDX; + + CurveHeader curves[MAX_CURVES]; + int8_t points[MAX_CURVE_POINTS]; + + LogicalSwitchData logicalSw[MAX_LOGICAL_SWITCHES]; + CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS] FUNC(cfn_is_active); + SwashRingData swashR; + FlightModeData flightModeData[MAX_FLIGHT_MODES] FUNC(fmd_is_active); + + NOBACKUP(uint8_t thrTraceSrc); + + SWITCHES_WARNING_DATA + + GVarData gvars[MAX_GVARS]; + + NOBACKUP(VarioData varioData); + NOBACKUP(uint8_t rssiSource); + + TOPBAR_DATA + + NOBACKUP(RssiAlarmData rssiAlarms); + + uint8_t spare1:3 SKIP; + uint8_t thrTrimSw:3; + uint8_t potsWarnMode:2; + + ModuleData moduleData[NUM_MODULES]; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + TrainerModuleData trainerData; + + SCRIPT_DATA + + NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); + NOBACKUP(uint8_t potsWarnEnabled); + NOBACKUP(int8_t potsWarnPosition[STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS]); + + NOBACKUP(TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS];) + + TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) + + CUSTOM_SCREENS_DATA + + char modelRegistrationID[PXX2_LEN_REGISTRATION_ID]; + + bool isTrainerTraineeEnable() const + { +#if defined(PCBNV14) + return trainerData.mode >= TRAINER_MODE_MASTER_TRAINER_JACK; +#else + return true; +#endif + } + + uint8_t getThrottleStickTrimSource() const + { + // The order here is TERA, so that 0 (default) means Throttle + switch (thrTrimSw) { + case 0: + return MIXSRC_TrimThr; + case 2: + return MIXSRC_TrimRud; + default: + return thrTrimSw + MIXSRC_FIRST_TRIM; + } + } + + void setThrottleStickTrimSource(int16_t src) + { + // The order here is TERA, so that 0 (default) means Throttle + switch (src) { + case MIXSRC_TrimThr: + thrTrimSw = 0; + break; + case MIXSRC_TrimRud: + thrTrimSw = 2; + break; + default: + thrTrimSw = src - MIXSRC_FIRST_TRIM; + break; + } + } +}); + +/* + * Radio structure + */ + +#if XPOTS_MULTIPOS_COUNT > 0 +PACK(struct StepsCalibData { + uint8_t count; + uint8_t steps[XPOTS_MULTIPOS_COUNT-1]; +}); +#endif + +PACK(struct CalibData { + int16_t mid; + int16_t spanNeg; + int16_t spanPos; +}); + +PACK(struct TrainerMix { + uint8_t srcChn:6; // 0-7 = ch1-8 + uint8_t mode:2 ENUM(TrainerMultiplex); // off,add-mode,subst-mode + int8_t studWeight; +}); + +PACK(struct TrainerData { + int16_t calib[4]; + NOBACKUP(TrainerMix mix[4]); +}); + +#if defined(COLORLCD) + #define SPLASH_MODE uint8_t splashSpares:3 SKIP +#else + #define SPLASH_MODE int8_t splashMode:3 +#endif + +#if defined(PCBXLITES) + #define GYRO_FIELDS \ + int8_t gyroMax; \ + int8_t gyroOffset; +#else + #define GYRO_FIELDS +#endif + +#if defined(PCBHORUS) || defined(PCBNV14) + #define EXTRA_GENERAL_FIELDS \ + NOBACKUP(uint8_t auxSerialMode:4 ENUM(UartModes)); \ + NOBACKUP(uint8_t aux2SerialMode:4 ENUM(UartModes)); \ + CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ + swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ + uint16_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */ \ + uint8_t slidersConfig ARRAY(1,struct_sliderConfig,nullptr); /* 1 bit per slider */ \ + NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP); \ + NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP); \ + NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \ + NOBACKUP(uint8_t spare5:1 SKIP); \ + NOBACKUP(uint8_t blOffBright:7); \ + NOBACKUP(char bluetoothName[LEN_BLUETOOTH_NAME]); +#elif defined(PCBTARANIS) + #if defined(STORAGE_BLUETOOTH) + #define BLUETOOTH_FIELDS \ + uint8_t spare5 SKIP; \ + char bluetoothName[LEN_BLUETOOTH_NAME]; + #else + #define BLUETOOTH_FIELDS + #endif + #define EXTRA_GENERAL_FIELDS \ + uint8_t auxSerialMode:4 ENUM(UartModes); \ + uint8_t slidersConfig:4 ARRAY(1,struct_sliderConfig,nullptr); \ + uint8_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */\ + uint8_t backlightColor; \ + swarnstate_t switchUnlockStates; \ + CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ + swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ + char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP; \ + char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP; \ + BLUETOOTH_FIELDS +#else + #define EXTRA_GENERAL_FIELDS +#endif + +#if defined(COLORLCD) && !defined(BACKUP) + #define MAX_THEME_OPTIONS 5 + struct OpenTxTheme__PersistentData { + ZoneOptionValueTyped options[MAX_THEME_OPTIONS]; + }; + #define THEME_NAME_LEN 8 + #define THEME_DATA \ + NOBACKUP(char themeName[THEME_NAME_LEN]); \ + NOBACKUP(OpenTxTheme__PersistentData themeData); +#else + #define THEME_DATA +#endif + +#if defined(BUZZER) + #define BUZZER_FIELD int8_t buzzerMode:2 // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) +#else + #define BUZZER_FIELD int8_t spare4:2 SKIP +#endif + +PACK(struct RadioData { + + // Real attributes + NOBACKUP(uint8_t version); + NOBACKUP(uint16_t variant SKIP); + CalibData calib[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS]; + NOBACKUP(uint16_t chkSum SKIP); + N_HORUS_FIELD(int8_t currModel); + N_HORUS_FIELD(uint8_t contrast); + NOBACKUP(uint8_t vBatWarn); + NOBACKUP(int8_t txVoltageCalibration); + uint8_t backlightMode:3 ENUM(BacklightMode); + int8_t antennaMode:2 ENUM(AntennaModes); + uint8_t disableRtcWarning:1; + uint8_t keysBacklight:1; + int8_t spare1:1 SKIP; + NOBACKUP(TrainerData trainer); + NOBACKUP(uint8_t view); // index of view in main screen + NOBACKUP(BUZZER_FIELD); /* 2bits */ + NOBACKUP(uint8_t fai:1); + NOBACKUP(int8_t beepMode:2 ENUM(BeeperMode) CUST(r_beeperMode,w_beeperMode)); + NOBACKUP(uint8_t alarmsFlash:1); + NOBACKUP(uint8_t disableMemoryWarning:1); + NOBACKUP(uint8_t disableAlarmWarning:1); + uint8_t stickMode:2; + int8_t timezone:5; + uint8_t adjustRTC:1; + NOBACKUP(uint8_t inactivityTimer); + uint8_t telemetryBaudrate:3; + SPLASH_MODE; /* 3bits */ + int8_t hapticMode:2 CUST(r_beeperMode,w_beeperMode); + int8_t switchesDelay; + NOBACKUP(uint8_t lightAutoOff); + NOBACKUP(uint8_t templateSetup); // RETA order for receiver channels + NOBACKUP(int8_t PPM_Multiplier); + NOBACKUP(int8_t hapticLength CUST(r_5pos,w_5pos)); + N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t spare2 SKIP)); + N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse)); + NOBACKUP(int8_t beepLength:3 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t hapticStrength:3 CUST(r_5pos,w_5pos)); + NOBACKUP(uint8_t gpsFormat:1); + NOBACKUP(uint8_t unexpectedShutdown:1); + NOBACKUP(uint8_t speakerPitch CUST(r_spPitch,w_spPitch)); + NOBACKUP(int8_t speakerVolume CUST(r_vol,w_vol)); + NOBACKUP(int8_t vBatMin CUST(r_vbat_min,w_vbat_min)); + NOBACKUP(int8_t vBatMax CUST(r_vbat_max,w_vbat_max)); + + NOBACKUP(uint8_t backlightBright); + NOBACKUP(uint32_t globalTimer); + NOBACKUP(uint8_t bluetoothBaudrate:4); + NOBACKUP(uint8_t bluetoothMode:4 ENUM(BluetoothModes)); + NOBACKUP(uint8_t countryCode:2); + NOBACKUP(int8_t pwrOnSpeed:3); + NOBACKUP(int8_t pwrOffSpeed:3); + NOBACKUP(uint8_t imperial:1); + NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */ + NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); + NOBACKUP(uint8_t USBMode:2); + NOBACKUP(uint8_t jackMode:2); + NOBACKUP(uint8_t sportUpdatePower:1 SKIP); + NOBACKUP(char ttsLanguage[2]); + NOBACKUP(int8_t beepVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t wavVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t varioVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t backgroundVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t varioPitch CUST(r_vPitch,w_vPitch)); + NOBACKUP(int8_t varioRange CUST(r_vPitch,w_vPitch)); + NOBACKUP(int8_t varioRepeat); + CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS] FUNC(cfn_is_active); + + EXTRA_GENERAL_FIELDS + + THEME_DATA + + char ownerRegistrationID[PXX2_LEN_REGISTRATION_ID]; + + GYRO_FIELDS + + NOBACKUP(int8_t uartSampleMode:2); // See UartSampleModes +}); + +#undef SWITCHES_WARNING_DATA +#undef MODEL_GVARS_DATA +#undef TELEMETRY_DATA +#undef SCRIPTS_DATA +#undef CUSTOM_SCREENS_DATA +#undef SPLASH_MODE +#undef EXTRA_GENERAL_FIELDS +#undef THEME_DATA +#undef NOBACKUP + + +#if !defined(BACKUP) +/* Compile time check to test structure size has not changed * + Changing the size of one of the eeprom structs may cause wrong data to + be loaded. Error out if the struct size changes. + This function tries not avoid checking or using the defines + other than the CPU arch and board type so changes in other + defines also trigger the struct size changes */ + +#include "chksize.h" + +#define CHKSIZE(x, y) check_size() +#define CHKTYPE(x, y) check_size() + +static inline void check_struct() +{ + + CHKSIZE(CurveRef, 2); + + /* Difference between Taranis/Horus is LEN_EXPOMIX_NAME */ + /* LEN_FUNCTION_NAME is the difference in CustomFunctionData */ + + CHKSIZE(VarioData, 5); + +#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) + CHKSIZE(MixData, 20); + CHKSIZE(ExpoData, 17); + CHKSIZE(LimitData, 11); + CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(CustomFunctionData, 11); + CHKSIZE(FlightModeData, 28 + 2*NUM_TRIMS); + CHKSIZE(TimerData, 11); + CHKSIZE(SwashRingData, 8); + CHKSIZE(FrSkyBarData, 6); + CHKSIZE(FrSkyLineData, 4); + CHKTYPE(union TelemetryScreenData, 24); + CHKSIZE(ModelHeader, 12); + CHKSIZE(CurveHeader, 4); +#elif defined(PCBTARANIS) + CHKSIZE(MixData, 20); + CHKSIZE(ExpoData, 17); + CHKSIZE(LimitData, 13); + CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(CustomFunctionData, 11); + CHKSIZE(FlightModeData, 40); + CHKSIZE(TimerData, 16); + CHKSIZE(SwashRingData, 8); + CHKSIZE(FrSkyBarData, 6); + CHKSIZE(FrSkyLineData, 6); + CHKTYPE(union TelemetryScreenData, 24); + CHKSIZE(ModelHeader, 24); + CHKSIZE(CurveHeader, 4); +#elif defined(PCBHORUS) + CHKSIZE(MixData, 20); + CHKSIZE(ExpoData, 17); + CHKSIZE(LimitData, 13); + CHKSIZE(CustomFunctionData, 9); + CHKSIZE(FlightModeData, 44); + CHKSIZE(TimerData, 16); + CHKSIZE(SwashRingData, 8); + CHKSIZE(ModelHeader, 31); + CHKSIZE(CurveHeader, 4); + CHKSIZE(CustomScreenData, 850); + CHKTYPE(TopBarPersistentData, 300); +#elif defined(PCBNV14) + // TODO +#else + // Common for all variants + CHKSIZE(LimitData, 5); + CHKSIZE(SwashRingData, 3); + CHKSIZE(FrSkyBarData, 3); + CHKSIZE(FrSkyLineData, 2); + CHKSIZE(ModelHeader, 11); + CHKTYPE(CurveHeader, 1); + + CHKSIZE(MixData, 9); + CHKSIZE(ExpoData, 4); + + CHKSIZE(CustomFunctionData, 3); + CHKSIZE(TimerData, 3); + + CHKSIZE(FlightModeData, 30); + CHKSIZE(RadioData, 85); + +#endif /* board specific ifdefs*/ + + CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(TelemetrySensor, 14); + CHKSIZE(ModuleData, 29); + CHKSIZE(GVarData, 7); + CHKSIZE(RssiAlarmData, 2); + CHKSIZE(TrainerData, 16); + +#if defined(PCBXLITES) + CHKSIZE(RadioData, 861); + CHKSIZE(ModelData, 6157); +#elif defined(PCBXLITE) + CHKSIZE(RadioData, 859); + CHKSIZE(ModelData, 6157); +#elif defined(PCBX7) + CHKSIZE(RadioData, 865); + CHKSIZE(ModelData, 6157); +#elif defined(PCBX9E) + CHKSIZE(RadioData, 961); + CHKSIZE(ModelData, 6614); +#elif defined(PCBX9D) || defined(PCBX9DP) + CHKSIZE(RadioData, 899); + CHKSIZE(ModelData, 6604); +#elif defined(PCBHORUS) + CHKSIZE(RadioData, 902); + CHKSIZE(ModelData, 11020); +#endif + +#undef CHKSIZE +} +#endif /* BACKUP */ diff --git a/radio/src/storage/conversions/yaml/layout_220.h b/radio/src/storage/conversions/yaml/layout_220.h new file mode 100644 index 000000000..6d2dff76d --- /dev/null +++ b/radio/src/storage/conversions/yaml/layout_220.h @@ -0,0 +1,57 @@ +/* + * 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 + +#define MAX_LAYOUT_ZONES 10 +#define MAX_LAYOUT_OPTIONS 10 + +#if defined(PCBNV14) +#define MAX_TOPBAR_ZONES 2 +#else +#define MAX_TOPBAR_ZONES 4 +#endif + +#define WIDGET_NAME_LEN 10 +#define MAX_WIDGET_OPTIONS 5 +#define MAX_TOPBAR_OPTIONS 1 +#define LAYOUT_ID_LEN 10 + +#include "zone_220.h" + +struct WidgetPersistentData { + ZoneOptionValueTyped options[MAX_WIDGET_OPTIONS]; +}; + +struct ZonePersistentData { + char widgetName[WIDGET_NAME_LEN]; + WidgetPersistentData widgetData; +}; + +struct LayoutPersistentData { + ZonePersistentData zones[MAX_LAYOUT_ZONES]; + ZoneOptionValueTyped options[MAX_LAYOUT_OPTIONS]; +}; + +struct TopBarPersistentData { + ZonePersistentData zones[MAX_TOPBAR_ZONES]; + ZoneOptionValueTyped options[MAX_TOPBAR_OPTIONS]; +}; diff --git a/radio/src/storage/conversions/yaml/myeeprom_220.h b/radio/src/storage/conversions/yaml/myeeprom_220.h new file mode 100644 index 000000000..eb185d963 --- /dev/null +++ b/radio/src/storage/conversions/yaml/myeeprom_220.h @@ -0,0 +1,282 @@ +/* + * 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. + */ + +#ifndef _MYEEPROM_H_ +#define _MYEEPROM_H_ + +// #include "datastructs.h" +// #include "libopenui/src/bitfield.h" + +#if defined(SDCARD_YAML) + #define EEPROM_VER 221 +#else + #define EEPROM_VER 220 +#endif +#define FIRST_CONV_EEPROM_VER 219 + +#define GET_MODULE_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol +#define GET_TRAINER_PPM_POLARITY() g_model.trainerData.pulsePol +#define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted +#define GET_MODULE_PPM_DELAY(idx) (g_model.moduleData[idx].ppm.delay * 50 + 300) +#define GET_TRAINER_PPM_DELAY() (g_model.trainerData.delay * 50 + 300) + +#if defined(HARDWARE_TRAINER_EXTERNAL_MODULE) + #define IS_TRAINER_EXTERNAL_MODULE() (g_model.trainerData.mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || g_model.trainerData.mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) +#else + #define IS_TRAINER_EXTERNAL_MODULE() false +#endif + +#define IS_TRAINER_AUX_SERIAL() (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER) + +#define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) + +#if defined(GVARS) + #define IS_ADJUST_GV_FUNC(func) ((func) == FUNC_ADJUST_GVAR) +#else + #define IS_ADJUST_GV_FUNC(func) (0) +#endif + +#if defined(HAPTIC) + #define IS_HAPTIC_FUNC(func) ((func) == FUNC_HAPTIC) +#else + #define IS_HAPTIC_FUNC(func) (0) +#endif + +#define HAS_ENABLE_PARAM(func) ((func) < FUNC_FIRST_WITHOUT_ENABLE || (func == FUNC_BACKLIGHT)) +#define HAS_REPEAT_PARAM(func) (IS_PLAY_FUNC(func) || IS_HAPTIC_FUNC(func)) + +#define CFN_EMPTY(p) (!(p)->swtch) +#define CFN_SWITCH(p) ((p)->swtch) +#define CFN_FUNC(p) ((p)->func) +#define CFN_ACTIVE(p) ((p)->active) +#define CFN_CH_INDEX(p) ((p)->all.param) +#define CFN_GVAR_INDEX(p) ((p)->all.param) +#define CFN_TIMER_INDEX(p) ((p)->all.param) +#define CFN_PLAY_REPEAT(p) ((p)->active) +#define CFN_PLAY_REPEAT_MUL 1 +#define CFN_PLAY_REPEAT_NOSTART 0xFF +#define CFN_GVAR_MODE(p) ((p)->all.mode) +#define CFN_PARAM(p) ((p)->all.val) +#define CFN_RESET(p) ((p)->active=0, (p)->clear.val1=0, (p)->clear.val2=0) +#define CFN_GVAR_CST_MIN -GVAR_MAX +#define CFN_GVAR_CST_MAX GVAR_MAX +#define MODEL_GVAR_MIN(idx) (CFN_GVAR_CST_MIN + g_model.gvars[idx].min) +#define MODEL_GVAR_MAX(idx) (CFN_GVAR_CST_MAX - g_model.gvars[idx].max) + +#if defined(PCBFRSKY) || defined(PCBNV14) + #define SWITCH_CONFIG(x) (bfGet(g_eeGeneral.switchConfig, 2*(x), 2)) + #define SWITCH_EXISTS(x) (SWITCH_CONFIG(x) != SWITCH_NONE) + #define IS_CONFIG_3POS(x) (SWITCH_CONFIG(x) == SWITCH_3POS) + #define IS_CONFIG_TOGGLE(x) (SWITCH_CONFIG(x) == SWITCH_TOGGLE) + #define SWITCH_WARNING_ALLOWED(x) (SWITCH_EXISTS(x) && !IS_CONFIG_TOGGLE(x)) +#else + #define IS_CONFIG_3POS(x) IS_3POS(x) + #define IS_CONFIG_TOGGLE(x) IS_TOGGLE(x) + #define switchInfo(x) ((x) >= 3 ? (x)-2 : 0) + #define SWITCH_EXISTS(x) true +#endif + +#define ALTERNATE_VIEW 0x10 + +// #if defined(COLORLCD) +// #include "layout.h" +// #include "theme.h" +// #include "topbar.h" +// #endif + +#define SWITCHES_DELAY() uint8_t(15+g_eeGeneral.switchesDelay) +#define SWITCHES_DELAY_NONE (-15) +#define HAPTIC_STRENGTH() (3+g_eeGeneral.hapticStrength) + +enum CurveRefType { + CURVE_REF_DIFF, + CURVE_REF_EXPO, + CURVE_REF_FUNC, + CURVE_REF_CUSTOM +}; + +#define EXPO_VALID(ed) ((ed)->mode) +#define EXPO_MODE_ENABLE(ed, v) (((v)<0 && ((ed)->mode&1)) || ((v)>=0 && ((ed)->mode&2))) + +#define limit_min_max_t int16_t +#define LIMIT_EXT_PERCENT 150 +#define LIMIT_STD_PERCENT 100 +#define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) +#define LIMIT_STD_MAX (LIMIT_STD_PERCENT*10) +#define PPM_CENTER_MAX 500 +#define LIMIT_MAX(lim) \ + (GV_IS_GV_VALUE(lim->max, -GV_RANGELARGE, GV_RANGELARGE) \ + ? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, +LIMIT_EXT_MAX, \ + mixerCurrentFlightMode) \ + : lim->max + LIMIT_STD_MAX) +#define LIMIT_MIN(lim) \ + (GV_IS_GV_VALUE(lim->min, -GV_RANGELARGE, GV_RANGELARGE) \ + ? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, +LIMIT_EXT_MAX, \ + mixerCurrentFlightMode) \ + : lim->min - LIMIT_STD_MAX) +#define LIMIT_OFS(lim) \ + (GV_IS_GV_VALUE(lim->offset, -LIMIT_STD_MAX, LIMIT_STD_MAX) \ + ? GET_GVAR_PREC1(lim->offset, -LIMIT_STD_MAX, +LIMIT_STD_MAX, \ + mixerCurrentFlightMode) \ + : lim->offset) +#define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim)) +#define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) +#define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) + +#define LIMITS_MIN_MAX_OFFSET LIMIT_STD_MAX + +#define TRIM_OFF (1) +#define TRIM_ON (0) +#define TRIM_RUD (-1) +#define TRIM_ELE (-2) +#define TRIM_THR (-3) +#define TRIM_AIL (-4) +#if defined(PCBHORUS) + #define TRIM_T5 (-5) + #define TRIM_T6 (-6) + #define TRIM_LAST TRIM_T6 +#else + #define TRIM_LAST TRIM_AIL +#endif + +enum MixerMultiplex { + MLTPX_ADD = 0, + MLTPX_MUL = 1, + MLTPX_REPL = 2, +}; + +enum TrainerMultiplex { + TRAINER_OFF = 0, + TRAINER_ADD = 1, + TRAINER_REPL = 2, +}; + +#define GV1_SMALL 128 +#define GV1_LARGE 1024 +#define GV_RANGE_OFFSET 500 +#define DELAY_MAX 250 /* 25 seconds */ +#define SLOW_MAX 250 /* 25 seconds */ + +#define MD_WEIGHT(md) (md->weight) +#define MD_WEIGHT_TO_UNION(md, var) var.word = md->weight +#define MD_UNION_TO_WEIGHT(var, md) md->weight = var.word + +#define MD_OFFSET(md) (md->offset) +#define MD_OFFSET_TO_UNION(md, var) var.word = md->offset +#define MD_UNION_TO_OFFSET(var, md) md->offset = var.word + +enum LogicalSwitchesFunctions { + LS_FUNC_NONE, + LS_FUNC_VEQUAL, // v==offset + LS_FUNC_VALMOSTEQUAL, // v~=offset + LS_FUNC_VPOS, // v>offset + LS_FUNC_VNEG, // voffset + LS_FUNC_ANEG, // |v| +#include +#include + +#include + +namespace yaml_conv_220 { + +#include "yaml_datastructs_funcs.cpp" + +#if defined(PCBX12S) + #include "yaml_datastructs_x12s.cpp" +#elif defined(PCBX10) + #include "yaml_datastructs_x10.cpp" +#elif defined(PCBNV14) + #include "yaml_datastructs_nv14.cpp" +#elif defined(PCBX7) + #if defined(RADIO_T12) + #include "yaml_datastructs_t12.cpp" + #elif defined(RADIO_TLITE) + #include "yaml_datastructs_tlite.cpp" + #elif defined(RADIO_TX12) + #include "yaml_datastructs_tx12.cpp" + #elif defined(RADIO_T8) + #include "yaml_datastructs_t8.cpp" + #else + #include "yaml_datastructs_x7.cpp" + #endif +#elif defined(PCBX9LITE) + #include "yaml_datastructs_x9lite.cpp" +#elif defined(PCBX9LITES) + #include "yaml_datastructs_x9lites.cpp" +#elif defined(PCBXLITE) + #include "yaml_datastructs_xlite.cpp" +#elif defined(PCBXLITES) + #include "yaml_datastructs_xlites.cpp" +#elif defined(PCBX9E) + #include "yaml_datastructs_x9e.cpp" +#elif defined(PCBX9D) || defined(PCBX9DP) + #include "yaml_datastructs_x9d.cpp" +#else +#error "Board not supported by YAML storage" +#endif + +static_assert(MAX_STR > MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN, + "MAX_STR > MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN"); + +}; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp new file mode 100644 index 000000000..c2117cf67 --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -0,0 +1,605 @@ +/* + * 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 +#include + +//#include "bitfield.h" +#include "dataconstants_220.h" +#include "datastructs_220.h" +#include "myeeprom_220.h" + +#define GVAR_SMALL 128 +#define VOLUME_LEVEL_DEF 12 + +#define in_read_weight nullptr + +static bool in_write_weight(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val,node->size); + + if (sval > GVAR_SMALL-11 && sval < GVAR_SMALL-1) { + char n = GVAR_SMALL - sval + '0'; + return wf(opaque, "-GV", 3) && wf(opaque, &n, 1); + } + else if (sval < -GVAR_SMALL+11 && sval > -GVAR_SMALL+1) { + char n = val - GVAR_SMALL + '1'; + return wf(opaque, "GV", 2) && wf(opaque, &n, 1); + } + + char* s = yaml_signed2str(sval); + return wf(opaque, s, strlen(s)); +} + +extern const struct YamlIdStr enum_MixSources[]; + +#define r_mixSrcRaw nullptr + +static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + const char* str = nullptr; + + if (val >= MIXSRC_FIRST_INPUT + && val <= MIXSRC_LAST_INPUT) { + + if (!wf(opaque, "I", 1)) + return false; + + str = yaml_unsigned2str(val - MIXSRC_FIRST_INPUT); + } + else { + str = yaml_output_enum(val, enum_MixSources); + } + + if (str) { + return wf(opaque, str, strlen(str)); + } + + return true; +} + +#define r_vbat_min nullptr + +static bool w_vbat_min(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + char* s = yaml_signed2str(yaml_to_signed(val,node->size) + 90); + return wf(opaque, s, strlen(s)); +} + +#define r_vbat_max nullptr + +static bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + char* s = yaml_signed2str(yaml_to_signed(val,node->size) + 120); + return wf(opaque, s, strlen(s)); +} + +#if defined(COLORLCD) +static uint8_t select_zov(uint8_t* data, uint32_t bitoffs) +{ + data += bitoffs >> 3UL; + data -= sizeof(ZoneOptionValueEnum); + ZoneOptionValueEnum* p_zovt = (ZoneOptionValueEnum*)data; + return *p_zovt; +} +#endif + +static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) +{ + data += bitoffs >> 3UL; + data -= offsetof(ModuleData, ppm); + + ModuleData* mod_data = reinterpret_cast(data); + switch(mod_data->type) { + case MODULE_TYPE_NONE: + case MODULE_TYPE_PPM: + case MODULE_TYPE_DSM2: + case MODULE_TYPE_CROSSFIRE: + case MODULE_TYPE_GHOST: + return 1; + case MODULE_TYPE_MULTIMODULE: + return 2; + case MODULE_TYPE_XJT_PXX1: + case MODULE_TYPE_R9M_PXX1: + case MODULE_TYPE_R9M_LITE_PXX1: + return 3; + case MODULE_TYPE_SBUS: + return 4; + case MODULE_TYPE_ISRM_PXX2: + case MODULE_TYPE_R9M_PXX2: + case MODULE_TYPE_R9M_LITE_PXX2: + 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; + } + return 0; +} + +static uint8_t select_custom_fn(uint8_t* data, uint32_t bitoffs) +{ + // always use 'all' + //TODO + return 1; +} + +static uint8_t select_script_input(uint8_t* data, uint32_t bitoffs) +{ + // always use 'value' + return 0; +} + +static uint8_t select_id1(uint8_t* data, uint32_t bitoffs) +{ + // always use 'id' + return 0; +} + +static uint8_t select_id2(uint8_t* data, uint32_t bitoffs) +{ + // always use 'instance' + return 0; +} + +static uint8_t select_sensor_cfg(uint8_t* data, uint32_t bitoffs) +{ + // always use 'param' + return 5; +} + +#if 0 +static uint32_t sw_read(const char* val, uint8_t val_len) +{ + uint32_t sw = yaml_parse_enum(enum_MixSources, val, val_len); + if (sw >= MIXSRC_FIRST_SWITCH) + return sw - MIXSRC_FIRST_SWITCH; + + return -1; +} +#endif + +static bool sw_write(uint32_t idx, yaml_writer_func wf, void* opaque) +{ + const char* str = yaml_output_enum(idx + MIXSRC_FIRST_SWITCH, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; +} + +#if 0 +static void r_stick_name(const YamlNode* node, uint8_t* data, + uint32_t bitoffs, uint16_t idx, + const char* val, uint8_t val_len) +{ + data -= offsetof(RadioData, switchConfig); + RadioData* rd = reinterpret_cast(data); + strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); +} +#endif + +static bool w_stick_name(const YamlNode* node, uint8_t* data, + uint32_t bitoffs, uint16_t idx, + yaml_writer_func wf, void* opaque) +{ + data -= offsetof(RadioData, switchConfig); + RadioData* rd = reinterpret_cast(data); + return wf(opaque, rd->anaNames[idx], strnlen(rd->anaNames[idx], LEN_ANA_NAME)); +} + +static bool stick_name_valid(uint8_t* data, uint32_t bitoffs, uint16_t idx) +{ + RadioData* rd = reinterpret_cast(data); + return rd->anaNames[idx][0] != '\0'; +} + +static const struct YamlNode struct_sticksConfig[] = { + YAML_IDX, + YAML_CUSTOM( "name", nullptr, w_stick_name), + YAML_END +}; + +#if 0 +static void sw_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, const char* val, uint8_t val_len) +{ + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, switchConfig); + + RadioData* rd = reinterpret_cast(data); + strncpy(rd->switchNames[idx], val, std::min(val_len, LEN_SWITCH_NAME)); +} +#endif + +static bool sw_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, yaml_writer_func wf, void* opaque) +{ + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, switchConfig); + + RadioData* rd = reinterpret_cast(data); + const char* str = rd->switchNames[idx]; + return wf(opaque, str, strnlen(str, LEN_SWITCH_NAME)); +} + +static const struct YamlIdStr enum_SwitchConfig[] = { + { SWITCH_NONE, "none" }, + { SWITCH_TOGGLE, "toggle" }, + { SWITCH_2POS, "2pos" }, + { SWITCH_3POS, "3pos" }, + { 0, NULL } +}; + +static const struct YamlNode struct_switchConfig[] = { + YAML_IDX_CUST( "sw", nullptr, sw_write ), + YAML_ENUM( "type", 2, enum_SwitchConfig), + YAML_CUSTOM( "name", nullptr, sw_name_write), + YAML_END +}; + +#if 0 +static uint32_t pot_read(const char* val, uint8_t val_len) +{ + uint32_t pot = yaml_parse_enum(enum_MixSources, val, val_len); + if (pot >= MIXSRC_FIRST_POT) + return pot - MIXSRC_FIRST_POT; + + return -1; +} +#endif + +static bool pot_write(uint32_t idx, yaml_writer_func wf, void* opaque) +{ + const char* str = yaml_output_enum(idx + MIXSRC_FIRST_POT, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; +} + +#if 0 +static void pot_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, const char* val, uint8_t val_len) +{ + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, potsConfig); + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS; + strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); +} +#endif + +static bool pot_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, yaml_writer_func wf, void* opaque) +{ + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, potsConfig); + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS; + const char* str = rd->anaNames[idx]; + return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); +} + +static const struct YamlIdStr enum_PotConfig[] = { + { POT_NONE, "none" }, + { POT_WITH_DETENT, "with_detent" }, + { POT_MULTIPOS_SWITCH, "multipos_switch" }, + { POT_WITHOUT_DETENT, "without_detent" }, + { 0, NULL } +}; + +static const struct YamlNode struct_potConfig[] = { + YAML_IDX_CUST( "pot", nullptr, pot_write ), + YAML_ENUM( "type", 2, enum_PotConfig), + YAML_CUSTOM( "name", nullptr, pot_name_write), + YAML_END +}; + +#if 0 +static uint32_t slider_read(const char* val, uint8_t val_len) +{ + uint32_t sl = yaml_parse_enum(enum_MixSources, val, val_len); + if (sl >= MIXSRC_FIRST_SLIDER) + return sl - MIXSRC_FIRST_SLIDER; + + return -1; +} +#endif + +static bool slider_write(uint32_t idx, yaml_writer_func wf, void* opaque) +{ + const char* str = yaml_output_enum(idx + MIXSRC_FIRST_SLIDER, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; +} + +#if 0 +static void sl_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, const char* val, uint8_t val_len) +{ + // data / bitoffs already incremented +#if defined(PCBTARANIS) + // Please note: + // slidersConfig is defined as a bit-field member, + // so let's take the next field and subtract 1 + // + data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; + data -= offsetof(RadioData, potsConfig) - 1; +#else + data -= (idx + 1) / 8; + data -= offsetof(RadioData, slidersConfig); +#endif + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS + STORAGE_NUM_POTS; + strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); +} +#endif + +static bool sl_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, + uint16_t idx, yaml_writer_func wf, void* opaque) +{ + // data / bitoffs already incremented +#if defined(PCBTARANIS) + // Please note: + // slidersConfig is defined as a bit-field member, + // so let's take the next field and subtract 1 + // + data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; + data -= offsetof(RadioData, potsConfig) - 1; +#else + data -= (idx + 1) / 8; + data -= offsetof(RadioData, slidersConfig); +#endif + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS + STORAGE_NUM_POTS; + const char* str = rd->anaNames[idx]; + return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); +} + +static const struct YamlIdStr enum_SliderConfig[] = { + { SLIDER_NONE, "none" }, + { SLIDER_WITH_DETENT, "with_detent" }, + { 0, NULL } +}; + +static const struct YamlNode struct_sliderConfig[] = { + YAML_IDX_CUST( "sl", nullptr, slider_write ), + YAML_ENUM( "type", 1, enum_SliderConfig), + YAML_CUSTOM( "name", nullptr, sl_name_write), + YAML_END +}; + +extern const struct YamlIdStr enum_SwitchSources[]; + +#define r_swtchSrc nullptr + +static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val, node->size); + if (sval < 0) { + wf(opaque, "!", 1); + sval = abs(sval); + } + + const char* str = NULL; + if (sval >= SWSRC_FIRST_LOGICAL_SWITCH + && sval <= SWSRC_LAST_LOGICAL_SWITCH) { + + wf(opaque, "L", 1); + str = yaml_unsigned2str(sval - SWSRC_FIRST_LOGICAL_SWITCH + 1); + return wf(opaque,str, strlen(str)); + } +#if NUM_XPOTS > 0 + else if (sval >= SWSRC_FIRST_MULTIPOS_SWITCH + && sval <= SWSRC_LAST_MULTIPOS_SWITCH) { + + wf(opaque, "6P", 2); + + // pot #: start with 6P1 + sval -= SWSRC_FIRST_MULTIPOS_SWITCH; + str = yaml_unsigned2str(sval / XPOTS_MULTIPOS_COUNT); + wf(opaque,str, strlen(str)); + + // position + str = yaml_unsigned2str(sval % XPOTS_MULTIPOS_COUNT); + return wf(opaque,str, strlen(str)); + } +#endif + else if (sval >= SWSRC_FIRST_FLIGHT_MODE + && sval <= SWSRC_LAST_FLIGHT_MODE) { + + wf(opaque, "FM", 2); + str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE + 1); + return wf(opaque,str, strlen(str)); + } + else if (sval >= SWSRC_FIRST_SENSOR + && sval <= SWSRC_LAST_SENSOR) { + + wf(opaque, "T", 2); + str = yaml_unsigned2str(sval - SWSRC_FIRST_SENSOR + 1); + return wf(opaque,str, strlen(str)); + } + + str = yaml_output_enum(sval, enum_SwitchSources); + return wf(opaque, str, strlen(str)); +} + +static bool cfn_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) +{ + data += bitoffs >> 3UL; + return ((CustomFunctionData*)data)->swtch; +} + +static bool gvar_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) +{ + gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); + return *gvar != GVAR_MAX+1; +} + +static bool fmd_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) +{ + uint32_t data_ofs = bitoffs >> 3UL; + if (data_ofs == offsetof(ModelData, flightModeData)) { + return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData)*8); + } + + bool is_active = !yaml_is_zero(data, bitoffs, + (sizeof(FlightModeData) + - sizeof(FlightModeData::gvars))*8); + + FlightModeData* fmd = (FlightModeData*)(data + data_ofs); + for (uint8_t i=0; igvars[i] != GVAR_MAX+1; + } + + return is_active; +} + +#define r_swtchWarn nullptr + +static bool w_swtchWarn(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + for (int i = 0; i < STORAGE_NUM_SWITCHES; i++) { + //if (SWITCH_EXISTS(i)) { + + // decode check state + // -> 3 bits per switch + auto state = (val >> (3*i)) & 0x07; + + // state == 0 -> no check + // state == 1 -> UP + // state == 2 -> MIDDLE + // state == 3 -> DOWN + char swtchWarn[2] = {(char)('A' + i), 0}; + + switch (state) { + case 0: + break; + case 1: + swtchWarn[1] = 'u'; + break; + case 2: + swtchWarn[1] = '-'; + break; + case 3: + swtchWarn[1] = 'd'; + break; + default: + // this should never happen + swtchWarn[1] = 'x'; + break; + } + + if (swtchWarn[1] != 0) { + if (!wf(opaque, swtchWarn, 2)) { + return false; + } + } + //} + } + + return true; +} + +extern const struct YamlIdStr enum_BeeperMode[]; + +#define r_beeperMode nullptr + +static bool w_beeperMode(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val,node->size); + const char* str = yaml_output_enum(sval, enum_BeeperMode); + return wf(opaque, str, strlen(str)); +} + +#define r_5pos nullptr + +static bool w_5pos(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val,node->size); + char* s = yaml_signed2str(sval + 2); + return wf(opaque, s, strlen(s)); +} + +#define r_vol nullptr + +static bool w_vol(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val,node->size); + char* s = yaml_signed2str(sval + VOLUME_LEVEL_DEF); + return wf(opaque, s, strlen(s)); +} + +#define r_spPitch nullptr + +static bool w_spPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + char* s = yaml_signed2str(val * 15); + return wf(opaque, s, strlen(s)); +} + +#define r_vPitch nullptr + +static bool w_vPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + int32_t sval = yaml_to_signed(val,node->size); + char* s = yaml_signed2str(sval * 10); + return wf(opaque, s, strlen(s)); +} + +const struct YamlIdStr enum_TrainerMode[] = { +#if defined(PCBNV14) + { TRAINER_MODE_OFF, "OFF" }, +#endif + { TRAINER_MODE_MASTER_TRAINER_JACK, "MASTER_TRAINER_JACK" }, + { TRAINER_MODE_SLAVE, "SLAVE" }, +#if defined(PCBTARANIS) || defined(PCBNV14) + { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MASTER_SBUS_EXT" }, + { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MASTER_CPPM_EXT" }, +#endif +#if defined(PCBTARANIS) || defined(AUX_SERIAL) || defined(AUX2_SERIAL) + { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MASTER_BATT_COMP" }, +#endif + { TRAINER_MODE_MASTER_BLUETOOTH, "MASTER_BT" }, + { TRAINER_MODE_SLAVE_BLUETOOTH, "SLAVE_BT" }, + { TRAINER_MODE_MULTI, "MASTER_MULTI" }, + { 0, NULL } +}; + +#define r_trainerMode nullptr + +static bool w_trainerMode(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque) +{ + const char* str = nullptr; + str = yaml_output_enum(val, enum_TrainerMode); + + if (str) { + return wf(opaque, str, strlen(str)); + } + + return true; +} diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp new file mode 100644 index 000000000..cf510201a --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -0,0 +1,858 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ZoneOptionValueEnum[] = { + { ZOV_Unsigned, "Unsigned" }, + { ZOV_Signed, "Signed" }, + { ZOV_Bool, "Bool" }, + { ZOV_String, "String" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 48, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 48, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode union_ZoneOptionValue_elmts[] = { + YAML_UNSIGNED( "unsignedValue", 32 ), + YAML_SIGNED( "signedValue", 32 ), + YAML_UNSIGNED( "boolValue", 32 ), + YAML_STRING("stringValue", 8), + YAML_END +}; +static const struct YamlNode struct_ZoneOptionValueTyped[] = { + YAML_IDX, + YAML_ENUM("type", 32, enum_ZoneOptionValueEnum), + YAML_UNION("value", 64, union_ZoneOptionValue_elmts, select_zov), + YAML_END +}; +static const struct YamlNode struct_OpenTxTheme__PersistentData[] = { + YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 9, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_PADDING( 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_PADDING( 8 ), + YAML_UNSIGNED( "stickReverse", 8 ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ENUM("aux2SerialMode", 4, enum_UartModes), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), + YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), + YAML_PADDING( 192 ), + YAML_PADDING( 216 ), + YAML_STRING("currModelFilename", 17), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "blOffBright", 7 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("themeName", 8), + YAML_STRUCT("themeData", 480, struct_OpenTxTheme__PersistentData, NULL), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 15), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_STRING("bitmap", 14), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 10), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_UNSIGNED( "flysky_telemetry", 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 8 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode struct_string_32[] = { + YAML_IDX, + YAML_STRING("val", 4), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_WidgetPersistentData[] = { + YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_ZonePersistentData[] = { + YAML_IDX, + YAML_STRING("widgetName", 10), + YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), + YAML_END +}; +static const struct YamlNode struct_LayoutPersistentData[] = { + YAML_ARRAY("zones", 576, 10, struct_ZonePersistentData, NULL), + YAML_ARRAY("options", 96, 10, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomScreenData[] = { + YAML_IDX, + YAML_STRING("LayoutId", 10), + YAML_STRUCT("layoutData", 6720, struct_LayoutPersistentData, NULL), + YAML_END +}; +static const struct YamlNode struct_TopBarPersistentData[] = { + YAML_ARRAY("zones", 576, 2, struct_ZonePersistentData, NULL), + YAML_ARRAY("options", 96, 1, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 104, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 9, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), + YAML_ARRAY("screenData", 6800, 5, struct_CustomScreenData, NULL), + YAML_STRUCT("topbarData", 1248, struct_TopBarPersistentData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp new file mode 100644 index 000000000..433343d0f --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -0,0 +1,831 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp new file mode 100644 index 000000000..433343d0f --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -0,0 +1,831 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp new file mode 100644 index 000000000..433343d0f --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -0,0 +1,831 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp new file mode 100644 index 000000000..658bf57bc --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -0,0 +1,831 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp new file mode 100644 index 000000000..45482c63f --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -0,0 +1,875 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ZoneOptionValueEnum[] = { + { ZOV_Unsigned, "Unsigned" }, + { ZOV_Signed, "Signed" }, + { ZOV_Bool, "Bool" }, + { ZOV_String, "String" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_S1, "S1" }, + { MIXSRC_6POS, "6POS" }, + { MIXSRC_S2, "S2" }, + { MIXSRC_EXT1, "EXT1" }, + { MIXSRC_EXT2, "EXT2" }, + { MIXSRC_LS, "LS" }, + { MIXSRC_RS, "RS" }, + { MIXSRC_MOUSE1, "MOUSE1" }, + { MIXSRC_MOUSE2, "MOUSE2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_TrimT5, "TrimT5" }, + { MIXSRC_TrimT6, "TrimT6" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_TrimT5Down, "TrimT5Down" }, + { SWSRC_TrimT5Up, "TrimT5Up" }, + { SWSRC_TrimT6Down, "TrimT6Down" }, + { SWSRC_TrimT6Up, "TrimT6Up" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 48, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 48, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode union_ZoneOptionValue_elmts[] = { + YAML_UNSIGNED( "unsignedValue", 32 ), + YAML_SIGNED( "signedValue", 32 ), + YAML_UNSIGNED( "boolValue", 32 ), + YAML_STRING("stringValue", 8), + YAML_END +}; +static const struct YamlNode struct_ZoneOptionValueTyped[] = { + YAML_IDX, + YAML_ENUM("type", 32, enum_ZoneOptionValueEnum), + YAML_UNION("value", 64, union_ZoneOptionValue_elmts, select_zov), + YAML_END +}; +static const struct YamlNode struct_OpenTxTheme__PersistentData[] = { + YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 15, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_PADDING( 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ENUM("aux2SerialMode", 4, enum_UartModes), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), + YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), + YAML_PADDING( 240 ), + YAML_PADDING( 312 ), + YAML_STRING("currModelFilename", 17), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "blOffBright", 7 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("themeName", 8), + YAML_STRUCT("themeData", 480, struct_OpenTxTheme__PersistentData, NULL), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 15), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_STRING("bitmap", 14), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), + YAML_STRING("name", 10), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode struct_string_32[] = { + YAML_IDX, + YAML_STRING("val", 4), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_WidgetPersistentData[] = { + YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_ZonePersistentData[] = { + YAML_IDX, + YAML_STRING("widgetName", 10), + YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), + YAML_END +}; +static const struct YamlNode struct_LayoutPersistentData[] = { + YAML_ARRAY("zones", 576, 10, struct_ZonePersistentData, NULL), + YAML_ARRAY("options", 96, 10, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomScreenData[] = { + YAML_IDX, + YAML_STRING("LayoutId", 10), + YAML_STRUCT("layoutData", 6720, struct_LayoutPersistentData, NULL), + YAML_END +}; +static const struct YamlNode struct_TopBarPersistentData[] = { + YAML_ARRAY("zones", 576, 4, struct_ZonePersistentData, NULL), + YAML_ARRAY("options", 96, 1, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 104, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 9, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 9, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), + YAML_ARRAY("screenData", 6800, 5, struct_CustomScreenData, NULL), + YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp new file mode 100644 index 000000000..027e6d428 --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -0,0 +1,875 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ZoneOptionValueEnum[] = { + { ZOV_Unsigned, "Unsigned" }, + { ZOV_Signed, "Signed" }, + { ZOV_Bool, "Bool" }, + { ZOV_String, "String" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_S1, "S1" }, + { MIXSRC_6POS, "6POS" }, + { MIXSRC_S2, "S2" }, + { MIXSRC_S3, "S3" }, + { MIXSRC_S4, "S4" }, + { MIXSRC_LS, "LS" }, + { MIXSRC_RS, "RS" }, + { MIXSRC_MOUSE1, "MOUSE1" }, + { MIXSRC_MOUSE2, "MOUSE2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_TrimT5, "TrimT5" }, + { MIXSRC_TrimT6, "TrimT6" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_TrimT5Down, "TrimT5Down" }, + { SWSRC_TrimT5Up, "TrimT5Up" }, + { SWSRC_TrimT6Down, "TrimT6Down" }, + { SWSRC_TrimT6Up, "TrimT6Up" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 48, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 48, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode union_ZoneOptionValue_elmts[] = { + YAML_UNSIGNED( "unsignedValue", 32 ), + YAML_SIGNED( "signedValue", 32 ), + YAML_UNSIGNED( "boolValue", 32 ), + YAML_STRING("stringValue", 8), + YAML_END +}; +static const struct YamlNode struct_ZoneOptionValueTyped[] = { + YAML_IDX, + YAML_ENUM("type", 32, enum_ZoneOptionValueEnum), + YAML_UNION("value", 64, union_ZoneOptionValue_elmts, select_zov), + YAML_END +}; +static const struct YamlNode struct_OpenTxTheme__PersistentData[] = { + YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 15, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_PADDING( 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ENUM("aux2SerialMode", 4, enum_UartModes), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), + YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), + YAML_PADDING( 240 ), + YAML_PADDING( 312 ), + YAML_STRING("currModelFilename", 17), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "blOffBright", 7 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("themeName", 8), + YAML_STRUCT("themeData", 480, struct_OpenTxTheme__PersistentData, NULL), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 15), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_STRING("bitmap", 14), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), + YAML_STRING("name", 10), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode struct_string_32[] = { + YAML_IDX, + YAML_STRING("val", 4), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_WidgetPersistentData[] = { + YAML_ARRAY("options", 96, 5, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_ZonePersistentData[] = { + YAML_IDX, + YAML_STRING("widgetName", 10), + YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), + YAML_END +}; +static const struct YamlNode struct_LayoutPersistentData[] = { + YAML_ARRAY("zones", 576, 10, struct_ZonePersistentData, NULL), + YAML_ARRAY("options", 96, 10, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomScreenData[] = { + YAML_IDX, + YAML_STRING("LayoutId", 10), + YAML_STRUCT("layoutData", 6720, struct_LayoutPersistentData, NULL), + YAML_END +}; +static const struct YamlNode struct_TopBarPersistentData[] = { + YAML_ARRAY("zones", 576, 4, struct_ZonePersistentData, NULL), + YAML_ARRAY("options", 96, 1, struct_ZoneOptionValueTyped, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 104, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 9, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 9, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), + YAML_ARRAY("screenData", 6800, 5, struct_CustomScreenData, NULL), + YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 248, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp new file mode 100644 index 000000000..433343d0f --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -0,0 +1,831 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_PADDING( 192 ), + YAML_PADDING( 144 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp new file mode 100644 index 000000000..4ecd1fcfb --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -0,0 +1,846 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_POT3, "POT3" }, + { MIXSRC_SLIDER1, "SLIDER1" }, + { MIXSRC_SLIDER2, "SLIDER2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 64, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 9, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 32 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), + YAML_PADDING( 216 ), + YAML_PADDING( 216 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 12), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_STRING("bitmap", 10), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 10), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode struct_string_32[] = { + YAML_IDX, + YAML_STRING("val", 4), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 104, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 16 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED( "voltsSource", 8 ), + YAML_UNSIGNED( "altitudeSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp new file mode 100644 index 000000000..506ce0e76 --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -0,0 +1,886 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_POT3, "POT3" }, + { MIXSRC_POT4, "POT4" }, + { MIXSRC_SLIDER1, "SLIDER1" }, + { MIXSRC_SLIDER2, "SLIDER2" }, + { MIXSRC_SLIDER3, "SLIDER3" }, + { MIXSRC_SLIDER4, "SLIDER4" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SH, "SH" }, + { MIXSRC_SI, "SI" }, + { MIXSRC_SJ, "SJ" }, + { MIXSRC_SK, "SK" }, + { MIXSRC_SL, "SL" }, + { MIXSRC_SM, "SM" }, + { MIXSRC_SN, "SN" }, + { MIXSRC_SO, "SO" }, + { MIXSRC_SP, "SP" }, + { MIXSRC_SQ, "SQ" }, + { MIXSRC_SR, "SR" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_SH0, "SH0" }, + { SWSRC_SH1, "SH1" }, + { SWSRC_SH2, "SH2" }, + { SWSRC_SI0, "SI0" }, + { SWSRC_SI1, "SI1" }, + { SWSRC_SI2, "SI2" }, + { SWSRC_SJ0, "SJ0" }, + { SWSRC_SJ1, "SJ1" }, + { SWSRC_SJ2, "SJ2" }, + { SWSRC_SK0, "SK0" }, + { SWSRC_SK1, "SK1" }, + { SWSRC_SK2, "SK2" }, + { SWSRC_SL0, "SL0" }, + { SWSRC_SL1, "SL1" }, + { SWSRC_SL2, "SL2" }, + { SWSRC_SM0, "SM0" }, + { SWSRC_SM1, "SM1" }, + { SWSRC_SM2, "SM2" }, + { SWSRC_SN0, "SN0" }, + { SWSRC_SN1, "SN1" }, + { SWSRC_SN2, "SN2" }, + { SWSRC_SO0, "SO0" }, + { SWSRC_SO1, "SO1" }, + { SWSRC_SO2, "SO2" }, + { SWSRC_SP0, "SP0" }, + { SWSRC_SP1, "SP1" }, + { SWSRC_SP2, "SP2" }, + { SWSRC_SQ0, "SQ0" }, + { SWSRC_SQ1, "SQ1" }, + { SWSRC_SQ2, "SQ2" }, + { SWSRC_SR0, "SR0" }, + { SWSRC_SR1, "SR1" }, + { SWSRC_SR2, "SR2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 64, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 64 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), + YAML_PADDING( 432 ), + YAML_PADDING( 288 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 12), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_STRING("bitmap", 10), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 10), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode struct_string_32[] = { + YAML_IDX, + YAML_STRING("val", 4), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 104, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 64, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 32 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED( "voltsSource", 8 ), + YAML_UNSIGNED( "altitudeSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "toplcdTimer", 8 ), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 192, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp new file mode 100644 index 000000000..8a2b98dad --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -0,0 +1,816 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 5, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_PADDING( 120 ), + YAML_PADDING( 120 ), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp new file mode 100644 index 000000000..245a52698 --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -0,0 +1,826 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SG, "SG" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_SG0, "SG0" }, + { SWSRC_SG1, "SG1" }, + { SWSRC_SG2, "SG2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 5, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_PADDING( 168 ), + YAML_PADDING( 120 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp new file mode 100644 index 000000000..0d4de5fd3 --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -0,0 +1,823 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_PADDING( 144 ), + YAML_PADDING( 144 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp new file mode 100644 index 000000000..aea0501cb --- /dev/null +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -0,0 +1,827 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { ANTENNA_MODE_FIRST, "MODE_FIRST" }, + { ANTENNA_MODE_LAST, "MODE_LAST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { BLUETOOTH_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_FIRST_WITHOUT_ENABLE, "FIRST_WITHOUT_ENABLE" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_RESERVE4, "RESERVE4" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_RESERVE5, "RESERVE5" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_UartModes[] = { + { UART_MODE_NONE, "MODE_NONE" }, + { UART_MODE_TELEMETRY_MIRROR, "MODE_TELEMETRY_MIRROR" }, + { UART_MODE_TELEMETRY, "MODE_TELEMETRY" }, + { UART_MODE_SBUS_TRAINER, "MODE_SBUS_TRAINER" }, + { UART_MODE_LUA, "MODE_LUA" }, + { UART_MODE_COUNT, "MODE_COUNT" }, + { UART_MODE_MAX, "MODE_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { TMRMODE_COUNT, "COUNT" }, + { TMRMODE_MAX, "MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_Rud, "Rud" }, + { MIXSRC_Ele, "Ele" }, + { MIXSRC_Thr, "Thr" }, + { MIXSRC_Ail, "Ail" }, + { MIXSRC_POT1, "POT1" }, + { MIXSRC_POT2, "POT2" }, + { MIXSRC_GYRO1, "GYRO1" }, + { MIXSRC_GYRO2, "GYRO2" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_CYC1, "CYC1" }, + { MIXSRC_CYC2, "CYC2" }, + { MIXSRC_CYC3, "CYC3" }, + { MIXSRC_TrimRud, "TrimRud" }, + { MIXSRC_TrimEle, "TrimEle" }, + { MIXSRC_TrimThr, "TrimThr" }, + { MIXSRC_TrimAil, "TrimAil" }, + { MIXSRC_SA, "SA" }, + { MIXSRC_SB, "SB" }, + { MIXSRC_SC, "SC" }, + { MIXSRC_SD, "SD" }, + { MIXSRC_SE, "SE" }, + { MIXSRC_SF, "SF" }, + { MIXSRC_SW1, "SW1" }, + { MIXSRC_CH1, "CH1" }, + { MIXSRC_CH2, "CH2" }, + { MIXSRC_CH3, "CH3" }, + { MIXSRC_CH4, "CH4" }, + { MIXSRC_CH5, "CH5" }, + { MIXSRC_CH6, "CH6" }, + { MIXSRC_CH7, "CH7" }, + { MIXSRC_CH8, "CH8" }, + { MIXSRC_CH9, "CH9" }, + { MIXSRC_CH10, "CH10" }, + { MIXSRC_CH11, "CH11" }, + { MIXSRC_CH12, "CH12" }, + { MIXSRC_CH13, "CH13" }, + { MIXSRC_CH14, "CH14" }, + { MIXSRC_CH15, "CH15" }, + { MIXSRC_CH16, "CH16" }, + { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { MIXSRC_TIMER1, "TIMER1" }, + { MIXSRC_TIMER2, "TIMER2" }, + { MIXSRC_TIMER3, "TIMER3" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_RANGE, "FUNC_RANGE" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_COUNT, "FUNC_COUNT" }, + { LS_FUNC_MAX, "FUNC_MAX" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_SA0, "SA0" }, + { SWSRC_SA1, "SA1" }, + { SWSRC_SA2, "SA2" }, + { SWSRC_SB0, "SB0" }, + { SWSRC_SB1, "SB1" }, + { SWSRC_SB2, "SB2" }, + { SWSRC_SC0, "SC0" }, + { SWSRC_SC1, "SC1" }, + { SWSRC_SC2, "SC2" }, + { SWSRC_SD0, "SD0" }, + { SWSRC_SD1, "SD1" }, + { SWSRC_SD2, "SD2" }, + { SWSRC_SE0, "SE0" }, + { SWSRC_SE1, "SE1" }, + { SWSRC_SE2, "SE2" }, + { SWSRC_SF0, "SF0" }, + { SWSRC_SF1, "SF1" }, + { SWSRC_SF2, "SF2" }, + { SWSRC_TrimRudLeft, "TrimRudLeft" }, + { SWSRC_TrimRudRight, "TrimRudRight" }, + { SWSRC_TrimEleDown, "TrimEleDown" }, + { SWSRC_TrimEleUp, "TrimEleUp" }, + { SWSRC_TrimThrDown, "TrimThrDown" }, + { SWSRC_TrimThrUp, "TrimThrUp" }, + { SWSRC_TrimAilLeft, "TrimAilLeft" }, + { SWSRC_TrimAilRight, "TrimAilRight" }, + { SWSRC_SW1, "SW1" }, + { SWSRC_SW2, "SW2" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { 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_COUNT, "TYPE_COUNT" }, + { MODULE_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX, + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_PADDING( 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 48, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 7, enum_Functions), + YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), + YAML_UNSIGNED( "active", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "version", 8 ), + YAML_PADDING( 16 ), + YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_SIGNED( "currModel", 8 ), + YAML_UNSIGNED( "contrast", 8 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode), + YAML_ENUM("antennaMode", 2, enum_AntennaModes), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_PADDING( 1 ), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "unexpectedShutdown", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "jitterFilter", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ENUM("auxSerialMode", 4, enum_UartModes), + YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_UNSIGNED( "backlightColor", 8 ), + YAML_UNSIGNED( "switchUnlockStates", 16 ), + YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), + YAML_PADDING( 144 ), + YAML_PADDING( 144 ), + YAML_PADDING( 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_SIGNED( "gyroMax", 8 ), + YAML_SIGNED( "gyroOffset", 8 ), + YAML_SIGNED( "uartSampleMode", 2 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 10), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_SIGNED( "value", 8 ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "destCh", 5 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex), + YAML_PADDING( 1 ), + YAML_SIGNED( "offset", 14 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED( "min", 11 ), + YAML_SIGNED( "max", 11 ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED( "offset", 11 ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 4), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "carryTrim", 6 ), + YAML_UNSIGNED( "chn", 5 ), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "flightModes", 9 ), + YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), + YAML_PADDING( 1 ), + YAML_STRING("name", 6), + YAML_SIGNED( "offset", 8 ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), + YAML_SIGNED( "v1", 10 ), + YAML_SIGNED( "v3", 10 ), + YAML_SIGNED( "andsw", 9 ), + YAML_UNSIGNED( "andswtype", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "v2", 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_UNSIGNED( "type", 8 ), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED( "collectiveSource", 8 ), + YAML_UNSIGNED( "aileronSource", 8 ), + YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_STRING("name", 6), + YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 7 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_SIGNED( "disabled", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "warning", 6 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "critical", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "customProto", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "bindPower", 3 ), + YAML_UNSIGNED( "runPower", 3 ), + YAML_UNSIGNED( "emi", 1 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "failsafeTimeout", 16 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "reserved", 6 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_anonymous_5, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_6, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_7, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_8, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_9, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_10, NULL), + YAML_STRUCT("afhds3", 64, struct_anonymous_11, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_ENUM("type", 4, enum_ModuleType), + YAML_SIGNED( "rfProtocol", 4 ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_UNSIGNED( "failsafeMode", 4 ), + YAML_UNSIGNED( "subType", 3 ), + YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED( "source", 16 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode union_anonymous_12_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_14[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_13_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_UNSIGNED( "formula", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_17[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_16, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_17, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_18, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_19, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_20, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_12_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_UNSIGNED( "type", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_15_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode struct_FrSkyBarData[] = { + YAML_IDX, + YAML_UNSIGNED( "source", 16 ), + YAML_SIGNED( "barMin", 16 ), + YAML_SIGNED( "barMax", 16 ), + YAML_END +}; +static const struct YamlNode struct_unsigned_16[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_FrSkyLineData[] = { + YAML_IDX, + YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_END +}; +static const struct YamlNode struct_TelemetryScriptData[] = { + YAML_STRING("file", 6), + YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData_elmts[] = { + YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), + YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), + YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), + YAML_END +}; +static const struct YamlNode union_TelemetryScreenData[] = { + YAML_IDX, + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), + YAML_UNSIGNED( "switchWarningEnable", 8 ), + YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED( "rssiSource", 8 ), + YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), + YAML_PADDING( 3 ), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), + YAML_UNSIGNED( "screensType", 8 ), + YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 96, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 24 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/storage/conversions/yaml/zone_220.h b/radio/src/storage/conversions/yaml/zone_220.h new file mode 100644 index 000000000..5e9471bbb --- /dev/null +++ b/radio/src/storage/conversions/yaml/zone_220.h @@ -0,0 +1,66 @@ +/* + * 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 + +#define LEN_ZONE_OPTION_STRING 8 + +union ZoneOptionValue +{ + uint32_t unsignedValue; + int32_t signedValue; + uint32_t boolValue; + char stringValue[LEN_ZONE_OPTION_STRING]; +}; + +enum ZoneOptionValueEnum { + ZOV_Unsigned=0, + ZOV_Signed, + ZOV_Bool, + ZOV_String +}; + +struct ZoneOption +{ + enum Type { + Integer, + Source, + Bool, + String, + File, + TextSize, + Timer, + Switch, + Color + }; + + const char * name; + Type type; + ZoneOptionValue deflt; + ZoneOptionValue min; + ZoneOptionValue max; +}; + +struct ZoneOptionValueTyped +{ + ZoneOptionValueEnum type; + ZoneOptionValue value FUNC(select_zov); +}; From f0dbbf41da75b8d85ed479ab01e18836fd270a47 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 15 Oct 2021 19:44:43 +0200 Subject: [PATCH 051/110] Fix LCD_W defines --- radio/src/storage/conversions/yaml/dataconstants_220.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/storage/conversions/yaml/dataconstants_220.h b/radio/src/storage/conversions/yaml/dataconstants_220.h index 30c0cba2f..c3bfae1c4 100644 --- a/radio/src/storage/conversions/yaml/dataconstants_220.h +++ b/radio/src/storage/conversions/yaml/dataconstants_220.h @@ -182,7 +182,7 @@ enum CurveType { #define LEN_FUNCTION_NAME 6 #define MAX_CURVES 32 #define MAX_CURVE_POINTS 512 -#elif LCD_W == 212 +#elif defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) #define LEN_MODEL_NAME 12 #define LEN_TIMER_NAME 8 #define LEN_FLIGHT_MODE_NAME 10 @@ -226,7 +226,7 @@ enum MainViews { VIEW_TELEM4, VIEW_COUNT }; -#elif LCD_W >= 212 +#elif defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) enum MainViews { VIEW_TIMERS, VIEW_INPUTS, @@ -412,7 +412,7 @@ enum TelemetryUnit { UNIT_DATETIME_SEC }; -#if LCD_W >= 212 +#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) #define NUM_LINE_ITEMS 3 #else #define NUM_LINE_ITEMS 2 From 0503e6fb8e0a2357513415e9df7eaf73d65afd19 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 15 Oct 2021 19:51:42 +0200 Subject: [PATCH 052/110] Some cleanup --- radio/src/storage/conversions/yaml/bitfield.h | 88 ------------------- .../yaml/yaml_datastructs_funcs.cpp | 1 - radio/src/storage/conversions/yaml/zone_220.h | 2 +- radio/src/storage/yaml/yaml_datastructs.cpp | 3 +- 4 files changed, 3 insertions(+), 91 deletions(-) delete mode 100644 radio/src/storage/conversions/yaml/bitfield.h diff --git a/radio/src/storage/conversions/yaml/bitfield.h b/radio/src/storage/conversions/yaml/bitfield.h deleted file mode 100644 index a0c753e0f..000000000 --- a/radio/src/storage/conversions/yaml/bitfield.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * This file is based on work published at http://www.coranac.com/documents/working-with-bits-and-bitfields - * - * 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. - */ - -#ifndef BITFIELD_H -#define BITFIELD_H - -#include - -// A set of bitfield handling macros - -template -inline T bfBit(uint8_t n) -{ - return T(1) << n; -} - -#define BFBIT_SET(y, mask) ( y |= (mask) ) -#define BFBIT_CLEAR(y, mask) ( y &= ~(mask) ) -#define BFBIT_FLIP(y, mask) ( y ^= (mask) ) -#define BF_SINGLE_BIT_SET(y, i) BFBIT_SET(y, bfBit(i)) - -//! Create a bitmask of length 'len'. -template -inline T bfBitmask(uint8_t len) -{ - return bfBit(len) - 1; -} - -//! Create a bitfield mask of length 'len' starting at bit 'start'. -template -inline T bfMask(uint8_t start, uint8_t len) -{ - return bfBitmask(len) << start; -} - -//! Prepare a bitmask for insertion or combining. -template -inline T bfPrep(T x, uint8_t start, uint8_t len) -{ - return (x & bfBitmask(len)) << start; -} - -//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. -template -inline T bfGet(T y, uint8_t start, uint8_t len) -{ - return ((y)>>(start)) & bfBitmask(len); -} - -//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. -template -inline T bfSet(T to, T from, uint8_t start, uint8_t len) -{ - return (to & ~bfMask(start, len)) | bfPrep(from, start, len); -} - -template -inline T bfBitGet(T y, T mask) -{ - return (y & mask); -} - -template -inline T bfSingleBitGet(T y, uint8_t i) -{ - return bfBitGet(y, bfBit(i)); -} - -#endif //BITFIELD_H diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index c2117cf67..537a1a625 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -22,7 +22,6 @@ #include #include -//#include "bitfield.h" #include "dataconstants_220.h" #include "datastructs_220.h" #include "myeeprom_220.h" diff --git a/radio/src/storage/conversions/yaml/zone_220.h b/radio/src/storage/conversions/yaml/zone_220.h index 5e9471bbb..3c80bcfed 100644 --- a/radio/src/storage/conversions/yaml/zone_220.h +++ b/radio/src/storage/conversions/yaml/zone_220.h @@ -62,5 +62,5 @@ struct ZoneOption struct ZoneOptionValueTyped { ZoneOptionValueEnum type; - ZoneOptionValue value FUNC(select_zov); + ZoneOptionValue value; }; diff --git a/radio/src/storage/yaml/yaml_datastructs.cpp b/radio/src/storage/yaml/yaml_datastructs.cpp index 2d4f6ca6c..1fdca7f0d 100644 --- a/radio/src/storage/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs.cpp @@ -61,4 +61,5 @@ #error "Board not supported by YAML storage" #endif -static_assert(MAX_STR > MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN); +static_assert(MAX_STR > MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN, + "MAX_STR > MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN"); From 8d04e373b65e65f3c03d4a8db9116ede910f2a53 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 16 Oct 2021 16:30:00 +0200 Subject: [PATCH 053/110] WiP storage format conversions --- radio/src/storage/conversions/CMakeLists.txt | 1 + radio/src/storage/conversions/conversions.cpp | 83 +++++++---- radio/src/storage/conversions/conversions.h | 19 ++- .../conversions/conversions_219_220.cpp | 136 +++++++++++++++--- .../conversions/conversions_220_221.cpp | 117 +++++++++++++++ .../src/storage/conversions/datastructs_220.h | 30 ++++ radio/src/storage/eeprom_common.h | 5 + radio/src/storage/eeprom_rlc.cpp | 41 +++++- radio/src/storage/sdcard_common.cpp | 7 +- radio/src/storage/sdcard_common.h | 10 +- radio/src/storage/sdcard_raw.cpp | 17 +-- radio/src/storage/sdcard_yaml.cpp | 43 ++---- 12 files changed, 412 insertions(+), 97 deletions(-) create mode 100644 radio/src/storage/conversions/conversions_220_221.cpp create mode 100644 radio/src/storage/conversions/datastructs_220.h diff --git a/radio/src/storage/conversions/CMakeLists.txt b/radio/src/storage/conversions/CMakeLists.txt index 239e97983..23bb4582c 100644 --- a/radio/src/storage/conversions/CMakeLists.txt +++ b/radio/src/storage/conversions/CMakeLists.txt @@ -6,6 +6,7 @@ if(STORAGE_CONVERSIONS) ${SRC} storage/conversions/conversions.cpp storage/conversions/conversions_219_220.cpp + storage/conversions/conversions_220_221.cpp ) include(storage/conversions/yaml/CMakeLists.txt) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index a07feeb6c..df03e4d3a 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -54,9 +54,9 @@ static void drawProgressScreen(const char* filename, int progress, int total) #endif } -void convertRadioData(int version) +void convertBinRadioData(const char * path, int version) { - TRACE("convertRadioData(%d)", version); + TRACE("convertRadioData(%s,%d)", path, version); #if defined(COLORLCD) // the theme has not been loaded before @@ -71,6 +71,7 @@ void convertRadioData(int version) AU_NONE); // Load models list before converting + // TODO: force old .txt format modelslist.load(); unsigned converted = 0; @@ -81,13 +82,18 @@ void convertRadioData(int version) #if STORAGE_CONVERSIONS < 220 if (version == 219) { - convertRadioData_219_to_220(g_eeGeneral); - storageDirty(EE_GENERAL); + // TODO: alloc specific structure for destination + convertRadioData_219_to_220(path); + } +#endif +#if STORAGE_CONVERSIONS < 220 + if (version == 220) { + convertRadioData_220_to_221(path); + // g_eeGeneral.version = EEPROM_VER; + // storageDirty(EE_GENERAL); + // storageCheck(true); } #endif - g_eeGeneral.version = EEPROM_VER; - storageDirty(EE_GENERAL); - storageCheck(true); converted++; #if defined(SIMU) @@ -107,17 +113,20 @@ void convertRadioData(int version) error = readModelBin(filename, (uint8_t *)&g_model, sizeof(g_model), &model_version); if (!error) { - convertModelData(model_version); + // TODO: error handling + convertBinModelData(filename, model_version); #if defined(SDCARD_YAML) - //TODO: convert filename & output to YAML directly + // patch model filename const char* ext = strrchr(filename, '.'); if ((ext != nullptr) && !strncmp(ext, MODELS_EXT, 4)) { memcpy((void*)ext, (void*)YAML_EXT, sizeof(YAML_EXT) - 1); } + // in case it's the current model, patch it as well if (!strncmp(filename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME)) { strncpy(g_eeGeneral.currModelFilename, filename, LEN_MODEL_FILENAME+1); } + // and write to YAML file error = writeModelYaml(filename); #else char path[256]; @@ -146,34 +155,47 @@ void convertRadioData(int version) modelslist.clear(); modelslist.load(); } -#endif -void convertModelData(int version) +void convertBinModelData(const char* filename, int version) { - TRACE("convertModelData(%d)", version); - + TRACE("convertModelData(%s,%d)", filename); + #if STORAGE_CONVERSIONS < 220 if (version == 219) { - version = 219; - convertModelData_219_to_220(g_model); + convertModelData_219_to_220(filename); + version = 220; } #endif +#if STORAGE_CONVERSIONS < 221 + if (version == 220) { + convertModelData_220_to_221(filename); + version = 221; + } +#endif + // TODO: error handling } +#endif #if defined(EEPROM) || defined(EEPROM_RLC) #include "storage/eeprom_common.h" void eeConvertModel(int id, int version) { - eeLoadModelData(id); - convertModelData(version); - uint8_t currModel = g_eeGeneral.currModel; - g_eeGeneral.currModel = id; - - storageDirty(EE_MODEL); - storageCheck(true); - - g_eeGeneral.currModel = currModel; + TRACE("eeConvertModel(%d,%d)", id, version); + +#if STORAGE_CONVERSIONS < 220 + if (version == 219) { + convertModelData_219_to_220(id); + version = 220; + } +#endif +#if STORAGE_CONVERSIONS < 221 + if (version == 220) { + convertModelData_220_to_221(id); + version = 221; + } +#endif + // TODO: error handling } bool eeConvert() @@ -209,12 +231,19 @@ bool eeConvert() #if STORAGE_CONVERSIONS < 220 if (version == 219) { version = 220; - convertRadioData_219_to_220(g_eeGeneral); + convertRadioData_219_to_220(); } #endif +#if STORAGE_CONVERSIONS < 221 + if (version == 220) { + version = 221; + convertRadioData_220_to_221(); + } +#endif + //TODO: reload from YAML g_eeGeneral.version = EEPROM_VER; - storageDirty(EE_GENERAL); - storageCheck(true); + // storageDirty(EE_GENERAL); + // storageCheck(true); #if defined(STORAGE_MODELSLIST) modelslist.clear(); diff --git a/radio/src/storage/conversions/conversions.h b/radio/src/storage/conversions/conversions.h index 239a3d891..0b0692a38 100644 --- a/radio/src/storage/conversions/conversions.h +++ b/radio/src/storage/conversions/conversions.h @@ -19,8 +19,9 @@ * GNU General Public License for more details. */ -void convertRadioData(int version); -void convertModelData(int version); +// Entry points for converting radio & model data +void convertBinRadioData(const char * path, int version); +void convertBinModelData(const char * path, int version); bool eeConvert(); void eeConvertModel(int id, int version); @@ -39,5 +40,15 @@ void eeConvertModel(int id, int version); // Conversions 219 to 220 -void convertModelData_219_to_220(ModelData &model); -void convertRadioData_219_to_220(RadioData &settings); +const char* convertModelData_219_to_220(uint8_t id); +const char* convertModelData_219_to_220(const char* filename); + +const char* convertRadioData_219_to_220(); +const char* convertRadioData_219_to_220(const char* path); + +// Conversions 220 to 221 +const char* convertModelData_220_to_221(uint8_t id); +const char* convertModelData_220_to_221(const char* filename); + +const char* convertRadioData_220_to_221(); +const char* convertRadioData_220_to_221(const char* path); diff --git a/radio/src/storage/conversions/conversions_219_220.cpp b/radio/src/storage/conversions/conversions_219_220.cpp index a05875eaa..836db8363 100644 --- a/radio/src/storage/conversions/conversions_219_220.cpp +++ b/radio/src/storage/conversions/conversions_219_220.cpp @@ -21,11 +21,16 @@ #include "opentx.h" #include "datastructs_219.h" +#include "datastructs_220.h" #if defined(COLORLCD) #include "theme.h" #endif +#if defined(EEPROM) || defined(EEPROM_RLC) +#include +#endif + // // Summary of all changes between 219 & 220 // @@ -99,18 +104,21 @@ extern const LayoutFactory * defaultLayout; extern OpenTxTheme * defaultTheme; #endif -void convertModelData_219_to_220(ModelData &model) +void convertModelData_219_to_220(void* data) { - ModelData* oldModelAllocated = (ModelData*)malloc(sizeof(ModelData)); - ModelData& oldModel = *oldModelAllocated; + constexpr unsigned md_size = sizeof(bin_storage_220::ModelData); + auto& model = *reinterpret_cast(data); - memcpy(&oldModel, &model, sizeof(ModelData)); - ModelData& newModel = (ModelData&)model; + auto oldModelAllocated = reinterpret_cast(malloc(md_size)); + bin_storage_220::ModelData& oldModel = *oldModelAllocated; + + memcpy(&oldModel, &model, md_size); + bin_storage_220::ModelData& newModel = (bin_storage_220::ModelData&)model; convertToStr(model.header.name, LEN_MODEL_NAME_219); for (uint8_t i=0; igetId()); - defaultLayout->initPersistentData(&newModel.screenData[0].layoutData, true); + strcpy(newModel.screenData[0].LayoutId, "Layout2P1"); + + // TODO: copy the raw structure for the default layout in version 220 + //defaultLayout->initPersistentData(&newModel.screenData[0].layoutData, true); + auto persistentData = &newModel.screenData[0].layoutData; + + // top bar + persistentData->options[0].type = bin_storage_220::ZOV_Bool; + persistentData->options[0].value.boolValue = true; + + // flight mode + persistentData->options[1].type = bin_storage_220::ZOV_Bool; + persistentData->options[1].value.boolValue = true; + + // sliders + persistentData->options[2].type = bin_storage_220::ZOV_Bool; + persistentData->options[2].value.boolValue = true; + + // trims + persistentData->options[3].type = bin_storage_220::ZOV_Bool; + persistentData->options[3].value.boolValue = true; + + // mirrored + persistentData->options[4].type = bin_storage_220::ZOV_Bool; + persistentData->options[4].value.boolValue = false; } #endif free(oldModelAllocated); } -void convertRadioData_219_to_220(RadioData & settings) +#if !defined(EEPROM_RLC) +const char* convertModelData_219_to_220(const char* path) +{ + constexpr unsigned md_size = sizeof(bin_storage_220::ModelData); + + auto md_220 = reinterpret_cast(malloc(md_size)); + memset(md_220, 0, md_size); + + uint8_t version; + const char* error = loadFileBin(path, (uint8_t *)md_220, md_size, &version); + if (!error) { + convertModelData_219_to_220((void*)md_220); + error = writeFileBin(path, (uint8_t *)md_220, md_size, 220); + } + + free(md_220); + return error; +} +#else +const char* convertModelData_219_to_220(uint8_t id) +{ + constexpr unsigned md_size = sizeof(bin_storage_220::ModelData); + + auto md_220 = reinterpret_cast(malloc(md_size)); + memset(md_220, 0, md_size); + + uint16_t read = eeLoadModelData(id, md_220, md_size); + if (read == md_size) { + convertModelData_219_to_220((void*)md_220); + eeWriteModelData(id, (uint8_t *)md_220, md_size, true); + } else { + // ERROR: size mismatch !!! + } + + free(md_220); + return nullptr; +} +#endif + +void convertRadioData_219_to_220(void* data) { TRACE("Radio conversion from v219 to v220"); + auto& settings = *reinterpret_cast(data); settings.version = 220; settings.variant = EEPROM_VARIANT; - RadioData* oldSettingsAllocated = (RadioData*)malloc(sizeof(RadioData)); - RadioData& oldSettings = *oldSettingsAllocated; - memcpy(&oldSettings, &settings, sizeof(RadioData)); - #if defined(COLORLCD) // Clear CustomScreenData + TopBarPersistentData // as they cannot be converted (missing option types) - strcpy(g_eeGeneral.themeName, defaultTheme->getName()); - defaultTheme->init(); + strcpy(settings.themeName, defaultTheme->getName()); + defaultTheme->init(); // TODO: just dump the data into the settings #endif for (int i = 0; i < NUM_SWITCHES_219; ++i) { @@ -250,6 +317,41 @@ void convertRadioData_219_to_220(RadioData & settings) #if defined(PCBHORUS) || defined(PCBNV14) convertToStr(settings.bluetoothName, LEN_BLUETOOTH_NAME_219); #endif - - free(oldSettingsAllocated); } + +#if !defined(EEPROM_RLC) +const char* convertRadioData_219_to_220(const char* path) +{ + constexpr unsigned rd_size = sizeof(bin_storage_220::RadioData); + + auto rd_220 = reinterpret_cast(malloc(rd_size)); + memset(rd_220, 0, rd_size); + + uint8_t version; + const char* error = loadFileBin(path, (uint8_t *)rd_220, rd_size, &version); + if (!error) { + convertRadioData_219_to_220((void*)rd_220); + error = writeFileBin(path, (uint8_t *)rd_220, rd_size, 220); + } + + free(rd_220); + return error; +} +#else +const char* convertRadioData_219_to_220() +{ + constexpr unsigned rd_size = sizeof(bin_storage_220::RadioData); + auto rd_220 = reinterpret_cast(malloc(rd_size)); + + uint16_t read = eeLoadGeneralSettingsData(rd_220, rd_size); + if (read == rd_size) { + convertRadioData_219_to_220((void*)rd_220); + eeWriteGeneralSettingData((uint8_t *)rd_220, rd_size, true); + } else { + // ERROR: size mismatch !!! + } + + free(rd_220); + return nullptr; +} +#endif diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp new file mode 100644 index 000000000..988682de6 --- /dev/null +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -0,0 +1,117 @@ +/* + * 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 "opentx.h" +#include "datastructs_220.h" + +// see "yaml/yaml_datastructs.h" +namespace yaml_conv_220 { + const YamlNode* get_radiodata_nodes(); + const YamlNode* get_modeldata_nodes(); + const YamlNode* get_partialmodel_nodes(); +}; + +#if !defined(EEPROM_RLC) + +static const char* convertData_220_to_221(const char* path, unsigned size, + const YamlNode* root_node) +{ + auto data = reinterpret_cast(malloc(size)); + memset(data, 0, size); + + uint8_t version; + const char* error = loadFileBin(path, data, size, &version); + if (!error) { + // TODO: patch file name into .yml + error = writeFileYaml(path, root_node, data); + } + + free(data); + return error; +} + +const char* convertModelData_220_to_221(const char* path) +{ + constexpr unsigned md_size = sizeof(bin_storage_220::ModelData); + return convertData_220_to_221(path, md_size, yaml_conv_220::get_modeldata_nodes()); +} + +const char* convertRadioData_220_to_221(const char* path) +{ + constexpr unsigned rd_size = sizeof(bin_storage_220::RadioData); + return convertData_220_to_221(path, rd_size, yaml_conv_220::get_radiodata_nodes()); +} + +#else + +#include + +constexpr uint8_t MODELIDX_STRLEN = sizeof(MODEL_FILENAME_PREFIX "00"); + +static void getModelNumberStr(uint8_t idx, char* model_idx) +{ + memcpy(model_idx, MODEL_FILENAME_PREFIX, sizeof(MODEL_FILENAME_PREFIX)); + model_idx[sizeof(MODEL_FILENAME_PREFIX)-1] = '0' + idx / 10; + model_idx[sizeof(MODEL_FILENAME_PREFIX)] = '0' + idx % 10; + model_idx[sizeof(MODEL_FILENAME_PREFIX)+1] = '\0'; +} + +const char* convertModelData_220_to_221(uint8_t id) +{ + constexpr unsigned size = sizeof(bin_storage_220::ModelData); + auto data = reinterpret_cast(malloc(size)); + memset(data, 0, size); + + const char* error = nullptr; + uint16_t read = eeLoadModelData(id, data, size); + if (read == size) { + char model_idx[MODELIDX_STRLEN + sizeof(YAML_EXT)]; + getModelNumberStr(id, model_idx); + GET_FILENAME(path, MODELS_PATH, model_idx, YAML_EXT); + error = writeFileYaml(path, yaml_conv_220::get_modeldata_nodes(), data); + } else { + // ERROR: size mismatch !!! + } + + free(data); + return error; +} + +const char* convertRadioData_220_to_221() +{ + constexpr unsigned size = sizeof(bin_storage_220::RadioData); + auto data = reinterpret_cast(malloc(size)); + memset(data, 0, size); + + const char* error = nullptr; + uint16_t read = eeLoadGeneralSettingsData(data, size); + if (read == size) { + error = writeFileYaml(RADIO_SETTINGS_YAML_PATH, + yaml_conv_220::get_radiodata_nodes(), data); + } else { + // ERROR: size mismatch !!! + } + + free(data); + return error; +} + +#endif diff --git a/radio/src/storage/conversions/datastructs_220.h b/radio/src/storage/conversions/datastructs_220.h new file mode 100644 index 000000000..b4c80cb5a --- /dev/null +++ b/radio/src/storage/conversions/datastructs_220.h @@ -0,0 +1,30 @@ +/* + * 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 + +namespace bin_storage_220 { + +#include "yaml/dataconstants_220.h" +#include "yaml/datastructs_220.h" +#include "yaml/myeeprom_220.h" + +}; diff --git a/radio/src/storage/eeprom_common.h b/radio/src/storage/eeprom_common.h index af7071373..d0761b536 100644 --- a/radio/src/storage/eeprom_common.h +++ b/radio/src/storage/eeprom_common.h @@ -25,7 +25,12 @@ #define EEPROM_MIN_MODEL_SIZE 256 uint16_t eeLoadModelData(uint8_t id); +uint16_t eeLoadModelData(uint8_t index, uint8_t* data, unsigned size); +void eeWriteModelData(uint8_t index, uint8_t* data, unsigned size, bool immediately); + uint16_t eeLoadGeneralSettingsData(); +uint16_t eeLoadGeneralSettingsData(uint8_t* data, unsigned size); +void eeWriteGeneralSettingData(uint8_t* data, unsigned size, bool immediately); bool eeModelExists(uint8_t id); void eeLoadModel(uint8_t id); diff --git a/radio/src/storage/eeprom_rlc.cpp b/radio/src/storage/eeprom_rlc.cpp index d30d516bd..8f18c72a1 100644 --- a/radio/src/storage/eeprom_rlc.cpp +++ b/radio/src/storage/eeprom_rlc.cpp @@ -746,19 +746,48 @@ void RlcFile::flush() ENABLE_SYNC_WRITE(false); } +static uint16_t eeLoadData(uint8_t idx, uint8_t* data, unsigned size) +{ + memset(data, 0, size); + theFile.openRlc(idx); + return theFile.readRlc(data, size); +} + +static void eeWriteData(uint8_t idx, uint8_t typ, uint8_t* data, + unsigned size, bool immediately) +{ + theFile.writeRlc(idx, typ, data, size, immediately); +} + // For conversions ... +void eeWriteGeneralSettingData(uint8_t* data, unsigned size, bool immediately) +{ + eeWriteData(FILE_GENERAL, FILE_TYP_GENERAL, data, size, immediately); +} + +uint16_t eeLoadGeneralSettingsData(uint8_t* data, unsigned size) +{ + return eeLoadData(FILE_GENERAL, data, size); +} + uint16_t eeLoadGeneralSettingsData() { - memset(&g_eeGeneral, 0, sizeof(g_eeGeneral)); - theFile.openRlc(FILE_GENERAL); - return theFile.readRlc((uint8_t*)&g_eeGeneral, sizeof(g_eeGeneral)); + return eeLoadGeneralSettingsData((uint8_t*)&g_eeGeneral, sizeof(g_eeGeneral)); +} + +void eeWriteModelData(uint8_t index, uint8_t* data, unsigned size, bool immediately) +{ + eeWriteData(FILE_MODEL(index), FILE_TYP_MODEL, data, size, immediately); +} + +uint16_t eeLoadModelData(uint8_t index, uint8_t* data, unsigned size) +{ + return eeLoadData(FILE_MODEL(index), data, size); } uint16_t eeLoadModelData(uint8_t index) { - memset(&g_model, 0, sizeof(g_model)); - theFile.openRlc(FILE_MODEL(index)); - return theFile.readRlc((uint8_t*)&g_model, sizeof(g_model)); + return eeLoadModelData(index, (uint8_t*)&g_model, sizeof(g_model)); } bool eeLoadGeneral(bool allowFixes) diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index ec7a32375..00a6fb074 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -137,10 +137,13 @@ const char * loadModel(const char * filename, bool alarms) return error; } -#if defined(STORAGE_CONVERSIONS) + // Conversions from EEPROM are done in batch when converting the radio file. + // It is not supported on a model by model base when loaded. +#if defined(STORAGE_CONVERSIONS) && !defined(EEPROM_RLC) if (version < EEPROM_VER) { - convertModelData(version); + convertBinModelData(filename, version); } + // TODO: reload model afterwards #endif postModelLoad(alarms); diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index f5bd06052..adeda50f2 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -44,7 +44,15 @@ const char* openFileBin(const char* fullpath, FIL* file, uint16_t* size, uint8_t* version); const char* writeFileBin(const char* fullpath, const uint8_t* data, - uint16_t size); + uint16_t size, uint8_t version = EEPROM_VER); + +// open, read, and close the file +const char *loadFileBin(const char *fullpath, uint8_t *data, + uint16_t maxsize, uint8_t *version); + +// writes a complete YAML file +struct YamlNode; +const char* writeFileYaml(const char* path, const YamlNode* root_node, uint8_t* data); void getModelPath(char * path, const char * filename); diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index dcb5c24dc..404bee8d5 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -23,7 +23,8 @@ #include "modelslist.h" #include "conversions/conversions.h" -const char * writeFileBin(const char * filename, const uint8_t * data, uint16_t size) +const char *writeFileBin(const char *filename, const uint8_t *data, + uint16_t size, uint8_t version) { TRACE("writeFileBin(%s)", filename); @@ -37,7 +38,7 @@ const char * writeFileBin(const char * filename, const uint8_t * data, uint16_t } *(uint32_t*)&buf[0] = OTX_FOURCC; - buf[4] = EEPROM_VER; + buf[4] = version; buf[5] = 'M'; *(uint16_t*)&buf[6] = size; @@ -108,14 +109,14 @@ const char* openFileBin(const char * fullpath, FIL * file, uint16_t * size, uint return nullptr; } -static const char *loadFile(const char *fullpath, uint8_t *data, - uint16_t maxsize, uint8_t *version) +const char *loadFileBin(const char *fullpath, uint8_t *data, + uint16_t maxsize, uint8_t *version) { FIL file; UINT read; uint16_t size; - TRACE("loadFile(%s)", fullpath); + TRACE("loadFileBin(%s)", fullpath); const char * err = openFileBin(fullpath, &file, &size, version); if (err) @@ -136,14 +137,14 @@ const char * readModelBin(const char * filename, uint8_t * buffer, uint32_t size { char path[256]; getModelPath(path, filename); - return loadFile(path, buffer, size, version); + return loadFileBin(path, buffer, size, version); } const char * loadRadioSettingsBin(const char * path) { uint8_t version; - const char * error = loadFile(path, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral), &version); + const char * error = loadFileBin(path, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral), &version); if (error) { TRACE("loadRadioSettings error=%s", error); return error; @@ -151,7 +152,7 @@ const char * loadRadioSettingsBin(const char * path) #if defined(STORAGE_CONVERSIONS) if (version < EEPROM_VER) { - convertRadioData(version); + convertBinRadioData(path, version); } #endif diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 478c4144b..6067fb2b3 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -127,20 +127,17 @@ static bool yaml_writer(void* opaque, const char* str, size_t len) return (ctx->result == FR_OK) && (bytes_written == len); } -const char * writeGeneralSettings() +const char* writeFileYaml(const char* path, const YamlNode* root_node, uint8_t* data) { - // YAML reader - TRACE("YAML radio settings writer"); - FIL file; - FRESULT result = f_open(&file, RADIO_SETTINGS_YAML_PATH, FA_CREATE_ALWAYS | FA_WRITE); + FRESULT result = f_open(&file, path, FA_CREATE_ALWAYS | FA_WRITE); if (result != FR_OK) { return SDCARD_ERROR(result); } YamlTreeWalker tree; - tree.reset(get_radiodata_nodes(), (uint8_t*)&g_eeGeneral); + tree.reset(root_node, data); yaml_writer_ctx ctx; ctx.file = &file; @@ -157,6 +154,13 @@ const char * writeGeneralSettings() return NULL; } +const char * writeGeneralSettings() +{ + TRACE("YAML radio settings writer"); + return writeFileYaml(RADIO_SETTINGS_YAML_PATH, get_radiodata_nodes(), + (uint8_t*)&g_eeGeneral); +} + const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) { @@ -216,35 +220,10 @@ const char* readModel(const char* filename, uint8_t* buffer, uint32_t size, const char * writeModelYaml(const char* filename) { - // YAML reader TRACE("YAML model writer"); - char path[256]; getModelPath(path, filename); - - FIL file; - - FRESULT result = f_open(&file, path, FA_CREATE_ALWAYS | FA_WRITE); - if (result != FR_OK) { - return SDCARD_ERROR(result); - } - - YamlTreeWalker tree; - tree.reset(get_modeldata_nodes(), (uint8_t*)&g_model); - - yaml_writer_ctx ctx; - ctx.file = &file; - ctx.result = FR_OK; - - if (!tree.generate(yaml_writer, &ctx)) { - if (ctx.result != FR_OK) { - f_close(&file); - return SDCARD_ERROR(ctx.result); - } - } - - f_close(&file); - return NULL; + return writeFileYaml(path, get_modeldata_nodes(), (uint8_t*)&g_model); } #if !defined(STORAGE_MODELSLIST) From fc4cdfd9aef728669e76d5d8ced14400abcc8634 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 17 Oct 2021 12:54:48 +0200 Subject: [PATCH 054/110] Implement model backup/restore --- radio/src/dataconstants.h | 4 + radio/src/gui/128x64/model_select.cpp | 23 +-- radio/src/gui/212x64/model_select.cpp | 23 +-- radio/src/sdcard.h | 1 + .../conversions/yaml/dataconstants_220.h | 4 + radio/src/storage/sdcard_common.h | 2 + radio/src/storage/sdcard_yaml.cpp | 132 +++++++++++++++++- radio/src/targets/simu/simufatfs.cpp | 10 +- radio/src/translations.cpp | 2 + radio/src/translations.h | 2 + 10 files changed, 177 insertions(+), 26 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index d1f4351d7..2b86fc013 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -253,6 +253,10 @@ enum UartModes { UART_MODE_MAX = UART_MODE_COUNT-1 }; +#if defined(CLI) || defined(DEBUG) +#define UART_MODE_NONE UART_MODE_DEBUG +#endif + #define LEN_SWITCH_NAME 3 #define LEN_ANA_NAME 3 #define LEN_MODEL_FILENAME 16 diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 38fcbb12f..aeb84ee15 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -56,11 +56,19 @@ void onModelSelectMenu(const char * result) #if defined(SDCARD) else if (result == STR_BACKUP_MODEL) { storageCheck(true); // force writing of current model data before this is changed - // TODO - //POPUP_WARNING(eeBackupModel(sub)); + POPUP_WARNING(backupModel(sub)); } else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { - if (sdListFiles(MODELS_PATH, MODELS_EXT, MENU_LINE_LENGTH-1, nullptr)) + const char* ext = nullptr; + const char* path = nullptr; +#if defined(SDCARD_YAML) + ext = STR_YAML_EXT; + path = STR_BACKUP_PATH; +#else + ext = STR_MODELS_EXT; + path = STR_MODELS_PATH; +#endif + if (sdListFiles(path, ext, MENU_LINE_LENGTH-1, nullptr)) POPUP_MENU_START(onModelSelectMenu); else POPUP_WARNING(STR_NO_MODELS_ON_SD); @@ -74,11 +82,10 @@ void onModelSelectMenu(const char * result) else if (result != STR_EXIT) { // The user choosed a file on SD to restore storageCheck(true); - // TODO - //POPUP_WARNING(eeRestoreModel(sub, (char *)result)); - //if (!warningText && g_eeGeneral.currModel == sub) { - // eeLoadModel(sub); - //} + POPUP_WARNING(restoreModel(sub, (char *)result)); + if (!warningText && g_eeGeneral.currModel == sub) { + loadModel(sub); + } } #endif } diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index 8b48001a0..fee574a8e 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -46,11 +46,19 @@ void onModelSelectMenu(const char * result) } else if (result == STR_BACKUP_MODEL) { storageCheck(true); // force writing of current model data before this is changed - //TODO - //POPUP_WARNING(eeBackupModel(sub)); + POPUP_WARNING(backupModel(sub)); } else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { - if (sdListFiles(MODELS_PATH, MODELS_EXT, MENU_LINE_LENGTH-1, nullptr)) + const char* ext = nullptr; + const char* path = nullptr; +#if defined(SDCARD_YAML) + ext = STR_YAML_EXT; + path = STR_BACKUP_PATH; +#else + ext = STR_MODELS_EXT; + path = STR_MODELS_PATH; +#endif + if (sdListFiles(path, ext, MENU_LINE_LENGTH-1, nullptr)) POPUP_MENU_START(onModelSelectMenu); else POPUP_WARNING(STR_NO_MODELS_ON_SD); @@ -64,11 +72,10 @@ void onModelSelectMenu(const char * result) else if (result != STR_EXIT) { // The user choosed a file on SD to restore storageCheck(true); - // TODO - // POPUP_WARNING(eeRestoreModel(sub, (char *)result)); - // if (!warningText && g_eeGeneral.currModel == sub) { - // eeLoadModel(sub); - // } + POPUP_WARNING(restoreModel(sub, (char *)result)); + if (!warningText && g_eeGeneral.currModel == sub) { + loadModel(sub); + } } } diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index e1ab079e0..18bedfe82 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -41,6 +41,7 @@ #define FIRMWARES_PATH ROOT_PATH "FIRMWARE" #define AUTOUPDATE_FILENAME FIRMWARES_PATH PATH_SEPARATOR "autoupdate.frsk" #define EEPROMS_PATH ROOT_PATH "EEPROM" +#define BACKUP_PATH ROOT_PATH "BACKUP" #define SCRIPTS_PATH ROOT_PATH "SCRIPTS" #define WIZARD_PATH SCRIPTS_PATH PATH_SEPARATOR "WIZARD" #define THEMES_PATH ROOT_PATH "THEMES" diff --git a/radio/src/storage/conversions/yaml/dataconstants_220.h b/radio/src/storage/conversions/yaml/dataconstants_220.h index c3bfae1c4..aff0b1468 100644 --- a/radio/src/storage/conversions/yaml/dataconstants_220.h +++ b/radio/src/storage/conversions/yaml/dataconstants_220.h @@ -327,6 +327,10 @@ enum UartModes { UART_MODE_MAX = UART_MODE_COUNT-1 }; +#if defined(CLI) || defined(DEBUG) +#define UART_MODE_NONE UART_MODE_DEBUG +#endif + #define LEN_SWITCH_NAME 3 #define LEN_ANA_NAME 3 #define LEN_MODEL_FILENAME 16 diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index adeda50f2..1ce2cfb19 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -70,6 +70,8 @@ bool modelExists(uint8_t idx); bool copyModel(uint8_t dst, uint8_t src); void swapModels(uint8_t id1, uint8_t id2); int8_t deleteModel(uint8_t idx); +const char* backupModel(uint8_t idx); +const char * restoreModel(uint8_t idx, char *model_name); uint8_t findEmptyModel(uint8_t id, bool down); #endif diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 6067fb2b3..41aae5c1f 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -301,19 +301,141 @@ bool copyModel(uint8_t dst, uint8_t src) return sdCopyFile(fname_src, fname_dst); } +static void swapModelHeaders(uint8_t id1, uint8_t id2) +{ + char tmp[sizeof(g_model.header)]; + memcpy(tmp, &modelHeaders[id1], sizeof(ModelHeader)); + memcpy(&modelHeaders[id1], &modelHeaders[id2], sizeof(ModelHeader)); + memcpy(&modelHeaders[id2], tmp, sizeof(ModelHeader)); +} + void swapModels(uint8_t id1, uint8_t id2) { - //TODO + char model_idx_1[MODELIDX_STRLEN]; + char model_idx_2[MODELIDX_STRLEN]; + getModelNumberStr(id1, model_idx_1); + getModelNumberStr(id2, model_idx_2); + + GET_FILENAME(fname1, MODELS_PATH, model_idx_1, YAML_EXT); + GET_FILENAME(fname1_tmp, MODELS_PATH, model_idx_1, ".tmp"); + GET_FILENAME(fname2, MODELS_PATH, model_idx_2, YAML_EXT); + + FILINFO fno; + if (f_stat(fname2,&fno) != FR_OK) { + if (f_stat(fname1,&fno) == FR_OK) { + if (f_rename(fname1, fname2) == FR_OK) + swapModelHeaders(id1,id2); + } + return; + } + + if (f_stat(fname1,&fno) != FR_OK) { + f_rename(fname2, fname1); + return; + } + + // just in case... + f_unlink(fname1_tmp); + + if (f_rename(fname1, fname1_tmp) != FR_OK) { + TRACE("Error renaming 1"); + return; + } + + if (f_rename(fname2, fname1) != FR_OK) { + TRACE("Error renaming 2"); + return; + } + + if (f_rename(fname1_tmp, fname2) != FR_OK) { + TRACE("Error renaming 1 tmp"); + return; + } + + swapModelHeaders(id1,id2); } int8_t deleteModel(uint8_t idx) { char model_idx[MODELIDX_STRLEN]; getModelNumberStr(idx, model_idx); - - GET_FILENAME(fname, MODELS_PATH PATH_SEPARATOR MODEL_FILENAME_PREFIX, - model_idx, YAML_EXT); + GET_FILENAME(fname, MODELS_PATH, model_idx, YAML_EXT); - return f_unlink(fname) == FR_OK ? 0 : -1; + if (f_unlink(fname) != FR_OK) { + return -1; + } + + modelHeaders[idx].name[0] = '\0'; + return 0; } + +const char * backupModel(uint8_t idx) +{ + char * buf = reusableBuffer.modelsel.mainname; + + // check and create folder here + const char * error = sdCheckAndCreateDirectory(STR_BACKUP_PATH); + if (error) { + return error; + } + + strncpy(buf, modelHeaders[idx].name, sizeof(g_model.header.name)); + buf[sizeof(g_model.header.name)] = '\0'; + + int8_t i = sizeof(g_model.header.name)-1; + uint8_t len = 0; + while (i > 0) { + if (!len && buf[i]) + len = i+1; + if (len) { + if (!buf[i]) + buf[i] = '_'; + } + i--; + } + + if (len == 0) { + uint8_t num = idx + 1; + strcpy(buf, STR_MODEL); + buf[PSIZE(TR_MODEL)] = (char)((num / 10) + '0'); + buf[PSIZE(TR_MODEL) + 1] = (char)((num % 10) + '0'); + len = PSIZE(TR_MODEL) + 2; + } + +#if defined(RTCLOCK) + char * tmp = strAppendDate(&buf[len]); + len = tmp - buf; +#endif + + strcpy(&buf[len], STR_YAML_EXT); + +#ifdef SIMU + TRACE("SD-card backup filename=%s", buf); +#endif + + char model_idx[MODELIDX_STRLEN + sizeof(YAML_EXT)]; + getModelNumberStr(idx, model_idx); + strcat(model_idx, STR_YAML_EXT); + + return sdCopyFile(model_idx, STR_MODELS_PATH, buf, STR_BACKUP_PATH); +} + +const char * restoreModel(uint8_t idx, char *model_name) +{ + char * buf = reusableBuffer.modelsel.mainname; + strcpy(buf, model_name); + strcpy(&buf[strlen(buf)], STR_YAML_EXT); + + char model_idx[MODELIDX_STRLEN + sizeof(YAML_EXT)]; + getModelNumberStr(idx, model_idx); + strcat(model_idx, STR_YAML_EXT); + + const char* error = sdCopyFile(buf, STR_BACKUP_PATH, model_idx, STR_MODELS_PATH); + if (!error) { + loadModelHeader(idx, &modelHeaders[idx]); + } + + return error; +} + #endif diff --git a/radio/src/targets/simu/simufatfs.cpp b/radio/src/targets/simu/simufatfs.cpp index 72bf9b370..2a176823b 100644 --- a/radio/src/targets/simu/simufatfs.cpp +++ b/radio/src/targets/simu/simufatfs.cpp @@ -160,7 +160,7 @@ std::string convertToSimuPath(const char * path) else { result = std::string(path); } - TRACE_SIMPGMSPACE("convertToSimuPath(): %s -> %s", path, result.c_str()); + // TRACE_SIMPGMSPACE("convertToSimuPath(): %s -> %s", path, result.c_str()); return result; } @@ -179,7 +179,7 @@ std::string convertFromSimuPath(const char * path) result = "/" + result; } } - TRACE_SIMPGMSPACE("convertFromSimuPath(): %s -> %s", path, result.c_str()); + // TRACE_SIMPGMSPACE("convertFromSimuPath(): %s -> %s", path, result.c_str()); return result; } @@ -269,12 +269,12 @@ std::vector listDirectoryFiles(const std::string & dirName) std::string findTrueFileName(const std::string & path) { - TRACE_SIMPGMSPACE("findTrueFileName(%s)", path.c_str()); + // TRACE_SIMPGMSPACE("findTrueFileName(%s)", path.c_str()); std::string result; filemap_t::iterator i = fileMap.find(path); if (i != fileMap.end()) { result = i->second; - TRACE_SIMPGMSPACE("\tfound in map: %s", result.c_str()); + // TRACE_SIMPGMSPACE("\tfound in map: %s", result.c_str()); return result; } else { @@ -285,7 +285,7 @@ std::string findTrueFileName(const std::string & path) std::vector files = listDirectoryFiles(dirName); for(unsigned int i=0; i Date: Mon, 18 Oct 2021 08:48:45 +0200 Subject: [PATCH 055/110] Fixed switch position warning display on B&W --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 2 +- radio/src/strhelpers.cpp | 35 ++++++++++++++-------------- radio/src/strhelpers.h | 4 ++-- radio/src/switches.cpp | 6 ++--- 5 files changed, 24 insertions(+), 25 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 76b243894..bf10106d0 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -744,7 +744,7 @@ void menuModelSetup(event_t event) #endif } uint8_t swactive = !(g_model.switchWarningEnable & (1<> (3 * idx) & 0x07; - - *s++ = 'A' + idx; - if (state == 0) - *s = '\0'; - else { - *s++ = "x\300-\301"[state]; - *s = '\0'; - } - return dest; -} +// char * getSwitchWarningString(char * dest, swsrc_t idx) +// { +// char * s = dest; +// uint8_t state = g_model.switchWarningState >> (3*idx) & 0x07; +// *s++ = 'A' + idx; +// if (state == 0) +// *s = '\0'; +// else { +// *s++ = "x\300-\301"[state]; +// *s = '\0'; +// } +// return dest; +// } #if !defined(PCBSKY9X) char *getSwitchName(char *dest, swsrc_t idx) @@ -752,10 +751,10 @@ char *strAppendDate(char *str, bool time) #if !defined(BOOT) static char tmpHelpersString[32]; -char *getSwitchWarningString(swsrc_t idx) -{ - return getSwitchWarningString(tmpHelpersString, idx); -} +// char * getSwitchWarningString(swsrc_t idx) +// { +// return getSwitchWarningString(tmpHelpersString, idx); +// } char *getSourceString(mixsrc_t idx) { diff --git a/radio/src/strhelpers.h b/radio/src/strhelpers.h index ede5a31ee..eccca57c7 100644 --- a/radio/src/strhelpers.h +++ b/radio/src/strhelpers.h @@ -77,11 +77,11 @@ char *getSourceString(char *dest, mixsrc_t idx); char *getFlightModeString(char *dest, int8_t idx); #define SWITCH_WARNING_STR_SIZE 3 -char *getSwitchWarningString(char *dest, swsrc_t idx); +// char *getSwitchWarningString(char *dest, swsrc_t idx); char *getSourceString(mixsrc_t idx); char *getSwitchPositionName(swsrc_t idx); -char *getSwitchWarningString(swsrc_t idx); +// char *getSwitchWarningString(swsrc_t idx); char *getCurveString(int idx); char *getTimerString(int32_t tme, TimerOptions timerOptions = {.options = 0}); void splitTimer(char *s0, char *s1, char *s2, char *s3, int tme, diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 1d2825018..296f5ab9e 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -708,7 +708,7 @@ void checkSwitches() LcdFlags attr = ((states & mask) == (switches_states & mask)) ? 0 : INVERS; if (attr) { if (++numWarnings < 6) { - char c = "\300-\301"[(states & mask) >> (i*2)]; + char c = (STR_CHAR_UP "-" STR_CHAR_DOWN)[(states & mask) >> (i*2)]; drawSource(x, y, MIXSRC_FIRST_SWITCH+i, attr); lcdDrawChar(lcdNextPos, y, c, attr); x = lcdNextPos + 3; @@ -727,9 +727,9 @@ void checkSwitches() if (++numWarnings < 6) { lcdDrawTextAtIndex(x, y, STR_VSRCRAW, NUM_STICKS + 1 + i, INVERS); if (IS_POT(POT1 + i)) - lcdDrawChar(lcdNextPos, y, g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) ? 126 : 127, INVERS); + lcdDrawChar(lcdNextPos, y, g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) ? 126 : 127, INVERS); // TODO: use constants for chars else - lcdDrawChar(lcdNextPos, y, g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) ? '\300' : '\301', INVERS); + lcdDrawChar(lcdNextPos, y, g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) ? CHAR_UP : CHAR_DOWN, INVERS); x = lcdNextPos + 3; } } From da3759a2a3a064bdc8b981595d507ffc45a35247 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 18 Oct 2021 08:51:35 +0200 Subject: [PATCH 056/110] Some b&w conversion fixes (more needed for color lcd) --- radio/src/storage/conversions/conversions.cpp | 53 ++++++------------- radio/src/storage/conversions/conversions.h | 2 +- .../conversions/conversions_219_220.cpp | 2 +- .../conversions/conversions_220_221.cpp | 37 ++++++++++--- .../conversions/yaml/dataconstants_220.h | 2 +- .../conversions/yaml/yaml_datastructs.cpp | 3 ++ .../yaml/yaml_datastructs_funcs.cpp | 3 -- radio/src/storage/modelslist.h | 17 +++++- radio/src/storage/sdcard_yaml.cpp | 28 +++++++--- 9 files changed, 90 insertions(+), 57 deletions(-) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index df03e4d3a..34d03f6c6 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -29,7 +29,7 @@ #include "storage/sdcard_yaml.h" #endif -#if !defined(EEPROM_RLC) +#if defined(STORAGE_MODELSLIST) static void drawProgressScreen(const char* filename, int progress, int total) { #if defined(COLORLCD) @@ -71,8 +71,7 @@ void convertBinRadioData(const char * path, int version) AU_NONE); // Load models list before converting - // TODO: force old .txt format - modelslist.load(); + modelslist.load(ModelsList::Format::txt); unsigned converted = 0; auto to_convert = modelslist.getModelsCount() + 1; @@ -82,16 +81,12 @@ void convertBinRadioData(const char * path, int version) #if STORAGE_CONVERSIONS < 220 if (version == 219) { - // TODO: alloc specific structure for destination convertRadioData_219_to_220(path); } #endif #if STORAGE_CONVERSIONS < 220 if (version == 220) { convertRadioData_220_to_221(path); - // g_eeGeneral.version = EEPROM_VER; - // storageDirty(EE_GENERAL); - // storageCheck(true); } #endif converted++; @@ -110,31 +105,16 @@ void convertBinRadioData(const char * path, int version) TRACE("converting '%s' (%d/%d)", filename, converted, to_convert); drawProgressScreen(filename, converted, to_convert); - error = readModelBin(filename, (uint8_t *)&g_model, sizeof(g_model), &model_version); + // read only the version number (size=0) + error = readModelBin(filename, nullptr, 0, &model_version); if (!error) { // TODO: error handling - convertBinModelData(filename, model_version); - -#if defined(SDCARD_YAML) - // patch model filename - const char* ext = strrchr(filename, '.'); - if ((ext != nullptr) && !strncmp(ext, MODELS_EXT, 4)) { - memcpy((void*)ext, (void*)YAML_EXT, sizeof(YAML_EXT) - 1); + error = convertBinModelData(filename, model_version); + if (error) { + // add error counter? + continue; } - // in case it's the current model, patch it as well - if (!strncmp(filename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME)) { - strncpy(g_eeGeneral.currModelFilename, filename, LEN_MODEL_FILENAME+1); - } - // and write to YAML file - error = writeModelYaml(filename); -#else - char path[256]; - getModelPath(path, filename); - - error = writeFileBin(path, (uint8_t *)&g_model, sizeof(g_model)); -#endif - //TODO: what should be done with this error? } converted++; @@ -145,10 +125,8 @@ void convertBinRadioData(const char * path, int version) } } -#if defined(SDCARD_YAML) - modelslist.save(); - storageDirty(EE_GENERAL); - storageCheck(true); +#if defined(SDCARD_YAML) || defined(STORAGE_MODELSLIST) + modelslist.save(ModelsList::Format::yaml); #endif // reload models list @@ -156,23 +134,25 @@ void convertBinRadioData(const char * path, int version) modelslist.load(); } -void convertBinModelData(const char* filename, int version) +const char* convertBinModelData(const char* filename, int version) { TRACE("convertModelData(%s,%d)", filename); #if STORAGE_CONVERSIONS < 220 if (version == 219) { - convertModelData_219_to_220(filename); + const char* error = convertModelData_219_to_220(filename); + if (error) return error; version = 220; } #endif #if STORAGE_CONVERSIONS < 221 if (version == 220) { - convertModelData_220_to_221(filename); + const char* error = convertModelData_220_to_221(filename); + if (error) return error; version = 221; } #endif - // TODO: error handling + return nullptr; } #endif @@ -225,7 +205,6 @@ bool eeConvert() RAISE_ALERT(STR_STORAGE_WARNING, STR_EEPROM_CONVERTING, NULL, AU_NONE); // General Settings conversion - eeLoadGeneralSettingsData(); int version = conversionVersionStart; #if STORAGE_CONVERSIONS < 220 diff --git a/radio/src/storage/conversions/conversions.h b/radio/src/storage/conversions/conversions.h index 0b0692a38..e70560027 100644 --- a/radio/src/storage/conversions/conversions.h +++ b/radio/src/storage/conversions/conversions.h @@ -21,7 +21,7 @@ // Entry points for converting radio & model data void convertBinRadioData(const char * path, int version); -void convertBinModelData(const char * path, int version); +const char* convertBinModelData(const char * path, int version); bool eeConvert(); void eeConvertModel(int id, int version); diff --git a/radio/src/storage/conversions/conversions_219_220.cpp b/radio/src/storage/conversions/conversions_219_220.cpp index 836db8363..a045aafa6 100644 --- a/radio/src/storage/conversions/conversions_219_220.cpp +++ b/radio/src/storage/conversions/conversions_219_220.cpp @@ -344,7 +344,7 @@ const char* convertRadioData_219_to_220() auto rd_220 = reinterpret_cast(malloc(rd_size)); uint16_t read = eeLoadGeneralSettingsData(rd_220, rd_size); - if (read == rd_size) { + if (read >= rd_size - 1) { // 220 started with 1 byte less than 219 convertRadioData_219_to_220((void*)rd_220); eeWriteGeneralSettingData((uint8_t *)rd_220, rd_size, true); } else { diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp index 988682de6..25abaed03 100644 --- a/radio/src/storage/conversions/conversions_220_221.cpp +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -29,10 +29,24 @@ namespace yaml_conv_220 { const YamlNode* get_partialmodel_nodes(); }; -#if !defined(EEPROM_RLC) +#if defined(STORAGE_MODELSLIST) -static const char* convertData_220_to_221(const char* path, unsigned size, - const YamlNode* root_node) +void patchFilenameToYaml(char* str) +{ + constexpr unsigned bin_len = sizeof(MODELS_EXT) - 1; + constexpr unsigned yml_len = sizeof(YAML_EXT) - 1; + + // patch file extension + const char* ext = strrchr(path, '.'); + if (ext && (strlen(ext) == bin_len) && + !strncmp(ext, STR_MODELS_EXT, bin_len)) { + memcpy((void*)ext, (void*)STR_YAML_EXT, yml_len + 1); + } +} + +static const char* convertData_220_to_221( + const char* path, unsigned size, const YamlNode* root_node, + void (*patchBinary)(uint8_t*) = nullptr) { auto data = reinterpret_cast(malloc(size)); memset(data, 0, size); @@ -40,7 +54,9 @@ static const char* convertData_220_to_221(const char* path, unsigned size, uint8_t version; const char* error = loadFileBin(path, data, size, &version); if (!error) { - // TODO: patch file name into .yml + if (patchBinary) patchBinary(data); + + patchFilenameToYaml(path); error = writeFileYaml(path, root_node, data); } @@ -51,13 +67,22 @@ static const char* convertData_220_to_221(const char* path, unsigned size, const char* convertModelData_220_to_221(const char* path) { constexpr unsigned md_size = sizeof(bin_storage_220::ModelData); - return convertData_220_to_221(path, md_size, yaml_conv_220::get_modeldata_nodes()); + return convertData_220_to_221(path, md_size, + yaml_conv_220::get_modeldata_nodes()); +} + +static void patchCurrentModelFilename(uint8_t* data) +{ + auto rd = reinterpret_cast(data); + patchFilenameToYaml(rd->currModelFilename); } const char* convertRadioData_220_to_221(const char* path) { constexpr unsigned rd_size = sizeof(bin_storage_220::RadioData); - return convertData_220_to_221(path, rd_size, yaml_conv_220::get_radiodata_nodes()); + return convertData_220_to_221(path, rd_size, + yaml_conv_220::get_radiodata_nodes(), + patchCurrentModelFilename); } #else diff --git a/radio/src/storage/conversions/yaml/dataconstants_220.h b/radio/src/storage/conversions/yaml/dataconstants_220.h index aff0b1468..05c1dc337 100644 --- a/radio/src/storage/conversions/yaml/dataconstants_220.h +++ b/radio/src/storage/conversions/yaml/dataconstants_220.h @@ -74,7 +74,7 @@ #define STORAGE_NUM_SLIDERS 2 #endif -// #define NUM_XPOTS STORAGE_NUM_POTS +#define NUM_XPOTS STORAGE_NUM_POTS // #define NUM_TRIMS 4 // #define NUM_MOUSE_ANALOGS 0 #define STORAGE_NUM_MOUSE_ANALOGS 0 diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp index 384fa6755..1206b4a7d 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp @@ -25,6 +25,9 @@ #include +#include +#include + namespace yaml_conv_220 { #include "yaml_datastructs_funcs.cpp" diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 537a1a625..693b6d068 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -19,9 +19,6 @@ * GNU General Public License for more details. */ -#include -#include - #include "dataconstants_220.h" #include "datastructs_220.h" #include "myeeprom_220.h" diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 1d9bef172..cf458b577 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -98,11 +98,24 @@ class ModelsList public: + enum class Format { + txt, +#if defined(SDCARD_YAML) + yaml, + yaml_txt, + load_default = yaml_txt, + save_default = yaml, +#else + load_default = txt, + save_default = txt, +#endif + }; + ModelsList(); ~ModelsList(); - bool load(); - void save(); + bool load(Format fmt = Format::load_default); + void save(Format fmt = Format::save_default); void clear(); const std::list & getCategories() const diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 41aae5c1f..8283bacb4 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -32,9 +32,12 @@ #include "yaml/yaml_datastructs.h" #if defined(EEPROM_RLC) + #include "storage/eeprom_common.h" #include "storage/eeprom_rlc.h" #endif +#include "storage/conversions/conversions.h" + const char * readYamlFile(const char* fullpath, const YamlParserCalls* calls, void* parser_ctx) { FIL file; @@ -68,7 +71,7 @@ const char * readYamlFile(const char* fullpath, const YamlParserCalls* calls, vo // Generic storage interface // -#if !defined(EEPROM_RLC) +#if defined(STORAGE_MODELSLIST) void storageCreateModelsList() { modelslist.clear(); @@ -97,14 +100,27 @@ const char * loadRadioSettings() { FILINFO fno; if (f_stat(RADIO_SETTINGS_YAML_PATH, &fno) != FR_OK) { -#if !defined(EEPROM_RLC) - return loadRadioSettingsBin(); -#else +#if defined(STORAGE_MODELSLIST) + uint8_t version; + const char* error = loadFileBin(RADIO_SETTINGS_PATH, nullptr, 0, &version); + if (error) { + TRACE("loadRadioSettings error=%s", error); + return error; + } + convertBinRadioData(RADIO_SETTINGS_PATH, version); +#elif defined(EEPROM_RLC) // Load from EEPROM - if (!eepromOpen() || !eeLoadGeneral(true)) { + uint8_t versions[3]; + uint16_t* variant = (uint16_t*)&versions[1]; + if (!eepromOpen() || (eeLoadGeneralSettingsData(versions, 3) != 3) + || (*variant != EEPROM_VARIANT)) { return "ERROR"; } - return nullptr; + g_eeGeneral.version = versions[0]; + g_eeGeneral.variant = *variant; + eeConvert(); +#else + #error "Unsupported conversion format" #endif } From 4c8db5816658fcf69b95bf6c4d5d94b1657578fc Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 18 Oct 2021 09:13:42 +0200 Subject: [PATCH 057/110] Fixes compilation for color lcd --- radio/src/storage/conversions/conversions.cpp | 2 +- radio/src/storage/conversions/conversions_220_221.cpp | 10 +++++++--- radio/src/storage/modelslist.cpp | 7 +++++-- radio/src/storage/modelslist.h | 4 +--- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 34d03f6c6..6b38c49bb 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -126,7 +126,7 @@ void convertBinRadioData(const char * path, int version) } #if defined(SDCARD_YAML) || defined(STORAGE_MODELSLIST) - modelslist.save(ModelsList::Format::yaml); + modelslist.save(); #endif // reload models list diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp index 25abaed03..342cb0774 100644 --- a/radio/src/storage/conversions/conversions_220_221.cpp +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -37,7 +37,7 @@ void patchFilenameToYaml(char* str) constexpr unsigned yml_len = sizeof(YAML_EXT) - 1; // patch file extension - const char* ext = strrchr(path, '.'); + const char* ext = strrchr(str, '.'); if (ext && (strlen(ext) == bin_len) && !strncmp(ext, STR_MODELS_EXT, bin_len)) { memcpy((void*)ext, (void*)STR_YAML_EXT, yml_len + 1); @@ -56,8 +56,12 @@ static const char* convertData_220_to_221( if (!error) { if (patchBinary) patchBinary(data); - patchFilenameToYaml(path); - error = writeFileYaml(path, root_node, data); + char output_fname[FF_MAX_LFN+1]; + strncpy(output_fname, path, FF_MAX_LFN); + output_fname[FF_MAX_LFN] = '\0'; + + patchFilenameToYaml(output_fname); + error = writeFileYaml(output_fname, root_node, data); } free(data); diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 500536c07..c956741f0 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -370,17 +370,20 @@ bool ModelsList::loadYaml() } #endif -bool ModelsList::load() +bool ModelsList::load(Format fmt) { if (loaded) return true; bool res = false; #if !defined(SDCARD_YAML) + (void)fmt; res = loadTxt(); #else FILINFO fno; - if (f_stat(RADIO_MODELSLIST_YAML_PATH, &fno) != FR_OK) { + if (fmt == Format::txt || + (fmt == Format::yaml_txt && + f_stat(RADIO_MODELSLIST_YAML_PATH, &fno) != FR_OK)) { res = loadTxt(); } else { res = loadYaml(); diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index cf458b577..0383081c4 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -104,10 +104,8 @@ public: yaml, yaml_txt, load_default = yaml_txt, - save_default = yaml, #else load_default = txt, - save_default = txt, #endif }; @@ -115,7 +113,7 @@ public: ~ModelsList(); bool load(Format fmt = Format::load_default); - void save(Format fmt = Format::save_default); + void save(); void clear(); const std::list & getCategories() const From fb4f5554427fb9ba8ff999ff5a0f564126f6eab6 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 18 Oct 2021 10:39:34 +0200 Subject: [PATCH 058/110] Fix color lcd conversions --- radio/src/storage/conversions/conversions.cpp | 11 +++++++++-- radio/src/storage/conversions/conversions_219_220.cpp | 2 +- .../src/storage/conversions/yaml/dataconstants_220.h | 10 ++++++++++ .../conversions/yaml/yaml_datastructs_funcs.cpp | 2 ++ radio/src/storage/yaml/yaml_datastructs_funcs.cpp | 2 ++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 6b38c49bb..a1f5a013f 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -82,11 +82,13 @@ void convertBinRadioData(const char * path, int version) #if STORAGE_CONVERSIONS < 220 if (version == 219) { convertRadioData_219_to_220(path); + version = 220; } #endif #if STORAGE_CONVERSIONS < 220 if (version == 220) { convertRadioData_220_to_221(path); + version = 221; } #endif converted++; @@ -137,17 +139,22 @@ void convertBinRadioData(const char * path, int version) const char* convertBinModelData(const char* filename, int version) { TRACE("convertModelData(%s,%d)", filename); + + char path[FF_MAX_LFN + 1]; + memcpy(path, MODELS_PATH, sizeof(MODELS_PATH)-1); + path[sizeof(MODELS_PATH)-1] = '/'; + strcat(&path[sizeof(MODELS_PATH)], filename); #if STORAGE_CONVERSIONS < 220 if (version == 219) { - const char* error = convertModelData_219_to_220(filename); + const char* error = convertModelData_219_to_220(path); if (error) return error; version = 220; } #endif #if STORAGE_CONVERSIONS < 221 if (version == 220) { - const char* error = convertModelData_220_to_221(filename); + const char* error = convertModelData_220_to_221(path); if (error) return error; version = 221; } diff --git a/radio/src/storage/conversions/conversions_219_220.cpp b/radio/src/storage/conversions/conversions_219_220.cpp index a045aafa6..c65b1eed2 100644 --- a/radio/src/storage/conversions/conversions_219_220.cpp +++ b/radio/src/storage/conversions/conversions_219_220.cpp @@ -301,7 +301,7 @@ void convertRadioData_219_to_220(void* data) // Clear CustomScreenData + TopBarPersistentData // as they cannot be converted (missing option types) strcpy(settings.themeName, defaultTheme->getName()); - defaultTheme->init(); // TODO: just dump the data into the settings + memset(&settings.themeData, 0, sizeof(settings.themeData)); #endif for (int i = 0; i < NUM_SWITCHES_219; ++i) { diff --git a/radio/src/storage/conversions/yaml/dataconstants_220.h b/radio/src/storage/conversions/yaml/dataconstants_220.h index 05c1dc337..a627c1186 100644 --- a/radio/src/storage/conversions/yaml/dataconstants_220.h +++ b/radio/src/storage/conversions/yaml/dataconstants_220.h @@ -33,6 +33,9 @@ #define STORAGE_NUM_SLIDERS 0 #define STORAGE_NUM_MOUSE_ANALOGS 0 +#define NUM_POTS 2 +#define NUM_XPOTS 0 + #elif defined(PCBHORUS) #define STORAGE_NUM_SWITCHES 10 @@ -40,6 +43,13 @@ #define STORAGE_NUM_SLIDERS 4 #define STORAGE_NUM_MOUSE_ANALOGS 2 +#if defined(PCBX10) + #define NUM_POTS 5 +#else + #define NUM_POTS 3 +#endif +#define NUM_XPOTS NUM_POTS + #elif defined(PCBTARANIS) #if defined(PCBX9LITE) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 693b6d068..8e62f8285 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -94,6 +94,8 @@ static uint8_t select_zov(uint8_t* data, uint32_t bitoffs) data += bitoffs >> 3UL; data -= sizeof(ZoneOptionValueEnum); ZoneOptionValueEnum* p_zovt = (ZoneOptionValueEnum*)data; + if (*p_zovt > ZOV_String) + return 0; return *p_zovt; } #endif diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 8e5c46022..b59c0155c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -132,6 +132,8 @@ static uint8_t select_zov(uint8_t* data, uint32_t bitoffs) data += bitoffs >> 3UL; data -= sizeof(ZoneOptionValueEnum); ZoneOptionValueEnum* p_zovt = (ZoneOptionValueEnum*)data; + if (*p_zovt > ZOV_String) + return 0; return *p_zovt; } #endif From 0cf677c8ee15d407a8053dd51b381a378ed2e918 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 18 Oct 2021 11:38:53 +0200 Subject: [PATCH 059/110] Fixed convert model path (color lcd) --- radio/src/storage/conversions/conversions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index a1f5a013f..273ad850c 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -138,12 +138,12 @@ void convertBinRadioData(const char * path, int version) const char* convertBinModelData(const char* filename, int version) { - TRACE("convertModelData(%s,%d)", filename); + TRACE("convertModelData(%s)", filename); char path[FF_MAX_LFN + 1]; memcpy(path, MODELS_PATH, sizeof(MODELS_PATH)-1); path[sizeof(MODELS_PATH)-1] = '/'; - strcat(&path[sizeof(MODELS_PATH)], filename); + strcpy(&path[sizeof(MODELS_PATH)], filename); #if STORAGE_CONVERSIONS < 220 if (version == 219) { From b9b510e36705a92d8120db627338d8576c21f2f3 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 18 Oct 2021 11:39:45 +0200 Subject: [PATCH 060/110] custom functions: output "play" for functions with string, "all" for the others --- .../conversions/yaml/yaml_datastructs_funcs.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 8e62f8285..df913e9c2 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -138,8 +138,19 @@ static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) static uint8_t select_custom_fn(uint8_t* data, uint32_t bitoffs) { - // always use 'all' - //TODO + data += bitoffs >> 3UL; + data -= offsetof(CustomFunctionData, all); + + auto cf = reinterpret_cast(data); + switch(cf->func) { + case FUNC_PLAY_TRACK: + case FUNC_BACKGND_MUSIC: + case FUNC_PLAY_SCRIPT: + // play: 0 + return 0; + } + + // all: 1 return 1; } From 7b6749ebee4ccbc72e6a2a890fb885e0907b0fcf Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 18 Oct 2021 12:13:59 +0200 Subject: [PATCH 061/110] Fixed flight mode reading/writing --- radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp | 2 +- radio/src/storage/yaml/yaml_datastructs_funcs.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index df913e9c2..0aa4bfc21 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -441,7 +441,7 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, && sval <= SWSRC_LAST_FLIGHT_MODE) { wf(opaque, "FM", 2); - str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE + 1); + str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE); return wf(opaque,str, strlen(str)); } else if (sval >= SWSRC_FIRST_SENSOR diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index b59c0155c..58ca54181 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -448,7 +448,7 @@ static uint32_t r_swtchSrc(const YamlNode* node, const char* val, uint8_t val_le && val[1] == 'M' && (val[2] >= '0' && val[2] <= '9')) { - ival = SWSRC_FIRST_FLIGHT_MODE + (val[3] - '0'); + ival = SWSRC_FIRST_FLIGHT_MODE + (val[2] - '0'); } else if (val_len >= 2 && val[0] == 'T' @@ -499,7 +499,7 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, && sval <= SWSRC_LAST_FLIGHT_MODE) { wf(opaque, "FM", 2); - str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE + 1); + str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE); return wf(opaque,str, strlen(str)); } else if (sval >= SWSRC_FIRST_SENSOR From f932e9e12c44a8e9b56d092a95e92626ac27a2da Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 19 Oct 2021 09:07:41 +0200 Subject: [PATCH 062/110] Further confined v220 data structures --- radio/src/audio.h | 1 - radio/src/gui/colorlcd/theme_manager.cpp | 12 +++- radio/src/gui/colorlcd/theme_manager.h | 9 ++- radio/src/gui/common/stdlcd/view_text.cpp | 68 ++++++++++++++++++ radio/src/sdcard.cpp | 67 ------------------ radio/src/sdcard.h | 12 ++-- .../conversions/conversions_219_220.cpp | 70 +++++++++---------- .../conversions/conversions_220_221.cpp | 12 +++- .../src/storage/conversions/datastructs_220.h | 3 + radio/src/storage/modelslist.cpp | 7 ++ radio/src/storage/modelslist.h | 5 ++ radio/src/storage/sdcard_common.h | 4 +- radio/src/storage/yaml/yaml_modelslist.cpp | 2 + radio/src/telemetry/multi.h | 2 + radio/src/translations.h | 26 +++++-- 15 files changed, 175 insertions(+), 125 deletions(-) diff --git a/radio/src/audio.h b/radio/src/audio.h index 9782c855e..57bbcf86c 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -615,7 +615,6 @@ void pushUnit(uint8_t unit, uint8_t idx, uint8_t id); void playModelName(); #define I18N_PLAY_FUNCTION(lng, x, ...) void lng ## _ ## x(__VA_ARGS__, uint8_t id) -#define PLAY_FUNCTION(x, ...) void x(__VA_ARGS__, uint8_t id) #define PUSH_NUMBER_PROMPT(p) pushPrompt((p), id) #define PUSH_UNIT_PROMPT(p, i) pushUnit((p), (i), id) #define PLAY_NUMBER(n, u, a) playNumber((n), (u), (a), id) diff --git a/radio/src/gui/colorlcd/theme_manager.cpp b/radio/src/gui/colorlcd/theme_manager.cpp index a6365996a..35388a5ab 100644 --- a/radio/src/gui/colorlcd/theme_manager.cpp +++ b/radio/src/gui/colorlcd/theme_manager.cpp @@ -18,7 +18,12 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + #include "theme_manager.h" +#include "theme.h" + +#include +#include ThemePersistance themePersistance; @@ -93,7 +98,7 @@ void ThemeFile::scanFile() char *plvalue; char *prvalue; - strncpy(lvalue, line, min((int)(ptr - line), 63)); + strncpy(lvalue, line, std::min((int)(ptr - line), 63)); lvalue[ptr - line] = '\0'; strncpy(rvalue, ptr + 1, 63); plvalue = trim(lvalue); @@ -226,6 +231,9 @@ void ThemeFile::applyTheme() OpenTxTheme::instance()->update(false); } +// not sure why this is needed... +constexpr unsigned MAX_SD_FILE_LENGTH = 64; + void ThemePersistance::scanForThemes() { TRACE("in scanForThemes"); @@ -251,7 +259,7 @@ void ThemePersistance::scanForThemes() if (res != FR_OK || fno.fname[0] == 0) break; // Break on error or end of dir - if (strlen((const char *)fno.fname) > SD_SCREEN_FILE_LENGTH) continue; + if (strlen((const char *)fno.fname) > MAX_SD_FILE_LENGTH) continue; if (fno.fattrib & AM_DIR) continue; TRACE("scanForThemes: found file %s", fno.fname); diff --git a/radio/src/gui/colorlcd/theme_manager.h b/radio/src/gui/colorlcd/theme_manager.h index b466a0553..eb61624e8 100644 --- a/radio/src/gui/colorlcd/theme_manager.h +++ b/radio/src/gui/colorlcd/theme_manager.h @@ -18,15 +18,22 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + #pragma once -#include + #include #include +#include #include + +#include "debug.h" #include "sdcard.h" #include "colors.h" #include "str_functions.h" +// sdReadir: used to be in "sdcard.h" (another GPL violation...) +#include "libopenui_file.h" + class ThemePersistance; extern ThemePersistance themePersistance; diff --git a/radio/src/gui/common/stdlcd/view_text.cpp b/radio/src/gui/common/stdlcd/view_text.cpp index 0e767e698..a70c48879 100644 --- a/radio/src/gui/common/stdlcd/view_text.cpp +++ b/radio/src/gui/common/stdlcd/view_text.cpp @@ -29,6 +29,74 @@ #define EVT_KEY_PREVIOUS_LINE EVT_KEY_FIRST(KEY_UP) #endif +constexpr uint32_t TEXT_FILE_MAXSIZE = 2048; + +static void sdReadTextFile(const char * filename, char lines[TEXT_VIEWER_LINES][LCD_COLS + 1], int & lines_count) +{ + FIL file; + int result; + char c; + unsigned int sz; + int line_length = 0; + uint8_t escape = 0; + char escape_chars[4] = {0}; + int current_line = 0; + + memclear(lines, TEXT_VIEWER_LINES * (LCD_COLS + 1)); + + result = f_open(&file, filename, FA_OPEN_EXISTING | FA_READ); + if (result == FR_OK) { + for (uint32_t i = 0; i < TEXT_FILE_MAXSIZE && f_read(&file, &c, 1, &sz) == FR_OK && sz == 1 && (lines_count == 0 || current_line - menuVerticalOffset < int(TEXT_VIEWER_LINES)); i++) { + if (c == '\n') { + ++current_line; + line_length = 0; + escape = 0; + } + else if (c != '\r' && current_line >= menuVerticalOffset && current_line - menuVerticalOffset < int(TEXT_VIEWER_LINES) && line_length < LCD_COLS) { + if (c == '\\' && escape == 0) { + escape = 1; + continue; + } + else if (c != '\\' && escape > 0 && escape < sizeof(escape_chars)) { + escape_chars[escape - 1] = c; + if (escape == 2 && !strncmp(escape_chars, "up", 2)) { + c = CHAR_UP; + } + else if (escape == 2 && !strncmp(escape_chars, "dn", 2)) { + c = CHAR_DOWN; + } + else if (escape == 3) { + int val = atoi(escape_chars); + if (val >= 200 && val < 225) { + c = '\200' + val - 200; + } + } + else { + escape++; + continue; + } + } + else if (c=='~') { + c = 'z'+1; + } + else if (c=='\t') { + c = 0x1D; //tab + } + escape = 0; + lines[current_line-menuVerticalOffset][line_length++] = c; + } + } + if (c != '\n') { + current_line += 1; + } + f_close(&file); + } + + if (lines_count == 0) { + lines_count = current_line; + } +} + void readModelNotes() { LED_ERROR_BEGIN(); diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index 62c193c15..e3ad2838e 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -363,73 +363,6 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen return popupMenuItemsCount; } -constexpr uint32_t TEXT_FILE_MAXSIZE = 2048; - -void sdReadTextFile(const char * filename, char lines[TEXT_VIEWER_LINES][LCD_COLS + 1], int & lines_count) -{ - FIL file; - int result; - char c; - unsigned int sz; - int line_length = 0; - uint8_t escape = 0; - char escape_chars[4] = {0}; - int current_line = 0; - - memclear(lines, TEXT_VIEWER_LINES * (LCD_COLS + 1)); - - result = f_open(&file, filename, FA_OPEN_EXISTING | FA_READ); - if (result == FR_OK) { - for (uint32_t i = 0; i < TEXT_FILE_MAXSIZE && f_read(&file, &c, 1, &sz) == FR_OK && sz == 1 && (lines_count == 0 || current_line - menuVerticalOffset < int(TEXT_VIEWER_LINES)); i++) { - if (c == '\n') { - ++current_line; - line_length = 0; - escape = 0; - } - else if (c != '\r' && current_line >= menuVerticalOffset && current_line - menuVerticalOffset < int(TEXT_VIEWER_LINES) && line_length < LCD_COLS) { - if (c == '\\' && escape == 0) { - escape = 1; - continue; - } - else if (c != '\\' && escape > 0 && escape < sizeof(escape_chars)) { - escape_chars[escape - 1] = c; - if (escape == 2 && !strncmp(escape_chars, "up", 2)) { - c = CHAR_UP; - } - else if (escape == 2 && !strncmp(escape_chars, "dn", 2)) { - c = CHAR_DOWN; - } - else if (escape == 3) { - int val = atoi(escape_chars); - if (val >= 200 && val < 225) { - c = '\200' + val - 200; - } - } - else { - escape++; - continue; - } - } - else if (c=='~') { - c = 'z'+1; - } - else if (c=='\t') { - c = 0x1D; //tab - } - escape = 0; - lines[current_line-menuVerticalOffset][line_length++] = c; - } - } - if (c != '\n') { - current_line += 1; - } - f_close(&file); - } - - if (lines_count == 0) { - lines_count = current_line; - } -} #endif // !LIBOPENUI #if defined(SDCARD) diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 18bedfe82..825f57976 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -22,11 +22,12 @@ #ifndef _SDCARD_H_ #define _SDCARD_H_ -#if !defined(SIMU) #include "ff.h" -#endif -#include "opentx.h" +extern FATFS g_FATFS_Obj; +extern FIL g_oLogFile; + +#include "translations.h" #define PATH_SEPARATOR "/" #define ROOT_PATH PATH_SEPARATOR @@ -104,9 +105,6 @@ const char RADIO_SETTINGS_YAML_PATH[] = RADIO_PATH PATH_SEPARATOR "radio.yml"; filename[sizeof(path)+sizeof(var)] = '\0'; \ strcat(&filename[sizeof(path)], ext) -extern FATFS g_FATFS_Obj; -extern FIL g_oLogFile; - extern uint8_t logDelay; void logsInit(); void logsClose(); @@ -179,6 +177,4 @@ const char * sdCopyFile(const char * srcFilename, const char * srcDir, const cha #define LIST_SD_FILE_EXT 2 bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen, const char * selection, uint8_t flags=0); -void sdReadTextFile(const char * filename, char lines[NUM_BODY_LINES][LCD_COLS + 1], int & lines_count); - #endif // _SDCARD_H_ diff --git a/radio/src/storage/conversions/conversions_219_220.cpp b/radio/src/storage/conversions/conversions_219_220.cpp index c65b1eed2..d65d528af 100644 --- a/radio/src/storage/conversions/conversions_219_220.cpp +++ b/radio/src/storage/conversions/conversions_219_220.cpp @@ -19,16 +19,20 @@ * GNU General Public License for more details. */ -#include "opentx.h" +#include +#include + +#include "definitions.h" #include "datastructs_219.h" #include "datastructs_220.h" -#if defined(COLORLCD) -#include "theme.h" -#endif +#include "debug.h" +#include "strhelpers.h" #if defined(EEPROM) || defined(EEPROM_RLC) -#include + #include +#else + #include #endif // @@ -85,7 +89,7 @@ // -> ModelData: +1284 (CustomScreenData x 5 = 1200; TopBar::PersistentData: +84) // -typedef TimerData TimerData_v220; +typedef bin_storage_220::TimerData TimerData_v220; static void convertToStr(char* str, size_t len) { @@ -99,11 +103,6 @@ static void convertToStr(char* str, size_t len) } } -#if defined(COLORLCD) -extern const LayoutFactory * defaultLayout; -extern OpenTxTheme * defaultTheme; -#endif - void convertModelData_219_to_220(void* data) { constexpr unsigned md_size = sizeof(bin_storage_220::ModelData); @@ -125,17 +124,17 @@ void convertModelData_219_to_220(void* data) // Convert mode - if (timer_219.mode >= TMRMODE_START) { + if (timer_219.mode >= bin_storage_220::TMRMODE_START) { timer_219.mode += 1; } - if (timer_219.mode < TMRMODE_COUNT + if (timer_219.mode < bin_storage_220::TMRMODE_COUNT && timer_219.mode >=0) { timer.mode = timer_219.mode; } else { - timer.mode = TMRMODE_ON; + timer.mode = bin_storage_220::TMRMODE_ON; if (timer_219.mode > 0) - timer.swtch = timer_219.mode - (TMRMODE_COUNT - 1); + timer.swtch = timer_219.mode - (bin_storage_220::TMRMODE_COUNT - 1); else timer.swtch = timer_219.mode; } @@ -219,33 +218,28 @@ void convertModelData_219_to_220(void* data) sizeof(newModel.screenData) + sizeof(newModel.topbarData)); - if (defaultLayout) { - strcpy(newModel.screenData[0].LayoutId, "Layout2P1"); + strcpy(newModel.screenData[0].LayoutId, "Layout2P1"); + auto persistentData = &newModel.screenData[0].layoutData; - // TODO: copy the raw structure for the default layout in version 220 - //defaultLayout->initPersistentData(&newModel.screenData[0].layoutData, true); - auto persistentData = &newModel.screenData[0].layoutData; + // top bar + persistentData->options[0].type = bin_storage_220::ZOV_Bool; + persistentData->options[0].value.boolValue = true; - // top bar - persistentData->options[0].type = bin_storage_220::ZOV_Bool; - persistentData->options[0].value.boolValue = true; + // flight mode + persistentData->options[1].type = bin_storage_220::ZOV_Bool; + persistentData->options[1].value.boolValue = true; - // flight mode - persistentData->options[1].type = bin_storage_220::ZOV_Bool; - persistentData->options[1].value.boolValue = true; + // sliders + persistentData->options[2].type = bin_storage_220::ZOV_Bool; + persistentData->options[2].value.boolValue = true; - // sliders - persistentData->options[2].type = bin_storage_220::ZOV_Bool; - persistentData->options[2].value.boolValue = true; + // trims + persistentData->options[3].type = bin_storage_220::ZOV_Bool; + persistentData->options[3].value.boolValue = true; - // trims - persistentData->options[3].type = bin_storage_220::ZOV_Bool; - persistentData->options[3].value.boolValue = true; - - // mirrored - persistentData->options[4].type = bin_storage_220::ZOV_Bool; - persistentData->options[4].value.boolValue = false; - } + // mirrored + persistentData->options[4].type = bin_storage_220::ZOV_Bool; + persistentData->options[4].value.boolValue = false; #endif free(oldModelAllocated); } @@ -300,7 +294,7 @@ void convertRadioData_219_to_220(void* data) #if defined(COLORLCD) // Clear CustomScreenData + TopBarPersistentData // as they cannot be converted (missing option types) - strcpy(settings.themeName, defaultTheme->getName()); + strcpy(settings.themeName, "EdgeTX"); memset(&settings.themeData, 0, sizeof(settings.themeData)); #endif diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp index 342cb0774..a9fd697e4 100644 --- a/radio/src/storage/conversions/conversions_220_221.cpp +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -19,9 +19,19 @@ * GNU General Public License for more details. */ -#include "opentx.h" +#include +#include + +#include "definitions.h" #include "datastructs_220.h" +#include "sdcard.h" + +#include + +using namespace bin_storage_220; +#include + // see "yaml/yaml_datastructs.h" namespace yaml_conv_220 { const YamlNode* get_radiodata_nodes(); diff --git a/radio/src/storage/conversions/datastructs_220.h b/radio/src/storage/conversions/datastructs_220.h index b4c80cb5a..fed2e49d9 100644 --- a/radio/src/storage/conversions/datastructs_220.h +++ b/radio/src/storage/conversions/datastructs_220.h @@ -28,3 +28,6 @@ namespace bin_storage_220 { #include "yaml/myeeprom_220.h" }; + +// prevent board.h from being included +#define _BOARD_H_ diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index c956741f0..cd1237030 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -27,6 +27,13 @@ using std::list; #include "yaml/yaml_modelslist.h" #endif +#include "myeeprom.h" +#include "datastructs.h" +#include "pulses/modules_helpers.h" +#include "strhelpers.h" + +#include + ModelsList modelslist; ModelCell::ModelCell(const char* name) : valid_rfData(false) diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 0383081c4..c3d0c0664 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -30,12 +30,17 @@ #include "sdcard_raw.h" #endif +#include "dataconstants.h" + // #define MODELCELL_WIDTH 172 // #define MODELCELL_HEIGHT 59 // modelXXXXXXX.bin F,FF F,3F,FF\r\n #define LEN_MODELS_IDX_LINE (LEN_MODEL_FILENAME + sizeof(" F,FF F,3F,FF\r\n")-1) +struct ModelData; +struct ModuleData; + struct SimpleModuleData { uint8_t type; diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index 1ce2cfb19..9dfa4d1bc 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -35,9 +35,9 @@ #define DEFAULT_MODEL_FILENAME MODEL_FILENAME_PREFIX "1" MODEL_FILENAME_SUFFIX #define MODEL_FILENAME_PATTERN MODEL_FILENAME_PREFIX MODEL_FILENAME_SUFFIX -//#if !defined(EEPROM) +#if !defined(STORAGE_MODELSLIST) extern ModelHeader modelHeaders[MAX_MODELS]; -//#endif +#endif // opens radio.bin or model file const char* openFileBin(const char* fullpath, FIL* file, uint16_t* size, diff --git a/radio/src/storage/yaml/yaml_modelslist.cpp b/radio/src/storage/yaml/yaml_modelslist.cpp index dd3384751..04a291e61 100644 --- a/radio/src/storage/yaml/yaml_modelslist.cpp +++ b/radio/src/storage/yaml/yaml_modelslist.cpp @@ -24,6 +24,8 @@ #include "storage/modelslist.h" +#include + using std::list; struct modelslist_iter diff --git a/radio/src/telemetry/multi.h b/radio/src/telemetry/multi.h index 64f51edb3..1f7fbf07d 100644 --- a/radio/src/telemetry/multi.h +++ b/radio/src/telemetry/multi.h @@ -22,6 +22,8 @@ #ifndef OPENTX_MULTI_H #define OPENTX_MULTI_H +#include "../timers.h" + #define MULTI_BUFFER_SIZE 177 extern uint8_t * Multi_Buffer; diff --git a/radio/src/translations.h b/radio/src/translations.h index f8cea01fd..57e43b455 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -22,6 +22,7 @@ #ifndef _TRANSLATIONS_H_ #define _TRANSLATIONS_H_ +#include "opentx_types.h" #include "translations/untranslated.h" #if defined(TRANSLATIONS_FR) @@ -778,14 +779,29 @@ const LanguagePack * const languagePacks[] = { #endif #if defined(SIMU) - #define LANGUAGE_PACK_DECLARE(lng, name) const LanguagePack lng ## LanguagePack = { #lng, name, lng ## _ ## playNumber, lng ## _ ## playDuration } +#define LANGUAGE_PACK_DECLARE(lng, name) \ + const LanguagePack lng##LanguagePack = {#lng, name, lng##_##playNumber, \ + lng##_##playDuration} #else - #define LANGUAGE_PACK_DECLARE(lng, name) extern const LanguagePack lng ## LanguagePack = { #lng, name, lng ## _ ## playNumber, lng ## _ ## playDuration } +#define LANGUAGE_PACK_DECLARE(lng, name) \ + extern const LanguagePack lng##LanguagePack = { \ + #lng, name, lng##_##playNumber, lng##_##playDuration} #endif -#define LANGUAGE_PACK_DECLARE_DEFAULT(lng, name) LANGUAGE_PACK_DECLARE(lng, name); const LanguagePack * currentLanguagePack = & lng ## LanguagePack; uint8_t currentLanguagePackIdx -inline PLAY_FUNCTION(playNumber, getvalue_t number, uint8_t unit, uint8_t flags) { currentLanguagePack->playNumber(number, unit, flags, id); } -inline PLAY_FUNCTION(playDuration, int seconds, uint8_t flags) { currentLanguagePack->playDuration(seconds, flags, id); } +#define LANGUAGE_PACK_DECLARE_DEFAULT(lng, name) \ + LANGUAGE_PACK_DECLARE(lng, name); \ + const LanguagePack* currentLanguagePack = &lng##LanguagePack; \ + uint8_t currentLanguagePackIdx + +#define PLAY_FUNCTION(x, ...) void x(__VA_ARGS__, uint8_t id) + +inline PLAY_FUNCTION(playNumber, getvalue_t number, uint8_t unit, uint8_t flags) { + currentLanguagePack->playNumber(number, unit, flags, id); +} + +inline PLAY_FUNCTION(playDuration, int seconds, uint8_t flags) { + currentLanguagePack->playDuration(seconds, flags, id); +} extern const char STR_MODELNAME[]; extern const char STR_PHASENAME[]; From 8eceb282c662756a7b7aeb841a3acfacd9417d4a Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 19 Oct 2021 11:44:19 +0200 Subject: [PATCH 063/110] Consider calibration values to be correct if loaded from YAML. --- radio/src/storage/sdcard_yaml.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 8283bacb4..6e79e153c 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -124,7 +124,12 @@ const char * loadRadioSettings() #endif } - return loadRadioSettingsYaml(); + const char* error = loadRadioSettingsYaml(); + if (!error) { + g_eeGeneral.chkSum = evalChkSum(); + } + + return error; } struct yaml_writer_ctx { From d1c7ae414189bdcdfe72288aa370aaac62ae8bb0 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 19 Oct 2021 14:23:55 +0200 Subject: [PATCH 064/110] Properly patch filenames in models.yml & handle missing files --- radio/src/storage/conversions/conversions.cpp | 40 ++++++++++++++----- radio/src/storage/conversions/conversions.h | 2 +- .../conversions/conversions_220_221.cpp | 13 +----- radio/src/storage/sdcard_common.cpp | 2 +- radio/src/storage/sdcard_common.h | 2 +- 5 files changed, 35 insertions(+), 24 deletions(-) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 273ad850c..e0c55594f 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -99,9 +99,13 @@ void convertBinRadioData(const char * path, int version) const char* error = nullptr; for (auto category_ptr : modelslist.getCategories()) { - for (auto model_ptr : *category_ptr) { - uint8_t model_version; + auto model_it = category_ptr->begin(); + + while(model_it != category_ptr->end()) { + + uint8_t model_version = 0; + auto* model_ptr = *model_it; char* filename = model_ptr->modelFilename; TRACE("converting '%s' (%d/%d)", filename, converted, to_convert); @@ -110,19 +114,22 @@ void convertBinRadioData(const char * path, int version) // read only the version number (size=0) error = readModelBin(filename, nullptr, 0, &model_version); if (!error) { - // TODO: error handling error = convertBinModelData(filename, model_version); - if (error) { - // add error counter? - continue; - } + ++model_it; + + } else { + TRACE("ERROR reading '%s': %s", filename, error); + + // remove that file from the models list + ++model_it; + category_ptr->removeModel(model_ptr); } converted++; #if defined(SIMU) - RTOS_WAIT_MS(200); + RTOS_WAIT_MS(200); #endif } } @@ -136,7 +143,20 @@ void convertBinRadioData(const char * path, int version) modelslist.load(); } -const char* convertBinModelData(const char* filename, int version) +void patchFilenameToYaml(char* str) +{ + constexpr unsigned bin_len = sizeof(MODELS_EXT) - 1; + constexpr unsigned yml_len = sizeof(YAML_EXT) - 1; + + // patch file extension + const char* ext = strrchr(str, '.'); + if (ext && (strlen(ext) == bin_len) && + !strncmp(ext, STR_MODELS_EXT, bin_len)) { + memcpy((void*)ext, (void*)STR_YAML_EXT, yml_len + 1); + } +} + +const char* convertBinModelData(char* filename, int version) { TRACE("convertModelData(%s)", filename); @@ -159,6 +179,8 @@ const char* convertBinModelData(const char* filename, int version) version = 221; } #endif + + patchFilenameToYaml(filename); return nullptr; } #endif diff --git a/radio/src/storage/conversions/conversions.h b/radio/src/storage/conversions/conversions.h index e70560027..2f0e49b89 100644 --- a/radio/src/storage/conversions/conversions.h +++ b/radio/src/storage/conversions/conversions.h @@ -21,7 +21,7 @@ // Entry points for converting radio & model data void convertBinRadioData(const char * path, int version); -const char* convertBinModelData(const char * path, int version); +const char* convertBinModelData(char * filename, int version); bool eeConvert(); void eeConvertModel(int id, int version); diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp index a9fd697e4..734a58d4f 100644 --- a/radio/src/storage/conversions/conversions_220_221.cpp +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -41,18 +41,7 @@ namespace yaml_conv_220 { #if defined(STORAGE_MODELSLIST) -void patchFilenameToYaml(char* str) -{ - constexpr unsigned bin_len = sizeof(MODELS_EXT) - 1; - constexpr unsigned yml_len = sizeof(YAML_EXT) - 1; - - // patch file extension - const char* ext = strrchr(str, '.'); - if (ext && (strlen(ext) == bin_len) && - !strncmp(ext, STR_MODELS_EXT, bin_len)) { - memcpy((void*)ext, (void*)STR_YAML_EXT, yml_len + 1); - } -} +void patchFilenameToYaml(char* str); static const char* convertData_220_to_221( const char* path, unsigned size, const YamlNode* root_node, diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index 00a6fb074..68e4f17a8 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -118,7 +118,7 @@ const char * createModel() } #endif -const char * loadModel(const char * filename, bool alarms) +const char * loadModel(char * filename, bool alarms) { uint8_t version; preModelLoad(); diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index 9dfa4d1bc..1a62a0e08 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -57,7 +57,7 @@ const char* writeFileYaml(const char* path, const YamlNode* root_node, uint8_t* void getModelPath(char * path, const char * filename); const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version); -const char * loadModel(const char * filename, bool alarms=true); +const char * loadModel(char * filename, bool alarms=true); const char * createModel(); const char * writeModel(); From b7640a830fa752403813557a2ce752f89e04644b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 20 Oct 2021 19:28:36 +0200 Subject: [PATCH 065/110] WiP pass YamlTreeParser where needed --- radio/src/datastructs.h | 2 +- .../yaml/yaml_datastructs_funcs.cpp | 251 +++++++--------- .../conversions/yaml/yaml_datastructs_t12.cpp | 2 +- .../conversions/yaml/yaml_datastructs_t8.cpp | 2 +- .../yaml/yaml_datastructs_tlite.cpp | 2 +- .../yaml/yaml_datastructs_tx12.cpp | 2 +- .../conversions/yaml/yaml_datastructs_x7.cpp | 2 +- .../conversions/yaml/yaml_datastructs_x9d.cpp | 2 +- .../conversions/yaml/yaml_datastructs_x9e.cpp | 2 +- .../yaml/yaml_datastructs_x9lite.cpp | 2 +- .../yaml/yaml_datastructs_x9lites.cpp | 2 +- .../yaml/yaml_datastructs_xlite.cpp | 2 +- .../yaml/yaml_datastructs_xlites.cpp | 2 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 280 +++++++++++------- .../src/storage/yaml/yaml_datastructs_t12.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_t8.cpp | 2 +- .../storage/yaml/yaml_datastructs_tlite.cpp | 2 +- .../storage/yaml/yaml_datastructs_tx12.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x7.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 2 +- .../storage/yaml/yaml_datastructs_x9lite.cpp | 2 +- .../storage/yaml/yaml_datastructs_x9lites.cpp | 2 +- .../storage/yaml/yaml_datastructs_xlite.cpp | 2 +- .../storage/yaml/yaml_datastructs_xlites.cpp | 2 +- radio/src/storage/yaml/yaml_node.h | 91 +++--- radio/src/storage/yaml/yaml_tree_walker.cpp | 157 +++++----- radio/src/storage/yaml/yaml_tree_walker.h | 10 +- 28 files changed, 424 insertions(+), 411 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 7d9af9f83..c8e8bd3b3 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -310,7 +310,7 @@ union TelemetryScreenData { #if defined(PCBTARANIS) TelemetryScriptData script; #endif -}; +} FUNC(select_tele_screen_data); #endif PACK(struct VarioData { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 0aa4bfc21..e3fd62bfc 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -89,7 +89,7 @@ static bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, } #if defined(COLORLCD) -static uint8_t select_zov(uint8_t* data, uint32_t bitoffs) +static uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; data -= sizeof(ZoneOptionValueEnum); @@ -100,7 +100,7 @@ static uint8_t select_zov(uint8_t* data, uint32_t bitoffs) } #endif -static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) +static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; data -= offsetof(ModuleData, ppm); @@ -136,7 +136,7 @@ static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) return 0; } -static uint8_t select_custom_fn(uint8_t* data, uint32_t bitoffs) +static uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; data -= offsetof(CustomFunctionData, all); @@ -154,71 +154,58 @@ static uint8_t select_custom_fn(uint8_t* data, uint32_t bitoffs) return 1; } -static uint8_t select_script_input(uint8_t* data, uint32_t bitoffs) +static uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'value' return 0; } -static uint8_t select_id1(uint8_t* data, uint32_t bitoffs) +static uint8_t select_id1(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'id' return 0; } -static uint8_t select_id2(uint8_t* data, uint32_t bitoffs) +static uint8_t select_id2(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'instance' return 0; } -static uint8_t select_sensor_cfg(uint8_t* data, uint32_t bitoffs) +static uint8_t select_sensor_cfg(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'param' return 5; } -#if 0 -static uint32_t sw_read(const char* val, uint8_t val_len) +static bool sw_write(void* user, yaml_writer_func wf, void* opaque) { - uint32_t sw = yaml_parse_enum(enum_MixSources, val, val_len); - if (sw >= MIXSRC_FIRST_SWITCH) - return sw - MIXSRC_FIRST_SWITCH; + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); - return -1; -} -#endif - -static bool sw_write(uint32_t idx, yaml_writer_func wf, void* opaque) -{ - const char* str = yaml_output_enum(idx + MIXSRC_FIRST_SWITCH, enum_MixSources); - return str ? wf(opaque, str, strlen(str)) : true; + const char* str = + yaml_output_enum(idx + MIXSRC_FIRST_SWITCH, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; } -#if 0 -static void r_stick_name(const YamlNode* node, uint8_t* data, - uint32_t bitoffs, uint16_t idx, - const char* val, uint8_t val_len) -{ - data -= offsetof(RadioData, switchConfig); - RadioData* rd = reinterpret_cast(data); - strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); -} -#endif - -static bool w_stick_name(const YamlNode* node, uint8_t* data, - uint32_t bitoffs, uint16_t idx, +static bool w_stick_name(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque) { - data -= offsetof(RadioData, switchConfig); - RadioData* rd = reinterpret_cast(data); - return wf(opaque, rd->anaNames[idx], strnlen(rd->anaNames[idx], LEN_ANA_NAME)); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + data -= offsetof(RadioData, switchConfig); + RadioData* rd = reinterpret_cast(data); + return wf(opaque, rd->anaNames[idx], + strnlen(rd->anaNames[idx], LEN_ANA_NAME)); } -static bool stick_name_valid(uint8_t* data, uint32_t bitoffs, uint16_t idx) +static bool stick_name_valid(void* user, uint8_t* data, uint32_t bitoffs) { - RadioData* rd = reinterpret_cast(data); - return rd->anaNames[idx][0] != '\0'; + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); + RadioData* rd = reinterpret_cast(data); + return rd->anaNames[idx][0] != '\0'; } static const struct YamlNode struct_sticksConfig[] = { @@ -227,29 +214,19 @@ static const struct YamlNode struct_sticksConfig[] = { YAML_END }; -#if 0 -static void sw_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, const char* val, uint8_t val_len) +static bool sw_name_write(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, switchConfig); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); - RadioData* rd = reinterpret_cast(data); - strncpy(rd->switchNames[idx], val, std::min(val_len, LEN_SWITCH_NAME)); -} -#endif + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, switchConfig); -static bool sw_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, yaml_writer_func wf, void* opaque) -{ - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, switchConfig); - - RadioData* rd = reinterpret_cast(data); - const char* str = rd->switchNames[idx]; - return wf(opaque, str, strnlen(str, LEN_SWITCH_NAME)); + RadioData* rd = reinterpret_cast(data); + const char* str = rd->switchNames[idx]; + return wf(opaque, str, strnlen(str, LEN_SWITCH_NAME)); } static const struct YamlIdStr enum_SwitchConfig[] = { @@ -267,48 +244,29 @@ static const struct YamlNode struct_switchConfig[] = { YAML_END }; -#if 0 -static uint32_t pot_read(const char* val, uint8_t val_len) +static bool pot_write(void* user, yaml_writer_func wf, void* opaque) { - uint32_t pot = yaml_parse_enum(enum_MixSources, val, val_len); - if (pot >= MIXSRC_FIRST_POT) - return pot - MIXSRC_FIRST_POT; + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); - return -1; -} -#endif - -static bool pot_write(uint32_t idx, yaml_writer_func wf, void* opaque) -{ - const char* str = yaml_output_enum(idx + MIXSRC_FIRST_POT, enum_MixSources); - return str ? wf(opaque, str, strlen(str)) : true; + const char* str = yaml_output_enum(idx + MIXSRC_FIRST_POT, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; } -#if 0 -static void pot_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, const char* val, uint8_t val_len) +static bool pot_name_write(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, potsConfig); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS; - strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); -} -#endif + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, potsConfig); -static bool pot_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, yaml_writer_func wf, void* opaque) -{ - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, potsConfig); - - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS; - const char* str = rd->anaNames[idx]; - return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS; + const char* str = rd->anaNames[idx]; + return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); } static const struct YamlIdStr enum_PotConfig[] = { @@ -326,66 +284,39 @@ static const struct YamlNode struct_potConfig[] = { YAML_END }; -#if 0 -static uint32_t slider_read(const char* val, uint8_t val_len) +static bool slider_write(void* user, yaml_writer_func wf, void* opaque) { - uint32_t sl = yaml_parse_enum(enum_MixSources, val, val_len); - if (sl >= MIXSRC_FIRST_SLIDER) - return sl - MIXSRC_FIRST_SLIDER; + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); - return -1; -} -#endif - -static bool slider_write(uint32_t idx, yaml_writer_func wf, void* opaque) -{ - const char* str = yaml_output_enum(idx + MIXSRC_FIRST_SLIDER, enum_MixSources); - return str ? wf(opaque, str, strlen(str)) : true; + const char* str = + yaml_output_enum(idx + MIXSRC_FIRST_SLIDER, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; } -#if 0 -static void sl_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, const char* val, uint8_t val_len) +static bool sl_name_write(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { - // data / bitoffs already incremented + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + // data / bitoffs already incremented #if defined(PCBTARANIS) - // Please note: - // slidersConfig is defined as a bit-field member, - // so let's take the next field and subtract 1 - // - data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; - data -= offsetof(RadioData, potsConfig) - 1; + // Please note: + // slidersConfig is defined as a bit-field member, + // so let's take the next field and subtract 1 + // + data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; + data -= offsetof(RadioData, potsConfig) - 1; #else - data -= (idx + 1) / 8; - data -= offsetof(RadioData, slidersConfig); + data -= (idx + 1) / 8; + data -= offsetof(RadioData, slidersConfig); #endif - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS + STORAGE_NUM_POTS; - strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); -} -#endif - -static bool sl_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, yaml_writer_func wf, void* opaque) -{ - // data / bitoffs already incremented -#if defined(PCBTARANIS) - // Please note: - // slidersConfig is defined as a bit-field member, - // so let's take the next field and subtract 1 - // - data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; - data -= offsetof(RadioData, potsConfig) - 1; -#else - data -= (idx + 1) / 8; - data -= offsetof(RadioData, slidersConfig); -#endif - - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS + STORAGE_NUM_POTS; - const char* str = rd->anaNames[idx]; - return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS + STORAGE_NUM_POTS; + const char* str = rd->anaNames[idx]; + return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); } static const struct YamlIdStr enum_SliderConfig[] = { @@ -456,19 +387,19 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, return wf(opaque, str, strlen(str)); } -static bool cfn_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) +static bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; return ((CustomFunctionData*)data)->swtch; } -static bool gvar_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) +static bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs) { gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); return *gvar != GVAR_MAX+1; } -static bool fmd_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) +static bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) { uint32_t data_ofs = bitoffs >> 3UL; if (data_ofs == offsetof(ModelData, flightModeData)) { @@ -612,3 +543,27 @@ static bool w_trainerMode(const YamlNode* node, uint32_t val, return true; } + +#if !defined(COLORLCD) +static uint8_t select_tele_screen_data(void* user, uint8_t* data, uint32_t bitoffs) +{ + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(2); + + auto md = reinterpret_cast(data); + uint8_t st = (md->screensType >> (2 * idx)) & 0x03; + switch(st){ + case TELEMETRY_SCREEN_TYPE_NONE: + break; + case TELEMETRY_SCREEN_TYPE_VALUES: + return 1; // lines + case TELEMETRY_SCREEN_TYPE_BARS: + return 0; // bars + case TELEMETRY_SCREEN_TYPE_SCRIPT: + return 2; + } + + TRACE("select_tele_screen_data(idx=%d)", idx); + return 0; +} +#endif diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index 433343d0f..3a4d01222 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index 433343d0f..3a4d01222 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index 433343d0f..3a4d01222 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index 658bf57bc..4e08a3b50 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index 433343d0f..3a4d01222 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index 4ecd1fcfb..1897417c3 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -764,7 +764,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index 506ce0e76..2ab5a5992 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -803,7 +803,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index 8a2b98dad..2c0f9653c 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -736,7 +736,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 245a52698..76ba4a39c 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -746,7 +746,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index 0d4de5fd3..e38e41470 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -743,7 +743,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index aea0501cb..fc2e0a1fa 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -747,7 +747,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 58ca54181..d136bfd25 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -127,7 +127,7 @@ static bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, } #if defined(COLORLCD) -static uint8_t select_zov(uint8_t* data, uint32_t bitoffs) +static uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; data -= sizeof(ZoneOptionValueEnum); @@ -138,7 +138,7 @@ static uint8_t select_zov(uint8_t* data, uint32_t bitoffs) } #endif -static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) +static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; data -= offsetof(ModuleData, ppm); @@ -174,74 +174,86 @@ static uint8_t select_mod_type(uint8_t* data, uint32_t bitoffs) return 0; } -static uint8_t select_custom_fn(uint8_t* data, uint32_t bitoffs) +static uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'all' //TODO return 1; } -static uint8_t select_script_input(uint8_t* data, uint32_t bitoffs) +static uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'value' return 0; } -static uint8_t select_id1(uint8_t* data, uint32_t bitoffs) +static uint8_t select_id1(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'id' return 0; } -static uint8_t select_id2(uint8_t* data, uint32_t bitoffs) +static uint8_t select_id2(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'instance' return 0; } -static uint8_t select_sensor_cfg(uint8_t* data, uint32_t bitoffs) +static uint8_t select_sensor_cfg(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'param' return 5; } -static uint32_t sw_read(const char* val, uint8_t val_len) +static uint32_t sw_read(void* user, const char* val, uint8_t val_len) { - uint32_t sw = yaml_parse_enum(enum_MixSources, val, val_len); - if (sw >= MIXSRC_FIRST_SWITCH) - return sw - MIXSRC_FIRST_SWITCH; + (void)user; + uint32_t sw = yaml_parse_enum(enum_MixSources, val, val_len); + if (sw >= MIXSRC_FIRST_SWITCH) return sw - MIXSRC_FIRST_SWITCH; - return -1; + return -1; } -static bool sw_write(uint32_t idx, yaml_writer_func wf, void* opaque) +static bool sw_write(void* user, yaml_writer_func wf, void* opaque) { - const char* str = yaml_output_enum(idx + MIXSRC_FIRST_SWITCH, enum_MixSources); - return str ? wf(opaque, str, strlen(str)) : true; + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); + + const char* str = + yaml_output_enum(idx + MIXSRC_FIRST_SWITCH, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; } -static void r_stick_name(const YamlNode* node, uint8_t* data, - uint32_t bitoffs, uint16_t idx, +static void r_stick_name(void* user, uint8_t* data, uint32_t bitoffs, const char* val, uint8_t val_len) { - data -= offsetof(RadioData, switchConfig); - RadioData* rd = reinterpret_cast(data); - strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + if (idx >= NUM_STICKS) return; + + data -= offsetof(RadioData, switchConfig); + RadioData* rd = reinterpret_cast(data); + strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); } -static bool w_stick_name(const YamlNode* node, uint8_t* data, - uint32_t bitoffs, uint16_t idx, +static bool w_stick_name(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque) { - data -= offsetof(RadioData, switchConfig); - RadioData* rd = reinterpret_cast(data); - return wf(opaque, rd->anaNames[idx], strnlen(rd->anaNames[idx], LEN_ANA_NAME)); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + data -= offsetof(RadioData, switchConfig); + RadioData* rd = reinterpret_cast(data); + return wf(opaque, rd->anaNames[idx], + strnlen(rd->anaNames[idx], LEN_ANA_NAME)); } -static bool stick_name_valid(uint8_t* data, uint32_t bitoffs, uint16_t idx) +static bool stick_name_valid(void* user, uint8_t* data, uint32_t bitoffs) { - RadioData* rd = reinterpret_cast(data); - return rd->anaNames[idx][0] != '\0'; + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); + RadioData* rd = reinterpret_cast(data); + return rd->anaNames[idx][0] != '\0'; } static const struct YamlNode struct_sticksConfig[] = { @@ -250,27 +262,34 @@ static const struct YamlNode struct_sticksConfig[] = { YAML_END }; -static void sw_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, const char* val, uint8_t val_len) +static void sw_name_read(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) { - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, switchConfig); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); - RadioData* rd = reinterpret_cast(data); - strncpy(rd->switchNames[idx], val, std::min(val_len, LEN_SWITCH_NAME)); + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, switchConfig); + + RadioData* rd = reinterpret_cast(data); + strncpy(rd->switchNames[idx], val, + std::min(val_len, LEN_SWITCH_NAME)); } -static bool sw_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, yaml_writer_func wf, void* opaque) +static bool sw_name_write(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, switchConfig); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); - RadioData* rd = reinterpret_cast(data); - const char* str = rd->switchNames[idx]; - return wf(opaque, str, strnlen(str, LEN_SWITCH_NAME)); + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, switchConfig); + + RadioData* rd = reinterpret_cast(data); + const char* str = rd->switchNames[idx]; + return wf(opaque, str, strnlen(str, LEN_SWITCH_NAME)); } static const struct YamlIdStr enum_SwitchConfig[] = { @@ -282,50 +301,59 @@ static const struct YamlIdStr enum_SwitchConfig[] = { }; static const struct YamlNode struct_switchConfig[] = { - YAML_IDX_CUST( "sw", sw_read, sw_write ), + YAML_IDX_CUST( "sw", sw_read, sw_write), YAML_ENUM( "type", 2, enum_SwitchConfig), YAML_CUSTOM( "name", sw_name_read, sw_name_write), YAML_END }; -static uint32_t pot_read(const char* val, uint8_t val_len) +static uint32_t pot_read(void* user, const char* val, uint8_t val_len) { - uint32_t pot = yaml_parse_enum(enum_MixSources, val, val_len); - if (pot >= MIXSRC_FIRST_POT) - return pot - MIXSRC_FIRST_POT; + (void)user; + uint32_t pot = yaml_parse_enum(enum_MixSources, val, val_len); + if (pot >= MIXSRC_FIRST_POT) return pot - MIXSRC_FIRST_POT; - return -1; + return -1; } -static bool pot_write(uint32_t idx, yaml_writer_func wf, void* opaque) +static bool pot_write(void* user, yaml_writer_func wf, void* opaque) { - const char* str = yaml_output_enum(idx + MIXSRC_FIRST_POT, enum_MixSources); - return str ? wf(opaque, str, strlen(str)) : true; + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); + + const char* str = yaml_output_enum(idx + MIXSRC_FIRST_POT, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; } -static void pot_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, const char* val, uint8_t val_len) +static void pot_name_read(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) { - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, potsConfig); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS; - strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, potsConfig); + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS; + strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); } -static bool pot_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, yaml_writer_func wf, void* opaque) +static bool pot_name_write(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, potsConfig); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS; - const char* str = rd->anaNames[idx]; - return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); + // data / bitoffs already incremented + data -= ((idx + 1) * 2) / 8; + data -= offsetof(RadioData, potsConfig); + + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS; + const char* str = rd->anaNames[idx]; + return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); } static const struct YamlIdStr enum_PotConfig[] = { @@ -343,62 +371,72 @@ static const struct YamlNode struct_potConfig[] = { YAML_END }; -static uint32_t slider_read(const char* val, uint8_t val_len) +static uint32_t slider_read(void* user, const char* val, uint8_t val_len) { - uint32_t sl = yaml_parse_enum(enum_MixSources, val, val_len); - if (sl >= MIXSRC_FIRST_SLIDER) - return sl - MIXSRC_FIRST_SLIDER; + (void)user; + uint32_t sl = yaml_parse_enum(enum_MixSources, val, val_len); + if (sl >= MIXSRC_FIRST_SLIDER) return sl - MIXSRC_FIRST_SLIDER; - return -1; + return -1; } -static bool slider_write(uint32_t idx, yaml_writer_func wf, void* opaque) +static bool slider_write(void* user, yaml_writer_func wf, void* opaque) { - const char* str = yaml_output_enum(idx + MIXSRC_FIRST_SLIDER, enum_MixSources); - return str ? wf(opaque, str, strlen(str)) : true; + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); + + const char* str = + yaml_output_enum(idx + MIXSRC_FIRST_SLIDER, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; } -static void sl_name_read(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, const char* val, uint8_t val_len) +static void sl_name_read(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) { - // data / bitoffs already incremented + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + // data / bitoffs already incremented #if defined(PCBTARANIS) - // Please note: - // slidersConfig is defined as a bit-field member, - // so let's take the next field and subtract 1 - // - data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; - data -= offsetof(RadioData, potsConfig) - 1; + // Please note: + // slidersConfig is defined as a bit-field member, + // so let's take the next field and subtract 1 + // + data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; + data -= offsetof(RadioData, potsConfig) - 1; #else - data -= (idx + 1) / 8; - data -= offsetof(RadioData, slidersConfig); + data -= (idx + 1) / 8; + data -= offsetof(RadioData, slidersConfig); #endif - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS + STORAGE_NUM_POTS; - strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS + STORAGE_NUM_POTS; + strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); } -static bool sl_name_write(const YamlNode* node, uint8_t* data, uint32_t bitoffs, - uint16_t idx, yaml_writer_func wf, void* opaque) +static bool sl_name_write(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { - // data / bitoffs already incremented + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + // data / bitoffs already incremented #if defined(PCBTARANIS) - // Please note: - // slidersConfig is defined as a bit-field member, - // so let's take the next field and subtract 1 - // - data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; - data -= offsetof(RadioData, potsConfig) - 1; + // Please note: + // slidersConfig is defined as a bit-field member, + // so let's take the next field and subtract 1 + // + data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; + data -= offsetof(RadioData, potsConfig) - 1; #else - data -= (idx + 1) / 8; - data -= offsetof(RadioData, slidersConfig); + data -= (idx + 1) / 8; + data -= offsetof(RadioData, slidersConfig); #endif - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS + STORAGE_NUM_POTS; - const char* str = rd->anaNames[idx]; - return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); + RadioData* rd = reinterpret_cast(data); + idx += NUM_STICKS + STORAGE_NUM_POTS; + const char* str = rd->anaNames[idx]; + return wf(opaque, str, strnlen(str, LEN_ANA_NAME)); } static const struct YamlIdStr enum_SliderConfig[] = { @@ -514,19 +552,19 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, return wf(opaque, str, strlen(str)); } -static bool cfn_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) +static bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; return ((CustomFunctionData*)data)->swtch; } -static bool gvar_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) +static bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs) { gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); return *gvar != GVAR_MAX+1; } -static bool fmd_is_active(uint8_t* data, uint32_t bitoffs, uint16_t idx) +static bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) { uint32_t data_ofs = bitoffs >> 3UL; if (data_ofs == offsetof(ModelData, flightModeData)) { @@ -727,3 +765,27 @@ static bool w_trainerMode(const YamlNode* node, uint32_t val, return true; } + +#if !defined(COLORLCD) +static uint8_t select_tele_screen_data(void* user, uint8_t* data, uint32_t bitoffs) +{ + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(2); + + auto md = reinterpret_cast(data); + uint8_t st = (md->screensType >> (2 * idx)) & 0x03; + switch(st){ + case TELEMETRY_SCREEN_TYPE_NONE: + break; + case TELEMETRY_SCREEN_TYPE_VALUES: + return 1; // lines + case TELEMETRY_SCREEN_TYPE_BARS: + return 0; // bars + case TELEMETRY_SCREEN_TYPE_SCRIPT: + return 2; + } + + TRACE("select_tele_screen_data(idx=%d)", idx); + return 0; +} +#endif diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 433343d0f..3a4d01222 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 433343d0f..3a4d01222 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 433343d0f..3a4d01222 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 658bf57bc..4e08a3b50 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 433343d0f..3a4d01222 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -751,7 +751,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 4ecd1fcfb..1897417c3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -764,7 +764,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 506ce0e76..2ab5a5992 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -803,7 +803,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 8a2b98dad..2c0f9653c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -736,7 +736,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 245a52698..76ba4a39c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -746,7 +746,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 0d4de5fd3..e38e41470 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -743,7 +743,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index aea0501cb..fc2e0a1fa 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -747,7 +747,7 @@ static const struct YamlNode union_TelemetryScreenData_elmts[] = { }; static const struct YamlNode union_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, NULL), + YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { diff --git a/radio/src/storage/yaml/yaml_node.h b/radio/src/storage/yaml/yaml_node.h index 42a515b0a..1eed24cb1 100644 --- a/radio/src/storage/yaml/yaml_node.h +++ b/radio/src/storage/yaml/yaml_node.h @@ -53,59 +53,62 @@ typedef bool (*yaml_writer_func)(void* opaque, const char* str, size_t len); struct YamlNode { - typedef bool (*is_active_func)(uint8_t* data, uint32_t bitoffs, uint16_t idx); + typedef bool (*is_active_func)(void* user, uint8_t* data, uint32_t bitoffs); - typedef uint32_t (*cust_to_uint_func)(const YamlNode* node, const char* val, uint8_t val_len); + typedef uint32_t (*cust_to_uint_func)(const YamlNode* node, const char* val, + uint8_t val_len); - typedef bool (*uint_to_cust_func)(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); - - typedef uint8_t (*select_member_func)(uint8_t* data, uint32_t bitoffs); - - typedef uint32_t (*cust_idx_read_func)(const char* val, uint8_t val_len); - typedef bool (*cust_idx_write_func)(uint32_t idx, yaml_writer_func wf, void* opaque); - - typedef void (*cust_read_func)(const YamlNode* node, uint8_t* data, - uint32_t bitoffs, uint16_t idx, - const char* val, uint8_t val_len); - typedef bool (*cust_write_func)(const YamlNode* node, uint8_t* data, - uint32_t bitoffs, uint16_t idx, + typedef bool (*uint_to_cust_func)(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); - uint8_t type; - uint32_t size; // bits - uint8_t tag_len; - const char* tag; - union { - struct { - const YamlNode* child; - union { - struct { - is_active_func is_active; - uint16_t elmts; // maximum number of elements - } _a; - select_member_func select_member; - } u; - } _array; + typedef uint8_t (*select_member_func)(void* user, uint8_t* data, + uint32_t bitoffs); - struct { - const YamlIdStr* choices; - } _enum; + typedef uint32_t (*cust_idx_read_func)(void* user, const char* val, + uint8_t val_len); + typedef bool (*cust_idx_write_func)(void* user, yaml_writer_func wf, + void* opaque); - struct { - cust_to_uint_func cust_to_uint; - uint_to_cust_func uint_to_cust; - } _cust; + typedef void (*cust_read_func)(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len); + typedef bool (*cust_write_func)(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque); + uint8_t type; + uint32_t size; // bits + uint8_t tag_len; + const char* tag; + union { + struct { + const YamlNode* child; + union { struct { - cust_idx_read_func read; - cust_idx_write_func write; - } _cust_idx; + is_active_func is_active; + uint16_t elmts; // maximum number of elements + } _a; + select_member_func select_member; + } u; + } _array; - struct { - cust_read_func read; - cust_write_func write; - } _cust_attr; - } u; + struct { + const YamlIdStr* choices; + } _enum; + + struct { + cust_to_uint_func cust_to_uint; + uint_to_cust_func uint_to_cust; + } _cust; + + struct { + cust_idx_read_func read; + cust_idx_write_func write; + } _cust_idx; + + struct { + cust_read_func read; + cust_write_func write; + } _cust_attr; + } u; }; #if !defined(_MSC_VER) diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index f9f2914dd..792c13ccb 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -49,24 +49,25 @@ uint32_t yaml_parse_enum(const struct YamlIdStr* choices, const char* val, uint8 return choices->id; } -static void yaml_set_attr(uint8_t* ptr, uint32_t bit_ofs, const YamlNode* node, - uint16_t idx, const char* val, uint8_t val_len) +static void yaml_set_attr(void* user, uint8_t* ptr, uint32_t bit_ofs, + const YamlNode* node, const char* val, + uint8_t val_len) { - uint32_t i = 0; + uint32_t i = 0; - //TRACE("set(%s, %.*s, bit-ofs=%u, bits=%u)\n", - // node->tag, val_len, val, bit_ofs, node->size); + // TRACE("set(%s, %.*s, bit-ofs=%u, bits=%u)\n", + // node->tag, val_len, val, bit_ofs, node->size); - ptr += bit_ofs >> 3UL; - bit_ofs &= 0x07; + ptr += bit_ofs >> 3UL; + bit_ofs &= 0x07; - if (node->type == YDT_STRING) { - //assert(!bit_ofs); - copy_string((char*)ptr, val, MIN(val_len, node->size - 1)); - return; - } + if (node->type == YDT_STRING) { + // assert(!bit_ofs); + copy_string((char*)ptr, val, MIN(val_len, node->size - 1)); + return; + } - switch(node->type) { + switch (node->type) { case YDT_SIGNED: i = node->u._cust.cust_to_uint ? node->u._cust.cust_to_uint(node, val, val_len) : (uint32_t)yaml_str2int(val, val_len); @@ -80,7 +81,7 @@ static void yaml_set_attr(uint8_t* ptr, uint32_t bit_ofs, const YamlNode* node, break; case YDT_CUSTOM: if (node->u._cust_attr.read) - node->u._cust_attr.read(node, ptr, bit_ofs, idx, val, val_len); + node->u._cust_attr.read(user, ptr, bit_ofs, val, val_len); return; default: break; @@ -130,71 +131,64 @@ static bool yaml_output_string(const char* str, uint32_t max_len, return true; } -static bool yaml_output_attr(uint8_t* ptr, uint32_t bit_ofs, const YamlNode* node, - uint16_t idx, yaml_writer_func wf, void* opaque) +static bool yaml_output_attr(void* user, uint8_t* ptr, uint32_t bit_ofs, + const YamlNode* node, yaml_writer_func wf, + void* opaque) { - if (node->type == YDT_NONE) + if (node->type == YDT_NONE) return false; + + if (node->type == YDT_PADDING) return true; + + // output tag + if (!wf(opaque, node->tag, node->tag_len)) return false; + + if (!wf(opaque, ": ", 2)) return false; + + if (ptr) { + ptr += bit_ofs >> 3UL; + bit_ofs &= 0x07; + + const char* p_out = NULL; + if (node->type == YDT_STRING) { + // assert(!bit_ofs); + if (!yaml_output_string((const char*)ptr, (node->size) >> 3UL, wf, + opaque)) return false; - - if (node->type == YDT_PADDING) - return true; - - // output tag - if (!wf(opaque, node->tag, node->tag_len)) + } else if (node->type == YDT_CUSTOM) { + if (node->u._cust_attr.write && + !node->u._cust_attr.write(user, ptr, bit_ofs, wf, opaque)) return false; + } else { + unsigned int i = yaml_get_bits(ptr, bit_ofs, node->size); - if (!wf(opaque, ": ", 2)) - return false; + if ((node->type == YDT_SIGNED || node->type == YDT_UNSIGNED) && + node->u._cust.uint_to_cust) { + return node->u._cust.uint_to_cust(node, i, wf, opaque) && + wf(opaque, "\r\n", 2); + } else { + switch (node->type) { + case YDT_SIGNED: + p_out = yaml_signed2str((int)yaml_to_signed(i, node->size)); + break; + case YDT_UNSIGNED: + p_out = yaml_unsigned2str(i); + break; + case YDT_ENUM: + p_out = yaml_output_enum(i, node->u._enum.choices); + break; - if (ptr) { - - ptr += bit_ofs >> 3UL; - bit_ofs &= 0x07; - - const char* p_out = NULL; - if (node->type == YDT_STRING) { - //assert(!bit_ofs); - if (!yaml_output_string((const char*)ptr, (node->size)>>3UL, wf, opaque)) - return false; + case YDT_ARRAY: + case YDT_UNION: + default: + break; } - else if (node->type == YDT_CUSTOM) { - if (node->u._cust_attr.write - && !node->u._cust_attr.write(node, ptr, bit_ofs, idx, wf, opaque)) - return false; - } - else { - unsigned int i = yaml_get_bits(ptr, bit_ofs, node->size); - - if ((node->type == YDT_SIGNED || node->type == YDT_UNSIGNED) - && node->u._cust.uint_to_cust) { - return node->u._cust.uint_to_cust(node, i, wf, opaque) - && wf(opaque, "\r\n", 2); - } - else { - switch(node->type) { - case YDT_SIGNED: - p_out = yaml_signed2str((int)yaml_to_signed(i, node->size)); - break; - case YDT_UNSIGNED: - p_out = yaml_unsigned2str(i); - break; - case YDT_ENUM: - p_out = yaml_output_enum(i, node->u._enum.choices); - break; - - case YDT_ARRAY: - case YDT_UNION: - default: - break; - } - } - } - - if (p_out && !wf(opaque, p_out, strlen(p_out))) - return false; + } } - return wf(opaque, "\r\n", 2); + if (p_out && !wf(opaque, p_out, strlen(p_out))) return false; + } + + return wf(opaque, "\r\n", 2); } YamlTreeWalker::YamlTreeWalker() @@ -389,7 +383,7 @@ bool YamlTreeWalker::isElmtEmpty(uint8_t* data) // assume structs aligned on 8bit boundaries if (node->u._array.u._a.is_active) - return !node->u._array.u._a.is_active(data, bit_ofs, getElmts()); + return !node->u._array.u._a.is_active(this, data, bit_ofs); return yaml_is_zero(data, bit_ofs, node->size); } @@ -452,7 +446,7 @@ void YamlTreeWalker::setAttrValue(char* buf, uint8_t len) uint32_t i = 0; if (attr->u._cust_idx.read) - i = attr->u._cust_idx.read(buf, len); + i = attr->u._cust_idx.read(this, buf, len); else i = yaml_str2uint(buf, len); @@ -465,7 +459,7 @@ void YamlTreeWalker::setAttrValue(char* buf, uint8_t len) } } else { - yaml_set_attr(data, getBitOffset(), attr, getParentElmts(), buf, len); + yaml_set_attr(this, data, getBitOffset(), attr, buf, len); } } @@ -533,19 +527,20 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) for(int i=2; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(NULL, 0, node, 0, wf, opaque)) + if (!yaml_output_attr(this, NULL, 0, node, wf, opaque)) return false; // TODO: error handling??? // grab attr idx... - uint8_t idx = node->u._array.u.select_member(data, getBitOffset()); - //TRACE("", idx); + uint8_t idx = + node->u._array.u.select_member(this, data, getBitOffset()); + // TRACE("", idx); setAttrIdx(idx); attr = getAttr(); for(int i=1; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(data, getBitOffset(), attr, 0, wf, opaque)) + if (!yaml_output_attr(this, data, getBitOffset(), attr, wf, opaque)) return false; // TODO: error handling??? if (attr->type != YDT_ARRAY @@ -578,7 +573,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) for(int i=2; i < getLevel(); i++) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(NULL, 0, getNode(),0, wf, opaque)) + if (!yaml_output_attr(this, NULL, 0, getNode(), wf, opaque)) return false; // TODO: error handling??? continue; } @@ -600,7 +595,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) return false; if (attr->u._cust_idx.write) { - if (!attr->u._cust_idx.write(getElmts(),wf,opaque)) + if (!attr->u._cust_idx.write(this,wf,opaque)) return false; } else { @@ -633,7 +628,7 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) if (!wf(opaque, " ", 3)) return false; - if (!yaml_output_attr(data, getBitOffset(), attr, getParentElmts(), wf, opaque)) + if (!yaml_output_attr(this, data, getBitOffset(), attr, wf, opaque)) return false; // TODO: error handling??? } diff --git a/radio/src/storage/yaml/yaml_tree_walker.h b/radio/src/storage/yaml/yaml_tree_walker.h index c27da5c91..913f77350 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.h +++ b/radio/src/storage/yaml/yaml_tree_walker.h @@ -132,14 +132,12 @@ public: return NULL; } - uint16_t getElmts() { - return stack[stack_level].elmts; + uint16_t getElmts(uint8_t lvl = 0) { + if (stack_level + lvl >= NODE_STACK_DEPTH) + return 0; + return stack[stack_level + lvl].elmts; } - uint16_t getParentElmts() { - return empty() ? 0 : stack[stack_level + 1].elmts; - } - // Increment the cursor until a match is found or the end of // the current collection (node of type YDT_NONE) is reached. // From 4ee58045e1376227755cca35b5078ebbc47b2464 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 21 Oct 2021 15:08:00 +0200 Subject: [PATCH 066/110] Improved mixer source (de-)serialization --- radio/src/datastructs.h | 13 +- radio/src/simu.cpp | 2 +- .../yaml/yaml_datastructs_funcs.cpp | 74 +++++++++ .../yaml/yaml_datastructs_nv14.cpp | 2 +- .../conversions/yaml/yaml_datastructs_t12.cpp | 10 +- .../conversions/yaml/yaml_datastructs_t8.cpp | 10 +- .../yaml/yaml_datastructs_tlite.cpp | 10 +- .../yaml/yaml_datastructs_tx12.cpp | 10 +- .../conversions/yaml/yaml_datastructs_x10.cpp | 2 +- .../yaml/yaml_datastructs_x12s.cpp | 2 +- .../conversions/yaml/yaml_datastructs_x7.cpp | 10 +- .../conversions/yaml/yaml_datastructs_x9d.cpp | 10 +- .../conversions/yaml/yaml_datastructs_x9e.cpp | 10 +- .../yaml/yaml_datastructs_x9lite.cpp | 10 +- .../yaml/yaml_datastructs_x9lites.cpp | 10 +- .../yaml/yaml_datastructs_xlite.cpp | 10 +- .../yaml/yaml_datastructs_xlites.cpp | 10 +- radio/src/storage/yaml/yaml_bits.cpp | 40 +++-- radio/src/storage/yaml/yaml_bits.h | 3 + .../storage/yaml/yaml_datastructs_funcs.cpp | 156 ++++++++++++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_t12.cpp | 10 +- .../src/storage/yaml/yaml_datastructs_t8.cpp | 10 +- .../storage/yaml/yaml_datastructs_tlite.cpp | 10 +- .../storage/yaml/yaml_datastructs_tx12.cpp | 10 +- .../src/storage/yaml/yaml_datastructs_x10.cpp | 2 +- .../storage/yaml/yaml_datastructs_x12s.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x7.cpp | 10 +- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 10 +- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 10 +- .../storage/yaml/yaml_datastructs_x9lite.cpp | 10 +- .../storage/yaml/yaml_datastructs_x9lites.cpp | 10 +- .../storage/yaml/yaml_datastructs_xlite.cpp | 10 +- .../storage/yaml/yaml_datastructs_xlites.cpp | 10 +- radio/src/storage/yaml/yaml_tree_walker.cpp | 5 + 35 files changed, 394 insertions(+), 131 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index c8e8bd3b3..7840fe94f 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -257,7 +257,7 @@ PACK(struct SwashRingData { #if MAX_SCRIPTS > 0 union ScriptDataInput { int16_t value; - source_t source; + source_t source CUST(r_mixSrcRaw,w_mixSrcRaw); } FUNC(select_script_input); PACK(struct ScriptData { @@ -288,14 +288,23 @@ typedef int16_t ls_telemetry_value_t; #if !defined(COLORLCD) PACK(struct FrSkyBarData { - source_t source; + source_t source CUST(r_mixSrcRaw,w_mixSrcRaw); ls_telemetry_value_t barMin; // minimum for bar display ls_telemetry_value_t barMax; // ditto for max display (would usually = ratio) }); +#if defined(YAML_GENERATOR) +PACK(struct LineDataSource { + source_t val CUST(r_mixSrcRaw,w_mixSrcRaw); +}); +PACK(struct FrSkyLineData { + LineDataSource sources[NUM_LINE_ITEMS]; +}); +#else PACK(struct FrSkyLineData { source_t sources[NUM_LINE_ITEMS]; }); +#endif #if defined(PCBTARANIS) PACK(struct TelemetryScriptData { diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 95dcb95a2..dcff7f081 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -634,7 +634,7 @@ int main(int argc, char ** argv) startEepromThread(argc >= 2 ? argv[1] : "eeprom.bin"); #endif startAudioThread(); - simuStart(false, argc >= 3 ? argv[2] : 0, argc >= 4 ? argv[3] : 0); + simuStart(true/*false*/, argc >= 3 ? argv[2] : 0, argc >= 4 ? argv[3] : 0); return application.run(); } diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index e3fd62bfc..f4c688383 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -49,6 +49,17 @@ extern const struct YamlIdStr enum_MixSources[]; #define r_mixSrcRaw nullptr +static constexpr char closing_parenthesis[] = ")"; + +static bool output_source_1_param(const char* src_prefix, size_t src_len, uint32_t n, + yaml_writer_func wf, void* opaque) +{ + if (!wf(opaque, src_prefix, src_len)) return false; + const char* str = yaml_unsigned2str(n); + if (!wf(opaque, str, strlen(str))) return false; + return true; +} + static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { const char* str = nullptr; @@ -61,6 +72,69 @@ static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, str = yaml_unsigned2str(val - MIXSRC_FIRST_INPUT); } +#if defined(LUA_INPUTS) + else if (val >= MIXSRC_FIRST_LUA + && val <= MIXSRC_LAST_LUA) { + + if (!wf(opaque, "lua(", 4)) return false; + + val -= MIXSRC_FIRST_LUA; + uint32_t script = val / MAX_SCRIPT_OUTPUTS; + + if (!output_source_1_param("lua(", 4, script, wf, opaque)) return false; + if (!wf(opaque, ",", 1)) return false; + + val = val % MAX_SCRIPT_OUTPUTS; + str = yaml_unsigned2str(val); + + if (!wf(opaque, str, strlen(str))) return false; + str = closing_parenthesis; + } +#endif + else if (val >= MIXSRC_FIRST_LOGICAL_SWITCH + && val <= MIXSRC_LAST_LOGICAL_SWITCH) { + + val -= MIXSRC_FIRST_LOGICAL_SWITCH; + if (!output_source_1_param("ls(", 3, val, wf, opaque)) return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_TRAINER + && val <= MIXSRC_LAST_TRAINER) { + + val -= MIXSRC_FIRST_TRAINER; + if (!output_source_1_param("tr(", 3, val, wf, opaque)) return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_CH + && val <= MIXSRC_LAST_CH) { + + val -= MIXSRC_FIRST_CH; + if (!output_source_1_param("ch(", 3, val, wf, opaque)) return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_GVAR + && val <= MIXSRC_LAST_GVAR) { + + val -= MIXSRC_FIRST_GVAR; + if (!output_source_1_param("gv(", 3, val, wf, opaque)) return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_TELEM + && val <= MIXSRC_LAST_TELEM) { + + val -= MIXSRC_FIRST_TELEM; + uint8_t sign = val % 3; + val = val / 3; + if (!wf(opaque, "tele(", 5)) return false; + if (sign == 1) { + if (!wf(opaque, "-", 1)) return false; + } else if (sign == 2) { + if (!wf(opaque, "+", 1)) return false; + } + str = yaml_unsigned2str(val); + if (!wf(opaque, str, strlen(str))) return false; + str = closing_parenthesis; + } else { str = yaml_output_enum(val, enum_MixSources); } diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index cf510201a..0fb96eb81 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -666,7 +666,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED_CUST( "source", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index 3a4d01222..a662a0ff5 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index 3a4d01222..a662a0ff5 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index 3a4d01222..a662a0ff5 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index 4e08a3b50..2de1f226e 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 45482c63f..1e768a088 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -683,7 +683,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 027e6d428..3f43f5438 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -683,7 +683,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index 3a4d01222..a662a0ff5 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index 1897417c3..6b4323b74 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -644,7 +644,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -736,19 +736,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 3, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index 2ab5a5992..e7d09858a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -683,7 +683,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -775,19 +775,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 3, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index 2c0f9653c..08f289874 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -621,7 +621,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -708,19 +708,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 76ba4a39c..1fc15f977 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -631,7 +631,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -718,19 +718,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index e38e41470..130bed166 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -628,7 +628,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -715,19 +715,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index fc2e0a1fa..b105ab03e 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -632,7 +632,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -719,19 +719,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_bits.cpp b/radio/src/storage/yaml/yaml_bits.cpp index a53faf72e..8031c6fdf 100644 --- a/radio/src/storage/yaml/yaml_bits.cpp +++ b/radio/src/storage/yaml/yaml_bits.cpp @@ -93,35 +93,51 @@ bool yaml_is_zero(uint8_t* data, uint32_t bitoffs, uint32_t bits) return !yaml_get_bits(data + (bitoffs>>3UL), bitoffs & 0x7, bits); } -int32_t yaml_str2int(const char* val, uint8_t val_len) +int32_t yaml_str2int_ref(const char*& val, uint8_t& val_len) { bool neg = false; int i_val = 0; - - for(uint8_t i=0; i < val_len; i++) { - if (val[i] == '-') - neg = true; - else if (val[i] >= '0' && val[i] <= '9') { - i_val = i_val * 10 + (val[i] - '0'); - } + + while (val_len > 0) { + if (*val == '-') { + neg = true; + } else if (*val >= '0' && *val <= '9') { + i_val = i_val * 10 + (*val - '0'); + } else { + break; + } + val++; val_len--; } return neg ? -i_val : i_val; } -uint32_t yaml_str2uint(const char* val, uint8_t val_len) +int32_t yaml_str2int(const char* val, uint8_t val_len) +{ + return yaml_str2int_ref(val, val_len); +} + +uint32_t yaml_str2uint_ref(const char* val, uint8_t val_len) { uint32_t i_val = 0; - for(uint8_t i=0; i < val_len; i++) { - if (val[i] >= '0' && val[i] <= '9') { - i_val = i_val * 10 + (val[i] - '0'); + while(val_len > 0) { + if (*val >= '0' && *val <= '9') { + i_val = i_val * 10 + (*val - '0'); + } else { + break; } + val++; val_len--; } return i_val; } +uint32_t yaml_str2uint(const char* val, uint8_t val_len) +{ + return yaml_str2uint_ref(val, val_len); +} + static char int2str_buffer[MAX_STR] = {0}; static const char _int2str_lookup[] = { '0', '1', '2', '3', '4', '5', '6' , '7', '8', '9' }; diff --git a/radio/src/storage/yaml/yaml_bits.h b/radio/src/storage/yaml/yaml_bits.h index fd67f890d..81f462b36 100644 --- a/radio/src/storage/yaml/yaml_bits.h +++ b/radio/src/storage/yaml/yaml_bits.h @@ -30,6 +30,9 @@ uint32_t yaml_get_bits(uint8_t* src, uint32_t bit_ofs, uint32_t bits); // assumes bits is a multiple of 8 bool yaml_is_zero(uint8_t* data, uint32_t bitoffs, uint32_t bits); +int32_t yaml_str2int_ref(const char*& val, uint8_t& val_len); +uint32_t yaml_str2uint_ref(const char* val, uint8_t val_len); + int32_t yaml_str2int(const char* val, uint8_t val_len); uint32_t yaml_str2uint(const char* val, uint8_t val_len); diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index d136bfd25..1667283ce 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -70,15 +70,108 @@ static bool in_write_weight(const YamlNode* node, uint32_t val, yaml_writer_func extern const struct YamlIdStr enum_MixSources[]; +// TODO sources: parse/output +// - lua(script#,n): LUA mix outputs +// - ls(n): logical switches +// - tr(n): trainer input +// - ch(n): channels +// - gv(n): gvars +// - tele(n): telemetry +// static uint32_t r_mixSrcRaw(const YamlNode* node, const char* val, uint8_t val_len) { if (val_len > 0 && val[0] == 'I') { return yaml_str2uint(val+1, val_len-1) + MIXSRC_FIRST_INPUT; + } else if (val_len > 4 && + val[0] == 'l' && + val[1] == 'u' && + val[2] == 'a' && + val[3] == '(') { + + // parse int and ignore ',' + val += 4; val_len -= 4; + uint8_t script = yaml_str2uint(val, val_len); + + if (!val_len) return MIXSRC_NONE; + val++; val_len--; + + // parse int and ignore closing ')' + return yaml_str2uint(val, val_len) + MIXSRC_FIRST_LUA + + script * MAX_SCRIPT_OUTPUTS; + + } else if (val_len > 3 && + val[0] == 'l' && + val[1] == 's' && + val[2] == '(') { + + val += 3; val_len -= 3; + // parse int and ignore closing ')' + return yaml_str2uint(val, val_len) + MIXSRC_FIRST_LOGICAL_SWITCH; + + } else if (val_len > 3 && + val[0] == 't' && + val[1] == 'r' && + val[2] == '(') { + + val += 3; val_len -= 3; + // parse int and ignore closing ')' + return yaml_str2uint(val, val_len) + MIXSRC_FIRST_TRAINER; + + } else if (val_len > 3 && + val[0] == 'c' && + val[1] == 'h' && + val[2] == '(') { + + val += 3; val_len -= 3; + // parse int and ignore closing ')' + return yaml_str2uint_ref(val, val_len) + MIXSRC_FIRST_CH; + + } else if (val_len > 3 && + val[0] == 'g' && + val[1] == 'v' && + val[2] == '(') { + + val += 3; val_len -= 3; + // parse int and ignore closing ')' + return yaml_str2uint_ref(val, val_len) + MIXSRC_FIRST_GVAR; + + } else if (val_len > 5 && + val[0] == 't' && + val[1] == 'e' && + val[2] == 'l' && + val[3] == 'e' && + val[4] == '(') { + + val += 5; val_len -= 5; + + // parse sign + uint8_t sign = 0; + if (*val == '-') { + sign = 1; + val++; val_len--; + } else if (*val == '+') { + sign = 2; + val++; val_len--; + } + + // parse int and ignore closing ')' + return yaml_str2uint_ref(val, val_len) * 3 + sign + MIXSRC_FIRST_TELEM; } return yaml_parse_enum(enum_MixSources, val, val_len); } +static constexpr char closing_parenthesis[] = ")"; + +static bool output_source_1_param(const char* src_prefix, size_t src_len, uint32_t n, + yaml_writer_func wf, void* opaque) +{ + if (!wf(opaque, src_prefix, src_len)) return false; + const char* str = yaml_unsigned2str(n); + if (!wf(opaque, str, strlen(str))) return false; + return true; +} + static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { const char* str = nullptr; @@ -91,6 +184,69 @@ static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, str = yaml_unsigned2str(val - MIXSRC_FIRST_INPUT); } +#if defined(LUA_INPUTS) + else if (val >= MIXSRC_FIRST_LUA + && val <= MIXSRC_LAST_LUA) { + + if (!wf(opaque, "lua(", 4)) return false; + + val -= MIXSRC_FIRST_LUA; + uint32_t script = val / MAX_SCRIPT_OUTPUTS; + + if (!output_source_1_param("lua(", 4, script, wf, opaque)) return false; + if (!wf(opaque, ",", 1)) return false; + + val = val % MAX_SCRIPT_OUTPUTS; + str = yaml_unsigned2str(val); + + if (!wf(opaque, str, strlen(str))) return false; + str = closing_parenthesis; + } +#endif + else if (val >= MIXSRC_FIRST_LOGICAL_SWITCH + && val <= MIXSRC_LAST_LOGICAL_SWITCH) { + + val -= MIXSRC_FIRST_LOGICAL_SWITCH; + if (!output_source_1_param("ls(", 3, val, wf, opaque)) return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_TRAINER + && val <= MIXSRC_LAST_TRAINER) { + + val -= MIXSRC_FIRST_TRAINER; + if (!output_source_1_param("tr(", 3, val, wf, opaque)) return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_CH + && val <= MIXSRC_LAST_CH) { + + val -= MIXSRC_FIRST_CH; + if (!output_source_1_param("ch(", 3, val, wf, opaque)) return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_GVAR + && val <= MIXSRC_LAST_GVAR) { + + val -= MIXSRC_FIRST_GVAR; + if (!output_source_1_param("gv(", 3, val, wf, opaque)) return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_TELEM + && val <= MIXSRC_LAST_TELEM) { + + val -= MIXSRC_FIRST_TELEM; + uint8_t sign = val % 3; + val = val / 3; + if (!wf(opaque, "tele(", 5)) return false; + if (sign == 1) { + if (!wf(opaque, "-", 1)) return false; + } else if (sign == 2) { + if (!wf(opaque, "+", 1)) return false; + } + str = yaml_unsigned2str(val); + if (!wf(opaque, str, strlen(str))) return false; + str = closing_parenthesis; + } else { str = yaml_output_enum(val, enum_MixSources); } diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index cf510201a..0fb96eb81 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -666,7 +666,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED_CUST( "source", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 3a4d01222..a662a0ff5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 3a4d01222..a662a0ff5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 3a4d01222..a662a0ff5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 4e08a3b50..2de1f226e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 45482c63f..1e768a088 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -683,7 +683,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 027e6d428..3f43f5438 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -683,7 +683,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 3a4d01222..a662a0ff5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -636,7 +636,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -723,19 +723,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 1897417c3..6b4323b74 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -644,7 +644,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -736,19 +736,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 3, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 2ab5a5992..e7d09858a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -683,7 +683,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -775,19 +775,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 3, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 3, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 2c0f9653c..08f289874 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -621,7 +621,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -708,19 +708,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 76ba4a39c..1fc15f977 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -631,7 +631,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -718,19 +718,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index e38e41470..130bed166 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -628,7 +628,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -715,19 +715,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index fc2e0a1fa..b105ab03e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -632,7 +632,7 @@ static const struct YamlNode struct_TrainerModuleData[] = { }; static const struct YamlNode union_ScriptDataInput_elmts[] = { YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode union_ScriptDataInput[] = { @@ -719,19 +719,19 @@ static const struct YamlNode struct_TelemetrySensor[] = { }; static const struct YamlNode struct_FrSkyBarData[] = { YAML_IDX, - YAML_UNSIGNED( "source", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "barMin", 16 ), YAML_SIGNED( "barMax", 16 ), YAML_END }; -static const struct YamlNode struct_unsigned_16[] = { +static const struct YamlNode struct_LineDataSource[] = { YAML_IDX, - YAML_UNSIGNED( "val", 16 ), + YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), YAML_END }; static const struct YamlNode struct_FrSkyLineData[] = { YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_unsigned_16, NULL), + YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), YAML_END }; static const struct YamlNode struct_TelemetryScriptData[] = { diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index 792c13ccb..5fb2b0e7d 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -510,6 +510,11 @@ bool YamlTreeWalker::generate(yaml_writer_func wf, void* opaque) if (!toParent()) return true; + if (getNode()->type == YDT_UNION) { + if (!toParent()) { + return true; + } + } toNextAttr(); continue; } From b1521579ba3cd8f7f18cdfa2843d388e661e01ab Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 22 Oct 2021 07:53:54 +0200 Subject: [PATCH 067/110] Improved telemetry screen type output --- radio/src/datastructs.h | 34 ++++++++++++--- .../yaml/yaml_datastructs_funcs.cpp | 22 ++++++++++ .../conversions/yaml/yaml_datastructs_t12.cpp | 11 ++--- .../conversions/yaml/yaml_datastructs_t8.cpp | 11 ++--- .../yaml/yaml_datastructs_tlite.cpp | 11 ++--- .../yaml/yaml_datastructs_tx12.cpp | 11 ++--- .../conversions/yaml/yaml_datastructs_x7.cpp | 11 ++--- .../conversions/yaml/yaml_datastructs_x9d.cpp | 11 ++--- .../conversions/yaml/yaml_datastructs_x9e.cpp | 11 ++--- .../yaml/yaml_datastructs_x9lite.cpp | 11 ++--- .../yaml/yaml_datastructs_x9lites.cpp | 11 ++--- .../yaml/yaml_datastructs_xlite.cpp | 11 ++--- .../yaml/yaml_datastructs_xlites.cpp | 11 ++--- .../storage/yaml/yaml_datastructs_funcs.cpp | 41 +++++++++++++++++++ .../src/storage/yaml/yaml_datastructs_t12.cpp | 11 ++--- .../src/storage/yaml/yaml_datastructs_t8.cpp | 11 ++--- .../storage/yaml/yaml_datastructs_tlite.cpp | 11 ++--- .../storage/yaml/yaml_datastructs_tx12.cpp | 11 ++--- .../src/storage/yaml/yaml_datastructs_x7.cpp | 11 ++--- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 11 ++--- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 11 ++--- .../storage/yaml/yaml_datastructs_x9lite.cpp | 11 ++--- .../storage/yaml/yaml_datastructs_x9lites.cpp | 11 ++--- .../storage/yaml/yaml_datastructs_xlite.cpp | 11 ++--- .../storage/yaml/yaml_datastructs_xlites.cpp | 11 ++--- 25 files changed, 223 insertions(+), 116 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 7840fe94f..76d3d019a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -293,6 +293,10 @@ PACK(struct FrSkyBarData { ls_telemetry_value_t barMax; // ditto for max display (would usually = ratio) }); +// This is used to be able to use +// custom read/write functions in +// an array made of typdef'ed literal types +// (YAML generator) #if defined(YAML_GENERATOR) PACK(struct LineDataSource { source_t val CUST(r_mixSrcRaw,w_mixSrcRaw); @@ -301,6 +305,7 @@ PACK(struct FrSkyLineData { LineDataSource sources[NUM_LINE_ITEMS]; }); #else +// This here is the real structure used at run-time PACK(struct FrSkyLineData { source_t sources[NUM_LINE_ITEMS]; }); @@ -313,6 +318,19 @@ PACK(struct TelemetryScriptData { }); #endif +#if defined(YAML_GENERATOR) +union TelemetryScreenData_u { + FrSkyBarData bars[4]; + FrSkyLineData lines[4]; +#if defined(PCBTARANIS) + TelemetryScriptData script; +#endif +}; +PACK(struct TelemetryScreenData { + CUST_ATTR(type,r_tele_screen_type,w_tele_screen_type); + TelemetryScreenData_u u FUNC(select_tele_screen_data); +}); +#else union TelemetryScreenData { FrSkyBarData bars[4]; FrSkyLineData lines[4]; @@ -322,8 +340,10 @@ union TelemetryScreenData { } FUNC(select_tele_screen_data); #endif +#endif + PACK(struct VarioData { - uint8_t source:7; + uint8_t source:7; // telemetry sensor idx + 1 uint8_t centerSilent:1; int8_t centerMax; int8_t centerMin; @@ -340,7 +360,8 @@ PACK(struct VarioData { PACK(struct TelemetrySensor { union { - uint16_t id; // data identifier, for FrSky we can reuse existing ones. Source unit is derived from type. + uint16_t id; // data identifier, for FrSky we can reuse existing ones. + // Source unit is derived from type. NOBACKUP(uint16_t persistentValue); } NAME(id1) FUNC(select_id1); union { @@ -353,7 +374,8 @@ PACK(struct TelemetrySensor { } NAME(id2) FUNC(select_id2); char label[TELEM_LABEL_LEN]; // user defined label uint8_t subId; - uint8_t type:1; // 0=custom / 1=calculated // user can choose what unit to display each value in + uint8_t type:1; // 0=custom / 1=calculated + // user can choose what unit to display each value in uint8_t spare1:1 SKIP; uint8_t unit:6; uint8_t prec:2; @@ -587,7 +609,7 @@ PACK(struct CustomScreenData { NOBACKUP(uint8_t view); #else #define CUSTOM_SCREENS_DATA \ - uint8_t screensType; /* 2bits per screen (None/Gauges/Numbers/Script) */ \ + uint8_t screensType SKIP; /* 2bits per screen (None/Gauges/Numbers/Script) */ \ TelemetryScreenData screens[MAX_TELEMETRY_SCREENS]; \ uint8_t view; #endif @@ -934,7 +956,7 @@ static inline void check_struct() CHKSIZE(SwashRingData, 8); CHKSIZE(FrSkyBarData, 6); CHKSIZE(FrSkyLineData, 4); - CHKTYPE(union TelemetryScreenData, 24); + CHKTYPE(TelemetryScreenData, 24); CHKSIZE(ModelHeader, 12); CHKSIZE(CurveHeader, 4); #elif defined(PCBTARANIS) @@ -948,7 +970,7 @@ static inline void check_struct() CHKSIZE(SwashRingData, 8); CHKSIZE(FrSkyBarData, 6); CHKSIZE(FrSkyLineData, 6); - CHKTYPE(union TelemetryScreenData, 24); + CHKTYPE(TelemetryScreenData, 24); CHKSIZE(ModelHeader, 24); CHKSIZE(CurveHeader, 4); #elif defined(PCBHORUS) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index f4c688383..333242058 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -619,6 +619,28 @@ static bool w_trainerMode(const YamlNode* node, uint32_t val, } #if !defined(COLORLCD) +#define r_tele_screen_type nullptr + +static const char* _tele_screen_type_lookup[] = { + "NONE", + "VALUES", + "BARS", + "SCRIPT", +}; + +static bool w_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + data -= sizeof(TelemetryScreenData) * idx + 1; + uint8_t type = ((*data) >> (2 * idx)) & 0x03; + + const char* str = _tele_screen_type_lookup[type]; + return wf(opaque, str, strlen(str)); +} + static uint8_t select_tele_screen_data(void* user, uint8_t* data, uint32_t bitoffs) { auto tw = reinterpret_cast(user); diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index a662a0ff5..ebf2b590b 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index a662a0ff5..ebf2b590b 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index a662a0ff5..ebf2b590b 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index 2de1f226e..dcc89681f 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index a662a0ff5..ebf2b590b 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index 6b4323b74..658c03899 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -756,15 +756,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -811,8 +812,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index e7d09858a..60c458ce1 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -795,15 +795,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -851,8 +852,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_UNSIGNED( "toplcdTimer", 8 ), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index 08f289874..b7b0ad2ea 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -728,15 +728,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -781,8 +782,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 1fc15f977..457f34051 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -738,15 +738,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -791,8 +792,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index 130bed166..34b6947fd 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -735,15 +735,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -788,8 +789,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index b105ab03e..5ca354dfd 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -739,15 +739,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -792,8 +793,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 1667283ce..fa7dac400 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -923,6 +923,47 @@ static bool w_trainerMode(const YamlNode* node, uint32_t val, } #if !defined(COLORLCD) + +static const char* _tele_screen_type_lookup[] = { + "NONE", + "VALUES", + "BARS", + "SCRIPT", +}; + +static void r_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) +{ + uint8_t type = 0; + for (uint8_t i = 0; i < 4; i++) { + if (!strncmp(val, _tele_screen_type_lookup[i], val_len)) { + type = i; + break; + } + } + + if (!type) return; + + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + data -= sizeof(TelemetryScreenData) * idx + 1; + *data = (*data & ~(0x03 << (2 * idx))) | (type << (2 * idx)); +} + +static bool w_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + data -= sizeof(TelemetryScreenData) * idx + 1; + uint8_t type = ((*data) >> (2 * idx)) & 0x03; + + const char* str = _tele_screen_type_lookup[type]; + return wf(opaque, str, strlen(str)); +} + static uint8_t select_tele_screen_data(void* user, uint8_t* data, uint32_t bitoffs) { auto tw = reinterpret_cast(user); diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index a662a0ff5..ebf2b590b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index a662a0ff5..ebf2b590b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index a662a0ff5..ebf2b590b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 2de1f226e..dcc89681f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index a662a0ff5..ebf2b590b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -743,15 +743,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -796,8 +797,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 6b4323b74..658c03899 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -756,15 +756,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -811,8 +812,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index e7d09858a..60c458ce1 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -795,15 +795,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 48, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -851,8 +852,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_UNSIGNED( "toplcdTimer", 8 ), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 08f289874..b7b0ad2ea 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -728,15 +728,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -781,8 +782,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 1fc15f977..457f34051 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -738,15 +738,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -791,8 +792,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 130bed166..34b6947fd 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -735,15 +735,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -788,8 +789,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index b105ab03e..5ca354dfd 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -739,15 +739,16 @@ static const struct YamlNode struct_TelemetryScriptData[] = { YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData_elmts[] = { +static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), YAML_END }; -static const struct YamlNode union_TelemetryScreenData[] = { +static const struct YamlNode struct_TelemetryScreenData[] = { YAML_IDX, - YAML_UNION("u", 192, union_TelemetryScreenData_elmts, select_tele_screen_data), + YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), + YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), YAML_END }; static const struct YamlNode struct_ModelData[] = { @@ -792,8 +793,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_UNSIGNED( "screensType", 8 ), - YAML_ARRAY("screens", 192, 4, union_TelemetryScreenData, NULL), + YAML_PADDING( 8 ), + YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), YAML_END From c9b20063ec201bf8006e2d7eb3c336b9ddad131a Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 23 Oct 2021 15:39:04 +0200 Subject: [PATCH 068/110] Use YAML output functions from version 220 as long as possible This allows to save some flash memory. --- .../yaml/yaml_datastructs_funcs.cpp | 110 ++--- .../storage/yaml/yaml_datastructs_funcs.cpp | 391 +++++------------- 2 files changed, 150 insertions(+), 351 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 333242058..ef1c22b4f 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -28,21 +28,21 @@ #define in_read_weight nullptr -static bool in_write_weight(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool in_write_weight(const YamlNode* node, uint32_t val, yaml_writer_func wf, + void* opaque) { - int32_t sval = yaml_to_signed(val,node->size); - - if (sval > GVAR_SMALL-11 && sval < GVAR_SMALL-1) { - char n = GVAR_SMALL - sval + '0'; - return wf(opaque, "-GV", 3) && wf(opaque, &n, 1); - } - else if (sval < -GVAR_SMALL+11 && sval > -GVAR_SMALL+1) { - char n = val - GVAR_SMALL + '1'; - return wf(opaque, "GV", 2) && wf(opaque, &n, 1); - } + int32_t sval = yaml_to_signed(val, node->size); - char* s = yaml_signed2str(sval); - return wf(opaque, s, strlen(s)); + if (sval > GVAR_SMALL - 11 && sval < GVAR_SMALL - 1) { + char n = GVAR_SMALL - sval + '0'; + return wf(opaque, "-GV", 3) && wf(opaque, &n, 1); + } else if (sval < -GVAR_SMALL + 11 && sval > -GVAR_SMALL + 1) { + char n = val - GVAR_SMALL + '1'; + return wf(opaque, "GV", 2) && wf(opaque, &n, 1); + } + + char* s = yaml_signed2str(sval); + return wf(opaque, s, strlen(s)); } extern const struct YamlIdStr enum_MixSources[]; @@ -60,7 +60,7 @@ static bool output_source_1_param(const char* src_prefix, size_t src_len, uint32 return true; } -static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { const char* str = nullptr; @@ -148,22 +148,22 @@ static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, #define r_vbat_min nullptr -static bool w_vbat_min(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_vbat_min(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - char* s = yaml_signed2str(yaml_to_signed(val,node->size) + 90); - return wf(opaque, s, strlen(s)); + char* s = yaml_signed2str(yaml_to_signed(val,node->size) + 90); + return wf(opaque, s, strlen(s)); } #define r_vbat_max nullptr -static bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - char* s = yaml_signed2str(yaml_to_signed(val,node->size) + 120); - return wf(opaque, s, strlen(s)); + char* s = yaml_signed2str(yaml_to_signed(val,node->size) + 120); + return wf(opaque, s, strlen(s)); } #if defined(COLORLCD) -static uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) +uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; data -= sizeof(ZoneOptionValueEnum); @@ -174,7 +174,7 @@ static uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) } #endif -static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) +uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; data -= offsetof(ModuleData, ppm); @@ -210,7 +210,7 @@ static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) return 0; } -static uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs) +uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; data -= offsetof(CustomFunctionData, all); @@ -228,31 +228,31 @@ static uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs) return 1; } -static uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs) +uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'value' return 0; } -static uint8_t select_id1(void* user, uint8_t* data, uint32_t bitoffs) +uint8_t select_id1(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'id' return 0; } -static uint8_t select_id2(void* user, uint8_t* data, uint32_t bitoffs) +uint8_t select_id2(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'instance' return 0; } -static uint8_t select_sensor_cfg(void* user, uint8_t* data, uint32_t bitoffs) +uint8_t select_sensor_cfg(void* user, uint8_t* data, uint32_t bitoffs) { // always use 'param' return 5; } -static bool sw_write(void* user, yaml_writer_func wf, void* opaque) +bool sw_write(void* user, yaml_writer_func wf, void* opaque) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(); @@ -262,8 +262,8 @@ static bool sw_write(void* user, yaml_writer_func wf, void* opaque) return str ? wf(opaque, str, strlen(str)) : true; } -static bool w_stick_name(void* user, uint8_t* data, uint32_t bitoffs, - yaml_writer_func wf, void* opaque) +bool w_stick_name(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(1); @@ -274,7 +274,7 @@ static bool w_stick_name(void* user, uint8_t* data, uint32_t bitoffs, strnlen(rd->anaNames[idx], LEN_ANA_NAME)); } -static bool stick_name_valid(void* user, uint8_t* data, uint32_t bitoffs) +bool stick_name_valid(void* user, uint8_t* data, uint32_t bitoffs) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(); @@ -288,8 +288,8 @@ static const struct YamlNode struct_sticksConfig[] = { YAML_END }; -static bool sw_name_write(void* user, uint8_t* data, uint32_t bitoffs, - yaml_writer_func wf, void* opaque) +bool sw_name_write(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(1); @@ -318,7 +318,7 @@ static const struct YamlNode struct_switchConfig[] = { YAML_END }; -static bool pot_write(void* user, yaml_writer_func wf, void* opaque) +bool pot_write(void* user, yaml_writer_func wf, void* opaque) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(); @@ -327,8 +327,8 @@ static bool pot_write(void* user, yaml_writer_func wf, void* opaque) return str ? wf(opaque, str, strlen(str)) : true; } -static bool pot_name_write(void* user, uint8_t* data, uint32_t bitoffs, - yaml_writer_func wf, void* opaque) +bool pot_name_write(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(1); @@ -358,7 +358,7 @@ static const struct YamlNode struct_potConfig[] = { YAML_END }; -static bool slider_write(void* user, yaml_writer_func wf, void* opaque) +bool slider_write(void* user, yaml_writer_func wf, void* opaque) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(); @@ -368,8 +368,8 @@ static bool slider_write(void* user, yaml_writer_func wf, void* opaque) return str ? wf(opaque, str, strlen(str)) : true; } -static bool sl_name_write(void* user, uint8_t* data, uint32_t bitoffs, - yaml_writer_func wf, void* opaque) +bool sl_name_write(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(1); @@ -410,7 +410,7 @@ extern const struct YamlIdStr enum_SwitchSources[]; #define r_swtchSrc nullptr -static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { int32_t sval = yaml_to_signed(val, node->size); if (sval < 0) { @@ -461,19 +461,19 @@ static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, return wf(opaque, str, strlen(str)); } -static bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs) +bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; return ((CustomFunctionData*)data)->swtch; } -static bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs) +bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs) { gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); return *gvar != GVAR_MAX+1; } -static bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) +bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) { uint32_t data_ofs = bitoffs >> 3UL; if (data_ofs == offsetof(ModelData, flightModeData)) { @@ -494,7 +494,7 @@ static bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) #define r_swtchWarn nullptr -static bool w_swtchWarn(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_swtchWarn(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { for (int i = 0; i < STORAGE_NUM_SWITCHES; i++) { //if (SWITCH_EXISTS(i)) { @@ -542,7 +542,7 @@ extern const struct YamlIdStr enum_BeeperMode[]; #define r_beeperMode nullptr -static bool w_beeperMode(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_beeperMode(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { int32_t sval = yaml_to_signed(val,node->size); const char* str = yaml_output_enum(sval, enum_BeeperMode); @@ -551,7 +551,7 @@ static bool w_beeperMode(const YamlNode* node, uint32_t val, yaml_writer_func wf #define r_5pos nullptr -static bool w_5pos(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_5pos(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { int32_t sval = yaml_to_signed(val,node->size); char* s = yaml_signed2str(sval + 2); @@ -560,7 +560,7 @@ static bool w_5pos(const YamlNode* node, uint32_t val, yaml_writer_func wf, void #define r_vol nullptr -static bool w_vol(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_vol(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { int32_t sval = yaml_to_signed(val,node->size); char* s = yaml_signed2str(sval + VOLUME_LEVEL_DEF); @@ -569,7 +569,7 @@ static bool w_vol(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* #define r_spPitch nullptr -static bool w_spPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_spPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { char* s = yaml_signed2str(val * 15); return wf(opaque, s, strlen(s)); @@ -577,7 +577,7 @@ static bool w_spPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, v #define r_vPitch nullptr -static bool w_vPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +bool w_vPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { int32_t sval = yaml_to_signed(val,node->size); char* s = yaml_signed2str(sval * 10); @@ -605,8 +605,8 @@ const struct YamlIdStr enum_TrainerMode[] = { #define r_trainerMode nullptr -static bool w_trainerMode(const YamlNode* node, uint32_t val, - yaml_writer_func wf, void* opaque) +bool w_trainerMode(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque) { const char* str = nullptr; str = yaml_output_enum(val, enum_TrainerMode); @@ -621,15 +621,15 @@ static bool w_trainerMode(const YamlNode* node, uint32_t val, #if !defined(COLORLCD) #define r_tele_screen_type nullptr -static const char* _tele_screen_type_lookup[] = { +const char* _tele_screen_type_lookup[] = { "NONE", "VALUES", "BARS", "SCRIPT", }; -static bool w_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, - yaml_writer_func wf, void* opaque) +bool w_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(1); @@ -641,7 +641,7 @@ static bool w_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, return wf(opaque, str, strlen(str)); } -static uint8_t select_tele_screen_data(void* user, uint8_t* data, uint32_t bitoffs) +uint8_t select_tele_screen_data(void* user, uint8_t* data, uint32_t bitoffs) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(2); diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index fa7dac400..9cc1efda9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -23,54 +23,86 @@ #include "yaml_bits.h" #include "yaml_tree_walker.h" +// Use definitions from v220 conversions as long as nothing changes +#include "../conversions/datastructs_220.h" + +namespace yaml_conv_220 { + bool in_write_weight(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + bool w_vbat_min(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs); + uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs); + uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs); + uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs); + uint8_t select_id1(void* user, uint8_t* data, uint32_t bitoffs); + uint8_t select_id2(void* user, uint8_t* data, uint32_t bitoffs); + uint8_t select_sensor_cfg(void* user, uint8_t* data, uint32_t bitoffs); + bool sw_write(void* user, yaml_writer_func wf, void* opaque); + bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs); + bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs); + bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs); + bool w_beeperMode(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + bool w_5pos(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + bool w_vol(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + bool w_spPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + bool w_vPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + + extern const struct YamlIdStr enum_TrainerMode[]; + bool w_trainerMode(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque); + + extern const char* _tele_screen_type_lookup[]; + bool w_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque); +}; + +static_assert(sizeof(CustomFunctionData) == sizeof(bin_storage_220::CustomFunctionData),""); +static_assert(sizeof(ModuleData) == sizeof(bin_storage_220::ModuleData),""); +static_assert(sizeof(FlightModeData) == sizeof(bin_storage_220::FlightModeData),""); + +#if !defined(COLORLCD) +static_assert(sizeof(TelemetryScreenData) == sizeof(bin_storage_220::TelemetryScreenData),""); +#endif + #define GVAR_SMALL 128 static uint32_t in_read_weight(const YamlNode* node, const char* val, uint8_t val_len) { - if ((val_len == 4) - && (val[0] == '-') - && (val[1] == 'G') - && (val[2] == 'V') - && (val[3] >= '1') - && (val[3] <= '9')) { + if ((val_len == 4) + && (val[0] == '-') + && (val[1] == 'G') + && (val[2] == 'V') + && (val[3] >= '1') + && (val[3] <= '9')) { - TRACE("%.*s -> %i\n", val_len, val, GVAR_SMALL - (val[3] - '0')); - return GVAR_SMALL - (val[3] - '0'); // -GVx => 128 - x - } + TRACE("%.*s -> %i\n", val_len, val, GVAR_SMALL - (val[3] - '0')); + return GVAR_SMALL - (val[3] - '0'); // -GVx => 128 - x + } - if ((val_len == 3) - && (val[0] == 'G') - && (val[1] == 'V') - && (val[2] >= '1') - && (val[2] <= '9')) { + if ((val_len == 3) + && (val[0] == 'G') + && (val[1] == 'V') + && (val[2] >= '1') + && (val[2] <= '9')) { - TRACE("%.*s -> %i\n", val_len, val, -GVAR_SMALL + (val[2] - '1')); - return -GVAR_SMALL + (val[2] - '1'); // GVx => -128 + (x-1) - } + TRACE("%.*s -> %i\n", val_len, val, -GVAR_SMALL + (val[2] - '1')); + return -GVAR_SMALL + (val[2] - '1'); // GVx => -128 + (x-1) + } - return (uint32_t)yaml_str2int(val, val_len); + return (uint32_t)yaml_str2int(val, val_len); } -static bool in_write_weight(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +static bool in_write_weight(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque) { - int32_t sval = yaml_to_signed(val,node->size); - - if (sval > GVAR_SMALL-11 && sval < GVAR_SMALL-1) { - char n = GVAR_SMALL - sval + '0'; - return wf(opaque, "-GV", 3) && wf(opaque, &n, 1); - } - else if (sval < -GVAR_SMALL+11 && sval > -GVAR_SMALL+1) { - char n = val - GVAR_SMALL + '1'; - return wf(opaque, "GV", 2) && wf(opaque, &n, 1); - } - - char* s = yaml_signed2str(sval); - return wf(opaque, s, strlen(s)); + return yaml_conv_220::in_write_weight(node, val, wf, opaque); } extern const struct YamlIdStr enum_MixSources[]; -// TODO sources: parse/output +// sources: parse/output // - lua(script#,n): LUA mix outputs // - ls(n): logical switches // - tr(n): trainer input @@ -161,101 +193,9 @@ static uint32_t r_mixSrcRaw(const YamlNode* node, const char* val, uint8_t val_l return yaml_parse_enum(enum_MixSources, val, val_len); } -static constexpr char closing_parenthesis[] = ")"; - -static bool output_source_1_param(const char* src_prefix, size_t src_len, uint32_t n, - yaml_writer_func wf, void* opaque) -{ - if (!wf(opaque, src_prefix, src_len)) return false; - const char* str = yaml_unsigned2str(n); - if (!wf(opaque, str, strlen(str))) return false; - return true; -} - static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - const char* str = nullptr; - - if (val >= MIXSRC_FIRST_INPUT - && val <= MIXSRC_LAST_INPUT) { - - if (!wf(opaque, "I", 1)) - return false; - - str = yaml_unsigned2str(val - MIXSRC_FIRST_INPUT); - } -#if defined(LUA_INPUTS) - else if (val >= MIXSRC_FIRST_LUA - && val <= MIXSRC_LAST_LUA) { - - if (!wf(opaque, "lua(", 4)) return false; - - val -= MIXSRC_FIRST_LUA; - uint32_t script = val / MAX_SCRIPT_OUTPUTS; - - if (!output_source_1_param("lua(", 4, script, wf, opaque)) return false; - if (!wf(opaque, ",", 1)) return false; - - val = val % MAX_SCRIPT_OUTPUTS; - str = yaml_unsigned2str(val); - - if (!wf(opaque, str, strlen(str))) return false; - str = closing_parenthesis; - } -#endif - else if (val >= MIXSRC_FIRST_LOGICAL_SWITCH - && val <= MIXSRC_LAST_LOGICAL_SWITCH) { - - val -= MIXSRC_FIRST_LOGICAL_SWITCH; - if (!output_source_1_param("ls(", 3, val, wf, opaque)) return false; - str = closing_parenthesis; - } - else if (val >= MIXSRC_FIRST_TRAINER - && val <= MIXSRC_LAST_TRAINER) { - - val -= MIXSRC_FIRST_TRAINER; - if (!output_source_1_param("tr(", 3, val, wf, opaque)) return false; - str = closing_parenthesis; - } - else if (val >= MIXSRC_FIRST_CH - && val <= MIXSRC_LAST_CH) { - - val -= MIXSRC_FIRST_CH; - if (!output_source_1_param("ch(", 3, val, wf, opaque)) return false; - str = closing_parenthesis; - } - else if (val >= MIXSRC_FIRST_GVAR - && val <= MIXSRC_LAST_GVAR) { - - val -= MIXSRC_FIRST_GVAR; - if (!output_source_1_param("gv(", 3, val, wf, opaque)) return false; - str = closing_parenthesis; - } - else if (val >= MIXSRC_FIRST_TELEM - && val <= MIXSRC_LAST_TELEM) { - - val -= MIXSRC_FIRST_TELEM; - uint8_t sign = val % 3; - val = val / 3; - if (!wf(opaque, "tele(", 5)) return false; - if (sign == 1) { - if (!wf(opaque, "-", 1)) return false; - } else if (sign == 2) { - if (!wf(opaque, "+", 1)) return false; - } - str = yaml_unsigned2str(val); - if (!wf(opaque, str, strlen(str))) return false; - str = closing_parenthesis; - } - else { - str = yaml_output_enum(val, enum_MixSources); - } - - if (str) { - return wf(opaque, str, strlen(str)); - } - - return true; + return yaml_conv_220::w_mixSrcRaw(node, val, wf, opaque); } static uint32_t r_vbat_min(const YamlNode* node, const char* val, uint8_t val_len) @@ -266,99 +206,55 @@ static uint32_t r_vbat_min(const YamlNode* node, const char* val, uint8_t val_le static bool w_vbat_min(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - char* s = yaml_signed2str(yaml_to_signed(val,node->size) + 90); - return wf(opaque, s, strlen(s)); + return yaml_conv_220::w_vbat_min(node, val, wf, opaque); } static uint32_t r_vbat_max(const YamlNode* node, const char* val, uint8_t val_len) { - int32_t v = yaml_str2int(val, val_len); - return (uint32_t)(v - 120); + int32_t v = yaml_str2int(val, val_len); + return (uint32_t)(v - 120); } static bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - char* s = yaml_signed2str(yaml_to_signed(val,node->size) + 120); - return wf(opaque, s, strlen(s)); + return yaml_conv_220::w_vbat_max(node, val, wf, opaque); } #if defined(COLORLCD) static uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) { - data += bitoffs >> 3UL; - data -= sizeof(ZoneOptionValueEnum); - ZoneOptionValueEnum* p_zovt = (ZoneOptionValueEnum*)data; - if (*p_zovt > ZOV_String) - return 0; - return *p_zovt; + return yaml_conv_220::select_zov(user, data, bitoffs); } #endif static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) { - data += bitoffs >> 3UL; - data -= offsetof(ModuleData, ppm); - - ModuleData* mod_data = reinterpret_cast(data); - switch(mod_data->type) { - case MODULE_TYPE_NONE: - case MODULE_TYPE_PPM: - case MODULE_TYPE_DSM2: - case MODULE_TYPE_CROSSFIRE: - case MODULE_TYPE_GHOST: - return 1; - case MODULE_TYPE_MULTIMODULE: - return 2; - case MODULE_TYPE_XJT_PXX1: - case MODULE_TYPE_R9M_PXX1: - case MODULE_TYPE_R9M_LITE_PXX1: - return 3; - case MODULE_TYPE_SBUS: - return 4; - case MODULE_TYPE_ISRM_PXX2: - case MODULE_TYPE_R9M_PXX2: - case MODULE_TYPE_R9M_LITE_PXX2: - 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; - } - return 0; + return yaml_conv_220::select_mod_type(user, data, bitoffs); } static uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs) { - // always use 'all' - //TODO - return 1; + return yaml_conv_220::select_custom_fn(user, data, bitoffs); } static uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs) { - // always use 'value' - return 0; + return yaml_conv_220::select_script_input(user, data, bitoffs); } static uint8_t select_id1(void* user, uint8_t* data, uint32_t bitoffs) { - // always use 'id' - return 0; + return yaml_conv_220::select_id1(user, data, bitoffs); } static uint8_t select_id2(void* user, uint8_t* data, uint32_t bitoffs) { - // always use 'instance' - return 0; + return yaml_conv_220::select_id2(user, data, bitoffs); } static uint8_t select_sensor_cfg(void* user, uint8_t* data, uint32_t bitoffs) { - // always use 'param' - return 5; + return yaml_conv_220::select_sensor_cfg(user, data, bitoffs); } static uint32_t sw_read(void* user, const char* val, uint8_t val_len) @@ -370,14 +266,9 @@ static uint32_t sw_read(void* user, const char* val, uint8_t val_len) return -1; } -static bool sw_write(void* user, yaml_writer_func wf, void* opaque) +bool sw_write(void* user, yaml_writer_func wf, void* opaque) { - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(); - - const char* str = - yaml_output_enum(idx + MIXSRC_FIRST_SWITCH, enum_MixSources); - return str ? wf(opaque, str, strlen(str)) : true; + return yaml_conv_220::sw_write(user, wf, opaque); } static void r_stick_name(void* user, uint8_t* data, uint32_t bitoffs, @@ -659,84 +550,22 @@ static uint32_t r_swtchSrc(const YamlNode* node, const char* val, uint8_t val_le static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - int32_t sval = yaml_to_signed(val, node->size); - if (sval < 0) { - wf(opaque, "!", 1); - sval = abs(sval); - } - - const char* str = NULL; - if (sval >= SWSRC_FIRST_LOGICAL_SWITCH - && sval <= SWSRC_LAST_LOGICAL_SWITCH) { - - wf(opaque, "L", 1); - str = yaml_unsigned2str(sval - SWSRC_FIRST_LOGICAL_SWITCH + 1); - return wf(opaque,str, strlen(str)); - } -#if NUM_XPOTS > 0 - else if (sval >= SWSRC_FIRST_MULTIPOS_SWITCH - && sval <= SWSRC_LAST_MULTIPOS_SWITCH) { - - wf(opaque, "6P", 2); - - // pot #: start with 6P1 - sval -= SWSRC_FIRST_MULTIPOS_SWITCH; - str = yaml_unsigned2str(sval / XPOTS_MULTIPOS_COUNT); - wf(opaque,str, strlen(str)); - - // position - str = yaml_unsigned2str(sval % XPOTS_MULTIPOS_COUNT); - return wf(opaque,str, strlen(str)); - } -#endif - else if (sval >= SWSRC_FIRST_FLIGHT_MODE - && sval <= SWSRC_LAST_FLIGHT_MODE) { - - wf(opaque, "FM", 2); - str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE); - return wf(opaque,str, strlen(str)); - } - else if (sval >= SWSRC_FIRST_SENSOR - && sval <= SWSRC_LAST_SENSOR) { - - wf(opaque, "T", 2); - str = yaml_unsigned2str(sval - SWSRC_FIRST_SENSOR + 1); - return wf(opaque,str, strlen(str)); - } - - str = yaml_output_enum(sval, enum_SwitchSources); - return wf(opaque, str, strlen(str)); + return yaml_conv_220::w_swtchSrc(node, val, wf, opaque); } -static bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs) +bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs) { - data += bitoffs >> 3UL; - return ((CustomFunctionData*)data)->swtch; + return yaml_conv_220::cfn_is_active(user, data, bitoffs); } static bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs) { - gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); - return *gvar != GVAR_MAX+1; + return yaml_conv_220::gvar_is_active(user, data, bitoffs); } static bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) { - uint32_t data_ofs = bitoffs >> 3UL; - if (data_ofs == offsetof(ModelData, flightModeData)) { - return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData)*8); - } - - bool is_active = !yaml_is_zero(data, bitoffs, - (sizeof(FlightModeData) - - sizeof(FlightModeData::gvars))*8); - - FlightModeData* fmd = (FlightModeData*)(data + data_ofs); - for (uint8_t i=0; igvars[i] != GVAR_MAX+1; - } - - return is_active; + return yaml_conv_220::fmd_is_active(user, data, bitoffs); } static uint32_t r_swtchWarn(const YamlNode* node, const char* val, uint8_t val_len) @@ -833,21 +662,17 @@ static uint32_t r_beeperMode(const YamlNode* node, const char* val, uint8_t val_ static bool w_beeperMode(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - int32_t sval = yaml_to_signed(val,node->size); - const char* str = yaml_output_enum(sval, enum_BeeperMode); - return wf(opaque, str, strlen(str)); + return yaml_conv_220::w_beeperMode(node, val, wf, opaque); } static uint32_t r_5pos(const YamlNode* node, const char* val, uint8_t val_len) { - return (uint32_t)(yaml_str2int(val, val_len) - 2); + return (uint32_t)(yaml_str2int(val, val_len) - 2); } static bool w_5pos(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - int32_t sval = yaml_to_signed(val,node->size); - char* s = yaml_signed2str(sval + 2); - return wf(opaque, s, strlen(s)); + return yaml_conv_220::w_5pos(node, val, wf, opaque); } static uint32_t r_vol(const YamlNode* node, const char* val, uint8_t val_len) @@ -857,32 +682,27 @@ static uint32_t r_vol(const YamlNode* node, const char* val, uint8_t val_len) static bool w_vol(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - int32_t sval = yaml_to_signed(val,node->size); - char* s = yaml_signed2str(sval + VOLUME_LEVEL_DEF); - return wf(opaque, s, strlen(s)); + return yaml_conv_220::w_vol(node, val, wf, opaque); } static uint32_t r_spPitch(const YamlNode* node, const char* val, uint8_t val_len) { - return (uint32_t)(yaml_str2int(val, val_len) / 15); + return (uint32_t)(yaml_str2int(val, val_len) / 15); } static bool w_spPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - char* s = yaml_signed2str(val * 15); - return wf(opaque, s, strlen(s)); + return yaml_conv_220::w_spPitch(node, val, wf, opaque); } static uint32_t r_vPitch(const YamlNode* node, const char* val, uint8_t val_len) { - return (uint32_t)(yaml_str2int(val, val_len) / 10); + return (uint32_t)(yaml_str2int(val, val_len) / 10); } static bool w_vPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - int32_t sval = yaml_to_signed(val,node->size); - char* s = yaml_signed2str(sval * 10); - return wf(opaque, s, strlen(s)); + return yaml_conv_220::w_vPitch(node, val, wf, opaque); } const struct YamlIdStr enum_TrainerMode[] = { @@ -912,31 +732,17 @@ static uint32_t r_trainerMode(const YamlNode* node, const char* val, uint8_t val static bool w_trainerMode(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - const char* str = nullptr; - str = yaml_output_enum(val, enum_TrainerMode); - - if (str) { - return wf(opaque, str, strlen(str)); - } - - return true; + return yaml_conv_220::w_trainerMode(node, val, wf, opaque); } #if !defined(COLORLCD) -static const char* _tele_screen_type_lookup[] = { - "NONE", - "VALUES", - "BARS", - "SCRIPT", -}; - static void r_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, const char* val, uint8_t val_len) { uint8_t type = 0; for (uint8_t i = 0; i < 4; i++) { - if (!strncmp(val, _tele_screen_type_lookup[i], val_len)) { + if (!strncmp(val, yaml_conv_220::_tele_screen_type_lookup[i], val_len)) { type = i; break; } @@ -954,14 +760,7 @@ static void r_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, static bool w_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque) { - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(1); - - data -= sizeof(TelemetryScreenData) * idx + 1; - uint8_t type = ((*data) >> (2 * idx)) & 0x03; - - const char* str = _tele_screen_type_lookup[type]; - return wf(opaque, str, strlen(str)); + return yaml_conv_220::w_tele_screen_type(user, data, bitoffs, wf, opaque); } static uint8_t select_tele_screen_data(void* user, uint8_t* data, uint32_t bitoffs) From baba1c5e9d87f5fb19171dababba4c46ef594034 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 23 Oct 2021 16:31:01 +0200 Subject: [PATCH 069/110] Added some safeguards to avoid issues related to data struct sizes --- .../conversions/yaml/dataconstants_220.h | 7 ++--- .../conversions/yaml/datastructs_220.h | 3 -- .../storage/conversions/yaml/myeeprom_220.h | 9 ++---- .../storage/yaml/yaml_datastructs_funcs.cpp | 29 ++++++++++++++----- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/radio/src/storage/conversions/yaml/dataconstants_220.h b/radio/src/storage/conversions/yaml/dataconstants_220.h index a627c1186..9b41f3d42 100644 --- a/radio/src/storage/conversions/yaml/dataconstants_220.h +++ b/radio/src/storage/conversions/yaml/dataconstants_220.h @@ -19,8 +19,9 @@ * GNU General Public License for more details. */ -#ifndef _DATACONSTANTS_H_ -#define _DATACONSTANTS_H_ +#if defined(_DATACONSTANTS_H_) +#error "This file MUST NOT be included side-by-side with dataconstants.h" +#endif #include #include @@ -1046,5 +1047,3 @@ enum CalibrationState { CALIB_STORE, CALIB_FINISHED }; - -#endif // _DATACONSTANTS_H_ diff --git a/radio/src/storage/conversions/yaml/datastructs_220.h b/radio/src/storage/conversions/yaml/datastructs_220.h index 4b92466a9..2e5392317 100644 --- a/radio/src/storage/conversions/yaml/datastructs_220.h +++ b/radio/src/storage/conversions/yaml/datastructs_220.h @@ -19,9 +19,6 @@ * GNU General Public License for more details. */ -// No include guards here, this file may be included many times in different namespaces -// i.e. BACKUP RAM Backup/Restore functions - #pragma once #include diff --git a/radio/src/storage/conversions/yaml/myeeprom_220.h b/radio/src/storage/conversions/yaml/myeeprom_220.h index eb185d963..f8b780537 100644 --- a/radio/src/storage/conversions/yaml/myeeprom_220.h +++ b/radio/src/storage/conversions/yaml/myeeprom_220.h @@ -19,11 +19,10 @@ * GNU General Public License for more details. */ -#ifndef _MYEEPROM_H_ -#define _MYEEPROM_H_ +#if defined(_MYEEPROM_H_) +#error "This file MUST NOT be included side-by-side with myeeprom.h" +#endif -// #include "datastructs.h" -// #include "libopenui/src/bitfield.h" #if defined(SDCARD_YAML) #define EEPROM_VER 221 @@ -278,5 +277,3 @@ PACK(union u_int8int16_t { constexpr uint8_t EE_GENERAL = 0x01; constexpr uint8_t EE_MODEL = 0x02; - -#endif // _MYEEPROM_H_ diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 9cc1efda9..53babeed9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -24,7 +24,6 @@ #include "yaml_tree_walker.h" // Use definitions from v220 conversions as long as nothing changes -#include "../conversions/datastructs_220.h" namespace yaml_conv_220 { bool in_write_weight(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); @@ -58,12 +57,28 @@ namespace yaml_conv_220 { yaml_writer_func wf, void* opaque); }; -static_assert(sizeof(CustomFunctionData) == sizeof(bin_storage_220::CustomFunctionData),""); -static_assert(sizeof(ModuleData) == sizeof(bin_storage_220::ModuleData),""); -static_assert(sizeof(FlightModeData) == sizeof(bin_storage_220::FlightModeData),""); - -#if !defined(COLORLCD) -static_assert(sizeof(TelemetryScreenData) == sizeof(bin_storage_220::TelemetryScreenData),""); +// +// WARNING: +// ======== +// +// If any of these static_assert() fails, you need to check that +// the functions bellow are still applicable. +// +// Please note that the sizes used here are those from the v220 format +// (see storage/conversions/yaml/datastructs_220.h) +// +static_assert(sizeof(ModuleData) == 29,""); +#if defined(PCBHORUS) || defined(PCBNV14) +static_assert(sizeof(FlightModeData) == 44, ""); +static_assert(sizeof(CustomFunctionData) == 9,""); +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) +static_assert(sizeof(FlightModeData) == 36, ""); +static_assert(sizeof(CustomFunctionData) == 11,""); +static_assert(sizeof(TelemetryScreenData) == 24, ""); +#else +static_assert(sizeof(FlightModeData) == 40, ""); +static_assert(sizeof(CustomFunctionData) == 11,""); +static_assert(sizeof(TelemetryScreenData) == 24, ""); #endif #define GVAR_SMALL 128 From 9f7f39376a8b7d4188096e82644f1b0525264e3f Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 23 Oct 2021 21:40:59 +0200 Subject: [PATCH 070/110] Fix datastruct sizes for NV14 --- .../storage/yaml/yaml_datastructs_funcs.cpp | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 53babeed9..0e7964460 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -67,19 +67,27 @@ namespace yaml_conv_220 { // Please note that the sizes used here are those from the v220 format // (see storage/conversions/yaml/datastructs_220.h) // -static_assert(sizeof(ModuleData) == 29,""); -#if defined(PCBHORUS) || defined(PCBNV14) -static_assert(sizeof(FlightModeData) == 44, ""); -static_assert(sizeof(CustomFunctionData) == 9,""); +static inline void check_yaml_funcs() +{ + check_size(); // offsetof(ModuleData, ppm) == 4 +#if defined(PCBHORUS) + // offsetof(ModelData, flightModeData) + // sizeof(FlightModeData::gvars) + check_size(); + check_size(); +#elif defined(PCBNV14) + check_size(); + check_size(); #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) -static_assert(sizeof(FlightModeData) == 36, ""); -static_assert(sizeof(CustomFunctionData) == 11,""); -static_assert(sizeof(TelemetryScreenData) == 24, ""); + check_size(); + check_size(); + check_size(); #else -static_assert(sizeof(FlightModeData) == 40, ""); -static_assert(sizeof(CustomFunctionData) == 11,""); -static_assert(sizeof(TelemetryScreenData) == 24, ""); + check_size(); + check_size(); + check_size(); #endif +} #define GVAR_SMALL 128 From d8bda6b8bb1f8f071a1dfbb3aba711ba5d27a7a1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 24 Oct 2021 00:22:17 +0200 Subject: [PATCH 071/110] Reworked flight mode gvar output & size checks --- .../yaml/yaml_datastructs_funcs.cpp | 32 +++++++++++-------- .../storage/yaml/yaml_datastructs_funcs.cpp | 10 ++++-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index ef1c22b4f..5c2e8dd95 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -469,27 +469,31 @@ bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs) bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs) { - gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); - return *gvar != GVAR_MAX+1; + // TODO: no need to output 0 values for FM0 + gvar_t* gvar = (gvar_t*)(data + (bitoffs>>3UL)); + return *gvar != GVAR_MAX+1; } bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) { - uint32_t data_ofs = bitoffs >> 3UL; - if (data_ofs == offsetof(ModelData, flightModeData)) { - return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData)*8); - } + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); - bool is_active = !yaml_is_zero(data, bitoffs, - (sizeof(FlightModeData) - - sizeof(FlightModeData::gvars))*8); + // FM0 defaults to all 0 + if (idx == 0) { + return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData)); + } - FlightModeData* fmd = (FlightModeData*)(data + data_ofs); - for (uint8_t i=0; igvars[i] != GVAR_MAX+1; - } + // assumes gvars array is last + bool is_active = !yaml_is_zero(data, bitoffs, offsetof(FlightModeData, gvars)); - return is_active; + data += bitoffs >> 3UL; + FlightModeData* fmd = (FlightModeData*)(data); + for (uint8_t i=0; igvars[i] != GVAR_MAX+1; // FM0 -> default + } + + return is_active; } #define r_swtchWarn nullptr diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 0e7964460..0c896f93a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -69,20 +69,24 @@ namespace yaml_conv_220 { // static inline void check_yaml_funcs() { - check_size(); // offsetof(ModuleData, ppm) == 4 + static_assert(offsetof(ModuleData, ppm) == 4,""); + check_size(); + static_assert(MAX_GVARS == 9,""); #if defined(PCBHORUS) - // offsetof(ModelData, flightModeData) - // sizeof(FlightModeData::gvars) + static_assert(offsetof(FlightModeData, gvars) == 26,""); check_size(); check_size(); #elif defined(PCBNV14) + static_assert(offsetof(FlightModeData, gvars) == 22,""); check_size(); check_size(); #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) + static_assert(offsetof(FlightModeData, gvars) == 18,""); check_size(); check_size(); check_size(); #else + static_assert(offsetof(FlightModeData, gvars) == 22,""); check_size(); check_size(); check_size(); From 24b69098c78799c4d28b34a6a5a48702b2517078 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 24 Oct 2021 11:58:23 +0200 Subject: [PATCH 072/110] Improved swashR, flightModes & sources --- radio/src/datastructs.h | 23 +++++----- .../yaml/yaml_datastructs_funcs.cpp | 31 +++++++++++++ .../yaml/yaml_datastructs_nv14.cpp | 27 ++++++++---- .../conversions/yaml/yaml_datastructs_t12.cpp | 27 ++++++++---- .../conversions/yaml/yaml_datastructs_t8.cpp | 27 ++++++++---- .../yaml/yaml_datastructs_tlite.cpp | 27 ++++++++---- .../yaml/yaml_datastructs_tx12.cpp | 27 ++++++++---- .../conversions/yaml/yaml_datastructs_x10.cpp | 27 ++++++++---- .../yaml/yaml_datastructs_x12s.cpp | 27 ++++++++---- .../conversions/yaml/yaml_datastructs_x7.cpp | 27 ++++++++---- .../conversions/yaml/yaml_datastructs_x9d.cpp | 31 ++++++++----- .../conversions/yaml/yaml_datastructs_x9e.cpp | 31 ++++++++----- .../yaml/yaml_datastructs_x9lite.cpp | 27 ++++++++---- .../yaml/yaml_datastructs_x9lites.cpp | 27 ++++++++---- .../yaml/yaml_datastructs_xlite.cpp | 27 ++++++++---- .../yaml/yaml_datastructs_xlites.cpp | 27 ++++++++---- radio/src/storage/sdcard_yaml.cpp | 21 ++++++--- .../storage/yaml/yaml_datastructs_funcs.cpp | 43 +++++++++++++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 27 ++++++++---- .../src/storage/yaml/yaml_datastructs_t12.cpp | 27 ++++++++---- .../src/storage/yaml/yaml_datastructs_t8.cpp | 27 ++++++++---- .../storage/yaml/yaml_datastructs_tlite.cpp | 27 ++++++++---- .../storage/yaml/yaml_datastructs_tx12.cpp | 27 ++++++++---- .../src/storage/yaml/yaml_datastructs_x10.cpp | 27 ++++++++---- .../storage/yaml/yaml_datastructs_x12s.cpp | 27 ++++++++---- .../src/storage/yaml/yaml_datastructs_x7.cpp | 27 ++++++++---- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 31 ++++++++----- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 31 ++++++++----- .../storage/yaml/yaml_datastructs_x9lite.cpp | 27 ++++++++---- .../storage/yaml/yaml_datastructs_x9lites.cpp | 27 ++++++++---- .../storage/yaml/yaml_datastructs_xlite.cpp | 27 ++++++++---- .../storage/yaml/yaml_datastructs_xlites.cpp | 27 ++++++++---- 32 files changed, 613 insertions(+), 277 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 76d3d019a..abcb55c1a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -80,7 +80,7 @@ PACK(struct MixData { uint16_t spare:1 SKIP; int32_t offset:14; int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); - uint32_t flightModes:9; //TODO ?? + uint32_t flightModes:9 CUST(r_flightModes, w_flightModes); CurveRef curve; uint8_t delayUp; uint8_t delayDown; @@ -100,7 +100,7 @@ PACK(struct ExpoData { int16_t carryTrim:6; uint32_t chn:5; int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); - uint32_t flightModes:9; //TODO ?? + uint32_t flightModes:9 CUST(r_flightModes, w_flightModes); int32_t weight:8 CUST(in_read_weight,in_write_weight); int32_t spare:1 SKIP; NOBACKUP(char name[LEN_EXPOMIX_NAME]); @@ -244,11 +244,11 @@ PACK(struct TimerData { */ PACK(struct SwashRingData { - uint8_t type; + uint8_t type ENUM(SwashType); uint8_t value; - uint8_t collectiveSource; - uint8_t aileronSource; - uint8_t elevatorSource; + uint8_t collectiveSource CUST(r_mixSrcRaw,w_mixSrcRaw); + uint8_t aileronSource CUST(r_mixSrcRaw,w_mixSrcRaw); + uint8_t elevatorSource CUST(r_mixSrcRaw,w_mixSrcRaw); int8_t collectiveWeight; int8_t aileronWeight; int8_t elevatorWeight; @@ -343,7 +343,7 @@ union TelemetryScreenData { #endif PACK(struct VarioData { - uint8_t source:7; // telemetry sensor idx + 1 + uint8_t source:7 CUST(r_tele_sensor,w_tele_sensor); // telemetry sensor idx + 1 uint8_t centerSilent:1; int8_t centerMax; int8_t centerMin; @@ -615,9 +615,10 @@ PACK(struct CustomScreenData { #endif #if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) + // telemetry sensor idx + 1 #define TOPBAR_DATA \ - NOBACKUP(uint8_t voltsSource); \ - NOBACKUP(uint8_t altitudeSource); + NOBACKUP(uint8_t voltsSource CUST(r_tele_sensor,w_tele_sensor)); \ + NOBACKUP(uint8_t altitudeSource CUST(r_tele_sensor,w_tele_sensor)); #else #define TOPBAR_DATA #endif @@ -658,7 +659,7 @@ PACK(struct ModelData { LogicalSwitchData logicalSw[MAX_LOGICAL_SWITCHES]; CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS] FUNC(cfn_is_active); - SwashRingData swashR; + SwashRingData swashR FUNC(swash_is_active); FlightModeData flightModeData[MAX_FLIGHT_MODES] FUNC(fmd_is_active); NOBACKUP(uint8_t thrTraceSrc); @@ -668,7 +669,7 @@ PACK(struct ModelData { GVarData gvars[MAX_GVARS]; NOBACKUP(VarioData varioData); - NOBACKUP(uint8_t rssiSource); + NOBACKUP(uint8_t rssiSource CUST(r_tele_sensor,w_tele_sensor)); TOPBAR_DATA diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 5c2e8dd95..02cba49b6 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -496,6 +496,12 @@ bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) return is_active; } +bool swash_is_active(void* user, uint8_t* data, uint32_t bitoffs) +{ + auto swashR = reinterpret_cast(data + (bitoffs >> 3UL)); + return swashR->type | swashR->value; +} + #define r_swtchWarn nullptr bool w_swtchWarn(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) @@ -667,3 +673,28 @@ uint8_t select_tele_screen_data(void* user, uint8_t* data, uint32_t bitoffs) return 0; } #endif + +#define r_tele_sensor nullptr + +bool w_tele_sensor(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque) +{ + if (!val) { + return wf(opaque, "none", 4); + } + + const char* str = yaml_unsigned2str(val-1); + return wf(opaque, str, strlen(str)); +} + +#define r_flightModes nullptr + +bool w_flightModes(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque) +{ + for (uint32_t i = 0; i < node->size; i++) { + uint32_t bit = (val >> i) & 1; + if (!wf(opaque, bit ? "1" : "0", 1)) return false; + } + return true; +} diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index 0fb96eb81..d4a57d1f1 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -178,6 +178,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -446,7 +455,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -475,7 +484,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -510,11 +519,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -549,7 +558,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -804,13 +813,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index ebf2b590b..fd87f2472 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index ebf2b590b..fd87f2472 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index ebf2b590b..fd87f2472 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index dcc89681f..dd3c4b6f6 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 1e768a088..60fce7da6 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -189,6 +189,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -463,7 +472,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -492,7 +501,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -527,11 +536,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -566,7 +575,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -821,13 +830,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 3f43f5438..c2432874a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -189,6 +189,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -463,7 +472,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -492,7 +501,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -527,11 +536,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -566,7 +575,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -821,13 +830,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index ebf2b590b..fd87f2472 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index 658c03899..be2995d3d 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -175,6 +175,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -424,7 +433,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -453,7 +462,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -488,11 +497,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -527,7 +536,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -790,16 +799,16 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 16 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), - YAML_UNSIGNED( "voltsSource", 8 ), - YAML_UNSIGNED( "altitudeSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), + YAML_UNSIGNED_CUST( "voltsSource", 8, r_tele_sensor, w_tele_sensor ), + YAML_UNSIGNED_CUST( "altitudeSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index 60c458ce1..f1e5cc9bb 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -187,6 +187,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -463,7 +472,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -492,7 +501,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -527,11 +536,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -566,7 +575,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -829,16 +838,16 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 64, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 32 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), - YAML_UNSIGNED( "voltsSource", 8 ), - YAML_UNSIGNED( "altitudeSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), + YAML_UNSIGNED_CUST( "voltsSource", 8, r_tele_sensor, w_tele_sensor ), + YAML_UNSIGNED_CUST( "altitudeSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index b7b0ad2ea..3686cf595 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -167,6 +167,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -401,7 +410,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -430,7 +439,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -465,11 +474,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -504,7 +513,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -762,14 +771,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 457f34051..310d01f92 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -169,6 +169,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -411,7 +420,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -440,7 +449,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -475,11 +484,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -514,7 +523,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -772,14 +781,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index 34b6947fd..b68bdd4b4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -169,6 +169,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -408,7 +417,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -437,7 +446,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -472,11 +481,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -511,7 +520,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -769,14 +778,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index 5ca354dfd..d5d2b4903 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -412,7 +421,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -441,7 +450,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -476,11 +485,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -515,7 +524,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -773,14 +782,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 6e79e153c..5e834e671 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -188,12 +188,14 @@ const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t siz // YAML reader TRACE("YAML model reader"); + bool init_model = true; const YamlNode* data_nodes = nullptr; if (size == sizeof(g_model)) { data_nodes = get_modeldata_nodes(); } else if (size == sizeof(PartialModel)) { data_nodes = get_partialmodel_nodes(); + init_model = false; } else { TRACE("cannot find YAML data nodes for object size (size=%d)", size); @@ -209,16 +211,23 @@ const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t siz // wipe memory before reading YAML memset(buffer,0,size); + if (init_model) { + auto md = reinterpret_cast(buffer); #if defined(FLIGHT_MODES) && defined(GVARS) - // reset GVars to default values - // Note: taken from opentx.cpp::modelDefault() - //TODO: new func in gvars - for (int p=1; pflightModeData[p].gvars[i] = GVAR_MAX+1; } - } + } #endif + // is that necessary ??? + // md->swashR.collectiveWeight = 100; + // md->swashR.aileronWeight = 100; + // md->swashR.elevatorWeight = 100; + } *version = 255; // max version number return readYamlFile(path, YamlTreeWalker::get_parser_calls(), &tree); diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 0c896f93a..63b0eb160 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -42,6 +42,7 @@ namespace yaml_conv_220 { bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs); bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs); bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs); + bool swash_is_active(void* user, uint8_t* data, uint32_t bitoffs); bool w_beeperMode(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); bool w_5pos(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); bool w_vol(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); @@ -55,6 +56,12 @@ namespace yaml_conv_220 { extern const char* _tele_screen_type_lookup[]; bool w_tele_screen_type(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque); + + bool w_tele_sensor(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque); + + bool w_flightModes(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque); }; // @@ -595,6 +602,11 @@ static bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) return yaml_conv_220::fmd_is_active(user, data, bitoffs); } +static bool swash_is_active(void* user, uint8_t* data, uint32_t bitoffs) +{ + return yaml_conv_220::swash_is_active(user, data, bitoffs); +} + static uint32_t r_swtchWarn(const YamlNode* node, const char* val, uint8_t val_len) { // Read from string like 'AdBuC-': @@ -812,3 +824,34 @@ static uint8_t select_tele_screen_data(void* user, uint8_t* data, uint32_t bitof return 0; } #endif + +static uint32_t r_tele_sensor(const YamlNode* node, const char* val, uint8_t val_len) +{ + if (val_len == 0 || val[0] < '0' || val[0] > '9') return 0; + return yaml_str2uint(val, val_len) + 1; +} + +static bool w_tele_sensor(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque) +{ + return yaml_conv_220::w_tele_sensor(node, val, wf, opaque); +} + +static uint32_t r_flightModes(const YamlNode* node, const char* val, uint8_t val_len) +{ + uint32_t bits = 0; + uint32_t mask = 1; + + for (uint32_t i = 0; i < val_len; i++) { + if (val[i] == '1') bits |= mask; + mask <<= 1; + } + + return bits; +} + +static bool w_flightModes(const YamlNode* node, uint32_t val, + yaml_writer_func wf, void* opaque) +{ + return yaml_conv_220::w_flightModes(node, val, wf, opaque); +} diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 0fb96eb81..d4a57d1f1 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -178,6 +178,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -446,7 +455,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -475,7 +484,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -510,11 +519,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -549,7 +558,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -804,13 +813,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index ebf2b590b..fd87f2472 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index ebf2b590b..fd87f2472 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index ebf2b590b..fd87f2472 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index dcc89681f..dd3c4b6f6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 1e768a088..60fce7da6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -189,6 +189,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -463,7 +472,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -492,7 +501,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -527,11 +536,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -566,7 +575,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -821,13 +830,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 3f43f5438..c2432874a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -189,6 +189,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -463,7 +472,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -492,7 +501,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -527,11 +536,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -566,7 +575,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -821,13 +830,13 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index ebf2b590b..fd87f2472 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -416,7 +425,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -445,7 +454,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -480,11 +489,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -519,7 +528,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -777,14 +786,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 658c03899..be2995d3d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -175,6 +175,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -424,7 +433,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -453,7 +462,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -488,11 +497,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -527,7 +536,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -790,16 +799,16 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 16 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), - YAML_UNSIGNED( "voltsSource", 8 ), - YAML_UNSIGNED( "altitudeSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), + YAML_UNSIGNED_CUST( "voltsSource", 8, r_tele_sensor, w_tele_sensor ), + YAML_UNSIGNED_CUST( "altitudeSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 60c458ce1..f1e5cc9bb 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -187,6 +187,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -463,7 +472,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -492,7 +501,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -527,11 +536,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -566,7 +575,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -829,16 +838,16 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 64, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 32 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), - YAML_UNSIGNED( "voltsSource", 8 ), - YAML_UNSIGNED( "altitudeSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), + YAML_UNSIGNED_CUST( "voltsSource", 8, r_tele_sensor, w_tele_sensor ), + YAML_UNSIGNED_CUST( "altitudeSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index b7b0ad2ea..3686cf595 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -167,6 +167,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -401,7 +410,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -430,7 +439,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -465,11 +474,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -504,7 +513,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -762,14 +771,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 457f34051..310d01f92 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -169,6 +169,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -411,7 +420,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -440,7 +449,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -475,11 +484,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -514,7 +523,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -772,14 +781,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 34b6947fd..b68bdd4b4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -169,6 +169,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -408,7 +417,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -437,7 +446,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -472,11 +481,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -511,7 +520,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -769,14 +778,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 5ca354dfd..d5d2b4903 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -171,6 +171,15 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_MAX, "FUNC_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { SWASH_TYPE_MAX, "TYPE_MAX" }, + { 0, NULL } +}; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, { SWSRC_SA0, "SA0" }, @@ -412,7 +421,7 @@ static const struct YamlNode struct_MixData[] = { YAML_PADDING( 1 ), YAML_SIGNED( "offset", 14 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), YAML_UNSIGNED( "delayDown", 8 ), @@ -441,7 +450,7 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "carryTrim", 6 ), YAML_UNSIGNED( "chn", 5 ), YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED( "flightModes", 9 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), YAML_PADDING( 1 ), YAML_STRING("name", 6), @@ -476,11 +485,11 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_END }; static const struct YamlNode struct_SwashRingData[] = { - YAML_UNSIGNED( "type", 8 ), + YAML_ENUM("type", 8, enum_SwashType), YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED( "collectiveSource", 8 ), - YAML_UNSIGNED( "aileronSource", 8 ), - YAML_UNSIGNED( "elevatorSource", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), YAML_SIGNED( "collectiveWeight", 8 ), YAML_SIGNED( "aileronWeight", 8 ), YAML_SIGNED( "elevatorWeight", 8 ), @@ -515,7 +524,7 @@ static const struct YamlNode struct_GVarData[] = { YAML_END }; static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED( "source", 7 ), + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), YAML_UNSIGNED( "centerSilent", 1 ), YAML_SIGNED( "centerMax", 8 ), YAML_SIGNED( "centerMin", 8 ), @@ -773,14 +782,14 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, NULL), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED( "thrTraceSrc", 8 ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED( "rssiSource", 8 ), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), From 3da2aee1fff20f7d23793f4874a8baa12e84d035 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 24 Oct 2021 13:39:44 +0200 Subject: [PATCH 073/110] Sensor type & formula --- radio/src/dataconstants.h | 18 ++++++------- radio/src/datastructs.h | 4 +-- radio/src/myeeprom.h | 4 +-- .../yaml/yaml_datastructs_nv14.cpp | 26 ++++++++++++++----- .../conversions/yaml/yaml_datastructs_t12.cpp | 26 ++++++++++++++----- .../conversions/yaml/yaml_datastructs_t8.cpp | 26 ++++++++++++++----- .../yaml/yaml_datastructs_tlite.cpp | 26 ++++++++++++++----- .../yaml/yaml_datastructs_tx12.cpp | 26 ++++++++++++++----- .../conversions/yaml/yaml_datastructs_x10.cpp | 26 ++++++++++++++----- .../yaml/yaml_datastructs_x12s.cpp | 26 ++++++++++++++----- .../conversions/yaml/yaml_datastructs_x7.cpp | 26 ++++++++++++++----- .../conversions/yaml/yaml_datastructs_x9d.cpp | 26 ++++++++++++++----- .../conversions/yaml/yaml_datastructs_x9e.cpp | 26 ++++++++++++++----- .../yaml/yaml_datastructs_x9lite.cpp | 26 ++++++++++++++----- .../yaml/yaml_datastructs_x9lites.cpp | 26 ++++++++++++++----- .../yaml/yaml_datastructs_xlite.cpp | 26 ++++++++++++++----- .../yaml/yaml_datastructs_xlites.cpp | 26 ++++++++++++++----- .../storage/yaml/yaml_datastructs_nv14.cpp | 26 ++++++++++++++----- .../src/storage/yaml/yaml_datastructs_t12.cpp | 26 ++++++++++++++----- .../src/storage/yaml/yaml_datastructs_t8.cpp | 26 ++++++++++++++----- .../storage/yaml/yaml_datastructs_tlite.cpp | 26 ++++++++++++++----- .../storage/yaml/yaml_datastructs_tx12.cpp | 26 ++++++++++++++----- .../src/storage/yaml/yaml_datastructs_x10.cpp | 26 ++++++++++++++----- .../storage/yaml/yaml_datastructs_x12s.cpp | 26 ++++++++++++++----- .../src/storage/yaml/yaml_datastructs_x7.cpp | 26 ++++++++++++++----- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 26 ++++++++++++++----- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 26 ++++++++++++++----- .../storage/yaml/yaml_datastructs_x9lite.cpp | 26 ++++++++++++++----- .../storage/yaml/yaml_datastructs_x9lites.cpp | 26 ++++++++++++++----- .../storage/yaml/yaml_datastructs_xlite.cpp | 26 ++++++++++++++----- .../storage/yaml/yaml_datastructs_xlites.cpp | 26 ++++++++++++++----- 31 files changed, 545 insertions(+), 209 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 2b86fc013..3e21fd581 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -834,7 +834,7 @@ enum Functions { #if defined(DEBUG) FUNC_TEST, // should remain the last before MAX as not added in Companion #endif - FUNC_MAX + FUNC_MAX SKIP }; enum TimerModes { @@ -844,8 +844,8 @@ enum TimerModes { TMRMODE_THR, TMRMODE_THR_REL, TMRMODE_THR_START, - TMRMODE_COUNT, - TMRMODE_MAX = TMRMODE_COUNT - 1 + TMRMODE_COUNT SKIP, + TMRMODE_MAX SKIP = TMRMODE_COUNT - 1 }; enum CountDownModes { @@ -855,7 +855,7 @@ enum CountDownModes { #if defined(HAPTIC) COUNTDOWN_HAPTIC, #endif - COUNTDOWN_COUNT + COUNTDOWN_COUNT SKIP }; enum ResetFunctionParam { @@ -866,8 +866,8 @@ enum ResetFunctionParam { FUNC_RESET_TELEMETRY, FUNC_RESET_PARAM_FIRST_TELEM, FUNC_RESET_PARAM_LAST_TELEM = FUNC_RESET_PARAM_FIRST_TELEM + MAX_TELEMETRY_SENSORS, - FUNC_RESET_PARAMS_COUNT, - FUNC_RESET_PARAM_LAST = FUNC_RESET_PARAMS_COUNT-1, + FUNC_RESET_PARAMS_COUNT SKIP, + FUNC_RESET_PARAM_LAST SKIP = FUNC_RESET_PARAMS_COUNT-1, }; enum AdjustGvarFunctionParam { @@ -882,9 +882,9 @@ enum BluetoothModes { BLUETOOTH_TELEMETRY, BLUETOOTH_TRAINER, #if defined(PCBX9E) - BLUETOOTH_MAX=BLUETOOTH_TELEMETRY + BLUETOOTH_MAX SKIP = BLUETOOTH_TELEMETRY #else - BLUETOOTH_MAX=BLUETOOTH_TRAINER + BLUETOOTH_MAX SKIP = BLUETOOTH_TRAINER #endif }; @@ -892,7 +892,7 @@ enum UartSampleModes { UART_SAMPLE_MODE_NORMAL = 0, UART_SAMPLE_MODE_ONEBIT, - UART_SAMPLE_MODE_MAX = UART_SAMPLE_MODE_ONEBIT + UART_SAMPLE_MODE_MAX SKIP = UART_SAMPLE_MODE_ONEBIT }; // PXX2 constants diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index abcb55c1a..3e1f8c182 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -370,11 +370,11 @@ PACK(struct TelemetrySensor { uint8_t rxIndex:3; // 1 bit for module index, 2 bits for receiver index }) frskyInstance); uint8_t instance; - NOBACKUP(uint8_t formula); + NOBACKUP(uint8_t formula ENUM(TelemetrySensorFormula)); } NAME(id2) FUNC(select_id2); char label[TELEM_LABEL_LEN]; // user defined label uint8_t subId; - uint8_t type:1; // 0=custom / 1=calculated + uint8_t type:1 ENUM(TelemetrySensorType); // 0=custom / 1=calculated // user can choose what unit to display each value in uint8_t spare1:1 SKIP; uint8_t unit:6; diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index c100995c1..e0fa5c2e2 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -228,7 +228,7 @@ enum TelemetrySensorFormula TELEM_FORMULA_CELL, TELEM_FORMULA_CONSUMPTION, TELEM_FORMULA_DIST, - TELEM_FORMULA_LAST = TELEM_FORMULA_DIST + TELEM_FORMULA_LAST SKIP = TELEM_FORMULA_DIST }; enum SwashType { @@ -237,7 +237,7 @@ enum SwashType { SWASH_TYPE_120X, SWASH_TYPE_140, SWASH_TYPE_90, - SWASH_TYPE_MAX = SWASH_TYPE_90 + SWASH_TYPE_MAX SKIP = SWASH_TYPE_90 }; #define TRIM_EXTENDED_MAX 500 diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index d4a57d1f1..71701b2e9 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -94,8 +92,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -184,7 +180,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -251,6 +246,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -708,7 +720,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -752,7 +764,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index fd87f2472..c2574a294 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index fd87f2472..c2574a294 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index fd87f2472..c2574a294 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index dd3c4b6f6..0eeb776c8 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 60fce7da6..257354dad 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -94,8 +92,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -195,7 +191,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -272,6 +267,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -725,7 +737,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -769,7 +781,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index c2432874a..137208462 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -94,8 +92,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -195,7 +191,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -272,6 +267,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -725,7 +737,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -769,7 +781,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index fd87f2472..c2574a294 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index be2995d3d..0b9970996 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -181,7 +177,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -251,6 +246,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -686,7 +698,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -730,7 +742,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index f1e5cc9bb..8bc031c56 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -193,7 +189,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -290,6 +285,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -725,7 +737,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -769,7 +781,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index 3686cf595..90f31bfee 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -173,7 +169,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -231,6 +226,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -658,7 +670,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -702,7 +714,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 310d01f92..132ce7937 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -175,7 +171,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -239,6 +234,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -668,7 +680,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -712,7 +724,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index b68bdd4b4..866ede311 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -175,7 +171,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -236,6 +231,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -665,7 +677,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -709,7 +721,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index d5d2b4903..58628036f 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -238,6 +233,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -669,7 +681,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -713,7 +725,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index d4a57d1f1..71701b2e9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -94,8 +92,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -184,7 +180,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -251,6 +246,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -708,7 +720,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -752,7 +764,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index fd87f2472..c2574a294 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index fd87f2472..c2574a294 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index fd87f2472..c2574a294 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index dd3c4b6f6..0eeb776c8 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 60fce7da6..257354dad 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -94,8 +92,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -195,7 +191,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -272,6 +267,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -725,7 +737,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -769,7 +781,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index c2432874a..137208462 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -94,8 +92,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -195,7 +191,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -272,6 +267,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -725,7 +737,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -769,7 +781,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index fd87f2472..c2574a294 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -244,6 +239,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -673,7 +685,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -717,7 +729,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index be2995d3d..0b9970996 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -181,7 +177,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -251,6 +246,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -686,7 +698,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -730,7 +742,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index f1e5cc9bb..8bc031c56 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -193,7 +189,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -290,6 +285,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -725,7 +737,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -769,7 +781,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 3686cf595..90f31bfee 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -173,7 +169,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -231,6 +226,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -658,7 +670,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -702,7 +714,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 310d01f92..132ce7937 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -175,7 +171,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -239,6 +234,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -668,7 +680,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -712,7 +724,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index b68bdd4b4..866ede311 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -175,7 +171,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -236,6 +231,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -665,7 +677,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -709,7 +721,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index d5d2b4903..58628036f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -38,7 +38,6 @@ const struct YamlIdStr enum_BluetoothModes[] = { { BLUETOOTH_OFF, "OFF" }, { BLUETOOTH_TELEMETRY, "TELEMETRY" }, { BLUETOOTH_TRAINER, "TRAINER" }, - { BLUETOOTH_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_Functions[] = { @@ -67,7 +66,6 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, - { FUNC_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -87,8 +85,6 @@ const struct YamlIdStr enum_TimerModes[] = { { TMRMODE_THR, "THR" }, { TMRMODE_THR_REL, "THR_REL" }, { TMRMODE_THR_START, "THR_START" }, - { TMRMODE_COUNT, "COUNT" }, - { TMRMODE_MAX, "MAX" }, { 0, NULL } }; const struct YamlIdStr enum_MixerMultiplex[] = { @@ -177,7 +173,6 @@ const struct YamlIdStr enum_SwashType[] = { { SWASH_TYPE_120X, "TYPE_120X" }, { SWASH_TYPE_140, "TYPE_140" }, { SWASH_TYPE_90, "TYPE_90" }, - { SWASH_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; const struct YamlIdStr enum_SwitchSources[] = { @@ -238,6 +233,23 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; // // Structs last @@ -669,7 +681,7 @@ static const struct YamlNode struct_anonymous_14[] = { static const struct YamlNode union_anonymous_13_elmts[] = { YAML_STRUCT("frskyInstance", 8, struct_anonymous_14, NULL), YAML_UNSIGNED( "instance", 8 ), - YAML_UNSIGNED( "formula", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), YAML_END }; static const struct YamlNode struct_anonymous_16[] = { @@ -713,7 +725,7 @@ static const struct YamlNode struct_TelemetrySensor[] = { YAML_UNION("id2", 8, union_anonymous_13_elmts, select_id2), YAML_STRING("label", 4), YAML_UNSIGNED( "subId", 8 ), - YAML_UNSIGNED( "type", 1 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType), YAML_PADDING( 1 ), YAML_UNSIGNED( "unit", 6 ), YAML_UNSIGNED( "prec", 2 ), From b5e9c68056fdb365ea2bcb7ad319b2137e949dcd Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 25 Oct 2021 12:20:09 +0200 Subject: [PATCH 074/110] Improve custom functions --- radio/src/datastructs.h | 9 +- .../yaml/yaml_datastructs_funcs.cpp | 157 ++++++++++++-- .../yaml/yaml_datastructs_nv14.cpp | 9 +- .../conversions/yaml/yaml_datastructs_t12.cpp | 9 +- .../conversions/yaml/yaml_datastructs_t8.cpp | 9 +- .../yaml/yaml_datastructs_tlite.cpp | 9 +- .../yaml/yaml_datastructs_tx12.cpp | 9 +- .../conversions/yaml/yaml_datastructs_x10.cpp | 9 +- .../yaml/yaml_datastructs_x12s.cpp | 9 +- .../conversions/yaml/yaml_datastructs_x7.cpp | 9 +- .../conversions/yaml/yaml_datastructs_x9d.cpp | 9 +- .../conversions/yaml/yaml_datastructs_x9e.cpp | 9 +- .../yaml/yaml_datastructs_x9lite.cpp | 9 +- .../yaml/yaml_datastructs_x9lites.cpp | 9 +- .../yaml/yaml_datastructs_xlite.cpp | 9 +- .../yaml/yaml_datastructs_xlites.cpp | 9 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 195 ++++++++++++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 9 +- .../src/storage/yaml/yaml_datastructs_t12.cpp | 9 +- .../src/storage/yaml/yaml_datastructs_t8.cpp | 9 +- .../storage/yaml/yaml_datastructs_tlite.cpp | 9 +- .../storage/yaml/yaml_datastructs_tx12.cpp | 9 +- .../src/storage/yaml/yaml_datastructs_x10.cpp | 9 +- .../storage/yaml/yaml_datastructs_x12s.cpp | 9 +- .../src/storage/yaml/yaml_datastructs_x7.cpp | 9 +- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 9 +- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 9 +- .../storage/yaml/yaml_datastructs_x9lite.cpp | 9 +- .../storage/yaml/yaml_datastructs_x9lites.cpp | 9 +- .../storage/yaml/yaml_datastructs_xlite.cpp | 9 +- .../storage/yaml/yaml_datastructs_xlites.cpp | 9 +- 31 files changed, 481 insertions(+), 132 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 3e1f8c182..25df0cc93 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -154,6 +154,7 @@ PACK(struct LogicalSwitchData { PACK(struct CustomFunctionData { int16_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); uint16_t func:7 ENUM(Functions); + CUST_ATTR(def,r_customFn,w_customFn); PACK(union { NOBACKUP(PACK(struct { char name[LEN_FUNCTION_NAME]; @@ -163,15 +164,15 @@ PACK(struct CustomFunctionData { int16_t val; uint8_t mode; uint8_t param; - NOBACKUP(CFN_SPARE_TYPE spare SKIP); + NOBACKUP(CFN_SPARE_TYPE spare); }) all; NOBACKUP(PACK(struct { int32_t val1; - NOBACKUP(CFN_SPARE_TYPE val2 SKIP); + NOBACKUP(CFN_SPARE_TYPE val2); }) clear); - }) NAME(fp) FUNC(select_custom_fn); - uint8_t active; + }) SKIP; + uint8_t active SKIP; bool isEmpty() const { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 02cba49b6..b5e2f4511 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -210,23 +210,7 @@ uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) return 0; } -uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs) -{ - data += bitoffs >> 3UL; - data -= offsetof(CustomFunctionData, all); - - auto cf = reinterpret_cast(data); - switch(cf->func) { - case FUNC_PLAY_TRACK: - case FUNC_BACKGND_MUSIC: - case FUNC_PLAY_SCRIPT: - // play: 0 - return 0; - } - // all: 1 - return 1; -} uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs) { @@ -698,3 +682,144 @@ bool w_flightModes(const YamlNode* node, uint32_t val, } return true; } + +#define r_customFn nullptr + +static const char* _func_reset_param_lookup[] = { + "Tmr1","Tmr2","Tmr3","All","Tele" +}; + +static const char* _func_failsafe_lookup[] = { + "Int","Ext" +}; + +// used in read routine as well +const char* _func_sound_lookup[] = { + "Bp1","Bp2","Bp3","Wrn1","Wrn2", + "Chee","Rata","Tick","Sirn","Ring", + "SciF","Robt","Chrp","Tada","Crck","Alrm" +}; + +// force external linkage +extern const uint8_t _func_sound_lookup_size = sizeof(_func_sound_lookup); + +bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + data += bitoffs >> 3UL; + data -= offsetof(CustomFunctionData, all); + + auto cfn = reinterpret_cast(data); + uint8_t func = CFN_FUNC(cfn); + + const char* str = nullptr; + switch (func) { + case FUNC_OVERRIDE_CHANNEL: + str = yaml_unsigned2str(CFN_CH_INDEX(cfn)); // CH index + if (!wf(opaque, str, strlen(str))) return false; + if (!wf(opaque, ",", 1)) return false; + str = yaml_unsigned2str(CFN_PARAM(cfn)); // value + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_TRAINER: { + int16_t value = CFN_CH_INDEX(cfn); + switch(value) { + case 0: + if (!wf(opaque, "sticks", 6)) return false; + break; + case NUM_STICKS + 1: + if (!wf(opaque, "chans", 5)) return false; + break; + default: + if (value > 0 && value < NUM_STICKS + 1) { + str = yaml_output_enum(value - 1 + MIXSRC_FIRST_STICK, enum_MixSources); + if (str && !wf(opaque, str, strlen(str))) return false; + } + } + } break; + + case FUNC_RESET: + if (CFN_PARAM(cfn) < FUNC_RESET_PARAM_FIRST_TELEM) { + // Tmr1,Tmr2,Tmr3,All + str = _func_reset_param_lookup[CFN_PARAM(cfn)]; + } else { + // sensor index + str = yaml_unsigned2str(CFN_PARAM(cfn) - FUNC_RESET_PARAM_FIRST_TELEM); + } + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_VOLUME: + case FUNC_BACKLIGHT: + case FUNC_PLAY_VALUE: + if (!w_mixSrcRaw(nullptr, CFN_PARAM(cfn), wf, opaque)) return false; + break; + + case FUNC_PLAY_SOUND: + // Bp1,Bp2,Bp3,Wrn1,Wrn2,Chee,Rata,Tick,Sirn,Ring,SciF,Robt,Chrp,Tada,Crck,Alrm + str = _func_sound_lookup[CFN_PARAM(cfn)]; + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_PLAY_TRACK: + case FUNC_BACKGND_MUSIC: + case FUNC_PLAY_SCRIPT: + if (!wf(opaque, cfn->play.name, strnlen(cfn->play.name, LEN_FUNCTION_NAME))) + return false; + break; + + case FUNC_SET_TIMER: + // Tmr1,Tmr2,Tmr3 + str = _func_reset_param_lookup[CFN_TIMER_INDEX(cfn)]; + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_SET_FAILSAFE: + // Int,Ext + str = _func_failsafe_lookup[CFN_PARAM(cfn)]; + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_HAPTIC: + case FUNC_LOGS: // 10th of seconds + str = yaml_unsigned2str(CFN_PARAM(cfn)); + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_ADJUST_GVAR: + switch(CFN_GVAR_MODE(cfn)) { + case FUNC_ADJUST_GVAR_CONSTANT: + case FUNC_ADJUST_GVAR_INCDEC: + str = yaml_signed2str(CFN_PARAM(cfn)); + if (!wf(opaque, str, strlen(str))) return false; + break; + case FUNC_ADJUST_GVAR_SOURCE: + if (!w_mixSrcRaw(nullptr, CFN_PARAM(cfn), wf, opaque)) return false; + break; + case FUNC_ADJUST_GVAR_GVAR: + if (!w_mixSrcRaw(nullptr, CFN_PARAM(cfn) + MIXSRC_FIRST_GVAR, wf, opaque)) return false; + break; + } + } + + if (HAS_ENABLE_PARAM(func)) { + // ",0/1" + if (!wf(opaque,CFN_ACTIVE(cfn) ? ",1":",0",2)) return false; + } else if (HAS_REPEAT_PARAM(func)) { + // "," + if (!wf(opaque,",",1)) return false; + if (CFN_PLAY_REPEAT(cfn) == 0) { + // "1x" + if (!wf(opaque,"1x",2)) return false; + } else if (CFN_PLAY_REPEAT(cfn) == CFN_PLAY_REPEAT_NOSTART) { + // "!1x" + if (!wf(opaque,"!1x",3)) return false; + } else { + // repeat time in seconds + str = yaml_unsigned2str(CFN_PLAY_REPEAT(cfn) * CFN_PLAY_REPEAT_MUL); + if (!wf(opaque, str, strlen(str))) return false; + } + } + return true; +} diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index 71701b2e9..3e74004aa 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -300,12 +300,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "spare", 16 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "val2", 16 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -318,8 +318,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 48 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index c2574a294..9d499655a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index c2574a294..9d499655a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index c2574a294..9d499655a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index 0eeb776c8..d0ac1fea4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 257354dad..9b75f76bc 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -321,12 +321,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "spare", 16 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "val2", 16 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -339,8 +339,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 48 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 137208462..799be0adb 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -321,12 +321,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "spare", 16 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "val2", 16 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -339,8 +339,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 48 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index c2574a294..9d499655a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index 0b9970996..07ee3dfab 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -300,12 +300,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -318,8 +318,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index 8bc031c56..bad636fc7 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -339,12 +339,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -357,8 +357,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index 90f31bfee..4a1e45244 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -280,12 +280,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -298,8 +298,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 132ce7937..4c1cbd3e4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -288,12 +288,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -306,8 +306,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index 866ede311..7f3878770 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -285,12 +285,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -303,8 +303,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index 58628036f..b9fe7315e 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -287,12 +287,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -305,8 +305,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 63b0eb160..c56aa6af1 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -62,6 +62,12 @@ namespace yaml_conv_220 { bool w_flightModes(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + + extern const char* _func_sound_lookup[]; + extern const uint8_t _func_sound_lookup_size; + + bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque); }; // @@ -855,3 +861,192 @@ static bool w_flightModes(const YamlNode* node, uint32_t val, { return yaml_conv_220::w_flightModes(node, val, wf, opaque); } + +static void r_customFn(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) +{ + data += bitoffs >> 3UL; + data -= offsetof(CustomFunctionData, all); + + auto cfn = reinterpret_cast(data); + uint8_t func = CFN_FUNC(cfn); + + if (func == FUNC_OVERRIDE_CHANNEL) { + // CH index + CFN_CH_INDEX(cfn) = yaml_str2uint_ref(val, val_len); + // "," + if (!val_len || val[0] != ',') return; + // value + CFN_PARAM(cfn) = yaml_str2int_ref(val, val_len); + } + + // find "," and cut val_len + const char* sep = (const char *)memchr(val, ',', val_len); + uint8_t l_sep = sep ? sep - val : val_len; + + // read values... + switch (func) { + + case FUNC_OVERRIDE_CHANNEL: + break; + + case FUNC_TRAINER: + if (l_sep == 6 + && val[0] == 's' + && val[1] == 't' + && val[2] == 'i' + && val[3] == 'c' + && val[4] == 'k' + && val[5] == 's') { + CFN_CH_INDEX(cfn) = 0; + } else if (l_sep == 5 + && val[0] == 'c' + && val[1] == 'h' + && val[2] == 'a' + && val[3] == 'n' + && val[4] == 's') { + CFN_CH_INDEX(cfn) = NUM_STICKS + 1; + } else { + uint32_t stick = yaml_parse_enum(enum_MixSources, val, l_sep); + if (stick >= MIXSRC_FIRST_STICK && stick <= MIXSRC_LAST_STICK) { + CFN_CH_INDEX(cfn) = stick - MIXSRC_FIRST_STICK + 1; + } + } + break; + + case FUNC_RESET: + if (l_sep == 4 + && val[0] == 'T' + && val[1] == 'm' + && val[2] == 'r' + && val[3] >= '1' + && val[3] <= '3') { + CFN_PARAM(cfn) = val[3] - '1'; + } else if (l_sep == 3 + && val[0] == 'A' + && val[1] == 'l' + && val[2] == 'l') { + CFN_PARAM(cfn) = FUNC_RESET_FLIGHT; + } else if (l_sep == 4 + && val[0] == 'T' + && val[1] == 'e' + && val[2] == 'l' + && val[3] == 'e') { + CFN_PARAM(cfn) = FUNC_RESET_TELEMETRY; + } else { + uint32_t sensor = yaml_str2uint(val, l_sep); + CFN_PARAM(cfn) = sensor + FUNC_RESET_PARAM_FIRST_TELEM; + } + break; + + case FUNC_VOLUME: + case FUNC_BACKLIGHT: + case FUNC_PLAY_VALUE: + // find "," and cut val_len + CFN_PARAM(cfn) = r_mixSrcRaw(nullptr, val, l_sep); + break; + + case FUNC_PLAY_SOUND: + // find "," and cut val_len + for (int i=0; i < yaml_conv_220::_func_sound_lookup_size; i++) { + if (!strncmp(yaml_conv_220::_func_sound_lookup[i],val,l_sep)) { + CFN_PARAM(cfn) = i; + break; + } + } + break; + + case FUNC_PLAY_TRACK: + case FUNC_BACKGND_MUSIC: + case FUNC_PLAY_SCRIPT: + strncpy(cfn->play.name, val, std::min(l_sep, LEN_FUNCTION_NAME)); + break; + + case FUNC_SET_TIMER: + // Tmr1,Tmr2,Tmr3 + if (l_sep >= 4 + && val[0] == 'T' + && val[1] == 'm' + && val[2] == 'r' + && val[3] >= '1' + && val[3] <= '3') { + CFN_TIMER_INDEX(cfn) = val[3] - '1'; + } + break; + + case FUNC_SET_FAILSAFE: + // Int,Ext + if (l_sep == 3) { + if (val[0] == 'I' + && val[1] == 'n' + && val[2] == 't') { + CFN_PARAM(cfn) = 0; + } else if (val[0] == 'E' + && val[1] == 'x' + && val[2] == 't') { + CFN_PARAM(cfn) = 1; + } + } + break; + + case FUNC_HAPTIC: + case FUNC_LOGS: // 10th of seconds + CFN_PARAM(cfn) = yaml_str2uint(val, l_sep); + break; + + case FUNC_ADJUST_GVAR: + switch(CFN_GVAR_MODE(cfn)) { + case FUNC_ADJUST_GVAR_CONSTANT: + case FUNC_ADJUST_GVAR_INCDEC: + CFN_PARAM(cfn) = yaml_str2int(val, l_sep); + break; + case FUNC_ADJUST_GVAR_SOURCE: + CFN_PARAM(cfn) = r_mixSrcRaw(nullptr, val, l_sep); + break; + case FUNC_ADJUST_GVAR_GVAR: { + uint32_t gvar = r_mixSrcRaw(nullptr, val, l_sep); + if (gvar >= MIXSRC_FIRST_GVAR) { + CFN_PARAM(cfn) = gvar - MIXSRC_FIRST_GVAR; + } + } break; + } break; + } + + val += l_sep; + val_len -= l_sep; + + if (val_len == 0 || val[0] != ',') + return; + + val++; val_len--; + if (HAS_ENABLE_PARAM(func)) { + // "0/1" + if (val_len > 0) { + if (val[0] == '0') { + CFN_ACTIVE(cfn) = 0; + } else if (val[0] == '1') { + CFN_ACTIVE(cfn) = 1; + } + } + } else if (HAS_REPEAT_PARAM(func)) { + if (val_len == 2 + && val[0] == '1' + && val[1] == 'x') { + CFN_PLAY_REPEAT(cfn) = 0; + } else if (val_len == 3 + && val[0] == '!' + && val[1] == '1' + && val[2] == 'x') { + CFN_PLAY_REPEAT(cfn) = CFN_PLAY_REPEAT_NOSTART; + } else { + // repeat time in seconds + CFN_PLAY_REPEAT(cfn) = yaml_str2uint(val,val_len) / CFN_PLAY_REPEAT_MUL; + } + } +} + +static bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + return yaml_conv_220::w_customFn(user, data, bitoffs, wf, opaque); +} diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 71701b2e9..3e74004aa 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -300,12 +300,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "spare", 16 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "val2", 16 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -318,8 +318,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 48 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index c2574a294..9d499655a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index c2574a294..9d499655a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index c2574a294..9d499655a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 0eeb776c8..d0ac1fea4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 257354dad..9b75f76bc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -321,12 +321,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "spare", 16 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "val2", 16 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -339,8 +339,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 48 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 137208462..799be0adb 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -321,12 +321,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "spare", 16 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 16 ), + YAML_SIGNED( "val2", 16 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -339,8 +339,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 48, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 48 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index c2574a294..9d499655a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -293,12 +293,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -311,8 +311,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 0b9970996..07ee3dfab 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -300,12 +300,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -318,8 +318,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 8bc031c56..bad636fc7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -339,12 +339,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -357,8 +357,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 90f31bfee..4a1e45244 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -280,12 +280,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -298,8 +298,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 132ce7937..4c1cbd3e4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -288,12 +288,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -306,8 +306,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 866ede311..7f3878770 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -285,12 +285,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -303,8 +303,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 58628036f..b9fe7315e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -287,12 +287,12 @@ static const struct YamlNode struct_anonymous_2[] = { YAML_SIGNED( "val", 16 ), YAML_UNSIGNED( "mode", 8 ), YAML_UNSIGNED( "param", 8 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "spare", 32 ), YAML_END }; static const struct YamlNode struct_anonymous_3[] = { YAML_SIGNED( "val1", 32 ), - YAML_PADDING( 32 ), + YAML_SIGNED( "val2", 32 ), YAML_END }; static const struct YamlNode union_anonymous_0_elmts[] = { @@ -305,8 +305,9 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), - YAML_UNION("fp", 64, union_anonymous_0_elmts, select_custom_fn), - YAML_UNSIGNED( "active", 8 ), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 8 ), YAML_END }; static const struct YamlNode struct_string_24[] = { From 682aabacec4a1195b0099cd57d3d681d64fcbe4b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 25 Oct 2021 12:27:28 +0200 Subject: [PATCH 075/110] WiP logical switches --- radio/src/datastructs.h | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp | 4 ++-- .../src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp | 4 ++-- .../src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp | 4 ++-- radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp | 4 ++-- .../src/storage/conversions/yaml/yaml_datastructs_xlites.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_nv14.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_t12.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_t8.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_tlite.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_tx12.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_x10.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_x12s.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_x7.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_x9d.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_x9e.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_x9lite.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_x9lites.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_xlite.cpp | 4 ++-- radio/src/storage/yaml/yaml_datastructs_xlites.cpp | 4 ++-- 29 files changed, 58 insertions(+), 58 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 25df0cc93..72709b784 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -132,8 +132,8 @@ PACK(struct LogicalSwitchData { uint8_t func ENUM(LogicalSwitchesFunctions); int32_t v1:10; int32_t v3:10; - int32_t andsw:9; // TODO rename to xswtch - uint32_t andswtype:1; // TODO rename to xswtchType (AND / OR) + int32_t andsw:9 CUST(r_swtchSrc,w_swtchSrc); // TODO rename to xswtch + uint32_t andswtype:1 SKIP; // TODO rename to xswtchType (AND / OR) uint32_t spare:2 SKIP; // anything else needed? int16_t v2; uint8_t delay; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index 3e74004aa..b9da91c53 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -523,8 +523,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index 9d499655a..b73889039 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index 9d499655a..b73889039 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index 9d499655a..b73889039 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index d0ac1fea4..7871c3131 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 9b75f76bc..d1f4606ef 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -540,8 +540,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 799be0adb..7c66dc58e 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -540,8 +540,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index 9d499655a..b73889039 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index 07ee3dfab..6d794b55a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -501,8 +501,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index bad636fc7..0fd22eba4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -540,8 +540,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index 4a1e45244..4b8536d6d 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -478,8 +478,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 4c1cbd3e4..32229c287 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -488,8 +488,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index 7f3878770..f83978aab 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -485,8 +485,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index b9fe7315e..c6ddd9ec9 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -489,8 +489,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 3e74004aa..b9da91c53 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -523,8 +523,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 9d499655a..b73889039 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 9d499655a..b73889039 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 9d499655a..b73889039 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index d0ac1fea4..7871c3131 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 9b75f76bc..d1f4606ef 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -540,8 +540,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 799be0adb..7c66dc58e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -540,8 +540,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 9d499655a..b73889039 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -493,8 +493,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 07ee3dfab..6d794b55a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -501,8 +501,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index bad636fc7..0fd22eba4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -540,8 +540,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 4a1e45244..4b8536d6d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -478,8 +478,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 4c1cbd3e4..32229c287 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -488,8 +488,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 7f3878770..f83978aab 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -485,8 +485,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index b9fe7315e..c6ddd9ec9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -489,8 +489,8 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), YAML_SIGNED( "v1", 10 ), YAML_SIGNED( "v3", 10 ), - YAML_SIGNED( "andsw", 9 ), - YAML_UNSIGNED( "andswtype", 1 ), + YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 2 ), YAML_SIGNED( "v2", 16 ), YAML_UNSIGNED( "delay", 8 ), From 5f2fb4386c806329b319552524ad4b956388a241 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 10:25:32 +0200 Subject: [PATCH 076/110] Align with changes on main branch See #942 --- radio/src/dataconstants.h | 2 ++ radio/src/storage/yaml/yaml_datastructs_nv14.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x10.cpp | 1 + 3 files changed, 4 insertions(+) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 3e21fd581..de960f1de 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -830,7 +830,9 @@ enum Functions { FUNC_BACKLIGHT, FUNC_SCREENSHOT, FUNC_RACING_MODE, +#if defined(COLORLCD) FUNC_DISABLE_TOUCH, +#endif #if defined(DEBUG) FUNC_TEST, // should remain the last before MAX as not added in Companion #endif diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index b9da91c53..d9d97a1d6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -66,6 +66,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_DISABLE_TOUCH, "DISABLE_TOUCH" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index d1f4606ef..9d689f2d3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -66,6 +66,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_DISABLE_TOUCH, "DISABLE_TOUCH" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { From 00d1e54c6820bbf2c626de403feaf1c4475cde63 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 10:41:00 +0200 Subject: [PATCH 077/110] select_custom_fn() has been removed --- radio/src/storage/yaml/yaml_datastructs_funcs.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index c56aa6af1..96afe9421 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -32,7 +32,6 @@ namespace yaml_conv_220 { bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs); uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs); - uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs); uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs); uint8_t select_id1(void* user, uint8_t* data, uint32_t bitoffs); uint8_t select_id2(void* user, uint8_t* data, uint32_t bitoffs); @@ -272,11 +271,6 @@ static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) return yaml_conv_220::select_mod_type(user, data, bitoffs); } -static uint8_t select_custom_fn(void* user, uint8_t* data, uint32_t bitoffs) -{ - return yaml_conv_220::select_custom_fn(user, data, bitoffs); -} - static uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs) { return yaml_conv_220::select_script_input(user, data, bitoffs); From 4333e4267c52bc5085075c6f53ce37f317080f86 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 10:59:41 +0200 Subject: [PATCH 078/110] Added missing DISABLE_TOUCH in conversions as well. --- radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp | 1 + radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index b9da91c53..d9d97a1d6 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -66,6 +66,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_DISABLE_TOUCH, "DISABLE_TOUCH" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index d1f4606ef..9d689f2d3 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -66,6 +66,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_DISABLE_TOUCH, "DISABLE_TOUCH" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { From 397674021e79a81c8062a9373ef892882d41aae9 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 13:02:03 +0200 Subject: [PATCH 079/110] Improved logical switches --- radio/src/datastructs.h | 9 +- radio/src/globals.h | 2 +- .../src/gui/128x64/model_logical_switches.cpp | 1 + .../src/gui/212x64/model_logical_switches.cpp | 1 + .../gui/colorlcd/model_logical_switches.cpp | 1 + radio/src/gui/colorlcd/switches.h | 40 ++++++++ radio/src/mixer.cpp | 1 + radio/src/opentx.h | 14 --- .../conversions/yaml/yaml_datastructs.cpp | 2 + .../yaml/yaml_datastructs_funcs.cpp | 63 +++++++++++++ .../yaml/yaml_datastructs_nv14.cpp | 7 +- .../conversions/yaml/yaml_datastructs_t12.cpp | 7 +- .../conversions/yaml/yaml_datastructs_t8.cpp | 7 +- .../yaml/yaml_datastructs_tlite.cpp | 7 +- .../yaml/yaml_datastructs_tx12.cpp | 7 +- .../conversions/yaml/yaml_datastructs_x10.cpp | 7 +- .../yaml/yaml_datastructs_x12s.cpp | 8 +- .../conversions/yaml/yaml_datastructs_x7.cpp | 7 +- .../conversions/yaml/yaml_datastructs_x9d.cpp | 7 +- .../conversions/yaml/yaml_datastructs_x9e.cpp | 7 +- .../yaml/yaml_datastructs_x9lite.cpp | 7 +- .../yaml/yaml_datastructs_x9lites.cpp | 7 +- .../yaml/yaml_datastructs_xlite.cpp | 7 +- .../yaml/yaml_datastructs_xlites.cpp | 7 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 91 +++++++++++++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 7 +- .../src/storage/yaml/yaml_datastructs_t12.cpp | 7 +- .../src/storage/yaml/yaml_datastructs_t8.cpp | 7 +- .../storage/yaml/yaml_datastructs_tlite.cpp | 7 +- .../storage/yaml/yaml_datastructs_tx12.cpp | 7 +- .../src/storage/yaml/yaml_datastructs_x10.cpp | 7 +- .../storage/yaml/yaml_datastructs_x12s.cpp | 8 +- .../src/storage/yaml/yaml_datastructs_x7.cpp | 7 +- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 7 +- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 7 +- .../storage/yaml/yaml_datastructs_x9lite.cpp | 7 +- .../storage/yaml/yaml_datastructs_x9lites.cpp | 7 +- .../storage/yaml/yaml_datastructs_xlite.cpp | 7 +- .../storage/yaml/yaml_datastructs_xlites.cpp | 7 +- radio/src/switches.cpp | 5 + radio/src/switches.h | 40 ++++++++ 41 files changed, 365 insertions(+), 103 deletions(-) create mode 100644 radio/src/gui/colorlcd/switches.h create mode 100644 radio/src/switches.h diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 72709b784..43a1c18f1 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -130,12 +130,13 @@ PACK(struct LimitData { PACK(struct LogicalSwitchData { uint8_t func ENUM(LogicalSwitchesFunctions); - int32_t v1:10; - int32_t v3:10; + CUST_ATTR(def,r_logicSw,w_logicSw); + int32_t v1:10 SKIP; + int32_t v3:10 SKIP; int32_t andsw:9 CUST(r_swtchSrc,w_swtchSrc); // TODO rename to xswtch uint32_t andswtype:1 SKIP; // TODO rename to xswtchType (AND / OR) uint32_t spare:2 SKIP; // anything else needed? - int16_t v2; + int16_t v2 SKIP; uint8_t delay; uint8_t duration; }); @@ -171,7 +172,7 @@ PACK(struct CustomFunctionData { int32_t val1; NOBACKUP(CFN_SPARE_TYPE val2); }) clear); - }) SKIP; + }) NAME(fp) SKIP; uint8_t active SKIP; bool isEmpty() const diff --git a/radio/src/globals.h b/radio/src/globals.h index 8b06d3261..8eb8a59c6 100644 --- a/radio/src/globals.h +++ b/radio/src/globals.h @@ -61,7 +61,7 @@ enum MainRequest { extern uint8_t mainRequestFlags; #define DELAY_POS_MARGIN 3 -typedef int16_t delayval_t; + PACK(struct SwOn { uint16_t delay:14; // max = 2550 uint8_t activeMix:1; diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index 4710e476f..f8880710a 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "switches.h" enum LogicalSwitchFields { LS_FIELD_FUNCTION, diff --git a/radio/src/gui/212x64/model_logical_switches.cpp b/radio/src/gui/212x64/model_logical_switches.cpp index 36ac110d1..7f17e7fbe 100644 --- a/radio/src/gui/212x64/model_logical_switches.cpp +++ b/radio/src/gui/212x64/model_logical_switches.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "switches.h" enum LogicalSwitchFields { LS_FIELD_FUNCTION, diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index 8ac931800..542904308 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -22,6 +22,7 @@ #include "model_logical_switches.h" #include "opentx.h" #include "libopenui.h" +#include "switches.h" #define SET_DIRTY() storageDirty(EE_MODEL) diff --git a/radio/src/gui/colorlcd/switches.h b/radio/src/gui/colorlcd/switches.h new file mode 100644 index 000000000..1b272483b --- /dev/null +++ b/radio/src/gui/colorlcd/switches.h @@ -0,0 +1,40 @@ +/* + * 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 + +enum LogicalSwitchFamilies { + LS_FAMILY_OFS, + LS_FAMILY_BOOL, + LS_FAMILY_COMP, + LS_FAMILY_DIFF, + LS_FAMILY_TIMER, + LS_FAMILY_STICKY, + LS_FAMILY_RANGE, + LS_FAMILY_EDGE +}; + +typedef int16_t delayval_t; + +uint8_t lswFamily(uint8_t func); +int16_t lswTimerValue(delayval_t val); diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index e19cc6637..92214f605 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -21,6 +21,7 @@ #include "opentx.h" #include "timers.h" +#include "switches.h" int8_t virtualInputsTrims[MAX_INPUTS]; int16_t anas [MAX_INPUTS] = {0}; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 7b824087a..0b5ac805e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -818,20 +818,6 @@ inline bool isMixActive(uint8_t mix) return swOn[mix].activeMix; } -enum LogicalSwitchFamilies { - LS_FAMILY_OFS, - LS_FAMILY_BOOL, - LS_FAMILY_COMP, - LS_FAMILY_DIFF, - LS_FAMILY_TIMER, - LS_FAMILY_STICKY, - LS_FAMILY_RANGE, - LS_FAMILY_EDGE -}; - -uint8_t lswFamily(uint8_t func); -int16_t lswTimerValue(delayval_t val); - enum FunctionsActive { FUNCTION_TRAINER_STICK1, FUNCTION_TRAINER_CHANNELS = FUNCTION_TRAINER_STICK1 + NUM_STICKS, diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp index 1206b4a7d..59ae1a3e8 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp @@ -28,6 +28,8 @@ #include #include +#include "switches.h" + namespace yaml_conv_220 { #include "yaml_datastructs_funcs.cpp" diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index b5e2f4511..bf7b84068 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -823,3 +823,66 @@ bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, } return true; } + +#define r_logicSw nullptr + +static const struct YamlNode _ls_node_v1 = YAML_PADDING(10); +static const struct YamlNode _ls_node_v2 = YAML_PADDING(16); + +bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + data += bitoffs >> 3UL; + data -= sizeof(LogicalSwitchData::func); + + const char* str = nullptr; + auto ls = reinterpret_cast(data); + switch(lswFamily(ls->func)) { + + case LS_FAMILY_BOOL: + case LS_FAMILY_STICKY: + if (!w_swtchSrc(&_ls_node_v1, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + if (!w_swtchSrc(&_ls_node_v2, ls->v2, wf, opaque)) return false; + break; + + case LS_FAMILY_EDGE: + if (!w_swtchSrc(&_ls_node_v1, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + str = yaml_unsigned2str(lswTimerValue(ls->v2)); + if (!wf(opaque,str,strlen(str))) return false; + if (!wf(opaque,",",1)) return false; + if (ls->v3 < 0) { + if (!wf(opaque,"<",1)) return false; + } else if(ls->v3 == 0) { + if (!wf(opaque,"-",1)) return false; + } else { + str = yaml_unsigned2str(lswTimerValue(ls->v2 + ls->v3)); + } + break; + + case LS_FAMILY_COMP: + if (!w_mixSrcRaw(nullptr, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + if (!w_mixSrcRaw(nullptr, ls->v2, wf, opaque)) return false; + break; + + case LS_FAMILY_TIMER: + str = yaml_unsigned2str(lswTimerValue(ls->v1)); + if (!wf(opaque,str,strlen(str))) return false; + if (!wf(opaque,",",1)) return false; + str = yaml_unsigned2str(lswTimerValue(ls->v2)); + if (!wf(opaque,str,strlen(str))) return false; + break; + + default: + if (!w_mixSrcRaw(nullptr, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + // TODO?: ls->v1 <= MIXSRC_LAST_CH ? calc100toRESX(ls->v2) : ls->v2 + str = yaml_signed2str(ls->v2); + if (!wf(opaque,str,strlen(str))) return false; + break; + } + + return true; +} diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index d9d97a1d6..cd04f3422 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -522,12 +522,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index b73889039..f40f25d6e 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index b73889039..f40f25d6e 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index b73889039..f40f25d6e 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index 7871c3131..b35ec6ef2 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 9d689f2d3..92980839e 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -539,12 +539,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 7c66dc58e..21d8ccd95 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -66,6 +66,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_DISABLE_TOUCH, "DISABLE_TOUCH" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -538,12 +539,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index b73889039..f40f25d6e 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index 6d794b55a..49084757c 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -499,12 +499,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index 0fd22eba4..ca024b019 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -538,12 +538,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index 4b8536d6d..de87dd052 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -476,12 +476,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 32229c287..6e1beb9a6 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -486,12 +486,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index f83978aab..75e7f7ca8 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -483,12 +483,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index c6ddd9ec9..c2299506a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -487,12 +487,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 96afe9421..97ba9da37 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -67,6 +67,9 @@ namespace yaml_conv_220 { bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque); + + bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque); }; // @@ -1044,3 +1047,91 @@ static bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, { return yaml_conv_220::w_customFn(user, data, bitoffs, wf, opaque); } + +#include "switches.h" + +static delayval_t timerValue2lsw(uint32_t t) +{ + if (t < 20) { + return t - 129; + } else if (600) { + return t / 5 - 113; + } else { + return t / 10 - 53; + } +} + +static void r_logicSw(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) +{ + data += bitoffs >> 3UL; + data -= sizeof(LogicalSwitchData::func); + + // find "," and cut val_len + const char* sep = (const char *)memchr(val, ',', val_len); + uint8_t l_sep = sep ? sep - val : val_len; + + auto ls = reinterpret_cast(data); + switch(lswFamily(ls->func)) { + + case LS_FAMILY_BOOL: + case LS_FAMILY_STICKY: + ls->v1 = r_swtchSrc(nullptr, val, l_sep); + val += l_sep; val_len -= l_sep; + if (!val_len || val[0] != ',') return; + val++; val_len--; + ls->v2 = r_swtchSrc(nullptr, val, val_len); + break; + + case LS_FAMILY_EDGE: + ls->v1 = r_swtchSrc(nullptr, val, l_sep); + val += l_sep; val_len -= l_sep; + if (!val_len || val[0] != ',') return; + val++; val_len--; + ls->v2 = timerValue2lsw(yaml_str2uint_ref(val, val_len)); + if (!val_len || val[0] != ',') return; + val++; val_len--; + if (val_len == 1) { + if (val[0] == '<') + ls->v3 = -1; + else if (val[0] == '-') + ls->v3 = 0; + } else { + int16_t t = (int16_t)timerValue2lsw(yaml_str2uint_ref(val, val_len)); + ls->v3 = t - ls->v2; + } + break; + + case LS_FAMILY_COMP: + ls->v1 = r_mixSrcRaw(nullptr, val, l_sep); + val += l_sep; val_len -= l_sep; + if (!val_len || val[0] != ',') return; + val++; val_len--; + ls->v2 = r_mixSrcRaw(nullptr, val, val_len); + break; + + case LS_FAMILY_TIMER: + ls->v1 = timerValue2lsw(yaml_str2uint(val, l_sep)); + val += l_sep; val_len -= l_sep; + if (!val_len || val[0] != ',') return; + val++; val_len--; + ls->v2 = timerValue2lsw(yaml_str2uint(val, val_len)); + break; + + default: + ls->v1 = r_mixSrcRaw(nullptr, val, l_sep); + val += l_sep; val_len -= l_sep; + if (!val_len || val[0] != ',') return; + val++; val_len--; + // TODO?: ls->v1 <= MIXSRC_LAST_CH ? calc100toRESX(ls->v2) : ls->v2 + ls->v2 = yaml_str2int_ref(val, val_len); + break; + } + +} + +static bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + return yaml_conv_220::w_logicSw(user, data, bitoffs, wf, opaque); +} diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index d9d97a1d6..cd04f3422 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -522,12 +522,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index b73889039..f40f25d6e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index b73889039..f40f25d6e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index b73889039..f40f25d6e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 7871c3131..b35ec6ef2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 9d689f2d3..92980839e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -539,12 +539,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 7c66dc58e..21d8ccd95 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -66,6 +66,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_BACKLIGHT, "BACKLIGHT" }, { FUNC_SCREENSHOT, "SCREENSHOT" }, { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_DISABLE_TOUCH, "DISABLE_TOUCH" }, { 0, NULL } }; const struct YamlIdStr enum_UartModes[] = { @@ -538,12 +539,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index b73889039..f40f25d6e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -491,12 +491,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 6d794b55a..49084757c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -499,12 +499,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 0fd22eba4..ca024b019 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -538,12 +538,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 4b8536d6d..de87dd052 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -476,12 +476,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 32229c287..6e1beb9a6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -486,12 +486,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index f83978aab..75e7f7ca8 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -483,12 +483,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index c6ddd9ec9..c2299506a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -487,12 +487,13 @@ static const struct YamlNode struct_signed_8[] = { static const struct YamlNode struct_LogicalSwitchData[] = { YAML_IDX, YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_SIGNED( "v1", 10 ), - YAML_SIGNED( "v3", 10 ), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), YAML_PADDING( 1 ), YAML_PADDING( 2 ), - YAML_SIGNED( "v2", 16 ), + YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), YAML_END diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 296f5ab9e..325f3d35a 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "switches.h" #define CS_LAST_VALUE_INIT -32768 @@ -881,6 +882,10 @@ uint8_t lswFamily(uint8_t func) return LS_FAMILY_TIMER+func-LS_FUNC_TIMER; } +// val = [-129,-110] => [0,19] (step 1) +// val = [-109,6] => [20,595] (step 5) +// val = [7,122] => [600,1750] (step 10) +// int16_t lswTimerValue(delayval_t val) { return (val < -109 ? 129+val : (val < 7 ? (113+val)*5 : (53+val)*10)); diff --git a/radio/src/switches.h b/radio/src/switches.h new file mode 100644 index 000000000..1b272483b --- /dev/null +++ b/radio/src/switches.h @@ -0,0 +1,40 @@ +/* + * 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 + +enum LogicalSwitchFamilies { + LS_FAMILY_OFS, + LS_FAMILY_BOOL, + LS_FAMILY_COMP, + LS_FAMILY_DIFF, + LS_FAMILY_TIMER, + LS_FAMILY_STICKY, + LS_FAMILY_RANGE, + LS_FAMILY_EDGE +}; + +typedef int16_t delayval_t; + +uint8_t lswFamily(uint8_t func); +int16_t lswTimerValue(delayval_t val); From 64d524f71710853c1fa8ebb9904c918b77d63e47 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 15:18:18 +0200 Subject: [PATCH 080/110] Fixed canned constants (FUNC_TOUCH_DISABLE again....) --- radio/src/storage/conversions/yaml/dataconstants_220.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/radio/src/storage/conversions/yaml/dataconstants_220.h b/radio/src/storage/conversions/yaml/dataconstants_220.h index 9b41f3d42..1d9945bb6 100644 --- a/radio/src/storage/conversions/yaml/dataconstants_220.h +++ b/radio/src/storage/conversions/yaml/dataconstants_220.h @@ -915,6 +915,9 @@ enum Functions { FUNC_BACKLIGHT, FUNC_SCREENSHOT, FUNC_RACING_MODE, +#if defined(COLORLCD) + FUNC_DISABLE_TOUCH, +#endif #if defined(DEBUG) FUNC_TEST, // should remain the last before MAX as not added in Companion #endif From 17d4ea5c62d710596a613c84a1b49ad1b55764c7 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 15:25:42 +0200 Subject: [PATCH 081/110] Fix color lcd --- radio/src/gui/colorlcd/switches.h | 40 ------------------- .../src/gui/colorlcd/view_logical_switches.h | 1 + 2 files changed, 1 insertion(+), 40 deletions(-) delete mode 100644 radio/src/gui/colorlcd/switches.h diff --git a/radio/src/gui/colorlcd/switches.h b/radio/src/gui/colorlcd/switches.h deleted file mode 100644 index 1b272483b..000000000 --- a/radio/src/gui/colorlcd/switches.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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 - -enum LogicalSwitchFamilies { - LS_FAMILY_OFS, - LS_FAMILY_BOOL, - LS_FAMILY_COMP, - LS_FAMILY_DIFF, - LS_FAMILY_TIMER, - LS_FAMILY_STICKY, - LS_FAMILY_RANGE, - LS_FAMILY_EDGE -}; - -typedef int16_t delayval_t; - -uint8_t lswFamily(uint8_t func); -int16_t lswTimerValue(delayval_t val); diff --git a/radio/src/gui/colorlcd/view_logical_switches.h b/radio/src/gui/colorlcd/view_logical_switches.h index 0d4a6ea26..74836c8e1 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.h +++ b/radio/src/gui/colorlcd/view_logical_switches.h @@ -23,6 +23,7 @@ #include "opentx.h" #include "tabsgroup.h" +#include "switches.h" constexpr coord_t CSW_1ST_COLUMN = 50; constexpr coord_t CSW_2ND_COLUMN = 120; From c749fd868178726f1f869ca0813fb0f0c37a91f1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 22:13:37 +0200 Subject: [PATCH 082/110] X9D+ conversion unit test + fixes --- .../yaml/yaml_datastructs_funcs.cpp | 4 +-- radio/src/storage/yaml/yaml_bits.cpp | 27 +++++++++++++++- radio/src/storage/yaml/yaml_tree_walker.cpp | 15 ++++++--- radio/src/storage/yaml/yaml_tree_walker.h | 3 +- radio/src/tests/conversions.cpp | 31 ++++++++++++++++--- 5 files changed, 67 insertions(+), 13 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index bf7b84068..021acc826 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -465,11 +465,11 @@ bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) // FM0 defaults to all 0 if (idx == 0) { - return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData)); + return !yaml_is_zero(data, bitoffs, sizeof(FlightModeData) << 3UL); } // assumes gvars array is last - bool is_active = !yaml_is_zero(data, bitoffs, offsetof(FlightModeData, gvars)); + bool is_active = !yaml_is_zero(data, bitoffs, offsetof(FlightModeData, gvars) << 3UL); data += bitoffs >> 3UL; FlightModeData* fmd = (FlightModeData*)(data); diff --git a/radio/src/storage/yaml/yaml_bits.cpp b/radio/src/storage/yaml/yaml_bits.cpp index 8031c6fdf..28a1d350d 100644 --- a/radio/src/storage/yaml/yaml_bits.cpp +++ b/radio/src/storage/yaml/yaml_bits.cpp @@ -88,9 +88,34 @@ uint32_t yaml_get_bits(uint8_t* src, uint32_t bit_ofs, uint32_t bits) return i; } +// if the start address is not aligned on a byte, +// checking max 32 bits is supported. bool yaml_is_zero(uint8_t* data, uint32_t bitoffs, uint32_t bits) { - return !yaml_get_bits(data + (bitoffs>>3UL), bitoffs & 0x7, bits); + data += bitoffs >> 3; + bitoffs &= 0x7; + + if (bitoffs) { + return !yaml_get_bits(data, bitoffs, bits); + } + + while (bits >= 32) { + if (*(uint32_t*)data) return false; + data += 4; + bits -= 32; + } + + while (bits >= 8) { + if (*data) return false; + data++; + bits -= 8; + } + + if (bits) { + return !yaml_get_bits(data, 0, bits); + } + + return true; } int32_t yaml_str2int_ref(const char*& val, uint8_t& val_len) diff --git a/radio/src/storage/yaml/yaml_tree_walker.cpp b/radio/src/storage/yaml/yaml_tree_walker.cpp index 5fb2b0e7d..d91e8b489 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.cpp +++ b/radio/src/storage/yaml/yaml_tree_walker.cpp @@ -29,10 +29,15 @@ #define MIN(a,b) (a < b ? a : b) -static void copy_string(char* dst, const char* src, uint8_t len) +static void copy_string(char* dst, uint8_t dst_len, const char* src, + uint8_t src_len) { - memcpy(dst,src,len); - dst[len] = '\0'; + if (src_len < dst_len) { + memcpy(dst, src, src_len); + dst[src_len] = '\0'; + } else { + memcpy(dst, src, dst_len); + } } uint32_t yaml_parse_enum(const struct YamlIdStr* choices, const char* val, uint8_t val_len) @@ -63,7 +68,7 @@ static void yaml_set_attr(void* user, uint8_t* ptr, uint32_t bit_ofs, if (node->type == YDT_STRING) { // assert(!bit_ofs); - copy_string((char*)ptr, val, MIN(val_len, node->size - 1)); + copy_string((char*)ptr, node->size >> 3, val, val_len); return; } @@ -112,7 +117,7 @@ static bool yaml_output_string(const char* str, uint32_t max_len, if (!wf(opaque, "\"", 1)) return false; - while(*str && max_len > 0) { + while(max_len > 0 && *str) { if (*str >= 0x20 && *str <= 0x7E) { if (!wf(opaque, str++, 1)) return false; max_len--; diff --git a/radio/src/storage/yaml/yaml_tree_walker.h b/radio/src/storage/yaml/yaml_tree_walker.h index 913f77350..b502c8dcc 100644 --- a/radio/src/storage/yaml/yaml_tree_walker.h +++ b/radio/src/storage/yaml/yaml_tree_walker.h @@ -89,7 +89,8 @@ class YamlTreeWalker } inline bool isParentArrayElmt() { - return !empty() && stack[stack_level + 1].flags & FLAG_STATE_ARRAY_ELMT; + return (stack_level + 1 < NODE_STACK_DEPTH) + && stack[stack_level + 1].flags & FLAG_STATE_ARRAY_ELMT; } inline void setArrayElmt(bool set) { diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 4453d3b32..4c1cea56a 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -23,6 +23,14 @@ #include "storage/conversions/conversions.h" #include "location.h" +#if defined(EEPROM) || defined(EEPROM_RLC) +#include +#endif + +#if defined(SDCARD_YAML) +const char * loadRadioSettingsYaml(); +#endif + #if defined(EEPROM_SIZE) void loadEEPROMFile(const char * filename) { @@ -31,16 +39,25 @@ void loadEEPROMFile(const char * filename) } #endif -#if defined(PCBX9DP) && defined(EEPROM) +#if defined(PCBX9DP) && (defined(EEPROM) || defined(EEPROM_RLC)) TEST(Conversions, ConversionX9DPFrom23) { - loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+.bin"); +#if defined(SDCARD_YAML) + simuFatfsSetPaths(TESTS_BUILD_PATH "/model_x9dp/", TESTS_BUILD_PATH "/model_x9dp/"); +#endif + loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+.bin"); eepromOpen(); +#if defined(EEPROM) eeLoadGeneralSettingsData(); convertRadioData_219_to_220(g_eeGeneral); +#else + convertRadioData_219_to_220(); + convertRadioData_220_to_221(); + EXPECT_EQ(nullptr, loadRadioSettingsYaml()); +#endif eeConvertModel(0, 219); - eeLoadModel(0); + loadModel((uint8_t)0); EXPECT_EQ(-30, g_eeGeneral.vBatMin); EXPECT_EQ(8, g_eeGeneral.speakerVolume); @@ -88,10 +105,16 @@ TEST(Conversions, ConversionX9DPFrom23_2) loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+2.bin"); eepromOpen(); +#if defined(EEPROM) eeLoadGeneralSettingsData(); convertRadioData_219_to_220(g_eeGeneral); +#else + convertRadioData_219_to_220(); + convertRadioData_220_to_221(); + EXPECT_EQ(nullptr, loadRadioSettingsYaml()); +#endif eeConvertModel(6, 219); - eeLoadModel(6); + loadModel((uint8_t)6); EXPECT_EQ(710, g_eeGeneral.calib[0].spanNeg); EXPECT_EQ(944, g_eeGeneral.calib[0].mid); From f4ae4a6d4810ace3db21877af2999e472acf4149 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 23:10:25 +0200 Subject: [PATCH 083/110] More unit tests --- radio/src/tests/conversions.cpp | 200 ++++++++++-------- radio/src/tests/eeprom_22_x7.bin | Bin 32768 -> 0 bytes radio/src/tests/eeprom_22_x9d+.bin | Bin 32768 -> 0 bytes .../{eeprom_22_xlite.bin => eeprom_23_x7.bin} | Bin 32768 -> 32768 bytes radio/src/tests/eeprom_23_xlite.bin | Bin 0 -> 32768 bytes radio/src/tests/lcd.cpp | 2 + 6 files changed, 118 insertions(+), 84 deletions(-) delete mode 100644 radio/src/tests/eeprom_22_x7.bin delete mode 100644 radio/src/tests/eeprom_22_x9d+.bin rename radio/src/tests/{eeprom_22_xlite.bin => eeprom_23_x7.bin} (70%) create mode 100644 radio/src/tests/eeprom_23_xlite.bin diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 4c1cea56a..e83b3640e 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -39,11 +39,13 @@ void loadEEPROMFile(const char * filename) } #endif -#if defined(PCBX9DP) && (defined(EEPROM) || defined(EEPROM_RLC)) +#if defined(PCBX9DP) TEST(Conversions, ConversionX9DPFrom23) { #if defined(SDCARD_YAML) - simuFatfsSetPaths(TESTS_BUILD_PATH "/model_x9dp/", TESTS_BUILD_PATH "/model_x9dp/"); + simuFatfsSetPaths(TESTS_BUILD_PATH "/", TESTS_BUILD_PATH "/"); + sdCheckAndCreateDirectory(RADIO_PATH); + sdCheckAndCreateDirectory(MODELS_PATH); #endif loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+.bin"); @@ -102,6 +104,12 @@ TEST(Conversions, ConversionX9DPFrom23) TEST(Conversions, ConversionX9DPFrom23_2) { +#if defined(SDCARD_YAML) + simuFatfsSetPaths(TESTS_BUILD_PATH "/", TESTS_BUILD_PATH "/"); + sdCheckAndCreateDirectory(RADIO_PATH); + sdCheckAndCreateDirectory(MODELS_PATH); +#endif + loadEEPROMFile(TESTS_PATH "/eeprom_23_x9d+2.bin"); eepromOpen(); @@ -125,106 +133,130 @@ TEST(Conversions, ConversionX9DPFrom23_2) } #endif -// #if defined(PCBXLITE) && !defined(PCBXLITES) -// TEST(Conversions, ConversionXLiteFrom22) -// { -// loadEEPROMFile(TESTS_PATH "/eeprom_22_xlite.bin"); +#if defined(PCBXLITE) && !defined(PCBXLITES) +TEST(Conversions, ConversionXLiteFrom23) +{ +#if defined(SDCARD_YAML) + simuFatfsSetPaths(TESTS_BUILD_PATH "/", TESTS_BUILD_PATH "/"); + sdCheckAndCreateDirectory(RADIO_PATH); + sdCheckAndCreateDirectory(MODELS_PATH); +#endif -// eepromOpen(); -// eeLoadGeneralSettingsData(); -// convertRadioData_218_to_219(g_eeGeneral); -// eeConvertModel(0, 218); -// eeLoadModel(0); + loadEEPROMFile(TESTS_PATH "/eeprom_23_xlite.bin"); -// EXPECT_EQ(-30, g_eeGeneral.vBatMin); -// EXPECT_EQ(8, g_eeGeneral.speakerVolume); -// EXPECT_EQ('e', g_eeGeneral.ttsLanguage[0]); -// EXPECT_EQ('n', g_eeGeneral.ttsLanguage[1]); + eepromOpen(); +#if defined(EEPROM) + eeLoadGeneralSettingsData(); + convertRadioData_219_to_220(g_eeGeneral); +#else + convertRadioData_219_to_220(); + convertRadioData_220_to_221(); + EXPECT_EQ(nullptr, loadRadioSettingsYaml()); +#endif + eeConvertModel(0, 219); + loadModel((uint8_t)0); -// EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); -// EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); -// EXPECT_EQ(20, g_eeGeneral.customFn[0].all.val); + EXPECT_EQ(-30, g_eeGeneral.vBatMin); + EXPECT_EQ(8, g_eeGeneral.speakerVolume); + EXPECT_EQ('e', g_eeGeneral.ttsLanguage[0]); + EXPECT_EQ('n', g_eeGeneral.ttsLanguage[1]); -// EXPECT_ZSTREQ("Tes", g_eeGeneral.switchNames[0]); -// EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); + EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); + EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); + EXPECT_EQ(20, g_eeGeneral.customFn[0].all.val); -// EXPECT_ZSTREQ("Test", g_model.header.name); -// EXPECT_EQ(MODULE_TYPE_R9M_PXX1, g_model.moduleData[EXTERNAL_MODULE].type); -// EXPECT_EQ(MODULE_SUBTYPE_R9M_EU, g_model.moduleData[EXTERNAL_MODULE].subType); -// EXPECT_EQ(80, g_model.mixData[0].weight); -// EXPECT_EQ(80, g_model.expoData[0].weight); -// EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.mixData[4].srcRaw); -// EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_model.mixData[4].swtch); -// EXPECT_EQ(SWASH_TYPE_120X, g_model.swashR.type); -// EXPECT_ZSTREQ("Thr", g_model.inputNames[0]); + EXPECT_STRNEQ("Tes", g_eeGeneral.switchNames[0]); + EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); -// EXPECT_ZSTREQ("Tes", g_model.telemetrySensors[0].label); -// EXPECT_EQ(10, g_model.telemetrySensors[0].id); -// EXPECT_EQ(8, g_model.telemetrySensors[0].frskyInstance.physID); -// EXPECT_EQ(-100, g_model.limitData[0].max); // 90.0 + EXPECT_STRNEQ("Test", g_model.header.name); + EXPECT_EQ(MODULE_TYPE_R9M_PXX1, g_model.moduleData[EXTERNAL_MODULE].type); + EXPECT_EQ(MODULE_SUBTYPE_R9M_EU, g_model.moduleData[EXTERNAL_MODULE].subType); + EXPECT_EQ(80, g_model.mixData[0].weight); + EXPECT_EQ(80, g_model.expoData[0].weight); + EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.mixData[4].srcRaw); + EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_model.mixData[4].swtch); + EXPECT_EQ(SWASH_TYPE_120X, g_model.swashR.type); + EXPECT_STRNEQ("Thr", g_model.inputNames[0]); -// EXPECT_EQ(LS_FUNC_VPOS, g_model.logicalSw[0].func); -// EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.logicalSw[0].v1); -// EXPECT_EQ(0, g_model.logicalSw[0].v2); + EXPECT_STRNEQ("Tes", g_model.telemetrySensors[0].label); + EXPECT_EQ(10, g_model.telemetrySensors[0].id); + EXPECT_EQ(8, g_model.telemetrySensors[0].frskyInstance.physID); + EXPECT_EQ(-100, g_model.limitData[0].max); // 90.0 -// EXPECT_EQ(TELEMETRY_SCREEN_TYPE_VALUES, g_model.screensType & 0x03); -// EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]); -// EXPECT_EQ(MIXSRC_TIMER3, g_model.screens[0].lines[0].sources[1]); -// } -// #endif + EXPECT_EQ(LS_FUNC_VPOS, g_model.logicalSw[0].func); + EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.logicalSw[0].v1); + EXPECT_EQ(0, g_model.logicalSw[0].v2); -// #if defined(PCBX7) -// TEST(Conversions, ConversionX7From22) -// { -// loadEEPROMFile(TESTS_PATH "/eeprom_22_x7.bin"); + EXPECT_EQ(TELEMETRY_SCREEN_TYPE_VALUES, g_model.screensType & 0x03); + EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]); + EXPECT_EQ(MIXSRC_TIMER3, g_model.screens[0].lines[0].sources[1]); +} +#endif -// eepromOpen(); -// eeLoadGeneralSettingsData(); -// convertRadioData_218_to_219(g_eeGeneral); -// eeConvertModel(0, 218); -// eeLoadModel(0); +#if defined(PCBX7) +TEST(Conversions, ConversionX7From23) +{ +#if defined(SDCARD_YAML) + simuFatfsSetPaths(TESTS_BUILD_PATH "/", TESTS_BUILD_PATH "/"); + sdCheckAndCreateDirectory(RADIO_PATH); + sdCheckAndCreateDirectory(MODELS_PATH); +#endif -// EXPECT_EQ(-30, g_eeGeneral.vBatMin); -// EXPECT_EQ(8, g_eeGeneral.speakerVolume); -// EXPECT_EQ('e', g_eeGeneral.ttsLanguage[0]); -// EXPECT_EQ('n', g_eeGeneral.ttsLanguage[1]); + loadEEPROMFile(TESTS_PATH "/eeprom_23_x7.bin"); -// EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); -// EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); -// EXPECT_EQ(20, g_eeGeneral.customFn[0].all.val); + eepromOpen(); +#if defined(EEPROM) + eeLoadGeneralSettingsData(); + convertRadioData_218_to_219(g_eeGeneral); +#else + convertRadioData_219_to_220(); + convertRadioData_220_to_221(); + EXPECT_EQ(nullptr, loadRadioSettingsYaml()); +#endif + eeConvertModel(0, 219); + loadModel((uint8_t)0); -// EXPECT_ZSTREQ("Tes", g_eeGeneral.switchNames[0]); -// EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); + EXPECT_EQ(-30, g_eeGeneral.vBatMin); + EXPECT_EQ(8, g_eeGeneral.speakerVolume); + EXPECT_EQ('e', g_eeGeneral.ttsLanguage[0]); + EXPECT_EQ('n', g_eeGeneral.ttsLanguage[1]); -// EXPECT_ZSTREQ("Test", g_model.header.name); -// EXPECT_EQ(MODULE_TYPE_R9M_PXX1, g_model.moduleData[EXTERNAL_MODULE].type); -// EXPECT_EQ(MODULE_SUBTYPE_R9M_EU, g_model.moduleData[EXTERNAL_MODULE].subType); -// EXPECT_EQ(80, g_model.mixData[0].weight); -// EXPECT_EQ(80, g_model.expoData[0].weight); -// EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.mixData[4].srcRaw); -// EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_model.mixData[4].swtch); -// EXPECT_EQ(SWASH_TYPE_120X, g_model.swashR.type); -// EXPECT_ZSTREQ("Thr", g_model.inputNames[0]); + EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); + EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); + EXPECT_EQ(20, g_eeGeneral.customFn[0].all.val); -// EXPECT_ZSTREQ("Tes", g_model.telemetrySensors[0].label); -// EXPECT_EQ(10, g_model.telemetrySensors[0].id); -// EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); -// EXPECT_EQ(-100, g_model.limitData[0].max); // 90.0 + EXPECT_STRNEQ("Tes", g_eeGeneral.switchNames[0]); + EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); -// EXPECT_EQ(10, g_model.flightModeData[0].gvars[0]); -// EXPECT_ZSTREQ("FMtest", g_model.flightModeData[1].name); -// EXPECT_EQ(45, g_model.flightModeData[1].swtch); -// EXPECT_ZSTREQ("Tes", g_model.gvars[0].name); + EXPECT_STRNEQ("Test", g_model.header.name); + EXPECT_EQ(MODULE_TYPE_R9M_PXX1, g_model.moduleData[EXTERNAL_MODULE].type); + EXPECT_EQ(MODULE_SUBTYPE_R9M_EU, g_model.moduleData[EXTERNAL_MODULE].subType); + EXPECT_EQ(80, g_model.mixData[0].weight); + EXPECT_EQ(80, g_model.expoData[0].weight); + EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.mixData[4].srcRaw); + EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_model.mixData[4].swtch); + EXPECT_EQ(SWASH_TYPE_120X, g_model.swashR.type); + EXPECT_STRNEQ("Thr", g_model.inputNames[0]); -// EXPECT_EQ(LS_FUNC_VPOS, g_model.logicalSw[0].func); -// EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.logicalSw[0].v1); -// EXPECT_EQ(0, g_model.logicalSw[0].v2); + EXPECT_STRNEQ("Tes", g_model.telemetrySensors[0].label); + EXPECT_EQ(10, g_model.telemetrySensors[0].id); + EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); + EXPECT_EQ(-100, g_model.limitData[0].max); // 90.0 -// EXPECT_EQ(TELEMETRY_SCREEN_TYPE_VALUES, g_model.screensType & 0x03); -// EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]); -// EXPECT_EQ(MIXSRC_TIMER3, g_model.screens[0].lines[0].sources[1]); -// } -// #endif + EXPECT_EQ(10, g_model.flightModeData[0].gvars[0]); + EXPECT_STRNEQ("FMtest", g_model.flightModeData[1].name); + EXPECT_EQ(45, g_model.flightModeData[1].swtch); + EXPECT_STRNEQ("Tes", g_model.gvars[0].name); + + EXPECT_EQ(LS_FUNC_VPOS, g_model.logicalSw[0].func); + EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.logicalSw[0].v1); + EXPECT_EQ(0, g_model.logicalSw[0].v2); + + EXPECT_EQ(TELEMETRY_SCREEN_TYPE_VALUES, g_model.screensType & 0x03); + EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]); + EXPECT_EQ(MIXSRC_TIMER3, g_model.screens[0].lines[0].sources[1]); +} +#endif #if 0 //TODO defined(PCBX10) && !defined(RADIO_FAMILY_T16) TEST(Conversions, ConversionX10From22) diff --git a/radio/src/tests/eeprom_22_x7.bin b/radio/src/tests/eeprom_22_x7.bin deleted file mode 100644 index 5f9381631d3653b6f49e8430c9db9e5c9d64e655..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmd_yWl&TL7>Dt5b}6wCvAeMqyRo}4u>H+&7lG|GBdje+Tm|Jh+N%o}#!wid6_c55ZKVU30d z3=Ieh*x(*!Nf7Q9c`Z1%uy!czfA?9+gekE#FxrQDxQ7nv>z= zxJ*=}X$G3L>}G9ifSbi}<6(8&Bz1D!qzwrRO8N7ir3P8<75~xBhOL!pwO2pjUD+`; z>}IIXkEmw1#6(rQHPlDYZ`;h`Vpv0dJMB2(XIlJCcYjxxxKWNTFUvmD>6bUF<6S>b z$0=9i*AK*;{qu8fzxsc#`RCfnjP+k1?szJPSj-T6gsqKfvAfw0xCFa-*g_*552$+_ zuTL+{kI~N2Up=3Hvo$o`r@1>m-7sPveGBC)7+dLt#gR~MT%{8hPeQrzl}?z4gmM!o zoiI-c zODmyV`VC8Z<^2lFAfeohN+&FngmN=0ovkc4szE1j?+63Q*Abi#^BD7U!M z2`eF?+>%NstdxXueU(mFX$j?)Q95DzpZsI4P);tS-115%tb&AcD=M9^N)pPgtaQSv zNGP|e(g~|3q1@_9C#;5qa%(D`uv!wzt*vyz{3MiHN9lysl~8Uyr4v?PLb(l;PFO<; z<@zg~utpNfb^HPt9ZirnjHb{xgT6WREue1+eJki&LmvQrAoOjZZwq}p=-Wfz0s4;6 zcY?k%^j)Cu3Vk=|yF=dt`kv7Dg1$HOeW33PeLv{?Lq7oefzS_velYYyptnIE1pQFx zhe1Ca`Vr8NgnktCqoE%I{aEP7K|db)3D8f3eiHPPp`QZ19r|GCr$Rps`svWmfPNgMK;mE1+Kq{VM2JL%#<4 zwa~AFem(RXpx+4nCg?XqzXkfO&~Jl&JM=rC-wFLL=yyZE2l~Cx?}L6n^ar3n2z@y8 zhoCV^e>=)3H>YR zUqk-}`nS-(gFYJi_t1ZU{v-6Cp#Kd07wEr2{|)-Tp#K~C@6bE`@c=qZ=q=D&p?8Ab z8G0A!U7>e_J{I)u(8q>84)k%Mj|Y8x=sloM0KF&l38D9bJ`wbZp-%#RQs|RGpB(xW z(5Hkx74)g0PXm2g=+i-;9{LQ>XM{cz^qHa00=+l%S)tDceRk+`K%W!(T+ru+J`ePH zq4$A4AN2X5F93Z(=nFw#82Td67lpnU^u?hs0ewm6OF{1oeQD^+KwlR6a?qEDz5?_W zp|1peW$3FwUlsal&{v1P2J|(duLXT==>4Ft1ASfS>p@>1`UcQ9gx(+eM$k8gz6tbA zp>GC#bLd+@-xB&((6@#@0Qx}a+d$tI`gYK_hrR>!9ii_8eP`&qK;ISmZqRp!z6bO@ zq3;EKZ|M6#-xvCR(D#Ra0Q3W)9|Zki=!ZaWgFXoQq0kS5emL|apdShSDCkE+KL+}- z(2s+DJoFQwp9uXV=qE!z1$sO5!O%~Iej4=Cp`QW$Oz3ApKO6cv(9eZ_9`y5}UjTgw z^b4U6g+2`WMbIyXehKtTpw~V81%=XKLPzo z=ubg^8u~NPpN0M$^yi_!0R2ViFF}79`YX_1h5j1!*P*`w{Y~g^L4OS{vPxZ z&__alANmK-KZO1f^pBx`0{v6ypF#f|`Y7mMK>rf@SJ1zP{tfhRp??Q`H1zMG{{a0* W=s!XK8Tv2Ke}(=V^yrW09rz!nX?EWL diff --git a/radio/src/tests/eeprom_22_x9d+.bin b/radio/src/tests/eeprom_22_x9d+.bin deleted file mode 100644 index 8bc63bd4a6879c193aa1ac349c4a46621fa5e9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmd_xd6bo70LStB-aAuc5>p1HkT%gGLx^ZW&9oRNK$FJEo4c{ZK8ddlzkg1 zm8~%-T5KT^l_j)LCdEW<<@|I;f7I`Lj(@!OocDasbI<2_?t7p2k9*#8Zel1X5vmso zMM4cyl0$>f2>p+aAb!2!P(o_Kwyo*mAZQ#U_6=Ibg4U7Dq;UL{5{aKmB}5N*vghgL~F#HNR9CN9`FD877`NGO!D zV{6ms-|O#R>1bAuMvEN${QGBbA5PhvlX=KG%H~11W02gvWROt!)uw3ZaHB^)mK6H; zoJXz`f@2E%1G^IK5rkt&(cB{OQ_jZtb@Yj(?%AFd?9R_h%rD3)xn*y3K#)8!Ikg}Z z+IH|VyLdN#F?jzZ!uzK<+`r@C{vBWV`wtS@9L@fv6!!n|{+0B$UFrmt7pWeTI#K1t zNgk6rS>;73k4cqQd2x!zq{^tgDC;q)Q&nD^<}s<$RbG_ym=yiNQeHE8QNd$U6;)nT z@|aX*l^17vOsa~?i?ci?b+*cjsveW7rt+e?$E0egyg0{WQZ-dxoa-^EG?f?Uc}(hj zl^3-Z!b_?=h(cDlabg znA8<2FRt{MR6~^)jXWlmuJR(oV^WP(UNrHTR8y4~%{(U6T;)Xzk4d#udC|&aQdg z*bOQ#ZuFQ`rpk-19+T>(@}j%Pq;67q(Zgd>H>Nb@Z zeLN<0yUL5c9+SF5X$RprGrk4a5ec`?IdQZrRv z%<`DjY?T+;9+R4*^5PMXNzGMxG0$UCkE*P3|o3p^&ZQ02u-9+O(6@?x>aq?V|>c-do8uc*9u z)nihxsl0gIV^T|1UgUaA>J60_c^;E`Q{}~59+P@o<;60ONiA1-@s7u&-c@O7w>sY>V1_LA9zgaLzNdFc}!}J%8QRZCiRKRi%&f!wN~ZDXC9MUr}E-+ zk4b%@@?yQmq`p*n@s-DF|wOXyoce--qtp}!jXYoKof{k71yh5kC|+douR)T`YzDl z0R4^7XF}f<`fkv7hyEt$dq96P^tV9Y6Z&4z_lEvf=x>9*5A?S~-xvBjpzjC$ozVA( zegO0Xp}!0ILC_C|ehBnKp^rj84Eo{FkAQw8^mjvl5A>s;zZd%ZpuZpb2cRDf{e#et zfqpFX@) z0{vX*=RyA{^p8RRIP_0I|0MKJLH{)L&p`hy^v^;6JoGuxzX1Jw=wF0>0rU%@e+l|U z&@YC53G^>R{|fZ4LjM}{uS35S`dsMWfIbiUH=%zE`nRE92K{pA-+}&J=vP3$68crp zuZI3T=--F_1L!}5{v+tuK>soHpFsa9^lPF24ElA@e-8Z@(65L7OX$CXegpIyq2C1k z*U*0h{kPD62mNN~zlZ(@=zoNM3-nu|-v<45=zoI#XXtl8zZ3djpwEYX7xceEzZ?2J V(EkSg@6Z=OzZZJvKl6v0zW^rH>9GI+ diff --git a/radio/src/tests/eeprom_22_xlite.bin b/radio/src/tests/eeprom_23_x7.bin similarity index 70% rename from radio/src/tests/eeprom_22_xlite.bin rename to radio/src/tests/eeprom_23_x7.bin index 54affdd23aa345ee8698b4cc5b292fb6cc0750dd..10e2a723312eee5b87f59ee39ff4007614b5f7f1 100644 GIT binary patch delta 461 zcmZo@U}|V!5@2OuaxG#KJk0Uv#w2~FE2()30-Gx|MCuX1laYPve>RcdZxb09m<2w*37aTr$;dL9 zkx|iU;YK-xIvA^l>46QH&B~C($UM>apoS-q@|(!G&UD z0|UbBkNg|gPZs(8Hf^H!MCOG?9~lu+xLMc@V4mnRkqKnPL}mhpvEcQ|ThW>XW*cwmm6i%rXk2Hu5Odpg!AU!L6cGARfq2t)t2%Zp`SBnmi}7OiJv( z(J&}Dd*-bPYi`4*=L`}Vl9I3zsK!@ za6Fn8^Ou~?4+DJKsECvp>WPZi!93Z0I%3X;Y|^Pb|&HJRZcJH9j4$$1s> zIg)Uqf;lL^BMB!-FbAFQNWv)~n1e2GB;i~rn1c#Bl5mm*b5J2i5>8>k9CVQ*2`5D` z2VLw)!YLw{gNizmaEb}$pi3M{IF}0MpvxRdIK>5X(B+OKoGS!#(3OrPoK(Rabd@6s zr-Wb*D(OhVxmqv>UE@f?DJ7VLN;{Hp$_VD5vW_I2YXx&qIY$!Cb%Hslydw#xf?y7+ z=t#n;B$$J)cO>Cd7R*6a97#Ag2=AgQcB%FGJIjFuP38#Tz4r=H~ z!nsp02Q_je;WQS^K}{S8*i9MsQ|g!6=84tmm&gwtOz2R-FT!g*RS z2gMvoI9Y-@Xn-RLXP{sX8stdAc}6e?J?luqc}_3~4R$2q3=zyhLmf#t!vu5C^Nu8( z;et76gd+)Oq+kwu!I6aXqF@e+JCbll3Fe^DjwGBhf;s3VM-tA%s~?zNjMV)bI>G563$zKIp}Ri63#n< zIcTyY31^C64w~vn!g*IP2TgM%;k+l9gQh!@aApYRpqY*&oLPc7XtpB>=Y7E(G{=#I zGgmMNec(vK`A{$iedI{O`B*Rq&2uE-%oof-3mi!}3k7q~B1aO=CxSU>u_Fm*iC_*| z>PW&_CYXbkJCbl#2M763%A99Q2JN3FlkE9Q2(d31^F74%+HS z!ueh>2W@jC;cOSoK|eT>aCQjhpq-8+oE*U%^rIsQ=O@7&^s^%g=NG{ow9Ao%vs*9+ z?QtaG{3@7(_BxVq_6g>o{f;D@1A;l|pd$(AkYElv>`1~nBAA1YI+Ad51#{3bM-t9) z!5nnLk%V(nFbDnSNW%GDFbAD-B;lME%t3!Rl5qYM%t3!Sl5zqC&&>kZhhZOqeFE$g zVSgU%^T9p}`~0v^g8lihF97=sV1FU(3&K7b_Jv?y81@&zJ_Ys{!@daYi^9Gb>@R`+ zrLeyY_Qhd;Iqa{1{gtp!h5c2qF9G|Ku)iAi*TB9M>`TMG4D8Fo{#w|VgZ*`|FAw_) zu&)UFO0d5k_LX5@1@%qQ0>>I$oA?)vjeIwX6hJ6#*H--IOux|$Y=CE%8`o2*tdawTiCaQ{r#|S5Bm<7SpAnXUh{u$Um3;X9_KN$8yU_TW0!(jhB?1#gC1nft`{sq{-2>UqfN5OtH?8m_V zCD^|V`&VH9D(qi_{p+xQ1NLKKKMwZeVV@2AH(@^k_7h=03HEQn{%zR51N+Iap91@- zuzwf!(_sG|?5D$i2JC0TeirO!!~T8P&w>41*na@~4`Kfi>_3M6JlM~N{Q}r8g#9Ae ze**i(uwMfErLbQH`{l4-0sBv3zY_MVVE-BHKZpGnu>TVFt6{$e_FuvNYuK-a{W{pM zhy4cFZ-o6O*l&jYH?aQ}_TRyN3+%VT{(IPOgZ*~c{{Z_Pu-^&$9N7N|`=4O{GwgqX z{Vv$=hW#Gc{|fuPu-^y!{jfg(`-8AQ1pC9VKLY!su+N44G1wo6{R!Bgg#B-@{~h+H OV1F9+=l(-p8-D|IBx=L} literal 0 HcmV?d00001 diff --git a/radio/src/tests/lcd.cpp b/radio/src/tests/lcd.cpp index 71947cad5..fe97b97a7 100644 --- a/radio/src/tests/lcd.cpp +++ b/radio/src/tests/lcd.cpp @@ -282,6 +282,7 @@ TEST(Lcd, DrawSwitch) #if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, BMPWrapping) { + simuFatfsSetPaths("",""); lcdClear(); uint8_t bitmap[2+40*40/2]; lcdLoadBitmap(bitmap, TESTS_PATH "/plane.bmp", 40, 40); @@ -349,6 +350,7 @@ public: #if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, lcdDrawBitmapLoadAndDisplay) { + simuFatfsSetPaths("",""); lcdClear(); // Test proper BMP files, they should display correctly { From 8eed123716c0dbf07bd0756cac87d7c2ce6575e2 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 26 Oct 2021 23:57:17 +0200 Subject: [PATCH 084/110] Even more unit tests --- radio/src/tests/CMakeLists.txt | 2 +- radio/src/tests/conversions.cpp | 88 ++++++++++++++---------------- radio/src/tests/model_22_x10.otx | Bin 795 -> 0 bytes radio/src/tests/model_22_x12s.otx | Bin 913 -> 0 bytes radio/src/tests/model_23_x10.otx | Bin 0 -> 804 bytes radio/src/tests/model_23_x12s.otx | Bin 0 -> 761 bytes 6 files changed, 41 insertions(+), 49 deletions(-) delete mode 100644 radio/src/tests/model_22_x10.otx delete mode 100644 radio/src/tests/model_22_x12s.otx create mode 100644 radio/src/tests/model_23_x10.otx create mode 100644 radio/src/tests/model_23_x12s.otx diff --git a/radio/src/tests/CMakeLists.txt b/radio/src/tests/CMakeLists.txt index 4c1859ea8..099d96150 100644 --- a/radio/src/tests/CMakeLists.txt +++ b/radio/src/tests/CMakeLists.txt @@ -15,7 +15,7 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) if(PCB STREQUAL X12S OR PCB STREQUAL X10) - set(EXTRACT_MODEL_FILES model_22_x12s model_22_x10) + set(EXTRACT_MODEL_FILES model_23_x12s model_23_x10) foreach(model_file ${EXTRACT_MODEL_FILES}) add_custom_command( diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index e83b3640e..265b289e3 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -258,15 +258,20 @@ TEST(Conversions, ConversionX7From23) } #endif -#if 0 //TODO defined(PCBX10) && !defined(RADIO_FAMILY_T16) -TEST(Conversions, ConversionX10From22) +#if defined(PCBX10) && !defined(RADIO_FAMILY_T16) +TEST(Conversions, ConversionX10From23) { - simuFatfsSetPaths(TESTS_BUILD_PATH "/model_22_x10/", TESTS_BUILD_PATH "/model_22_x10/"); + simuFatfsSetPaths(TESTS_BUILD_PATH "/model_23_x10/", TESTS_BUILD_PATH "/model_23_x10/"); - loadRadioSettings("/RADIO/radio.bin"); - loadModel("model1.bin"); + convertRadioData_219_to_220("/RADIO/radio.bin"); + convertRadioData_220_to_221("/RADIO/radio.bin"); + EXPECT_EQ(nullptr, loadRadioSettingsYaml()); - EXPECT_EQ(219, g_eeGeneral.version); + char modelname[] = "model1.bin"; + convertBinModelData(modelname, 219); + loadModel(modelname); + + EXPECT_EQ(220, g_eeGeneral.version); // TODO: 221? EXPECT_EQ(100, g_eeGeneral.calib[9].spanNeg); EXPECT_EQ(500, g_eeGeneral.calib[9].mid); @@ -279,7 +284,7 @@ TEST(Conversions, ConversionX10From22) EXPECT_EQ(-23, g_eeGeneral.vBatMin); EXPECT_EQ(8, g_eeGeneral.speakerVolume); EXPECT_STRNEQ("en", g_eeGeneral.ttsLanguage); - EXPECT_STRNEQ("model1.bin", g_eeGeneral.currModelFilename); + EXPECT_STRNEQ("model1.yml", g_eeGeneral.currModelFilename); EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); @@ -289,16 +294,13 @@ TEST(Conversions, ConversionX10From22) EXPECT_EQ(FUNC_VOLUME, g_eeGeneral.customFn[1].func); EXPECT_EQ(MIXSRC_RS, g_eeGeneral.customFn[1].all.val); - EXPECT_ZSTREQ("Tes", g_eeGeneral.switchNames[0]); + EXPECT_STRNEQ("Tes", g_eeGeneral.switchNames[0]); EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); - EXPECT_ZSTREQ("BT_X10", g_eeGeneral.bluetoothName); - EXPECT_STREQ("Default", g_eeGeneral.themeName); + EXPECT_STRNEQ("BT_X10", g_eeGeneral.bluetoothName); + EXPECT_STREQ("EdgeTX", g_eeGeneral.themeName); - EXPECT_EQ(WHITE, g_eeGeneral.themeData.options[0].value.unsignedValue); - EXPECT_EQ(RED, g_eeGeneral.themeData.options[1].value.unsignedValue); - - EXPECT_ZSTREQ("Test", g_model.header.name); + EXPECT_STRNEQ("Test", g_model.header.name); EXPECT_EQ(0, g_model.noGlobalFunctions); EXPECT_EQ(0, g_model.beepANACenter); EXPECT_EQ(80, g_model.mixData[0].weight); @@ -315,38 +317,37 @@ TEST(Conversions, ConversionX10From22) EXPECT_EQ(20, g_model.logicalSw[1].v2); EXPECT_EQ(SWSRC_FIRST_LOGICAL_SWITCH, g_model.logicalSw[1].andsw); EXPECT_EQ(SWASH_TYPE_120X, g_model.swashR.type); - EXPECT_ZSTREQ("Tes", g_model.flightModeData[0].name); + EXPECT_STRNEQ("Tes", g_model.flightModeData[0].name); EXPECT_EQ(10, g_model.flightModeData[0].gvars[0]); - EXPECT_ZSTREQ("Tes", g_model.gvars[0].name); + EXPECT_STRNEQ("Tes", g_model.gvars[0].name); EXPECT_EQ(MODULE_TYPE_R9M_PXX1, g_model.moduleData[EXTERNAL_MODULE].type); EXPECT_EQ(MODULE_SUBTYPE_R9M_EU, g_model.moduleData[EXTERNAL_MODULE].subType); - EXPECT_ZSTREQ("Rud", g_model.inputNames[0]); - EXPECT_ZSTREQ("Tes", g_model.telemetrySensors[0].label); + EXPECT_STRNEQ("Rud", g_model.inputNames[0]); + EXPECT_STRNEQ("Tes", g_model.telemetrySensors[0].label); EXPECT_EQ(10, g_model.telemetrySensors[0].id); EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); EXPECT_EQ((NUM_POTS + NUM_SLIDERS + 3), g_model.thrTraceSrc); // CH3 - - EXPECT_STREQ("Layout2P1", g_model.screenData[0].LayoutId); - EXPECT_STREQ("ModelBmp", g_model.screenData[0].layoutData.zones[0].widgetName); - EXPECT_STREQ("Value", g_model.topbarData.zones[0].widgetName); - EXPECT_EQ(MIXSRC_FIRST_TELEM, g_model.topbarData.zones[0].widgetData.options[0].value.unsignedValue); - EXPECT_EQ(MIXSRC_RS, g_model.screenData[0].layoutData.zones[2].widgetData.options[0].value.unsignedValue); } #endif -#if 0 //TODO defined(PCBX12S) -TEST(Conversions, ConversionX12SFrom22) +#if defined(PCBX12S) +TEST(Conversions, ConversionX12SFrom23) { - simuFatfsSetPaths(TESTS_BUILD_PATH "/model_22_x12s/", TESTS_BUILD_PATH "/model_22_x12s/"); + simuFatfsSetPaths(TESTS_BUILD_PATH "/model_23_x12s/", TESTS_BUILD_PATH "/model_23_x12s/"); - loadRadioSettings("/RADIO/radio.bin"); - loadModel("model1.bin"); + convertRadioData_219_to_220("/RADIO/radio.bin"); + convertRadioData_220_to_221("/RADIO/radio.bin"); + EXPECT_EQ(nullptr, loadRadioSettingsYaml()); - EXPECT_EQ(219, g_eeGeneral.version); + char modelname[] = "model1.bin"; + convertBinModelData(modelname, 219); + loadModel(modelname); + + EXPECT_EQ(220, g_eeGeneral.version); // TODO: 221? EXPECT_EQ(-30, g_eeGeneral.vBatMin); EXPECT_EQ(8, g_eeGeneral.speakerVolume); EXPECT_STRNEQ("en", g_eeGeneral.ttsLanguage); - EXPECT_STRNEQ("model1.bin", g_eeGeneral.currModelFilename); + EXPECT_STRNEQ("model1.yml", g_eeGeneral.currModelFilename); EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_eeGeneral.customFn[0].swtch); EXPECT_EQ(FUNC_LOGS, g_eeGeneral.customFn[0].func); @@ -356,16 +357,13 @@ TEST(Conversions, ConversionX12SFrom22) EXPECT_EQ(FUNC_VOLUME, g_eeGeneral.customFn[1].func); EXPECT_EQ(MIXSRC_RS, g_eeGeneral.customFn[1].all.val); - EXPECT_ZSTREQ("Tes", g_eeGeneral.switchNames[0]); + EXPECT_STRNEQ("Tes", g_eeGeneral.switchNames[0]); EXPECT_EQ(SWITCH_3POS, SWITCH_CONFIG(0)); - EXPECT_ZSTREQ("BT", g_eeGeneral.bluetoothName); - EXPECT_STREQ("Default", g_eeGeneral.themeName); + EXPECT_STRNEQ("BT", g_eeGeneral.bluetoothName); + EXPECT_STREQ("EdgeTX", g_eeGeneral.themeName); - EXPECT_EQ(WHITE, g_eeGeneral.themeData.options[0].unsignedValue); - EXPECT_EQ(RED, g_eeGeneral.themeData.options[1].unsignedValue); - - EXPECT_ZSTREQ("Test", g_model.header.name); + EXPECT_STRNEQ("Test", g_model.header.name); EXPECT_EQ(0, g_model.noGlobalFunctions); EXPECT_EQ(0, g_model.beepANACenter); EXPECT_EQ(80, g_model.mixData[0].weight); @@ -382,22 +380,16 @@ TEST(Conversions, ConversionX12SFrom22) EXPECT_EQ(20, g_model.logicalSw[1].v2); EXPECT_EQ(SWSRC_FIRST_LOGICAL_SWITCH, g_model.logicalSw[1].andsw); EXPECT_EQ(SWASH_TYPE_120X, g_model.swashR.type); - EXPECT_ZSTREQ("Test", g_model.flightModeData[0].name); + EXPECT_STRNEQ("Test", g_model.flightModeData[0].name); EXPECT_EQ(10, g_model.flightModeData[0].gvars[0]); - EXPECT_ZSTREQ("Tes", g_model.gvars[0].name); + EXPECT_STRNEQ("Tes", g_model.gvars[0].name); EXPECT_EQ(MODULE_TYPE_R9M_PXX1, g_model.moduleData[EXTERNAL_MODULE].type); EXPECT_EQ(MODULE_SUBTYPE_R9M_EU, g_model.moduleData[EXTERNAL_MODULE].subType); - EXPECT_ZSTREQ("Rud", g_model.inputNames[0]); - EXPECT_ZSTREQ("Tes", g_model.telemetrySensors[0].label); + EXPECT_STRNEQ("Rud", g_model.inputNames[0]); + EXPECT_STRNEQ("Tes", g_model.telemetrySensors[0].label); EXPECT_EQ(10, g_model.telemetrySensors[0].id); EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); EXPECT_EQ((NUM_POTS + NUM_SLIDERS + 3), g_model.thrTraceSrc); // CH3 - - EXPECT_STREQ("Layout2P1", g_model.screenData[0].LayoutId); - EXPECT_STREQ("ModelBmp", g_model.screenData[0].layoutData.zones[0].widgetName); - EXPECT_STREQ("Value", g_model.topbarData.zones[0].widgetName); - EXPECT_EQ(MIXSRC_FIRST_TELEM, g_model.topbarData.zones[0].widgetData.options[0].unsignedValue); - EXPECT_EQ(MIXSRC_RS, g_model.screenData[0].layoutData.zones[2].widgetData.options[0].unsignedValue); } #endif diff --git a/radio/src/tests/model_22_x10.otx b/radio/src/tests/model_22_x10.otx deleted file mode 100644 index c796f181e5fe32796dc73c5a68197e8aab5beec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795 zcmWIWW@Zs#U|`^25Oz`VcfQ>HW)YAV&dk8T52S+}T|E8uixN{Z^YxN4^WOIE<~rmc z;F`awx5Kr|RYW(ZC8TNU-Wy$O=W1+j64>nPa?owD{DbtLyc;)(i0~}g91$M=w&ttl z(KC(J?Gq2K5!`C6b4XrAEb*+_HL=*=wW~S5U18PLTq2rzmg$*V@eRjUZy64)f6;m2 z=`y>sU*Fw!@;Y^X&Q%$WPp4mIU+(PJKYzS);zpH+SF@WZ{`ZKP9nSsql5cd+j;~6Re+`pOTtm2=>qo+w4OQGHf57 z_e>Sg5S7kwXK!D3_R>=4mtiX=tju@r7BKgg5xKQ?{=&_R=O4Uz{^65%rxlvKSb7B> z`Zzc)R{Qkl!4G-<>56v_%GU4xRDAu^_2ONZUn|+DxhQPD;-auRHu7NU%k%6ewKq$R zcIe$^__s+xscXtNTa8^Jd-P8AitN!{r{m0ZZ(;5agZ=Zl_m^!=nz8-F?XZnse#9P|w^zjL>LT<1pI+s#b#ZK5C?qH- z7-)0i{kzU^|3`Oi*-?W|oc+jiVPKGf(uM#$C4fV&Sg)j_r2E@hf6ud;eNRuZUTmxK zoLL#e5a7+o1kr#!F#%0M0%%DKT{C*rA#|PxGBF|&T|2t-5!$(cZiLv4@JxU=D;r1! OGZ5|q(%wKd3=9BTq#&69 diff --git a/radio/src/tests/model_22_x12s.otx b/radio/src/tests/model_22_x12s.otx deleted file mode 100644 index ac403366218bbc03cbd34223244f1aa633cebf0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 913 zcmWIWW@Zs#U|`^2Fw0l=f7)l-FUZKiuttS}L6AX)!Pno#)hAd#H$Npc$51aRGcPoR zlY!YhG%t2rcV2911vdjD%U7U!uo0*AR~qbmy4%I|$@kmlJU1A%`3h?k8X5(iby}M_ zgMAcOgME}3gMAdGf_;*unVp-NB-cr^E=~~XVUlWMH)DR=6xhISVBFHI!K*P{P(y%m z)ux^aEJ~6y0$3L{NO%I(H3b@QxgFG4V4iS~Em^`)%%GcRMKn-Af>oJ2q3?--!2&+T z!ifn|%G_2mq29Zq^v-)~E$}$7w!PxOkpqsb!8araiPR-dx0boXq%x77>*@UY#TsO&G!e&o3@Fr-1D zEdUJLAV(KZe@M_4>y=cLfP?mtO>~%c~-OU=_%HWZB?E#D`Suhw*p37 z{EWvl%Yg=mGcz#o!woM=Ov%iLN1Fq_XnTFWrn~Xfga7{v*wQ4HD=sx$s=3sX^~95; zgaoGULYrS_1J0Z{u;9RfDYKRb&QDyYpwt6&dHfOU~G=XkeSn;d4&aRClAva+VpZ6lClF+&|lA4mr|x_J8Q7bT`-=IbS8=DqD+&wa>2 z=IH&mT|5U{6}#BFH>k{ble9Hj-Q018^dXjmMgKI+n(L?hKdicVLE?rqi}Q2E9Cv)J zJ@no7UiE#8Nd6-go~&I7g@-!#NhVrc5Z;-P^!GM{^M(9#H>bV5F;6plb?Cg%Jf@97 z>>P{wc3D)fna!EQy=qzSJ}3Tou;lyvCG*m5=_HA@{JmEqS1WbCXm@Yf z>sF3_osz*%vR;&`lWm1CjX-s-wO)ArwTZ# zHo0{aNcAWLF1E4X@u&Z}p1076kK2n{msbVtz5KR}`=F76&CHcpd=jEf$`$|7M%-t;aYY@kUX}5*nDa5C=V_nxxc{4PZ0HYBn_u>Pf1Yf=qoQJ1 zh!POo;{UX>`o*i^Q>my(^IS$ z+p0WgR>lAgU}S=5z@DmrrXT^dG={DjJ@ODbuK}4DQHib{-T4UZ!az4d>_&Jdz?+o~ Qq=Fd;cLC`Tpc)1S0Q~wT&;S4c literal 0 HcmV?d00001 diff --git a/radio/src/tests/model_23_x12s.otx b/radio/src/tests/model_23_x12s.otx new file mode 100644 index 0000000000000000000000000000000000000000..a223143a98c8a1ed9ef2a98fedd61bdf4b3ee25e GIT binary patch literal 761 zcmWIWW@Zs#U|`^22-y`C>>8)R&;#UEGBYsn1L+_~7f*lvqQsQUe7&U1yth5J+)V)@ zZTG9+3khB+*e>S2T;YZK7Bh3{=WLCd6CDK(hKm1RJo()}ruNrI`(rO$Ot+9fUul{6 z#rEm+=_d@$V~o%K>e4>)!1U;p0I#x`+aa&RQhT@eT0YP!D7%)j?#-kBz1PdyT3bKP zkl%1T?3$?BXCBX=#}B_1{Br1N(T=%S@BaQF*z>Y1u;=$ph5!_YUk^W&!obMDAfU#; zAP980ufL0{Pq2P&eoAVNA=v3RY_ktJ$gq8QKFRB{PmocG&Qg)9IXp zcEr(ff7|?H{SV(gdUsl7g+@jTN9Xb%O~*RU>#O`fUA+CNLjAdQrb2g@d`msk&iqFF z;L9L^ptQ`cIj*{v)!L_SRy&?c%6}zA2VFCIbRl%^1Trxq4_!OD^AXx# c0Mh`(ZiHt7yjj^mDwu(A7m(Hj`h$T100gWVDgXcg literal 0 HcmV?d00001 From 288fe158ae73aa893cbdeabca631d96a62aca736 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 27 Oct 2021 15:08:15 +0200 Subject: [PATCH 085/110] WiP fix emergency mode --- radio/src/datastructs.h | 904 +----------------------- radio/src/datastructs_private.h | 923 +++++++++++++++++++++++++ radio/src/storage/rtc_backup.cpp | 11 +- radio/src/targets/horus/CMakeLists.txt | 2 +- radio/src/targets/nv14/CMakeLists.txt | 2 +- radio/src/tests/eeprom.cpp | 2 +- 6 files changed, 935 insertions(+), 909 deletions(-) create mode 100644 radio/src/datastructs_private.h diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 43a1c18f1..3ba00cc31 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -19,911 +19,9 @@ * GNU General Public License for more details. */ -// No include guards here, this file may be included many times in different namespaces -// i.e. BACKUP RAM Backup/Restore functions - #pragma once -#include -#include "board.h" -#include "dataconstants.h" -#include "definitions.h" -#include "opentx_types.h" -#include "globals.h" - -#if defined(PCBTARANIS) - #define N_TARANIS_FIELD(x) - #define TARANIS_FIELD(x) x; -#else - #define N_TARANIS_FIELD(x) x; - #define TARANIS_FIELD(x) -#endif - -#if defined(PCBX9E) - #define TARANIS_PCBX9E_FIELD(x) x; -#else - #define TARANIS_PCBX9E_FIELD(x) -#endif - -#if defined(PCBHORUS) - #define N_HORUS_FIELD(x) - #define HORUS_FIELD(x) x; -#else - #define N_HORUS_FIELD(x) x; - #define HORUS_FIELD(x) -#endif - -#if defined(BACKUP) - #define NOBACKUP(...) -#else - #define NOBACKUP(...) __VA_ARGS__ -#endif - -#include "storage/yaml/yaml_defs.h" - -/* - * Mixer structure - */ - -PACK(struct CurveRef { - uint8_t type; - int8_t value; -}); - -PACK(struct MixData { - int16_t weight:11 CUST(in_read_weight,in_write_weight); // GV1=-1024, -GV1=1023 - uint16_t destCh:5; - uint16_t srcRaw:10 CUST(r_mixSrcRaw,w_mixSrcRaw); // srcRaw=0 means not used - uint16_t carryTrim:1; - uint16_t mixWarn:2; // mixer warning - uint16_t mltpx:2 ENUM(MixerMultiplex); - uint16_t spare:1 SKIP; - int32_t offset:14; - int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); - uint32_t flightModes:9 CUST(r_flightModes, w_flightModes); - CurveRef curve; - uint8_t delayUp; - uint8_t delayDown; - uint8_t speedUp; - uint8_t speedDown; - NOBACKUP(char name[LEN_EXPOMIX_NAME]); -}); - -/* - * Expo/Input structure - */ - -PACK(struct ExpoData { - uint16_t mode:2; - uint16_t scale:14; - uint16_t srcRaw:10 ENUM(MixSources) CUST(r_mixSrcRaw,w_mixSrcRaw); - int16_t carryTrim:6; - uint32_t chn:5; - int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); - uint32_t flightModes:9 CUST(r_flightModes, w_flightModes); - int32_t weight:8 CUST(in_read_weight,in_write_weight); - int32_t spare:1 SKIP; - NOBACKUP(char name[LEN_EXPOMIX_NAME]); - int8_t offset; - CurveRef curve; -}); - -/* - * Limit structure - */ - -PACK(struct LimitData { - int32_t min:11; - int32_t max:11; - int32_t ppmCenter:10; // TODO can be reduced to 8 bits - int16_t offset:11; - uint16_t symetrical:1; - uint16_t revert:1; - uint16_t spare:3 SKIP; - int8_t curve; - NOBACKUP(char name[LEN_CHANNEL_NAME]); -}); - -/* - * LogicalSwitch structure - */ - -PACK(struct LogicalSwitchData { - uint8_t func ENUM(LogicalSwitchesFunctions); - CUST_ATTR(def,r_logicSw,w_logicSw); - int32_t v1:10 SKIP; - int32_t v3:10 SKIP; - int32_t andsw:9 CUST(r_swtchSrc,w_swtchSrc); // TODO rename to xswtch - uint32_t andswtype:1 SKIP; // TODO rename to xswtchType (AND / OR) - uint32_t spare:2 SKIP; // anything else needed? - int16_t v2 SKIP; - uint8_t delay; - uint8_t duration; -}); - -/* - * SpecialFunction structure - */ - - -#if defined(PCBTARANIS) - #define CFN_SPARE_TYPE int32_t -#else - #define CFN_SPARE_TYPE int16_t -#endif - -PACK(struct CustomFunctionData { - int16_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); - uint16_t func:7 ENUM(Functions); - CUST_ATTR(def,r_customFn,w_customFn); - PACK(union { - NOBACKUP(PACK(struct { - char name[LEN_FUNCTION_NAME]; - }) play); - - PACK(struct { - int16_t val; - uint8_t mode; - uint8_t param; - NOBACKUP(CFN_SPARE_TYPE spare); - }) all; - - NOBACKUP(PACK(struct { - int32_t val1; - NOBACKUP(CFN_SPARE_TYPE val2); - }) clear); - }) NAME(fp) SKIP; - uint8_t active SKIP; - - bool isEmpty() const - { - return swtch == 0; - } -}); - -/* - * FlightMode structure - */ - -PACK(struct trim_t { - int16_t value:11; - uint16_t mode:5; -}); - -PACK(struct FlightModeData { - trim_t trim[NUM_TRIMS]; - NOBACKUP(char name[LEN_FLIGHT_MODE_NAME]); - int16_t swtch:9 ENUM(SwitchSources) CUST(r_swtchSrc,w_swtchSrc); // swtch of phase[0] is not used - int16_t spare:7 SKIP; - uint8_t fadeIn; - uint8_t fadeOut; - gvar_t gvars[MAX_GVARS] FUNC(gvar_is_active); -}); - -/* - * Curve structure - */ - -PACK(struct CurveHeader { - uint8_t type:1; - uint8_t smooth:1; - int8_t points:6; // describes number of points - 5 - NOBACKUP(char name[LEN_CURVE_NAME]); -}); - -/* - * GVar structure - */ - -PACK(struct GVarData { - NOBACKUP(char name[LEN_GVAR_NAME]); - uint32_t min:12; - uint32_t max:12; - uint32_t popup:1; - uint32_t prec:1; - uint32_t unit:2; - uint32_t spare:4 SKIP; -}); - -/* - * Timer structure - */ - -PACK(struct TimerData { - uint32_t start:22; - int32_t swtch:10 CUST(r_swtchSrc,w_swtchSrc); - int32_t value:22; - uint32_t mode:3 ENUM(TimerModes); - uint32_t countdownBeep:2; - uint32_t minuteBeep:1; - uint32_t persistent:2; - int32_t countdownStart:2; - NOBACKUP(char name[LEN_TIMER_NAME]); -}); - -/* - * Swash Ring structure - */ - -PACK(struct SwashRingData { - uint8_t type ENUM(SwashType); - uint8_t value; - uint8_t collectiveSource CUST(r_mixSrcRaw,w_mixSrcRaw); - uint8_t aileronSource CUST(r_mixSrcRaw,w_mixSrcRaw); - uint8_t elevatorSource CUST(r_mixSrcRaw,w_mixSrcRaw); - int8_t collectiveWeight; - int8_t aileronWeight; - int8_t elevatorWeight; -}); - -#if MAX_SCRIPTS > 0 -union ScriptDataInput { - int16_t value; - source_t source CUST(r_mixSrcRaw,w_mixSrcRaw); -} FUNC(select_script_input); - -PACK(struct ScriptData { - char file[LEN_SCRIPT_FILENAME]; - char name[LEN_SCRIPT_NAME]; - ScriptDataInput inputs[MAX_SCRIPT_INPUTS]; -}); -#endif - -/* - * Frsky Telemetry structure - */ -PACK(struct RssiAlarmData { - int8_t disabled:1; -#if defined (PCBNV14) - uint8_t flysky_telemetry:1; // if set for FlySky receivers use native RSSI values instead of rescaled ones -#else - int8_t spare:1 SKIP; -#endif - int8_t warning:6; - int8_t spare2:2 SKIP; - int8_t critical:6; - inline int8_t getWarningRssi() {return 45 + warning;} - inline int8_t getCriticalRssi() {return 42 + critical;} - }); - -typedef int16_t ls_telemetry_value_t; - -#if !defined(COLORLCD) -PACK(struct FrSkyBarData { - source_t source CUST(r_mixSrcRaw,w_mixSrcRaw); - ls_telemetry_value_t barMin; // minimum for bar display - ls_telemetry_value_t barMax; // ditto for max display (would usually = ratio) -}); - -// This is used to be able to use -// custom read/write functions in -// an array made of typdef'ed literal types -// (YAML generator) -#if defined(YAML_GENERATOR) -PACK(struct LineDataSource { - source_t val CUST(r_mixSrcRaw,w_mixSrcRaw); -}); -PACK(struct FrSkyLineData { - LineDataSource sources[NUM_LINE_ITEMS]; -}); -#else -// This here is the real structure used at run-time -PACK(struct FrSkyLineData { - source_t sources[NUM_LINE_ITEMS]; -}); -#endif - -#if defined(PCBTARANIS) -PACK(struct TelemetryScriptData { - char file[LEN_SCRIPT_FILENAME]; - int16_t inputs[MAX_TELEM_SCRIPT_INPUTS]; -}); -#endif - -#if defined(YAML_GENERATOR) -union TelemetryScreenData_u { - FrSkyBarData bars[4]; - FrSkyLineData lines[4]; -#if defined(PCBTARANIS) - TelemetryScriptData script; -#endif -}; -PACK(struct TelemetryScreenData { - CUST_ATTR(type,r_tele_screen_type,w_tele_screen_type); - TelemetryScreenData_u u FUNC(select_tele_screen_data); -}); -#else -union TelemetryScreenData { - FrSkyBarData bars[4]; - FrSkyLineData lines[4]; -#if defined(PCBTARANIS) - TelemetryScriptData script; -#endif -} FUNC(select_tele_screen_data); -#endif - -#endif - -PACK(struct VarioData { - uint8_t source:7 CUST(r_tele_sensor,w_tele_sensor); // telemetry sensor idx + 1 - uint8_t centerSilent:1; - int8_t centerMax; - int8_t centerMin; - int8_t min; - int8_t max; -}); - -/* - * Telemetry Sensor structure - */ - -#define TELEMETRY_ENDPOINT_NONE 0xFF -#define TELEMETRY_ENDPOINT_SPORT 0x07 - -PACK(struct TelemetrySensor { - union { - uint16_t id; // data identifier, for FrSky we can reuse existing ones. - // Source unit is derived from type. - NOBACKUP(uint16_t persistentValue); - } NAME(id1) FUNC(select_id1); - union { - NOBACKUP(PACK(struct { - uint8_t physID:5; - uint8_t rxIndex:3; // 1 bit for module index, 2 bits for receiver index - }) frskyInstance); - uint8_t instance; - NOBACKUP(uint8_t formula ENUM(TelemetrySensorFormula)); - } NAME(id2) FUNC(select_id2); - char label[TELEM_LABEL_LEN]; // user defined label - uint8_t subId; - uint8_t type:1 ENUM(TelemetrySensorType); // 0=custom / 1=calculated - // user can choose what unit to display each value in - uint8_t spare1:1 SKIP; - uint8_t unit:6; - uint8_t prec:2; - uint8_t autoOffset:1; - uint8_t filter:1; - uint8_t logs:1; - uint8_t persistent:1; - uint8_t onlyPositive:1; - uint8_t spare2:1 SKIP; - union { - NOBACKUP(PACK(struct { - uint16_t ratio; - int16_t offset; - }) custom); - NOBACKUP(PACK(struct { - uint8_t source; - uint8_t index; - uint16_t spare SKIP; - }) cell); - NOBACKUP(PACK(struct { - int8_t sources[4]; - }) calc); - NOBACKUP(PACK(struct { - uint8_t source; - uint8_t spare[3] SKIP; - }) consumption); - NOBACKUP(PACK(struct { - uint8_t gps; - uint8_t alt; - uint16_t spare SKIP; - }) dist); - uint32_t param; - } NAME(cfg) FUNC(select_sensor_cfg); - NOBACKUP( - void init(const char *label, uint8_t unit=UNIT_RAW, uint8_t prec=0); - void init(uint16_t id); - bool isAvailable() const; - int32_t getValue(int32_t value, uint8_t unit, uint8_t prec) const; - bool isConfigurable() const; - bool isPrecConfigurable() const; - int32_t getPrecMultiplier() const; - int32_t getPrecDivisor() const; - bool isSameInstance(TelemetryProtocol protocol, uint8_t instance); - ); -}); - -/* - * Trainer module structure - */ - -PACK(struct TrainerModuleData { - uint8_t mode CUST(r_trainerMode,w_trainerMode); - uint8_t channelsStart; - int8_t channelsCount; // 0=8 channels - int8_t frameLength; - int8_t delay:6; - uint8_t pulsePol:1; - uint8_t spare2:1 SKIP; -}); - -/* - * Module structure - */ - -// Only used in case switch and if statements as "virtual" protocol -#define MM_RF_CUSTOM_SELECTED 0xff -#define MULTI_MAX_PROTOCOLS 127 // rfProtocol:4 + rfProtocolExtra:3 -PACK(struct ModuleData { - uint8_t type:4 ENUM(ModuleType); - // TODO some refactoring is needed, rfProtocol is only used by DSM2 and MULTI, it could be merged with subType - int8_t rfProtocol:4; - uint8_t channelsStart; - int8_t channelsCount; // 0=8 channels - uint8_t failsafeMode:4; // only 3 bits used - uint8_t subType:3; - uint8_t invertedSerial:1; // telemetry serial inverted from standard - - union { - uint8_t raw[PXX2_MAX_RECEIVERS_PER_MODULE * PXX2_LEN_RX_NAME + 1]; - NOBACKUP(struct { - int8_t delay:6; - uint8_t pulsePol:1; - uint8_t outputType:1; // false = open drain, true = push pull - int8_t frameLength; - } ppm); - NOBACKUP(struct { - uint8_t rfProtocolExtra:3; - uint8_t disableTelemetry:1; - uint8_t disableMapping:1; - uint8_t customProto:1; - uint8_t autoBindMode:1; - uint8_t lowPowerMode:1; - int8_t optionValue; - uint8_t receiverTelemetryOff:1; - uint8_t receiverHigherChannels:1; - uint8_t spare:6 SKIP; - } multi); - NOBACKUP(struct { - uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W - uint8_t spare1:2 SKIP; - uint8_t receiverTelemetryOff:1; // false = receiver telem enabled - uint8_t receiverHigherChannels:1; // false = pwm out 1-8, true 9-16 - int8_t antennaMode:2; - uint8_t spare2 SKIP; - } pxx); - NOBACKUP(struct { - uint8_t spare1:6 SKIP; - uint8_t noninverted:1; - uint8_t spare2:1 SKIP; - int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms) - } sbus); - NOBACKUP(struct { - uint8_t receivers:7; // 4 bits spare - uint8_t racingMode:1; - char receiverName[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; - } pxx2); - NOBACKUP(struct { - uint8_t rx_id[4]; - uint8_t mode:3; - uint8_t rfPower:1; - uint8_t reserved:4; - uint8_t rx_freq[2]; - - void setDefault() { - rx_id[0] = rx_id[1] = rx_id[2] = rx_id[3] = 0; - mode = 3; - rfPower = 0; - rx_freq[0] = 50; - rx_freq[1] = 0; - } - } flysky); - NOBACKUP(PACK(struct { - uint8_t bindPower:3; - uint8_t runPower:3; - uint8_t emi:1; - uint8_t telemetry:1; - uint16_t failsafeTimeout; - uint8_t rx_freq[2]; - uint8_t mode:2; - uint8_t reserved:6; - uint16_t rxFreq() - { - return (uint16_t)rx_freq[0] | (((uint16_t)rx_freq[1]) << 8); - } - - void setRxFreq(uint16_t value) - { - rx_freq[0] = value & 0xFF; - rx_freq[1] = value >> 8; - } - } afhds3)); - } NAME(mod) FUNC(select_mod_type); - - // Helper functions to set both of the rfProto protocol at the same time - NOBACKUP(inline uint8_t getMultiProtocol() const - { - return ((uint8_t) (rfProtocol & 0x0F)) + (multi.rfProtocolExtra << 4); - }) - - NOBACKUP(inline void setMultiProtocol(uint8_t proto) - { - rfProtocol = (uint8_t) (proto & 0x0F); - multi.rfProtocolExtra = (proto & 0x70) >> 4; - }) - - NOBACKUP(inline uint8_t getChannelsCount() const - { - return channelsCount + 8; - }) -}); - -/* - * Model structure - */ - -#if LEN_BITMAP_NAME > 0 -#define MODEL_HEADER_BITMAP_FIELD NOBACKUP(char bitmap[LEN_BITMAP_NAME]); -#else -#define MODEL_HEADER_BITMAP_FIELD -#endif - - -PACK(struct ModelHeader { - char name[LEN_MODEL_NAME]; // must be first for eeLoadModelName - uint8_t modelId[NUM_MODULES]; - MODEL_HEADER_BITMAP_FIELD -}); - -#if defined(COLORLCD) -typedef uint32_t swconfig_t; -typedef uint32_t swarnstate_t; -#elif defined(PCBX9E) -typedef uint64_t swconfig_t; -typedef uint64_t swarnstate_t; -typedef uint32_t swarnenable_t; -#elif defined(PCBX9D) || defined(PCBX9DP) -typedef uint32_t swconfig_t; -typedef uint32_t swarnstate_t; -typedef uint16_t swarnenable_t; // TODO remove it in 2.4 -#elif defined(PCBTARANIS) -typedef uint16_t swconfig_t; -typedef uint16_t swarnstate_t; -typedef uint8_t swarnenable_t; // TODO remove it in 2.4 -#else -typedef uint8_t swarnstate_t; -typedef uint8_t swarnenable_t; -#endif - -#if defined(COLORLCD) - #define SWITCHES_WARNING_DATA \ - NOBACKUP(swarnstate_t switchWarningState CUST(r_swtchWarn,w_swtchWarn)); -#else - #define SWITCHES_WARNING_DATA \ - swarnstate_t switchWarningState CUST(r_swtchWarn,w_swtchWarn); \ - swarnenable_t switchWarningEnable; // TODO remove it in 2.4 -#endif - -#if defined(COLORLCD) && defined(BACKUP) -#define CUSTOM_SCREENS_DATA -#elif defined(COLORLCD) -#include "gui/colorlcd/layout.h" -#include "gui/colorlcd/topbar.h" -#define LAYOUT_ID_LEN 10 -PACK(struct CustomScreenData { - char LayoutId[LAYOUT_ID_LEN]; - LayoutPersistentData layoutData; -}); -#define CUSTOM_SCREENS_DATA \ - NOBACKUP(CustomScreenData screenData[MAX_CUSTOM_SCREENS]); \ - NOBACKUP(TopBarPersistentData topbarData); \ - NOBACKUP(uint8_t view); -#else -#define CUSTOM_SCREENS_DATA \ - uint8_t screensType SKIP; /* 2bits per screen (None/Gauges/Numbers/Script) */ \ - TelemetryScreenData screens[MAX_TELEMETRY_SCREENS]; \ - uint8_t view; -#endif - -#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) - // telemetry sensor idx + 1 - #define TOPBAR_DATA \ - NOBACKUP(uint8_t voltsSource CUST(r_tele_sensor,w_tele_sensor)); \ - NOBACKUP(uint8_t altitudeSource CUST(r_tele_sensor,w_tele_sensor)); -#else - #define TOPBAR_DATA -#endif - -#if defined(PCBHORUS) || defined(PCBTARANIS) || defined(PCBNV14) - #define SCRIPT_DATA \ - NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); -#else - #define SCRIPT_DATA -#endif - -PACK(struct PartialModel { - ModelHeader header; - TimerData timers[MAX_TIMERS]; -}); - -PACK(struct ModelData { - ModelHeader header; - TimerData timers[MAX_TIMERS]; - uint8_t telemetryProtocol:3; - uint8_t thrTrim:1; // Enable Throttle Trim - uint8_t noGlobalFunctions:1; - uint8_t displayTrims:2; - uint8_t ignoreSensorIds:1; - int8_t trimInc:3; // Trim Increments - uint8_t disableThrottleWarning:1; - uint8_t displayChecklist:1; - uint8_t extendedLimits:1; - uint8_t extendedTrims:1; - uint8_t throttleReversed:1; - BeepANACenter beepANACenter; - MixData mixData[MAX_MIXERS] NO_IDX; - LimitData limitData[MAX_OUTPUT_CHANNELS]; - ExpoData expoData[MAX_EXPOS] NO_IDX; - - CurveHeader curves[MAX_CURVES]; - int8_t points[MAX_CURVE_POINTS]; - - LogicalSwitchData logicalSw[MAX_LOGICAL_SWITCHES]; - CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS] FUNC(cfn_is_active); - SwashRingData swashR FUNC(swash_is_active); - FlightModeData flightModeData[MAX_FLIGHT_MODES] FUNC(fmd_is_active); - - NOBACKUP(uint8_t thrTraceSrc); - - SWITCHES_WARNING_DATA - - GVarData gvars[MAX_GVARS]; - - NOBACKUP(VarioData varioData); - NOBACKUP(uint8_t rssiSource CUST(r_tele_sensor,w_tele_sensor)); - - TOPBAR_DATA - - NOBACKUP(RssiAlarmData rssiAlarms); - - uint8_t spare1:3 SKIP; - uint8_t thrTrimSw:3; - uint8_t potsWarnMode:2; - - ModuleData moduleData[NUM_MODULES]; - int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; - TrainerModuleData trainerData; - - SCRIPT_DATA - - NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); - NOBACKUP(uint8_t potsWarnEnabled); - NOBACKUP(int8_t potsWarnPosition[STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS]); - - NOBACKUP(TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS];) - - TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) - - CUSTOM_SCREENS_DATA - - char modelRegistrationID[PXX2_LEN_REGISTRATION_ID]; - - bool isTrainerTraineeEnable() const - { -#if defined(PCBNV14) - return trainerData.mode >= TRAINER_MODE_MASTER_TRAINER_JACK; -#else - return true; -#endif - } - - uint8_t getThrottleStickTrimSource() const - { - // The order here is TERA, so that 0 (default) means Throttle - switch (thrTrimSw) { - case 0: - return MIXSRC_TrimThr; - case 2: - return MIXSRC_TrimRud; - default: - return thrTrimSw + MIXSRC_FIRST_TRIM; - } - } - - void setThrottleStickTrimSource(int16_t src) - { - // The order here is TERA, so that 0 (default) means Throttle - switch (src) { - case MIXSRC_TrimThr: - thrTrimSw = 0; - break; - case MIXSRC_TrimRud: - thrTrimSw = 2; - break; - default: - thrTrimSw = src - MIXSRC_FIRST_TRIM; - break; - } - } -}); - -/* - * Radio structure - */ - -#if XPOTS_MULTIPOS_COUNT > 0 -PACK(struct StepsCalibData { - uint8_t count; - uint8_t steps[XPOTS_MULTIPOS_COUNT-1]; -}); -#endif - -PACK(struct CalibData { - int16_t mid; - int16_t spanNeg; - int16_t spanPos; -}); - -PACK(struct TrainerMix { - uint8_t srcChn:6; // 0-7 = ch1-8 - uint8_t mode:2 ENUM(TrainerMultiplex); // off,add-mode,subst-mode - int8_t studWeight; -}); - -PACK(struct TrainerData { - int16_t calib[4]; - NOBACKUP(TrainerMix mix[4]); -}); - -#if defined(COLORLCD) - #define SPLASH_MODE uint8_t splashSpares:3 SKIP -#else - #define SPLASH_MODE int8_t splashMode:3 -#endif - -#if defined(PCBXLITES) - #define GYRO_FIELDS \ - int8_t gyroMax; \ - int8_t gyroOffset; -#else - #define GYRO_FIELDS -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define EXTRA_GENERAL_FIELDS \ - NOBACKUP(uint8_t auxSerialMode:4 ENUM(UartModes)); \ - NOBACKUP(uint8_t aux2SerialMode:4 ENUM(UartModes)); \ - CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ - swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ - uint16_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */ \ - uint8_t slidersConfig ARRAY(1,struct_sliderConfig,nullptr); /* 1 bit per slider */ \ - NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP); \ - NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP); \ - NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \ - NOBACKUP(uint8_t spare5:1 SKIP); \ - NOBACKUP(uint8_t blOffBright:7); \ - NOBACKUP(char bluetoothName[LEN_BLUETOOTH_NAME]); -#elif defined(PCBTARANIS) - #if defined(STORAGE_BLUETOOTH) - #define BLUETOOTH_FIELDS \ - uint8_t spare5 SKIP; \ - char bluetoothName[LEN_BLUETOOTH_NAME]; - #else - #define BLUETOOTH_FIELDS - #endif - #define EXTRA_GENERAL_FIELDS \ - uint8_t auxSerialMode:4 ENUM(UartModes); \ - uint8_t slidersConfig:4 ARRAY(1,struct_sliderConfig,nullptr); \ - uint8_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */\ - uint8_t backlightColor; \ - swarnstate_t switchUnlockStates; \ - CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ - swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ - char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP; \ - char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP; \ - BLUETOOTH_FIELDS -#else - #define EXTRA_GENERAL_FIELDS -#endif - -#if defined(COLORLCD) && !defined(BACKUP) - #include "theme.h" - #define THEME_NAME_LEN 8 - #define THEME_DATA \ - NOBACKUP(char themeName[THEME_NAME_LEN]); \ - NOBACKUP(OpenTxTheme::PersistentData themeData); -#else - #define THEME_DATA -#endif - -#if defined(BUZZER) - #define BUZZER_FIELD int8_t buzzerMode:2 // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) -#else - #define BUZZER_FIELD int8_t spare4:2 SKIP -#endif - -PACK(struct RadioData { - - // Real attributes - NOBACKUP(uint8_t version); - NOBACKUP(uint16_t variant SKIP); - CalibData calib[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS]; - NOBACKUP(uint16_t chkSum SKIP); - N_HORUS_FIELD(int8_t currModel); - N_HORUS_FIELD(uint8_t contrast); - NOBACKUP(uint8_t vBatWarn); - NOBACKUP(int8_t txVoltageCalibration); - uint8_t backlightMode:3 ENUM(BacklightMode); - int8_t antennaMode:2 ENUM(AntennaModes); - uint8_t disableRtcWarning:1; - uint8_t keysBacklight:1; - int8_t spare1:1 SKIP; - NOBACKUP(TrainerData trainer); - NOBACKUP(uint8_t view); // index of view in main screen - NOBACKUP(BUZZER_FIELD); /* 2bits */ - NOBACKUP(uint8_t fai:1); - NOBACKUP(int8_t beepMode:2 ENUM(BeeperMode) CUST(r_beeperMode,w_beeperMode)); - NOBACKUP(uint8_t alarmsFlash:1); - NOBACKUP(uint8_t disableMemoryWarning:1); - NOBACKUP(uint8_t disableAlarmWarning:1); - uint8_t stickMode:2; - int8_t timezone:5; - uint8_t adjustRTC:1; - NOBACKUP(uint8_t inactivityTimer); - uint8_t telemetryBaudrate:3; - SPLASH_MODE; /* 3bits */ - int8_t hapticMode:2 CUST(r_beeperMode,w_beeperMode); - int8_t switchesDelay; - NOBACKUP(uint8_t lightAutoOff); - NOBACKUP(uint8_t templateSetup); // RETA order for receiver channels - NOBACKUP(int8_t PPM_Multiplier); - NOBACKUP(int8_t hapticLength CUST(r_5pos,w_5pos)); - N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t spare2 SKIP)); - N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse)); - NOBACKUP(int8_t beepLength:3 CUST(r_5pos,w_5pos)); - NOBACKUP(int8_t hapticStrength:3 CUST(r_5pos,w_5pos)); - NOBACKUP(uint8_t gpsFormat:1); - NOBACKUP(uint8_t unexpectedShutdown:1); - NOBACKUP(uint8_t speakerPitch CUST(r_spPitch,w_spPitch)); - NOBACKUP(int8_t speakerVolume CUST(r_vol,w_vol)); - NOBACKUP(int8_t vBatMin CUST(r_vbat_min,w_vbat_min)); - NOBACKUP(int8_t vBatMax CUST(r_vbat_max,w_vbat_max)); - - NOBACKUP(uint8_t backlightBright); - NOBACKUP(uint32_t globalTimer); - NOBACKUP(uint8_t bluetoothBaudrate:4); - NOBACKUP(uint8_t bluetoothMode:4 ENUM(BluetoothModes)); - NOBACKUP(uint8_t countryCode:2); - NOBACKUP(int8_t pwrOnSpeed:3); - NOBACKUP(int8_t pwrOffSpeed:3); - NOBACKUP(uint8_t imperial:1); - NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */ - NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); - NOBACKUP(uint8_t USBMode:2); - NOBACKUP(uint8_t jackMode:2); - NOBACKUP(uint8_t sportUpdatePower:1 SKIP); - NOBACKUP(char ttsLanguage[2]); - NOBACKUP(int8_t beepVolume:4 CUST(r_5pos,w_5pos)); - NOBACKUP(int8_t wavVolume:4 CUST(r_5pos,w_5pos)); - NOBACKUP(int8_t varioVolume:4 CUST(r_5pos,w_5pos)); - NOBACKUP(int8_t backgroundVolume:4 CUST(r_5pos,w_5pos)); - NOBACKUP(int8_t varioPitch CUST(r_vPitch,w_vPitch)); - NOBACKUP(int8_t varioRange CUST(r_vPitch,w_vPitch)); - NOBACKUP(int8_t varioRepeat); - CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS] FUNC(cfn_is_active); - - EXTRA_GENERAL_FIELDS - - THEME_DATA - - char ownerRegistrationID[PXX2_LEN_REGISTRATION_ID]; - - GYRO_FIELDS - - NOBACKUP(int8_t uartSampleMode:2); // See UartSampleModes -}); - -#undef SWITCHES_WARNING_DATA -#undef MODEL_GVARS_DATA -#undef TELEMETRY_DATA -#undef SCRIPTS_DATA -#undef CUSTOM_SCREENS_DATA -#undef SPLASH_MODE -#undef EXTRA_GENERAL_FIELDS -#undef THEME_DATA -#undef NOBACKUP - +#include "datastructs_private.h" #if !defined(BACKUP) /* Compile time check to test structure size has not changed * diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h new file mode 100644 index 000000000..88efd2731 --- /dev/null +++ b/radio/src/datastructs_private.h @@ -0,0 +1,923 @@ +/* + * 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. + */ + +// No include guards here, this file may be included many times in different namespaces +// i.e. BACKUP RAM Backup/Restore functions + +#include +#include "board.h" +#include "dataconstants.h" +#include "definitions.h" +#include "opentx_types.h" +#include "globals.h" + +#if defined(PCBTARANIS) + #define N_TARANIS_FIELD(x) + #define TARANIS_FIELD(x) x; +#else + #define N_TARANIS_FIELD(x) x; + #define TARANIS_FIELD(x) +#endif + +#if defined(PCBX9E) + #define TARANIS_PCBX9E_FIELD(x) x; +#else + #define TARANIS_PCBX9E_FIELD(x) +#endif + +#if defined(PCBHORUS) + #define N_HORUS_FIELD(x) + #define HORUS_FIELD(x) x; +#else + #define N_HORUS_FIELD(x) x; + #define HORUS_FIELD(x) +#endif + +#if defined(BACKUP) + #define NOBACKUP(...) +#else + #define NOBACKUP(...) __VA_ARGS__ +#endif + +#include "storage/yaml/yaml_defs.h" + +/* + * Mixer structure + */ + +PACK(struct CurveRef { + uint8_t type; + int8_t value; +}); + +PACK(struct MixData { + int16_t weight:11 CUST(in_read_weight,in_write_weight); // GV1=-1024, -GV1=1023 + uint16_t destCh:5; + uint16_t srcRaw:10 CUST(r_mixSrcRaw,w_mixSrcRaw); // srcRaw=0 means not used + uint16_t carryTrim:1; + uint16_t mixWarn:2; // mixer warning + uint16_t mltpx:2 ENUM(MixerMultiplex); + uint16_t spare:1 SKIP; + int32_t offset:14; + int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); + uint32_t flightModes:9 CUST(r_flightModes, w_flightModes); + CurveRef curve; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + NOBACKUP(char name[LEN_EXPOMIX_NAME]); +}); + +/* + * Expo/Input structure + */ + +PACK(struct ExpoData { + uint16_t mode:2; + uint16_t scale:14; + uint16_t srcRaw:10 ENUM(MixSources) CUST(r_mixSrcRaw,w_mixSrcRaw); + int16_t carryTrim:6; + uint32_t chn:5; + int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); + uint32_t flightModes:9 CUST(r_flightModes, w_flightModes); + int32_t weight:8 CUST(in_read_weight,in_write_weight); + int32_t spare:1 SKIP; + NOBACKUP(char name[LEN_EXPOMIX_NAME]); + int8_t offset; + CurveRef curve; +}); + +/* + * Limit structure + */ + +PACK(struct LimitData { + int32_t min:11; + int32_t max:11; + int32_t ppmCenter:10; // TODO can be reduced to 8 bits + int16_t offset:11; + uint16_t symetrical:1; + uint16_t revert:1; + uint16_t spare:3 SKIP; + int8_t curve; + NOBACKUP(char name[LEN_CHANNEL_NAME]); +}); + +/* + * LogicalSwitch structure + */ + +PACK(struct LogicalSwitchData { + uint8_t func ENUM(LogicalSwitchesFunctions); + CUST_ATTR(def,r_logicSw,w_logicSw); + int32_t v1:10 SKIP; + int32_t v3:10 SKIP; + int32_t andsw:9 CUST(r_swtchSrc,w_swtchSrc); // TODO rename to xswtch + uint32_t andswtype:1 SKIP; // TODO rename to xswtchType (AND / OR) + uint32_t spare:2 SKIP; // anything else needed? + int16_t v2 SKIP; + uint8_t delay; + uint8_t duration; +}); + +/* + * SpecialFunction structure + */ + + +#if defined(PCBTARANIS) + #define CFN_SPARE_TYPE int32_t +#else + #define CFN_SPARE_TYPE int16_t +#endif + +PACK(struct CustomFunctionData { + int16_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); + uint16_t func:7 ENUM(Functions); + CUST_ATTR(def,r_customFn,w_customFn); + PACK(union { + NOBACKUP(PACK(struct { + char name[LEN_FUNCTION_NAME]; + }) play); + + PACK(struct { + int16_t val; + uint8_t mode; + uint8_t param; + NOBACKUP(CFN_SPARE_TYPE spare); + }) all; + + NOBACKUP(PACK(struct { + int32_t val1; + NOBACKUP(CFN_SPARE_TYPE val2); + }) clear); + }) NAME(fp) SKIP; + uint8_t active SKIP; + + bool isEmpty() const + { + return swtch == 0; + } +}); + +/* + * FlightMode structure + */ + +PACK(struct trim_t { + int16_t value:11; + uint16_t mode:5; +}); + +PACK(struct FlightModeData { + trim_t trim[NUM_TRIMS]; + NOBACKUP(char name[LEN_FLIGHT_MODE_NAME]); + int16_t swtch:9 ENUM(SwitchSources) CUST(r_swtchSrc,w_swtchSrc); // swtch of phase[0] is not used + int16_t spare:7 SKIP; + uint8_t fadeIn; + uint8_t fadeOut; + gvar_t gvars[MAX_GVARS] FUNC(gvar_is_active); +}); + +/* + * Curve structure + */ + +PACK(struct CurveHeader { + uint8_t type:1; + uint8_t smooth:1; + int8_t points:6; // describes number of points - 5 + NOBACKUP(char name[LEN_CURVE_NAME]); +}); + +/* + * GVar structure + */ + +PACK(struct GVarData { + NOBACKUP(char name[LEN_GVAR_NAME]); + uint32_t min:12; + uint32_t max:12; + uint32_t popup:1; + uint32_t prec:1; + uint32_t unit:2; + uint32_t spare:4 SKIP; +}); + +/* + * Timer structure + */ + +PACK(struct TimerData { + uint32_t start:22; + int32_t swtch:10 CUST(r_swtchSrc,w_swtchSrc); + int32_t value:22; + uint32_t mode:3 ENUM(TimerModes); + uint32_t countdownBeep:2; + uint32_t minuteBeep:1; + uint32_t persistent:2; + int32_t countdownStart:2; + NOBACKUP(char name[LEN_TIMER_NAME]); +}); + +/* + * Swash Ring structure + */ + +PACK(struct SwashRingData { + uint8_t type ENUM(SwashType); + uint8_t value; + uint8_t collectiveSource CUST(r_mixSrcRaw,w_mixSrcRaw); + uint8_t aileronSource CUST(r_mixSrcRaw,w_mixSrcRaw); + uint8_t elevatorSource CUST(r_mixSrcRaw,w_mixSrcRaw); + int8_t collectiveWeight; + int8_t aileronWeight; + int8_t elevatorWeight; +}); + +#if MAX_SCRIPTS > 0 +union ScriptDataInput { + int16_t value; + source_t source CUST(r_mixSrcRaw,w_mixSrcRaw); +} FUNC(select_script_input); + +PACK(struct ScriptData { + char file[LEN_SCRIPT_FILENAME]; + char name[LEN_SCRIPT_NAME]; + ScriptDataInput inputs[MAX_SCRIPT_INPUTS]; +}); +#endif + +/* + * Frsky Telemetry structure + */ +PACK(struct RssiAlarmData { + int8_t disabled:1; +#if defined (PCBNV14) + uint8_t flysky_telemetry:1; // if set for FlySky receivers use native RSSI values instead of rescaled ones +#else + int8_t spare:1 SKIP; +#endif + int8_t warning:6; + int8_t spare2:2 SKIP; + int8_t critical:6; + inline int8_t getWarningRssi() {return 45 + warning;} + inline int8_t getCriticalRssi() {return 42 + critical;} + }); + +typedef int16_t ls_telemetry_value_t; + +#if !defined(COLORLCD) +PACK(struct FrSkyBarData { + source_t source CUST(r_mixSrcRaw,w_mixSrcRaw); + ls_telemetry_value_t barMin; // minimum for bar display + ls_telemetry_value_t barMax; // ditto for max display (would usually = ratio) +}); + +// This is used to be able to use +// custom read/write functions in +// an array made of typdef'ed literal types +// (YAML generator) +#if defined(YAML_GENERATOR) +PACK(struct LineDataSource { + source_t val CUST(r_mixSrcRaw,w_mixSrcRaw); +}); +PACK(struct FrSkyLineData { + LineDataSource sources[NUM_LINE_ITEMS]; +}); +#else +// This here is the real structure used at run-time +PACK(struct FrSkyLineData { + source_t sources[NUM_LINE_ITEMS]; +}); +#endif + +#if defined(PCBTARANIS) +PACK(struct TelemetryScriptData { + char file[LEN_SCRIPT_FILENAME]; + int16_t inputs[MAX_TELEM_SCRIPT_INPUTS]; +}); +#endif + +#if defined(YAML_GENERATOR) +union TelemetryScreenData_u { + FrSkyBarData bars[4]; + FrSkyLineData lines[4]; +#if defined(PCBTARANIS) + TelemetryScriptData script; +#endif +}; +PACK(struct TelemetryScreenData { + CUST_ATTR(type,r_tele_screen_type,w_tele_screen_type); + TelemetryScreenData_u u FUNC(select_tele_screen_data); +}); +#else +union TelemetryScreenData { + FrSkyBarData bars[4]; + FrSkyLineData lines[4]; +#if defined(PCBTARANIS) + TelemetryScriptData script; +#endif +} FUNC(select_tele_screen_data); +#endif + +#endif + +PACK(struct VarioData { + uint8_t source:7 CUST(r_tele_sensor,w_tele_sensor); // telemetry sensor idx + 1 + uint8_t centerSilent:1; + int8_t centerMax; + int8_t centerMin; + int8_t min; + int8_t max; +}); + +/* + * Telemetry Sensor structure + */ + +#define TELEMETRY_ENDPOINT_NONE 0xFF +#define TELEMETRY_ENDPOINT_SPORT 0x07 + +PACK(struct TelemetrySensor { + union { + uint16_t id; // data identifier, for FrSky we can reuse existing ones. + // Source unit is derived from type. + NOBACKUP(uint16_t persistentValue); + } NAME(id1) FUNC(select_id1); + union { + NOBACKUP(PACK(struct { + uint8_t physID:5; + uint8_t rxIndex:3; // 1 bit for module index, 2 bits for receiver index + }) frskyInstance); + uint8_t instance; + NOBACKUP(uint8_t formula ENUM(TelemetrySensorFormula)); + } NAME(id2) FUNC(select_id2); + NOBACKUP(char label[TELEM_LABEL_LEN]); // user defined label + uint8_t subId; + uint8_t type:1 ENUM(TelemetrySensorType); // 0=custom / 1=calculated + // user can choose what unit to display each value in + uint8_t spare1:1 SKIP; + uint8_t unit:6; + uint8_t prec:2; + uint8_t autoOffset:1; + uint8_t filter:1; + uint8_t logs:1; + uint8_t persistent:1; + uint8_t onlyPositive:1; + uint8_t spare2:1 SKIP; + union { + NOBACKUP(PACK(struct { + uint16_t ratio; + int16_t offset; + }) custom); + NOBACKUP(PACK(struct { + uint8_t source; + uint8_t index; + uint16_t spare SKIP; + }) cell); + NOBACKUP(PACK(struct { + int8_t sources[4]; + }) calc); + NOBACKUP(PACK(struct { + uint8_t source; + uint8_t spare[3] SKIP; + }) consumption); + NOBACKUP(PACK(struct { + uint8_t gps; + uint8_t alt; + uint16_t spare SKIP; + }) dist); + uint32_t param; + } NAME(cfg) FUNC(select_sensor_cfg); + NOBACKUP( + void init(const char *label, uint8_t unit=UNIT_RAW, uint8_t prec=0); + void init(uint16_t id); + bool isAvailable() const; + int32_t getValue(int32_t value, uint8_t unit, uint8_t prec) const; + bool isConfigurable() const; + bool isPrecConfigurable() const; + int32_t getPrecMultiplier() const; + int32_t getPrecDivisor() const; + bool isSameInstance(TelemetryProtocol protocol, uint8_t instance); + ); +}); + +/* + * Trainer module structure + */ + +PACK(struct TrainerModuleData { + uint8_t mode CUST(r_trainerMode,w_trainerMode); + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + int8_t frameLength; + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t spare2:1 SKIP; +}); + +/* + * Module structure + */ + +// Only used in case switch and if statements as "virtual" protocol +#define MM_RF_CUSTOM_SELECTED 0xff +#define MULTI_MAX_PROTOCOLS 127 // rfProtocol:4 + rfProtocolExtra:3 +PACK(struct ModuleData { + uint8_t type:4 ENUM(ModuleType); + // TODO some refactoring is needed, rfProtocol is only used by DSM2 and MULTI, it could be merged with subType + int8_t rfProtocol:4; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + + union { + uint8_t raw[PXX2_MAX_RECEIVERS_PER_MODULE * PXX2_LEN_RX_NAME + 1]; + NOBACKUP(struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm); + NOBACKUP(struct { + uint8_t rfProtocolExtra:3; + uint8_t disableTelemetry:1; + uint8_t disableMapping:1; + uint8_t customProto:1; + uint8_t autoBindMode:1; + uint8_t lowPowerMode:1; + int8_t optionValue; + uint8_t receiverTelemetryOff:1; + uint8_t receiverHigherChannels:1; + uint8_t spare:6 SKIP; + } multi); + NOBACKUP(struct { + uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W + uint8_t spare1:2 SKIP; + uint8_t receiverTelemetryOff:1; // false = receiver telem enabled + uint8_t receiverHigherChannels:1; // false = pwm out 1-8, true 9-16 + int8_t antennaMode:2; + uint8_t spare2 SKIP; + } pxx); + NOBACKUP(struct { + uint8_t spare1:6 SKIP; + uint8_t noninverted:1; + uint8_t spare2:1 SKIP; + int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms) + } sbus); + NOBACKUP(struct { + uint8_t receivers:7; // 4 bits spare + uint8_t racingMode:1; + char receiverName[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; + } pxx2); + NOBACKUP(struct { + uint8_t rx_id[4]; + uint8_t mode:3; + uint8_t rfPower:1; + uint8_t reserved:4; + uint8_t rx_freq[2]; + + void setDefault() { + rx_id[0] = rx_id[1] = rx_id[2] = rx_id[3] = 0; + mode = 3; + rfPower = 0; + rx_freq[0] = 50; + rx_freq[1] = 0; + } + } flysky); + NOBACKUP(PACK(struct { + uint8_t bindPower:3; + uint8_t runPower:3; + uint8_t emi:1; + uint8_t telemetry:1; + uint16_t failsafeTimeout; + uint8_t rx_freq[2]; + uint8_t mode:2; + uint8_t reserved:6; + uint16_t rxFreq() + { + return (uint16_t)rx_freq[0] | (((uint16_t)rx_freq[1]) << 8); + } + + void setRxFreq(uint16_t value) + { + rx_freq[0] = value & 0xFF; + rx_freq[1] = value >> 8; + } + } afhds3)); + } NAME(mod) FUNC(select_mod_type); + + // Helper functions to set both of the rfProto protocol at the same time + NOBACKUP(inline uint8_t getMultiProtocol() const + { + return ((uint8_t) (rfProtocol & 0x0F)) + (multi.rfProtocolExtra << 4); + }) + + NOBACKUP(inline void setMultiProtocol(uint8_t proto) + { + rfProtocol = (uint8_t) (proto & 0x0F); + multi.rfProtocolExtra = (proto & 0x70) >> 4; + }) + + NOBACKUP(inline uint8_t getChannelsCount() const + { + return channelsCount + 8; + }) +}); + +/* + * Model structure + */ + +#if LEN_BITMAP_NAME > 0 +#define MODEL_HEADER_BITMAP_FIELD NOBACKUP(char bitmap[LEN_BITMAP_NAME]); +#else +#define MODEL_HEADER_BITMAP_FIELD +#endif + + +PACK(struct ModelHeader { + char name[LEN_MODEL_NAME]; // must be first for eeLoadModelName + uint8_t modelId[NUM_MODULES]; + MODEL_HEADER_BITMAP_FIELD +}); + +#if defined(COLORLCD) +typedef uint32_t swconfig_t; +typedef uint32_t swarnstate_t; +#elif defined(PCBX9E) +typedef uint64_t swconfig_t; +typedef uint64_t swarnstate_t; +typedef uint32_t swarnenable_t; +#elif defined(PCBX9D) || defined(PCBX9DP) +typedef uint32_t swconfig_t; +typedef uint32_t swarnstate_t; +typedef uint16_t swarnenable_t; // TODO remove it in 2.4 +#elif defined(PCBTARANIS) +typedef uint16_t swconfig_t; +typedef uint16_t swarnstate_t; +typedef uint8_t swarnenable_t; // TODO remove it in 2.4 +#else +typedef uint8_t swarnstate_t; +typedef uint8_t swarnenable_t; +#endif + +#if defined(COLORLCD) + #define SWITCHES_WARNING_DATA \ + NOBACKUP(swarnstate_t switchWarningState CUST(r_swtchWarn,w_swtchWarn)); +#else + #define SWITCHES_WARNING_DATA \ + swarnstate_t switchWarningState CUST(r_swtchWarn,w_swtchWarn); \ + swarnenable_t switchWarningEnable; // TODO remove it in 2.4 +#endif + +#if defined(COLORLCD) && defined(BACKUP) +#define CUSTOM_SCREENS_DATA +#elif defined(COLORLCD) +#include "gui/colorlcd/layout.h" +#include "gui/colorlcd/topbar.h" +#define LAYOUT_ID_LEN 10 +PACK(struct CustomScreenData { + char LayoutId[LAYOUT_ID_LEN]; + LayoutPersistentData layoutData; +}); +#define CUSTOM_SCREENS_DATA \ + NOBACKUP(CustomScreenData screenData[MAX_CUSTOM_SCREENS]); \ + NOBACKUP(TopBarPersistentData topbarData); \ + NOBACKUP(uint8_t view); +#else +#define CUSTOM_SCREENS_DATA \ + uint8_t screensType SKIP; /* 2bits per screen (None/Gauges/Numbers/Script) */ \ + TelemetryScreenData screens[MAX_TELEMETRY_SCREENS]; \ + uint8_t view; +#endif + +#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) + // telemetry sensor idx + 1 + #define TOPBAR_DATA \ + NOBACKUP(uint8_t voltsSource CUST(r_tele_sensor,w_tele_sensor)); \ + NOBACKUP(uint8_t altitudeSource CUST(r_tele_sensor,w_tele_sensor)); +#else + #define TOPBAR_DATA +#endif + +#if defined(PCBHORUS) || defined(PCBTARANIS) || defined(PCBNV14) + #define SCRIPT_DATA \ + NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); +#else + #define SCRIPT_DATA +#endif + +PACK(struct PartialModel { + ModelHeader header; + TimerData timers[MAX_TIMERS]; +}); + +PACK(struct ModelData { + ModelHeader header; + TimerData timers[MAX_TIMERS]; + uint8_t telemetryProtocol:3; + uint8_t thrTrim:1; // Enable Throttle Trim + uint8_t noGlobalFunctions:1; + uint8_t displayTrims:2; + uint8_t ignoreSensorIds:1; + int8_t trimInc:3; // Trim Increments + uint8_t disableThrottleWarning:1; + uint8_t displayChecklist:1; + uint8_t extendedLimits:1; + uint8_t extendedTrims:1; + uint8_t throttleReversed:1; + BeepANACenter beepANACenter; + MixData mixData[MAX_MIXERS] NO_IDX; + LimitData limitData[MAX_OUTPUT_CHANNELS]; + ExpoData expoData[MAX_EXPOS] NO_IDX; + + CurveHeader curves[MAX_CURVES]; + int8_t points[MAX_CURVE_POINTS]; + + LogicalSwitchData logicalSw[MAX_LOGICAL_SWITCHES]; + CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS] FUNC(cfn_is_active); + SwashRingData swashR FUNC(swash_is_active); + FlightModeData flightModeData[MAX_FLIGHT_MODES] FUNC(fmd_is_active); + + NOBACKUP(uint8_t thrTraceSrc); + + SWITCHES_WARNING_DATA + + GVarData gvars[MAX_GVARS]; + + NOBACKUP(VarioData varioData); + NOBACKUP(uint8_t rssiSource CUST(r_tele_sensor,w_tele_sensor)); + + TOPBAR_DATA + + NOBACKUP(RssiAlarmData rssiAlarms); + + uint8_t spare1:3 SKIP; + uint8_t thrTrimSw:3; + uint8_t potsWarnMode:2; + + ModuleData moduleData[NUM_MODULES]; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + TrainerModuleData trainerData; + + SCRIPT_DATA + + NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); + NOBACKUP(uint8_t potsWarnEnabled); + NOBACKUP(int8_t potsWarnPosition[STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS]); + + NOBACKUP(TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS];) + + TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) + + CUSTOM_SCREENS_DATA + + char modelRegistrationID[PXX2_LEN_REGISTRATION_ID]; + + bool isTrainerTraineeEnable() const + { +#if defined(PCBNV14) + return trainerData.mode >= TRAINER_MODE_MASTER_TRAINER_JACK; +#else + return true; +#endif + } + + uint8_t getThrottleStickTrimSource() const + { + // The order here is TERA, so that 0 (default) means Throttle + switch (thrTrimSw) { + case 0: + return MIXSRC_TrimThr; + case 2: + return MIXSRC_TrimRud; + default: + return thrTrimSw + MIXSRC_FIRST_TRIM; + } + } + + void setThrottleStickTrimSource(int16_t src) + { + // The order here is TERA, so that 0 (default) means Throttle + switch (src) { + case MIXSRC_TrimThr: + thrTrimSw = 0; + break; + case MIXSRC_TrimRud: + thrTrimSw = 2; + break; + default: + thrTrimSw = src - MIXSRC_FIRST_TRIM; + break; + } + } +}); + +/* + * Radio structure + */ + +#if XPOTS_MULTIPOS_COUNT > 0 +PACK(struct StepsCalibData { + uint8_t count; + uint8_t steps[XPOTS_MULTIPOS_COUNT-1]; +}); +#endif + +PACK(struct CalibData { + int16_t mid; + int16_t spanNeg; + int16_t spanPos; +}); + +PACK(struct TrainerMix { + uint8_t srcChn:6; // 0-7 = ch1-8 + uint8_t mode:2 ENUM(TrainerMultiplex); // off,add-mode,subst-mode + int8_t studWeight; +}); + +PACK(struct TrainerData { + int16_t calib[4]; + NOBACKUP(TrainerMix mix[4]); +}); + +#if defined(COLORLCD) + #define SPLASH_MODE uint8_t splashSpares:3 SKIP +#else + #define SPLASH_MODE int8_t splashMode:3 +#endif + +#if defined(PCBXLITES) + #define GYRO_FIELDS \ + int8_t gyroMax; \ + int8_t gyroOffset; +#else + #define GYRO_FIELDS +#endif + +#if defined(PCBHORUS) || defined(PCBNV14) + #define EXTRA_GENERAL_FIELDS \ + NOBACKUP(uint8_t auxSerialMode:4 ENUM(UartModes)); \ + NOBACKUP(uint8_t aux2SerialMode:4 ENUM(UartModes)); \ + CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ + swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ + uint16_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */ \ + uint8_t slidersConfig ARRAY(1,struct_sliderConfig,nullptr); /* 1 bit per slider */ \ + NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP); \ + NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP); \ + NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \ + NOBACKUP(uint8_t spare5:1 SKIP); \ + NOBACKUP(uint8_t blOffBright:7); \ + NOBACKUP(char bluetoothName[LEN_BLUETOOTH_NAME]); +#elif defined(PCBTARANIS) + #if defined(STORAGE_BLUETOOTH) + #define BLUETOOTH_FIELDS \ + uint8_t spare5 SKIP; \ + char bluetoothName[LEN_BLUETOOTH_NAME]; + #else + #define BLUETOOTH_FIELDS + #endif + #define EXTRA_GENERAL_FIELDS \ + uint8_t auxSerialMode:4 ENUM(UartModes); \ + uint8_t slidersConfig:4 ARRAY(1,struct_sliderConfig,nullptr); \ + uint8_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */\ + uint8_t backlightColor; \ + swarnstate_t switchUnlockStates; \ + CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ + swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ + char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP; \ + char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP; \ + BLUETOOTH_FIELDS +#else + #define EXTRA_GENERAL_FIELDS +#endif + +#if defined(COLORLCD) && !defined(BACKUP) + #include "theme.h" + #define THEME_NAME_LEN 8 + #define THEME_DATA \ + NOBACKUP(char themeName[THEME_NAME_LEN]); \ + NOBACKUP(OpenTxTheme::PersistentData themeData); +#else + #define THEME_DATA +#endif + +#if defined(BUZZER) + #define BUZZER_FIELD int8_t buzzerMode:2 // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) +#else + #define BUZZER_FIELD int8_t spare4:2 SKIP +#endif + +PACK(struct RadioData { + + // Real attributes + NOBACKUP(uint8_t version); + NOBACKUP(uint16_t variant SKIP); + CalibData calib[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS]; + NOBACKUP(uint16_t chkSum SKIP); + N_HORUS_FIELD(int8_t currModel); + N_HORUS_FIELD(uint8_t contrast); + NOBACKUP(uint8_t vBatWarn); + NOBACKUP(int8_t txVoltageCalibration); + uint8_t backlightMode:3 ENUM(BacklightMode); + int8_t antennaMode:2 ENUM(AntennaModes); + uint8_t disableRtcWarning:1; + uint8_t keysBacklight:1; + int8_t spare1:1 SKIP; + NOBACKUP(TrainerData trainer); + NOBACKUP(uint8_t view); // index of view in main screen + NOBACKUP(BUZZER_FIELD); /* 2bits */ + NOBACKUP(uint8_t fai:1); + NOBACKUP(int8_t beepMode:2 ENUM(BeeperMode) CUST(r_beeperMode,w_beeperMode)); + NOBACKUP(uint8_t alarmsFlash:1); + NOBACKUP(uint8_t disableMemoryWarning:1); + NOBACKUP(uint8_t disableAlarmWarning:1); + uint8_t stickMode:2; + int8_t timezone:5; + uint8_t adjustRTC:1; + NOBACKUP(uint8_t inactivityTimer); + uint8_t telemetryBaudrate:3; + SPLASH_MODE; /* 3bits */ + int8_t hapticMode:2 CUST(r_beeperMode,w_beeperMode); + int8_t switchesDelay; + NOBACKUP(uint8_t lightAutoOff); + NOBACKUP(uint8_t templateSetup); // RETA order for receiver channels + NOBACKUP(int8_t PPM_Multiplier); + NOBACKUP(int8_t hapticLength CUST(r_5pos,w_5pos)); + N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t spare2 SKIP)); + N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse)); + NOBACKUP(int8_t beepLength:3 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t hapticStrength:3 CUST(r_5pos,w_5pos)); + NOBACKUP(uint8_t gpsFormat:1); + NOBACKUP(uint8_t unexpectedShutdown:1); + NOBACKUP(uint8_t speakerPitch CUST(r_spPitch,w_spPitch)); + NOBACKUP(int8_t speakerVolume CUST(r_vol,w_vol)); + NOBACKUP(int8_t vBatMin CUST(r_vbat_min,w_vbat_min)); + NOBACKUP(int8_t vBatMax CUST(r_vbat_max,w_vbat_max)); + + NOBACKUP(uint8_t backlightBright); + NOBACKUP(uint32_t globalTimer); + NOBACKUP(uint8_t bluetoothBaudrate:4); + NOBACKUP(uint8_t bluetoothMode:4 ENUM(BluetoothModes)); + NOBACKUP(uint8_t countryCode:2); + NOBACKUP(int8_t pwrOnSpeed:3); + NOBACKUP(int8_t pwrOffSpeed:3); + NOBACKUP(uint8_t imperial:1); + NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */ + NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); + NOBACKUP(uint8_t USBMode:2); + NOBACKUP(uint8_t jackMode:2); + NOBACKUP(uint8_t sportUpdatePower:1 SKIP); + NOBACKUP(char ttsLanguage[2]); + NOBACKUP(int8_t beepVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t wavVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t varioVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t backgroundVolume:4 CUST(r_5pos,w_5pos)); + NOBACKUP(int8_t varioPitch CUST(r_vPitch,w_vPitch)); + NOBACKUP(int8_t varioRange CUST(r_vPitch,w_vPitch)); + NOBACKUP(int8_t varioRepeat); + CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS] FUNC(cfn_is_active); + + EXTRA_GENERAL_FIELDS + + THEME_DATA + + char ownerRegistrationID[PXX2_LEN_REGISTRATION_ID]; + + GYRO_FIELDS + + NOBACKUP(int8_t uartSampleMode:2); // See UartSampleModes +}); + +#undef SWITCHES_WARNING_DATA +#undef MODEL_GVARS_DATA +#undef TELEMETRY_DATA +#undef SCRIPTS_DATA +#undef CUSTOM_SCREENS_DATA +#undef SPLASH_MODE +#undef EXTRA_GENERAL_FIELDS +#undef THEME_DATA +#undef NOBACKUP diff --git a/radio/src/storage/rtc_backup.cpp b/radio/src/storage/rtc_backup.cpp index de4050cd5..decfb8eaa 100644 --- a/radio/src/storage/rtc_backup.cpp +++ b/radio/src/storage/rtc_backup.cpp @@ -24,7 +24,7 @@ namespace Backup { #define BACKUP -#include "datastructs.h" +#include "datastructs_private.h" PACK(struct RamBackupUncompressed { ModelData model; RadioData radio; @@ -47,8 +47,13 @@ void rambackupWrite() { copyRadioData(&ramBackupUncompressed.radio, &g_eeGeneral); copyModelData(&ramBackupUncompressed.model, &g_model); - ramBackup->size = compress(ramBackup->data, sizeof(ramBackup->data), (const uint8_t *)&ramBackupUncompressed, sizeof(ramBackupUncompressed)); - TRACE("RamBackupWrite sdsize=%d backupsize=%d rlcsize=%d", sizeof(ModelData)+sizeof(RadioData), sizeof(Backup::RamBackupUncompressed), ramBackup->size); + ramBackup->size = compress(ramBackup->data, sizeof(ramBackup->data), + (const uint8_t *)&ramBackupUncompressed, + sizeof(ramBackupUncompressed)); + + TRACE("RamBackupWrite sdsize=%d backupsize=%d rlcsize=%d", + sizeof(ModelData) + sizeof(RadioData), + sizeof(Backup::RamBackupUncompressed), ramBackup->size); } bool rambackupRestore() diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index a99063b70..3f8996207 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -382,7 +382,7 @@ if(PYTHONINTERP_FOUND) add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp WORKING_DIRECTORY ${RADIO_DIRECTORY}/src - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBHORUS -DPCBX10 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Igui/colorlcd -Itargets/horus -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/libopenui/src -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Include ${gcc_include_path} -Wno-pragma-once-outside-header ${SYSROOT_ARG} > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp + COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs_private.h -DPCBHORUS -DPCBX10 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Igui/colorlcd -Itargets/horus -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/libopenui/src -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Include ${gcc_include_path} -Wno-pragma-once-outside-header ${SYSROOT_ARG} > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/util/generate_datacopy.py ) diff --git a/radio/src/targets/nv14/CMakeLists.txt b/radio/src/targets/nv14/CMakeLists.txt index 4c98eb169..20aba96ca 100644 --- a/radio/src/targets/nv14/CMakeLists.txt +++ b/radio/src/targets/nv14/CMakeLists.txt @@ -218,7 +218,7 @@ if(PYTHONINTERP_FOUND) add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp WORKING_DIRECTORY ${RADIO_DIRECTORY}/src - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBFLYSKY -DPCBNV14 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Igui/colorlcd -Itargets/nv14 -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/libopenui/src -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Include ${gcc_include_path} -Wno-pragma-once-outside-header ${SYSROOT_ARG} > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp + COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs_private.h -DPCBFLYSKY -DPCBNV14 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Igui/colorlcd -Itargets/nv14 -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/libopenui/src -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Include ${gcc_include_path} -Wno-pragma-once-outside-header ${SYSROOT_ARG} > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/util/generate_datacopy.py ) diff --git a/radio/src/tests/eeprom.cpp b/radio/src/tests/eeprom.cpp index 1cd36ff83..bdc6736a3 100644 --- a/radio/src/tests/eeprom.cpp +++ b/radio/src/tests/eeprom.cpp @@ -27,7 +27,7 @@ extern const char * eepromFile; #include "storage/rtc_backup.h" namespace Backup { #define BACKUP -#include "datastructs.h" +#include "datastructs_private.h" PACK(struct RamBackupUncompressed { ModelData model; RadioData radio; From e7519b6cce15e88c22cf9454312017c7e759ea9e Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 28 Oct 2021 06:56:02 +0200 Subject: [PATCH 086/110] Extended widgetName to fill up alignment hole widgetData is aligned on 32bit address, so that its offset was calculated wrong. --- radio/src/gui/colorlcd/widgets_container.h | 2 +- radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp | 2 +- radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp | 2 +- radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp | 2 +- radio/src/storage/yaml/yaml_datastructs_nv14.cpp | 2 +- radio/src/storage/yaml/yaml_datastructs_x10.cpp | 2 +- radio/src/storage/yaml/yaml_datastructs_x12s.cpp | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/colorlcd/widgets_container.h b/radio/src/gui/colorlcd/widgets_container.h index 56b1f854e..411c8fbcf 100644 --- a/radio/src/gui/colorlcd/widgets_container.h +++ b/radio/src/gui/colorlcd/widgets_container.h @@ -27,7 +27,7 @@ #include "form.h" #include "zone.h" -#define WIDGET_NAME_LEN 10 +#define WIDGET_NAME_LEN 12 #define MAX_WIDGET_OPTIONS 5 // Name? #if LCD_W > LCD_H diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index cd04f3422..1f3f289db 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -786,7 +786,7 @@ static const struct YamlNode struct_WidgetPersistentData[] = { }; static const struct YamlNode struct_ZonePersistentData[] = { YAML_IDX, - YAML_STRING("widgetName", 10), + YAML_STRING("widgetName", 12), YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 92980839e..69c229f8f 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -803,7 +803,7 @@ static const struct YamlNode struct_WidgetPersistentData[] = { }; static const struct YamlNode struct_ZonePersistentData[] = { YAML_IDX, - YAML_STRING("widgetName", 10), + YAML_STRING("widgetName", 12), YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 21d8ccd95..2269671f5 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -803,7 +803,7 @@ static const struct YamlNode struct_WidgetPersistentData[] = { }; static const struct YamlNode struct_ZonePersistentData[] = { YAML_IDX, - YAML_STRING("widgetName", 10), + YAML_STRING("widgetName", 12), YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index cd04f3422..1f3f289db 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -786,7 +786,7 @@ static const struct YamlNode struct_WidgetPersistentData[] = { }; static const struct YamlNode struct_ZonePersistentData[] = { YAML_IDX, - YAML_STRING("widgetName", 10), + YAML_STRING("widgetName", 12), YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 92980839e..69c229f8f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -803,7 +803,7 @@ static const struct YamlNode struct_WidgetPersistentData[] = { }; static const struct YamlNode struct_ZonePersistentData[] = { YAML_IDX, - YAML_STRING("widgetName", 10), + YAML_STRING("widgetName", 12), YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 21d8ccd95..2269671f5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -803,7 +803,7 @@ static const struct YamlNode struct_WidgetPersistentData[] = { }; static const struct YamlNode struct_ZonePersistentData[] = { YAML_IDX, - YAML_STRING("widgetName", 10), + YAML_STRING("widgetName", 12), YAML_STRUCT("widgetData", 480, struct_WidgetPersistentData, NULL), YAML_END }; From cc0af825068936ab06da19abb94525ddfcec3e65 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 28 Oct 2021 06:59:12 +0200 Subject: [PATCH 087/110] Added draft conversion test for TX16S --- radio/src/tests/CMakeLists.txt | 2 +- radio/src/tests/conversions.cpp | 23 +++++++++++++++++++++++ radio/src/tests/model_25_tx16s.otx | Bin 0 -> 846 bytes 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 radio/src/tests/model_25_tx16s.otx diff --git a/radio/src/tests/CMakeLists.txt b/radio/src/tests/CMakeLists.txt index 099d96150..4417696c3 100644 --- a/radio/src/tests/CMakeLists.txt +++ b/radio/src/tests/CMakeLists.txt @@ -15,7 +15,7 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) if(PCB STREQUAL X12S OR PCB STREQUAL X10) - set(EXTRACT_MODEL_FILES model_23_x12s model_23_x10) + set(EXTRACT_MODEL_FILES model_23_x12s model_23_x10 model_25_tx16s) foreach(model_file ${EXTRACT_MODEL_FILES}) add_custom_command( diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 265b289e3..9764aad43 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -393,3 +393,26 @@ TEST(Conversions, ConversionX12SFrom23) } #endif +#if defined(RADIO_TX16S) +TEST(Conversions, ConversionTX16SFrom25) +{ + simuFatfsSetPaths(TESTS_BUILD_PATH "/model_25_tx16s/", TESTS_BUILD_PATH "/model_25_tx16s/"); + + convertRadioData_219_to_220("/RADIO/radio.bin"); + convertRadioData_220_to_221("/RADIO/radio.bin"); + EXPECT_EQ(nullptr, loadRadioSettingsYaml()); + + char modelname[] = "model1.bin"; + convertBinModelData(modelname, 220); + loadModel(modelname); + + EXPECT_EQ(220, g_eeGeneral.version); // TODO: 221? + EXPECT_EQ(-23, g_eeGeneral.vBatMin); + EXPECT_EQ(0, g_eeGeneral.speakerVolume); + EXPECT_STRNEQ("en", g_eeGeneral.ttsLanguage); + EXPECT_STRNEQ("model1.yml", g_eeGeneral.currModelFilename); + + EXPECT_STRNEQ("Model", g_model.header.name); +} +#endif + diff --git a/radio/src/tests/model_25_tx16s.otx b/radio/src/tests/model_25_tx16s.otx new file mode 100644 index 0000000000000000000000000000000000000000..88468cee716ab1acb8b48d3c3345a84bda41b32f GIT binary patch literal 846 zcmWIWW@Zs#U|`^22y2fH7H2>5To}j$i3l*rFa$Zec>3$-=BK3Q6zi2#l!S(GGBB%T zRwk+eacKoN10%~gQ5JofmwEoHsJ09OYR@2_t_TYcLI$N5=a?7QLOEs4& zvYvR7l#n3A%Dr#T*#ZuwxwDolICyXGX`0CRFWlI`Ln%nsRl(d|)%19PzNRt1)`G?f z#lD{YyqyiVe#$GJ`!j*38_Ai8Kxf*mou2U=6b9N141z#s`ue-L`UFD)!4U3HQ=lV3 z7|o$?Z~A8+GLSg_QT-nyEB~g+`UhsK+g66&aGasxyzKVc3r$W-9|_&K*Y@5uzBfPV z4Qt7@$`fL(k=%Sg>%2}*miL?$t=Rb`y88BdlV20%TPA77PnkWnC@<{n?#Q(h-lj1y zSe!WReQ66{>{f2IllrIm=Ba)+mUtfrbSVSFgf^`|brQ3aa`Hp<=g(`XUtrAr)Q%^` zB=*$ekL&l!GKg1xxTm~0`tY(h>jQUvKDt!9FYR+e=GVK?llMzX>^1mR8n3=Q^r-Ob z+-t|5*WX+E#~`oGYBL+iWCd;ixD2M%{}Znk{<*u%)_9_RfHxzP95b$TBLULH08AGQ zOBz8e%v8h*NkwRZhioclf`OO{GH*#^EZkJ2 Date: Thu, 28 Oct 2021 08:49:12 +0200 Subject: [PATCH 088/110] Output source option of Value & Gauge widgets in a symbolic way --- radio/src/gui/colorlcd/zone.h | 8 +++-- .../conversions/conversions_220_221.cpp | 36 ++++++++++++++++++- .../conversions/yaml/yaml_datastructs.cpp | 1 + .../yaml/yaml_datastructs_funcs.cpp | 13 +++++-- .../yaml/yaml_datastructs_nv14.cpp | 2 ++ .../conversions/yaml/yaml_datastructs_x10.cpp | 2 ++ .../yaml/yaml_datastructs_x12s.cpp | 2 ++ radio/src/storage/conversions/yaml/zone_220.h | 4 ++- .../storage/yaml/yaml_datastructs_funcs.cpp | 17 +++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 2 ++ .../src/storage/yaml/yaml_datastructs_x10.cpp | 2 ++ .../storage/yaml/yaml_datastructs_x12s.cpp | 2 ++ radio/src/tests/conversions.cpp | 7 ++++ 13 files changed, 92 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/colorlcd/zone.h b/radio/src/gui/colorlcd/zone.h index 4fca9328a..85d6d3e85 100644 --- a/radio/src/gui/colorlcd/zone.h +++ b/radio/src/gui/colorlcd/zone.h @@ -45,13 +45,15 @@ union ZoneOptionValue int32_t signedValue; uint32_t boolValue; char stringValue[LEN_ZONE_OPTION_STRING]; + CUST_ATTR(source, r_zov_source, w_zov_source); }; enum ZoneOptionValueEnum { ZOV_Unsigned=0, ZOV_Signed, ZOV_Bool, - ZOV_String + ZOV_String, + ZOV_Source }; struct ZoneOption @@ -95,10 +97,12 @@ inline ZoneOptionValueEnum zoneValueEnumFromType(ZoneOption::Type type) case ZoneOption::Bool: return ZOV_Bool; + case ZoneOption::Source: + return ZOV_Source; + case ZoneOption::Color: case ZoneOption::Timer: case ZoneOption::Switch: - case ZoneOption::Source: case ZoneOption::TextSize: default: return ZOV_Unsigned; diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp index 734a58d4f..e7276331d 100644 --- a/radio/src/storage/conversions/conversions_220_221.cpp +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -21,6 +21,7 @@ #include #include +#include #include "definitions.h" #include "datastructs_220.h" @@ -67,11 +68,44 @@ static const char* convertData_220_to_221( return error; } +#if defined(COLORLCD) +template void patchWidgetOptions(T& zones) +{ + for (auto& zone : zones) { + auto name_len = strnlen(zone.widgetName, sizeof(zone.widgetName)); + std::string widgetName(zone.widgetName, name_len); + + if (widgetName.empty()) continue; + + if (widgetName == "Value" || widgetName == "Gauge") { + zone.widgetData.options[0].type = ZOV_Source; + } + } +} + +static void patchModelData(uint8_t* data) +{ + auto md = reinterpret_cast(data); + for (auto& screen : md->screenData) { + + if (!strnlen(screen.LayoutId, sizeof(screen.LayoutId))) + break; + + patchWidgetOptions(screen.layoutData.zones); + } + + patchWidgetOptions(md->topbarData.zones); +} +#else + #define patchModelData nullptr +#endif + const char* convertModelData_220_to_221(const char* path) { constexpr unsigned md_size = sizeof(bin_storage_220::ModelData); return convertData_220_to_221(path, md_size, - yaml_conv_220::get_modeldata_nodes()); + yaml_conv_220::get_modeldata_nodes(), + patchModelData); } static void patchCurrentModelFilename(uint8_t* data) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp index 59ae1a3e8..37c7cb5c4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp @@ -28,6 +28,7 @@ #include #include +#include "strhelpers.h" #include "switches.h" namespace yaml_conv_220 { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 021acc826..e5b13c6ac 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -168,10 +168,19 @@ uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) data += bitoffs >> 3UL; data -= sizeof(ZoneOptionValueEnum); ZoneOptionValueEnum* p_zovt = (ZoneOptionValueEnum*)data; - if (*p_zovt > ZOV_String) - return 0; + if (*p_zovt > ZOV_Source) return 0; return *p_zovt; } + +#define r_zov_source nullptr + +bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + data += bitoffs >> 3UL; + auto p_val = reinterpret_cast(data); + return w_mixSrcRaw(nullptr, p_val->unsignedValue, wf, opaque); +} #endif uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index 1f3f289db..0f4e22c39 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Signed, "Signed" }, { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, + { ZOV_Source, "Source" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -334,6 +335,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_SIGNED( "signedValue", 32 ), YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), + YAML_CUSTOM("source",r_zov_source,w_zov_source), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 69c229f8f..1bbe398ee 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Signed, "Signed" }, { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, + { ZOV_Source, "Source" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -355,6 +356,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_SIGNED( "signedValue", 32 ), YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), + YAML_CUSTOM("source",r_zov_source,w_zov_source), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 2269671f5..8ac5fb23d 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Signed, "Signed" }, { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, + { ZOV_Source, "Source" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -355,6 +356,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_SIGNED( "signedValue", 32 ), YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), + YAML_CUSTOM("source",r_zov_source,w_zov_source), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/conversions/yaml/zone_220.h b/radio/src/storage/conversions/yaml/zone_220.h index 3c80bcfed..3150b3fe6 100644 --- a/radio/src/storage/conversions/yaml/zone_220.h +++ b/radio/src/storage/conversions/yaml/zone_220.h @@ -35,7 +35,9 @@ enum ZoneOptionValueEnum { ZOV_Unsigned=0, ZOV_Signed, ZOV_Bool, - ZOV_String + ZOV_String, + // added for conversion: + ZOV_Source }; struct ZoneOption diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 97ba9da37..5647e6ca5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -70,6 +70,9 @@ namespace yaml_conv_220 { bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque); + + bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque); }; // @@ -267,6 +270,20 @@ static uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) { return yaml_conv_220::select_zov(user, data, bitoffs); } + +void r_zov_source(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) +{ + data += bitoffs >> 3UL; + auto p_val = reinterpret_cast(data); + p_val->unsignedValue = r_mixSrcRaw(nullptr, val, val_len); +} + +bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + return yaml_conv_220::w_zov_source(user, data, bitoffs, wf, opaque); +} #endif static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 1f3f289db..0f4e22c39 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Signed, "Signed" }, { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, + { ZOV_Source, "Source" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -334,6 +335,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_SIGNED( "signedValue", 32 ), YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), + YAML_CUSTOM("source",r_zov_source,w_zov_source), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 69c229f8f..1bbe398ee 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Signed, "Signed" }, { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, + { ZOV_Source, "Source" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -355,6 +356,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_SIGNED( "signedValue", 32 ), YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), + YAML_CUSTOM("source",r_zov_source,w_zov_source), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 2269671f5..8ac5fb23d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Signed, "Signed" }, { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, + { ZOV_Source, "Source" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -355,6 +356,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_SIGNED( "signedValue", 32 ), YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), + YAML_CUSTOM("source",r_zov_source,w_zov_source), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 9764aad43..462a90bcc 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -413,6 +413,13 @@ TEST(Conversions, ConversionTX16SFrom25) EXPECT_STRNEQ("model1.yml", g_eeGeneral.currModelFilename); EXPECT_STRNEQ("Model", g_model.header.name); + + const auto& top_widget = g_model.topbarData.zones[3]; + EXPECT_STRNEQ("Value", top_widget.widgetName); + + const auto& top_option = top_widget.widgetData.options[0]; + EXPECT_EQ(ZOV_Source, top_option.type); + EXPECT_EQ(MIXSRC_TX_VOLTAGE, top_option.value.unsignedValue); } #endif From a356b5199dce3b1294dcc09f88ecf02595e97a71 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 28 Oct 2021 09:04:42 +0200 Subject: [PATCH 089/110] Cope with stupid GCC --- radio/src/storage/conversions/conversions_220_221.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp index e7276331d..f4bc9884b 100644 --- a/radio/src/storage/conversions/conversions_220_221.cpp +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -69,9 +69,10 @@ static const char* convertData_220_to_221( } #if defined(COLORLCD) -template void patchWidgetOptions(T& zones) +void patchWidgetOptions(ZonePersistentData* zones, unsigned n_zones) { - for (auto& zone : zones) { + for (unsigned i = 0; i < n_zones; i++) { + auto& zone = zones[i]; auto name_len = strnlen(zone.widgetName, sizeof(zone.widgetName)); std::string widgetName(zone.widgetName, name_len); @@ -91,10 +92,10 @@ static void patchModelData(uint8_t* data) if (!strnlen(screen.LayoutId, sizeof(screen.LayoutId))) break; - patchWidgetOptions(screen.layoutData.zones); + patchWidgetOptions(screen.layoutData.zones, MAX_LAYOUT_ZONES); } - patchWidgetOptions(md->topbarData.zones); + patchWidgetOptions(md->topbarData.zones, MAX_TOPBAR_ZONES); } #else #define patchModelData nullptr From cc9b1467130b5ae881766768b07f6727443d36e9 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 28 Oct 2021 10:35:45 +0200 Subject: [PATCH 090/110] Output widget colors as such --- radio/src/gui/colorlcd/zone.h | 6 ++- .../conversions/conversions_220_221.cpp | 12 ++++- .../yaml/yaml_datastructs_funcs.cpp | 19 +++++++- .../yaml/yaml_datastructs_nv14.cpp | 2 + .../conversions/yaml/yaml_datastructs_x10.cpp | 2 + .../yaml/yaml_datastructs_x12s.cpp | 2 + radio/src/storage/conversions/yaml/zone_220.h | 3 +- radio/src/storage/yaml/yaml_bits.cpp | 48 +++++++++++++++++++ radio/src/storage/yaml/yaml_bits.h | 5 ++ .../storage/yaml/yaml_datastructs_funcs.cpp | 27 +++++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 2 + .../src/storage/yaml/yaml_datastructs_x10.cpp | 2 + .../storage/yaml/yaml_datastructs_x12s.cpp | 2 + radio/src/tests/conversions.cpp | 4 ++ 14 files changed, 132 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/colorlcd/zone.h b/radio/src/gui/colorlcd/zone.h index 85d6d3e85..11554173d 100644 --- a/radio/src/gui/colorlcd/zone.h +++ b/radio/src/gui/colorlcd/zone.h @@ -46,6 +46,7 @@ union ZoneOptionValue uint32_t boolValue; char stringValue[LEN_ZONE_OPTION_STRING]; CUST_ATTR(source, r_zov_source, w_zov_source); + CUST_ATTR(color, r_zov_color, w_zov_color); }; enum ZoneOptionValueEnum { @@ -53,7 +54,8 @@ enum ZoneOptionValueEnum { ZOV_Signed, ZOV_Bool, ZOV_String, - ZOV_Source + ZOV_Source, + ZOV_Color }; struct ZoneOption @@ -101,6 +103,8 @@ inline ZoneOptionValueEnum zoneValueEnumFromType(ZoneOption::Type type) return ZOV_Source; case ZoneOption::Color: + return ZOV_Color; + case ZoneOption::Timer: case ZoneOption::Switch: case ZoneOption::TextSize: diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp index f4bc9884b..4a2693b88 100644 --- a/radio/src/storage/conversions/conversions_220_221.cpp +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -78,8 +78,18 @@ void patchWidgetOptions(ZonePersistentData* zones, unsigned n_zones) if (widgetName.empty()) continue; - if (widgetName == "Value" || widgetName == "Gauge") { + if (widgetName == "Value") { zone.widgetData.options[0].type = ZOV_Source; + zone.widgetData.options[1].type = ZOV_Color; + } else if (widgetName == "Gauge") { + zone.widgetData.options[0].type = ZOV_Source; + zone.widgetData.options[3].type = ZOV_Color; + } else if (widgetName == "Outputs") { + zone.widgetData.options[2].type = ZOV_Color; + zone.widgetData.options[3].type = ZOV_Color; + zone.widgetData.options[4].type = ZOV_Color; + } else if (widgetName == "Text") { + zone.widgetData.options[1].type = ZOV_Color; } } } diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index e5b13c6ac..1dd2dcfc7 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -168,7 +168,7 @@ uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) data += bitoffs >> 3UL; data -= sizeof(ZoneOptionValueEnum); ZoneOptionValueEnum* p_zovt = (ZoneOptionValueEnum*)data; - if (*p_zovt > ZOV_Source) return 0; + if (*p_zovt > ZOV_Color) return 0; return *p_zovt; } @@ -181,6 +181,23 @@ bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs, auto p_val = reinterpret_cast(data); return w_mixSrcRaw(nullptr, p_val->unsignedValue, wf, opaque); } + +#include "colors.h" +#define r_zov_color nullptr + +bool w_zov_color(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + data += bitoffs >> 3UL; + auto p_val = reinterpret_cast(data); + + uint32_t color = (uint32_t)GET_RED(p_val->unsignedValue) << 16 | + (uint32_t)GET_GREEN(p_val->unsignedValue) << 8 | + (uint32_t)GET_BLUE(p_val->unsignedValue); + + if (!wf(opaque, "0x", 2)) return false; + return wf(opaque, yaml_rgb2hex(color), 3 * 2); +} #endif uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index 0f4e22c39..4143fdc10 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, { ZOV_Source, "Source" }, + { ZOV_Color, "Color" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -336,6 +337,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), YAML_CUSTOM("source",r_zov_source,w_zov_source), + YAML_CUSTOM("color",r_zov_color,w_zov_color), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 1bbe398ee..7a8f14fbe 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, { ZOV_Source, "Source" }, + { ZOV_Color, "Color" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -357,6 +358,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), YAML_CUSTOM("source",r_zov_source,w_zov_source), + YAML_CUSTOM("color",r_zov_color,w_zov_color), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 8ac5fb23d..1bc3b82e3 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, { ZOV_Source, "Source" }, + { ZOV_Color, "Color" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -357,6 +358,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), YAML_CUSTOM("source",r_zov_source,w_zov_source), + YAML_CUSTOM("color",r_zov_color,w_zov_color), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/conversions/yaml/zone_220.h b/radio/src/storage/conversions/yaml/zone_220.h index 3150b3fe6..694ea6425 100644 --- a/radio/src/storage/conversions/yaml/zone_220.h +++ b/radio/src/storage/conversions/yaml/zone_220.h @@ -37,7 +37,8 @@ enum ZoneOptionValueEnum { ZOV_Bool, ZOV_String, // added for conversion: - ZOV_Source + ZOV_Source, + ZOV_Color }; struct ZoneOption diff --git a/radio/src/storage/yaml/yaml_bits.cpp b/radio/src/storage/yaml/yaml_bits.cpp index 28a1d350d..321a830ec 100644 --- a/radio/src/storage/yaml/yaml_bits.cpp +++ b/radio/src/storage/yaml/yaml_bits.cpp @@ -163,6 +163,29 @@ uint32_t yaml_str2uint(const char* val, uint8_t val_len) return yaml_str2uint_ref(val, val_len); } +uint32_t yaml_hex2uint(const char* val, uint8_t val_len) +{ + uint32_t i_val = 0; + + while(val_len > 0) { + if (*val >= '0' && *val <= '9') { + i_val <<= 4; + i_val |= (*val - '0') & 0xF; + } else if (*val >= 'A' && *val <= 'F') { + i_val <<= 4; + i_val |= (*val - 'A' + 10) & 0xF; + } else if (*val >= 'a' && *val <= 'f') { + i_val <<= 4; + i_val |= (*val - 'a' + 10) & 0xF; + } else { + break; + } + val++; val_len--; + } + + return i_val; +} + static char int2str_buffer[MAX_STR] = {0}; static const char _int2str_lookup[] = { '0', '1', '2', '3', '4', '5', '6' , '7', '8', '9' }; @@ -188,6 +211,31 @@ char* yaml_signed2str(int32_t i) return yaml_unsigned2str((uint32_t)i); } +static const char _int2hex_lookup[] = {'0', '1', '2', '3', + '4', '5', '6', '7', + '8', '9', 'A', 'B', + 'C', 'D', 'E', 'F'}; + +char* yaml_unsigned2hex(uint32_t i) +{ + char* c = int2str_buffer; + for (int n = sizeof(uint32_t) * 2; n > 0; n--) { + *(c++) = _int2hex_lookup[(i >> ((n - 1) * 4)) & 0xF]; + } + *c = '\0'; + return int2str_buffer; +} + +char* yaml_rgb2hex(uint32_t i) +{ + char* c = int2str_buffer; + for (int n = 3 * 2; n > 0; n--) { + *(c++) = _int2hex_lookup[(i >> ((n - 1) * 4)) & 0xF]; + } + *c = '\0'; + return int2str_buffer; +} + int32_t yaml_to_signed(uint32_t i, uint32_t bits) { if (i & (1 << (bits-1))) { diff --git a/radio/src/storage/yaml/yaml_bits.h b/radio/src/storage/yaml/yaml_bits.h index 81f462b36..14458d1be 100644 --- a/radio/src/storage/yaml/yaml_bits.h +++ b/radio/src/storage/yaml/yaml_bits.h @@ -36,9 +36,14 @@ uint32_t yaml_str2uint_ref(const char* val, uint8_t val_len); int32_t yaml_str2int(const char* val, uint8_t val_len); uint32_t yaml_str2uint(const char* val, uint8_t val_len); +uint32_t yaml_hex2uint(const char* val, uint8_t val_len); + char* yaml_unsigned2str(uint32_t i); char* yaml_signed2str(int32_t i); +char* yaml_unsigned2hex(uint32_t i); +char* yaml_rgb2hex(uint32_t i); + int32_t yaml_to_signed(uint32_t i, uint32_t bits); #endif diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 5647e6ca5..b1144b278 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -73,6 +73,9 @@ namespace yaml_conv_220 { bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque); + + bool w_zov_color(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque); }; // @@ -284,6 +287,30 @@ bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs, { return yaml_conv_220::w_zov_source(user, data, bitoffs, wf, opaque); } + +void r_zov_color(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) +{ + if (val_len < sizeof("0xFFFFFF")-1 + || val[0] != '0' + || val[1] != 'x') + return; + + val += 2; val_len -= 2; + + data += bitoffs >> 3UL; + auto p_val = reinterpret_cast(data); + + auto rgb24 = yaml_hex2uint(val, val_len); + p_val->unsignedValue = + RGB((rgb24 & 0xFF0000) >> 16, (rgb24 & 0xFF00) >> 8, rgb24 & 0xFF); +} + +bool w_zov_color(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + return yaml_conv_220::w_zov_color(user, data, bitoffs, wf, opaque); +} #endif static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs) diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 0f4e22c39..4143fdc10 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, { ZOV_Source, "Source" }, + { ZOV_Color, "Color" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -336,6 +337,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), YAML_CUSTOM("source",r_zov_source,w_zov_source), + YAML_CUSTOM("color",r_zov_color,w_zov_color), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 1bbe398ee..7a8f14fbe 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, { ZOV_Source, "Source" }, + { ZOV_Color, "Color" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -357,6 +358,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), YAML_CUSTOM("source",r_zov_source,w_zov_source), + YAML_CUSTOM("color",r_zov_color,w_zov_color), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 8ac5fb23d..1bc3b82e3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = { { ZOV_Bool, "Bool" }, { ZOV_String, "String" }, { ZOV_Source, "Source" }, + { ZOV_Color, "Color" }, { 0, NULL } }; const struct YamlIdStr enum_TimerModes[] = { @@ -357,6 +358,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_UNSIGNED( "boolValue", 32 ), YAML_STRING("stringValue", 8), YAML_CUSTOM("source",r_zov_source,w_zov_source), + YAML_CUSTOM("color",r_zov_color,w_zov_color), YAML_END }; static const struct YamlNode struct_ZoneOptionValueTyped[] = { diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 462a90bcc..7fb4608b1 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -420,6 +420,10 @@ TEST(Conversions, ConversionTX16SFrom25) const auto& top_option = top_widget.widgetData.options[0]; EXPECT_EQ(ZOV_Source, top_option.type); EXPECT_EQ(MIXSRC_TX_VOLTAGE, top_option.value.unsignedValue); + + const auto& color_option = top_widget.widgetData.options[1]; + EXPECT_EQ(ZOV_Color, color_option.type); + EXPECT_EQ(0xFFFF, color_option.value.unsignedValue); } #endif From c6b847c9ac54a71bccf4d32150423a19d3e525bf Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 28 Oct 2021 11:34:15 +0200 Subject: [PATCH 091/110] thrTraceSrc and potsWarnMode --- radio/src/datastructs_private.h | 4 ++-- .../conversions/yaml/yaml_datastructs.cpp | 5 +++-- .../yaml/yaml_datastructs_funcs.cpp | 8 ++++++++ .../yaml/yaml_datastructs_nv14.cpp | 10 ++++++++-- .../conversions/yaml/yaml_datastructs_t12.cpp | 10 ++++++++-- .../conversions/yaml/yaml_datastructs_t8.cpp | 10 ++++++++-- .../yaml/yaml_datastructs_tlite.cpp | 10 ++++++++-- .../yaml/yaml_datastructs_tx12.cpp | 10 ++++++++-- .../conversions/yaml/yaml_datastructs_x10.cpp | 10 ++++++++-- .../yaml/yaml_datastructs_x12s.cpp | 10 ++++++++-- .../conversions/yaml/yaml_datastructs_x7.cpp | 10 ++++++++-- .../conversions/yaml/yaml_datastructs_x9d.cpp | 10 ++++++++-- .../conversions/yaml/yaml_datastructs_x9e.cpp | 10 ++++++++-- .../yaml/yaml_datastructs_x9lite.cpp | 10 ++++++++-- .../yaml/yaml_datastructs_x9lites.cpp | 10 ++++++++-- .../yaml/yaml_datastructs_xlite.cpp | 10 ++++++++-- .../yaml/yaml_datastructs_xlites.cpp | 10 ++++++++-- .../storage/yaml/yaml_datastructs_funcs.cpp | 20 +++++++++++++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 10 ++++++++-- .../src/storage/yaml/yaml_datastructs_t12.cpp | 10 ++++++++-- .../src/storage/yaml/yaml_datastructs_t8.cpp | 10 ++++++++-- .../storage/yaml/yaml_datastructs_tlite.cpp | 10 ++++++++-- .../storage/yaml/yaml_datastructs_tx12.cpp | 10 ++++++++-- .../src/storage/yaml/yaml_datastructs_x10.cpp | 10 ++++++++-- .../storage/yaml/yaml_datastructs_x12s.cpp | 10 ++++++++-- .../src/storage/yaml/yaml_datastructs_x7.cpp | 10 ++++++++-- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 10 ++++++++-- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 10 ++++++++-- .../storage/yaml/yaml_datastructs_x9lite.cpp | 10 ++++++++-- .../storage/yaml/yaml_datastructs_x9lites.cpp | 10 ++++++++-- .../storage/yaml/yaml_datastructs_xlite.cpp | 10 ++++++++-- .../storage/yaml/yaml_datastructs_xlites.cpp | 10 ++++++++-- 32 files changed, 257 insertions(+), 60 deletions(-) diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 88efd2731..7470aecd1 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -662,7 +662,7 @@ PACK(struct ModelData { SwashRingData swashR FUNC(swash_is_active); FlightModeData flightModeData[MAX_FLIGHT_MODES] FUNC(fmd_is_active); - NOBACKUP(uint8_t thrTraceSrc); + NOBACKUP(uint8_t thrTraceSrc CUST(r_thrSrc,w_thrSrc)); SWITCHES_WARNING_DATA @@ -677,7 +677,7 @@ PACK(struct ModelData { uint8_t spare1:3 SKIP; uint8_t thrTrimSw:3; - uint8_t potsWarnMode:2; + uint8_t potsWarnMode:2 ENUM(PotsWarnMode); ModuleData moduleData[NUM_MODULES]; int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp index 37c7cb5c4..ba1c834fe 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp @@ -28,8 +28,9 @@ #include #include -#include "strhelpers.h" -#include "switches.h" +#include "../../../strhelpers.h" +#include "../../../switches.h" +#include "../../../timers.h" namespace yaml_conv_220 { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 1dd2dcfc7..a4ad63050 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -912,3 +912,11 @@ bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, return true; } + +#define r_thrSrc nullptr + +bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + auto src = throttleSource2Source(val); + return w_mixSrcRaw(nullptr, src, wf, opaque); +} diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index 4143fdc10..1a29bffd9 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -228,6 +228,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -834,7 +840,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -842,7 +848,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index f40f25d6e..fb4c187ed 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index f40f25d6e..fb4c187ed 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index f40f25d6e..fb4c187ed 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index b35ec6ef2..4ba734556 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 7a8f14fbe..0645456fa 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -249,6 +249,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -851,7 +857,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -859,7 +865,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 1bc3b82e3..95321db53 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -249,6 +249,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -851,7 +857,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -859,7 +865,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index f40f25d6e..fb4c187ed 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index 49084757c..345a01600 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -225,6 +225,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -815,7 +821,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 16 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -826,7 +832,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index ca024b019..b1b82a9f4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -264,6 +264,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -854,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 64, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 32 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -865,7 +871,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index de87dd052..2c71c10ea 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -205,6 +205,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -787,7 +793,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -796,7 +802,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 6e1beb9a6..818015977 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -213,6 +213,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -797,7 +803,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -806,7 +812,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index 75e7f7ca8..a770fcda7 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -210,6 +210,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -794,7 +800,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -803,7 +809,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index c2299506a..ee6855638 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -212,6 +212,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -798,7 +804,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -807,7 +813,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index b1144b278..8661ddb38 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -76,6 +76,9 @@ namespace yaml_conv_220 { bool w_zov_color(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque); + + bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, + void* opaque); }; // @@ -1179,3 +1182,20 @@ static bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, { return yaml_conv_220::w_logicSw(user, data, bitoffs, wf, opaque); } + +static uint32_t r_thrSrc(const YamlNode* node, const char* val, uint8_t val_len) +{ + auto src = r_mixSrcRaw(nullptr, val, val_len); + auto thrSrc = source2ThrottleSource(src); + + if (thrSrc < 0) + return 0; + + return thrSrc; +} + +static bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, + void* opaque) +{ + return yaml_conv_220::w_thrSrc(node, val, wf, opaque); +} diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 4143fdc10..1a29bffd9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -228,6 +228,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -834,7 +840,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -842,7 +848,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index f40f25d6e..fb4c187ed 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index f40f25d6e..fb4c187ed 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index f40f25d6e..fb4c187ed 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index b35ec6ef2..4ba734556 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 7a8f14fbe..0645456fa 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -249,6 +249,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -851,7 +857,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -859,7 +865,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 1bc3b82e3..95321db53 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -249,6 +249,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -851,7 +857,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), @@ -859,7 +865,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index f40f25d6e..fb4c187ed 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -218,6 +218,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -802,7 +808,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -811,7 +817,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 49084757c..345a01600 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -225,6 +225,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -815,7 +821,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 32, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 16 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -826,7 +832,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index ca024b019..b1b82a9f4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -264,6 +264,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -854,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 64, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 32 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -865,7 +871,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index de87dd052..2c71c10ea 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -205,6 +205,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -787,7 +793,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -796,7 +802,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 6e1beb9a6..818015977 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -213,6 +213,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -797,7 +803,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -806,7 +812,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 75e7f7ca8..a770fcda7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -210,6 +210,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -794,7 +800,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -803,7 +809,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index c2299506a..ee6855638 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -212,6 +212,12 @@ const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_OFF, "OFF" }, { 0, NULL } }; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_NONE, "TYPE_NONE" }, { MODULE_TYPE_PPM, "TYPE_PPM" }, @@ -798,7 +804,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED( "thrTraceSrc", 8 ), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_UNSIGNED_CUST( "switchWarningState", 16, r_swtchWarn, w_swtchWarn ), YAML_UNSIGNED( "switchWarningEnable", 8 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), @@ -807,7 +813,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("rssiAlarms", 16, struct_RssiAlarmData, NULL), YAML_PADDING( 3 ), YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_UNSIGNED( "potsWarnMode", 2 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), From 3717e37e3f59114117bd8f36d8a385f3a26100f4 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 28 Oct 2021 15:34:46 +0200 Subject: [PATCH 092/110] Set current model in ModelsList while loading --- radio/src/gui/colorlcd/model_select.cpp | 38 -------------- radio/src/storage/conversions/conversions.cpp | 6 +-- radio/src/storage/modelslist.cpp | 8 ++- radio/src/storage/yaml/yaml_modelslist.cpp | 52 ++++++++++++------- radio/src/storage/yaml/yaml_modelslist.h | 2 +- 5 files changed, 41 insertions(+), 65 deletions(-) diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index a2ec85101..d591af7ad 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -43,44 +43,6 @@ constexpr coord_t MODEL_IMAGE_WIDTH = MODEL_SELECT_CELL_WIDTH; constexpr coord_t MODEL_IMAGE_HEIGHT = 72; -enum ModelSelectMode { - MODE_SELECT_MODEL, - MODE_RENAME_CATEGORY, - MODE_MOVE_MODEL, -}; - -enum ModelDeleteMode { - MODE_DELETE_MODEL, - MODE_DELETE_CATEGORY, -}; - -uint8_t selectMode, deleteMode; - -#if 0 -void setCurrentModel(unsigned int index) -{ - auto it = currentCategory->begin(); - std::advance(it, index); - currentModel = *it; -} -#endif - -#if 0 -void setCurrentCategory(unsigned int index) -{ - currentCategoryIndex = index; - auto it = modelslist.getCategories().begin(); - std::advance(it, index); - currentCategory = *it; - categoriesVerticalPosition = index; - categoriesVerticalOffset = limit(categoriesVerticalPosition-4, categoriesVerticalOffset, min(categoriesVerticalPosition, max(0, modelslist.getCategories().size()-5))); - /*if (currentCategory->size() > 0) - setCurrentModel(0); - else - currentModel = nullptr;*/ -} -#endif - class ModelButton : public Button { public: diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index e0c55594f..e6078af65 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -136,11 +136,9 @@ void convertBinRadioData(const char * path, int version) #if defined(SDCARD_YAML) || defined(STORAGE_MODELSLIST) modelslist.save(); -#endif - - // reload models list + // trigger models list reload modelslist.clear(); - modelslist.load(); +#endif } void patchFilenameToYaml(char* str) diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index cd1237030..585282721 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -355,8 +355,12 @@ bool ModelsList::loadYaml() // YAML reader TRACE("YAML modelslist reader"); - YamlParser yp; //TODO: move to re-usable buffer - yp.init(get_modelslist_parser_calls(), get_modelslist_iter()); + YamlParser yp; + void* ctx = get_modelslist_iter( + g_eeGeneral.currModelFilename, + strnlen(g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME)); + + yp.init(get_modelslist_parser_calls(), ctx); UINT bytes_read=0; while (f_read(&file, line, sizeof(line), &bytes_read) == FR_OK) { diff --git a/radio/src/storage/yaml/yaml_modelslist.cpp b/radio/src/storage/yaml/yaml_modelslist.cpp index 04a291e61..7e0062938 100644 --- a/radio/src/storage/yaml/yaml_modelslist.cpp +++ b/radio/src/storage/yaml/yaml_modelslist.cpp @@ -37,16 +37,21 @@ struct modelslist_iter }; ModelsList* root; + const char* currentModel; + unsigned currentModel_len; uint8_t level; char current_attr[16]; // set after find_node() }; static modelslist_iter __modelslist_iter_inst; -void* get_modelslist_iter() +void* get_modelslist_iter(const char* currentModel, unsigned currentModel_len) { __modelslist_iter_inst.root = &modelslist; + __modelslist_iter_inst.currentModel = currentModel; + __modelslist_iter_inst.currentModel_len = currentModel_len; __modelslist_iter_inst.level = 0; + return &__modelslist_iter_inst; } @@ -102,29 +107,36 @@ static bool find_node(void* ctx, char* buf, uint8_t len) static void set_attr(void* ctx, char* buf, uint8_t len) { - modelslist_iter* mi = (modelslist_iter*)ctx; - list& cats = mi->root->getCategories(); - switch(mi->level) { + modelslist_iter* mi = (modelslist_iter*)ctx; + auto ml = mi->root; + list& cats = ml->getCategories(); + switch (mi->level) { case modelslist_iter::Model: - if (!strcmp(mi->current_attr,"filename")) { - if (!cats.empty()) { - ModelCell* model = new ModelCell(buf, len); - cats.back()->push_back(model); - mi->root->incModelsCount(); - } + if (!strcmp(mi->current_attr, "filename")) { + if (!cats.empty()) { + ModelCell* model = new ModelCell(buf, len); + auto cat = cats.back(); + cat->push_back(model); + ml->incModelsCount(); + + if (!strncmp(model->modelFilename, mi->currentModel, + mi->currentModel_len)) { + ml->setCurrentCategory(cat); + ml->setCurrentModel(model); + } } - else if (!strcmp(mi->current_attr,"name")) { - if (!cats.empty()) { - ModelsCategory* cat = cats.back(); - if (!cat->empty()) { - ModelCell* model = cat->back(); - model->setModelName(buf,len); - } - } + } else if (!strcmp(mi->current_attr, "name")) { + if (!cats.empty()) { + auto cat = cats.back(); + if (!cat->empty()) { + auto model = cat->back(); + model->setModelName(buf, len); + } } - break; - } + } + break; + } } static const YamlParserCalls modelslistCalls = { diff --git a/radio/src/storage/yaml/yaml_modelslist.h b/radio/src/storage/yaml/yaml_modelslist.h index 374caed4a..153fd0aaf 100644 --- a/radio/src/storage/yaml/yaml_modelslist.h +++ b/radio/src/storage/yaml/yaml_modelslist.h @@ -24,7 +24,7 @@ struct YamlParserCalls; -void* get_modelslist_iter(); +void* get_modelslist_iter(const char* currentModel, unsigned currentModel_len); const YamlParserCalls* get_modelslist_parser_calls(); #endif From bcdb9bd311e48213085357fa7f4b2b9086da592d Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 28 Oct 2021 22:35:51 +0200 Subject: [PATCH 093/110] Fix model names and indexes on storage creation --- radio/src/gui/colorlcd/model_select.cpp | 5 ++++- radio/src/model_init.cpp | 6 +++++- radio/src/storage/modelslist.cpp | 3 ++- radio/src/storage/sdcard_common.cpp | 10 +++++++--- radio/src/storage/sdcard_yaml.cpp | 8 +++++++- 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index d591af7ad..d64aad71e 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -334,7 +334,10 @@ class ModelCategoryPageBody : public FormWindow { return [=]() { storageCheck(true); - modelslist.setCurrentModel(modelslist.addModel(category, createModel())); + auto model = modelslist.addModel(category, createModel(), false); + model->setModelName(g_model.header.name); + modelslist.setCurrentModel(model); + modelslist.save(); update(category->size() - 1); }; } diff --git a/radio/src/model_init.cpp b/radio/src/model_init.cpp index c6212ba95..492ccb190 100644 --- a/radio/src/model_init.cpp +++ b/radio/src/model_init.cpp @@ -135,7 +135,11 @@ void setModelDefaults(uint8_t id) setVendorSpecificModelDefaults(id); - strAppendUnsigned(strAppend(g_model.header.name, STR_MODEL), id + 1, 2); +#if !defined(STORAGE_MODELSLIST) + // EEPROM model indexes starting with 0 + id++; +#endif + strAppendUnsigned(strAppend(g_model.header.name, STR_MODEL), id, 2); #if defined(LUA) && defined(PCBTARANIS) // Horus uses menuModelWizard() for wizard if (isFileAvailable(WIZARD_PATH "/" WIZARD_NAME)) { diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 585282721..ad0b91ee6 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -38,7 +38,8 @@ ModelsList modelslist; ModelCell::ModelCell(const char* name) : valid_rfData(false) { - strncpy(modelFilename, name, sizeof(modelFilename)); + strncpy(modelFilename, name, sizeof(modelFilename)-1); + modelFilename[sizeof(modelFilename)-1] = '\0'; } ModelCell::ModelCell(const char* name, uint8_t len) : valid_rfData(false) diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index 68e4f17a8..563731d57 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -60,6 +60,7 @@ void storageEraseAll(bool warn) storageFormat(); storageDirty(EE_GENERAL); + storageDirty(EE_MODEL); storageCheck(true); } @@ -67,10 +68,13 @@ void storageFormat() { sdCheckAndCreateDirectory(RADIO_PATH); sdCheckAndCreateDirectory(MODELS_PATH); -#if defined(STORAGE_MODELSLIST) - storageCreateModelsList(); -#endif generalDefault(); +#if defined(STORAGE_MODELSLIST) + setModelDefaults(1); + storageCreateModelsList(); +#else + setModelDefaults(0); +#endif } void storageCheck(bool immediately) diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 5e834e671..74ee5e1d2 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -76,7 +76,13 @@ void storageCreateModelsList() { modelslist.clear(); ModelsCategory* cat = modelslist.createCategory(DEFAULT_CATEGORY, false); - cat->addModel(DEFAULT_MODEL_FILENAME); + ModelCell* model = nullptr; + if (g_eeGeneral.currModelFilename[0] != '\0') { + model = modelslist.addModel(cat, g_eeGeneral.currModelFilename, false); + } else { + model = modelslist.addModel(cat, DEFAULT_MODEL_FILENAME, false); + } + model->setModelName(g_model.header.name); modelslist.save(); } #endif From 455cb1c2b81ead849b2859d93ab4e386b17f1efa Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 29 Oct 2021 08:33:51 +0200 Subject: [PATCH 094/110] Cope with padding inside ZoneOptionValueTyped As it seems, ZoneOptionValueEnum is optimised by ARM-GCC to have only 8bits, rather than the 32bits used by the host compiler. Meaning that with "data" pointing at ZoneOptionValueTyped::value, we need the offset and not the size of the element before to properly rewind the data pointer. --- radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index a4ad63050..823901ecb 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -166,7 +166,7 @@ bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* o uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs) { data += bitoffs >> 3UL; - data -= sizeof(ZoneOptionValueEnum); + data -= offsetof(ZoneOptionValueTyped, value); ZoneOptionValueEnum* p_zovt = (ZoneOptionValueEnum*)data; if (*p_zovt > ZOV_Color) return 0; return *p_zovt; From 2537c7a0049bcdf0b70a4a9dd04422ebd33089f0 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 29 Oct 2021 09:04:21 +0200 Subject: [PATCH 095/110] Restore simulated SD path after test --- radio/src/tests/conversions.cpp | 26 ++++++++++++++++++++++++++ radio/src/tests/lcd.cpp | 2 -- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 7fb4608b1..bfd51f3b9 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -100,6 +100,10 @@ TEST(Conversions, ConversionX9DPFrom23) EXPECT_EQ(MIXSRC_FIRST_TELEM, g_model.logicalSw[0].v1); EXPECT_STRNEQ("abc.wav", g_model.customFn[1].play.name); + +#if defined(SDCARD_YAML) + simuFatfsSetPaths("",""); +#endif } TEST(Conversions, ConversionX9DPFrom23_2) @@ -130,6 +134,10 @@ TEST(Conversions, ConversionX9DPFrom23_2) EXPECT_EQ(TMRMODE_ON, g_model.timers[0].mode); // new! EXPECT_EQ(-SWSRC_SA0, g_model.timers[0].swtch); // new! + +#if defined(SDCARD_YAML) + simuFatfsSetPaths("",""); +#endif } #endif @@ -190,6 +198,10 @@ TEST(Conversions, ConversionXLiteFrom23) EXPECT_EQ(TELEMETRY_SCREEN_TYPE_VALUES, g_model.screensType & 0x03); EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]); EXPECT_EQ(MIXSRC_TIMER3, g_model.screens[0].lines[0].sources[1]); + +#if defined(SDCARD_YAML) + simuFatfsSetPaths("",""); +#endif } #endif @@ -255,6 +267,10 @@ TEST(Conversions, ConversionX7From23) EXPECT_EQ(TELEMETRY_SCREEN_TYPE_VALUES, g_model.screensType & 0x03); EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]); EXPECT_EQ(MIXSRC_TIMER3, g_model.screens[0].lines[0].sources[1]); + +#if defined(SDCARD_YAML) + simuFatfsSetPaths("",""); +#endif } #endif @@ -327,6 +343,8 @@ TEST(Conversions, ConversionX10From23) EXPECT_EQ(10, g_model.telemetrySensors[0].id); EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); EXPECT_EQ((NUM_POTS + NUM_SLIDERS + 3), g_model.thrTraceSrc); // CH3 + + simuFatfsSetPaths("",""); } #endif @@ -390,6 +408,8 @@ TEST(Conversions, ConversionX12SFrom23) EXPECT_EQ(10, g_model.telemetrySensors[0].id); EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); EXPECT_EQ((NUM_POTS + NUM_SLIDERS + 3), g_model.thrTraceSrc); // CH3 + + simuFatfsSetPaths("",""); } #endif @@ -424,6 +444,12 @@ TEST(Conversions, ConversionTX16SFrom25) const auto& color_option = top_widget.widgetData.options[1]; EXPECT_EQ(ZOV_Color, color_option.type); EXPECT_EQ(0xFFFF, color_option.value.unsignedValue); + + char modelname2[] = "model2.bin"; + convertBinModelData(modelname2, 220); + loadModel(modelname2); + + simuFatfsSetPaths("",""); } #endif diff --git a/radio/src/tests/lcd.cpp b/radio/src/tests/lcd.cpp index fe97b97a7..71947cad5 100644 --- a/radio/src/tests/lcd.cpp +++ b/radio/src/tests/lcd.cpp @@ -282,7 +282,6 @@ TEST(Lcd, DrawSwitch) #if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, BMPWrapping) { - simuFatfsSetPaths("",""); lcdClear(); uint8_t bitmap[2+40*40/2]; lcdLoadBitmap(bitmap, TESTS_PATH "/plane.bmp", 40, 40); @@ -350,7 +349,6 @@ public: #if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, lcdDrawBitmapLoadAndDisplay) { - simuFatfsSetPaths("",""); lcdClear(); // Test proper BMP files, they should display correctly { From 5a727ed6d1a18faa1505d7fdcf2a3a87f24e5c6d Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 29 Oct 2021 09:18:20 +0200 Subject: [PATCH 096/110] Fix default model index --- radio/src/model_init.h | 8 +++++++- radio/src/storage/eeprom_common.cpp | 2 +- radio/src/storage/sdcard_common.cpp | 4 +--- radio/src/tests/gtests.h | 2 +- radio/src/tests/mixer.cpp | 16 ++++++++-------- radio/src/tests/switches.cpp | 4 ++-- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/radio/src/model_init.h b/radio/src/model_init.h index 097485206..72a2bb7ff 100644 --- a/radio/src/model_init.h +++ b/radio/src/model_init.h @@ -24,5 +24,11 @@ void clearInputs(); void setDefaultInputs(); +#if defined(STORAGE_MODELSLIST) + #define DEFAULT_MODEL_IDX 1 +#else + #define DEFAULT_MODEL_IDX 0 +#endif + // Reset the global model to full defaults -void setModelDefaults(uint8_t id); +void setModelDefaults(uint8_t id = DEFAULT_MODEL_IDX); diff --git a/radio/src/storage/eeprom_common.cpp b/radio/src/storage/eeprom_common.cpp index bcadc9dec..f48d37bc4 100644 --- a/radio/src/storage/eeprom_common.cpp +++ b/radio/src/storage/eeprom_common.cpp @@ -102,7 +102,7 @@ void storageEraseAll(bool warn) TRACE("storageEraseAll"); generalDefault(); - setModelDefaults(0); + setModelDefaults(); if (warn) { ALERT(STR_STORAGE_WARNING, STR_BAD_RADIO_DATA, AU_BAD_RADIODATA); diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index 563731d57..74455a71a 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -69,11 +69,9 @@ void storageFormat() sdCheckAndCreateDirectory(RADIO_PATH); sdCheckAndCreateDirectory(MODELS_PATH); generalDefault(); + setModelDefaults(); #if defined(STORAGE_MODELSLIST) - setModelDefaults(1); storageCreateModelsList(); -#else - setModelDefaults(0); #endif } diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index 178169a6a..794f0b3a5 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -106,7 +106,7 @@ class OpenTxTest : public testing::Test SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - setModelDefaults(0); + setModelDefaults(); RADIO_RESET(); } }; diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index 765f68aeb..fbb3cd569 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -467,7 +467,7 @@ TEST(Curves, LinearIntpol) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - setModelDefaults(0); + setModelDefaults(); for (int8_t i=-2; i<=2; i++) { g_model.points[2+i] = 50*i; } @@ -673,7 +673,7 @@ TEST_F(TrimsTest, throttleTrimEle) { SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - setModelDefaults(0); + setModelDefaults(); g_eeGeneral.templateSetup = 17; applyDefaultTemplate(); g_model.thrTrim = 1; @@ -686,7 +686,7 @@ TEST_F(TrimsTest, throttleTrimEle) { SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - setModelDefaults(0); + setModelDefaults(); g_eeGeneral.templateSetup = 0; applyDefaultTemplate(); } @@ -697,7 +697,7 @@ TEST(Heli, BasicTest) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - setModelDefaults(0); + setModelDefaults(); g_model.swashR.collectiveSource = MIXSRC_Thr; g_model.swashR.elevatorSource = MIXSRC_Ele; g_model.swashR.aileronSource = MIXSRC_Ail; @@ -729,7 +729,7 @@ TEST(Heli, Mode2Test) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - setModelDefaults(0); + setModelDefaults(); g_eeGeneral.templateSetup = 2; applyDefaultTemplate(); g_model.swashR.collectiveSource = MIXSRC_Thr; @@ -765,7 +765,7 @@ TEST(Trainer, UnpluggedTest) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - setModelDefaults(0); + setModelDefaults(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_FIRST_TRAINER; @@ -782,7 +782,7 @@ TEST_F(MixerTest, flightModeTransition) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - setModelDefaults(0); + setModelDefaults(); g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); g_model.flightModeData[0].fadeIn = 100; g_model.flightModeData[0].fadeOut = 100; @@ -808,7 +808,7 @@ TEST_F(MixerTest, flightModeOverflow) SYSTEM_RESET(); MODEL_RESET(); MIXER_RESET(); - setModelDefaults(0); + setModelDefaults(); g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); g_model.flightModeData[0].fadeIn = 100; g_model.flightModeData[0].fadeOut = 100; diff --git a/radio/src/tests/switches.cpp b/radio/src/tests/switches.cpp index de0a02946..c8cf0388f 100644 --- a/radio/src/tests/switches.cpp +++ b/radio/src/tests/switches.cpp @@ -78,7 +78,7 @@ TEST(getSwitch, nullSW) TEST(getSwitch, inputWithTrim) { MODEL_RESET(); - setModelDefaults(0); + setModelDefaults(); MIXER_RESET(); // g_model.logicalSw[0] = { LS_FUNC_VPOS, MIXSRC_FIRST_INPUT, 0, 0 }; @@ -100,7 +100,7 @@ TEST(evalLogicalSwitches, playFile) { SYSTEM_RESET(); MODEL_RESET(); - setModelDefaults(0); + setModelDefaults(); MIXER_RESET(); extern BitField<(MAX_LOGICAL_SWITCHES * 2/*on, off*/)> sdAvailableLogicalSwitchAudioFiles; From 11621cf736bb1d3b49f08fe7cb7d2c8fdc51dd1d Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 18 Oct 2021 21:15:52 +0200 Subject: [PATCH 097/110] Added support for EXT3 / EXT4 --- radio/src/dataconstants.h | 2 -- radio/src/datastructs.h | 9 ++++++-- radio/src/opentx.cpp | 12 ----------- .../src/storage/yaml/yaml_datastructs_x10.cpp | 8 ++++--- .../common/arm/stm32/stm32_hal_adc.cpp | 2 -- radio/src/targets/horus/CMakeLists.txt | 9 ++++---- radio/src/targets/horus/board.h | 21 +++++++------------ radio/src/targets/horus/hal.h | 17 +++++++-------- radio/src/translations/untranslated.h | 6 +----- 9 files changed, 33 insertions(+), 53 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index de960f1de..87a3eaeee 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -603,10 +603,8 @@ enum MixSources { #if defined(PCBX10) MIXSRC_EXT1, LUA_EXPORT("ext1", "Ext 1") MIXSRC_EXT2, LUA_EXPORT("ext2", "Ext 2") -#if defined(FLYSKY_HALL_STICKS) && defined(FLYSKY_HALL_STICKS_EXT3_EXT4) MIXSRC_EXT3, LUA_EXPORT("ext3", "Ext 3") MIXSRC_EXT4, LUA_EXPORT("ext4", "Ext 4") -#endif #endif MIXSRC_FIRST_SLIDER SKIP, #if defined(PCBX12S) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 3ba00cc31..6d774e64d 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -131,8 +131,13 @@ static inline void check_struct() CHKSIZE(RadioData, 899); CHKSIZE(ModelData, 6604); #elif defined(PCBHORUS) - CHKSIZE(RadioData, 902); - CHKSIZE(ModelData, 11020); + #if defined(PCBX10) + CHKSIZE(RadioData, 920); + CHKSIZE(ModelData, 11022); + #else + CHKSIZE(RadioData, 902); + CHKSIZE(ModelData, 11020); + #endif #endif #undef CHKSIZE diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 3b917919d..7f2c7359e 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1070,19 +1070,7 @@ void getADC() if (x < 4) { v = get_flysky_hall_adc_value(x) >> (1 - ANALOG_SCALE); } else { - #if defined(FLYSKY_HALL_STICKS_EXT3_EXT4) - switch (x) { - case EXT3: - case EXT4: - v = getAnalogValue(x - 7) >> (1 - ANALOG_SCALE); - break; - default: - v = getAnalogValue(x) >> (1 - ANALOG_SCALE); - break; - } - #else v = getAnalogValue(x) >> (1 - ANALOG_SCALE); - #endif } #else v = getAnalogValue(x) >> (1 - ANALOG_SCALE); diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 0645456fa..edfb07dc6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -114,6 +114,8 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_S2, "S2" }, { MIXSRC_EXT1, "EXT1" }, { MIXSRC_EXT2, "EXT2" }, + { MIXSRC_EXT3, "EXT3" }, + { MIXSRC_EXT4, "EXT4" }, { MIXSRC_LS, "LS" }, { MIXSRC_RS, "RS" }, { MIXSRC_MOUSE1, "MOUSE1" }, @@ -380,7 +382,7 @@ static const struct YamlNode struct_OpenTxTheme__PersistentData[] = { static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "version", 8 ), YAML_PADDING( 16 ), - YAML_ARRAY("calib", 48, 15, struct_CalibData, NULL), + YAML_ARRAY("calib", 48, 17, struct_CalibData, NULL), YAML_PADDING( 16 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), @@ -446,7 +448,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), YAML_PADDING( 240 ), - YAML_PADDING( 312 ), + YAML_PADDING( 360 ), YAML_STRING("currModelFilename", 17), YAML_PADDING( 1 ), YAML_UNSIGNED( "blOffBright", 7 ), @@ -872,7 +874,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("scriptsData", 192, 9, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), YAML_UNSIGNED( "potsWarnEnabled", 8 ), - YAML_ARRAY("potsWarnPosition", 8, 9, struct_signed_8, NULL), + YAML_ARRAY("potsWarnPosition", 8, 11, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_ARRAY("screenData", 6800, 5, struct_CustomScreenData, NULL), YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL), diff --git a/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp b/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp index 59c3081c8..f1b0aa2f5 100644 --- a/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp @@ -86,10 +86,8 @@ stm32_hal_adc_channel ADC_MAIN_channels[] = { { ADC_CHANNEL_POT3, ADC_SAMPTIME }, { ADC_CHANNEL_EXT1, ADC_SAMPTIME }, { ADC_CHANNEL_EXT2, ADC_SAMPTIME }, -#if defined(FLYSKY_HALL_STICKS_EXT3_EXT4) { ADC_CHANNEL_EXT3, ADC_SAMPTIME }, { ADC_CHANNEL_EXT4, ADC_SAMPTIME }, -#endif { ADC_CHANNEL_SLIDER1, ADC_SAMPTIME }, { ADC_CHANNEL_SLIDER2, ADC_SAMPTIME }, { ADC_CHANNEL_BATT, ADC_SAMPTIME } diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 3f8996207..62a55eec1 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -194,10 +194,11 @@ if(FLYSKY_HALL_STICKS) add_definitions(-DFLYSKY_HALL_STICKS_REVERSE) set(FLYSKY_HALL_STICKS_DRIVER flyskyHallStick_driver.cpp) - option(FLYSKY_HALL_STICKS_EXT3_EXT4 "Additional EXT3 & EXT4 inputs for FlySky Hall Sticks" OFF) - if(FLYSKY_HALL_STICKS_EXT3_EXT4) - add_definitions(-DFLYSKY_HALL_STICKS_EXT3_EXT4) - endif() + # option(FLYSKY_HALL_STICKS_EXT3_EXT4 + # "Additional EXT3 & EXT4 inputs for FlySky Hall Sticks" OFF) + # if(FLYSKY_HALL_STICKS_EXT3_EXT4) + # add_definitions(-DFLYSKY_HALL_STICKS_EXT3_EXT4) + # endif() endif() if(IMU_LSM6DS33) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index ca8839f80..5d7fc97ce 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -355,17 +355,14 @@ void watchdogInit(unsigned int duration); // ADC driver #if defined(PCBX10) - #if defined(FLYSKY_HALL_STICKS_EXT3_EXT4) - #define NUM_POTS 7 - #else - #define NUM_POTS 5 - #endif + #define NUM_POTS 7 + #define STORAGE_NUM_POTS 7 #else -#define NUM_POTS 3 + #define NUM_POTS 3 + #define STORAGE_NUM_POTS 5 #endif #define NUM_XPOTS NUM_POTS -#define STORAGE_NUM_POTS 5 #if defined(PCBX10) #define NUM_SLIDERS 2 @@ -393,8 +390,6 @@ enum Analogs { #if defined(PCBX10) EXT1, EXT2, -#endif -#if defined(FLYSKY_HALL_STICKS_EXT3_EXT4) EXT3, EXT4, #endif @@ -440,7 +435,7 @@ enum Analogs { #if !defined(PCBX12S) // ext are used by mouse on X12S #define HARDWARE_EXT1 #define HARDWARE_EXT2 - #if defined(FLYSKY_HALL_STICKS_EXT3_EXT4) + #if defined(FLYSKY_HALL_STICKS) #define HARDWARE_EXT3 #define HARDWARE_EXT4 #endif @@ -464,10 +459,8 @@ enum CalibratedAnalogs { #else CALIBRATED_POT_EXT1, CALIBRATED_POT_EXT2, - #if defined(FLYSKY_HALL_STICKS_EXT3_EXT4) - CALIBRATED_POT_EXT3, - CALIBRATED_POT_EXT4, - #endif + CALIBRATED_POT_EXT3, + CALIBRATED_POT_EXT4, CALIBRATED_SLIDER_REAR_LEFT, CALIBRATED_SLIDER_REAR_RIGHT, #endif diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index e48df0660..3bad7ebee 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -283,15 +283,16 @@ #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph (RCC_APB1Periph_TIM5) #define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) - #if !defined(FLYSKY_HALL_STICKS) + // #if !defined(FLYSKY_HALL_STICKS) + // this does not seem to be used anywhere... #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_0 // PA.00 #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_1 // PA.01 #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_2 // PA.02 #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_3 // PA.03 - #elif defined(FLYSKY_HALL_STICKS_EXT3_EXT4) - #define ADC_GPIO_PIN_EXT3 GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_EXT4 GPIO_Pin_3 // PA.03 - #endif + // #elif defined(FLYSKY_HALL_STICKS_EXT3_EXT4) + // #define ADC_GPIO_PIN_EXT3 GPIO_Pin_2 // PA.02 + // #define ADC_GPIO_PIN_EXT4 GPIO_Pin_3 // PA.03 + // #endif #define ADC_GPIO_PIN_POT1 GPIO_Pin_0 // PC.00 #define ADC_GPIO_PIN_POT2 GPIO_Pin_1 // PC.01 #define ADC_GPIO_PIN_POT3 GPIO_Pin_2 // PC.02 @@ -329,10 +330,8 @@ #define ADC_CHANNEL_BATT ADC_Channel_5 // ADC3_IN5 #define ADC_CHANNEL_EXT1 ADC_Channel_6 // ADC3_IN6 #define ADC_CHANNEL_EXT2 ADC_Channel_7 // ADC3_IN7 -#if (defined(RADIO_TX16S) && defined(FLYSKY_HALL_STICKS)) - #define ADC_CHANNEL_EXT3 ADC_Channel_2 // ADC3_IN2 - #define ADC_CHANNEL_EXT4 ADC_Channel_3 // ADC3_IN3 -#endif + #define ADC_CHANNEL_EXT3 ADC_Channel_2 // ADC3_IN2: same as RH + #define ADC_CHANNEL_EXT4 ADC_Channel_3 // ADC3_IN3: same as RV #define ADC_MAIN ADC3 #define ADC_EXT ADC1 #define ADC_SAMPTIME 3 diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 2a4c017e9..2c30555a9 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -32,11 +32,7 @@ #define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"6P\0" STR_CHAR_POT"S2\0" STR_CHAR_TRIM "L1\0" STR_CHAR_TRIM "L2\0" STR_CHAR_SLIDER"LS\0" STR_CHAR_SLIDER"RS\0" STR_CHAR_POT"JSx" STR_CHAR_POT"JSy" #define TR_SW_VSRCRAW STR_CHAR_SWITCH"SA\0" STR_CHAR_SWITCH"SB\0" STR_CHAR_SWITCH"SC\0" STR_CHAR_SWITCH"SD\0" STR_CHAR_SWITCH"SE\0" STR_CHAR_SWITCH"SF\0" STR_CHAR_SWITCH"SG\0" STR_CHAR_SWITCH"SH\0" STR_CHAR_SWITCH"SI\0" STR_CHAR_SWITCH"SJ\0" #elif defined(PCBX10) - #if defined (FLYSKY_HALL_STICKS_EXT3_EXT4) - #define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"6P\0" STR_CHAR_POT"S2\0" STR_CHAR_POT"EX1" STR_CHAR_POT"EX2" STR_CHAR_POT"EX3" STR_CHAR_POT"EX4" STR_CHAR_SLIDER"LS\0" STR_CHAR_SLIDER"RS\0" STR_CHAR_POT"JSx" STR_CHAR_POT"JSy" - #else - #define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"6P\0" STR_CHAR_POT"S2\0" STR_CHAR_POT"EX1" STR_CHAR_POT"EX2" STR_CHAR_SLIDER"LS\0" STR_CHAR_SLIDER"RS\0" STR_CHAR_POT"JSx" STR_CHAR_POT"JSy" - #endif + #define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"6P\0" STR_CHAR_POT"S2\0" STR_CHAR_POT"EX1" STR_CHAR_POT"EX2" STR_CHAR_POT"EX3" STR_CHAR_POT"EX4" STR_CHAR_SLIDER"LS\0" STR_CHAR_SLIDER"RS\0" STR_CHAR_POT"JSx" STR_CHAR_POT"JSy" #define TR_SW_VSRCRAW STR_CHAR_SWITCH"SA\0" STR_CHAR_SWITCH"SB\0" STR_CHAR_SWITCH"SC\0" STR_CHAR_SWITCH"SD\0" STR_CHAR_SWITCH"SE\0" STR_CHAR_SWITCH"SF\0" STR_CHAR_SWITCH"SG\0" STR_CHAR_SWITCH"SH\0" STR_CHAR_SWITCH"SI\0" STR_CHAR_SWITCH"SJ\0" #elif defined(PCBX9E) #define TR_POTS_VSRCRAW STR_CHAR_POT"F1\0" STR_CHAR_POT"F2\0" STR_CHAR_POT"F3\0" STR_CHAR_POT"F4\0" STR_CHAR_SLIDER"S1\0" STR_CHAR_SLIDER"S2\0" STR_CHAR_SLIDER"LS\0" STR_CHAR_SLIDER"RS\0" From c09640b95039e5dbd8189ad5b64880489b5174d6 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 29 Oct 2021 12:10:55 +0200 Subject: [PATCH 098/110] Fix pots/sliders direction (EX3 & EX4 missing) --- radio/src/hal/adc_driver.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/hal/adc_driver.cpp b/radio/src/hal/adc_driver.cpp index e17d52184..a002140c5 100644 --- a/radio/src/hal/adc_driver.cpp +++ b/radio/src/hal/adc_driver.cpp @@ -30,13 +30,13 @@ const etx_hal_adc_driver_t* etx_hal_adc_driver = nullptr; #if defined(SIMU) // not needed #elif defined(RADIO_T16) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 }; #elif defined(RADIO_T18) - const int8_t adcDirection[NUM_ANALOGS] = { 1,-1,1,-1, -1,1,-1, -1,1, -1,1 }; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, -1,1,1,1, -1,1 }; #elif defined(RADIO_TX16S) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 }; #elif defined(PCBX10) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1, 1, -1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1,1,1, 1,-1 }; #elif defined(PCBX9E) const int8_t adcDirection[NUM_ANALOGS] = { #if defined(HORUS_STICKS) From 99b4020b34d0c7897edcc3febb1c8690c92f63b7 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 30 Oct 2021 06:46:24 +0200 Subject: [PATCH 099/110] Fixed yaml_str2uint_ref() --- radio/src/storage/yaml/yaml_bits.cpp | 2 +- radio/src/storage/yaml/yaml_bits.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/storage/yaml/yaml_bits.cpp b/radio/src/storage/yaml/yaml_bits.cpp index 321a830ec..fc77bb98d 100644 --- a/radio/src/storage/yaml/yaml_bits.cpp +++ b/radio/src/storage/yaml/yaml_bits.cpp @@ -142,7 +142,7 @@ int32_t yaml_str2int(const char* val, uint8_t val_len) return yaml_str2int_ref(val, val_len); } -uint32_t yaml_str2uint_ref(const char* val, uint8_t val_len) +uint32_t yaml_str2uint_ref(const char*& val, uint8_t& val_len) { uint32_t i_val = 0; diff --git a/radio/src/storage/yaml/yaml_bits.h b/radio/src/storage/yaml/yaml_bits.h index 14458d1be..de4d6a4e9 100644 --- a/radio/src/storage/yaml/yaml_bits.h +++ b/radio/src/storage/yaml/yaml_bits.h @@ -31,7 +31,7 @@ uint32_t yaml_get_bits(uint8_t* src, uint32_t bit_ofs, uint32_t bits); bool yaml_is_zero(uint8_t* data, uint32_t bitoffs, uint32_t bits); int32_t yaml_str2int_ref(const char*& val, uint8_t& val_len); -uint32_t yaml_str2uint_ref(const char* val, uint8_t val_len); +uint32_t yaml_str2uint_ref(const char*& val, uint8_t& val_len); int32_t yaml_str2int(const char* val, uint8_t val_len); uint32_t yaml_str2uint(const char* val, uint8_t val_len); From a6ab29d58dccde4c56ab0bef14f80c7a86bfcae1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 30 Oct 2021 07:05:20 +0200 Subject: [PATCH 100/110] Added logical switch tests --- radio/src/tests/conversions.cpp | 17 ++++++++++++++--- radio/src/tests/model_25_tx16s.otx | Bin 846 -> 1649 bytes 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index bfd51f3b9..831859572 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -445,9 +445,20 @@ TEST(Conversions, ConversionTX16SFrom25) EXPECT_EQ(ZOV_Color, color_option.type); EXPECT_EQ(0xFFFF, color_option.value.unsignedValue); - char modelname2[] = "model2.bin"; - convertBinModelData(modelname2, 220); - loadModel(modelname2); + char modelname3[] = "model3.bin"; + convertBinModelData(modelname3, 220); + loadModel(modelname3); + + EXPECT_EQ(LS_FUNC_EDGE, g_model.logicalSw[0].func); + EXPECT_EQ(SWSRC_SF2, g_model.logicalSw[0].v1); + EXPECT_EQ(-129, g_model.logicalSw[0].v2); + EXPECT_EQ(-1, g_model.logicalSw[0].v3); + EXPECT_EQ(SWSRC_SF2, g_model.logicalSw[0].andsw); + + EXPECT_EQ(LS_FUNC_VNEG, g_model.logicalSw[1].func); + EXPECT_EQ(MIXSRC_FIRST_INPUT, g_model.logicalSw[1].v1); + EXPECT_EQ(-98, g_model.logicalSw[1].v2); + EXPECT_EQ(SWSRC_NONE, g_model.logicalSw[1].andsw); simuFatfsSetPaths("",""); } diff --git a/radio/src/tests/model_25_tx16s.otx b/radio/src/tests/model_25_tx16s.otx index 88468cee716ab1acb8b48d3c3345a84bda41b32f..4307087b125e22c626fe97b6f6a65e6996cb8a5c 100644 GIT binary patch delta 1071 zcmX@d_L0Xbz?+#xgn@y9gTdD#E_ib+x2-skClAB|3^EKsjxL`5`nmZjsX4`ZB^4#1 zA)E}%4=>gvKE7Bp(MnNLV42|zP6mV-Hs*1`r}aZrA}1EevtPMTlL*8UrzHz7=rZNu zK~h&`95-2zQJww7$(qERQ#F(A8GqKp-0{vjF8IKvC&f)n3=AUL3=D!mcli3dxcUS` z9Ad1Ol$i&1$c7s=i6C5B!Og(P@|BT+0qm8xGXwK41&AE?_b#0K>%fVm8iTH5s%mLk zN7!qmd2W_8C)~F9_;#0(g66hqVK>G!qXq@{n8gJ zFhh7!+RdL6w|)Qre&_P%3*YYDej`r%@8W`=@2ZsEPjX|mFuF3Wd`98<%Gjm9y03&W ze4Dx_bp16Ov5R4OcW(JhY;)I<=;fTWV9$Zz)Pu^6;@uo^0Zo;mf;Q$Kgx<62KQ^0D zeq3-*Q|_gA&zPg@KWzGUFYc)6<@|qoA1=rQTQ(`2_!7gjn;}IfcA{4NHr==9n}yk9wUZI;eHRc5&B zsQHV$$(HwD>x=1p&C-4Lv#t~>9TK-HtqCc)bTV_IAD`uJ2~%;SQf|3u(F=bJ z_B-k^shGyL$LItEd4+8HcIH-VdyK2e-W6ZZYtCH6SR=QQBTzT~#Mi5=i?=L2$Q54P zHY3>d$eho|3jM0Cubo=ba6aZ_cKxp8Lt9%NT(6zga?q61P))96*j||uq8>Lne(t@= zQQEH?HwkEDUM-Ie*f}Y@(^=uHvU21j-H%c0Em!rHdYp~|EI>5V@_gsh za28$8)5{lMz5HR-tN2fU#BN=F5;-f-_T>LF#*^#=ycwC~n6c!o$^J}QpiDIRB9ja! zJjYC4$RsMA2+VhoJXe&Ml9>-l>8uRQz-$Ck%?!#nADE<>nHd=-D>90(0i}Rh2qcw= onQbJ1hC#rRMpIyB!jg%A`mto70B=?{kVY0Dj0EN?CRPv+09M4Rp#T5? delta 329 zcmey!bB@g_z?+#xgn@y9gCVRvI#`_j$a7&J4<{9 From b72428bdbaaf345d34cfeb8b38f201ddf67631bc Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 30 Oct 2021 13:50:09 +0200 Subject: [PATCH 101/110] Improved module data output --- radio/src/datastructs_private.h | 15 +-- radio/src/pulses/modules_constants.h | 2 +- radio/src/pulses/modules_helpers.h | 13 ++- .../conversions/yaml/dataconstants_220.h | 43 +++++++- .../conversions/yaml/yaml_datastructs.cpp | 1 + .../yaml/yaml_datastructs_funcs.cpp | 100 ++++++++++++++++++ .../yaml/yaml_datastructs_nv14.cpp | 23 ++-- .../conversions/yaml/yaml_datastructs_t12.cpp | 23 ++-- .../conversions/yaml/yaml_datastructs_t8.cpp | 23 ++-- .../yaml/yaml_datastructs_tlite.cpp | 23 ++-- .../yaml/yaml_datastructs_tx12.cpp | 23 ++-- .../conversions/yaml/yaml_datastructs_x10.cpp | 23 ++-- .../yaml/yaml_datastructs_x12s.cpp | 23 ++-- .../conversions/yaml/yaml_datastructs_x7.cpp | 23 ++-- .../conversions/yaml/yaml_datastructs_x9d.cpp | 23 ++-- .../conversions/yaml/yaml_datastructs_x9e.cpp | 23 ++-- .../yaml/yaml_datastructs_x9lite.cpp | 23 ++-- .../yaml/yaml_datastructs_x9lites.cpp | 23 ++-- .../yaml/yaml_datastructs_xlite.cpp | 23 ++-- .../yaml/yaml_datastructs_xlites.cpp | 23 ++-- .../storage/yaml/yaml_datastructs_funcs.cpp | 73 +++++++++++++ .../storage/yaml/yaml_datastructs_nv14.cpp | 23 ++-- .../src/storage/yaml/yaml_datastructs_t12.cpp | 23 ++-- .../src/storage/yaml/yaml_datastructs_t8.cpp | 23 ++-- .../storage/yaml/yaml_datastructs_tlite.cpp | 23 ++-- .../storage/yaml/yaml_datastructs_tx12.cpp | 23 ++-- .../src/storage/yaml/yaml_datastructs_x10.cpp | 23 ++-- .../storage/yaml/yaml_datastructs_x12s.cpp | 23 ++-- .../src/storage/yaml/yaml_datastructs_x7.cpp | 23 ++-- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 23 ++-- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 23 ++-- .../storage/yaml/yaml_datastructs_x9lite.cpp | 23 ++-- .../storage/yaml/yaml_datastructs_x9lites.cpp | 23 ++-- .../storage/yaml/yaml_datastructs_xlite.cpp | 23 ++-- .../storage/yaml/yaml_datastructs_xlites.cpp | 23 ++-- 35 files changed, 679 insertions(+), 212 deletions(-) diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 7470aecd1..34ce21de7 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -446,12 +446,13 @@ PACK(struct TrainerModuleData { PACK(struct ModuleData { uint8_t type:4 ENUM(ModuleType); // TODO some refactoring is needed, rfProtocol is only used by DSM2 and MULTI, it could be merged with subType - int8_t rfProtocol:4; + int8_t rfProtocol:4 SKIP; + CUST_ATTR(subType,r_modSubtype,w_modSubtype); uint8_t channelsStart; - int8_t channelsCount; // 0=8 channels - uint8_t failsafeMode:4; // only 3 bits used - uint8_t subType:3; - uint8_t invertedSerial:1; // telemetry serial inverted from standard + int8_t channelsCount CUST(r_channelsCount,w_channelsCount); // 0=8 channels + uint8_t failsafeMode:4 ENUM(FailsafeModes); // only 3 bits used + uint8_t subType:3 SKIP; + uint8_t invertedSerial:1 SKIP; // telemetry serial inverted from standard union { uint8_t raw[PXX2_MAX_RECEIVERS_PER_MODULE * PXX2_LEN_RX_NAME + 1]; @@ -462,10 +463,10 @@ PACK(struct ModuleData { int8_t frameLength; } ppm); NOBACKUP(struct { - uint8_t rfProtocolExtra:3; + uint8_t rfProtocolExtra:3 SKIP; uint8_t disableTelemetry:1; uint8_t disableMapping:1; - uint8_t customProto:1; + uint8_t customProto:1 SKIP; uint8_t autoBindMode:1; uint8_t lowPowerMode:1; int8_t optionValue; diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index 2c03ca855..45c5ac1f2 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -234,7 +234,7 @@ enum FailsafeModes { FAILSAFE_CUSTOM, FAILSAFE_NOPULSES, FAILSAFE_RECEIVER, - FAILSAFE_LAST = FAILSAFE_RECEIVER + FAILSAFE_LAST SKIP = FAILSAFE_RECEIVER }; enum AntennaModes { diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index c34a104c9..438308ec8 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -193,14 +193,20 @@ inline bool isModuleXJTD16(uint8_t idx) return isModuleXJT(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_PXX1_ACCST_D16; } +inline bool isModuleTypeISRM(uint8_t type) +{ + return type == MODULE_TYPE_ISRM_PXX2; +} + inline bool isModuleISRM(uint8_t idx) { - return g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2; + return isModuleTypeISRM(g_model.moduleData[idx].type); } inline bool isModuleISRMD16(uint8_t idx) { - return g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2 && g_model.moduleData[idx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16; + return isModuleISRM(idx) && + g_model.moduleData[idx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16; } inline bool isModuleD16(uint8_t idx) @@ -210,7 +216,8 @@ inline bool isModuleD16(uint8_t idx) inline bool isModuleISRMAccess(uint8_t idx) { - return g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2 && g_model.moduleData[idx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCESS; + return isModuleISRM(idx) && + g_model.moduleData[idx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCESS; } #if defined(CROSSFIRE) diff --git a/radio/src/storage/conversions/yaml/dataconstants_220.h b/radio/src/storage/conversions/yaml/dataconstants_220.h index 1d9945bb6..26008d4c7 100644 --- a/radio/src/storage/conversions/yaml/dataconstants_220.h +++ b/radio/src/storage/conversions/yaml/dataconstants_220.h @@ -1009,6 +1009,44 @@ enum ModuleType { MODULE_TYPE_MAX = MODULE_TYPE_COUNT - 1 }; +enum ModuleSubtypePXX1 { + MODULE_SUBTYPE_PXX1_OFF = -1, + MODULE_SUBTYPE_PXX1_ACCST_D16, + MODULE_SUBTYPE_PXX1_ACCST_D8, + MODULE_SUBTYPE_PXX1_ACCST_LR12, + MODULE_SUBTYPE_PXX1_LAST = MODULE_SUBTYPE_PXX1_ACCST_LR12 +}; + +enum ModuleSubtypeISRM_PXX2 { + MODULE_SUBTYPE_ISRM_PXX2_ACCESS, + MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, + MODULE_SUBTYPE_ISRM_PXX2_ACCST_LR12, + MODULE_SUBTYPE_ISRM_PXX2_ACCST_D8, + MODULE_SUBTYPE_ISRM_PXX2_LAST = MODULE_SUBTYPE_ISRM_PXX2_ACCST_D8 +}; + +enum ModuleSubtypeR9M { + MODULE_SUBTYPE_R9M_FCC, + MODULE_SUBTYPE_R9M_EU, + MODULE_SUBTYPE_R9M_EUPLUS, + MODULE_SUBTYPE_R9M_AUPLUS, + MODULE_SUBTYPE_R9M_LAST=MODULE_SUBTYPE_R9M_AUPLUS +}; + +enum ModuleSubtypeFlysky { + FLYSKY_SUBTYPE_AFHDS3=0, + FLYSKY_SUBTYPE_AFHDS2A +}; + +enum FailsafeModes { + FAILSAFE_NOT_SET, + FAILSAFE_HOLD, + FAILSAFE_CUSTOM, + FAILSAFE_NOPULSES, + FAILSAFE_RECEIVER, + FAILSAFE_LAST SKIP = FAILSAFE_RECEIVER +}; + enum AntennaModes { ANTENNA_MODE_INTERNAL = -2, ANTENNA_MODE_ASK = -1, @@ -1019,11 +1057,6 @@ enum AntennaModes { }; // from opentx_constants.h -enum ModuleSubtypeFlysky { - FLYSKY_SUBTYPE_AFHDS3=0, - FLYSKY_SUBTYPE_AFHDS2A -}; - enum SwitchConfig { SWITCH_NONE, SWITCH_TOGGLE, diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp index ba1c834fe..37ef012ae 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs.cpp @@ -31,6 +31,7 @@ #include "../../../strhelpers.h" #include "../../../switches.h" #include "../../../timers.h" +#include "../../../pulses/multi.h" namespace yaml_conv_220 { diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 823901ecb..2b50b719a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -920,3 +920,103 @@ bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opa auto src = throttleSource2Source(val); return w_mixSrcRaw(nullptr, src, wf, opaque); } + +// Force external linkage +extern const struct YamlIdStr enum_XJT_Subtypes[]; +extern const struct YamlIdStr enum_ISRM_Subtypes[]; +extern const struct YamlIdStr enum_R9M_Subtypes[]; +extern const struct YamlIdStr enum_FLYSKY_Subtypes[]; +extern const struct YamlIdStr enum_DSM2_Subtypes[]; + +const struct YamlIdStr enum_XJT_Subtypes[] = { + { MODULE_SUBTYPE_PXX1_ACCST_D16, "D16" }, + { MODULE_SUBTYPE_PXX1_ACCST_D8, "D8" }, + { MODULE_SUBTYPE_PXX1_ACCST_LR12, "LR12" }, + { 0, NULL } +}; + +const struct YamlIdStr enum_ISRM_Subtypes[] = { + { MODULE_SUBTYPE_ISRM_PXX2_ACCESS, "ACCESS" }, + { MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, "D16" }, + // unused !!! + // { MODULE_SUBTYPE_ISRM_PXX2_ACCST_LR12, "LR12" }, + // { MODULE_SUBTYPE_ISRM_PXX2_ACCST_D8, "D8" }, + { 0, NULL } +}; + +const struct YamlIdStr enum_R9M_Subtypes[] = { + { MODULE_SUBTYPE_R9M_FCC, "FCC" }, + { MODULE_SUBTYPE_R9M_EU, "EU" }, + { MODULE_SUBTYPE_R9M_EUPLUS, "EUPLUS" }, + { MODULE_SUBTYPE_R9M_AUPLUS, "AUPLUS" }, + { 0, NULL } +}; + +const struct YamlIdStr enum_FLYSKY_Subtypes[] = { + { FLYSKY_SUBTYPE_AFHDS3, "AFHDS3" }, + { FLYSKY_SUBTYPE_AFHDS2A, "AFHDS2A" }, + { 0, NULL } +}; + +const struct YamlIdStr enum_DSM2_Subtypes[] = { + { 0, "LP45" }, + { 1, "DSM2" }, + { 3, "DSMX" }, + { 0, NULL } +}; + +#define r_modSubtype nullptr + +bool w_modSubtype(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + // rfProtocol + subType, depending on the module + data += bitoffs >> 3UL; + data -= offsetof(ModuleData, channelsStart); + + const char* str = nullptr; + auto md = reinterpret_cast(data); + int32_t val = md->subType; + if (md->type == MODULE_TYPE_XJT_PXX1 || md->type == MODULE_TYPE_XJT_LITE_PXX2) { + str = yaml_output_enum(val, enum_XJT_Subtypes); + } else if (md->type == MODULE_TYPE_ISRM_PXX2) { + 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) { + // Use type/subType by the book (see MPM documentation) + // TODO: remove that crappy translation and use the MPM + // data as-is (no FrSky special casing) + int type = md->getMultiProtocol() + 1; + int subtype = val; + convertOtxProtocolToMulti(&type, &subtype); + + // output "[type],[subtype]" + str = yaml_unsigned2str(type); + if (!wf(opaque, str, strlen(str))) return false; + if (!wf(opaque, ",", 1)) return false; + str = yaml_unsigned2str(subtype); + + } else if (md->type == MODULE_TYPE_DSM2) { + str = yaml_output_enum(md->rfProtocol, enum_DSM2_Subtypes); + } else { + str = yaml_unsigned2str(val); + } + + if (str && !wf(opaque, str, strlen(str))) + return false; + + return true; +} + +#define r_channelsCount nullptr + +bool w_channelsCount(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + // offset 8 + int32_t sval = yaml_to_signed(val, node->size) + 8; + const char* str = yaml_signed2str(sval); + return wf(opaque,str,strlen(str)); +} diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp index 1a29bffd9..940b5a3da 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_nv14.cpp @@ -255,6 +255,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -607,10 +615,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -679,12 +687,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp index fb4c187ed..aa600ddd4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t12.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp index fb4c187ed..aa600ddd4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_t8.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp index fb4c187ed..aa600ddd4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tlite.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp index 4ba734556..8603219d8 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_tx12.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp index 0645456fa..f7d199a5c 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x10.cpp @@ -276,6 +276,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -624,10 +632,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -696,12 +704,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp index 95321db53..82c6bad7d 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x12s.cpp @@ -276,6 +276,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -624,10 +632,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -696,12 +704,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp index fb4c187ed..aa600ddd4 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x7.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp index 345a01600..e5a64dadb 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9d.cpp @@ -252,6 +252,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -580,10 +588,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -652,12 +660,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp index b1b82a9f4..23fdb4339 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9e.cpp @@ -291,6 +291,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -619,10 +627,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -691,12 +699,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp index 2c71c10ea..bb18434b3 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lite.cpp @@ -232,6 +232,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -557,10 +565,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -629,12 +637,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp index 818015977..56641780a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_x9lites.cpp @@ -240,6 +240,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -567,10 +575,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -639,12 +647,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp index a770fcda7..ba53ebcc7 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlite.cpp @@ -237,6 +237,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -564,10 +572,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -636,12 +644,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp index ee6855638..491f7e014 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_xlites.cpp @@ -239,6 +239,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -568,10 +576,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -640,12 +648,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 8661ddb38..8ae0fd207 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -23,6 +23,8 @@ #include "yaml_bits.h" #include "yaml_tree_walker.h" +#include "pulses/multi.h" + // Use definitions from v220 conversions as long as nothing changes namespace yaml_conv_220 { @@ -79,6 +81,19 @@ namespace yaml_conv_220 { bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + + extern const struct YamlIdStr enum_XJT_Subtypes[]; + extern const struct YamlIdStr enum_ISRM_Subtypes[]; + extern const struct YamlIdStr enum_R9M_Subtypes[]; + extern const struct YamlIdStr enum_FLYSKY_Subtypes[]; + extern const struct YamlIdStr enum_DSM2_Subtypes[]; + + bool w_modSubtype(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque); + + bool w_channelsCount(const YamlNode* node, uint32_t val, yaml_writer_func wf, + void* opaque); + }; // @@ -1199,3 +1214,61 @@ static bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, { return yaml_conv_220::w_thrSrc(node, val, wf, opaque); } + +static void r_modSubtype(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) +{ + data += bitoffs >> 3UL; + data -= offsetof(ModuleData, channelsStart); + + auto md = reinterpret_cast(data); + if (isModuleTypeXJT(md->type)) { + md->subType = yaml_parse_enum(yaml_conv_220::enum_XJT_Subtypes, val, val_len); + } else if (isModuleTypeISRM(md->type)) { + md->subType = yaml_parse_enum(yaml_conv_220::enum_ISRM_Subtypes, val, val_len); + } else if (isModuleTypeR9MNonAccess(md->type)) { + md->subType = yaml_parse_enum(yaml_conv_220::enum_R9M_Subtypes, val, val_len); + } else if (md->type == MODULE_TYPE_FLYSKY) { + md->subType = yaml_parse_enum(yaml_conv_220::enum_FLYSKY_Subtypes, val, val_len); + } else if (md->type == MODULE_TYPE_MULTIMODULE) { + // Read type/subType by the book (see MPM documentation) + // TODO: remove that crappy translation and use the MPM + // data as-is (no FrSky special casing) + + // read "[type],[subtype]" + const char* sep = (const char *)memchr(val, ',', val_len); + uint8_t l_sep = sep ? sep - val : val_len; + + int type = yaml_str2uint(val, l_sep); + val += l_sep; val_len -= l_sep; + if (!val_len || val[0] != '.') return; + val++; val_len--; + int subtype = yaml_str2uint(val, val_len); + + // convert to OTX format and write to vars + convertMultiProtocolToOtx(&type, &subtype); + md->setMultiProtocol(type); + md->subType = subtype; + + } else if (md->type == MODULE_TYPE_DSM2) { + md->rfProtocol = yaml_parse_enum(yaml_conv_220::enum_DSM2_Subtypes, val, val_len); + } else { + md->subType = yaml_str2uint(val, val_len); + } +} + +static bool w_modSubtype(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + return yaml_conv_220::w_modSubtype(user, data, bitoffs, wf, opaque); +} + +static uint32_t r_channelsCount(const YamlNode* node, const char* val, uint8_t val_len) +{ + return yaml_str2int(val,val_len) - 8; +} + +bool w_channelsCount(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) +{ + return yaml_conv_220::w_channelsCount(node, val, wf, opaque); +} diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 1a29bffd9..940b5a3da 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -255,6 +255,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -607,10 +615,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -679,12 +687,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index fb4c187ed..aa600ddd4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index fb4c187ed..aa600ddd4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index fb4c187ed..aa600ddd4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 4ba734556..8603219d8 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index edfb07dc6..44fa71a05 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -278,6 +278,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -626,10 +634,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -698,12 +706,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 95321db53..82c6bad7d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -276,6 +276,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -624,10 +632,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -696,12 +704,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index fb4c187ed..aa600ddd4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -245,6 +245,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -572,10 +580,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -644,12 +652,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 345a01600..e5a64dadb 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -252,6 +252,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -580,10 +588,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -652,12 +660,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index b1b82a9f4..23fdb4339 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -291,6 +291,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -619,10 +627,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -691,12 +699,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 2c71c10ea..bb18434b3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -232,6 +232,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -557,10 +565,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -629,12 +637,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 818015977..56641780a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -240,6 +240,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -567,10 +575,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -639,12 +647,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index a770fcda7..ba53ebcc7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -237,6 +237,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -564,10 +572,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -636,12 +644,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index ee6855638..491f7e014 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -239,6 +239,14 @@ const struct YamlIdStr enum_ModuleType[] = { { MODULE_TYPE_MAX, "TYPE_MAX" }, { 0, NULL } }; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; const struct YamlIdStr enum_TelemetrySensorFormula[] = { { TELEM_FORMULA_ADD, "FORMULA_ADD" }, { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, @@ -568,10 +576,10 @@ static const struct YamlNode struct_anonymous_5[] = { YAML_END }; static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "rfProtocolExtra", 3 ), + YAML_PADDING( 3 ), YAML_UNSIGNED( "disableTelemetry", 1 ), YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "customProto", 1 ), + YAML_PADDING( 1 ), YAML_UNSIGNED( "autoBindMode", 1 ), YAML_UNSIGNED( "lowPowerMode", 1 ), YAML_SIGNED( "optionValue", 8 ), @@ -640,12 +648,13 @@ static const struct YamlNode union_anonymous_4_elmts[] = { static const struct YamlNode struct_ModuleData[] = { YAML_IDX, YAML_ENUM("type", 4, enum_ModuleType), - YAML_SIGNED( "rfProtocol", 4 ), + YAML_PADDING( 4 ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_UNSIGNED( "failsafeMode", 4 ), - YAML_UNSIGNED( "subType", 3 ), - YAML_UNSIGNED( "invertedSerial", 1 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), + YAML_PADDING( 3 ), + YAML_PADDING( 1 ), YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), YAML_END }; From 88a9b1c6d91d75e0eb7d76e994549ac4ee66f2b0 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 30 Oct 2021 14:41:08 +0200 Subject: [PATCH 102/110] Fixed multi sub proto parsing --- .../storage/yaml/yaml_datastructs_funcs.cpp | 9 +++++---- radio/src/tests/conversions.cpp | 14 +++++++++++--- radio/src/tests/model_25_tx16s.otx | Bin 1649 -> 1444 bytes 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 8ae0fd207..940bd2cae 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -1241,15 +1241,16 @@ static void r_modSubtype(void* user, uint8_t* data, uint32_t bitoffs, int type = yaml_str2uint(val, l_sep); val += l_sep; val_len -= l_sep; - if (!val_len || val[0] != '.') return; + if (!val_len || val[0] != ',') return; val++; val_len--; int subtype = yaml_str2uint(val, val_len); // convert to OTX format and write to vars convertMultiProtocolToOtx(&type, &subtype); - md->setMultiProtocol(type); - md->subType = subtype; - + if (type > 0) { + md->setMultiProtocol(type - 1); + md->subType = subtype; + } } else if (md->type == MODULE_TYPE_DSM2) { md->rfProtocol = yaml_parse_enum(yaml_conv_220::enum_DSM2_Subtypes, val, val_len); } else { diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 831859572..530ae81b8 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -434,6 +434,14 @@ TEST(Conversions, ConversionTX16SFrom25) EXPECT_STRNEQ("Model", g_model.header.name); + EXPECT_EQ(MODULE_SUBTYPE_MULTI_FRSKY, g_model.moduleData[0].getMultiProtocol()); + EXPECT_EQ(MM_RF_FRSKY_SUBTYPE_D8_CLONED, g_model.moduleData[0].subType); + EXPECT_EQ(-12, g_model.moduleData[0].multi.optionValue); + + EXPECT_EQ(MODULE_TYPE_XJT_PXX1, g_model.moduleData[1].type); + EXPECT_EQ(MODULE_SUBTYPE_PXX1_ACCST_LR12, g_model.moduleData[1].subType); + EXPECT_EQ(4, g_model.moduleData[1].channelsCount); // 4 + 8 = 12 + const auto& top_widget = g_model.topbarData.zones[3]; EXPECT_STRNEQ("Value", top_widget.widgetName); @@ -445,9 +453,9 @@ TEST(Conversions, ConversionTX16SFrom25) EXPECT_EQ(ZOV_Color, color_option.type); EXPECT_EQ(0xFFFF, color_option.value.unsignedValue); - char modelname3[] = "model3.bin"; - convertBinModelData(modelname3, 220); - loadModel(modelname3); + char modelname2[] = "model2.bin"; + convertBinModelData(modelname2, 220); + loadModel(modelname2); EXPECT_EQ(LS_FUNC_EDGE, g_model.logicalSw[0].func); EXPECT_EQ(SWSRC_SF2, g_model.logicalSw[0].v1); diff --git a/radio/src/tests/model_25_tx16s.otx b/radio/src/tests/model_25_tx16s.otx index 4307087b125e22c626fe97b6f6a65e6996cb8a5c..2555135b279fff61ba1ba0affe95234ebfde1046 100644 GIT binary patch literal 1444 zcmWIWW@Zs#U|`^2cvKh{>}Bqtkp<-SF*7jm1L+_~7f*lvqQsQUe7&U1ytkLMxf&cK zSROdeKAE&Z(zofXjzlio=0DvWc3qAeelYMqGyTFe&*><8b;H$d@lt88LP{U6eYj-Z zkE#4$dzHVM1h}VPVK}g!6QgaN!4!dcaeaJ!P_{aDp7H(Ou<$bbV z)BQ?c-EwMoTDsI@{x%0DQ6<6I&EImr?7b5Hc(%aZt1lj8mVCJ4_@~Zk$N#_Y5^Z;Q zZ=OFp@9mFO)7%Od&D>-rc2YY{bpMRGQ@Uqav!|gE1I7?U2M|P*y*uLdpm8K_#JxK`Ry8?tL08h? z^OEMJtj1-&KWk6CJNMn%zRtS+=3M*NY-hiGKXml=>CQd=uS5k_1k8<3KPLPBD%;ih zQ>U?QSo?JDEjQByLEX2vdf&D@WjoS%@WuiUtq1egdC5JD(^0D2!}%@M_fyR~)q9?C z$JQIapQc{PdVN{__V+s{P3PUdO>5uWI^Oz?$;?d(CkhMYCS3MnIrV1Jq#p5{6O($M zm#ExHUvtUXNPuOgPu;U!!54%V-(^c_+9_~<=juK088UL_ew`@x#eK_%8FE(EM_&lm zJNav$`RR3hEt9s0tEkaKpV+AN=gpg@%gz;DweJ4RG}cYe${8Hn9$c@xY3Jk~wB?`t zF*!L)gZEC|`<@vu{kEOmK<5(Q+`590FB?t;20q|P4y`?LMW*6K$N>)jBK{&Vh0Gah zPm*FZH6vFZ3r-h)$1Q4jX3@pfmyKMxkJu!MEppp8;q}Vmu*|CstP7XvST4^yX}Nsu z-Z@*Y>rVA)@ON72y)6CkRLONpr_JuR=^fp9$%yZ+-#$&H#cG^VkKS$ZmpYrnaEmAW zRMLyz3%Hl+3H3WfxwvgonIW9J(`zz&cIbvjF`8|!Eo_%gI~gtT%F1Eh*~R-F$Z!d+ znc!>A6SOqtJ9o?EwbcenVQb?)CYJ1~T=G`yIrIKa;%m4#KIKnQo_3tEe$k|}Dp$Im zoL#s2+ufDQXZ7nJEMj%!OL^a^CH$zB^^qxqqW}vKS!UZP`$bILqNF>&EZqO^>Q(y=cLbbmYR?|D|U@98Pl zi)~e&Gb;s_3C`dI8o~%l)<6x|izT205W8Z&o&t3Kk&z38be2)i5vs07-a6HUIzs literal 1649 zcmWIWW@Zs#U|`^2@U@5w-WJSSZhlH?PO)A|MM-D~Cj;}t zi#3Ulfw;7Sn}Lz#DlwI9^XDz)85$j;D5b3Tbjgj z%cX`(HJ2)~o_La!kRZg$y>HLi0uH6Qvz9A3cyI4%n#lMs+}OZFDM;2;!Q5We^mu^2 zrZK=ag35JA$A>558 zPSzymoWgM9+nfH`hYTc+e^md+$jZNIvi^bD>b8}kHymeZI4`@s_Ck}>(nmr!?zO#l zjqlA*dc#_Bt@4CeYa}<{&pNM@ljS{UMJslGiLSoA-sIOr`IbqV@l$3`Ey@c!yE}62 zgtuu73>GI&dtchZ7rT{P?WF!`zIm$OjV0d40bR<#FriKBPo2cK7Pu zKegjYF^N63_~ZJ$vJB#tAMPnHjy}BX&HBJypN}rp?o0cekoom)^yK}L5_=7PmBygwbO4?aaXZO93Ls{k;q4{yK0Xsm7q|n5tTu))Dp^X`Y)U%?YjIK;8pHX|$8n zom>7A+uU^|dO0U8*mEE_^`LU2csEB}KvQL?ppE$lq4%u%kIiP39~a!ylzZvjGv??I zoBrL4J8F74|DWE63o^l$O$sNz#PIB9NYN40*zD|O5VuLu+a&J7#DW7i7R^pj;3%@Q zJn?nef`u1fwp5m?=1rSI%6UrL#|!8SXl2{vvO(<^2~sLKAwG z>|5s)KU??4WZLX|tJj^9GQIuw+-A0$WxErnx6Sdb<2`jwGf%}+@?YYcCnqLWhTr;P zI$yJNpZ%;Wg-VCStx9V`N-mwuoao1Axm&_i+^CdWE?V@$AA|jldQ2*&vF$NB0YP3N zo4%d7)!H88YO;65*Ylb)7cthzZR7~ljX&}AD(m7cOAm5|7q`s_Ha#-u^RYs|s_Sc~ zmNcA?IhnmH`Owx@2iI$7wH!3%G*pu-8MarZgs8_&j-PvPa+LP##!UhmnODnW19nad z?{ro;tE?RPNcUsZy30@QmGSmeEKoVSZOy((r=Q3clnN`He-;>D$k$q6c5>a@>Xkv8 zzVo+C&9zYfKC>q6LW?W^U1SkhE0LwUrC5<2!W{JoODG|}qHL|Ig1s}vz zkaFt9L00^P&J3i2=jFI{C@ From 4a5a0be38c7193a535b0fd9fdd7a5cb71f41e3bf Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 31 Oct 2021 07:14:37 +0100 Subject: [PATCH 103/110] Removed on-the-fly model conversions This makes no sense for YAML model files, only for BIN models (when YAML is not the format of choice). --- radio/src/gui/colorlcd/model_select.cpp | 17 ++++++++++++++--- radio/src/storage/sdcard_common.cpp | 14 ++------------ radio/src/storage/sdcard_common.h | 2 +- radio/src/storage/sdcard_raw.cpp | 24 ++++++++++++++++++++++-- radio/src/storage/sdcard_raw.h | 14 ++++++++++---- radio/src/storage/sdcard_yaml.cpp | 20 ++++++++------------ 6 files changed, 57 insertions(+), 34 deletions(-) diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index d64aad71e..d87f9998a 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -59,7 +59,9 @@ class ModelButton : public Button void load() { +#if defined(SDCARD_RAW) uint8_t version; +#endif PACK(struct { ModelHeader header; @@ -71,17 +73,25 @@ class ModelButton : public Button if (strncmp(modelCell->modelFilename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME) == 0) { memcpy(&partialModel.header, &g_model.header, sizeof(partialModel)); +#if defined(SDCARD_RAW) version = EEPROM_VER; +#endif } else { +#if defined(SDCARD_RAW) error = - readModel(modelCell->modelFilename, (uint8_t *)&partialModel.header, - sizeof(partialModel), &version); + readModelBin(modelCell->modelFilename, (uint8_t *)&partialModel.header, + sizeof(partialModel), &version); +#else + error = readModel(modelCell->modelFilename, + (uint8_t *)&partialModel.header, sizeof(partialModel)); +#endif } if (!error) { if (modelCell->modelName[0] == '\0' && partialModel.header.name[0] != '\0') { - + +#if defined(SDCARD_RAW) if (version == 219) { int len = (int)sizeof(partialModel.header.name); char* str = partialModel.header.name; @@ -94,6 +104,7 @@ class ModelButton : public Button str[--len] = '\0'; } } +#endif modelCell->setModelName(partialModel.header.name); } } diff --git a/radio/src/storage/sdcard_common.cpp b/radio/src/storage/sdcard_common.cpp index 74455a71a..595c0812d 100644 --- a/radio/src/storage/sdcard_common.cpp +++ b/radio/src/storage/sdcard_common.cpp @@ -120,12 +120,11 @@ const char * createModel() } #endif -const char * loadModel(char * filename, bool alarms) +const char* loadModel(char* filename, bool alarms) { - uint8_t version; preModelLoad(); - const char * error = readModel(filename, (uint8_t *)&g_model, sizeof(g_model), &version); + const char* error = readModel(filename, (uint8_t*)&g_model, sizeof(g_model)); if (error) { TRACE("loadModel error=%s", error); @@ -139,15 +138,6 @@ const char * loadModel(char * filename, bool alarms) return error; } - // Conversions from EEPROM are done in batch when converting the radio file. - // It is not supported on a model by model base when loaded. -#if defined(STORAGE_CONVERSIONS) && !defined(EEPROM_RLC) - if (version < EEPROM_VER) { - convertBinModelData(filename, version); - } - // TODO: reload model afterwards -#endif - postModelLoad(alarms); return nullptr; } diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index 1a62a0e08..2606fab91 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -56,7 +56,7 @@ const char* writeFileYaml(const char* path, const YamlNode* root_node, uint8_t* void getModelPath(char * path, const char * filename); -const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version); +const char * readModel(const char * filename, uint8_t * buffer, uint32_t size); const char * loadModel(char * filename, bool alarms=true); const char * createModel(); const char * writeModel(); diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index 404bee8d5..34bc56be4 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -133,14 +133,34 @@ const char *loadFileBin(const char *fullpath, uint8_t *data, return nullptr; } -const char * readModelBin(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) +#if defined(SDCARD_RAW) +const char* readModel(const char* filename, uint8_t* buffer, uint32_t size) +{ + uint8_t version = 0; + // Conversions from EEPROM are done in batch when converting the radio file. + // It is not supported on a model by model base when loaded. + const char *error = readModelBin(filename, buffer, size, &version); + if (error) return error; + +#if defined(STORAGE_CONVERSIONS) + if (version < EEPROM_VER) { + convertBinModelData(filename, version); + error = readModelBin(filename, buffer, size, &version); + } +#endif + + return error; +} +#endif + +const char *readModelBin(const char *filename, uint8_t *buffer, uint32_t size, + uint8_t *version) { char path[256]; getModelPath(path, filename); return loadFileBin(path, buffer, size, version); } - const char * loadRadioSettingsBin(const char * path) { uint8_t version; diff --git a/radio/src/storage/sdcard_raw.h b/radio/src/storage/sdcard_raw.h index 09d904a45..78a13ed2a 100644 --- a/radio/src/storage/sdcard_raw.h +++ b/radio/src/storage/sdcard_raw.h @@ -24,19 +24,25 @@ #include "FatFs/ff.h" -#if !defined(SDCARD_YAML) +#if defined(SDCARD_RAW) + #define writeModel writeModelBin #define loadRadioSettings loadRadioSettingsBin #define writeGeneralSettings writeGeneralSettingsBin -#define readModel readModelBin + +const char* readModel(const char* filename, uint8_t* buffer, uint32_t size); + #endif const char* loadRadioSettingsBin(); const char * writeGeneralSettingsBin(); -const char* openFileBin(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version); +const char* openFileBin(const char* fullpath, FIL* file, uint16_t* size, + uint8_t* version); + const char* readModelBin(const char* filename, uint8_t* buffer, uint32_t size, uint8_t* version); -const char * writeModelBin(); + +const char* writeModelBin(); #endif diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 74ee5e1d2..47ab32671 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -189,7 +189,7 @@ const char * writeGeneralSettings() } -const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version) +const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t size) { // YAML reader TRACE("YAML model reader"); @@ -235,23 +235,19 @@ const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t siz // md->swashR.elevatorWeight = 100; } - *version = 255; // max version number return readYamlFile(path, YamlTreeWalker::get_parser_calls(), &tree); } -const char* readModel(const char* filename, uint8_t* buffer, uint32_t size, - uint8_t* version) +static const char _wrongExtentionError[] = "wrong file extension"; + +const char* readModel(const char* filename, uint8_t* buffer, uint32_t size) { const char* ext = strrchr(filename, '.'); - if (ext != nullptr) { - if (!strncmp(ext, YAML_EXT, 4)) { - return readModelYaml(filename, buffer, size, version); - } -#if !defined(EEPROM_RLC) - return readModelBin(filename, buffer, size, version); -#endif + if (!ext || strncmp(ext, YAML_EXT, 4) != 0) { + return _wrongExtentionError; } - return nullptr; + + return readModelYaml(filename, buffer, size); } const char * writeModelYaml(const char* filename) From a7ee5f593d55f508618844641a564589fb32062c Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 31 Oct 2021 07:31:49 +0100 Subject: [PATCH 104/110] Patch radio data version properly (just in case) --- radio/src/storage/conversions/conversions_220_221.cpp | 5 +++-- radio/src/tests/conversions.cpp | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/radio/src/storage/conversions/conversions_220_221.cpp b/radio/src/storage/conversions/conversions_220_221.cpp index 4a2693b88..5b02a5cd6 100644 --- a/radio/src/storage/conversions/conversions_220_221.cpp +++ b/radio/src/storage/conversions/conversions_220_221.cpp @@ -119,9 +119,10 @@ const char* convertModelData_220_to_221(const char* path) patchModelData); } -static void patchCurrentModelFilename(uint8_t* data) +static void patchRadioData(uint8_t* data) { auto rd = reinterpret_cast(data); + rd->version = 221; patchFilenameToYaml(rd->currModelFilename); } @@ -130,7 +131,7 @@ const char* convertRadioData_220_to_221(const char* path) constexpr unsigned rd_size = sizeof(bin_storage_220::RadioData); return convertData_220_to_221(path, rd_size, yaml_conv_220::get_radiodata_nodes(), - patchCurrentModelFilename); + patchRadioData); } #else diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 530ae81b8..d948a5a78 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -287,7 +287,7 @@ TEST(Conversions, ConversionX10From23) convertBinModelData(modelname, 219); loadModel(modelname); - EXPECT_EQ(220, g_eeGeneral.version); // TODO: 221? + EXPECT_EQ(221, g_eeGeneral.version); EXPECT_EQ(100, g_eeGeneral.calib[9].spanNeg); EXPECT_EQ(500, g_eeGeneral.calib[9].mid); @@ -361,7 +361,7 @@ TEST(Conversions, ConversionX12SFrom23) convertBinModelData(modelname, 219); loadModel(modelname); - EXPECT_EQ(220, g_eeGeneral.version); // TODO: 221? + EXPECT_EQ(221, g_eeGeneral.version); EXPECT_EQ(-30, g_eeGeneral.vBatMin); EXPECT_EQ(8, g_eeGeneral.speakerVolume); EXPECT_STRNEQ("en", g_eeGeneral.ttsLanguage); @@ -426,7 +426,7 @@ TEST(Conversions, ConversionTX16SFrom25) convertBinModelData(modelname, 220); loadModel(modelname); - EXPECT_EQ(220, g_eeGeneral.version); // TODO: 221? + EXPECT_EQ(221, g_eeGeneral.version); EXPECT_EQ(-23, g_eeGeneral.vBatMin); EXPECT_EQ(0, g_eeGeneral.speakerVolume); EXPECT_STRNEQ("en", g_eeGeneral.ttsLanguage); From 351f5d6d7a9b2187b7c2aead845f88ed5fa3aec2 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 31 Oct 2021 08:36:20 +0100 Subject: [PATCH 105/110] Use updated constants for some write functions as well to cope with changed data model --- .../yaml/yaml_datastructs_funcs.cpp | 14 +- radio/src/storage/sdcard_yaml.h | 1 + .../storage/yaml/yaml_datastructs_funcs.cpp | 327 +++++++++++++++--- radio/src/tests/conversions.cpp | 11 +- 4 files changed, 303 insertions(+), 50 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 2b50b719a..82628c515 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -51,8 +51,8 @@ extern const struct YamlIdStr enum_MixSources[]; static constexpr char closing_parenthesis[] = ")"; -static bool output_source_1_param(const char* src_prefix, size_t src_len, uint32_t n, - yaml_writer_func wf, void* opaque) +bool output_source_1_param(const char* src_prefix, size_t src_len, uint32_t n, + yaml_writer_func wf, void* opaque) { if (!wf(opaque, src_prefix, src_len)) return false; const char* str = yaml_unsigned2str(n); @@ -313,7 +313,8 @@ bool sw_name_write(void* user, uint8_t* data, uint32_t bitoffs, return wf(opaque, str, strnlen(str, LEN_SWITCH_NAME)); } -static const struct YamlIdStr enum_SwitchConfig[] = { +extern const struct YamlIdStr enum_SwitchConfig[]; +const struct YamlIdStr enum_SwitchConfig[] = { { SWITCH_NONE, "none" }, { SWITCH_TOGGLE, "toggle" }, { SWITCH_2POS, "2pos" }, @@ -604,6 +605,7 @@ bool w_vPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opa return wf(opaque, s, strlen(s)); } +extern const struct YamlIdStr enum_TrainerMode[]; const struct YamlIdStr enum_TrainerMode[] = { #if defined(PCBNV14) { TRAINER_MODE_OFF, "OFF" }, @@ -711,11 +713,13 @@ bool w_flightModes(const YamlNode* node, uint32_t val, #define r_customFn nullptr -static const char* _func_reset_param_lookup[] = { +extern const char* _func_reset_param_lookup[]; +const char* _func_reset_param_lookup[] = { "Tmr1","Tmr2","Tmr3","All","Tele" }; -static const char* _func_failsafe_lookup[] = { +extern const char* _func_failsafe_lookup[]; +const char* _func_failsafe_lookup[] = { "Int","Ext" }; diff --git a/radio/src/storage/sdcard_yaml.h b/radio/src/storage/sdcard_yaml.h index 9b39edb7e..addbded18 100644 --- a/radio/src/storage/sdcard_yaml.h +++ b/radio/src/storage/sdcard_yaml.h @@ -21,4 +21,5 @@ #pragma once +const char * loadRadioSettingsYaml(); const char * writeModelYaml(const char* filename); diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 940bd2cae..d7d4de68f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -29,21 +29,28 @@ namespace yaml_conv_220 { bool in_write_weight(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); - bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + + bool output_source_1_param(const char* src_prefix, size_t src_len, uint32_t n, + yaml_writer_func wf, void* opaque); + bool w_vbat_min(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); bool w_vbat_max(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs); uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs); uint8_t select_script_input(void* user, uint8_t* data, uint32_t bitoffs); uint8_t select_id1(void* user, uint8_t* data, uint32_t bitoffs); uint8_t select_id2(void* user, uint8_t* data, uint32_t bitoffs); uint8_t select_sensor_cfg(void* user, uint8_t* data, uint32_t bitoffs); - bool sw_write(void* user, yaml_writer_func wf, void* opaque); + + extern const struct YamlIdStr enum_SwitchConfig[]; bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); + bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs); bool gvar_is_active(void* user, uint8_t* data, uint32_t bitoffs); bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs); bool swash_is_active(void* user, uint8_t* data, uint32_t bitoffs); + bool w_beeperMode(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); bool w_5pos(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); bool w_vol(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque); @@ -66,12 +73,9 @@ namespace yaml_conv_220 { extern const char* _func_sound_lookup[]; extern const uint8_t _func_sound_lookup_size; - - bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, - yaml_writer_func wf, void* opaque); - bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, - yaml_writer_func wf, void* opaque); + extern const char* _func_reset_param_lookup[]; + extern const char* _func_failsafe_lookup[]; bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque); @@ -79,9 +83,6 @@ namespace yaml_conv_220 { bool w_zov_color(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque); - bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, - void* opaque); - extern const struct YamlIdStr enum_XJT_Subtypes[]; extern const struct YamlIdStr enum_ISRM_Subtypes[]; extern const struct YamlIdStr enum_R9M_Subtypes[]; @@ -259,9 +260,98 @@ static uint32_t r_mixSrcRaw(const YamlNode* node, const char* val, uint8_t val_l return yaml_parse_enum(enum_MixSources, val, val_len); } +static constexpr char closing_parenthesis[] = ")"; + static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - return yaml_conv_220::w_mixSrcRaw(node, val, wf, opaque); + const char* str = nullptr; + + if (val >= MIXSRC_FIRST_INPUT + && val <= MIXSRC_LAST_INPUT) { + + if (!wf(opaque, "I", 1)) + return false; + + str = yaml_unsigned2str(val - MIXSRC_FIRST_INPUT); + } +#if defined(LUA_INPUTS) + else if (val >= MIXSRC_FIRST_LUA + && val <= MIXSRC_LAST_LUA) { + + if (!wf(opaque, "lua(", 4)) return false; + + val -= MIXSRC_FIRST_LUA; + uint32_t script = val / MAX_SCRIPT_OUTPUTS; + + if (!yaml_conv_220::output_source_1_param("lua(", 4, script, wf, + opaque)) + return false; + if (!wf(opaque, ",", 1)) return false; + + val = val % MAX_SCRIPT_OUTPUTS; + str = yaml_unsigned2str(val); + + if (!wf(opaque, str, strlen(str))) return false; + str = closing_parenthesis; + } +#endif + else if (val >= MIXSRC_FIRST_LOGICAL_SWITCH + && val <= MIXSRC_LAST_LOGICAL_SWITCH) { + + val -= MIXSRC_FIRST_LOGICAL_SWITCH; + if (!yaml_conv_220::output_source_1_param("ls(", 3, val, wf, opaque)) + return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_TRAINER + && val <= MIXSRC_LAST_TRAINER) { + + val -= MIXSRC_FIRST_TRAINER; + if (!yaml_conv_220::output_source_1_param("tr(", 3, val, wf, opaque)) + return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_CH + && val <= MIXSRC_LAST_CH) { + + val -= MIXSRC_FIRST_CH; + if (!yaml_conv_220::output_source_1_param("ch(", 3, val, wf, opaque)) + return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_GVAR + && val <= MIXSRC_LAST_GVAR) { + + val -= MIXSRC_FIRST_GVAR; + if (!yaml_conv_220::output_source_1_param("gv(", 3, val, wf, opaque)) + return false; + str = closing_parenthesis; + } + else if (val >= MIXSRC_FIRST_TELEM + && val <= MIXSRC_LAST_TELEM) { + + val -= MIXSRC_FIRST_TELEM; + uint8_t sign = val % 3; + val = val / 3; + if (!wf(opaque, "tele(", 5)) return false; + if (sign == 1) { + if (!wf(opaque, "-", 1)) return false; + } else if (sign == 2) { + if (!wf(opaque, "+", 1)) return false; + } + str = yaml_unsigned2str(val); + if (!wf(opaque, str, strlen(str))) return false; + str = closing_parenthesis; + } + else { + str = yaml_output_enum(val, enum_MixSources); + } + + if (str) { + return wf(opaque, str, strlen(str)); + } + + return true; } static uint32_t r_vbat_min(const YamlNode* node, const char* val, uint8_t val_len) @@ -367,7 +457,12 @@ static uint32_t sw_read(void* user, const char* val, uint8_t val_len) bool sw_write(void* user, yaml_writer_func wf, void* opaque) { - return yaml_conv_220::sw_write(user, wf, opaque); + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); + + const char* str = + yaml_output_enum(idx + MIXSRC_FIRST_SWITCH, enum_MixSources); + return str ? wf(opaque, str, strlen(str)) : true; } static void r_stick_name(void* user, uint8_t* data, uint32_t bitoffs, @@ -438,17 +533,9 @@ static bool sw_name_write(void* user, uint8_t* data, uint32_t bitoffs, return wf(opaque, str, strnlen(str, LEN_SWITCH_NAME)); } -static const struct YamlIdStr enum_SwitchConfig[] = { - { SWITCH_NONE, "none" }, - { SWITCH_TOGGLE, "toggle" }, - { SWITCH_2POS, "2pos" }, - { SWITCH_3POS, "3pos" }, - { 0, NULL } -}; - static const struct YamlNode struct_switchConfig[] = { YAML_IDX_CUST( "sw", sw_read, sw_write), - YAML_ENUM( "type", 2, enum_SwitchConfig), + YAML_ENUM( "type", 2, yaml_conv_220::enum_SwitchConfig), YAML_CUSTOM( "name", sw_name_read, sw_name_write), YAML_END }; @@ -809,28 +896,9 @@ static bool w_vPitch(const YamlNode* node, uint32_t val, yaml_writer_func wf, vo return yaml_conv_220::w_vPitch(node, val, wf, opaque); } -const struct YamlIdStr enum_TrainerMode[] = { -#if defined(PCBNV14) - { TRAINER_MODE_OFF, "OFF" }, -#endif - { TRAINER_MODE_MASTER_TRAINER_JACK, "MASTER_TRAINER_JACK" }, - { TRAINER_MODE_SLAVE, "SLAVE" }, -#if defined(PCBTARANIS) || defined(PCBNV14) - { TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, "MASTER_SBUS_EXT" }, - { TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, "MASTER_CPPM_EXT" }, -#endif -#if defined(PCBTARANIS) || defined(AUX_SERIAL) || defined(AUX2_SERIAL) - { TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, "MASTER_BATT_COMP" }, -#endif - { TRAINER_MODE_MASTER_BLUETOOTH, "MASTER_BT" }, - { TRAINER_MODE_SLAVE_BLUETOOTH, "SLAVE_BT" }, - { TRAINER_MODE_MULTI, "MASTER_MULTI" }, - { 0, NULL } -}; - static uint32_t r_trainerMode(const YamlNode* node, const char* val, uint8_t val_len) { - return yaml_parse_enum(enum_TrainerMode, val, val_len); + return yaml_parse_enum(yaml_conv_220::enum_TrainerMode, val, val_len); } static bool w_trainerMode(const YamlNode* node, uint32_t val, @@ -1107,7 +1175,122 @@ static void r_customFn(void* user, uint8_t* data, uint32_t bitoffs, static bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque) { - return yaml_conv_220::w_customFn(user, data, bitoffs, wf, opaque); + data += bitoffs >> 3UL; + data -= offsetof(CustomFunctionData, all); + + auto cfn = reinterpret_cast(data); + uint8_t func = CFN_FUNC(cfn); + + const char* str = nullptr; + switch (func) { + case FUNC_OVERRIDE_CHANNEL: + str = yaml_unsigned2str(CFN_CH_INDEX(cfn)); // CH index + if (!wf(opaque, str, strlen(str))) return false; + if (!wf(opaque, ",", 1)) return false; + str = yaml_unsigned2str(CFN_PARAM(cfn)); // value + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_TRAINER: { + int16_t value = CFN_CH_INDEX(cfn); + switch(value) { + case 0: + if (!wf(opaque, "sticks", 6)) return false; + break; + case NUM_STICKS + 1: + if (!wf(opaque, "chans", 5)) return false; + break; + default: + if (value > 0 && value < NUM_STICKS + 1) { + str = yaml_output_enum(value - 1 + MIXSRC_FIRST_STICK, enum_MixSources); + if (str && !wf(opaque, str, strlen(str))) return false; + } + } + } break; + + case FUNC_RESET: + if (CFN_PARAM(cfn) < FUNC_RESET_PARAM_FIRST_TELEM) { + // Tmr1,Tmr2,Tmr3,All + str = yaml_conv_220::_func_reset_param_lookup[CFN_PARAM(cfn)]; + } else { + // sensor index + str = yaml_unsigned2str(CFN_PARAM(cfn) - FUNC_RESET_PARAM_FIRST_TELEM); + } + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_VOLUME: + case FUNC_BACKLIGHT: + case FUNC_PLAY_VALUE: + if (!w_mixSrcRaw(nullptr, CFN_PARAM(cfn), wf, opaque)) return false; + break; + + case FUNC_PLAY_SOUND: + // Bp1,Bp2,Bp3,Wrn1,Wrn2,Chee,Rata,Tick,Sirn,Ring,SciF,Robt,Chrp,Tada,Crck,Alrm + str = yaml_conv_220::_func_sound_lookup[CFN_PARAM(cfn)]; + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_PLAY_TRACK: + case FUNC_BACKGND_MUSIC: + case FUNC_PLAY_SCRIPT: + if (!wf(opaque, cfn->play.name, strnlen(cfn->play.name, LEN_FUNCTION_NAME))) + return false; + break; + + case FUNC_SET_TIMER: + // Tmr1,Tmr2,Tmr3 + str = yaml_conv_220::_func_reset_param_lookup[CFN_TIMER_INDEX(cfn)]; + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_SET_FAILSAFE: + // Int,Ext + str = yaml_conv_220::_func_failsafe_lookup[CFN_PARAM(cfn)]; + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_HAPTIC: + case FUNC_LOGS: // 10th of seconds + str = yaml_unsigned2str(CFN_PARAM(cfn)); + if (!wf(opaque, str, strlen(str))) return false; + break; + + case FUNC_ADJUST_GVAR: + switch(CFN_GVAR_MODE(cfn)) { + case FUNC_ADJUST_GVAR_CONSTANT: + case FUNC_ADJUST_GVAR_INCDEC: + str = yaml_signed2str(CFN_PARAM(cfn)); + if (!wf(opaque, str, strlen(str))) return false; + break; + case FUNC_ADJUST_GVAR_SOURCE: + if (!w_mixSrcRaw(nullptr, CFN_PARAM(cfn), wf, opaque)) return false; + break; + case FUNC_ADJUST_GVAR_GVAR: + if (!w_mixSrcRaw(nullptr, CFN_PARAM(cfn) + MIXSRC_FIRST_GVAR, wf, opaque)) return false; + break; + } + } + + if (HAS_ENABLE_PARAM(func)) { + // ",0/1" + if (!wf(opaque,CFN_ACTIVE(cfn) ? ",1":",0",2)) return false; + } else if (HAS_REPEAT_PARAM(func)) { + // "," + if (!wf(opaque,",",1)) return false; + if (CFN_PLAY_REPEAT(cfn) == 0) { + // "1x" + if (!wf(opaque,"1x",2)) return false; + } else if (CFN_PLAY_REPEAT(cfn) == CFN_PLAY_REPEAT_NOSTART) { + // "!1x" + if (!wf(opaque,"!1x",3)) return false; + } else { + // repeat time in seconds + str = yaml_unsigned2str(CFN_PLAY_REPEAT(cfn) * CFN_PLAY_REPEAT_MUL); + if (!wf(opaque, str, strlen(str))) return false; + } + } + return true; } #include "switches.h" @@ -1192,10 +1375,65 @@ static void r_logicSw(void* user, uint8_t* data, uint32_t bitoffs, } +static const struct YamlNode _ls_node_v1 = YAML_PADDING(10); +static const struct YamlNode _ls_node_v2 = YAML_PADDING(16); + static bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque) { - return yaml_conv_220::w_logicSw(user, data, bitoffs, wf, opaque); + data += bitoffs >> 3UL; + data -= sizeof(LogicalSwitchData::func); + + const char* str = nullptr; + auto ls = reinterpret_cast(data); + switch(lswFamily(ls->func)) { + + case LS_FAMILY_BOOL: + case LS_FAMILY_STICKY: + if (!w_swtchSrc(&_ls_node_v1, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + if (!w_swtchSrc(&_ls_node_v2, ls->v2, wf, opaque)) return false; + break; + + case LS_FAMILY_EDGE: + if (!w_swtchSrc(&_ls_node_v1, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + str = yaml_unsigned2str(lswTimerValue(ls->v2)); + if (!wf(opaque,str,strlen(str))) return false; + if (!wf(opaque,",",1)) return false; + if (ls->v3 < 0) { + if (!wf(opaque,"<",1)) return false; + } else if(ls->v3 == 0) { + if (!wf(opaque,"-",1)) return false; + } else { + str = yaml_unsigned2str(lswTimerValue(ls->v2 + ls->v3)); + } + break; + + case LS_FAMILY_COMP: + if (!w_mixSrcRaw(nullptr, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + if (!w_mixSrcRaw(nullptr, ls->v2, wf, opaque)) return false; + break; + + case LS_FAMILY_TIMER: + str = yaml_unsigned2str(lswTimerValue(ls->v1)); + if (!wf(opaque,str,strlen(str))) return false; + if (!wf(opaque,",",1)) return false; + str = yaml_unsigned2str(lswTimerValue(ls->v2)); + if (!wf(opaque,str,strlen(str))) return false; + break; + + default: + if (!w_mixSrcRaw(nullptr, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + // TODO?: ls->v1 <= MIXSRC_LAST_CH ? calc100toRESX(ls->v2) : ls->v2 + str = yaml_signed2str(ls->v2); + if (!wf(opaque,str,strlen(str))) return false; + break; + } + + return true; } static uint32_t r_thrSrc(const YamlNode* node, const char* val, uint8_t val_len) @@ -1212,7 +1450,8 @@ static uint32_t r_thrSrc(const YamlNode* node, const char* val, uint8_t val_len) static bool w_thrSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - return yaml_conv_220::w_thrSrc(node, val, wf, opaque); + auto src = throttleSource2Source(val); + return w_mixSrcRaw(nullptr, src, wf, opaque); } static void r_modSubtype(void* user, uint8_t* data, uint32_t bitoffs, diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index d948a5a78..193a23a37 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -28,7 +28,7 @@ #endif #if defined(SDCARD_YAML) -const char * loadRadioSettingsYaml(); +#include #endif #if defined(EEPROM_SIZE) @@ -455,8 +455,17 @@ TEST(Conversions, ConversionTX16SFrom25) char modelname2[] = "model2.bin"; convertBinModelData(modelname2, 220); + + loadModel(modelname2); + writeModelYaml(modelname2); loadModel(modelname2); + EXPECT_EQ(MIXSRC_FIRST_LOGICAL_SWITCH + 4, g_model.mixData[4].srcRaw); + EXPECT_EQ(MIXSRC_SC, g_model.mixData[5].srcRaw); + EXPECT_EQ(MIXSRC_SB, g_model.mixData[6].srcRaw); + EXPECT_EQ(MIXSRC_SD, g_model.mixData[7].srcRaw); + + EXPECT_EQ(LS_FUNC_EDGE, g_model.logicalSw[0].func); EXPECT_EQ(SWSRC_SF2, g_model.logicalSw[0].v1); EXPECT_EQ(-129, g_model.logicalSw[0].v2); From 0fee85d3c0edd97f44f3d7d73df1d6b083454e8f Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 1 Nov 2021 06:14:42 +0100 Subject: [PATCH 106/110] Fixed loadModelHeader() --- radio/src/storage/sdcard_yaml.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 47ab32671..8abe6bf96 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -292,11 +292,10 @@ void loadModelHeader(uint8_t id, ModelHeader* header) memclear(&partial, sizeof(PartialModel)); if (modelExists(id)) { - uint8_t dummy; char fname[MODELIDX_STRLEN + sizeof(YAML_EXT)]; getModelNumberStr(id, fname); strcat(fname, YAML_EXT); - readModelYaml(fname, reinterpret_cast(&partial), sizeof(partial), &dummy); + readModelYaml(fname, reinterpret_cast(&partial), sizeof(partial)); memcpy(header, &partial, sizeof(ModelHeader)); } } From 99c7dbf57588324330c4b37e945848a8723b8adb Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 1 Nov 2021 13:46:48 +0100 Subject: [PATCH 107/110] Fixed issue with logical switches --- .../yaml/yaml_datastructs_funcs.cpp | 2 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 52 +++++++++++++++++-- radio/src/tests/conversions.cpp | 21 +++++++- 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index 82628c515..e91a1970d 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -95,7 +95,7 @@ bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* && val <= MIXSRC_LAST_LOGICAL_SWITCH) { val -= MIXSRC_FIRST_LOGICAL_SWITCH; - if (!output_source_1_param("ls(", 3, val, wf, opaque)) return false; + if (!output_source_1_param("ls(", 3, val + 1, wf, opaque)) return false; str = closing_parenthesis; } else if (val >= MIXSRC_FIRST_TRAINER diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index d7d4de68f..38ad1c472 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -205,7 +205,7 @@ static uint32_t r_mixSrcRaw(const YamlNode* node, const char* val, uint8_t val_l val += 3; val_len -= 3; // parse int and ignore closing ')' - return yaml_str2uint(val, val_len) + MIXSRC_FIRST_LOGICAL_SWITCH; + return yaml_str2uint(val, val_len) + MIXSRC_FIRST_LOGICAL_SWITCH - 1; } else if (val_len > 3 && val[0] == 't' && @@ -299,7 +299,7 @@ static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, && val <= MIXSRC_LAST_LOGICAL_SWITCH) { val -= MIXSRC_FIRST_LOGICAL_SWITCH; - if (!yaml_conv_220::output_source_1_param("ls(", 3, val, wf, opaque)) + if (!yaml_conv_220::output_source_1_param("ls(", 3, val + 1, wf, opaque)) return false; str = closing_parenthesis; } @@ -736,7 +736,53 @@ static uint32_t r_swtchSrc(const YamlNode* node, const char* val, uint8_t val_le static bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) { - return yaml_conv_220::w_swtchSrc(node, val, wf, opaque); + int32_t sval = yaml_to_signed(val, node->size); + if (sval < 0) { + wf(opaque, "!", 1); + sval = abs(sval); + } + + const char* str = NULL; + if (sval >= SWSRC_FIRST_LOGICAL_SWITCH + && sval <= SWSRC_LAST_LOGICAL_SWITCH) { + + wf(opaque, "L", 1); + str = yaml_unsigned2str(sval - SWSRC_FIRST_LOGICAL_SWITCH + 1); + return wf(opaque,str, strlen(str)); + } +#if NUM_XPOTS > 0 + else if (sval >= SWSRC_FIRST_MULTIPOS_SWITCH + && sval <= SWSRC_LAST_MULTIPOS_SWITCH) { + + wf(opaque, "6P", 2); + + // pot #: start with 6P1 + sval -= SWSRC_FIRST_MULTIPOS_SWITCH; + str = yaml_unsigned2str(sval / XPOTS_MULTIPOS_COUNT); + wf(opaque,str, strlen(str)); + + // position + str = yaml_unsigned2str(sval % XPOTS_MULTIPOS_COUNT); + return wf(opaque,str, strlen(str)); + } +#endif + else if (sval >= SWSRC_FIRST_FLIGHT_MODE + && sval <= SWSRC_LAST_FLIGHT_MODE) { + + wf(opaque, "FM", 2); + str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE); + return wf(opaque,str, strlen(str)); + } + else if (sval >= SWSRC_FIRST_SENSOR + && sval <= SWSRC_LAST_SENSOR) { + + wf(opaque, "T", 2); + str = yaml_unsigned2str(sval - SWSRC_FIRST_SENSOR + 1); + return wf(opaque,str, strlen(str)); + } + + str = yaml_output_enum(sval, enum_SwitchSources); + return wf(opaque, str, strlen(str)); } bool cfn_is_active(void* user, uint8_t* data, uint32_t bitoffs) diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 193a23a37..5167f78f4 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -464,7 +464,6 @@ TEST(Conversions, ConversionTX16SFrom25) EXPECT_EQ(MIXSRC_SC, g_model.mixData[5].srcRaw); EXPECT_EQ(MIXSRC_SB, g_model.mixData[6].srcRaw); EXPECT_EQ(MIXSRC_SD, g_model.mixData[7].srcRaw); - EXPECT_EQ(LS_FUNC_EDGE, g_model.logicalSw[0].func); EXPECT_EQ(SWSRC_SF2, g_model.logicalSw[0].v1); @@ -477,6 +476,26 @@ TEST(Conversions, ConversionTX16SFrom25) EXPECT_EQ(-98, g_model.logicalSw[1].v2); EXPECT_EQ(SWSRC_NONE, g_model.logicalSw[1].andsw); + EXPECT_EQ(LS_FUNC_AND, g_model.logicalSw[2].func); + EXPECT_EQ(SWSRC_FIRST_LOGICAL_SWITCH, g_model.logicalSw[2].v1); + EXPECT_EQ(SWSRC_FIRST_LOGICAL_SWITCH + 1, g_model.logicalSw[2].v2); + EXPECT_EQ(SWSRC_NONE, g_model.logicalSw[2].andsw); + + EXPECT_EQ(LS_FUNC_AND, g_model.logicalSw[3].func); + EXPECT_EQ(SWSRC_FIRST_LOGICAL_SWITCH + 1, g_model.logicalSw[3].v1); + EXPECT_EQ(SWSRC_SF0, g_model.logicalSw[3].v2); + EXPECT_EQ(SWSRC_NONE, g_model.logicalSw[3].andsw); + + EXPECT_EQ(LS_FUNC_STICKY, g_model.logicalSw[4].func); + EXPECT_EQ(SWSRC_FIRST_LOGICAL_SWITCH + 2, g_model.logicalSw[4].v1); + EXPECT_EQ(SWSRC_FIRST_LOGICAL_SWITCH + 3, g_model.logicalSw[4].v2); + EXPECT_EQ(SWSRC_NONE, g_model.logicalSw[4].andsw); + + EXPECT_EQ(LS_FUNC_AND, g_model.logicalSw[5].func); + EXPECT_EQ(-(SWSRC_FIRST_LOGICAL_SWITCH + 1), g_model.logicalSw[5].v1); + EXPECT_EQ(SWSRC_FIRST_LOGICAL_SWITCH + 4, g_model.logicalSw[5].v2); + EXPECT_EQ(SWSRC_NONE, g_model.logicalSw[5].andsw); + simuFatfsSetPaths("",""); } #endif From 125b282d818ebeb82384eb97165551076bc5fb8b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 1 Nov 2021 22:34:56 +0100 Subject: [PATCH 108/110] Fixed value widget source --- radio/src/storage/yaml/yaml_datastructs_funcs.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 38ad1c472..8fcbce1a3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -393,7 +393,9 @@ void r_zov_source(void* user, uint8_t* data, uint32_t bitoffs, bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque) { - return yaml_conv_220::w_zov_source(user, data, bitoffs, wf, opaque); + data += bitoffs >> 3UL; + auto p_val = reinterpret_cast(data); + return w_mixSrcRaw(nullptr, p_val->unsignedValue, wf, opaque); } void r_zov_color(void* user, uint8_t* data, uint32_t bitoffs, From ca31c275bd004c336a3646eb9406e15cdd5f1a7c Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 7 Nov 2021 22:13:32 +0100 Subject: [PATCH 109/110] Fix override channel parameter --- .../yaml/yaml_datastructs_funcs.cpp | 2 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 3 ++- radio/src/tests/conversions.cpp | 4 ++++ radio/src/tests/model_25_tx16s.otx | Bin 1444 -> 1461 bytes 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index e91a1970d..fcb2f31f7 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -748,7 +748,7 @@ bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, str = yaml_unsigned2str(CFN_CH_INDEX(cfn)); // CH index if (!wf(opaque, str, strlen(str))) return false; if (!wf(opaque, ",", 1)) return false; - str = yaml_unsigned2str(CFN_PARAM(cfn)); // value + str = yaml_signed2str(CFN_PARAM(cfn)); // value if (!wf(opaque, str, strlen(str))) return false; break; diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 8fcbce1a3..8cb3925c4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -1051,6 +1051,7 @@ static void r_customFn(void* user, uint8_t* data, uint32_t bitoffs, CFN_CH_INDEX(cfn) = yaml_str2uint_ref(val, val_len); // "," if (!val_len || val[0] != ',') return; + val++; val_len--; // value CFN_PARAM(cfn) = yaml_str2int_ref(val, val_len); } @@ -1235,7 +1236,7 @@ static bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, str = yaml_unsigned2str(CFN_CH_INDEX(cfn)); // CH index if (!wf(opaque, str, strlen(str))) return false; if (!wf(opaque, ",", 1)) return false; - str = yaml_unsigned2str(CFN_PARAM(cfn)); // value + str = yaml_signed2str(CFN_PARAM(cfn)); // value if (!wf(opaque, str, strlen(str))) return false; break; diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 5167f78f4..8bae7eb6f 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -442,6 +442,10 @@ TEST(Conversions, ConversionTX16SFrom25) EXPECT_EQ(MODULE_SUBTYPE_PXX1_ACCST_LR12, g_model.moduleData[1].subType); EXPECT_EQ(4, g_model.moduleData[1].channelsCount); // 4 + 8 = 12 + EXPECT_EQ(-SWSRC_SE0, g_model.customFn[0].swtch); + EXPECT_EQ(FUNC_OVERRIDE_CHANNEL, g_model.customFn[0].func); + EXPECT_EQ(-100, CFN_PARAM(&(g_model.customFn[0]))); + const auto& top_widget = g_model.topbarData.zones[3]; EXPECT_STRNEQ("Value", top_widget.widgetName); diff --git a/radio/src/tests/model_25_tx16s.otx b/radio/src/tests/model_25_tx16s.otx index 2555135b279fff61ba1ba0affe95234ebfde1046..d9a764880b9d5933b9d136adcda9f78010bdfd5a 100644 GIT binary patch delta 367 zcmZ3&y_K6cz?+#xgn@y9gTZ@U`b6F-oIonr{Civ7&xxz#>g~M`J4hV=cz-EpNTGnb zJ9}Z_rpc>W*$*!A_;_E;yy^Gb_DS7uxnf&Y`oZLFLR9Oe_v$UrcgE{Q z7N2~2^zJ|J^xW-})iamrPfVM3B4l$~z}aikS96Sk*48gvm>nJ!SMV|}vaVq1gX)5h zg;k6U3XWrpbGKcS>m75z4Z7 zk!p1&s5HOLYI7%p&Zfsd?6$kUF7bbyJEg3Cfn;g*-;x)-%vXz(x*K)#j_-}W=Ndfk z`yZ2^|1P#|cydO+8t8KdhG$Q0&gH!7jo-UZ$3FXRy;>DJG*s9i!LoTb<9sG&V8Bd{ sWpM%1OIWNB0X6wKiy2r{fmNDu|706h1u!oj$V;4D&8p0{j0I#10A_HXZ2$lO delta 360 zcmdnWy@Z=Lz?+#xgn@y9gW*wO+(h0foIol#bmHP?FD9;%tGCTQiTQ-|Md0m{;kZ<*G4jf z4Bw!;J~1h2_5IDS9v0l%b#G<{3rZjaAK3JyxR{B7K}37=b;c=7%)k(toX6qK4;C}9s3EH~ Date: Sun, 7 Nov 2021 22:40:10 +0100 Subject: [PATCH 110/110] Fix GVar adjust mode --- .../yaml/yaml_datastructs_funcs.cpp | 12 ++++++++++ .../storage/yaml/yaml_datastructs_funcs.cpp | 22 +++++++++++++++++++ radio/src/tests/conversions.cpp | 7 +++++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index fcb2f31f7..d501de4bb 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -733,6 +733,13 @@ const char* _func_sound_lookup[] = { // force external linkage extern const uint8_t _func_sound_lookup_size = sizeof(_func_sound_lookup); +extern const char* _adjust_gvar_mode_lookup[]; +const char* _adjust_gvar_mode_lookup[] = { + "Cst", "Src", "GVar", "IncDec" +}; + +extern const uint8_t _adjust_gvar_mode_lookup_size = sizeof(_adjust_gvar_mode_lookup); + bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque) { @@ -818,6 +825,11 @@ bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, break; case FUNC_ADJUST_GVAR: + // output CFN_GVAR_MODE + str = _adjust_gvar_mode_lookup[CFN_GVAR_MODE(cfn)]; + if (!wf(opaque, str, strlen(str))) return false; + if (!wf(opaque,",",1)) return false; + // output param switch(CFN_GVAR_MODE(cfn)) { case FUNC_ADJUST_GVAR_CONSTANT: case FUNC_ADJUST_GVAR_INCDEC: diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 8cb3925c4..9df703d97 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -77,6 +77,9 @@ namespace yaml_conv_220 { extern const char* _func_reset_param_lookup[]; extern const char* _func_failsafe_lookup[]; + extern const char* _adjust_gvar_mode_lookup[]; + extern const uint8_t _adjust_gvar_mode_lookup_size; + bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque); @@ -1171,6 +1174,20 @@ static void r_customFn(void* user, uint8_t* data, uint32_t bitoffs, break; case FUNC_ADJUST_GVAR: + // parse CFN_GVAR_MODE + for (int i=0; i < yaml_conv_220::_adjust_gvar_mode_lookup_size; i++) { + if (!strncmp(yaml_conv_220::_adjust_gvar_mode_lookup[i],val,l_sep)) { + CFN_GVAR_MODE(cfn) = i; + break; + } + } + val += l_sep; val_len -= l_sep; + if (val_len == 0 || val[0] != ',') return; + val++; val_len--; + // find "," and cut val_len + sep = (const char *)memchr(val, ',', val_len); + l_sep = sep ? sep - val : val_len; + // output param switch(CFN_GVAR_MODE(cfn)) { case FUNC_ADJUST_GVAR_CONSTANT: case FUNC_ADJUST_GVAR_INCDEC: @@ -1306,6 +1323,11 @@ static bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, break; case FUNC_ADJUST_GVAR: + // output CFN_GVAR_MODE + str = yaml_conv_220::_adjust_gvar_mode_lookup[CFN_GVAR_MODE(cfn)]; + if (!wf(opaque, str, strlen(str))) return false; + if (!wf(opaque,",",1)) return false; + // output param switch(CFN_GVAR_MODE(cfn)) { case FUNC_ADJUST_GVAR_CONSTANT: case FUNC_ADJUST_GVAR_INCDEC: diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 8bae7eb6f..52bbbe29d 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -445,7 +445,12 @@ TEST(Conversions, ConversionTX16SFrom25) EXPECT_EQ(-SWSRC_SE0, g_model.customFn[0].swtch); EXPECT_EQ(FUNC_OVERRIDE_CHANNEL, g_model.customFn[0].func); EXPECT_EQ(-100, CFN_PARAM(&(g_model.customFn[0]))); - + + EXPECT_EQ(SWSRC_TrimThrUp, g_model.customFn[1].swtch); + EXPECT_EQ(FUNC_ADJUST_GVAR, g_model.customFn[1].func); + EXPECT_EQ(FUNC_ADJUST_GVAR_INCDEC, CFN_GVAR_MODE(&(g_model.customFn[1]))); + EXPECT_EQ(5, CFN_PARAM(&(g_model.customFn[1]))); + const auto& top_widget = g_model.topbarData.zones[3]; EXPECT_STRNEQ("Value", top_widget.widgetName);