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