From 0c0acb8a13e36f7f8b9cf439084239dcb40e5e02 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Thu, 2 Jun 2022 21:34:58 +1000 Subject: [PATCH 001/122] special functions gui --- radio/src/dataconstants.h | 2 + radio/src/datastructs.h | 42 +++++++++---------- radio/src/datastructs_private.h | 1 + radio/src/gui/colorlcd/special_functions.cpp | 9 +++- .../storage/yaml/yaml_datastructs_nv14.cpp | 5 ++- .../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_tpro.cpp | 5 ++- .../storage/yaml/yaml_datastructs_tx12.cpp | 5 ++- .../src/storage/yaml/yaml_datastructs_x10.cpp | 5 ++- .../storage/yaml/yaml_datastructs_x12s.cpp | 5 ++- .../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 ++- .../storage/yaml/yaml_datastructs_zorro.cpp | 5 ++- 20 files changed, 80 insertions(+), 54 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 489f9a3be48..e8c982f8ff0 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -133,6 +133,8 @@ enum CurveType { #define MAX_CURVE_POINTS 512 #endif +#define LEN_SPEC_FN_NAME 10 + #if defined(PCBFRSKY) || defined(PCBNV14) #define NUM_MODULES 2 #else diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index c90cf723a55..dd4338a59e5 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -52,7 +52,7 @@ static inline void check_struct() CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 11); CHKSIZE(LogicalSwitchData, 9); - CHKSIZE(CustomFunctionData, 11); + CHKSIZE(CustomFunctionData, 21); CHKSIZE(FlightModeData, 28 + 2*NUM_TRIMS); CHKSIZE(TimerData, 11); CHKSIZE(SwashRingData, 8); @@ -66,7 +66,7 @@ static inline void check_struct() CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 13); CHKSIZE(LogicalSwitchData, 9); - CHKSIZE(CustomFunctionData, 11); + CHKSIZE(CustomFunctionData, 21); CHKSIZE(FlightModeData, 40); CHKSIZE(TimerData, 16); CHKSIZE(SwashRingData, 8); @@ -79,7 +79,7 @@ static inline void check_struct() CHKSIZE(MixData, 20); CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 13); - CHKSIZE(CustomFunctionData, 9); + CHKSIZE(CustomFunctionData, 19); CHKSIZE(FlightModeData, 44); CHKSIZE(TimerData, 16); CHKSIZE(SwashRingData, 8); @@ -117,34 +117,34 @@ static inline void check_struct() CHKSIZE(TrainerData, 16); #if defined(PCBXLITES) - CHKSIZE(RadioData, 861); - CHKSIZE(ModelData, 6161); + CHKSIZE(RadioData, 1501); + CHKSIZE(ModelData, 6801); #elif defined(PCBXLITE) - CHKSIZE(RadioData, 859); - CHKSIZE(ModelData, 6161); + CHKSIZE(RadioData, 1499); + CHKSIZE(ModelData, 6801); #elif defined(RADIO_TPRO) - CHKSIZE(RadioData, 842); - CHKSIZE(ModelData, 6186); + CHKSIZE(RadioData, 1482); + CHKSIZE(ModelData, 6826); #elif defined(PCBX7) - CHKSIZE(RadioData, 865); - CHKSIZE(ModelData, 6161); + CHKSIZE(RadioData, 1505); + CHKSIZE(ModelData, 6801); #elif defined(PCBX9E) - CHKSIZE(RadioData, 955); - CHKSIZE(ModelData, 6613); + CHKSIZE(RadioData, 1595); + CHKSIZE(ModelData, 7253); #elif defined(PCBX9D) || defined(PCBX9DP) - CHKSIZE(RadioData, 897); - CHKSIZE(ModelData, 6605); + CHKSIZE(RadioData, 1537); + CHKSIZE(ModelData, 7245); #elif defined(PCBHORUS) #if defined(PCBX10) - CHKSIZE(RadioData, 923); - CHKSIZE(ModelData, 11025); + CHKSIZE(RadioData, 1563); + CHKSIZE(ModelData, 11665); #else - CHKSIZE(RadioData, 905); - CHKSIZE(ModelData, 11023); + CHKSIZE(RadioData, 1545); + CHKSIZE(ModelData, 11663); #endif #elif defined(PCBNV14) - CHKSIZE(RadioData, 851); - CHKSIZE(ModelData, 10839); + CHKSIZE(RadioData, 1491); + CHKSIZE(ModelData, 11479); #endif #undef CHKSIZE diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 22a2a09fd10..3821e449cef 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.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); + NOBACKUP(char custName[LEN_SPEC_FN_NAME]); CUST_ATTR(def,r_customFn,w_customFn); PACK(union { NOBACKUP(PACK(struct { diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index daf11ff06f2..0e97a0afa51 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -362,7 +362,13 @@ class SpecialFunctionEditPage : public Page grid.spacer(PAGE_PADDING); CustomFunctionData *cfn = &functions[index]; - + + // custom label + new StaticText(window, grid.getLabelSlot(), "Custom Label", 0, COLOR_THEME_PRIMARY1); + new ModelTextEdit(window, grid.getFieldSlot(), cfn->custName, LEN_SPEC_FN_NAME); + // new StaticText(window, grid.getFieldSlot(), "placeHolderName", 0, COLOR_THEME_PRIMARY1); + grid.nextLine(); + // Switch new StaticText(window, grid.getLabelSlot(), STR_SWITCH, 0, COLOR_THEME_PRIMARY1); auto switchChoice = @@ -472,6 +478,7 @@ class SpecialFunctionButton : public Button uint8_t func = CFN_FUNC(cfn); drawSwitch(dc, col1, line1, CFN_SWITCH(cfn), COLOR_THEME_SECONDARY1); + dc->drawText(col3, line1, "CustLabelPlaceHolder", COLOR_THEME_SECONDARY1); if (cfn->isEmpty()) return; dc->drawTextAtIndex(col2, line1, STR_VFSWFUNC, func, COLOR_THEME_SECONDARY1); diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 8f7886af359..ac738379b3f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -325,6 +325,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 48 ), YAML_PADDING( 8 ), @@ -420,7 +421,7 @@ static const struct YamlNode struct_RadioData[] = { 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_ARRAY("customFn", 152, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -858,7 +859,7 @@ 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", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ARRAY("customFn", 152, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 2700c6c8cc3..d309154e861 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -391,7 +392,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -828,7 +829,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 6859a558da7..06dda014002 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -391,7 +392,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -828,7 +829,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 6859a558da7..06dda014002 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -391,7 +392,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -828,7 +829,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index c09d9b7c159..e26e20077af 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -323,6 +323,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -399,7 +400,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -834,7 +835,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 638e60cefde..7c752a14110 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -391,7 +392,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -828,7 +829,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 6a246c030d9..ed284e83aa4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -350,6 +350,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 48 ), YAML_PADDING( 8 ), @@ -443,7 +444,7 @@ static const struct YamlNode struct_RadioData[] = { 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_ARRAY("customFn", 152, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -882,7 +883,7 @@ 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", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ARRAY("customFn", 152, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 22ee67bf1ab..5d23be1c9dd 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -348,6 +348,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 48 ), YAML_PADDING( 8 ), @@ -441,7 +442,7 @@ static const struct YamlNode struct_RadioData[] = { 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_ARRAY("customFn", 152, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -880,7 +881,7 @@ 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", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ARRAY("customFn", 152, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 6859a558da7..06dda014002 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -391,7 +392,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -828,7 +829,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 653bf6a8383..a62b007458e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -322,6 +322,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -398,7 +399,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -841,7 +842,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 67623a95a75..d6b42af42d9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -361,6 +361,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -437,7 +438,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -880,7 +881,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index adf23742f41..b12f418479a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -302,6 +302,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -378,7 +379,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -813,7 +814,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index e36f38effe7..3b0a05e5d0b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -310,6 +310,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -386,7 +387,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -823,7 +824,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 87cb71577a2..e970bf285ca 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -307,6 +307,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -383,7 +384,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -820,7 +821,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 856a541f420..5c8e1febde9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -309,6 +309,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -385,7 +386,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -824,7 +825,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index 027a7463c9f..96700f5cee3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -391,7 +392,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -828,7 +829,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), From 4edc814c2fed85f890fe10725f4543e249469072 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 4 Jun 2022 20:52:24 +1000 Subject: [PATCH 002/122] Update yaml_datastructs_funcs.cpp increase data size (cherry picked from commit 98276f4d3f1aab8ad4f699349ec7659df5f5225a) --- radio/src/storage/yaml/yaml_datastructs_funcs.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 26e18515b59..4323a3eb4a3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -115,20 +115,20 @@ static inline void check_yaml_funcs() #if defined(PCBHORUS) static_assert(offsetof(FlightModeData, gvars) == 26,""); check_size(); - check_size(); + check_size(); #elif defined(PCBNV14) static_assert(offsetof(FlightModeData, gvars) == 22,""); check_size(); - check_size(); + check_size(); #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) static_assert(offsetof(FlightModeData, gvars) == 18,""); check_size(); - check_size(); + check_size(); check_size(); #else static_assert(offsetof(FlightModeData, gvars) == 22,""); check_size(); - check_size(); + check_size(); check_size(); #endif } From 666640634f38e60f943560422c37ca77f8bde225 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 4 Jun 2022 21:11:28 +1000 Subject: [PATCH 003/122] Update special_functions.cpp paint special function custom name (cherry picked from commit 59fc7c1938cd9cea8618d7b80af9c70a96cf0921) --- radio/src/gui/colorlcd/special_functions.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 0e97a0afa51..62ac27da8ba 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -478,7 +478,8 @@ class SpecialFunctionButton : public Button uint8_t func = CFN_FUNC(cfn); drawSwitch(dc, col1, line1, CFN_SWITCH(cfn), COLOR_THEME_SECONDARY1); - dc->drawText(col3, line1, "CustLabelPlaceHolder", COLOR_THEME_SECONDARY1); + //paint special function custom name + dc->drawText(col3, line1, cfn->custName, COLOR_THEME_SECONDARY1); if (cfn->isEmpty()) return; dc->drawTextAtIndex(col2, line1, STR_VFSWFUNC, func, COLOR_THEME_SECONDARY1); From 219a16baddc09b47e0b80d44b22a71c1c069f0ad Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 5 Jun 2022 07:56:55 +1000 Subject: [PATCH 004/122] Update special_functions.cpp removed code comment (cherry picked from commit 391ad2f44d538c594e278e6be4bfc49714a5ff40) --- radio/src/gui/colorlcd/special_functions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 62ac27da8ba..32b7e4b0b59 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -366,7 +366,7 @@ class SpecialFunctionEditPage : public Page // custom label new StaticText(window, grid.getLabelSlot(), "Custom Label", 0, COLOR_THEME_PRIMARY1); new ModelTextEdit(window, grid.getFieldSlot(), cfn->custName, LEN_SPEC_FN_NAME); - // new StaticText(window, grid.getFieldSlot(), "placeHolderName", 0, COLOR_THEME_PRIMARY1); + grid.nextLine(); // Switch From 8e29612b9381e10f63b8fb08630c50d2d650dcba Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 5 Jun 2022 08:51:21 +1000 Subject: [PATCH 005/122] Update en.h in special functions edit screen, variable data for English translation (cherry picked from commit 82490e34094ea0ed740e58bcffe95ad66d084ca7) --- radio/src/translations/en.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 79315d8c51e..f7af55b2cb3 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -511,6 +511,7 @@ #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" #define TR_MENULOGICALSWITCHES "LOGICAL SWITCHES" #define TR_MENUCUSTOMFUNC "SPECIAL FUNCTIONS" +#define TR_CUST_FUNC_CUST_LABEL "Name" #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" #define TR_MENUTELEMETRY "TELEMETRY" #define TR_MENUTEMPLATES "TEMPLATES" From c82b31994441097478e0f3777fb8dba71b141cf6 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 5 Jun 2022 09:01:28 +1000 Subject: [PATCH 006/122] Update translations.cpp variable for model special function custom name (cherry picked from commit a8c494285d774c0d2268dd96ed615a957e3767c9) --- radio/src/translations.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 0a4fd937622..076bad03275 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -266,6 +266,7 @@ const char STR_MENUCURVE[] = TR_MENUCURVE; const char STR_MENULOGICALSWITCH[] = TR_MENULOGICALSWITCH; const char STR_MENULOGICALSWITCHES[] = TR_MENULOGICALSWITCHES; const char STR_MENUCUSTOMFUNC[] = TR_MENUCUSTOMFUNC; +const char STR_CUST_FUNC_CUST_LABEL[] = TR_CUST_FUNC_CUST_LABEL; const char STR_SPLASHSCREEN[] = TR_SPLASHSCREEN; const char STR_PWR_ON_DELAY[] = TR_PWR_ON_DELAY; const char STR_PWR_OFF_DELAY[] = TR_PWR_OFF_DELAY; From 2297c59400eebae1b6d1c84d1f97d2e5b6d56ea0 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 5 Jun 2022 09:34:03 +1000 Subject: [PATCH 007/122] Update special_functions.cpp fixed string changed to translation (cherry picked from commit 52366eed73004b1dea153dff35bd45a0f993a35e) --- radio/src/gui/colorlcd/special_functions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 32b7e4b0b59..da7f74a5a00 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -364,7 +364,7 @@ class SpecialFunctionEditPage : public Page CustomFunctionData *cfn = &functions[index]; // custom label - new StaticText(window, grid.getLabelSlot(), "Custom Label", 0, COLOR_THEME_PRIMARY1); + new StaticText(window, grid.getLabelSlot(), STR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); new ModelTextEdit(window, grid.getFieldSlot(), cfn->custName, LEN_SPEC_FN_NAME); grid.nextLine(); From 281c8f86fe18fc5816b613d02be8d766a835ea85 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:04:23 +1000 Subject: [PATCH 008/122] Update special_functions.cpp changed variable from string to translation (cherry picked from commit 65df17bf1f03ab53fef98f1309b743234babd517) --- radio/src/gui/colorlcd/special_functions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index da7f74a5a00..74a17f693ca 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -364,7 +364,7 @@ class SpecialFunctionEditPage : public Page CustomFunctionData *cfn = &functions[index]; // custom label - new StaticText(window, grid.getLabelSlot(), STR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); + new StaticText(window, grid.getLabelSlot(), TR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); new ModelTextEdit(window, grid.getFieldSlot(), cfn->custName, LEN_SPEC_FN_NAME); grid.nextLine(); From c49ef97378afab3b22f8ff915bb1501e12f70c56 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:19:45 +1000 Subject: [PATCH 009/122] radio\src\translations\en.h moved translations to txt file as requested by @eshifri (cherry picked from commit d10f5d634f10ca8eecf79f1ceef6c9b43554cee4) --- radio/src/translations/cn.h.txt | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h | 1 - radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 13 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 radio/src/translations/cn.h.txt create mode 100644 radio/src/translations/cz.h.txt create mode 100644 radio/src/translations/de.h.txt create mode 100644 radio/src/translations/en.h.txt create mode 100644 radio/src/translations/es.h.txt create mode 100644 radio/src/translations/fi.h.txt create mode 100644 radio/src/translations/fr.h.txt create mode 100644 radio/src/translations/it.txt create mode 100644 radio/src/translations/nl.h.txt create mode 100644 radio/src/translations/pl.h.txt create mode 100644 radio/src/translations/pt.h.txt create mode 100644 radio/src/translations/se.h.txt diff --git a/radio/src/translations/cn.h.txt b/radio/src/translations/cn.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/cn.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/cz.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/de.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index f7af55b2cb3..79315d8c51e 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -511,7 +511,6 @@ #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" #define TR_MENULOGICALSWITCHES "LOGICAL SWITCHES" #define TR_MENUCUSTOMFUNC "SPECIAL FUNCTIONS" -#define TR_CUST_FUNC_CUST_LABEL "Name" #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" #define TR_MENUTELEMETRY "TELEMETRY" #define TR_MENUTEMPLATES "TEMPLATES" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/en.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/es.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/fi.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/fr.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/it.txt b/radio/src/translations/it.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/it.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/nl.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/pl.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/pt.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/se.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file From 3252edcd139a284ab886e95a58c08b5c8a971c1b Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:26:25 +1000 Subject: [PATCH 010/122] Update en.h re enabled definition inorder to compile simu (cherry picked from commit 2ca101cef51a132fd4d5c662792b2b508e99263d) --- radio/src/translations/en.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 79315d8c51e..f7af55b2cb3 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -511,6 +511,7 @@ #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" #define TR_MENULOGICALSWITCHES "LOGICAL SWITCHES" #define TR_MENUCUSTOMFUNC "SPECIAL FUNCTIONS" +#define TR_CUST_FUNC_CUST_LABEL "Name" #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" #define TR_MENUTELEMETRY "TELEMETRY" #define TR_MENUTEMPLATES "TEMPLATES" From d9e0dc6895d432c042f9921ab6c57189d23a9761 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:56:55 +1000 Subject: [PATCH 011/122] radio\src\gui\colorlcd\special_functions.cpp changed variable from translation to dynamic string (cherry picked from commit 1d4a0f42b4e642389948a7e5b582545b450c78a9) --- radio/src/gui/colorlcd/special_functions.cpp | 2 +- radio/src/translations.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 74a17f693ca..da7f74a5a00 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -364,7 +364,7 @@ class SpecialFunctionEditPage : public Page CustomFunctionData *cfn = &functions[index]; // custom label - new StaticText(window, grid.getLabelSlot(), TR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); + new StaticText(window, grid.getLabelSlot(), STR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); new ModelTextEdit(window, grid.getFieldSlot(), cfn->custName, LEN_SPEC_FN_NAME); grid.nextLine(); diff --git a/radio/src/translations.h b/radio/src/translations.h index 34d3a630f54..39d279e8a7c 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -426,6 +426,7 @@ extern const char STR_MENUCURVE[]; extern const char STR_MENULOGICALSWITCH[]; extern const char STR_MENULOGICALSWITCHES[]; extern const char STR_MENUCUSTOMFUNC[]; +extern const char STR_CUST_FUNC_CUST_LABEL[]; extern const char STR_MENUCUSTOMSCRIPTS[]; extern const char STR_MENUTELEMETRY[]; extern const char STR_MENUTEMPLATES[]; From f9627d099bbdb26bb7b5000856ead88b9c8c3da5 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 12 Jun 2022 22:47:00 +0000 Subject: [PATCH 012/122] new logic switch family (cherry picked from commit 514a60e2ed38544d11815dec024a4993f2946036) --- radio/src/switches.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/switches.h b/radio/src/switches.h index 9bda7bdaaf7..57c30d5c982 100644 --- a/radio/src/switches.h +++ b/radio/src/switches.h @@ -30,6 +30,7 @@ enum LogicalSwitchFamilies { LS_FAMILY_DIFF, LS_FAMILY_TIMER, LS_FAMILY_STICKY, + LS_FAMILY_SAFE, LS_FAMILY_RANGE, LS_FAMILY_EDGE }; From dd0504c1a4f3f63ff697b572a2c54c8e9000738b Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 12 Jun 2022 22:49:41 +0000 Subject: [PATCH 013/122] new logical switch function in dropdown (cherry picked from commit 5b165c05a559ec46b12777510856b024149b30aa) --- radio/src/myeeprom.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 14766f7e4ed..ba9700bc408 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -213,6 +213,7 @@ enum LogicalSwitchesFunctions { LS_FUNC_ADIFFEGREATER, LS_FUNC_TIMER, LS_FUNC_STICKY, + LS_FUNC_SAFE, LS_FUNC_COUNT SKIP, LS_FUNC_MAX SKIP = LS_FUNC_COUNT-1 }; From 5033fde617d1d7726b1c0f2a44b811f21f7561e3 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 12 Jun 2022 23:09:38 +0000 Subject: [PATCH 014/122] English translations --- radio/src/translations/en.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index f7af55b2cb3..8b6780fcfd8 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -81,17 +81,19 @@ #if LCD_W >= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stcky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Range" #define TR_CSWSTAY "Edge" #else #define TR_CSWTIMER "Tim" #define TR_CSWSTICKY "Stky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Rnge" #define TR_CSWSTAY "Edge" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","ax","ax","|a|b","a Date: Mon, 13 Jun 2022 02:26:14 +0000 Subject: [PATCH 015/122] new logic switch type Safe graphical display (cherry picked from commit c3f1a32107b63bbacd5ffd2633105684c5780aa3) --- radio/src/gui/colorlcd/model_logical_switches.cpp | 4 ++-- radio/src/storage/conversions/yaml/myeeprom_220.h | 1 + radio/src/storage/yaml/yaml_datastructs_nv14.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_t12.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_t8.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_tlite.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_tpro.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_tx12.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x10.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x12s.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x7.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x9d.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x9e.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x9lite.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x9lites.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_xlite.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_xlites.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_zorro.cpp | 1 + 18 files changed, 19 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index 950d94c6f7f..6f530166550 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -95,7 +95,7 @@ class LogicalSwitchEditPage: public Page LogicalSwitchData * cs = lswAddress(index); uint8_t cstate = lswFamily(cs->func); - if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cs->func == LS_FUNC_SAFE) { new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V1, 0, COLOR_THEME_PRIMARY1); auto choice = new SwitchChoice(logicalSwitchOneWindow, grid.getFieldSlot(), SWSRC_FIRST_IN_LOGICAL_SWITCHES, SWSRC_LAST_IN_LOGICAL_SWITCHES, GET_SET_DEFAULT(cs->v1)); choice->setAvailableHandler(isSwitchAvailableInLogicalSwitches); @@ -291,7 +291,7 @@ class LogicalSwitchButton : public Button dc->drawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func, COLOR_THEME_SECONDARY1); // CSW params - if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY) { + if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY || ls->func ==LS_FUNC_SAFE) { drawSwitch(dc, col2, line1, ls->v1, COLOR_THEME_SECONDARY1); drawSwitch(dc, col3, line1, ls->v2, COLOR_THEME_SECONDARY1); } else if (lsFamily == LS_FAMILY_EDGE) { diff --git a/radio/src/storage/conversions/yaml/myeeprom_220.h b/radio/src/storage/conversions/yaml/myeeprom_220.h index 077811b5882..927001e5817 100644 --- a/radio/src/storage/conversions/yaml/myeeprom_220.h +++ b/radio/src/storage/conversions/yaml/myeeprom_220.h @@ -202,6 +202,7 @@ enum LogicalSwitchesFunctions { LS_FUNC_ADIFFEGREATER, LS_FUNC_TIMER, LS_FUNC_STICKY, + LS_FUNC_SAFE, LS_FUNC_COUNT, LS_FUNC_MAX = LS_FUNC_COUNT-1 }; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index ac738379b3f..dc8603783a3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -180,6 +180,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index d309154e861..4f094fa8d8b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 06dda014002..5b3c5430cbc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 06dda014002..5b3c5430cbc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index e26e20077af..6c88549b6eb 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -172,6 +172,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 7c752a14110..967a305ed24 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index ed284e83aa4..082fc001fa3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -195,6 +195,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 5d23be1c9dd..27204f0a3b9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -193,6 +193,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 06dda014002..5b3c5430cbc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index a62b007458e..a569bc4a9b9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -174,6 +174,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index d6b42af42d9..41e6b3d53ca 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -186,6 +186,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index b12f418479a..bd2cb3a17f1 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -166,6 +166,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 3b0a05e5d0b..90598d01591 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -168,6 +168,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index e970bf285ca..d5c082bf5c2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -168,6 +168,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 5c8e1febde9..53fb763b0e2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index 96700f5cee3..ab1b75ffa28 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { From 9d201a2d476de9ef4785187c77bff84d4fb4563d Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 14 Jun 2022 01:04:56 +0000 Subject: [PATCH 016/122] evaluation logic for LogicSwitchFunctionSafe: disassociates the AndSwitch from affecting the new Logic Switch Type (cherry picked from commit 62a3fd10037346ea08df7e4cc77b94ec159f96d5) --- radio/src/switches.cpp | 287 +++++++++++++++++++++++------------------ 1 file changed, 163 insertions(+), 124 deletions(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 8678194bafd..b7b282caef0 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -377,136 +377,144 @@ bool getLogicalSwitch(uint8_t idx) LogicalSwitchData * ls = lswAddress(idx); bool result; - swsrc_t s = ls->andsw; - - if (ls->func == LS_FUNC_NONE || (s && !getSwitch(s))) { - if (ls->func != LS_FUNC_STICKY && ls->func != LS_FUNC_EDGE ) { - // AND switch must not affect STICKY and EDGE processing - LS_LAST_VALUE(mixerCurrentFlightMode, idx) = CS_LAST_VALUE_INIT; - } - result = false; + + if(ls->func ==LS_FAMILY_SAFE){ + + result = lswFm[mixerCurrentFlightMode].lsw[idx].state; } - else if ((s=lswFamily(ls->func)) == LS_FAMILY_BOOL) { - bool res1 = getSwitch(ls->v1); - bool res2 = getSwitch(ls->v2); - switch (ls->func) { - case LS_FUNC_AND: - result = (res1 && res2); - break; - case LS_FUNC_OR: - result = (res1 || res2); - break; - // case LS_FUNC_XOR: - default: - result = (res1 ^ res2); - break; - } - } - else if (s == LS_FAMILY_TIMER) { - result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) <= 0); - } - else if (s == LS_FAMILY_STICKY) { - result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); - } - else if (s == LS_FAMILY_EDGE) { - result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); - } - else { - getvalue_t x = getValueForLogicalSwitch(ls->v1); - getvalue_t y; - if (s == LS_FAMILY_COMP) { - y = getValueForLogicalSwitch(ls->v2); - - switch (ls->func) { - case LS_FUNC_EQUAL: - result = (x==y); - break; - case LS_FUNC_GREATER: - result = (x>y); - break; - default: - result = (xandsw; + if (ls->func == LS_FUNC_NONE || (s && !getSwitch(s))) { + if (ls->func != LS_FUNC_STICKY && ls->func != LS_FUNC_EDGE && ls->func != LS_FUNC_SAFE ) { + // AND switch must not affect STICKY and EDGE processing + LS_LAST_VALUE(mixerCurrentFlightMode, idx) = CS_LAST_VALUE_INIT; + } + result = false; } - } - else { - mixsrc_t v1 = ls->v1; - // Telemetry - if (v1 >= MIXSRC_FIRST_TELEM) { - if (!TELEMETRY_STREAMING() || IS_FAI_FORBIDDEN(v1-1)) { - result = false; - goto DurationAndDelayProcessing; + else if ((s=lswFamily(ls->func)) == LS_FAMILY_BOOL) { + bool res1 = getSwitch(ls->v1); + bool res2 = getSwitch(ls->v2); + switch (ls->func) { + case LS_FUNC_AND: + result = (res1 && res2); + break; + case LS_FUNC_OR: + result = (res1 || res2); + break; + // case LS_FUNC_XOR: + default: + result = (res1 ^ res2); + break; } - - y = convertLswTelemValue(ls); - - } - else if (v1 >= MIXSRC_GVAR1) { - y = ls->v2; + else if (s == LS_FAMILY_TIMER) { + result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) <= 0); } - else { - y = calc100toRESX(ls->v2); + // else if (s == LS_FAMILY_STICKY) { + // result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); + // } + else if (s == LS_FAMILY_SAFE) { + result = LS_LAST_VALUE(mixerCurrentFlightMode, idx); } - - switch (ls->func) { - case LS_FUNC_VEQUAL: - result = (x==y); - break; - case LS_FUNC_VALMOSTEQUAL: -#if defined(GVARS) - if (v1 >= MIXSRC_GVAR1 && v1 <= MIXSRC_LAST_GVAR) - result = (x==y); - else -#endif - result = (abs(x-y) < (1024 / STICK_TOLERANCE)); - break; - case LS_FUNC_VPOS: - result = (x>y); - break; - case LS_FUNC_VNEG: - result = (xy); - break; - case LS_FUNC_ANEG: - result = (abs(x)v1); + getvalue_t y; + if (s == LS_FAMILY_COMP) { + y = getValueForLogicalSwitch(ls->v2); + + switch (ls->func) { + case LS_FUNC_EQUAL: + result = (x==y); + break; + case LS_FUNC_GREATER: + result = (x>y); + break; + default: + result = (xfunc == LS_FUNC_DIFFEGREATER) { - if (y >= 0) { - result = (diff >= y); - if (diff < 0) - update = true; - } - else { - result = (diff <= y); - if (diff > 0) - update = true; + } + else { + mixsrc_t v1 = ls->v1; + // Telemetry + if (v1 >= MIXSRC_FIRST_TELEM) { + if (!TELEMETRY_STREAMING() || IS_FAI_FORBIDDEN(v1-1)) { + result = false; + goto DurationAndDelayProcessing; } + + y = convertLswTelemValue(ls); + + + } + else if (v1 >= MIXSRC_GVAR1) { + y = ls->v2; } else { - result = (abs(diff) >= y); + y = calc100toRESX(ls->v2); } - if (result || update) { - LS_LAST_VALUE(mixerCurrentFlightMode, idx) = x; + + switch (ls->func) { + case LS_FUNC_VEQUAL: + result = (x==y); + break; + case LS_FUNC_VALMOSTEQUAL: + #if defined(GVARS) + if (v1 >= MIXSRC_GVAR1 && v1 <= MIXSRC_LAST_GVAR) + result = (x==y); + else + #endif + result = (abs(x-y) < (1024 / STICK_TOLERANCE)); + break; + case LS_FUNC_VPOS: + result = (x>y); + break; + case LS_FUNC_VNEG: + result = (xy); + break; + case LS_FUNC_ANEG: + result = (abs(x)func == LS_FUNC_DIFFEGREATER) { + if (y >= 0) { + result = (diff >= y); + if (diff < 0) + update = true; + } + else { + result = (diff <= y); + if (diff > 0) + update = true; + } + } + else { + result = (abs(diff) >= y); + } + if (result || update) { + LS_LAST_VALUE(mixerCurrentFlightMode, idx) = x; + } + break; + } } - break; } } - } - } -DurationAndDelayProcessing: + DurationAndDelayProcessing: - if (ls->delay || ls->duration) { + if (ls->delay || ls->duration) { LogicalSwitchContext &context = lswFm[mixerCurrentFlightMode].lsw[idx]; if (result) { if (context.timerState == SWITCH_START) { @@ -542,8 +550,9 @@ bool getLogicalSwitch(uint8_t idx) context.timer = 0; } } - + } return result; + } bool getSwitch(swsrc_t swtch, uint8_t flags) @@ -620,7 +629,23 @@ bool getSwitch(swsrc_t swtch, uint8_t flags) return swtch > 0 ? result : !result; } - +void evalLogicalSwitch_FUNC_SAFE(LogicalSwitchData * ls, LogicalSwitchContext & context){ + if(ls->v1 != SWSRC_NONE){ + if(getSwitch(ls->v2)){ + //ON + if(getSwitch(ls->v1)){ + context.state = 1; + } + //OFF + if(!getSwitch(ls->v1)){ + context.state = 0; + } + } + } + else{//no source set therfore switch is off + context.state = 0; + } +} /** @brief Calculates new state of logical switches for mixerCurrentFlightMode */ @@ -628,19 +653,26 @@ void evalLogicalSwitches(bool isCurrentFlightmode) { for (unsigned int idx=0; idxfunc == LS_FUNC_SAFE){ + evalLogicalSwitch_FUNC_SAFE(ls, context); + } + else{ + bool result = getLogicalSwitch(idx); + if (isCurrentFlightmode) { + if (result) { + if (!context.state) PLAY_LOGICAL_SWITCH_ON(idx); + } + else { + if (context.state) PLAY_LOGICAL_SWITCH_OFF(idx); + } } + context.state = result; } - context.state = result; } } + swarnstate_t switches_states = 0; uint8_t fsswitches_states = 0; swsrc_t getMovedSwitch() @@ -902,6 +934,7 @@ void logicalSwitchesTimerTick() for (uint8_t fm=0; fmfunc == LS_FUNC_TIMER) { int16_t * lastValue = &LS_LAST_VALUE(fm, i); if (*lastValue == 0 || *lastValue == CS_LAST_VALUE_INIT) { @@ -916,6 +949,7 @@ void logicalSwitchesTimerTick() *lastValue -= 1; } } + else if (ls->func == LS_FUNC_STICKY) { ls_sticky_struct & lastValue = (ls_sticky_struct &)LS_LAST_VALUE(fm, i); bool before = lastValue.last & 0x01; @@ -942,6 +976,11 @@ void logicalSwitchesTimerTick() } } } + else if (ls->func == LS_FUNC_SAFE) { + LogicalSwitchContext & context = lswFm[mixerCurrentFlightMode].lsw[i]; + evalLogicalSwitch_FUNC_SAFE(ls, context); + } + else if (ls->func == LS_FUNC_EDGE) { ls_stay_struct & lastValue = (ls_stay_struct &)LS_LAST_VALUE(fm, i); // if this ls was reset by the logicalSwitchesReset() the lastValue will be set to CS_LAST_VALUE_INIT(0x8000) From 92018c9e6859bde36979d4d9bd44603aecacb14a Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 14 Jun 2022 01:14:20 +0000 Subject: [PATCH 017/122] removed AndSw for Logic Switch mode Safe (cherry picked from commit 0d95f2f9e5780b914188c0736a0736f326a62547) --- radio/src/gui/colorlcd/model_logical_switches.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index 6f530166550..c30d449dcca 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -191,10 +191,12 @@ class LogicalSwitchEditPage: public Page } // AND switch + if(cs->func != LS_FUNC_SAFE){ new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_AND_SWITCH, 0, COLOR_THEME_PRIMARY1); auto choice = new SwitchChoice(logicalSwitchOneWindow, grid.getFieldSlot(), -MAX_LS_ANDSW, MAX_LS_ANDSW, GET_SET_DEFAULT(cs->andsw)); choice->setAvailableHandler(isSwitchAvailableInLogicalSwitches); grid.nextLine(); + } // Duration new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_DURATION, 0, COLOR_THEME_PRIMARY1); From 5d060c2270ff3d33c01f00f31ab5d191422447b3 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 14 Jun 2022 07:56:37 +0000 Subject: [PATCH 018/122] update gui for new logic switch type (cherry picked from commit 6fd47d7b54c089c4e813cb6b2fa95bbdfd779adb) --- radio/src/dataconstants.h | 1 + radio/src/datastructs.h | 24 +++++++++---------- radio/src/datastructs_private.h | 1 + .../gui/colorlcd/model_logical_switches.cpp | 21 +++++++++++----- .../storage/yaml/yaml_datastructs_nv14.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_t12.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_t8.cpp | 3 ++- .../storage/yaml/yaml_datastructs_tlite.cpp | 3 ++- .../storage/yaml/yaml_datastructs_tpro.cpp | 3 ++- .../storage/yaml/yaml_datastructs_tx12.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_x10.cpp | 3 ++- .../storage/yaml/yaml_datastructs_x12s.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_x7.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 3 ++- .../storage/yaml/yaml_datastructs_x9lite.cpp | 3 ++- .../storage/yaml/yaml_datastructs_x9lites.cpp | 3 ++- .../storage/yaml/yaml_datastructs_xlite.cpp | 3 ++- .../storage/yaml/yaml_datastructs_xlites.cpp | 3 ++- .../storage/yaml/yaml_datastructs_zorro.cpp | 3 ++- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/en.h | 1 + 23 files changed, 64 insertions(+), 34 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index e8c982f8ff0..98d9baeacc9 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -134,6 +134,7 @@ enum CurveType { #endif #define LEN_SPEC_FN_NAME 10 +#define LEN_LOGICSW_NAME 10 #if defined(PCBFRSKY) || defined(PCBNV14) #define NUM_MODULES 2 diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index dd4338a59e5..925c9f1a8c1 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -51,7 +51,7 @@ static inline void check_struct() CHKSIZE(MixData, 20); CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 11); - CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(LogicalSwitchData, 19); CHKSIZE(CustomFunctionData, 21); CHKSIZE(FlightModeData, 28 + 2*NUM_TRIMS); CHKSIZE(TimerData, 11); @@ -65,7 +65,7 @@ static inline void check_struct() CHKSIZE(MixData, 20); CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 13); - CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(LogicalSwitchData, 19); CHKSIZE(CustomFunctionData, 21); CHKSIZE(FlightModeData, 40); CHKSIZE(TimerData, 16); @@ -109,7 +109,7 @@ static inline void check_struct() #endif /* board specific ifdefs*/ - CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(LogicalSwitchData, 19); CHKSIZE(TelemetrySensor, 14); CHKSIZE(ModuleData, 29); CHKSIZE(GVarData, 7); @@ -118,33 +118,33 @@ static inline void check_struct() #if defined(PCBXLITES) CHKSIZE(RadioData, 1501); - CHKSIZE(ModelData, 6801); + CHKSIZE(ModelData, 7441); #elif defined(PCBXLITE) CHKSIZE(RadioData, 1499); - CHKSIZE(ModelData, 6801); + CHKSIZE(ModelData, 7441); #elif defined(RADIO_TPRO) CHKSIZE(RadioData, 1482); - CHKSIZE(ModelData, 6826); + CHKSIZE(ModelData, 7466); #elif defined(PCBX7) CHKSIZE(RadioData, 1505); - CHKSIZE(ModelData, 6801); + CHKSIZE(ModelData, 7441); #elif defined(PCBX9E) CHKSIZE(RadioData, 1595); - CHKSIZE(ModelData, 7253); + CHKSIZE(ModelData, 7893); #elif defined(PCBX9D) || defined(PCBX9DP) CHKSIZE(RadioData, 1537); - CHKSIZE(ModelData, 7245); + CHKSIZE(ModelData, 7885); #elif defined(PCBHORUS) #if defined(PCBX10) CHKSIZE(RadioData, 1563); - CHKSIZE(ModelData, 11665); + CHKSIZE(ModelData, 12305); #else CHKSIZE(RadioData, 1545); - CHKSIZE(ModelData, 11663); + CHKSIZE(ModelData, 12303); #endif #elif defined(PCBNV14) CHKSIZE(RadioData, 1491); - CHKSIZE(ModelData, 11479); + CHKSIZE(ModelData, 12119); #endif #undef CHKSIZE diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 3821e449cef..91b06352510 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -138,6 +138,7 @@ PACK(struct LogicalSwitchData { int16_t v2 SKIP; uint8_t delay; uint8_t duration; + NOBACKUP(char custName[LEN_LOGICSW_NAME]); }); /* diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index c30d449dcca..c689c97f0db 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -94,7 +94,10 @@ class LogicalSwitchEditPage: public Page LogicalSwitchData * cs = lswAddress(index); uint8_t cstate = lswFamily(cs->func); - + // custom label + new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_CUST_LOGICALSWITCH_LABEL, 0, COLOR_THEME_PRIMARY1); + new ModelTextEdit(logicalSwitchOneWindow, grid.getFieldSlot(), cs->custName, LEN_LOGICSW_NAME); + grid.nextLine(); if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cs->func == LS_FUNC_SAFE) { new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V1, 0, COLOR_THEME_PRIMARY1); auto choice = new SwitchChoice(logicalSwitchOneWindow, grid.getFieldSlot(), SWSRC_FIRST_IN_LOGICAL_SWITCHES, SWSRC_LAST_IN_LOGICAL_SWITCHES, GET_SET_DEFAULT(cs->v1)); @@ -254,6 +257,7 @@ class LogicalSwitchEditPage: public Page static constexpr coord_t line1 = FIELD_PADDING_TOP; static constexpr coord_t line2 = line1 + PAGE_LINE_HEIGHT; +static constexpr coord_t line3 = line2 + PAGE_LINE_HEIGHT; static constexpr coord_t col1 = 20; static constexpr coord_t col2 = (LCD_W - 100) / 3 + col1; static constexpr coord_t col3 = ((LCD_W - 100) / 3) * 2 + col1; @@ -290,8 +294,8 @@ class LogicalSwitchButton : public Button uint8_t lsFamily = lswFamily(ls->func); // CSW func - dc->drawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func, COLOR_THEME_SECONDARY1); - + //dc->drawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func, COLOR_THEME_SECONDARY1); + dc->drawText(col1, line1, ls->custName, COLOR_THEME_SECONDARY1); // CSW params if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY || ls->func ==LS_FUNC_SAFE) { drawSwitch(dc, col2, line1, ls->v1, COLOR_THEME_SECONDARY1); @@ -323,15 +327,20 @@ class LogicalSwitchButton : public Button if (lsFamily != LS_FAMILY_EDGE && ls->delay > 0) { dc->drawNumber(col3, line2, ls->delay, COLOR_THEME_SECONDARY1 | PREC1 | LEFT); } + // switch custom name + //dc->drawText(col1, line3, "somename", COLOR_THEME_SECONDARY1); } void paint(BitmapBuffer* dc) override { - if (active) + if (active){ dc->drawSolidFilledRect(0, 0, rect.w, rect.h, COLOR_THEME_ACTIVE); - else + dc->drawText(col1, line3, "somename", COLOR_THEME_SECONDARY1); + } + else{ dc->drawSolidFilledRect(0, 0, rect.w, rect.h, COLOR_THEME_PRIMARY2); - + dc->drawText(col1, line3, "somename", COLOR_THEME_SECONDARY1); + } paintLogicalSwitchLine(dc); // The bounding rect diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index dc8603783a3..9772a5bb1f3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -545,6 +545,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -859,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 152, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 4f094fa8d8b..d5810f00411 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -512,6 +512,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -829,7 +830,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 5b3c5430cbc..1af20a6a37f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -512,6 +512,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -829,7 +830,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 5b3c5430cbc..1af20a6a37f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -512,6 +512,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -829,7 +830,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index 6c88549b6eb..fd72d4407e1 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -518,6 +518,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -835,7 +836,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 967a305ed24..f4ef8e29eb5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -512,6 +512,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -829,7 +830,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 082fc001fa3..98fa2ae639a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -569,6 +569,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -883,7 +884,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 152, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 27204f0a3b9..d62eeafe9d9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -567,6 +567,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -881,7 +882,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 152, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 5b3c5430cbc..1af20a6a37f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -512,6 +512,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -829,7 +830,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index a569bc4a9b9..bc406fdf203 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -520,6 +520,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -842,7 +843,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 41e6b3d53ca..70e49e6e944 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -559,6 +559,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -881,7 +882,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index bd2cb3a17f1..c5259ff9e87 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -497,6 +497,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -814,7 +815,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 90598d01591..f3172b7c697 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -507,6 +507,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -824,7 +825,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index d5c082bf5c2..e65922db7bf 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -504,6 +504,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -821,7 +822,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 53fb763b0e2..d5f0b7f72fb 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -508,6 +508,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -825,7 +826,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index ab1b75ffa28..255fbad8714 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -512,6 +512,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -829,7 +830,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 076bad03275..c2ba7d5a117 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -265,6 +265,7 @@ const char STR_MENUCURVES[] = TR_MENUCURVES; const char STR_MENUCURVE[] = TR_MENUCURVE; const char STR_MENULOGICALSWITCH[] = TR_MENULOGICALSWITCH; const char STR_MENULOGICALSWITCHES[] = TR_MENULOGICALSWITCHES; +const char STR_CUST_LOGICALSWITCH_LABEL[] = TR_CUST_LOGICALSWITCH_LABEL; const char STR_MENUCUSTOMFUNC[] = TR_MENUCUSTOMFUNC; const char STR_CUST_FUNC_CUST_LABEL[] = TR_CUST_FUNC_CUST_LABEL; const char STR_SPLASHSCREEN[] = TR_SPLASHSCREEN; diff --git a/radio/src/translations.h b/radio/src/translations.h index 39d279e8a7c..29030470500 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -425,6 +425,7 @@ extern const char STR_MENUCURVES[]; extern const char STR_MENUCURVE[]; extern const char STR_MENULOGICALSWITCH[]; extern const char STR_MENULOGICALSWITCHES[]; +extern const char STR_CUST_LOGICALSWITCH_LABEL[]; extern const char STR_MENUCUSTOMFUNC[]; extern const char STR_CUST_FUNC_CUST_LABEL[]; extern const char STR_MENUCUSTOMSCRIPTS[]; diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 8b6780fcfd8..a3f6aa01e80 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -512,6 +512,7 @@ #define TR_MENUCURVE "CURVE" #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" #define TR_MENULOGICALSWITCHES "LOGICAL SWITCHES" +#define TR_CUST_LOGICALSWITCH_LABEL "Name" #define TR_MENUCUSTOMFUNC "SPECIAL FUNCTIONS" #define TR_CUST_FUNC_CUST_LABEL "Name" #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" From 2682362f464ae39e021e85ba9b794f8fc19ec80f Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Mon, 20 Jun 2022 14:30:37 +1000 Subject: [PATCH 019/122] translations non English Texts (cherry picked from commit 8ee9c821034b7dd84b981eb1a845025afd384575) --- radio/src/translations/cn.h.txt | 20 +++++++++++++++++++- radio/src/translations/cz.h.txt | 20 +++++++++++++++++++- radio/src/translations/de.h.txt | 20 +++++++++++++++++++- radio/src/translations/en.h.txt | 20 +++++++++++++++++++- radio/src/translations/es.h.txt | 20 +++++++++++++++++++- radio/src/translations/fi.h.txt | 20 +++++++++++++++++++- radio/src/translations/fr.h.txt | 20 +++++++++++++++++++- radio/src/translations/it.txt | 20 +++++++++++++++++++- radio/src/translations/nl.h.txt | 20 +++++++++++++++++++- radio/src/translations/pl.h.txt | 20 +++++++++++++++++++- radio/src/translations/pt.h.txt | 20 +++++++++++++++++++- radio/src/translations/se.h.txt | 22 +++++++++++++++++++++- 12 files changed, 230 insertions(+), 12 deletions(-) diff --git a/radio/src/translations/cn.h.txt b/radio/src/translations/cn.h.txt index b0f54d97ecf..b007d701f3c 100644 --- a/radio/src/translations/cn.h.txt +++ b/radio/src/translations/cn.h.txt @@ -1 +1,19 @@ -#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file +#define TR_CUST_FUNC_CUST_LABEL "Name" + +//if LCD_W >= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a Date: Mon, 26 Sep 2022 16:40:38 +1000 Subject: [PATCH 020/122] chore: Set codename --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b626a8a7b5..f2826774136 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ project(EdgeTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "8") set(VERSION_REVISION "0") -set(CODENAME "dev") +set(CODENAME "FlyingDutchman") if(DEFINED ENV{EDGETX_VERSION_TAG}) set(VERSION_TAG "$ENV{EDGETX_VERSION_TAG}") From 474790b1cb28541d91d0f53ac550a99c106bc319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20B=C3=A1ny=C3=A1sz?= <36520141+banyaszg@users.noreply.github.com> Date: Tue, 27 Sep 2022 03:43:17 +0200 Subject: [PATCH 021/122] fix(color): Remove Main View - Main Zone left side offset (#2374) --- radio/src/gui/colorlcd/view_main_decoration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/view_main_decoration.cpp b/radio/src/gui/colorlcd/view_main_decoration.cpp index 9f5e9e121c0..80bfc106f96 100644 --- a/radio/src/gui/colorlcd/view_main_decoration.cpp +++ b/radio/src/gui/colorlcd/view_main_decoration.cpp @@ -101,7 +101,7 @@ rect_t ViewMainDecoration::getMainZone() const // update layout first lv_obj_update_layout(parent->getLvObj()); - auto x_left = lv_obj_get_x2(w_ml->getLvObj()) + 1; + auto x_left = lv_obj_get_x2(w_ml->getLvObj()); auto x_right = lv_obj_get_x(w_mr->getLvObj()); lv_coord_t bottom = LCD_H; From 8f8dd9cbc5a7312b8fb58dd187e55a59ac8858d1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 27 Sep 2022 03:52:28 +0200 Subject: [PATCH 022/122] feat(color): More tuning of rotary encoder acc, enable for color picker (#2366) * Smoother encoder acceleration * Enable encoder accel on color picker --- radio/src/gui/colorlcd/LvglWrapper.cpp | 7 ++++--- radio/src/gui/colorlcd/color_editor.cpp | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/colorlcd/LvglWrapper.cpp b/radio/src/gui/colorlcd/LvglWrapper.cpp index d783f604870..c43be261f68 100644 --- a/radio/src/gui/colorlcd/LvglWrapper.cpp +++ b/radio/src/gui/colorlcd/LvglWrapper.cpp @@ -261,10 +261,11 @@ static void rotaryDriverRead(lv_indev_drv_t *drv, lv_indev_data_t *data) else if (diff > 0) dir = 1; if (use_accel && (dir == prevDir)) { - if (g_tmr10ms - lastEvent <= ROTENC_DELAY_HIGHSPEED) { // 160 ms + auto speed = (g_tmr10ms - lastEvent) / abs(diff); + if (speed <= ROTENC_DELAY_HIGHSPEED/2) { // 80 ms // below ROTENC_DELAY_HIGHSPEED btw. events: accelerate - accel += abs(diff); - } else if (g_tmr10ms - lastEvent >= ROTENC_DELAY_MIDSPEED) { // 320 ms + accel = min((int8_t)(accel + 1), (int8_t)25); + } else if (speed >= ROTENC_DELAY_MIDSPEED/2) { // 160 ms // above ROTENC_DELAY_MIDSPEED btw. events: normal speed accel = 0; } diff --git a/radio/src/gui/colorlcd/color_editor.cpp b/radio/src/gui/colorlcd/color_editor.cpp index 7fdf927952b..c8959ba821d 100644 --- a/radio/src/gui/colorlcd/color_editor.cpp +++ b/radio/src/gui/colorlcd/color_editor.cpp @@ -140,6 +140,8 @@ ColorBar::ColorBar(Window* parent, const rect_t& r, uint32_t value, uint32_t maxValue, bool invert) : FormField(parent, r) { + lv_obj_add_flag(lvobj, LV_OBJ_FLAG_ENCODER_ACCEL); + lv_group_add_obj((lv_group_t*)lv_group_get_default(), lvobj); lv_obj_add_event_cb(lvobj, ColorBar::pressing, LV_EVENT_PRESSING, nullptr); lv_obj_add_event_cb(lvobj, ColorBar::on_key, LV_EVENT_KEY, nullptr); From 4b025327c8cc65e91a9c12e34f732924ee5cbdcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20B=C3=A1ny=C3=A1sz?= <36520141+banyaszg@users.noreply.github.com> Date: Tue, 27 Sep 2022 04:03:53 +0200 Subject: [PATCH 023/122] fix(lua): lcd.drawGauge wide gauge error (#2375) --- radio/src/lua/api_colorlcd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/lua/api_colorlcd.cpp b/radio/src/lua/api_colorlcd.cpp index 3bd0faf5aae..95bc6debf9a 100644 --- a/radio/src/lua/api_colorlcd.cpp +++ b/radio/src/lua/api_colorlcd.cpp @@ -954,7 +954,7 @@ static int luaLcdDrawGauge(lua_State *L) flags = flagsRGB(flags); luaLcdBuffer->drawRect(x, y, w, h, 1, 0xff, flags); - uint8_t len = limit((uint8_t)1, uint8_t(w*num/den), uint8_t(w)); + uint16_t len = limit((uint16_t)1, uint16_t(w*num/den), uint16_t(w)); luaLcdBuffer->drawSolidFilledRect(x+1, y+1, len, h-2, flags); return 0; From 1095de20bae138cf7a9a6738353cdc7a5731c58f Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 27 Sep 2022 04:52:08 +0200 Subject: [PATCH 024/122] fix(color): Unify button colors (#2367) * Button: change bg color to COLOR_THEME_PRIMARY2 And text color to COLOR_THEME_SECONDARY1 Fixes #2304 * fix: TextButton constuctor calls Setting the font in the constructor never worked, but did set the text color to black. * chore: Bump libopenui --- radio/src/gui/colorlcd/model_flightmodes.cpp | 3 +- radio/src/gui/colorlcd/model_select.cpp | 36 ++++++++----------- radio/src/gui/colorlcd/preview_window.h | 3 +- radio/src/gui/colorlcd/radio_theme.cpp | 14 +++----- .../src/gui/colorlcd/themes/etx_lv_theme.cpp | 4 +-- radio/src/thirdparty/libopenui | 2 +- 6 files changed, 25 insertions(+), 37 deletions(-) diff --git a/radio/src/gui/colorlcd/model_flightmodes.cpp b/radio/src/gui/colorlcd/model_flightmodes.cpp index ec846b0a0b8..5efd82bd6d2 100644 --- a/radio/src/gui/colorlcd/model_flightmodes.cpp +++ b/radio/src/gui/colorlcd/model_flightmodes.cpp @@ -124,8 +124,7 @@ struct FMTrimSettings : public Dialog { SET_DIRTY(); return 0; } - }, - 0, COLOR_THEME_PRIMARY1); + }); if (tr->mode != TRIM_MODE_NONE) btn->check(); btn->setWidth(LV_DPI_DEF / 2); diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index 4fe446a2925..d45464e2a07 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -61,7 +61,6 @@ constexpr int BUTTONS_HEIGHT = 30; constexpr int MODEL_CELLS_PER_LINE = 2; #if LCD_W > LCD_H // Landscape -constexpr LcdFlags textFont = FONT(STD); constexpr int LABELS_WIDTH = 132; constexpr int LAY_MARGIN = 5; constexpr coord_t MODEL_SELECT_CELL_WIDTH = @@ -69,7 +68,6 @@ constexpr coord_t MODEL_SELECT_CELL_WIDTH = (MODEL_CELLS_PER_LINE + 1) * MODEL_CELL_PADDING) / MODEL_CELLS_PER_LINE; #else // Portrait -constexpr LcdFlags textFont = FONT(XS); constexpr int LAY_MARGIN = 8; constexpr int LABELS_HEIGHT = 140; constexpr coord_t MODEL_SELECT_CELL_WIDTH = @@ -147,18 +145,17 @@ class ButtonHolder : public FormWindow addButton(mask_sort_date_up, mask_sort_date_down); // New label button - auto btn = new TextButton( - this, rect_t{}, + auto btn = new TextButton(this, rect_t{}, #if LCD_W > LCD_H - STR_NEW, + STR_NEW, #else - STR_NEW_LABEL, + STR_NEW_LABEL, #endif - [=]() { - if(_newLabelHandler) _newLabelHandler(); - return 0; - }, - BUTTON_BACKGROUND | OPAQUE, textFont); + [=]() { + if (_newLabelHandler) _newLabelHandler(); + return 0; + }); + btn->padAll(lv_dpx(4)); lv_obj_align(btn->getLvObj(), LV_ALIGN_RIGHT_MID, 0, 0); @@ -524,8 +521,7 @@ class LabelDialog : public Dialog if (saveHandler != nullptr) saveHandler(label); deleteLater(); return 0; - }, - BUTTON_BACKGROUND | OPAQUE, textFont); + }); btn->setWidth(LV_DPI_DEF); btn = new TextButton( @@ -533,8 +529,7 @@ class LabelDialog : public Dialog [=]() { deleteLater(); return 0; - }, - BUTTON_BACKGROUND | OPAQUE, textFont); + }); btn->setWidth(LV_DPI_DEF); content->setWidth(LCD_W * 0.8); @@ -658,13 +653,10 @@ void ModelLabelsWindow::buildHead(PageHeader *hdr) setTitle(); // new model button - auto btn = new TextButton( - hdr, rect_t{}, STR_NEW_MODEL, - [=]() { - newModel(); - return 0; - }, - BUTTON_BACKGROUND | OPAQUE, textFont); + auto btn = new TextButton(hdr, rect_t{}, STR_NEW_MODEL, [=]() { + newModel(); + return 0; + }); btn->padAll(lv_dpx(4)); diff --git a/radio/src/gui/colorlcd/preview_window.h b/radio/src/gui/colorlcd/preview_window.h index 40702acb8c7..a4914b1f3b6 100644 --- a/radio/src/gui/colorlcd/preview_window.h +++ b/radio/src/gui/colorlcd/preview_window.h @@ -149,10 +149,11 @@ class ThemedButton : public TextButton public: ThemedButton(FormGroup *window, const rect_t &rect, std::string text, bool isChecked, WindowFlags windowFlags, LcdColorIndex colorIndex) : - TextButton(window, rect, text, nullptr, windowFlags | NO_FOCUS, COLOR(colorIndex)), + TextButton(window, rect, text, nullptr, windowFlags | NO_FOCUS), _colorIndex(colorIndex), _isChecked(isChecked) { + setTextFlags(COLOR(colorIndex)); setPressHandler([=] () { return _isChecked; }); } diff --git a/radio/src/gui/colorlcd/radio_theme.cpp b/radio/src/gui/colorlcd/radio_theme.cpp index c8820fc6e6b..eda19cab33f 100644 --- a/radio/src/gui/colorlcd/radio_theme.cpp +++ b/radio/src/gui/colorlcd/radio_theme.cpp @@ -59,7 +59,6 @@ #if (LCD_W > LCD_H) constexpr int BUTTON_HEIGHT = 30; constexpr int BUTTON_WIDTH = 75; -constexpr LcdFlags textFont = FONT(STD); constexpr rect_t detailsDialogRect = {50, 50, 400, 170}; constexpr int labelWidth = 150; @@ -69,7 +68,6 @@ constexpr int COLOR_BOX_HEIGHT = 27; #else constexpr int BUTTON_HEIGHT = 30; constexpr int BUTTON_WIDTH = 65; -constexpr LcdFlags textFont = FONT(XS); constexpr rect_t detailsDialogRect = {5, 50, LCD_W - 10, 340}; constexpr int labelWidth = 120; @@ -112,12 +110,12 @@ class ThemeDetailsDialog: public Dialog saveHandler(this->theme); deleteLater(); return 0; - }, BUTTON_BACKGROUND | OPAQUE, textFont); + }); r.x -= (BUTTON_WIDTH + 5); new TextButton(&content->form, r, STR_CANCEL, [=] () { deleteLater(); return 0; - }, BUTTON_BACKGROUND | OPAQUE, textFont); + }); } protected: @@ -270,16 +268,14 @@ class ColorEditPage : public Page [=] () { setActiveColorBar(0); return 1; - }, - 0, COLOR_THEME_PRIMARY1)); + })); r.x += (BUTTON_WIDTH + 5); _tabs.emplace_back( new TextButton(window, r, "HSV", [=] () { setActiveColorBar(1); return 1; - }, - 0, COLOR_THEME_PRIMARY1)); + })); _tabs[1]->check(true); } }; @@ -352,7 +348,7 @@ class ThemeEditPage : public Page _dirty = true; }); return 0; - }, BUTTON_BACKGROUND | OPAQUE, textFont); + }); } void buildBody(FormGroup *window) diff --git a/radio/src/gui/colorlcd/themes/etx_lv_theme.cpp b/radio/src/gui/colorlcd/themes/etx_lv_theme.cpp index b8b1088fa02..7cac897f659 100644 --- a/radio/src/gui/colorlcd/themes/etx_lv_theme.cpp +++ b/radio/src/gui/colorlcd/themes/etx_lv_theme.cpp @@ -296,12 +296,12 @@ static void style_init(void) : lv_disp_dpx(theme.disp, 8))); lv_style_set_bg_opa(&styles.btn, LV_OPA_COVER); - lv_style_set_bg_color(&styles.btn, makeLvColor(COLOR_THEME_SECONDARY2)); + lv_style_set_bg_color(&styles.btn, makeLvColor(COLOR_THEME_PRIMARY2)); lv_style_set_border_opa(&styles.btn, LV_OPA_0); lv_style_set_border_width(&styles.btn, BORDER_WIDTH); - lv_style_set_text_color(&styles.btn, color_text); + lv_style_set_text_color(&styles.btn, makeLvColor(COLOR_THEME_SECONDARY1)); lv_style_set_pad_hor(&styles.btn, PAD_SMALL); lv_style_set_pad_ver(&styles.btn, PAD_SMALL); lv_style_set_pad_column(&styles.btn, lv_disp_dpx(theme.disp, 5)); diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index e3f6e2d12e0..2ccef5198ae 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit e3f6e2d12e007600e907a000816f546482fcb716 +Subproject commit 2ccef5198aeb75295f1eb3d0c725bc91872ff7b9 From 27c9800c5b7db17fa65531eee279dfe8772ac1d7 Mon Sep 17 00:00:00 2001 From: Malte Langermann <54738901+gagarinlg@users.noreply.github.com> Date: Tue, 27 Sep 2022 05:01:12 +0200 Subject: [PATCH 025/122] fix(color): Lua vertical font alignment corrections (#2371) --- radio/src/lua/api_colorlcd.cpp | 2 +- radio/src/lua/api_colorlcd.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/lua/api_colorlcd.cpp b/radio/src/lua/api_colorlcd.cpp index 95bc6debf9a..57d60657c69 100644 --- a/radio/src/lua/api_colorlcd.cpp +++ b/radio/src/lua/api_colorlcd.cpp @@ -39,7 +39,7 @@ static int8_t getTextHorizontalOffset(LcdFlags flags) if (font_index >= sizeof(text_horizontal_offset)) { return 0; } - return text_horizontal_offset[font_index]; + return 0;//text_horizontal_offset[font_index]; } static int8_t getTextVerticalOffset(LcdFlags flags) diff --git a/radio/src/lua/api_colorlcd.h b/radio/src/lua/api_colorlcd.h index 81007a2b4e9..32b6d7d57ea 100644 --- a/radio/src/lua/api_colorlcd.h +++ b/radio/src/lua/api_colorlcd.h @@ -36,10 +36,10 @@ constexpr coord_t INVERT_BOX_MARGIN = 2; constexpr int8_t text_horizontal_offset[7] {-2,-1,-2,-2,-2,-2,-2}; -constexpr int8_t text_vertical_offset[7] {2,2,0,2,3,3,7}; +constexpr int8_t text_vertical_offset[7] {0,0,0,0,0,-1,7}; extern bool luaLcdAllowed; extern BitmapBuffer * luaLcdBuffer; extern Widget * runningFS; -LcdFlags flagsRGB(LcdFlags flags); \ No newline at end of file +LcdFlags flagsRGB(LcdFlags flags); From ceac58134d82d29b8d94bf7d28ba559fd577d6f8 Mon Sep 17 00:00:00 2001 From: ParkerEde Date: Tue, 27 Sep 2022 05:08:14 +0200 Subject: [PATCH 026/122] =?UTF-8?q?feat:=20Updated=20German=20translations?= =?UTF-8?q?=20=F0=9F=87=A9=F0=9F=87=AA=20(#2360)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update de.h * Update de.h * Update de.h * Update de.h * Update de.h --- radio/src/translations/de.h | 298 ++++++++++++++++++------------------ 1 file changed, 149 insertions(+), 149 deletions(-) diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 7f7c2bd8552..2d6a0a8f0b7 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -51,8 +51,8 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (Kabel)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","not inverted" -#define TR_MULTI_TELEMETRY_MODE "Off","On","Off+Aux","On+Aux" -#define TR_MULTI_CUSTOM "Custom" +#define TR_MULTI_TELEMETRY_MODE "Aus","Ein","Aus+Aux","Ein+Aux" +#define TR_MULTI_CUSTOM "Benutzer" #define TR_VTRIMINC TR("Expo","Exponentiell"),TR("ExFein","Extrafein"),"Fein","Mittel","Grob" #define TR_VDISPLAYTRIMS "Nein","Kurz","Ja" // Trimmwerte Keine, kurze Anzeigen, Ja #define TR_VBEEPCOUNTDOWN "Kein","Pieps","Stimme","Haptik" @@ -269,7 +269,7 @@ #define TR_EXTRA_VSRCRAW "Batt","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" #define TR_VTMRMODES "AUS","EIN","GSs","GS%","GSt" -#define TR_VTRAINER_MASTER_OFF "OFF" +#define TR_VTRAINER_MASTER_OFF "AUS" #define TR_VTRAINER_MASTER_JACK "Lehrer/Buchse" #define TR_VTRAINER_SLAVE_JACK "Schüler/Buchse" #define TR_VTRAINER_MASTER_SBUS_MODULE "Lehrer/SBUS Modul" @@ -331,8 +331,8 @@ #endif #define TR_FREE "frei" -#define TR_YES "Yes" -#define TR_NO "No" +#define TR_YES "Ja" +#define TR_NO "Nein" #define TR_DELETEMODEL "Modell löschen?" #define TR_COPYINGMODEL "Kopiere Modell" #define TR_MOVINGMODEL "Schiebe Modell" @@ -345,7 +345,7 @@ #define TR_INPUTNAME TR("Input", "Input name") #define TR_EXPONAME TR("Name", "Line name") #define TR_BITMAP "Modellfoto" -#define TR_NO_PICTURE "No Picture" +#define TR_NO_PICTURE "kein Foto" #define TR_TIMER "Timer" #define TR_START "Start" #define TR_ELIMITS TR("Erw. Limit", "Erw. Wege auf 150%") @@ -365,7 +365,7 @@ #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Schalt.", "Schalter") -#define TR_TRIMS "Trims" +#define TR_TRIMS "Trimmer" #define TR_FADEIN "Langs. Ein" #define TR_FADEOUT "Langs. Aus" #define TR_DEFAULT "(Normal)" @@ -396,7 +396,7 @@ #define TR_FLMODE TR("Phase", "Phasen") #define TR_MIXWARNING "Warnung" #define TR_OFF "AUS" -#define TR_ANTENNA "Antenna" +#define TR_ANTENNA "Antenne" #define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Wirkung" #define TR_DELAYDOWN "Verz. Dn" @@ -430,8 +430,8 @@ #define TR_CONTRAST "LCD-Kontrast" #define TR_ALARMS_LABEL "Alarme" #define TR_BATTERY_RANGE TR("Akku Bereich", "Akku Spannungsbereich") // Symbol Akku Ladezustand -#define TR_BATTERYCHARGING "Charging..." -#define TR_BATTERYFULL "Battery full" +#define TR_BATTERYCHARGING "Lädt..." +#define TR_BATTERYFULL "Akku voll" #define TR_BATTERYNONE "None!" #define TR_BATTERYWARNING TR("Akku Warnung", "Akkuspannungswarnung") #define TR_INACTIVITYALARM TR("Inaktivität", "Inaktivität nach") @@ -439,10 +439,10 @@ #define TR_ALARMWARNING TR("Alle Töne aus?", "Alle Töne ganz aus?") #define TR_RSSI_SHUTDOWN_ALARM TR(INDENT "RSSI-Chk aus?", INDENT "Prüfe RSSI bei Ausschalten") #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") -#define TR_MODEL_STILL_POWERED "Model still powered" -#define TR_USB_STILL_CONNECTED "USB still connected" -#define TR_MODEL_SHUTDOWN "Shutdown ?" -#define TR_PRESS_ENTER_TO_CONFIRM "Press enter to confirm" +#define TR_MODEL_STILL_POWERED "Modell noch aktiv!" +#define TR_USB_STILL_CONNECTED "USB noch verbunden" +#define TR_MODEL_SHUTDOWN "Herunterfahren?" +#define TR_PRESS_ENTER_TO_CONFIRM "Drücke [ENTER] zum Bestätigen" #define TR_THROTTLE_LABEL "Gas-Kontrolle" #define TR_THROTTLEREVERSE TR("Gas invers", INDENT "Vollgas hinten?") //Änderung wg TH9x, Taranis #define TR_MINUTEBEEP TR("Min-Alarm", "Minuten-Alarm") @@ -457,8 +457,8 @@ #define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR "Farbe" #define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Anzeigedauer") -#define TR_PWR_ON_DELAY "Pwr On delay" -#define TR_PWR_OFF_DELAY "Pwr Off delay" +#define TR_PWR_ON_DELAY "PWR EIN Verzög." +#define TR_PWR_OFF_DELAY "PWR AUS Verzög." #define TR_THROTTLE_WARNING TR("Gasalarm", INDENT "Gas Alarm") #define TR_CUSTOM_THROTTLE_WARNING TR(INDENT INDENT INDENT INDENT "Cust-Pos", INDENT INDENT INDENT INDENT "Custom position?") #define TR_CUSTOM_THROTTLE_WARNING_VAL TR("Pos. %", "Position %") @@ -580,37 +580,37 @@ #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") #define TR_RF_POWER INDENT "RF Power" -#define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") +#define TR_MULTI_FIXEDID TR("FesteID", "Feste ID") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert") -#define TR_MULTI_AUTOBIND TR(INDENT "Bind Ch.",INDENT "Bind on channel") -#define TR_DISABLE_CH_MAP TR("No Ch. map", "Disable Ch. map") -#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") +#define TR_MULTI_AUTOBIND TR(INDENT "Bind Ka.",INDENT "Bindung an Kanal") +#define TR_DISABLE_CH_MAP TR("No Ch. map", "Deaktiviere Ch. map") +#define TR_DISABLE_TELEM TR("No Telem", "Deaktiviere Telem.") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") -#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "reduzierte Leistung") #define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("EIN", "Aktiviert") -#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") +#define TR_DISABLE_INTERNAL TR("Deaktiv. int. RF", "Deaktiviere int. RF") #define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") #define TR_MODULE_NO_INPUT TR("No input", "No serial input") -#define TR_MODULE_NO_TELEMETRY TR3("Keine Telem.", "Keine MULTI_TELEMETRY", "Keine Telemetrie (aktiviere MULTI_TELEMETRY)") -#define TR_MODULE_WAITFORBIND "Bind to load protocol" -#define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Modul\nUpdate nötig") -#define TR_MODULE_UPGRADE TR("Upg. advised", "Modulupdate empfohlen") -#define TR_REBIND "Rebinding required" +#define TR_MODULE_NO_TELEMETRY TR3("Keine Telem.", "Keine MULTI_TELEMETRIE", "Keine Telemetrie (aktiviere MULTI_TELEMETRIE)") +#define TR_MODULE_WAITFORBIND "Warten auf Bindung" +#define TR_MODULE_BINDING "Binde" +#define TR_MODULE_UPGRADE_ALERT TR3("Upg. nötig", "Modul Upgrade nötig", "Modul\nUpgrade nötig") +#define TR_MODULE_UPGRADE TR("Upg. empf.", "Modul Upgrade empf.") +#define TR_REBIND "Neu binden nötig" #define TR_REG_OK "Registration ok" -#define TR_BIND_OK "Bind successful" +#define TR_BIND_OK "Binden erfolgreich" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem AN" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem AUS" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem AN" #define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem AUS" -#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") -#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") +#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protokoll ungültig") +#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Modul Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Proto Sync Status") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") -#define TR_MULTI_MAX_THROW TR("Max. Throw", "Aktiviere max. throw") -#define TR_MULTI_RFCHAN TR("RF Channel", "Select RF channel") +#define TR_MULTI_SERVOFREQ TR(INDENT "Servo Rate", INDENT "Servo Update Rate") +#define TR_MULTI_MAX_THROW TR("Max. Weg", "Aktiviere Max. Weg") +#define TR_MULTI_RFCHAN TR("RF Channel", "Wähle RF Kanal") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Grenzen" #define TR_MINRSSI "Min. RSSI" @@ -628,23 +628,23 @@ #define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spannungsquelle") //9XR-Pro #define TR_CURRENT TR(INDENT "Strom", INDENT "Stromquelle") #define TR_SELECT_MODEL "Modell auswählen" -#define TR_MODELS "Models" -#define TR_SELECT_MODE "Select mode" +#define TR_MODELS "Modelle" +#define TR_SELECT_MODE "Wähle Mode" #define TR_CREATE_MODEL TR("Neues Modell" , "Neues Modell erstellen") -#define TR_FAVORITE_LABEL "Favorites" -#define TR_NEW_MODEL "New Model" -#define TR_INVALID_MODEL "Invalid Model" -#define TR_EDIT_LABELS "Edit Labels" -#define TR_MOVE_UP "Move Up" -#define TR_MOVE_DOWN "Move Down" +#define TR_FAVORITE_LABEL "Favoriten" +#define TR_NEW_MODEL "Neues Modell" +#define TR_INVALID_MODEL "ungültiges Modell" +#define TR_EDIT_LABELS "Label ändern" +#define TR_MOVE_UP "Verschiebe nach oben" +#define TR_MOVE_DOWN "Verschiebe nach unten" #define TR_ENTER_LABEL "Enter Label" #define TR_LABEL "Label" #define TR_LABELS "Labels" -#define TR_CURRENT_MODEL "Current" -#define TR_NEW "New" -#define TR_NEW_LABEL "New Label" -#define TR_RENAME_LABEL "Rename Label" -#define TR_DELETE_LABEL "Delete Label" +#define TR_CURRENT_MODEL "aktuell" +#define TR_NEW "Neu" +#define TR_NEW_LABEL "Neues Label" +#define TR_RENAME_LABEL "Label umbenennen" +#define TR_DELETE_LABEL "Label löschen" #define TR_DUPLICATE_MODEL "Kopiere Modell" #define TR_COPY_MODEL "Kopiere Modell" #define TR_MOVE_MODEL "Verschiebe Modell" @@ -654,42 +654,42 @@ #define TR_DELETE_ERROR "Fehler beim\nLöschen" #define TR_SDCARD_ERROR "SD-Kartenfehler" #define TR_SDCARD "SD Card" -#define TR_NO_FILES_ON_SD "No files on SD!" +#define TR_NO_FILES_ON_SD "Keine Dateien auf SD!" #define TR_NO_SDCARD "Keine SD-Karte" -#define TR_WAITING_FOR_RX "Waiting for RX..." -#define TR_WAITING_FOR_TX "Waiting for TX..." -#define TR_WAITING_FOR_MODULE TR("Waiting module", "Waiting for module...") -#define TR_NO_TOOLS "No tools available" +#define TR_WAITING_FOR_RX "Warten auf RX..." +#define TR_WAITING_FOR_TX "Warten auf TX..." +#define TR_WAITING_FOR_MODULE TR("Warten Modul", "Warten auf Modul...") +#define TR_NO_TOOLS "Keine Tools vorhanden" #define TR_NORMAL "Normal" #define TR_NOT_INVERTED "Not inv" -#define TR_NOT_CONNECTED "!Connected" -#define TR_CONNECTED "Connected" +#define TR_NOT_CONNECTED "!Verbunden" +#define TR_CONNECTED "Verbunden" #define TR_FLEX_915 "Flex 915MHz" #define TR_FLEX_868 "Flex 868MHz" -#define TR_16CH_WITHOUT_TELEMETRY TR("16CH ohne Telem.", "16CH ohne Telemetry") -#define TR_16CH_WITH_TELEMETRY TR("16CH mit Telem.", "16CH mit Telemetry") -#define TR_8CH_WITH_TELEMETRY TR("8CH mit Telem.", "8CH mit Telemetry") +#define TR_16CH_WITHOUT_TELEMETRY TR("16CH ohne Telem.", "16CH ohne Telemetrie") +#define TR_16CH_WITH_TELEMETRY TR("16CH mit Telem.", "16CH mit Telemetrie") +#define TR_8CH_WITH_TELEMETRY TR("8CH mit Telem.", "8CH mit Telemetrie") #define TR_EXT_ANTENNA "Ext. Antenne" #define TR_PIN "Pin" -#define TR_UPDATE_RX_OPTIONS "Update RX options?" -#define TR_UPDATE_TX_OPTIONS "Update TX options?" -#define TR_MODULES_RX_VERSION "Module / RX version" -#define TR_MENU_MODULES_RX_VERSION "MODULE / RX VERSION" +#define TR_UPDATE_RX_OPTIONS "Update RX Optionen?" +#define TR_UPDATE_TX_OPTIONS "Update TX Optionen?" +#define TR_MODULES_RX_VERSION "Modul / RX version" +#define TR_MENU_MODULES_RX_VERSION "MODUL / RX VERSION" #define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONEN" #define TR_IMU "IMU" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" -#define TR_RF_PROTOCOL "RF Protocol" -#define TR_MODULE_OPTIONS "Module options" +#define TR_RF_PROTOCOL "RF Protokoll" +#define TR_MODULE_OPTIONS "Modul Optionen" #define TR_POWER "Power" -#define TR_NO_TX_OPTIONS "No TX options" +#define TR_NO_TX_OPTIONS "keine TX Optionen" #define TR_RTC_BATT "RTC Batt" #define TR_POWER_METER_EXT "Power Meter (EXT)" #define TR_POWER_METER_INT "Power Meter (INT)" #define TR_SPECTRUM_ANALYSER_EXT "Spectrum (EXT)" #define TR_SPECTRUM_ANALYSER_INT "Spectrum (INT)" #define TR_SDCARD_FULL "SD-Karte voll" -#define TR_NEEDS_FILE "NEEDS FILE" +#define TR_NEEDS_FILE "Datei benötigt" #define TR_EXT_MULTI_SPEC "opentx-inv" #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Nicht kompatibel" @@ -697,8 +697,8 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "SPEICHER" #define TR_EEPROM_CONVERTING "EEPROM Konvertierung" -#define TR_SDCARD_CONVERSION_REQUIRE "SD card conversion required" -#define TR_CONVERTING "Converting: " +#define TR_SDCARD_CONVERSION_REQUIRE "SD Karte muss konvertiert werden" +#define TR_CONVERTING "konvertiere: " #define TR_THROTTLE_UPPERCASE "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHALTER" @@ -706,9 +706,9 @@ #define TR_TEST_WARNING TR("TESTING", "TEST BUILD") #define TR_TEST_NOTSAFE "Use for tests only" #define TR_WRONG_SDCARDVERSION TR("Erw. Version: ","Erwartete Version: ") -#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" -#define TR_WARN_MULTI_LOWPOWER "Low power mode" -#define TR_BATTERY "BATTERY" +#define TR_WARN_RTC_BATTERY_LOW "RTC Batterie schwach" +#define TR_WARN_MULTI_LOWPOWER "reduzierte Leistung" +#define TR_BATTERY "AKKU" #define TR_WRONG_PCBREV "Falsche PCB erkannt" #define TR_EMERGENCY_MODE "NOTFALL MODUS" #define TR_PCBREV_ERROR "PCB Problem" @@ -730,7 +730,7 @@ #define TR_V1 "V1" #define TR_V2 "V2" #define TR_DURATION "Dauer" -#define TR_DELAY "Verzög." +#define TR_DELAY "Verzögerung" #define TR_SD_CARD "SD-Karte" #define TR_SDHC_CARD "SDHC-Karte" #define TR_NO_SOUNDS_ON_SD "Keine Töne" BREAKSPACE "auf SD" @@ -772,13 +772,13 @@ #define TR_ASK_OVERWRITE "Möchten Sie überschreiben?" #define TR_BLUETOOTH "Bluetooth" -#define TR_BLUETOOTH_DISC "Discover" +#define TR_BLUETOOTH_DISC "Suchen" #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR "Local addr" #define TR_BLUETOOTH_PIN_CODE "PIN Code" -#define TR_BLUETOOTH_NODEVICES "No Devices Found" -#define TR_BLUETOOTH_SCANNING "Scanning..." +#define TR_BLUETOOTH_NODEVICES "kein Gerät gefunden" +#define TR_BLUETOOTH_SCANNING "Suche..." #define TR_BLUETOOTH_BAUDRATE "BT Baudrate" #if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---","Aktiviert" @@ -834,9 +834,9 @@ #define TR_INTERNAL_MODULE TR("Int. module","Internal module") #define TR_EXTERNAL_MODULE TR("Ext. module","External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade nötig" -#define TR_TELEMETRY_DISABLED "Telem. disabled" -#define TR_MORE_OPTIONS_AVAILABLE "More options available" -#define TR_NO_MODULE_INFORMATION "No module information" +#define TR_TELEMETRY_DISABLED "Deaktiviere Telem." +#define TR_MORE_OPTIONS_AVAILABLE "mehr Optionen verfügbar" +#define TR_NO_MODULE_INFORMATION "keine Modul Info" #define TR_EXTERNALRF "Externes HF-Modul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode") #define TR_FAILSAFESET "Failsafe setzen" @@ -854,7 +854,7 @@ #define TR_POWERMETER_FREQ "Freq." #define TR_MENUTOOLS "TOOLS" #define TR_TURN_OFF_RECEIVER "Empf. ausschalten" -#define TR_STOPPING "Stopping..." +#define TR_STOPPING "Stoppe..." #define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" #define TR_MENU_POWER_METER "POWER METER" #define TR_SENSOR "SENSOR" @@ -869,8 +869,8 @@ #define TR_COPY "Zeile kopieren" #define TR_MOVE "Zeile verschieben" #define TR_PASTE "Zeile einfügen" -#define TR_PASTE_AFTER "Paste After" -#define TR_PASTE_BEFORE "Paste Before" +#define TR_PASTE_AFTER "Einfügen danach" +#define TR_PASTE_BEFORE "Einfügen davor" #define TR_DELETE "Zeile löschen" #define TR_INSERT "Neue Zeile" #define TR_RESET_FLIGHT "Reset Flugdaten" @@ -903,9 +903,9 @@ #define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") -#define TR_WAITING "Waiting..." -#define TR_RECEIVER_DELETE "Delete receiver?" -#define TR_RECEIVER_RESET "Reset receiver?" +#define TR_WAITING "Warte..." +#define TR_RECEIVER_DELETE "Empfänger löschen?" +#define TR_RECEIVER_RESET "Empfänger resetten?" #define TR_SHARE "Share" #define TR_BIND "Bind" #define TR_REGISTER TR("Reg", "Register") @@ -923,24 +923,24 @@ #define TR_TRAINER "DSC Buchse PPM In/Out" #define TR_CHANS "Chans" #define TR_ANTENNAPROBLEM CENTER "TX-Antennenproblem!" -#define TR_MODELIDUSED "ID used in:" -#define TR_MODELIDUNIQUE "ID is unique" +#define TR_MODELIDUSED "ID benutzt in:" +#define TR_MODELIDUNIQUE "ID ist eindeutig" #define TR_MODULE "Modul-Typ" #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Typ", "Telemetrietyp") #define TR_TELEMETRY_SENSORS "Sensoren" #define TR_VALUE "Wert" -#define TR_REPEAT "Repeat" -#define TR_ENABLE "Enable" -#define TR_TOPLCDTIMER "Top LCD Timer" +#define TR_REPEAT "Wiederholung" +#define TR_ENABLE "Aktivieren" +#define TR_TOPLCDTIMER "oberer LCD Timer" #define TR_UNIT "Einheit" #define TR_TELEMETRY_NEWSENSOR INDENT "Sensor hinzufügen ..." #define TR_CHANNELRANGE TR(INDENT "Kanäle", INDENT "Ausgangs Kanäle") //wg 9XR-Pro -#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") -#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_RX_FREQ TR("RX Freq.", "RX Frequenz") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetrie") #define TR_AFHDS3_ONE_TO_MANY "Multicast" -#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") -#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_AFHDS3_ACTUAL_POWER TR("Tat.Leis", "tatsäch. Leistung") +#define TR_AFHDS3_POWER_SOURCE TR("Stromqu.", "Stromquelle") #define TR_ANTENNACONFIRM1 "Ant. umschalten" #if defined(PCBX12S) #define TR_ANTENNA_MODES "Intern","Frag","Modellspezifisch","Intern + Extern" @@ -996,11 +996,11 @@ #define TR_CONFIRMRESET TR("Alles löschen? ","ALLE Modelle+Einst. löschen?") #define TR_TOO_MANY_LUA_SCRIPTS "Zu viele Skripte!" #define TR_SPORT_UPDATE_POWER_MODE "SP Power" -#define TR_SPORT_UPDATE_POWER_MODES "AUTO","ON" -#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO","EIN" +#define TR_NO_TELEMETRY_SCREENS "Keine Telemetrie Seiten" #define TR_TOUCH_PANEL "Touch panel:" -#define TR_FILE_SIZE "File size" -#define TR_FILE_OPEN "Open anyway?" +#define TR_FILE_SIZE "Dateigröße" +#define TR_FILE_OPEN "trotzdem öffnen?" // Horus and Taranis specific column headers #define TR_PHASES_HEADERS_NAME "Name " @@ -1015,21 +1015,21 @@ #define TR_PHASES_HEADERS_FAD_OUT "Langs Aus" // Horus layouts and widgets -#define TR_FIRST_CHANNEL "First channel" -#define TR_FILL_BACKGROUND "Fill background?" -#define TR_BG_COLOR "BG Color" -#define TR_SLIDERS_TRIMS "Sliders+Trims" -#define TR_SLIDERS "Sliders" -#define TR_FLIGHT_MODE "Flight mode" -#define TR_INVALID_FILE "Invalid File" -#define TR_TIMER_SOURCE "Timer source" -#define TR_SIZE "Size" -#define TR_SHADOW "Shadow" +#define TR_FIRST_CHANNEL "Erster Kanal" +#define TR_FILL_BACKGROUND "Hintergrund füllen?" +#define TR_BG_COLOR "Hintergrundfarbe" +#define TR_SLIDERS_TRIMS "Schieber+Trim" +#define TR_SLIDERS "Schieber" +#define TR_FLIGHT_MODE "Flugphase" +#define TR_INVALID_FILE "ungültige Datei" +#define TR_TIMER_SOURCE "Timer Quelle" +#define TR_SIZE "Größe" +#define TR_SHADOW "Schatten" #define TR_TEXT "Text" -#define TR_COLOR "Color" -#define TR_MAIN_VIEW_X "Main view X" -#define TR_PANEL1_BACKGROUND "Panel1 background" -#define TR_PANEL2_BACKGROUND "Panel2 background" +#define TR_COLOR "Farbe" +#define TR_MAIN_VIEW_X "Hauptansicht X" +#define TR_PANEL1_BACKGROUND "Panel1 Hintergrund" +#define TR_PANEL2_BACKGROUND "Panel2 Hintergrund" // Taranis Info Zeile Anzeigen #define TR_LIMITS_HEADERS_NAME "Name" @@ -1039,8 +1039,8 @@ #define TR_LIMITS_HEADERS_DIRECTION "Richtung" #define TR_LIMITS_HEADERS_CURVE "Kurve" #define TR_LIMITS_HEADERS_PPMCENTER "PPM Mitte" -#define TR_LIMITS_HEADERS_SUBTRIMMODE "Subtrim Mode" -#define TR_INVERTED "Inverted" +#define TR_LIMITS_HEADERS_SUBTRIMMODE "Subtrim Modus" +#define TR_INVERTED "Invertiert" #define TR_LSW_HEADERS_FUNCTION "Funktion" #define TR_LSW_HEADERS_V1 "V1" @@ -1080,11 +1080,11 @@ #define TR_FLASH_ERASE "Flash erase..." #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." -#define TR_MODULE_RESET "Module reset..." -#define TR_UNKNOWN_RX "Unknown RX" -#define TR_UNSUPPORTED_RX "Unsupported RX" -#define TR_OTA_UPDATE_ERROR "OTA update error" -#define TR_DEVICE_RESET "Device reset..." +#define TR_MODULE_RESET "Modul reset..." +#define TR_UNKNOWN_RX "unbekannter RX" +#define TR_UNSUPPORTED_RX "nicht unterstützter RX" +#define TR_OTA_UPDATE_ERROR "OTA Update Fehler" +#define TR_DEVICE_RESET "Gerät Reset..." #define TR_ALTITUDE INDENT "Höhenanzeige" #define TR_SCALE "Skalieren" #define TR_VIEW_CHANNELS "Zeige Kanäle" @@ -1120,19 +1120,19 @@ #define TR_SELECT_WIDGET "Widget auswählen" // grafisches Element #define TR_REMOVE_WIDGET "Widget löschen" #define TR_WIDGET_SETTINGS "Widget einstellen" -#define TR_REMOVE_SCREEN "Screen löschen" -#define TR_SETUP_WIDGETS "Setup widgets" -#define TR_USER_INTERFACE "User interface" +#define TR_REMOVE_SCREEN "Seite löschen" +#define TR_SETUP_WIDGETS "Widget einrichten" +#define TR_USER_INTERFACE "Benutzerschnittstelle" #define TR_THEME "Theme" -#define TR_SETUP "Setup" +#define TR_SETUP "Einrichten" #define TR_LAYOUT "Layout" #define TR_ADD_MAIN_VIEW "Ansicht hinzufügen" #define TR_BACKGROUND_COLOR "Hintergrundfarbe" #define TR_MAIN_COLOR "Hauptfarbe" -#define TR_BAR2_COLOR "Secondary bar color" -#define TR_BAR1_COLOR "Main bar color" -#define TR_TEXT_COLOR "Text color" -#define TR_TEXT_VIEWER "Text Viewer" +#define TR_BAR2_COLOR "Sekundärfarbe (Bar)" +#define TR_BAR1_COLOR "Hauptfarbe (Bar)" +#define TR_TEXT_COLOR "Textfarbe" +#define TR_TEXT_VIEWER "Text Betrachter" // ----------------------------- Symbole für Auswahlliste---------- #define TR_MENU_INPUTS STR_CHAR_INPUT "Inputs" #define TR_MENU_LUA STR_CHAR_LUA "Lua Skripte" @@ -1314,37 +1314,37 @@ // The following content is Untranslated) -#define TR_USE_THEME_COLOR "Use theme color" +#define TR_USE_THEME_COLOR "Farbe des Themes verwenden" -#define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "Add all Trims to Subtrims" +#define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "Alle Trimmungen übernehmen" #if LCD_W > LCD_H - #define TR_OPEN_CHANNEL_MONITORS "Open Channel Monitor" + #define TR_OPEN_CHANNEL_MONITORS "Öffne Kanalmonitor" #else - #define TR_OPEN_CHANNEL_MONITORS "Open Channel Mon." + #define TR_OPEN_CHANNEL_MONITORS "Öffne Kanalmon." #endif -#define TR_DUPLICATE "Duplicate" -#define TR_ACTIVATE "Set Active" -#define TR_RED "Red" -#define TR_BLUE "Blue" -#define TR_GREEN "Green" -#define TR_COLOR_PICKER "Color Picker" -#define TR_EDIT_THEME_DETAILS "Edit Theme Details" +#define TR_DUPLICATE "Duplizieren" +#define TR_ACTIVATE "Aktivieren" +#define TR_RED "Rot" +#define TR_BLUE "Blau" +#define TR_GREEN "Grün" +#define TR_COLOR_PICKER "Farbauswahl" +#define TR_EDIT_THEME_DETAILS "Theme Details Bearb." #define TR_AUTHOR "Author" -#define TR_DESCRIPTION "Description" -#define TR_SAVE "Save" -#define TR_CANCEL "Cancel" -#define TR_EDIT_THEME "EDIT THEME" +#define TR_DESCRIPTION "Beschreibung" +#define TR_SAVE "Speichern" +#define TR_CANCEL "Abbruch" +#define TR_EDIT_THEME "THEME Editieren" #define TR_DETAILS "Details" #define TR_THEME_EDITOR "THEMES" // Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Select\nModel" -#define TR_MAIN_MENU_MODEL_NOTES "Model\nNotes" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel\nMonitor" -#define TR_MAIN_MENU_MODEL_SETTINGS "Model\nSettings" -#define TR_MAIN_MENU_RADIO_SETTINGS "Radio\nSettings" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Screens\nSettings" -#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\nTelemetry" -#define TR_MAIN_MENU_STATISTICS "Statistics" -#define TR_MAIN_MENU_ABOUT_EDGETX "About\nEdgeTX" +#define TR_MAIN_MENU_SELECT_MODEL "Wähle\nModell" +#define TR_MAIN_MENU_MODEL_NOTES "Modell\nNotizen" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Kanal\nMonitor" +#define TR_MAIN_MENU_MODEL_SETTINGS "Modell\nKonfig." +#define TR_MAIN_MENU_RADIO_SETTINGS "Sender\nKonfig." +#define TR_MAIN_MENU_SCREEN_SETTINGS "Seiten\nKonfig." +#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\nTelemetrie" +#define TR_MAIN_MENU_STATISTICS "Statistiken" +#define TR_MAIN_MENU_ABOUT_EDGETX "Über\nEdgeTX" // End Main menu From 021b603fc45bc806e92d006aec23d444e725e6f8 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 27 Sep 2022 11:10:58 +0200 Subject: [PATCH 027/122] fix(cpn): Calculated telemetery sensors in simulator not updating (#2369) --- radio/src/tasks.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 4e0134fb6da..eaf82364319 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -100,6 +100,14 @@ void execMixerFrequentActions() #if defined(BLUETOOTH) bluetooth.wakeup(); #endif + +#if defined(SIMU) + if (!s_pulses_paused) { + DEBUG_TIMER_START(debugTimerTelemetryWakeup); + telemetryWakeup(); + DEBUG_TIMER_STOP(debugTimerTelemetryWakeup); + } +#endif } TASK_FUNCTION(mixerTask) From 58abf77a93be2a8efee22b218316f387abda047a Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 27 Sep 2022 12:06:26 +0200 Subject: [PATCH 028/122] feat: Support for 8s Cell Sensor such as FrSky FLVS ADV (#2302) * first commit for FrSky 8s Lipo Sensor FLVS Advanced transfers up to 8 cell voltages for Cels sensor * correcting mistake made transferring local change to PR * complementary extension of Companion telemetry simulator to enable simulation of 8 cells * change to allow selection of cells 7 and 8 in calculated sensor with formula Cell * (cpn) Add bin and yml conversions and basic semantic version helper Co-authored-by: elecpower --- .../src/firmwares/edgetx/yaml_modeldata.cpp | 14 ++++ .../src/firmwares/opentx/opentxeeprom.cpp | 6 ++ companion/src/firmwares/sensordata.h | 2 + companion/src/helpers.cpp | 84 +++++++++++++++++++ companion/src/helpers.h | 55 ++++++++++++ companion/src/simulation/telemetrysimu.cpp | 20 ++++- companion/src/simulation/telemetrysimu.h | 7 +- companion/src/simulation/telemetrysimu.ui | 50 +++++++++++ .../src/gui/128x64/model_telemetry_sensor.cpp | 2 +- .../src/gui/212x64/model_telemetry_sensor.cpp | 2 +- radio/src/gui/colorlcd/model_telemetry.cpp | 2 +- radio/src/telemetry/telemetry.h | 3 + radio/src/telemetry/telemetry_holders.h | 2 +- radio/src/translations/cn.h | 2 +- radio/src/translations/cz.h | 2 +- radio/src/translations/da.h | 2 +- radio/src/translations/de.h | 2 +- radio/src/translations/en.h | 2 +- radio/src/translations/es.h | 2 +- radio/src/translations/fi.h | 2 +- radio/src/translations/fr.h | 2 +- radio/src/translations/it.h | 2 +- radio/src/translations/nl.h | 2 +- radio/src/translations/pl.h | 2 +- radio/src/translations/pt.h | 2 +- radio/src/translations/se.h | 2 +- radio/src/translations/tw.h | 2 +- 27 files changed, 255 insertions(+), 22 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_modeldata.cpp b/companion/src/firmwares/edgetx/yaml_modeldata.cpp index 7f65516adf4..0d9afa8e75a 100644 --- a/companion/src/firmwares/edgetx/yaml_modeldata.cpp +++ b/companion/src/firmwares/edgetx/yaml_modeldata.cpp @@ -34,6 +34,7 @@ #include "output_data.h" #include "eeprominterface.h" #include "version.h" +#include "helpers.h" #include @@ -1140,6 +1141,19 @@ bool convert::decode(const Node& node, ModelData& rhs) node["functionSwitchStartConfig"] >> rhs.functionSwitchStartConfig; node["functionSwitchLogicalState"] >> rhs.functionSwitchLogicalState; node["switchNames"] >> rhs.functionSwitchNames; + + // preferably perform conversions here to avoid cluttering the field decodes + + if (SemanticVersion(QString(rhs.semver)) < SemanticVersion("2.8.0")) { + // Cells 7 and 8 introduced requiring Highest and Delta to be shifted + 2 + for (int i = 0; i < CPN_MAX_SENSORS; i++) { + SensorData &sd = rhs.sensorData[i]; + if (!sd.isEmpty() && sd.type == SensorData::TELEM_TYPE_CALCULATED && + sd.formula == SensorData::TELEM_FORMULA_CELL && sd.index > 6) + sd.index += 2; + } + } + return true; } diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 8c3a8da3f32..0be49566185 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -2066,6 +2066,12 @@ class SensorField: public TransformedField { } } + // Cells 7 and 8 introduced in v2.8 requiring Highest and Delta to be shifted + 2 + if (version < 221) { + if (sensor.formula == SensorData::TELEM_FORMULA_CELL && sensor.index > 6) + sensor.index += 2; + } + qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName()); } diff --git a/companion/src/firmwares/sensordata.h b/companion/src/firmwares/sensordata.h index 4722f9453c9..948b1807d77 100644 --- a/companion/src/firmwares/sensordata.h +++ b/companion/src/firmwares/sensordata.h @@ -76,6 +76,8 @@ class SensorData { TELEM_CELL_INDEX_4, TELEM_CELL_INDEX_5, TELEM_CELL_INDEX_6, + TELEM_CELL_INDEX_7, + TELEM_CELL_INDEX_8, TELEM_CELL_INDEX_HIGHEST, TELEM_CELL_INDEX_DELTA, TELEM_CELL_INDEX_LAST = TELEM_CELL_INDEX_DELTA diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index e4701aea6f1..5c89fe82ab0 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -726,3 +726,87 @@ QString Helpers::removeAccents(const QString & str) } return result; } + +SemanticVersion::SemanticVersion(QString vers) +{ + if (!isValid(vers)) + return; + + QStringList strl = vers.split("."); + version.major = strl.at(0).toInt(); + version.minor = strl.at(1).toInt(); + if (strl.count() > 2) { + if (!strl.at(2).contains("-")) { + version.patch = strl.at(2).toInt(); + } else { + QStringList ptch = strl.at(2).toLower().split("-"); + version.patch = ptch.at(0).toInt(); + if (ptch.at(1).left(2) == "rc") { + version.preReleaseType = PR_RC; + version.preReleaseNumber = ptch.at(1).mid(2).toInt(); + } else if (ptch.at(1).left(5) == "alpha") { + version.preReleaseType = PR_ALPHA; + version.preReleaseNumber = ptch.at(1).mid(5).toInt(); + } else if (ptch.at(1).left(4) == "beta") { + version.preReleaseType = PR_BETA; + version.preReleaseNumber = ptch.at(1).mid(4).toInt(); + } + } + } +} + +bool SemanticVersion::isValid(QString vers) +{ + if (vers.trimmed().isEmpty()) + return false; + + QStringList strl = vers.split("."); + if (strl.count() < 2) + return false; + + return true; +} + +QString SemanticVersion::toString() const +{ + QString ret(QString("%1.%2.%3").arg(version.major).arg(version.minor).arg(version.patch)); + + if (version.preReleaseType != PR_NONE) { + ret.append("-"); + if (version.preReleaseType == PR_RC) + ret.append("RC"); + else if (version.preReleaseType == PR_ALPHA) + ret.append("ALPHA"); + else if (version.preReleaseType == PR_BETA) + ret.append("BETA"); + + ret.append(QString::number(version.preReleaseNumber)); + } + + return ret; +} + +int SemanticVersion::compare(const SemanticVersion& other) +{ + if (version.major != other.version.major) { + return version.major - other.version.major; + } + + if (version.minor != other.version.minor) { + return version.minor - other.version.minor; + } + + if (version.patch != other.version.patch) { + return version.patch - other.version.patch; + } + + if (version.preReleaseType != other.version.preReleaseType) { + return version.preReleaseType - other.version.preReleaseType; + } + + if (version.preReleaseNumber != other.version.preReleaseNumber) { + return version.preReleaseNumber - other.version.preReleaseNumber; + } + + return 0; +} diff --git a/companion/src/helpers.h b/companion/src/helpers.h index fc349254600..2f0e5ee4eb5 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -240,3 +240,58 @@ class Stopwatch }; extern Stopwatch gStopwatch; + +class SemanticVersion +{ + public: + explicit SemanticVersion(QString vers); + ~SemanticVersion() = default;; + + bool isValid(const QString vers); + QString toString() const; + + bool operator==(const SemanticVersion& rhs) { + return compare(rhs) == 0; + } + + bool operator!=(const SemanticVersion& rhs) { + return compare(rhs) != 0; + } + + bool operator>(const SemanticVersion& rhs) { + return compare(rhs) > 0; + } + + bool operator>=(const SemanticVersion& rhs) { + return compare(rhs) >= 0; + } + + bool operator<(const SemanticVersion& rhs) { + return compare(rhs) < 0; + } + + bool operator<=(const SemanticVersion& rhs) { + return compare(rhs) <= 0; + } + + private: + enum PreRelease { + PR_ALPHA = 0, + PR_BETA = 1, + PR_RC = 2, + PR_NONE = 3 + }; + + struct Version { + int major = 0; + int minor = 1; + int patch = 0; + PreRelease preReleaseType = PR_NONE; + int preReleaseNumber = 0; + }; + + Version version; + + int compare(const SemanticVersion& other); + +}; diff --git a/companion/src/simulation/telemetrysimu.cpp b/companion/src/simulation/telemetrysimu.cpp index bb8899ba68f..f0ac155ce5a 100644 --- a/companion/src/simulation/telemetrysimu.cpp +++ b/companion/src/simulation/telemetrysimu.cpp @@ -442,6 +442,8 @@ void TelemetrySimulator::generateTelemetryFrame() cellValues[3] = ui->cell4->value(); cellValues[4] = ui->cell5->value(); cellValues[5] = ui->cell6->value(); + cellValues[6] = ui->cell7->value(); + cellValues[7] = ui->cell8->value(); generateSportPacket(buffer, ui->cells_inst->text().toInt(&ok, 0) - 1, DATA_FRAME, CELLS_FIRST_ID, flvss->setAllCells_GetNextPair(cellValues)); } else { @@ -547,6 +549,7 @@ void TelemetrySimulator::FlvssEmulator::encodeAllCells() cellData1 = encodeCellPair(numCells, 0, cellFloats[0], cellFloats[1]); if (numCells > 2) cellData2 = encodeCellPair(numCells, 2, cellFloats[2], cellFloats[3]); else cellData2 = 0; if (numCells > 4) cellData3 = encodeCellPair(numCells, 4, cellFloats[4], cellFloats[5]); else cellData3 = 0; + if (numCells > 6) cellData4 = encodeCellPair(numCells, 6, cellFloats[6], cellFloats[7]); else cellData4 = 0; } void TelemetrySimulator::FlvssEmulator::splitIntoCells(double totalVolts) @@ -564,7 +567,7 @@ void TelemetrySimulator::FlvssEmulator::splitIntoCells(double totalVolts) numCells = numCells > MAXCELLS ? MAXCELLS : numCells; // force into valid cell count in case of input out of range } -uint32_t TelemetrySimulator::FlvssEmulator::setAllCells_GetNextPair(double cellValues[6]) +uint32_t TelemetrySimulator::FlvssEmulator::setAllCells_GetNextPair(double cellValues[MAXCELLS]) { numCells = 0; for (uint32_t i = 0; i < MAXCELLS; i++) { @@ -603,6 +606,9 @@ uint32_t TelemetrySimulator::FlvssEmulator::setAllCells_GetNextPair(double cellV case 4: cellData = cellData3; break; + case 6: + cellData = cellData4; + break; } nextCellNum += 2; return cellData; @@ -1198,6 +1204,10 @@ void TelemetrySimulator::on_saveTelemetryvalues_clicked() out<<"\r\n"; out << ui -> cell6 -> text(); out<<"\r\n"; + out << ui -> cell7 -> text(); + out<<"\r\n"; + out << ui -> cell8 -> text(); + out<<"\r\n"; out << ui -> aspeed -> text(); out<<"\r\n"; out << ui -> gps_alt -> text(); @@ -1330,6 +1340,14 @@ void TelemetrySimulator::on_loadTelemetryvalues_clicked() ns = n.toDouble(); ui -> cell6 -> setValue(ns); + n = in.readLine(); + ns = n.toDouble(); + ui -> cell7 -> setValue(ns); + + n = in.readLine(); + ns = n.toDouble(); + ui -> cell8 -> setValue(ns); + n = in.readLine(); ns = n.toDouble(); ui -> aspeed -> setValue(ns); diff --git a/companion/src/simulation/telemetrysimu.h b/companion/src/simulation/telemetrysimu.h index 34596f755b1..a5497b2c3ce 100644 --- a/companion/src/simulation/telemetrysimu.h +++ b/companion/src/simulation/telemetrysimu.h @@ -171,19 +171,20 @@ class TelemetrySimulator : public QWidget class FlvssEmulator { public: - uint32_t setAllCells_GetNextPair(double cellValues[6]); - static const uint32_t MAXCELLS = 6; + static const uint32_t MAXCELLS = 8; + uint32_t setAllCells_GetNextPair(double cellValues[MAXCELLS]); private: void encodeAllCells(); void splitIntoCells(double totalVolts); static uint32_t encodeCellPair(uint8_t cellNum, uint8_t firstCellNo, double cell1, double cell2); - double cellFloats[6]; + double cellFloats[MAXCELLS]; uint32_t nextCellNum; uint32_t numCells; uint32_t cellData1; uint32_t cellData2; uint32_t cellData3; + uint32_t cellData4; }; // FlvssEmulator class GPSEmulator diff --git a/companion/src/simulation/telemetrysimu.ui b/companion/src/simulation/telemetrysimu.ui index 1aa273773f9..1719ead2250 100644 --- a/companion/src/simulation/telemetrysimu.ui +++ b/companion/src/simulation/telemetrysimu.ui @@ -2587,6 +2587,54 @@ hh:mm:ss + + + + + 0 + 0 + + + + + 8 + + + + 8.190000000000000 + + + 0.100000000000000 + + + 4.200000000000000 + + + + + + + + 0 + 0 + + + + + 8 + + + + 8.190000000000000 + + + 0.100000000000000 + + + 4.200000000000000 + + + @@ -3184,6 +3232,8 @@ Timestamp cell4 cell5 cell6 + cell7 + cell8 aspd_inst aspeed gpsa_inst diff --git a/radio/src/gui/128x64/model_telemetry_sensor.cpp b/radio/src/gui/128x64/model_telemetry_sensor.cpp index 9fe46041566..925a0940f4b 100644 --- a/radio/src/gui/128x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/128x64/model_telemetry_sensor.cpp @@ -229,7 +229,7 @@ void menuModelSensor(event_t event) case SENSOR_FIELD_PARAM2: if (sensor->type == TELEM_TYPE_CALCULATED) { if (sensor->formula == TELEM_FORMULA_CELL) { - sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, 0, 8, attr, event); + sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, TELEM_CELL_INDEX_LOWEST, TELEM_CELL_INDEX_LAST, attr, event); break; } else if (sensor->formula == TELEM_FORMULA_DIST) { diff --git a/radio/src/gui/212x64/model_telemetry_sensor.cpp b/radio/src/gui/212x64/model_telemetry_sensor.cpp index 93c004a5233..b1e9b4f17ff 100644 --- a/radio/src/gui/212x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/212x64/model_telemetry_sensor.cpp @@ -243,7 +243,7 @@ void menuModelSensor(event_t event) case SENSOR_FIELD_PARAM2: if (sensor->type == TELEM_TYPE_CALCULATED) { if (sensor->formula == TELEM_FORMULA_CELL) { - sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, 0, 8, attr, event); + sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, TELEM_CELL_INDEX_LOWEST, TELEM_CELL_INDEX_LAST, attr, event); break; } else if (sensor->formula == TELEM_FORMULA_DIST) { diff --git a/radio/src/gui/colorlcd/model_telemetry.cpp b/radio/src/gui/colorlcd/model_telemetry.cpp index dc1fa69bb7b..67245871151 100644 --- a/radio/src/gui/colorlcd/model_telemetry.cpp +++ b/radio/src/gui/colorlcd/model_telemetry.cpp @@ -308,7 +308,7 @@ class SensorEditWindow : public Page { if (sensor->type == TELEM_TYPE_CALCULATED) { if (sensor->formula == TELEM_FORMULA_CELL) { new StaticText(sensorParametersWindow, grid.getLabelSlot(), STR_CELLINDEX, 0, COLOR_THEME_PRIMARY1); - new Choice(sensorParametersWindow, grid.getFieldSlot(), STR_VCELLINDEX, 0, 8, GET_SET_DEFAULT(sensor->cell.index)); + new Choice(sensorParametersWindow, grid.getFieldSlot(), STR_VCELLINDEX, TELEM_CELL_INDEX_LOWEST, TELEM_CELL_INDEX_LAST, GET_SET_DEFAULT(sensor->cell.index)); } else if (sensor->formula == TELEM_FORMULA_DIST) { new StaticText(sensorParametersWindow, grid.getLabelSlot(), STR_ALTSENSOR, 0, COLOR_THEME_PRIMARY1); diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index a27eeb134bc..277d2e6516e 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -94,8 +94,11 @@ enum { TELEM_CELL_INDEX_4, TELEM_CELL_INDEX_5, TELEM_CELL_INDEX_6, + TELEM_CELL_INDEX_7, + TELEM_CELL_INDEX_8, TELEM_CELL_INDEX_HIGHEST, TELEM_CELL_INDEX_DELTA, + TELEM_CELL_INDEX_LAST = TELEM_CELL_INDEX_DELTA }; PACK(struct CellValue diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h index d345434c846..fa17e6b5066 100644 --- a/radio/src/telemetry/telemetry_holders.h +++ b/radio/src/telemetry/telemetry_holders.h @@ -28,7 +28,7 @@ #define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! #define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1] -#define MAX_CELLS 6 +#define MAX_CELLS 8 class TelemetryValue { public: diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 3175bae8ce5..64f437e70d8 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -278,7 +278,7 @@ #define TR_VSENSORTYPES "自定义","运算" #define TR_VFORMULAS "加","平均值","最小值","最大值","乘","总计值","单节电池","消耗量","距离" #define TR_VPREC "0.--","0.0-","0.00" -#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","最高值","差值" +#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","7","8","最高值","差值" #define TR_TEXT_SIZE "标准","小","较小","中等","双倍" #define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)", "=(整体)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 0e2e902d2f9..7efbc720e5c 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -296,7 +296,7 @@ #define TR_VSENSORTYPES "Vlastní","Vypočtený" #define TR_VFORMULAS "Součet","Průměr","Min","Max","Násobení","Celkem","Článek","Spotřeba","Vzdálenost" #define TR_VPREC "X","X.X","X.XX" -#define TR_VCELLINDEX "Nízký","1","2","3","4","5","6","Nejvíce","Delta" +#define TR_VCELLINDEX "Nízký","1","2","3","4","5","6","7","8","Nejvíce","Delta" #define TR_SUBTRIMMODES STR_CHAR_DELTA"(pouze středy)","= (symetrický)" #define TR_TIMER_DIR TR("Zbývající", "Zobrazit zbývající"), TR("Uplynulý", "Zobrazit uplynulý") diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 983ae413fcb..d6142a184aa 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -278,7 +278,7 @@ #define TR_VSENSORTYPES "Tilpasset","Beregnet" #define TR_VFORMULAS "Tillæg","Gennems.","Min","Max","Gange","Sum","Cell","Forbrug","Afstand" #define TR_VPREC "0.--","0.0 ","0.00" -#define TR_VCELLINDEX "Lavest","1","2","3","4","5","6","Højst","Delta" +#define TR_VCELLINDEX "Lavest","1","2","3","4","5","6","7","8","Højst","Delta" #define TR_TEXT_SIZE "Standard","Tynd","Lille","Medium","Dobbelt" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center kun)","= (symmetrisk)" #define TR_TIMER_DIR TR("Rest", "Vis rest"), TR("Gået tid", "Vis gået tid") diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 2d6a0a8f0b7..755ae2c34cb 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -281,7 +281,7 @@ #define TR_VSENSORTYPES "Sensor","Berechnung" #define TR_VFORMULAS "Addieren","Mittelwert","Min","Max","Multiplizier","Gesamt","Zelle","Verbrauch","Distanz" #define TR_VPREC "0.--","0.0","0.00" -#define TR_VCELLINDEX "Niedrigst","1. Zelle","2. Zelle","3. Zelle","4. Zelle","5. Zelle","6. Zelle","Höchster","Differenz" +#define TR_VCELLINDEX "Niedrigst","1. Zelle","2. Zelle","3. Zelle","4. Zelle","5. Zelle","6. Zelle","7. Zelle","8. Zelle","Höchster","Differenz" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 9eedec5877e..adca52bb87d 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -278,7 +278,7 @@ #define TR_VSENSORTYPES "Custom","Calculated" #define TR_VFORMULAS "Add","Average","Min","Max","Multiply","Totalize","Cell","Consumpt","Distance" #define TR_VPREC "0.--","0.0 ","0.00" -#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","Highest","Delta" +#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","7","8","Highest","Delta" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symmetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index a0f2509dade..7c6631fa3e8 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -278,7 +278,7 @@ #define TR_VSENSORTYPES "Custom","Calculado" #define TR_VFORMULAS "Suma","Media","Min","Máx","Multipl.","Total","Cell","Consumo","Distancia" #define TR_VPREC "0.--","0.0 ","0.00" -#define TR_VCELLINDEX "Menor","1","2","3","4","5","6","Mayor","Delta" +#define TR_VCELLINDEX "Menor","1","2","3","4","5","6","7","8","Mayor","Delta" #define TR_TEXT_SIZE "Normal","Muy pequeño","Pequeño","Medio","Doble" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 9c9c19735d8..e895280a565 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -296,7 +296,7 @@ #define TR_VSENSORTYPES "Custom","Calculated" #define TR_VFORMULAS "Add","Average","Min","Max","Multiply","Totalize","Cell","Kulutus","Etäisyys" #define TR_VPREC "0.--","0.0","0.00" -#define TR_VCELLINDEX "Alin","1","2","3","4","5","6","Korkein","Ero" +#define TR_VCELLINDEX "Alin","1","2","3","4","5","6","7","8","Korkein","Ero" #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index c56e913aaea..87e7d299ee0 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -299,7 +299,7 @@ #define TR_VSENSORTYPES "Perso","Calculé" #define TR_VFORMULAS "Addition","Moyenne","Min","Max","Multipl.","Totalise","Elément","Consomm.","Distance" #define TR_VPREC "0.--","0.0","0.00" -#define TR_VCELLINDEX "Mini.","1","2","3","4","5","6","Maxi.","Diff." +#define TR_VCELLINDEX "Mini.","1","2","3","4","5","6","7","8","Maxi.","Diff." #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index 81056d7c82d..6ac860c5364 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -283,7 +283,7 @@ #define TR_VSENSORTYPES "Person.","Calcolato" #define TR_VFORMULAS "Somma","Media","Min","Max","Moltipl","Totalizza","Cella","Consumo","Distanza" #define TR_VPREC "0.--","0.0 ","0.00" -#define TR_VCELLINDEX "Minore","1","2","3","4","5","6","Maggiore","Delta" +#define TR_VCELLINDEX "Minore","1","2","3","4","5","6","7","8","Maggiore","Delta" #define TR_TEXT_SIZE "Standard","Minusc.","Piccolo","Medio","Doppio" #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Riman.", "Mostra Riman."), TR("Trasc.", "Mostra Trascorso") diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 2333e3b59a3..5f6374eacac 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -282,7 +282,7 @@ #define TR_VSENSORTYPES "Custom","Berekend" #define TR_VFORMULAS "Optellen","Gemiddeld","Min","Max","Vermenigvuld","Totaal","Cellen","Verbruik","Afstand" #define TR_VPREC "0.--","0.0 ","0.00" -#define TR_VCELLINDEX "Laagste","1e Cel","2e Cel","3e Cel","4e Cel","5e Cel","6e Cel","Hoogste","Delta" +#define TR_VCELLINDEX "Laagste","1e Cel","2e Cel","3e Cel","4e Cel","5e Cel","6e Cel","7e Cel","8e Cel","Hoogste","Delta" #define TR_GYROS "GyrX","GyrY" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index bd60132bcaf..fdd6d1de10c 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -278,7 +278,7 @@ #define TR_VSENSORTYPES "Użytkownik","Obliczone" #define TR_VFORMULAS "Dodaj","Średnie","Min","Max","Mnóż","Zliczani","Komórka","Zużycie","Zasięg" #define TR_VPREC "0.--","0.0 ","0.00" -#define TR_VCELLINDEX "Niskie","1","2","3","4","5","6","Wysokie","Delta" +#define TR_VCELLINDEX "Niskie","1","2","3","4","5","6","7","8","Wysokie","Delta" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 7a60845cca3..b79429e4373 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -276,7 +276,7 @@ #define TR_VSENSORTYPES "Custom","Calculated" #define TR_VFORMULAS "Add","Average","Min","Max","Multiply","Totalize","Cell","Consumpt","Distance" #define TR_VPREC "0.--","0.0 ","0.00" -#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","Highest","Delta" +#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","7","8","Highest","Delta" #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 8ab1bf60547..acba24494c5 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -307,7 +307,7 @@ #define TR_VSENSORTYPES "Anpassad","Beräknad" #define TR_VFORMULAS "Addera","Medel","Min","Max","Multipl.","Summa","Cell","Förbrukning","Sträcka" #define TR_VPREC "0.--","0.0","0.00" -#define TR_VCELLINDEX "Lägsta","1","2","3","4","5","6","Högsta","Skillnad" +#define TR_VCELLINDEX "Lägsta","1","2","3","4","5","6","7","8","Högsta","Skillnad" #define TR_GYROS "GyrX","GyrY" #define TR_SUBTRIMMODES STR_CHAR_DELTA " (endast center)","= (symmetrisk)" #define TR_TIMER_DIR TR("Återst.", "Visa återstående"), TR("Förbrukad", "Visa förbrukad") diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 275629b27d3..7135d22a8b2 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -278,7 +278,7 @@ #define TR_VSENSORTYPES "自定義","運算" #define TR_VFORMULAS "加","平均值","最小值","最大值","乘","總計值","單節電池","消耗量","距離" #define TR_VPREC "0.--","0.0-","0.00" -#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","最高值","差值" +#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","7","8","最高值","差值" #define TR_TEXT_SIZE "標準","小","較小","中等","雙倍" #define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)","=(整體)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") From f218d00c4d131ad81876d1b94897019a6cf6771d Mon Sep 17 00:00:00 2001 From: Jesper Frickmann Date: Tue, 27 Sep 2022 19:42:16 -0400 Subject: [PATCH 029/122] feat(lua): Add getSourceValue (#2316) * Moved getFieldInfo and getValue up right after related functions * Modified getValue to return a valid status, so Lua can see if it got zero because of invalid source id * Added new getSourceValue Lua function per Issue #781 Also added alias getSourceInfo for getFieldInfo * Updated according to comment https://github.com/EdgeTX/edgetx/pull/2175#issuecomment-1245605114 * Replaced isFresh() by !isOld() as requested in https://github.com/EdgeTX/edgetx/pull/2316#issuecomment-1246759370 * Clean up `lua_pushtablenil` - tables cannot hold nil values * Changed isFresh() to !isOld() ... AGAIN * Return both `!isOld()` and `isFresh()` * Return nil for all values if the item does not exist * Return 0 instead of pushing three nil values * Update documentation --- radio/src/lua/api_general.cpp | 375 +++++++++++++++++++++++----------- radio/src/lua/lua_api.h | 1 - radio/src/mixer.cpp | 17 +- radio/src/opentx.h | 2 +- 4 files changed, 267 insertions(+), 128 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index c1d6c585a34..8f9812011e2 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -327,8 +327,6 @@ static void luaPushLatLon(lua_State* L, TelemetrySensor & telemetrySensor, Telem int8_t delay = telemetryItem.getDelaySinceLastValue(); if (delay >= 0) lua_pushtableinteger(L, "delay", delay); - else - lua_pushtablenil(L, "delay"); } static void luaPushTelemetryDateTime(lua_State* L, TelemetrySensor & telemetrySensor, TelemetryItem & telemetryItem) @@ -551,6 +549,256 @@ bool luaFindFieldById(int id, LuaField & field, unsigned int flags) return false; // not found } +/*luadoc +@function getFieldInfo(source) + +Return detailed information about field (source) + +The list of valid sources is available: + +| OpenTX Version | Radio | +|----------------|-------| +| 2.0 | [all](http://downloads-20.open-tx.org/firmware/lua_fields.txt) | +| 2.1 | [X9D and X9D+](http://downloads-21.open-tx.org/firmware/lua_fields_taranis.txt), [X9E](http://downloads-21.open-tx.org/firmware/lua_fields_taranis_x9e.txt) | +| 2.2 | [X9D and X9D+](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9e.txt), [Horus](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x12s.txt) | +| 2.3 | [X9D and X9D+](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9e.txt), [X7](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x7.txt), [Horus](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x12s.txt) | + +@param source can be an index (number) (which was obtained by `getFieldInfo` or `getSourceIndex`) or a name (string) of the source. + +@retval table information about requested field, table elements: + * `id` (number) field identifier + * `name` (string) field name + * `desc` (string) field description + * 'unit' (number) unit identifier [Full list](../appendix/units.html) + +@retval nil the requested field was not found + +@status current Introduced in 2.0.8, 'unit' field added in 2.2.0, and argument also can be an index number as of 2.6.0 +*/ +static int luaGetFieldInfo(lua_State * L) +{ + bool found; + LuaField field; + + if (lua_type(L, 1) == LUA_TNUMBER) + found = luaFindFieldById(luaL_checkinteger(L, 1), field, FIND_FIELD_DESC); + else + found = luaFindFieldByName(luaL_checkstring(L, 1), field, FIND_FIELD_DESC); + + if (found) { + lua_newtable(L); + lua_pushtableinteger(L, "id", field.id); + lua_pushtablestring(L, "name", field.name); + lua_pushtablestring(L, "desc", field.desc); + if (field.id >= MIXSRC_FIRST_TELEM && field.id <= MIXSRC_LAST_TELEM) { + TelemetrySensor & telemetrySensor = g_model.telemetrySensors[(int)((field.id-MIXSRC_FIRST_TELEM)/3)]; + lua_pushtableinteger(L, "unit", telemetrySensor.unit); + } + return 1; + } + return 0; +} + +/*luadoc +@function getValue(source) + +Returns the value of a source. + +The list of fixed sources: + +| OpenTX Version | Radio | +|----------------|-------| +| 2.0 | [all](http://downloads-20.open-tx.org/firmware/lua_fields.txt) | +| 2.1 | [X9D and X9D+](http://downloads-21.open-tx.org/firmware/lua_fields_taranis.txt), [X9E](http://downloads-21.open-tx.org/firmware/lua_fields_taranis_x9e.txt) | +| 2.2 | [X9D and X9D+](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9e.txt), [Horus](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x12s.txt) | +| 2.3 | [X9D and X9D+](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9e.txt), [X7](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x7.txt), [Horus](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x12s.txt) | + +In OpenTX 2.1.x the telemetry sources no longer have a predefined name. +To get a telemetry value simply use it's sensor name. For example: + * Altitude sensor has a name "Alt" + * to get the current altitude use the source "Alt" + * to get the minimum altitude use the source "Alt-", to get the maximum use "Alt+" + +@param source can be an index (number) (which was obtained by `getFieldInfo` or `getSourceIndex`) or a name (string) of the source. + +@retval value current source value (number). Zero is returned for: + * non-existing sources + * for all telemetry source when the telemetry stream is not received + * far all non allowed sensors while FAI MODE is active + +@retval table GPS position is returned in a table: + * `lat` (number) latitude, positive is North + * `lon` (number) longitude, positive is East + * `pilot-lat` (number) pilot latitude, positive is North + * `pilot-lon` (number) pilot longitude, positive is East + +@retval table GPS date/time, see getDateTime() + +@retval table Cells are returned in a table +(except where no cells were detected in which +case the returned value is 0): + * table has one item for each detected cell: + * key (number) cell number (1 to number of cells) + * value (number) current cell voltage + +@status current Introduced in 2.0.0, changed in 2.1.0, `Cels+` and +`Cels-` added in 2.1.9 + +@notice Getting a value by its numerical identifier is faster then by its name. +While `Cels` sensor returns current values of all cells in a table, a `Cels+` or +`Cels-` will return a single value - the maximum or minimum Cels value. +*/ +static int luaGetValue(lua_State * L) +{ + int src = MIXSRC_NONE; + if (lua_isnumber(L, 1)) { + src = luaL_checkinteger(L, 1); + } + else { + // convert from field name to its id + const char *name = luaL_checkstring(L, 1); + LuaField field; + bool found = luaFindFieldByName(name, field); + if (found) { + src = field.id; + } + } + luaGetValueAndPush(L, src); + return 1; +} + +/*luadoc +@function getSourceValue(source) + +Returns the value of a source. Superseeds getValue. + +The list of fixed sources: + +| OpenTX Version | Radio | +|----------------|-------| +| 2.0 | [all](http://downloads-20.open-tx.org/firmware/lua_fields.txt) | +| 2.1 | [X9D and X9D+](http://downloads-21.open-tx.org/firmware/lua_fields_taranis.txt), [X9E](http://downloads-21.open-tx.org/firmware/lua_fields_taranis_x9e.txt) | +| 2.2 | [X9D and X9D+](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9e.txt), [Horus](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x12s.txt) | +| 2.3 | [X9D and X9D+](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9e.txt), [X7](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x7.txt), [Horus](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x12s.txt) | + +In OpenTX 2.1.x the telemetry sources no longer have a predefined name. +To get a telemetry value simply use it's sensor name. For example: + * Altitude sensor has a name "Alt" + * to get the current altitude use the source "Alt" + * to get the minimum altitude use the source "Alt-", to get the maximum use "Alt+" + +@param source can be an index (number) (which was obtained by `getFieldInfo` or `getSourceIndex`) or a name (string) of the source. + +@retval value current source value (number), or last known telemetry item value. + +value is nil for non-existing sources. all non-allowed sensors while FAI MODE is active, or if a telemetry item value has never been received + +value is a table for GPS position: + + * `lat` (number) latitude, positive is North + * `lon` (number) longitude, positive is East + * `pilot-lat` (number) pilot latitude, positive is North + * `pilot-lon` (number) pilot longitude, positive is East + +value is a table for date/time, see getDateTime() + +value is a table for battery cells(except where no cells were detected in which case the returned value is 0): + * table has one item for each detected cell: + * key (number) cell number (1 to number of cells) + * value (number) current cell voltage + +@retval isCurrent is true for telemetry sources that are within the "Sensor Lost" duration and telemetry is streaming . Always true for non-telemetry items. + +@retval isFresh is true for telemetry sources which have been recently updated and telemetry is streaming. Always true for non-telemetry items. + +@status current Introduced in 2.0.0, changed in 2.1.0, `Cels+` and `Cels-` added in 2.1.9 + +@notice Getting a value by its numerical identifier is much faster than by its name. +While `Cels` sensor returns current values of all cells in a table, a `Cels+` or +`Cels-` will return a single value - the maximum or minimum Cels value. +*/ + +static int luaGetSourceValue(lua_State * L) +{ + // Get source id + int src = MIXSRC_NONE; + if (lua_isnumber(L, 1)) { + src = luaL_checkinteger(L, 1); + } + else { + // convert from field name to its id + const char *name = luaL_checkstring(L, 1); + LuaField field; + bool found = luaFindFieldByName(name, field); + if (found) { + src = field.id; + } + } + + // Get source value. Ignored for GPS, DATETIME, and CELLS + bool valid = true; + getvalue_t value = getValue(src, &valid); + + if (!valid) + { + return 0; + } + + if (src >= MIXSRC_FIRST_TELEM && src <= MIXSRC_LAST_TELEM) { + div_t qr = div(src-MIXSRC_FIRST_TELEM, 3); + // telemetry values + if (telemetryItems[qr.quot].isAvailable()) { + TelemetrySensor & telemetrySensor = g_model.telemetrySensors[qr.quot]; + switch (telemetrySensor.unit) { + case UNIT_GPS: + luaPushLatLon(L, telemetrySensor, telemetryItems[qr.quot]); + break; + case UNIT_DATETIME: + luaPushTelemetryDateTime(L, telemetrySensor, telemetryItems[qr.quot]); + break; + case UNIT_TEXT: + lua_pushstring(L, telemetryItems[qr.quot].text); + break; + case UNIT_CELLS: + if (qr.rem == 0) { + // Return nil if there are no cells + if (telemetryItems[qr.quot].cells.count == 0) { + lua_pushnil(L); + lua_pushboolean(L, false); + lua_pushboolean(L, false); + return 3; + } + luaPushCells(L, telemetrySensor, telemetryItems[qr.quot]); + break; + } + // deliberate no break here to properly return `Cels-` and `Cels+` + default: + if (telemetrySensor.prec > 0) + lua_pushnumber(L, float(value)/telemetrySensor.getPrecDivisor()); + else + lua_pushinteger(L, value); + break; + } + lua_pushboolean(L, !telemetryItems[qr.quot].isOld()); + lua_pushboolean(L, telemetryItems[qr.quot].isFresh()); + } + else { // telemetry is not available + return 0; + } + } + else if (src == MIXSRC_TX_VOLTAGE) { + lua_pushnumber(L, float(value) * 0.1f); + lua_pushboolean(L, true); + lua_pushboolean(L, true); + } + else { + lua_pushinteger(L, value); + lua_pushboolean(L, true); + lua_pushboolean(L, true); + } + return 3; +} + /*luadoc @function getRotEncSpeed() @@ -1014,127 +1262,6 @@ static int luaGhostTelemetryPush(lua_State * L) } #endif -/*luadoc -@function getFieldInfo(source) - -Return detailed information about field (source) - -The list of valid sources is available: - -| OpenTX Version | Radio | -|----------------|-------| -| 2.0 | [all](http://downloads-20.open-tx.org/firmware/lua_fields.txt) | -| 2.1 | [X9D and X9D+](http://downloads-21.open-tx.org/firmware/lua_fields_taranis.txt), [X9E](http://downloads-21.open-tx.org/firmware/lua_fields_taranis_x9e.txt) | -| 2.2 | [X9D and X9D+](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9e.txt), [Horus](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x12s.txt) | -| 2.3 | [X9D and X9D+](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9e.txt), [X7](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x7.txt), [Horus](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x12s.txt) | - -@param source can be an index (number) (which was obtained by `getFieldInfo` or `getSourceIndex`) or a name (string) of the source. - -@retval table information about requested field, table elements: - * `id` (number) field identifier - * `name` (string) field name - * `desc` (string) field description - * 'unit' (number) unit identifier [Full list](../appendix/units.html) - -@retval nil the requested field was not found - -@status current Introduced in 2.0.8, 'unit' field added in 2.2.0, and argument also can be an index number as of 2.6.0 -*/ -static int luaGetFieldInfo(lua_State * L) -{ - bool found; - LuaField field; - - if (lua_type(L, 1) == LUA_TNUMBER) - found = luaFindFieldById(luaL_checkinteger(L, 1), field, FIND_FIELD_DESC); - else - found = luaFindFieldByName(luaL_checkstring(L, 1), field, FIND_FIELD_DESC); - - if (found) { - lua_newtable(L); - lua_pushtableinteger(L, "id", field.id); - lua_pushtablestring(L, "name", field.name); - lua_pushtablestring(L, "desc", field.desc); - if (field.id >= MIXSRC_FIRST_TELEM && field.id <= MIXSRC_LAST_TELEM) { - TelemetrySensor & telemetrySensor = g_model.telemetrySensors[(int)((field.id-MIXSRC_FIRST_TELEM)/3)]; - lua_pushtableinteger(L, "unit", telemetrySensor.unit); - } - else { - lua_pushtablenil(L, "unit"); - } - return 1; - } - return 0; -} - -/*luadoc -@function getValue(source) - -Returns the value of a source. - -The list of fixed sources: - -| OpenTX Version | Radio | -|----------------|-------| -| 2.0 | [all](http://downloads-20.open-tx.org/firmware/lua_fields.txt) | -| 2.1 | [X9D and X9D+](http://downloads-21.open-tx.org/firmware/lua_fields_taranis.txt), [X9E](http://downloads-21.open-tx.org/firmware/lua_fields_taranis_x9e.txt) | -| 2.2 | [X9D and X9D+](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9e.txt), [Horus](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x12s.txt) | -| 2.3 | [X9D and X9D+](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9e.txt), [X7](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x7.txt), [Horus](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x12s.txt) | - -In OpenTX 2.1.x the telemetry sources no longer have a predefined name. -To get a telemetry value simply use it's sensor name. For example: - * Altitude sensor has a name "Alt" - * to get the current altitude use the source "Alt" - * to get the minimum altitude use the source "Alt-", to get the maximum use "Alt+" - -@param source can be an index (number) (which was obtained by `getFieldInfo` or `getSourceIndex`) or a name (string) of the source. - -@retval value current source value (number). Zero is returned for: - * non-existing sources - * for all telemetry source when the telemetry stream is not received - * far all non allowed sensors while FAI MODE is active - -@retval table GPS position is returned in a table: - * `lat` (number) latitude, positive is North - * `lon` (number) longitude, positive is East - * `pilot-lat` (number) pilot latitude, positive is North - * `pilot-lon` (number) pilot longitude, positive is East - -@retval table GPS date/time, see getDateTime() - -@retval table Cells are returned in a table -(except where no cells were detected in which -case the returned value is 0): - * table has one item for each detected cell: - * key (number) cell number (1 to number of cells) - * value (number) current cell voltage - -@status current Introduced in 2.0.0, changed in 2.1.0, `Cels+` and -`Cels-` added in 2.1.9 - -@notice Getting a value by its numerical identifier is faster then by its name. -While `Cels` sensor returns current values of all cells in a table, a `Cels+` or -`Cels-` will return a single value - the maximum or minimum Cels value. -*/ -static int luaGetValue(lua_State * L) -{ - int src = 0; - if (lua_isnumber(L, 1)) { - src = luaL_checkinteger(L, 1); - } - else { - // convert from field name to its id - const char *name = luaL_checkstring(L, 1); - LuaField field; - bool found = luaFindFieldByName(name, field); - if (found) { - src = field.id; - } - } - luaGetValueAndPush(L, src); - return 1; -} - /*luadoc @function getRAS() @@ -2481,9 +2608,11 @@ const luaL_Reg opentxLib[] = { { "getRotEncMode", luaGetRotEncMode }, { "getValue", luaGetValue }, { "getOutputValue", luaGetOutputValue }, + { "getSourceValue", luaGetSourceValue }, { "getRAS", luaGetRAS }, { "getTxGPS", luaGetTxGPS }, { "getFieldInfo", luaGetFieldInfo }, + { "getSourceInfo", luaGetFieldInfo }, { "getFlightMode", luaGetFlightMode }, { "playFile", luaPlayFile }, { "playNumber", luaPlayNumber }, diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 77d05f6f2cd..632228ee5f6 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -73,7 +73,6 @@ void luaEmptyEventBuffer(); #define LUA_INIT_THEMES_AND_WIDGETS() luaInitThemesAndWidgets() #define lua_registernumber(L, n, i) (lua_pushnumber(L, (i)), lua_setglobal(L, (n))) #define lua_registerint(L, n, i) (lua_pushinteger(L, (i)), lua_setglobal(L, (n))) -#define lua_pushtablenil(L, k) (lua_pushstring(L, (k)), lua_pushnil(L), lua_settable(L, -3)) #define lua_pushtableboolean(L, k, v) (lua_pushstring(L, (k)), lua_pushboolean(L, (v)), lua_settable(L, -3)) #define lua_pushtableinteger(L, k, v) (lua_pushstring(L, (k)), lua_pushinteger(L, (v)), lua_settable(L, -3)) #define lua_pushtablenumber(L, k, v) (lua_pushstring(L, (k)), lua_pushnumber(L, (v)), lua_settable(L, -3)) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 9731a39fbbc..70b188a5714 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -297,10 +297,11 @@ int16_t applyLimits(uint8_t channel, int32_t value) } // TODO same naming convention than the drawSource - -getvalue_t getValue(mixsrc_t i) +// *valid added to return status to Lua for invalid sources +getvalue_t getValue(mixsrc_t i, bool* valid) { if (i == MIXSRC_NONE) { + if (valid != nullptr) *valid = false; return 0; } else if (i <= MIXSRC_LAST_INPUT) { @@ -312,6 +313,7 @@ getvalue_t getValue(mixsrc_t i) div_t qr = div(i-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); return scriptInputsOutputs[qr.quot].outputs[qr.rem].value; #else + if (valid != nullptr) *valid = false; return 0; #endif } @@ -344,6 +346,7 @@ getvalue_t getValue(mixsrc_t i) #if defined(HELI) return cyc_anas[i - MIXSRC_CYC1]; #else + if (valid != nullptr) *valid = false; return 0; #endif } @@ -361,6 +364,7 @@ getvalue_t getValue(mixsrc_t i) return (switchState(3*sw) ? -1024 : (IS_CONFIG_3POS(sw) && switchState(3*sw+1) ? 0 : 1024)); } else { + if (valid != nullptr) *valid = false; return 0; } } @@ -374,6 +378,7 @@ getvalue_t getValue(mixsrc_t i) return (switchState(3*sw) ? -1024 : (IS_CONFIG_3POS(sw) && switchState(3*sw+1) ? 0 : 1024)); } else { + if (valid != nullptr) *valid = false; return 0; } } @@ -406,6 +411,7 @@ getvalue_t getValue(mixsrc_t i) #if defined(GVARS) return GVAR_VALUE(i - MIXSRC_GVAR1, getGVarFlightMode(mixerCurrentFlightMode, i - MIXSRC_GVAR1)); #else + if (valid != nullptr) *valid = false; return 0; #endif } @@ -418,6 +424,7 @@ getvalue_t getValue(mixsrc_t i) #if defined(RTCLOCK) return (g_rtcTime % SECS_PER_DAY) / 60; // number of minutes from midnight #else + if (valid != nullptr) *valid = false; return 0; #endif } @@ -427,6 +434,7 @@ getvalue_t getValue(mixsrc_t i) else if (i <= MIXSRC_LAST_TELEM) { if (IS_FAI_FORBIDDEN(i)) { + if (valid != nullptr) *valid = false; return 0; } i -= MIXSRC_FIRST_TELEM; @@ -441,7 +449,10 @@ getvalue_t getValue(mixsrc_t i) return telemetryItem.value; } } - else return 0; + else { + if (valid != nullptr) *valid = false; + return 0; + } } void evalInputs(uint8_t mode) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index b90a131dcc7..b86dfdad2b0 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -489,7 +489,7 @@ extern uint8_t currentBacklightBright; void perMain(); void per10ms(); -getvalue_t getValue(mixsrc_t i); +getvalue_t getValue(mixsrc_t i, bool* valid = nullptr); #define GETSWITCH_MIDPOS_DELAY 1 bool getSwitch(swsrc_t swtch, uint8_t flags=0); From 4b5c7076532c9ed06a429a33a200e423b5d8042d Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Wed, 28 Sep 2022 12:00:01 +1000 Subject: [PATCH 030/122] fix(cpn): Start up interface error 301 (#2378) --- companion/src/updates/updatecompanion.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/companion/src/updates/updatecompanion.cpp b/companion/src/updates/updatecompanion.cpp index de2ef77729b..9e158fe87b0 100644 --- a/companion/src/updates/updatecompanion.cpp +++ b/companion/src/updates/updatecompanion.cpp @@ -170,19 +170,20 @@ bool UpdateCompanion::asyncInstall() const QString UpdateCompanion::currentRelease() { #if defined(VERSION_TAG) - return UpdateInterface::latestRelease(); + params->currentRelease = QString("EdgeTX \"%1\" %2").arg(CODENAME).arg(VERSION_TAG); #else - params->currentRelease = QString("EdgeTX v%1.%2 (Custom)").arg(VERSION_MAJOR).arg(VERSION_MINOR); - return params->currentRelease; + params->currentRelease = QString("EdgeTX v%1.%2.%3-%4").arg(VERSION_MAJOR).arg(VERSION_MINOR).arg(VERSION_REVISION).arg(VERSION_SUFFIX); #endif + + return params->currentRelease; } const QString UpdateCompanion::currentVersion() { #if defined(VERSION_TAG) - return UpdateInterface::latestRelease(); + return VERSION_TAG; #else - return QString(QString("v%1.%2").arg(VERSION_MAJOR).arg(VERSION_MINOR)); + return QString("v%1").arg(VERSION); #endif } From e9ba3faae0e084e5293c8f1671bfa6f85a185387 Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Wed, 28 Sep 2022 12:26:10 +1000 Subject: [PATCH 031/122] fix(color): Radio tools buttons fit screen better (#2377) --- radio/src/gui/colorlcd/radio_tools.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/radio_tools.cpp b/radio/src/gui/colorlcd/radio_tools.cpp index 23139c0890a..e12e6a8688c 100644 --- a/radio/src/gui/colorlcd/radio_tools.cpp +++ b/radio/src/gui/colorlcd/radio_tools.cpp @@ -173,7 +173,10 @@ struct ToolButton : public TextButton { return 0; }) { - setWidth(LV_DPI_DEF); + if (LCD_W > LCD_H) + setWidth((LCD_W - 3*10) / 3); // 3 columns on landscape + else + setWidth((LCD_W - 2*11) / 2); // 2 columns on portrait setHeight(LV_DPI_DEF / 2); lv_obj_set_width(label, lv_pct(100)); From 15cb0ffb4b1cc5cf5cd88782c17a0e6ca55024cb Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 05:08:59 +0000 Subject: [PATCH 032/122] update x10 datastruct --- radio/src/datastructs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index cac3a861915..c87da6dfb69 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -137,11 +137,11 @@ static inline void check_struct() CHKSIZE(ModelData, 7885); #elif defined(PCBHORUS) #if defined(PCBX10) - CHKSIZE(RadioData, 1563); - CHKSIZE(ModelData, 12305); + CHKSIZE(RadioData, 1564); + CHKSIZE(ModelData, 12408); #else CHKSIZE(RadioData, 1545); - CHKSIZE(ModelData, 12303); + CHKSIZE(ModelData, 12408); #endif #elif defined(PCBNV14) CHKSIZE(RadioData, 1491); From bd5874a7e0b6e3826a9fb38f398716bd53d4bf61 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 05:16:05 +0000 Subject: [PATCH 033/122] print logic switch safe --- companion/src/modelprinter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 39b8f0d4821..19dbfca7713 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -517,6 +517,9 @@ QString ModelPrinter::printLogicalSwitchLine(int idx) case LS_FAMILY_STICKY: result += tr("Sticky") + QString("(%1, %2)").arg(sw1Name).arg(sw2Name); break; + case LS_FAMILY_SAFE: + result += tr("Safe") + QString("(%1, %2)").arg(sw1Name).arg(sw2Name); + break; case LS_FAMILY_TIMER: result += tr("Timer") + QString("(%1, %2)").arg(ValToTim(ls.val1)).arg(ValToTim(ls.val2)); break; From 7628fbd47b829eb342bb56c338f7d98ac2a32bf4 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:22:15 +1000 Subject: [PATCH 034/122] bug: re enabled logic switch sticky. --- radio/src/switches.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index a03492df1f2..a73f8f9d817 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -410,9 +410,9 @@ bool getLogicalSwitch(uint8_t idx) else if (s == LS_FAMILY_TIMER) { result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) <= 0); } - // else if (s == LS_FAMILY_STICKY) { - // result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); - // } + else if (s == LS_FAMILY_STICKY) { + result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); + } else if (s == LS_FAMILY_SAFE) { result = LS_LAST_VALUE(mixerCurrentFlightMode, idx); } From e1457530615c86440495a3eb55a980ab0756c74f Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:25:50 +1000 Subject: [PATCH 035/122] storage conversions for Logic switch Safe --- radio/src/storage/conversions/conversions_216_218.cpp | 4 ++-- radio/src/storage/conversions/conversions_218_219.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/storage/conversions/conversions_216_218.cpp b/radio/src/storage/conversions/conversions_216_218.cpp index 67590c85d6c..82466b2c235 100644 --- a/radio/src/storage/conversions/conversions_216_218.cpp +++ b/radio/src/storage/conversions/conversions_216_218.cpp @@ -991,7 +991,7 @@ void convertModelData_216_to_217(ModelData &model) sw.v2 = convertSource_216_to_217((uint8_t)sw.v2); } } - else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cstate == LS_FAMILY_SAFE ) { sw.v1 = convertSwitch_216_to_217(sw.v1); sw.v2 = convertSwitch_216_to_217(sw.v2); } @@ -1170,7 +1170,7 @@ void convertModelData_217_to_218(ModelData &model) sw.v2 = convertSource_217_to_218((uint8_t)sw.v2); } } - else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cstate == LS_FAMILY_SAFE) { sw.v1 = convertSwitch_217_to_218(sw.v1); sw.v2 = convertSwitch_217_to_218(sw.v2); } diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index 798d293094c..b68c45a2c65 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -181,7 +181,7 @@ void convertModelData_218_to_219(ModelData &model) sw.v2 = convertSource_218_to_219(sw.v2); } } - else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cstate == LS_FAMILY_SAFE) { sw.v1 = convertSwitch_218_to_219(sw.v1); sw.v2 = convertSwitch_218_to_219(sw.v2); } From ae076eefa09b2182835f3e957654046d5609245e Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:29:57 +1000 Subject: [PATCH 036/122] Companion: new Logic Switch & Friendly Name Label --- .../edgetx/yaml_logicalswitchdata.cpp | 18 +++++++- companion/src/firmwares/logicalswitchdata.cpp | 8 ++++ companion/src/firmwares/logicalswitchdata.h | 6 ++- companion/src/firmwares/modeldata.cpp | 6 +++ .../src/firmwares/opentx/opentxeeprom.cpp | 5 ++- companion/src/modeledit/logicalswitches.cpp | 45 +++++++++++++++---- companion/src/modeledit/logicalswitches.h | 2 + .../gui/colorlcd/model_logical_switches.cpp | 2 +- .../src/gui/colorlcd/view_logical_switches.h | 2 +- 9 files changed, 80 insertions(+), 14 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_logicalswitchdata.cpp b/companion/src/firmwares/edgetx/yaml_logicalswitchdata.cpp index 41ecc41093b..0cd2dc26ecd 100644 --- a/companion/src/firmwares/edgetx/yaml_logicalswitchdata.cpp +++ b/companion/src/firmwares/edgetx/yaml_logicalswitchdata.cpp @@ -41,6 +41,7 @@ static const YamlLookupTable funcLut = { {LS_FN_DAPOS, "FUNC_ADIFFEGREATER"}, {LS_FN_TIMER, "FUNC_TIMER"}, {LS_FN_STICKY, "FUNC_STICKY"}, + {LS_FN_SAFE, "FUNC_SAFE"}, }; static int timerValue2lsw(uint32_t t) @@ -79,6 +80,12 @@ Node convert::encode(const LogicalSwitchData& rhs) def += YamlRawSwitchEncode(RawSwitch(rhs.val2)); } break; + case LS_FAMILY_SAFE: { + def += YamlRawSwitchEncode(RawSwitch(rhs.val1)); + def += ","; + def += YamlRawSwitchEncode(RawSwitch(rhs.val2)); + } break; + case LS_FAMILY_EDGE: { def += YamlRawSwitchEncode(RawSwitch(rhs.val1)); def += ","; @@ -116,7 +123,7 @@ Node convert::encode(const LogicalSwitchData& rhs) node["delay"] = rhs.delay; node["duration"] = rhs.duration; node["andsw"] = YamlRawSwitchEncode(RawSwitch(rhs.andsw)); - + node["custName"] = rhs.custName; return node; } @@ -124,6 +131,7 @@ bool convert::decode(const Node& node, LogicalSwitchData& rhs) { node["func"] >> funcLut >> rhs.func; + node["custName"] >> rhs.custName; std::string def_str; node["def"] >> def_str; @@ -139,6 +147,14 @@ bool convert::decode(const Node& node, rhs.val2 = YamlRawSwitchDecode(sw_str).toValue(); } break; +case LS_FAMILY_SAFE: { + std::string sw_str; + getline(def, sw_str, ','); + rhs.val1 = YamlRawSwitchDecode(sw_str).toValue(); + getline(def, sw_str); + rhs.val2 = YamlRawSwitchDecode(sw_str).toValue(); + } break; + case LS_FAMILY_EDGE: { std::string sw_str; getline(def, sw_str, ','); diff --git a/companion/src/firmwares/logicalswitchdata.cpp b/companion/src/firmwares/logicalswitchdata.cpp index 457fc01038f..376db3ec0eb 100644 --- a/companion/src/firmwares/logicalswitchdata.cpp +++ b/companion/src/firmwares/logicalswitchdata.cpp @@ -38,6 +38,8 @@ CSFunctionFamily LogicalSwitchData::getFunctionFamily() const return LS_FAMILY_TIMER; else if (func == LS_FN_STICKY) return LS_FAMILY_STICKY; + else if (func == LS_FN_SAFE) + return LS_FAMILY_SAFE; else if (func < LS_FN_AND || func > LS_FN_ELESS) return LS_FAMILY_VOFS; else if (func < LS_FN_EQUAL) @@ -102,6 +104,8 @@ QString LogicalSwitchData::funcToString() const return tr("Timer"); case LS_FN_STICKY: return tr("Sticky"); + case LS_FN_SAFE: + return tr("Safe"); case LS_FN_EDGE: return tr("Edge"); default: @@ -124,6 +128,10 @@ void LogicalSwitchData::convert(RadioDataConversionState & cstate) val1 = RawSource(val1).convert(cstate.withComponentField("V1")).toValue(); break; case LS_FAMILY_STICKY: + case LS_FAMILY_SAFE: + val1 = RawSwitch(val1).convert(cstate.withComponentField("V1")).toValue(); + val2 = RawSwitch(val2).convert(cstate.withComponentField("V2")).toValue(); + break; case LS_FAMILY_VBOOL: val1 = RawSwitch(val1).convert(cstate.withComponentField("V1")).toValue(); val2 = RawSwitch(val2).convert(cstate.withComponentField("V2")).toValue(); diff --git a/companion/src/firmwares/logicalswitchdata.h b/companion/src/firmwares/logicalswitchdata.h index 1b1c508204d..760601006d5 100644 --- a/companion/src/firmwares/logicalswitchdata.h +++ b/companion/src/firmwares/logicalswitchdata.h @@ -47,8 +47,10 @@ enum CSFunction { LS_FN_TIMER, LS_FN_STICKY, LS_FN_EDGE, + LS_FN_SAFE, // later ... LS_FN_RANGE, - LS_FN_MAX + LS_FN_MAX, + }; enum CSFunctionFamily { @@ -58,6 +60,7 @@ enum CSFunctionFamily { LS_FAMILY_TIMER, LS_FAMILY_STICKY, LS_FAMILY_EDGE, + LS_FAMILY_SAFE, }; class LogicalSwitchData { @@ -76,6 +79,7 @@ class LogicalSwitchData { unsigned int delay; unsigned int duration; int andsw; + char custName[10+1]; void clear() { memset(this, 0, sizeof(LogicalSwitchData)); } bool isEmpty() const; diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index c75cf47c523..b1ee7adb2d3 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -720,6 +720,12 @@ int ModelData::updateReference() } break; case LS_FAMILY_STICKY: + case LS_FAMILY_SAFE: + if (lsd->val1 != 0) + updateSwitchIntRef(lsd->val1); + if (lsd->val2 != 0) + updateSwitchIntRef(lsd->val2); + break; case LS_FAMILY_VBOOL: oldval1 = lsd->val1; oldval2 = lsd->val2; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 8c3a8da3f32..b743c2f7b21 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1347,6 +1347,7 @@ class LogicalSwitchesFunctionsTable: public ConversionTable { addConversion(LS_FN_DAPOS, val++); addConversion(LS_FN_TIMER, val++); addConversion(LS_FN_STICKY, val++); + addConversion(LS_FN_SAFE, val++); } }; @@ -1402,7 +1403,7 @@ class LogicalSwitchField: public TransformedField { v2 = csw.val2; v3 = csw.val3; } - else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY) { + else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY || csw.func == LS_FN_SAFE) { switchesConversionTable->exportValue(csw.val1, v1); switchesConversionTable->exportValue(csw.val2, v2); } @@ -1427,7 +1428,7 @@ class LogicalSwitchField: public TransformedField { csw.val2 = v2; csw.val3 = v3; } - else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY) { + else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY || csw.func == LS_FN_SAFE) { switchesConversionTable->importValue(v1, csw.val1); switchesConversionTable->importValue(v2, csw.val2); } diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index 499df9e49ad..e5c84606d79 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -43,7 +43,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, lsCapabilityExt = firmware->getCapability(LogicalSwitchesExt); QStringList headerLabels; - headerLabels << "#" << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); + headerLabels << "#" << "Name" << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); if (lsCapabilityExt) { headerLabels << tr("Duration") << tr("Delay"); } @@ -63,12 +63,22 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); tableLayout->addWidget(i, 0, label); + // The Custom Name + name[i] = new QLineEdit(this); + name[i]->setProperty("index", i); + name[i]->setMaxLength(10); + QRegExp rx(CHAR_FOR_NAMES_REGEX); + name[i]->setValidator(new QRegExpValidator(rx, this)); + connect(name[i], SIGNAL(editingFinished()), this, SLOT(nameEdited())); + tableLayout->addWidget(i, 1, name[i]); + + // The function cbFunction[i] = new QComboBox(this); cbFunction[i]->setProperty("index", i); populateFunctionCB(cbFunction[i]); connect(cbFunction[i], SIGNAL(currentIndexChanged(int)), this, SLOT(onFunctionChanged())); - tableLayout->addWidget(i, 1, cbFunction[i]); + tableLayout->addWidget(i, 2, cbFunction[i]); // V1 QHBoxLayout *v1Layout = new QHBoxLayout(); @@ -86,7 +96,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, connect(dsbValue[i], SIGNAL(editingFinished()), this, SLOT(onOffsetChanged())); v1Layout->addWidget(dsbValue[i]); dsbValue[i]->setVisible(false); - tableLayout->addLayout(i, 2, v1Layout); + tableLayout->addLayout(i, 3, v1Layout); // V2 QHBoxLayout *v2Layout = new QHBoxLayout(); @@ -119,7 +129,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, connect(teOffset[i],SIGNAL(editingFinished()),this,SLOT(onOffsetChanged())); v2Layout->addWidget(teOffset[i]); teOffset[i]->setVisible(false); - tableLayout->addLayout(i, 3, v2Layout); + tableLayout->addLayout(i, 4, v2Layout); // AND cbAndSwitch[i] = new QComboBox(this); @@ -127,7 +137,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, cbAndSwitch[i]->setModel(rawSwitchFilteredModel); cbAndSwitch[i]->setVisible(true); connect(cbAndSwitch[i], SIGNAL(currentIndexChanged(int)), this, SLOT(onAndSwitchChanged(int))); - tableLayout->addWidget(i, 4, cbAndSwitch[i]); + tableLayout->addWidget(i, 5, cbAndSwitch[i]); if (lsCapabilityExt) { // Duration @@ -139,7 +149,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, dsbDuration[i]->setAccelerated(true); dsbDuration[i]->setDecimals(1); connect(dsbDuration[i], SIGNAL(valueChanged(double)), this, SLOT(onDurationChanged(double))); - tableLayout->addWidget(i, 5, dsbDuration[i]); + tableLayout->addWidget(i, 6, dsbDuration[i]); // Delay dsbDelay[i] = new QDoubleSpinBox(this); @@ -150,7 +160,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, dsbDelay[i]->setAccelerated(true); dsbDelay[i]->setDecimals(1); connect(dsbDelay[i], SIGNAL(valueChanged(double)), this, SLOT(onDelayChanged(double))); - tableLayout->addWidget(i, 6, dsbDelay[i]); + tableLayout->addWidget(i, 7, dsbDelay[i]); } } @@ -164,6 +174,20 @@ LogicalSwitchesPanel::~LogicalSwitchesPanel() delete rawSourceFilteredModel; delete rawSwitchFilteredModel; } +void LogicalSwitchesPanel::nameEdited() +{ + + QLineEdit *le = qobject_cast(sender()); + int index = le->property("index").toInt(); + + if (model->logicalSw[index].custName != le->text()) { + strcpy(model->logicalSw[index].custName, le->text().toLatin1()); + + int currentCbInt = cbSource1[index]->currentIndex(); + model->logicalSw[index].val1 = cbSource1[index]->itemData(currentCbInt).toInt(); + emit modified(); + } +} void LogicalSwitchesPanel::onFunctionChanged() { @@ -356,6 +380,8 @@ void LogicalSwitchesPanel::updateLine(int i) if (!model->logicalSw[i].isEmpty()) { mask = LINE_ENABLED | DELAY_ENABLED | DURATION_ENABLED; + name[i]->setText(model->logicalSw[i].custName); + switch (model->logicalSw[i].getFunctionFamily()) { case LS_FAMILY_VOFS: @@ -391,6 +417,8 @@ void LogicalSwitchesPanel::updateLine(int i) } case LS_FAMILY_STICKY: // no break + case LS_FAMILY_SAFE: // no break + case LS_FAMILY_VBOOL: mask |= SOURCE1_VISIBLE | SOURCE2_VISIBLE; cbSource1[i]->setModel(rawSwitchFilteredModel); @@ -468,7 +496,8 @@ void LogicalSwitchesPanel::populateFunctionCB(QComboBox *b) LS_FN_DPOS, LS_FN_DAPOS, LS_FN_TIMER, - LS_FN_STICKY + LS_FN_STICKY, + LS_FN_SAFE, }; b->clear(); diff --git a/companion/src/modeledit/logicalswitches.h b/companion/src/modeledit/logicalswitches.h index f1c2f8397ef..ae3ff87c7f5 100644 --- a/companion/src/modeledit/logicalswitches.h +++ b/companion/src/modeledit/logicalswitches.h @@ -42,6 +42,7 @@ class LogicalSwitchesPanel : public ModelPanel private slots: void onFunctionChanged(); + void nameEdited(); void onV1Changed(int value); void onV2Changed(int value); void onAndSwitchChanged(int value); @@ -64,6 +65,7 @@ class LogicalSwitchesPanel : public ModelPanel void onItemModelUpdateComplete(); private: + QLineEdit *name[CPN_MAX_LOGICAL_SWITCHES]; QComboBox * cbFunction[CPN_MAX_LOGICAL_SWITCHES]; QDoubleSpinBox * dsbValue[CPN_MAX_LOGICAL_SWITCHES]; QDoubleSpinBox * dsbOffset[CPN_MAX_LOGICAL_SWITCHES]; diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index c689c97f0db..15d49f4a8b4 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -297,7 +297,7 @@ class LogicalSwitchButton : public Button //dc->drawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func, COLOR_THEME_SECONDARY1); dc->drawText(col1, line1, ls->custName, COLOR_THEME_SECONDARY1); // CSW params - if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY || ls->func ==LS_FUNC_SAFE) { + if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY || ls->func == LS_FUNC_SAFE) { drawSwitch(dc, col2, line1, ls->v1, COLOR_THEME_SECONDARY1); drawSwitch(dc, col3, line1, ls->v2, COLOR_THEME_SECONDARY1); } else if (lsFamily == LS_FAMILY_EDGE) { diff --git a/radio/src/gui/colorlcd/view_logical_switches.h b/radio/src/gui/colorlcd/view_logical_switches.h index 74836c8e14b..75208400930 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.h +++ b/radio/src/gui/colorlcd/view_logical_switches.h @@ -55,7 +55,7 @@ class LogicalSwitchDisplayFooter : public Window // CSW params unsigned int cstate = lswFamily(cs->func); - if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cstate == LS_FAMILY_SAFE) { drawSwitch(dc, CSW_2ND_COLUMN, 1, cs->v1, textColor); drawSwitch(dc, CSW_3RD_COLUMN, 1, cs->v2, textColor); } else if (cstate == LS_FAMILY_EDGE) { From d3974361c5e1762a2c8949fcad2e48385d5ba7c6 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 28 Sep 2022 10:00:56 +0200 Subject: [PATCH 037/122] fix: volume controlled by I2C on taranis targets This is essentially X9D(+) (NOT 2019) and X9E. --- radio/src/targets/taranis/volume_i2c.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/volume_i2c.cpp b/radio/src/targets/taranis/volume_i2c.cpp index 9a5635c89e7..e6c7e8c1e47 100644 --- a/radio/src/targets/taranis/volume_i2c.cpp +++ b/radio/src/targets/taranis/volume_i2c.cpp @@ -40,7 +40,7 @@ int32_t getVolume() void setVolume(uint8_t volume) { - // stm32_i2c_init(VOLUME_I2C_BUS, I2C_B1_CLK_RATE); + stm32_i2c_init(VOLUME_I2C_BUS, I2C_B1_CLK_RATE); stm32_i2c_write(VOLUME_I2C_BUS, VOLUME_I2C_ADDRESS, 0, 1, &volume, 1, 10); } From 690efe41851bbb1d17e73310c61baf711d60abaa Mon Sep 17 00:00:00 2001 From: Cliff Date: Wed, 28 Sep 2022 04:19:59 -0400 Subject: [PATCH 038/122] fix(color): Deleting empty label caused EM/Hang (#2392) * If deleting a label, don't check size * If rename to blank, do nothing --- radio/src/gui/colorlcd/model_select.cpp | 20 +++++++++++--------- radio/src/storage/modelslist.cpp | 14 +++++++++----- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index d45464e2a07..6718c3d8f8b 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -776,15 +776,17 @@ void ModelLabelsWindow::buildBody(FormWindow *window) strncpy(tmpLabel, oldLabel.c_str(), LABEL_LENGTH); tmpLabel[LABEL_LENGTH] = '\0'; new LabelDialog(this, tmpLabel, [=](std::string newLabel) { - auto rndialog = - new ProgressDialog(this, STR_RENAME_LABEL, [=]() {}); - modelslabels.renameLabel( - oldLabel, newLabel, [=](const char *name, int percentage) { - rndialog->updateProgress(name, percentage); - }); - auto labels = getLabels(); - lblselector->setNames(labels); - updateFilteredLabels(modelslabels.filteredLabels(), false); + if(newLabel.size() > 0) { + auto rndialog = + new ProgressDialog(this, STR_RENAME_LABEL, [=]() {}); + modelslabels.renameLabel( + oldLabel, newLabel, [=](const char *name, int percentage) { + rndialog->updateProgress(name, percentage); + }); + auto labels = getLabels(); + lblselector->setNames(labels); + updateFilteredLabels(modelslabels.filteredLabels(), false); + } }); return 0; }); diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 697d4c7d908..36dccd99e7f 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -616,15 +616,19 @@ bool ModelMap::renameLabel(const std::string &from, std::string to, if (from == "") return true; DEBUG_TIMER_START(debugTimerYamlScan); - // Limit max label name. TODO: Warn user they entered too long of a string - to = to.substr(0, LABEL_LENGTH); - removeYAMLChars(to); - if(to.size() == 0) return true; - + if(to.size() > 0) { // Ignore check if deleting a label, size will be zero + to = to.substr(0, LABEL_LENGTH); // Limit max label name. TODO: Warn user they entered too long of a string + removeYAMLChars(to); // Remove special chars + if(to.size() == 0 || from == to) { // Abort rename if no chars left or same + if (progress != nullptr) progress("", 100); // Kill progress dialog + return true; + } + } ModelData *modeldata = (ModelData *)malloc(sizeof(ModelData)); if (!modeldata) { TRACE("Labels: Out Of Memory"); + if (progress != nullptr) progress("", 100); // Kill progress dialog return true; } From 4e17445190825228b2b4f87a0349a03c0ae91af3 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 28 Sep 2022 10:26:17 +0200 Subject: [PATCH 039/122] fix(color): focus order after layout choice (#2394) --- radio/src/gui/colorlcd/screen_setup.cpp | 33 +++++++++++++------------ 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index c558fccca5c..e7819a7bce6 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -250,21 +250,6 @@ void ScreenSetupPage::build(FormWindow * form) obj = layoutForm->getLvObj(); lv_obj_set_style_grid_cell_x_align(obj, LV_GRID_ALIGN_STRETCH, 0); - Window* btn = new LayoutChoice(layoutForm, getFactory, setLayout); - obj = btn->getLvObj(); - lv_obj_set_style_min_width(obj, LV_DPI_DEF / 2, LV_PART_MAIN); - lv_obj_set_style_min_height(obj, LV_DPI_DEF / 3, LV_PART_MAIN); - lv_obj_set_style_pad_all(obj, 8, LV_PART_MAIN); - lv_obj_set_style_radius(obj, 8, LV_PART_MAIN); - - btn = new TextButton(layoutForm, rect_t{}, STR_SETUP_WIDGETS, - startWidgetsSetup(menu, idx)); - obj = btn->getLvObj(); - lv_obj_set_style_min_width(obj, LV_DPI_DEF / 2, LV_PART_MAIN); - lv_obj_set_style_min_height(obj, LV_DPI_DEF / 3, LV_PART_MAIN); - lv_obj_set_style_pad_all(obj, 8, LV_PART_MAIN); - lv_obj_set_style_radius(obj, 8, LV_PART_MAIN); - line = form->newLine(); layoutOptions = new FormGroup(line, rect_t{}, FORWARD_SCROLL | FORM_FORWARD_FOCUS); buildLayoutOptions(); @@ -272,7 +257,7 @@ void ScreenSetupPage::build(FormWindow * form) // Prevent removing the last page if (customScreens[1] != nullptr) { line = form->newLine(); - btn = new TextButton(line, rect_t{}, STR_REMOVE_SCREEN, removeScreen(menu, idx)); + Window* btn = new TextButton(line, rect_t{}, STR_REMOVE_SCREEN, removeScreen(menu, idx)); obj = btn->getLvObj(); lv_obj_set_style_min_width(obj, LV_DPI_DEF / 2, LV_PART_MAIN); lv_obj_set_style_min_height(obj, LV_DPI_DEF / 3, LV_PART_MAIN); @@ -283,6 +268,22 @@ void ScreenSetupPage::build(FormWindow * form) lv_obj_center(obj); } + Window* btn = new LayoutChoice(layoutForm, getFactory, setLayout); + obj = btn->getLvObj(); + lv_obj_set_style_min_width(obj, LV_DPI_DEF / 2, LV_PART_MAIN); + lv_obj_set_style_min_height(obj, LV_DPI_DEF / 3, LV_PART_MAIN); + lv_obj_set_style_pad_all(obj, 8, LV_PART_MAIN); + lv_obj_set_style_radius(obj, 8, LV_PART_MAIN); + lv_group_focus_obj(obj); + + btn = new TextButton(layoutForm, rect_t{}, STR_SETUP_WIDGETS, + startWidgetsSetup(menu, idx)); + obj = btn->getLvObj(); + lv_obj_set_style_min_width(obj, LV_DPI_DEF / 2, LV_PART_MAIN); + lv_obj_set_style_min_height(obj, LV_DPI_DEF / 3, LV_PART_MAIN); + lv_obj_set_style_pad_all(obj, 8, LV_PART_MAIN); + lv_obj_set_style_radius(obj, 8, LV_PART_MAIN); + form->updateSize(); } From 6fe199e51c9dbb1992704d67e51661edb2a1fa13 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 28 Sep 2022 10:35:41 +0200 Subject: [PATCH 040/122] fix: default input names on model creation (#2395) Fixes #2389 --- radio/src/model_init.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/radio/src/model_init.cpp b/radio/src/model_init.cpp index 481b066ae5c..b9850cb86f4 100644 --- a/radio/src/model_init.cpp +++ b/radio/src/model_init.cpp @@ -36,10 +36,9 @@ void setDefaultInputs() expo->chn = i; expo->weight = 100; expo->mode = 3; // TODO constant - strncpy(g_model.inputNames[i], STR_VSRCRAW[stick_index] + 1, 3); -#if LEN_INPUT_NAME > 3 - g_model.inputNames[i][3] = '\0'; -#endif + strncpy(g_model.inputNames[i], + STR_VSRCRAW[stick_index] + sizeof(STR_CHAR_STICK) - 1, + LEN_INPUT_NAME); } storageDirty(EE_MODEL); } From 4fb843df41a6d57b58edbcfb3dad4fa314fe3daf Mon Sep 17 00:00:00 2001 From: Malte Langermann <54738901+gagarinlg@users.noreply.github.com> Date: Wed, 28 Sep 2022 13:13:29 +0200 Subject: [PATCH 041/122] fix(gui): vertical tab title alignment on color lcd radios fixed (#2402) --- radio/src/gui/colorlcd/themes/480_default.cpp | 2 +- radio/src/gui/colorlcd/themes/flysky.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/colorlcd/themes/480_default.cpp b/radio/src/gui/colorlcd/themes/480_default.cpp index 5d7d79e7d1e..4aed42c8b02 100644 --- a/radio/src/gui/colorlcd/themes/480_default.cpp +++ b/radio/src/gui/colorlcd/themes/480_default.cpp @@ -222,7 +222,7 @@ class Theme480: public OpenTxTheme dc->drawSolidFilledRect(0, MENU_TITLE_TOP, LCD_W, MENU_TITLE_HEIGHT, COLOR_THEME_SECONDARY1); // the title line background if (title) { - dc->drawText(MENUS_MARGIN_LEFT, MENU_TITLE_TOP + 3, title, COLOR_THEME_PRIMARY2); + dc->drawText(MENUS_MARGIN_LEFT, MENU_TITLE_TOP + 1, title, COLOR_THEME_PRIMARY2); } drawMenuDatetime(dc); diff --git a/radio/src/gui/colorlcd/themes/flysky.cpp b/radio/src/gui/colorlcd/themes/flysky.cpp index 0d62a4cfa47..9dac271dff7 100644 --- a/radio/src/gui/colorlcd/themes/flysky.cpp +++ b/radio/src/gui/colorlcd/themes/flysky.cpp @@ -352,7 +352,7 @@ class FlyskyTheme: public OpenTxTheme COLOR_THEME_SECONDARY1); // the title line background // if (title) { - dc->drawText(MENUS_MARGIN_LEFT, MENU_TITLE_TOP + 2, title, COLOR_THEME_SECONDARY1); + dc->drawText(MENUS_MARGIN_LEFT, MENU_TITLE_TOP + 1, title, COLOR_THEME_SECONDARY1); } } From 235336ed5365cde979e3ea2043ec1c9081c5f19f Mon Sep 17 00:00:00 2001 From: ulfhedlund <35467815+ulfhedlund@users.noreply.github.com> Date: Thu, 29 Sep 2022 02:52:21 +0200 Subject: [PATCH 042/122] =?UTF-8?q?feat:=20More=20Swedish=20translations?= =?UTF-8?q?=20=F0=9F=87=B8=F0=9F=87=AA=20(#2382)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Minor changes * Translations for new items (primarily related to update) * One typo corrected --- companion/src/translations/companion_sv.ts | 204 +++++++++++++-------- radio/src/translations/se.h | 16 +- 2 files changed, 131 insertions(+), 89 deletions(-) diff --git a/companion/src/translations/companion_sv.ts b/companion/src/translations/companion_sv.ts index 23623d9a299..f0f8d2a3d94 100644 --- a/companion/src/translations/companion_sv.ts +++ b/companion/src/translations/companion_sv.ts @@ -595,7 +595,7 @@ Mode 4: Options - Tillvalda funktioner + Alternativ Prompt to run SD Sync after update @@ -645,10 +645,6 @@ Mode 4: Release channel Publiceringskanal - - Delete downloads after update - Radera nerladdningar efter uppdatering - Logging Loggningsnivå @@ -677,6 +673,30 @@ Mode 4: Select your update destination folder Välj katalog för uppdateringen + + Delete downloads + Radera nerladdningar + + + Delete decompressions + Radera uppackade filer + + + Update Settings: Download folder path missing! + Uppdateringsinställningar: Sökväg till katalog för nerladdning saknas! + + + Update Settings: Decompress folder path missing! + Uppdateringsinställningar: Sökväg till katalog för uppackning saknas! + + + Update Settings: Update folder path missing! + Uppdateringsinställningar: Sökväg till katalog för uppdateringar saknas! + + + Update Settings: Decompress and download folders have the same path! + Uppdateringsinställningar: Sökväg till katalog för uppackning och nerladdning är identiska! + BinEepromFormat @@ -1816,7 +1836,7 @@ Vill du hämta inställningarna från en fil? Option #%1 - Tillval #%1 + Alternativ #%1 Layout: @@ -2591,19 +2611,19 @@ Tomt betyder inkludera alla. ?, * och [...] jokertecken accepteras. Filter Options: - Filtertillval: + Filteralternativ: Folder Options: - Mapptillval: + Mappalternativ: Options - Tillval + Alternativ Show extra options - Visa extra tillval + Visa extra alternativ Reset to defaults @@ -6020,6 +6040,10 @@ Vill du fortsätta? Write Firmware to Radio Skriv firmware till radion + + Checking for updates... + Kollar efter uppdateringar... + MdiChild @@ -7147,7 +7171,7 @@ p, li { white-space: pre-wrap; } Option value - Tillvalsvärde + Alternativ värde Sub Type @@ -7517,7 +7541,7 @@ p, li { white-space: pre-wrap; } Option value - Tillvalsvärde + Alternativ värde Low Power @@ -8083,7 +8107,7 @@ p, li { white-space: pre-wrap; } Option value - Tillvalsvärde + Alternativ värde DEFAULT @@ -11210,10 +11234,6 @@ Använd CTRL + skroll eller PAGE UP/DOWN tangenterna för att ändra tiden i st Install Installera - - Expected 1 asset for install but none found - Förväntades en tillgång att installera men ingen hittades - Firmware not found in %1 using filter %2 Firmware hittades inte i %1 med filter %2 @@ -11222,6 +11242,10 @@ Använd CTRL + skroll eller PAGE UP/DOWN tangenterna för att ändra tiden i st Write the updated firmware to the radio now ? Skriv uppdaterad firmware till radion nu? + + Expected %1 asset for install but %2 found + Förväntade tillgång %1 för installation men hittade %2 + UpdateInterface @@ -11231,19 +11255,19 @@ Använd CTRL + skroll eller PAGE UP/DOWN tangenterna för att ändra tiden i st %1 preparation failed - %1 förberedelse misslyckades + Förberedelse av %1 misslyckades %1 download failed - %1 nerladdning misslyckades + Nerladdning av %1 misslyckades %1 decompress failed - %1 uppackning misslyckades + Uppackning av %1 misslyckades %1 copy to destination failed - %1 kopiering till målet misslyckades + Kopiering av %1 till målet misslyckades Failed to save release settings @@ -11251,15 +11275,15 @@ Använd CTRL + skroll eller PAGE UP/DOWN tangenterna för att ändra tiden i st %1 start async failed - %1 start av async misslyckades + Start av async för %1 misslyckades %1 housekeeping failed - %1 uppstädning misslyckades + Uppstädning av %1 misslyckades %1 update successful - %1 uppdatering lyckades + Uppdatering av %1 lyckades Update Interface @@ -11279,7 +11303,7 @@ Använd CTRL + skroll eller PAGE UP/DOWN tangenterna för att ändra tiden i st %1 directory not configured in application settings! - %1 katalog inte konfigurerad i programinställningarna! + Katalog för %1 inte konfigurerad i programinställningarna! Failed to create %1 directory %2! @@ -11297,14 +11321,6 @@ Använd CTRL + skroll eller PAGE UP/DOWN tangenterna för att ändra tiden i st Network error has occurred. Error code: %1 Ett nätverksfel har inträffat. Felkod: %1 - - No assets not found in release '%1' using filter pattern '%2' - Inga tillgångar hittades för version '%1' med filtermönster '%2' - - - %1 assets found when %2 expected in release '%3' using filter pattern '%4' - %1 av %2 förväntade tillgångar hittades för version '%3', med filtermönster '%4' - Unable to set processing flags for asset %1 Kunde inte sätta bearbetningsflaggor för tillgång %1 @@ -11409,10 +11425,6 @@ Använd CTRL + skroll eller PAGE UP/DOWN tangenterna för att ändra tiden i st Set run folders failed Kunde inte sätta körkataloger - - Set release id from update release name failed - Kunde inte sätta versions-id från uppdateringens versionsnamn - Flagging assets Flaggar tillgångar @@ -11487,6 +11499,26 @@ Error:%1 Fel:%1 %2 + + Asset filter: %1 + Filter för tillgångar: %1 + + + No assets found in release '%1' using filter '%2' + Inga tillgångar hittades för version '%1' med filter '%2' + + + %1 assets found when %2 expected in release '%3' using filter '%4' + %1 tillgångar hittades, när %2 förväntades för version '%3' med filter '%4' + + + Set release id from update release '%1' failed + Kunde ej sätta versions-id från uppdateringversion '%1' + + + Delete decompress folder: %1 + Radera uppackningskatalog: %1 + UpdateMultiProtocol @@ -11503,13 +11535,7 @@ Fel:%1 Options - Tillval - - - Clear current release information. -Warning: There is no undo! Are you sure? - Rensa nuvarande releaseinformation. -Varning: Detta går inte att ångra! Är du säker? + Alternativ Filter @@ -11536,32 +11562,36 @@ Varning: Detta går inte att ångra! Är du säker? Underkatalog - Release - Version + Assets + Tillgångar - Current - Nuvarande + Advanced Options + Avancerade alternativ - Update to - Uppdatera till + Current Release: + Nuvarande version: - Assets - Tillgångar + unknown + okänd - Forget - Glöm + Clear + Rensa - Advanced Options - Avancerade tillval + Clear current release information. Are you sure? + Rensa nuvarande versionsinformation. Är du säker? + + + Max.Expected + Max. förväntade - Clear the last updated release information - Rensa den senaste uppdaterade versionsinformationen + No Limit + Ingen gräns @@ -11658,16 +11688,6 @@ Varning: Detta går inte att ångra! Är du säker? Checking for Updates Kollar efter uppdateringar - - Updates available for: - %1 - -Update now? - Uppdateringar tillgängliga för: - %1 - -Uppdatera nu? - No components have been flagged to check in Update Settings! Inga komponenter har flaggats för kontroll i uppdateringsinställningarna! @@ -11696,6 +11716,16 @@ Uppdatera nu? Run SD card sync now? Synka SD-kortet nu? + + Updates available for: + - %1 + +Process now? + Uppdateringar tillgängliga för: + - %1 + +Bearbeta nu? + UpdatesDialog @@ -11723,21 +11753,13 @@ Uppdatera nu? Channel Kanal - - Current Release - Nuvarande version - - - Update Release - Uppdateringsversion - Retrieving latest release information for %1 Hämtar senaste versionsinformation för %1 Options - Tillval + Alternativ Download folder path missing! @@ -11783,10 +11805,6 @@ Uppdatera nu? Components Komponenter - - Delete downloads after update - Radera nerladdade filer efter uppdatering - Use Radio Profile SD structure Använd radioprofilens SD-kortstruktur @@ -11795,6 +11813,30 @@ Uppdatera nu? Create sub-folders in Download folder Skapa underkataloger i nerladdningskatalogen + + Delete downloads + Radera nerladdningar + + + Delete decompressions + Radera uppackningar + + + Current + Nuvarande + + + Update to + Uppdatera till + + + Save as Defaults + Spara som förval + + + Decompress and download folders have the same path! + Sökväg till katalog för uppackning och nerladdning är identiska! + UserInterfacePanel diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index acba24494c5..ec22848d555 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -60,7 +60,7 @@ #define TR_MULTI_TELEMETRY_MODE "Av","På","Av+Aux","På+Aux" #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Exponentiell"),TR("xFin","Extra fin"),"Fin","Medium","Grov" -#define TR_VDISPLAYTRIMS "Nej","Ändra","Ja" +#define TR_VDISPLAYTRIMS "Nej","Ändring","Ja" #define TR_VBEEPCOUNTDOWN "Tyst","Pip","Röst","Vibrera" #define TR_VVARIOCENTER "Pip","Tyst" #define TR_CURVE_TYPES "Normal","Anpassad" @@ -174,7 +174,7 @@ #define TR_SF_SET_SCREEN "Sätt huvudskärm" #define TR_SF_RESERVE "[reserv]" -#define TR_VFSWFUNC TR_SF_SAFETY,"Lärare","Spara trimmar","Nollställ","Sätt ",TR_ADJUST_GVAR,"Volym","Sätt failsafe","Range check","Module bind",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE, TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Belysning",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST +#define TR_VFSWFUNC TR_SF_SAFETY,"Lärare","Spara trimmar","Nollställ","Sätt ",TR_ADJUST_GVAR,"Volym","Sätt failsafe","Range check","Bind modul",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE, TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Belysning",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST #define TR_FSW_RESET_TELEM TR("Telm","Telemetri") @@ -622,7 +622,7 @@ #define TR_RF_POWER "RF styrka" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR("Alternativ", "Alternativets värde") -#define TR_MULTI_AUTOBIND TR(INDENT "Bind ch.",INDENT "Parkoppla via kanal") +#define TR_MULTI_AUTOBIND TR(INDENT "Bind ch.",INDENT "Bind via kanal") #define TR_DISABLE_CH_MAP TR("Ej ka.översikt", "Inaktivera kanalöversikt") #define TR_DISABLE_TELEM TR("Ej telem.", "Inaktivera telemetri") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Auto", INDENT "Autodetektera format") @@ -634,13 +634,13 @@ #define TR_MODULE_NO_SERIAL_MODE TR("!seriellt läge", "Ej i seriellt läge") #define TR_MODULE_NO_INPUT TR("Ingen input", "Ingen seriell input") #define TR_MODULE_NO_TELEMETRY TR3("Ingen telem.", "Ingen MULTI_TELEMETRY", "Ingen MULTI_TELEMETRY detekterad") -#define TR_MODULE_WAITFORBIND "Bind to load protocol" -#define TR_MODULE_BINDING "Binding" +#define TR_MODULE_WAITFORBIND "Bind för att ladda protokoll" +#define TR_MODULE_BINDING "Binder" #define TR_MODULE_UPGRADE_ALERT TR3("Uppdat. nödv", "Modulen måste uppdateras", "Modulen\nbehöver uppdateras") #define TR_MODULE_UPGRADE TR("Uppdat. rekomm", "Moduluppdatering rekommenderas") -#define TR_REBIND "Rebinding required" +#define TR_REBIND "Ny bindning krävs" #define TR_REG_OK "Registrering ok" -#define TR_BIND_OK "Parkoppling klar" +#define TR_BIND_OK "Bindning klar" #define TR_BINDING_CH1_8_TELEM_ON "Ka1-8 Telem på" #define TR_BINDING_CH1_8_TELEM_OFF "Ka1-8 Telem av" #define TR_BINDING_CH9_16_TELEM_ON "Ka9-16 Telem på" @@ -951,7 +951,7 @@ #define TR_RECEIVER_DELETE "Radera mottagare?" #define TR_RECEIVER_RESET "Återställ mottagare?" #define TR_SHARE "Dela" -#define TR_BIND "Bind" +#define TR_BIND "Binder" #define TR_REGISTER TR("Reg", "Registrera") #define TR_MODULE_RANGE BUTTON(TR("Tst", "Testa")) #define TR_RECEIVER_OPTIONS TR("RX ALTERNATIV", "MOTTAGARALTERNATIV") From 074fa236faabdac493a52a1922760f268a713d46 Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Thu, 29 Sep 2022 15:26:49 +1000 Subject: [PATCH 043/122] chore: Add new radios to bug support form --- .github/ISSUE_TEMPLATE/bug-report.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index da844d626d4..45731a44773 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -76,7 +76,10 @@ body: affecting more than one transmitter. multiple: true options: - - FlySky NV14 + - BetaFPV LiteRadio3 Pro + - iFlight Commando8 + - Flysky EL18 + - Flysky NV14 - FrSky Q X7 / Q X7S (ACCST) - FrSky Q X7 / Q X7S (ACCESS) - FrSky X9D @@ -95,7 +98,7 @@ body: - Jumper T-Pro - Radiomaster T8 - RadioMaster TX12 / TX12MK2 - - Radiomaster TX16S + - Radiomaster TX16S / TX16MK2 - Radiomaster Zorro - Other (Please specify below) validations: From 04d6a33d4060f907d1e7dc2ca0b8737a90de60eb Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Thu, 29 Sep 2022 15:28:13 +1000 Subject: [PATCH 044/122] chore: Typo in bug template --- .github/ISSUE_TEMPLATE/bug-report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 45731a44773..75e272c8757 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -98,7 +98,7 @@ body: - Jumper T-Pro - Radiomaster T8 - RadioMaster TX12 / TX12MK2 - - Radiomaster TX16S / TX16MK2 + - Radiomaster TX16S / TX16SMK2 - Radiomaster Zorro - Other (Please specify below) validations: From 0b8906639a0f78660cb7bf27af2b5218f1f4ed05 Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Thu, 29 Sep 2022 19:26:54 +1000 Subject: [PATCH 045/122] fix(color): Trainer stick labels not updating (#2401) Stick labels for trainer mode should match default channel order setting --- radio/src/gui/colorlcd/radio_trainer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/radio_trainer.cpp b/radio/src/gui/colorlcd/radio_trainer.cpp index 9534e936575..341e4c17965 100644 --- a/radio/src/gui/colorlcd/radio_trainer.cpp +++ b/radio/src/gui/colorlcd/radio_trainer.cpp @@ -57,7 +57,7 @@ void RadioTrainerPage::build(FormWindow * form) TrainerMix* td = &g_eeGeneral.trainer.mix[chan - 1]; auto line = form->newLine(&grid); - new StaticText(line, rect_t{}, STR_VSRCRAW[i + 1], 0, COLOR_THEME_PRIMARY1); + new StaticText(line, rect_t{}, STR_VSRCRAW[chan], 0, COLOR_THEME_PRIMARY1); auto box = new FormGroup(line, rect_t{}); box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(4)); From 9b917f307269a6642a7d060c568a850dcc84a2c7 Mon Sep 17 00:00:00 2001 From: ParkerEde Date: Thu, 29 Sep 2022 13:06:42 +0200 Subject: [PATCH 046/122] =?UTF-8?q?feat:=20More=20German=20translations=20?= =?UTF-8?q?=F0=9F=87=A9=F0=9F=87=AA=20(#2380)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * few more german translations * Update de.h * Update de.h * Update de.h Update "RTC Spann. prüfen" * Update de.h "Binden" Button at ISRM * Update de.h TR_ANALOGS_BTN and TR_KEYS_BTN translated --- radio/src/translations/de.h | 70 ++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 755ae2c34cb..b20a83da533 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -39,18 +39,18 @@ #define TR_VBLMODE "AUS","Taste","Stks","Beide","EIN" #define TR_TRNMODE "AUS","+=",":=" #define TR_TRNCHN "CH1","CH2","CH3","CH4" -#define TR_AUX_SERIAL_MODES "AUS","Telem Mirror","Telemetry In","SBUS Eingang","LUA","CLI","GPS","Debug","SpaceMouse" +#define TR_AUX_SERIAL_MODES "AUS","Telem weiterl.","Telemetrie In","SBUS Eingang","LUA","CLI","GPS","Debug","SpaceMouse" #define TR_SWTYPES "Kein","Taster","2POS","3POS" #define TR_POTTYPES "Kein",TR("Poti m.Ras","Poti mit Raste"),TR("Stufens.","Stufen-Schalter"),TR("Pot","Poti ohne Raste") -#define TR_SLIDERTYPES "Keine","Slider" +#define TR_SLIDERTYPES "Keine","Schieber" #define TR_VLCD "Normal","Optrex" -#define TR_VPERSISTENT "AUS","Flugzeit","Manuell Ruck" +#define TR_VPERSISTENT "AUS","Flugzeit","Manuell Rück" #define TR_COUNTRY_CODES TR("US","Amerika"),TR("JP","Japan"),TR("EU","Europa") #define TR_USBMODES "Fragen",TR("Joyst","Joystick"),TR("SDCard","Speicher"),TR("Serial","Seriell") #define TR_JACK_MODES "Popup","Audio","Trainer" -#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (Kabel)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT","FrSky D","FrSky D (Kabel)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetrie" -#define TR_SBUS_INVERSION_VALUES "normal","not inverted" +#define TR_SBUS_INVERSION_VALUES "normal","nicht inv." #define TR_MULTI_TELEMETRY_MODE "Aus","Ein","Aus+Aux","Ein+Aux" #define TR_MULTI_CUSTOM "Benutzer" #define TR_VTRIMINC TR("Expo","Exponentiell"),TR("ExFein","Extrafein"),"Fein","Mittel","Grob" @@ -154,9 +154,9 @@ #endif #if defined(OVERRIDE_CHANNEL_FUNCTION) && LCD_W >= 212 - #define TR_SF_SAFETY "Override" + #define TR_SF_SAFETY "Überschreibe" #elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Overr." + #define TR_SF_SAFETY "Übersch." #else #define TR_SF_SAFETY "---" #endif @@ -342,8 +342,8 @@ #define TR_MODELNAME "Modellname" #define TR_PHASENAME "Phase-Name" #define TR_MIXNAME "Mix-Name" -#define TR_INPUTNAME TR("Input", "Input name") -#define TR_EXPONAME TR("Name", "Line name") +#define TR_INPUTNAME TR("Input", "Inputname") +#define TR_EXPONAME TR("Name", "Zeilenname") #define TR_BITMAP "Modellfoto" #define TR_NO_PICTURE "kein Foto" #define TR_TIMER "Timer" @@ -351,7 +351,7 @@ #define TR_ELIMITS TR("Erw. Limit", "Erw. Wege auf 150%") #define TR_ETRIMS TR("Erw. Trims", "Erw. Trim auf 100%") #define TR_TRIMINC TR("Trimschritt", "Trimmschritte") -#define TR_DISPLAY_TRIMS TR("Trimanzeige", "Trimwerte anzeigen") +#define TR_DISPLAY_TRIMS TR("Trimmanzeige", "Trimmwerte anzeigen") #define TR_TTRACE TR("Gasquelle", INDENT "Gas-Timerquelle") #define TR_TTRIM TR("Gastrim", INDENT "Gas-Leerlauftrim") #define TR_TTRIM_SW TR("T-Trim-Sw", INDENT "Trim switch") @@ -363,7 +363,7 @@ #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" -#define TR_FREQUENCY INDENT "Frequency" +#define TR_FREQUENCY INDENT "Frequenz" #define TR_SWITCH TR("Schalt.", "Schalter") #define TR_TRIMS "Trimmer" #define TR_FADEIN "Langs. Ein" @@ -429,7 +429,7 @@ #define TR_IMU_MAX "Max" #define TR_CONTRAST "LCD-Kontrast" #define TR_ALARMS_LABEL "Alarme" -#define TR_BATTERY_RANGE TR("Akku Bereich", "Akku Spannungsbereich") // Symbol Akku Ladezustand +#define TR_BATTERY_RANGE TR("Akku Bereich", "Akku Spann. Bereich") // Symbol Akku Ladezustand #define TR_BATTERYCHARGING "Lädt..." #define TR_BATTERYFULL "Akku voll" #define TR_BATTERYNONE "None!" @@ -480,7 +480,7 @@ #define TR_CAL "Kal." #define TR_VTRIM "Trim - +" #define TR_BG "BG:" -#define TR_CALIB_DONE "Calibration completed" +#define TR_CALIB_DONE "Kalibrierung fertig" #if defined(PCBHORUS) #define TR_MENUTOSTART "Drücke [Enter] zum Start" #define TR_SETMIDPOINT "Knüppel/Potis/Sliders auf Mitte [Enter]" @@ -758,7 +758,7 @@ #define TR_TIME "Uhrzeit:" #define TR_BAUDRATE "Baudrate" #define TR_MAXBAUDRATE "Max Baud" -#define TR_SAMPLE_MODE "Sample Mode" +#define TR_SAMPLE_MODE "Abtastmodus" #define TR_SAMPLE_MODES "Normal","OneBit" @@ -788,7 +788,7 @@ #define TR_SD_INFO_TITLE "SD-INFO" #define TR_SD_TYPE "Typ:" #define TR_SD_SPEED "Geschw:" -#define TR_SD_SECTORS "Sectoren:" +#define TR_SD_SECTORS "Sektoren:" #define TR_SD_SIZE "Größe:" #define TR_TYPE INDENT "Typ" #define TR_GLOBAL_VARS "Globale Variablen" @@ -798,12 +798,12 @@ #define TR_OWN "Eigen" #define TR_DATE "Datum:" #define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez" } -#define TR_ROTARY_ENCODER "Drehgeber" -#define TR_ROTARY_ENC_MODE TR("RotEnc Mode","Rotary Encoder Mode") +#define TR_ROTARY_ENCODER "Drehg." +#define TR_ROTARY_ENC_MODE TR("Drehg. Modus","Drehgeber Modus") #define TR_CHANNELS_MONITOR "Kanal-Monitor==>" #define TR_MIXERS_MONITOR "==>Mischer Monitor" #define TR_PATH_TOO_LONG "Pfad zu Lang" -#define TR_VIEW_TEXT "View Text" +#define TR_VIEW_TEXT "Zeige Text" #define TR_FLASH_DEVICE TR("Flash Gerät","Flash Gerät") #define TR_FLASH_BOOTLOADER TR("Flash bootloader","Flash bootloader") #define TR_FLASH_EXTERNAL_DEVICE TR("Flash ext. Gerät","Flash externes Gerät") @@ -834,7 +834,7 @@ #define TR_INTERNAL_MODULE TR("Int. module","Internal module") #define TR_EXTERNAL_MODULE TR("Ext. module","External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade nötig" -#define TR_TELEMETRY_DISABLED "Deaktiviere Telem." +#define TR_TELEMETRY_DISABLED "Deaktiv. Telem." //more chars doesn't fit on QX7 #define TR_MORE_OPTIONS_AVAILABLE "mehr Optionen verfügbar" #define TR_NO_MODULE_INFORMATION "keine Modul Info" #define TR_EXTERNALRF "Externes HF-Modul" @@ -888,34 +888,34 @@ #define TR_AND_SWITCH "UND Schalt" // UND mit weiterem Schaltern #define TR_SF "SF" // Spezial Funktionen #define TR_GF "GF" // Globale Funktionen -#define TR_ANADIAGS_CALIB "Calibrated analogs" -#define TR_ANADIAGS_FILTRAWDEV "Filtered raw analogs with deviation" -#define TR_ANADIAGS_UNFILTRAW "Unfiltered raw analogs" -#define TR_ANADIAGS_MINMAX "Min., max. and range" +#define TR_ANADIAGS_CALIB "analoge Geber Kalibriert" +#define TR_ANADIAGS_FILTRAWDEV "analoge Geber gefiltert und unbearbeitet mit Abweichungen" +#define TR_ANADIAGS_UNFILTRAW "analoge Geber ungefiltert und unbearbeitet" +#define TR_ANADIAGS_MINMAX "Min., Max. und Bereich" #define TR_ANADIAGS_MOVE "Move analogs to their extremes!" #define TR_SPEAKER INDENT "Lautspr" #define TR_BUZZER INDENT "Summer" #define TR_BYTES "Bytes" -#define TR_MODULE_BIND BUTTON(TR("Bnd","Bind")) //9XR-Pro -#define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX" +#define TR_MODULE_BIND BUTTON(TR("Bnd","Binden")) //9XR-Pro +#define TR_POWERMETER_ATTN_NEEDED "Dämpfungsgl. nötig" +#define TR_PXX2_SELECT_RX "Wähle RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device" -#define TR_DISCOVER "Discover" +#define TR_BT_SELECT_DEVICE "Wähle Gerät" +#define TR_DISCOVER "Suche" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Warte..." #define TR_RECEIVER_DELETE "Empfänger löschen?" #define TR_RECEIVER_RESET "Empfänger resetten?" #define TR_SHARE "Share" -#define TR_BIND "Bind" +#define TR_BIND "Binden" #define TR_REGISTER TR("Reg", "Register") -#define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) //9XR-Pro -#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") +#define TR_MODULE_RANGE BUTTON(TR("Rng", "Reichweite")) //9XR-Pro +#define TR_RECEIVER_OPTIONS TR("RX OPTIONEN", "RX OPTIONEN") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Testen" -#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) -#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_KEYS_BTN BUTTON(TR("SW","Schalter")) +#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analoge")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Kalibrieren" @@ -1152,8 +1152,8 @@ #define TR_MENU_INVERT "Invertieren" #define TR_JITTER_FILTER "ADC Filter" #define TR_DEAD_ZONE "Dead zone" -#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") -#define TR_AUTH_FAILURE "Auth-failure" +#define TR_RTC_CHECK TR("RTC Prüfen", "RTC Spann. prüfen") +#define TR_AUTH_FAILURE "Auth-Fehler" #define TR_RACING_MODE "Racing mode" // ---------------------------------------------------------------- From d033b1ee3bba87419e0ba0959c576617f116d182 Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Fri, 30 Sep 2022 10:03:07 +1000 Subject: [PATCH 047/122] fix(cpn): Model print pot warnings (#2421) --- companion/src/modelprinter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 39b8f0d4821..9bfa02eb73e 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -788,7 +788,7 @@ QString ModelPrinter::printPotWarnings() for (int i=0; i Date: Thu, 29 Sep 2022 19:26:07 -0700 Subject: [PATCH 048/122] fix(color): Restore "go to channel monitor" Button (#2390) * Restore go to channel monitor go_to_monitor_Button * Remove unnecessary parameter. --- radio/src/gui/colorlcd/menu_model.cpp | 11 +++++++++++ radio/src/gui/colorlcd/menu_model.h | 3 +++ 2 files changed, 14 insertions(+) diff --git a/radio/src/gui/colorlcd/menu_model.cpp b/radio/src/gui/colorlcd/menu_model.cpp index 6425c1e55d4..e76f42ad90f 100644 --- a/radio/src/gui/colorlcd/menu_model.cpp +++ b/radio/src/gui/colorlcd/menu_model.cpp @@ -61,6 +61,7 @@ ModelMenu::ModelMenu(): #endif addTab(new ModelTelemetryPage()); + addGoToMonitorsButton(); } void ModelMenu::onEvent(event_t event) @@ -74,3 +75,13 @@ void ModelMenu::onEvent(event_t event) } #endif } + +void ModelMenu::addGoToMonitorsButton() +{ + OpenTxTheme::instance()->createTextButton( + &header, {LCD_W / 2 + 6, MENU_TITLE_TOP + 1, LCD_W / 2 - 8, MENU_TITLE_HEIGHT - 2}, + STR_OPEN_CHANNEL_MONITORS, [=]() { + pushEvent(EVT_KEY_FIRST(KEY_MODEL)); + return 0; + }); +} \ No newline at end of file diff --git a/radio/src/gui/colorlcd/menu_model.h b/radio/src/gui/colorlcd/menu_model.h index 34bf15fc156..57e85cfe0dc 100644 --- a/radio/src/gui/colorlcd/menu_model.h +++ b/radio/src/gui/colorlcd/menu_model.h @@ -34,6 +34,9 @@ class ModelMenu : public TabsGroup #if defined(DEBUG_WINDOWS) std::string getName() const override { return "ModelMenu"; } #endif + +protected: + void addGoToMonitorsButton(void); }; #endif // _MENU_MODEL_H_ From d7a54119b856b7c55998d161ba41e19d6e2c1539 Mon Sep 17 00:00:00 2001 From: eshifri <46511024+eshifri@users.noreply.github.com> Date: Thu, 29 Sep 2022 19:28:18 -0700 Subject: [PATCH 049/122] fix(color): Add extra line in telemetry screen for vertical LCD (#2422) TODO: Is a temporary fix only until telemetry screen is reworked --- radio/src/gui/colorlcd/model_telemetry.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/gui/colorlcd/model_telemetry.cpp b/radio/src/gui/colorlcd/model_telemetry.cpp index 67245871151..aaed00c401f 100644 --- a/radio/src/gui/colorlcd/model_telemetry.cpp +++ b/radio/src/gui/colorlcd/model_telemetry.cpp @@ -483,6 +483,8 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex) new StaticText(window, grid.getLabelSlot(true), STR_DISABLE_ALARM, 0, COLOR_THEME_PRIMARY1); new CheckBox(window, grid.getFieldSlot(), GET_SET_DEFAULT(g_model.rssiAlarms.disabled)); grid.nextLine(); + + if (LCD_W < LCD_H) grid.nextLine(); // Sensors grid.setLabelWidth(140); From baeb2cf61022a3d0dd2117cec1476cfab9426934 Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Fri, 30 Sep 2022 20:12:40 +1000 Subject: [PATCH 050/122] fix(cpn): Model print remove B&W EEPROM size (#2426) --- companion/src/multimodelprinter.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp index e926e7ee9a2..bd5069c918f 100644 --- a/companion/src/multimodelprinter.cpp +++ b/companion/src/multimodelprinter.cpp @@ -314,9 +314,6 @@ QString MultiModelPrinter::printSetup() MultiColumns columns(modelPrinterMap.size()); columns.appendSectionTableStart(); ROWLABELCOMPARECELL(tr("Name"), 20, model->name, 80); - if (!IS_FAMILY_HORUS_OR_T16(firmware->getBoard())) { - ROWLABELCOMPARECELL(tr("EEprom Size"), 0, modelPrinter->printEEpromSize(), 0); - } if (firmware->getCapability(HasModelImage)) { ROWLABELCOMPARECELL(tr("Model Image"), 0, model->bitmap, 0); } From d466bb1b0b0d9ebd64b72e7131e645310988e065 Mon Sep 17 00:00:00 2001 From: Cliff Date: Fri, 30 Sep 2022 21:29:16 -0400 Subject: [PATCH 051/122] fix(color): Move mdls not in models.yml to `/Models/Unused` (#2397) * Move models.yml that don't exist into /Models/Unused * Add sdMove, Translations, move both models.yml * Comments, break loop, rmv extra bool. * Show Press_Any_Key on dialog * Translations * Always create /Models/UNUSED if models.yml exists. * Close directories --- radio/src/sdcard.cpp | 37 ++++++ radio/src/sdcard.h | 3 + radio/src/storage/modelslist.cpp | 101 +++++++++++++--- radio/src/storage/yaml/CMakeLists.txt | 1 + radio/src/storage/yaml/yaml_modelslist.cpp | 127 +++++++++++++++++++++ radio/src/storage/yaml/yaml_modelslist.h | 33 ++++++ radio/src/translations.cpp | 1 + radio/src/translations.h | 3 +- radio/src/translations/cn.h | 7 +- radio/src/translations/cz.h | 1 + radio/src/translations/da.h | 9 +- radio/src/translations/de.h | 1 + radio/src/translations/en.h | 1 + radio/src/translations/es.h | 1 + radio/src/translations/fi.h | 9 +- radio/src/translations/fr.h | 1 + radio/src/translations/it.h | 1 + radio/src/translations/nl.h | 7 +- radio/src/translations/pl.h | 7 +- radio/src/translations/pt.h | 7 +- radio/src/translations/se.h | 9 +- 21 files changed, 327 insertions(+), 40 deletions(-) create mode 100644 radio/src/storage/yaml/yaml_modelslist.cpp create mode 100644 radio/src/storage/yaml/yaml_modelslist.h diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index e3ad2838e68..4057e61c32c 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -416,6 +416,43 @@ const char * sdCopyFile(const char * srcFilename, const char * srcDir, const cha return sdCopyFile(srcPath, destPath); } + +// Will overwrite if destination exists +const char * sdMoveFile(const char * srcPath, const char * destPath) +{ + const char *result; + result = sdCopyFile(srcPath, destPath); + if(result != 0) { + return result; + } + + FRESULT fres = f_unlink(srcPath); + if(fres != FR_OK) { + return SDCARD_ERROR(fres); + } + return nullptr; +} + +// Will overwrite if destination exists +const char * sdMoveFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir) +{ + const char *result; + result = sdCopyFile(srcFilename, srcDir, destFilename, destDir); + if(result != 0) { + return result; + } + + char srcPath[2*CLIPBOARD_PATH_LEN+1]; + char * tmp = strAppend(srcPath, srcDir, CLIPBOARD_PATH_LEN); + *tmp++ = '/'; + strAppend(tmp, srcFilename, CLIPBOARD_PATH_LEN); + FRESULT fres = f_unlink(srcPath); + if(fres != FR_OK) { + return SDCARD_ERROR(fres); + } + return nullptr; +} + #endif // defined(SDCARD) diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index a58e2f49875..ac7a8f19ccf 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -35,6 +35,7 @@ extern FIL g_oLogFile; #define ROOT_PATH PATH_SEPARATOR #define MODELS_PATH ROOT_PATH "MODELS" // no trailing slash = important #define DELETED_MODELS_PATH MODELS_PATH PATH_SEPARATOR "DELETED" +#define UNUSED_MODELS_PATH MODELS_PATH PATH_SEPARATOR "UNUSED" #define RADIO_PATH ROOT_PATH "RADIO" // no trailing slash = important #define TEMPLATES_PATH ROOT_PATH "TEMPLATES" #define PERS_TEMPL_PATH TEMPLATES_PATH "/PERSONAL" @@ -191,6 +192,8 @@ unsigned int findNextFileIndex(char * filename, uint8_t size, const char * direc const char * sdCopyFile(const char * src, const char * dest); const char * sdCopyFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir); +const char * sdMoveFile(const char * src, const char * dest); +const char * sdMoveFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir); #define LIST_NONE_SD_FILE 1 #define LIST_SD_FILE_EXT 2 diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 36dccd99e7f..1de5c0d77eb 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -30,6 +30,7 @@ using std::list; #include "storage/sdcard_yaml.h" #include "yaml/yaml_datastructs.h" #include "yaml/yaml_labelslist.h" +#include "yaml/yaml_modelslist.h" #include "yaml/yaml_parser.h" #endif @@ -1024,6 +1025,84 @@ bool ModelsList::loadYaml() f_closedir(&moddir); } + // Check if models.yml exists + // Any files found above that are not listed in the file will be moved into + // /MDOELS/UNUSED and removed from the discovered file hash list + char line[LEN_MODELS_IDX_LINE + 1]; + FILINFO fno; + FRESULT result; + bool foundInModels = f_stat(MODELSLIST_YAML_PATH, &fno) == FR_OK; + bool foundInRadio = f_stat(FALLBACK_MODELSLIST_YAML_PATH, &fno) == FR_OK; + + if(foundInModels) { // Default to /Models copy + result = f_open(&file, MODELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ); + } else if (foundInRadio) { + result = f_open(&file, FALLBACK_MODELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ); + } + if((foundInModels || foundInRadio) && result == FR_OK) { + // Create /Models/Unused if it doesn't exist + bool moveRequired = false; + DIR unusedFolder; + FRESULT result = f_opendir(&unusedFolder, UNUSED_MODELS_PATH); + if (result != FR_OK) { + if (result == FR_NO_PATH) result = f_mkdir(UNUSED_MODELS_PATH); + if (result != FR_OK) { + TRACE("Unable to create unused models folder"); + return false; + } + } else f_closedir(&unusedFolder); + + YamlParser ymp; + std::vector modfiles; + void *ctx = get_modelslist_iter(&modfiles); + ymp.init(get_modelslist_parser_calls(), ctx); + UINT bytes_read = 0; + while (f_read(&file, line, sizeof(line), &bytes_read) == FR_OK) { + if (bytes_read == 0) break; + if (f_eof(&file)) ymp.set_eof(); + if (ymp.parse(line, bytes_read) != YamlParser::CONTINUE_PARSING) break; + } + f_close(&file); + + // Loop through file hases, move any files found that don't exists to /unused + std::vector newFileHash; + for(const auto &fhas: fileHashInfo) { + bool found = false; + for(const auto &file : modfiles) { + if (file == fhas.name) { + TRACE_LABELS("Found file %s in models.yml.. OK!", file); + found = true; + break; + } + } + if(!found) { + moveRequired = true; + TRACE_LABELS("Model %s not in models.yml, moving to /UNUSED", fhas.name.c_str()); + // Move model into unused folder. + const char *warning = sdMoveFile(fhas.name.c_str(), MODELS_PATH, fhas.name.c_str(), UNUSED_MODELS_PATH); + if(warning) + POPUP_WARNING(warning); + } else { + newFileHash.push_back(fhas); // File exists, keep it + } + } + + if(foundInRadio) { + const char *warning = sdMoveFile(MODELS_FILENAME, RADIO_PATH, MODELS_FILENAME, UNUSED_MODELS_PATH); + if(warning) + POPUP_WARNING(warning); + } + if(foundInModels) { // Will overwrite the copy from /radio if both existed, do last + const char *warning = sdMoveFile(MODELS_FILENAME, MODELS_PATH, MODELS_FILENAME, UNUSED_MODELS_PATH); + if(warning) + POPUP_WARNING(warning); + } + if(moveRequired) { + fileHashInfo = newFileHash; // Update the new file list + POPUP_WARNING(TR_MODELS_MOVED "\n" UNUSED_MODELS_PATH, "\n" TR_PRESS_ANY_KEY_TO_SKIP); + } + } + #if defined(DEBUG_TIMERS) DEBUG_TIMER_SAMPLE(debugTimerYamlScan); TRACE("Lables: Time to scan models folder %luus", @@ -1031,9 +1110,7 @@ bool ModelsList::loadYaml() #endif // Scan labels.yml - char line[LEN_MODELS_IDX_LINE + 1]; - FRESULT result = - f_open(&file, LABELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ); + result = f_open(&file, LABELSLIST_YAML_PATH, FA_OPEN_EXISTING | FA_READ); if (result == FR_OK) { YamlParser yp; void *ctx = get_labelslist_iter(); @@ -1340,21 +1417,15 @@ bool ModelsList::removeModel(ModelCell *model) TRACE("Unable to create deleted models folder"); return true; } - } + } else f_closedir(&deletedFolder); // Move model into deleted folder. If not moved will be re-added on next // reboot - if (!sdCopyFile(model->modelFilename, MODELS_PATH, model->modelFilename, - DELETED_MODELS_PATH)) { - char curFilename[sizeof(MODELS_PATH) + LEN_MODEL_FILENAME + 2] = ""; - strcat(curFilename, MODELS_PATH PATH_SEPARATOR); - strcat(curFilename, model->modelFilename); - TRACE_LABELS("Deleting Model %s", model->modelFilename); - - if (f_unlink(curFilename) != FR_OK) { - TRACE("Labels: Unable to delete file"); - return true; - } + TRACE_LABELS("Deleting Model %s", model->modelFilename); + const char *warning = sdMoveFile(model->modelFilename, MODELS_PATH, model->modelFilename, DELETED_MODELS_PATH); + if (warning) { + TRACE("Labels: Unable to move file"); + return true; } // Free memory diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index 964d07e9721..eaf282576cd 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -7,6 +7,7 @@ set(SRC ${SRC} storage/yaml/yaml_tree_walker.cpp if(STORAGE_MODELSLIST) set(SRC ${SRC} storage/yaml/yaml_labelslist.cpp) + set(SRC ${SRC} storage/yaml/yaml_modelslist.cpp) add_definitions(-DSTORAGE_MODELSLIST) endif() diff --git a/radio/src/storage/yaml/yaml_modelslist.cpp b/radio/src/storage/yaml/yaml_modelslist.cpp new file mode 100644 index 00000000000..29a782683f7 --- /dev/null +++ b/radio/src/storage/yaml/yaml_modelslist.cpp @@ -0,0 +1,127 @@ +/* + * 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 "yaml_modelslist.h" +#include "yaml_parser.h" + +#include "storage/modelslist.h" + +#include + +using std::list; + +struct modelslist_iter +{ + enum Level { + Root=0, + Category=1, + Model=2 + }; + + std::vector* filelist; + uint8_t level; + char current_attr[16]; // set after find_node() +}; + +static modelslist_iter __modelslist_iter_inst; + +void* get_modelslist_iter(std::vector* filelist) +{ + __modelslist_iter_inst.filelist = filelist; + __modelslist_iter_inst.level = 0; + + return &__modelslist_iter_inst; +} + +static bool to_parent(void* ctx) +{ + modelslist_iter* mi = (modelslist_iter*)ctx; + if (mi->level == modelslist_iter::Root) { + return false; + } + + mi->level--; + return true; +} + +static bool to_child(void* ctx) +{ + modelslist_iter* mi = (modelslist_iter*)ctx; + if (mi->level == modelslist_iter::Model) { + return false; + } + + mi->level++; + return true; +} + +static bool to_next_elmt(void* ctx) +{ + modelslist_iter* mi = (modelslist_iter*)ctx; + if (mi->level == modelslist_iter::Root) { + return false; + } + return true; +} + +static bool find_node(void* ctx, char* buf, uint8_t len) +{ + modelslist_iter* mi = (modelslist_iter*)ctx; + + if (len > sizeof(modelslist_iter::current_attr)-1) + len = sizeof(modelslist_iter::current_attr)-1; + + memcpy(mi->current_attr, buf, len); + mi->current_attr[len] = '\0'; + + return true; +} + +static void set_attr(void* ctx, char* buf, uint8_t len) +{ + char fnamebuf[LEN_MODEL_FILENAME + 1]; + modelslist_iter* mi = (modelslist_iter*)ctx; + + switch (mi->level) { + case modelslist_iter::Model: + if (!strcmp(mi->current_attr, "filename")) { + if(len <= LEN_MODEL_FILENAME) { + memcpy(fnamebuf, buf, len); + fnamebuf[len] = '\0'; + mi->filelist->push_back(fnamebuf); + } + } + break; + } +} + +static const YamlParserCalls modelslistCalls = { + to_parent, + to_child, + to_next_elmt, + find_node, + set_attr +}; + +const YamlParserCalls* get_modelslist_parser_calls() +{ + return &modelslistCalls; +} diff --git a/radio/src/storage/yaml/yaml_modelslist.h b/radio/src/storage/yaml/yaml_modelslist.h new file mode 100644 index 00000000000..7614253eb73 --- /dev/null +++ b/radio/src/storage/yaml/yaml_modelslist.h @@ -0,0 +1,33 @@ +/* + * 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 _YAML_MODELSLIST_H_ +#define _YAML_MODELSLIST_H_ + +#include +#include + +struct YamlParserCalls; + +void* get_modelslist_iter(std::vector* filelist); +const YamlParserCalls* get_modelslist_parser_calls(); + +#endif \ No newline at end of file diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 866e9c39d95..787717a8583 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -340,6 +340,7 @@ const char STR_MODELS[] = TR_MODELS; const char STR_SELECT_MODE[] = TR_SELECT_MODE; const char STR_CREATE_MODEL[] = TR_CREATE_MODEL; const char STR_FAVORITE_LABEL[] = TR_FAVORITE_LABEL; +const char STR_MODELS_MOVED[] = TR_MODELS_MOVED; const char STR_NEW_MODEL[] = TR_NEW_MODEL; const char STR_INVALID_MODEL[] = TR_INVALID_MODEL; const char STR_EDIT_LABELS[] = TR_EDIT_LABELS; diff --git a/radio/src/translations.h b/radio/src/translations.h index abcc57d8541..964ba40b466 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -9,7 +9,7 @@ * * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * - * This program is free software; you can redistribute it and/or modify + * 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. * @@ -539,6 +539,7 @@ extern const char STR_MODELS[]; extern const char STR_SELECT_MODE[]; extern const char STR_CREATE_MODEL[]; extern const char STR_FAVORITE_LABEL[]; +extern const char STR_MODELS_MOVED[]; extern const char STR_NEW_MODEL[]; extern const char STR_INVALID_MODEL[]; extern const char STR_EDIT_LABELS[]; diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 64f437e70d8..5bb014f7a20 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -633,6 +633,7 @@ #define TR_SELECT_MODE "选择模式" #define TR_CREATE_MODEL "创建模型" #define TR_FAVORITE_LABEL "Favorites" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "New Model" #define TR_INVALID_MODEL "Invalid Model" #define TR_EDIT_LABELS "Edit Labels" @@ -806,7 +807,7 @@ #define TR_PATH_TOO_LONG "路径太长" #define TR_VIEW_TEXT "查看文本" #define TR_FLASH_BOOTLOADER "更新引导程序" -#define TR_FLASH_DEVICE TR("更新设备","更新设备") +#define TR_FLASH_DEVICE TR("更新设备","更新设备") #define TR_FLASH_EXTERNAL_DEVICE TR("从S.Port更新", "从 S.Port 端口更新外设固件") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA "Flash RX by ext. OTA" @@ -1309,9 +1310,9 @@ #define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "将所有微调导入中点偏移值" #if LCD_W > LCD_H - #define TR_OPEN_CHANNEL_MONITORS "打开通道监视器" + #define TR_OPEN_CHANNEL_MONITORS "打开通道监视器" #else - #define TR_OPEN_CHANNEL_MONITORS "通道监视" + #define TR_OPEN_CHANNEL_MONITORS "通道监视" #endif #define TR_DUPLICATE "复制" #define TR_ACTIVATE "启用" diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 7efbc720e5c..b1bfdbc5fd7 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -649,6 +649,7 @@ #define TR_SELECT_MODE "Vybrat mód" #define TR_CREATE_MODEL "Nový model" #define TR_FAVORITE_LABEL "Oblíbené" +#define TR_MODELS_MOVED "Nepoužívané modely přesunuty do" #define TR_NEW_MODEL "Nový model" #define TR_INVALID_MODEL "Neplatný model" #define TR_EDIT_LABELS "Upravit štítek" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index d6142a184aa..e35fe7e29de 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -29,7 +29,7 @@ * \001 to \034 -extended spacing (value * FW/2) * \0 -ends current string */ - + #define TR_OFFON "FRA","TIL" #define TR_MMMINV "---","INV" #define TR_VBEEPMODE "Stille","Alarm","NoKey","Alle" @@ -633,6 +633,7 @@ #define TR_SELECT_MODE "Vælg tilstand" #define TR_CREATE_MODEL "Opret model" #define TR_FAVORITE_LABEL "Favoritter" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "Ny model" #define TR_INVALID_MODEL "Ingen billede" #define TR_EDIT_LABELS "Ret type" @@ -806,7 +807,7 @@ #define TR_PATH_TOO_LONG "Sti for lang" #define TR_VIEW_TEXT "Vis tekst" #define TR_FLASH_BOOTLOADER "Brænde bootloader" -#define TR_FLASH_DEVICE TR("Brænde enhed","Brænde enhed") +#define TR_FLASH_DEVICE TR("Brænde enhed","Brænde enhed") #define TR_FLASH_EXTERNAL_DEVICE TR("Brænde S.Port", "Brænde S.Port enhed") #define TR_FLASH_RECEIVER_OTA "Brænde modtager OTA" #define TR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA "Brænde RX med ext. OTA" @@ -1309,9 +1310,9 @@ #define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "Tillæg alle trim til subtrim" #if LCD_W > LCD_H - #define TR_OPEN_CHANNEL_MONITORS "Åbn kanal Monitor" + #define TR_OPEN_CHANNEL_MONITORS "Åbn kanal Monitor" #else - #define TR_OPEN_CHANNEL_MONITORS "Åbn kanal Mon." + #define TR_OPEN_CHANNEL_MONITORS "Åbn kanal Mon." #endif #define TR_DUPLICATE "Dupliker" #define TR_ACTIVATE "Set aktiv" diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index b20a83da533..1e54abff8a1 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -632,6 +632,7 @@ #define TR_SELECT_MODE "Wähle Mode" #define TR_CREATE_MODEL TR("Neues Modell" , "Neues Modell erstellen") #define TR_FAVORITE_LABEL "Favoriten" +#define TR_MODELS_MOVED "Unbenutzte Modelle werden verschoben nach" #define TR_NEW_MODEL "Neues Modell" #define TR_INVALID_MODEL "ungültiges Modell" #define TR_EDIT_LABELS "Label ändern" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index adca52bb87d..3fe75f47d40 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -633,6 +633,7 @@ #define TR_SELECT_MODE "Select mode" #define TR_CREATE_MODEL "Create model" #define TR_FAVORITE_LABEL "Favorites" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "New Model" #define TR_INVALID_MODEL "Invalid Model" #define TR_EDIT_LABELS "Edit Labels" diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index 7c6631fa3e8..894c928e328 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -634,6 +634,7 @@ #define TR_SELECT_MODE "Select mode" #define TR_CREATE_MODEL "Crear modelo" #define TR_FAVORITE_LABEL "Favorites" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "New Model" #define TR_INVALID_MODEL "Invalid Model" #define TR_EDIT_LABELS "Edit Labels" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index e895280a565..38ca7d71474 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -179,7 +179,7 @@ #endif #define TR_VFSWRESET TR_FSW_RESET_TIMERS,"All",TR_FSW_RESET_TELEM - + #define TR_FUNCSOUNDS TR("Bp1","Beep1"),TR("Bp2","Beep2"),TR("Bp3","Beep3"),TR("Wrn1","Warn1"),TR("Wrn2","Warn2"),TR("Chee","Cheep"),TR("Rata","Ratata"),"Tick",TR("Sirn","Siren"),"Ring",TR("SciF","SciFi"),TR("Robt","Robot"),TR("Chrp","Chirp"),"Tada",TR("Crck","Crickt"),TR("Alrm","AlmClk") #define TR_TELEM_RESERVE TR("[--]","[---]") @@ -648,6 +648,7 @@ #define TR_SELECT_MODE "Select mode" #define TR_CREATE_MODEL "Create Model" #define TR_FAVORITE_LABEL "Favorites" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "New Model" #define TR_INVALID_MODEL "Invalid Model" #define TR_EDIT_LABELS "Edit Labels" @@ -820,7 +821,7 @@ #define TR_PATH_TOO_LONG "Polku liian pitkä" #define TR_VIEW_TEXT "View text" #define TR_FLASH_BOOTLOADER "Flash bootloader" -#define TR_FLASH_DEVICE TR("Flash device","Flash device") +#define TR_FLASH_DEVICE TR("Flash device","Flash device") #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA "Flash RX by ext. OTA" @@ -1331,9 +1332,9 @@ #define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "Add all Trims to Subtrims" #if LCD_W > LCD_H - #define TR_OPEN_CHANNEL_MONITORS "Open Channel Monitor" + #define TR_OPEN_CHANNEL_MONITORS "Open Channel Monitor" #else - #define TR_OPEN_CHANNEL_MONITORS "Open Channel Mon." + #define TR_OPEN_CHANNEL_MONITORS "Open Channel Mon." #endif #define TR_DUPLICATE "Duplicate" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 87e7d299ee0..aa3f61b6f78 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -653,6 +653,7 @@ #define TR_SELECT_MODE "Select mode" #define TR_CREATE_MODEL "Créer modèle" #define TR_FAVORITE_LABEL "Favorites" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "New Model" #define TR_INVALID_MODEL "Invalid Model" #define TR_EDIT_LABELS "Edit Labels" diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index 6ac860c5364..28b21c5c867 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -634,6 +634,7 @@ #define TR_SELECT_MODE "Seleziona modo" #define TR_CREATE_MODEL "Crea Modello" #define TR_FAVORITE_LABEL "Favoriti" +#define TR_MODELS_MOVED "Modelli inutilizzati spostati in" #define TR_NEW_MODEL "Nuovo Modello" #define TR_INVALID_MODEL "Modello invalido" #define TR_EDIT_LABELS "Edita Etichette" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 5f6374eacac..e273dc82d88 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -639,11 +639,12 @@ #define TR_SELECT_MODE "Select mode" #define TR_CREATE_MODEL "Nieuw Model" #define TR_FAVORITE_LABEL "Favorites" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "New Model" -#define TR_INVALID_MODEL "Invalid Model" +#define TR_INVALID_MODEL "Invalid Model" #define TR_EDIT_LABELS "Edit Labels" -#define TR_MOVE_UP "Move Up" -#define TR_MOVE_DOWN "Move Down" +#define TR_MOVE_UP "Move Up" +#define TR_MOVE_DOWN "Move Down" #define TR_ENTER_LABEL "Enter Label" #define TR_LABEL "Label" #define TR_LABELS "Labels" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index fdd6d1de10c..0655008e82c 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -630,11 +630,12 @@ #define TR_SELECT_MODE "Select mode" #define TR_CREATE_MODEL "Nowy model" #define TR_FAVORITE_LABEL "Favorites" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "New Model" -#define TR_INVALID_MODEL "Invalid Model" +#define TR_INVALID_MODEL "Invalid Model" #define TR_EDIT_LABELS "Edit Labels" -#define TR_MOVE_UP "Move Up" -#define TR_MOVE_DOWN "Move Down" +#define TR_MOVE_UP "Move Up" +#define TR_MOVE_DOWN "Move Down" #define TR_ENTER_LABEL "Enter Label" #define TR_LABEL "Label" #define TR_LABELS "Labels" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index b79429e4373..2d4aa6a36c5 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -636,11 +636,12 @@ #define TR_SELECT_MODE "Select mode" #define TR_CREATE_MODEL "Criar Modelo" #define TR_FAVORITE_LABEL "Favorites" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "New Model" -#define TR_INVALID_MODEL "Invalid Model" +#define TR_INVALID_MODEL "Invalid Model" #define TR_EDIT_LABELS "Edit Labels" -#define TR_MOVE_UP "Move Up" -#define TR_MOVE_DOWN "Move Down" +#define TR_MOVE_UP "Move Up" +#define TR_MOVE_DOWN "Move Down" #define TR_ENTER_LABEL "Enter Label" #define TR_LABEL "Label" #define TR_LABELS "Labels" diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index ec22848d555..c2ca7d338d2 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -78,7 +78,7 @@ #else #define TR_RETA123 "R","H","G","S","1","2","3" #endif - + #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Addera","Förstärk","Ersätt" #define TR_VMLTPX2 "+=","*=",":=" @@ -673,6 +673,7 @@ #define TR_SELECT_MODE "Välj läge" #define TR_CREATE_MODEL "Skapa modell" #define TR_FAVORITE_LABEL "Favoriter" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "Ny modell" #define TR_INVALID_MODEL "Ogiltig modell" #define TR_EDIT_LABELS "Redigera etiketter" @@ -981,7 +982,7 @@ #define TR_ENABLE "Aktivera" #define TR_TOPLCDTIMER "Översta LCD timer" #define TR_UNIT "Enhet" -#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till..." +#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till..." #define TR_CHANNELRANGE TR(INDENT "Kanalomr.", INDENT "Kanalområde") #define TR_RXFREQUENCY TR("RX frekv.", "RX frekvens") #define TR_AFHDS3_RX_FREQ TR("RX frekv", "RX frekvens") @@ -1373,9 +1374,9 @@ #define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "Addera alla trimmar till subtrimmar" #if LCD_W > LCD_H - #define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmonitorn" + #define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmonitorn" #else - #define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmon." + #define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmon." #endif #define TR_DUPLICATE "Duplicera" From b7f46e40d93903955385ca653850430d7377e139 Mon Sep 17 00:00:00 2001 From: Cliff Date: Sat, 1 Oct 2022 00:43:19 -0400 Subject: [PATCH 052/122] feat: Change extension on models.yml to prevent second parsing (#2430) --- radio/src/storage/modelslist.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 1de5c0d77eb..c62d04bcc18 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -1088,12 +1088,12 @@ bool ModelsList::loadYaml() } if(foundInRadio) { - const char *warning = sdMoveFile(MODELS_FILENAME, RADIO_PATH, MODELS_FILENAME, UNUSED_MODELS_PATH); + const char *warning = sdMoveFile(MODELS_FILENAME, RADIO_PATH, MODELS_FILENAME ".old", UNUSED_MODELS_PATH); if(warning) POPUP_WARNING(warning); } if(foundInModels) { // Will overwrite the copy from /radio if both existed, do last - const char *warning = sdMoveFile(MODELS_FILENAME, MODELS_PATH, MODELS_FILENAME, UNUSED_MODELS_PATH); + const char *warning = sdMoveFile(MODELS_FILENAME, MODELS_PATH, MODELS_FILENAME ".old", UNUSED_MODELS_PATH); if(warning) POPUP_WARNING(warning); } From 5d9e2afcd23c9eea388f5dbe98f99eb8cd855763 Mon Sep 17 00:00:00 2001 From: Malte Langermann <54738901+gagarinlg@users.noreply.github.com> Date: Sat, 1 Oct 2022 08:11:03 +0200 Subject: [PATCH 053/122] fix(lua): drawTextLines line height now same as older ETX versions (#2428) * fix(gui): line height in EdgeTX<2.8 was smaller at the same font size as with Edgetx >=2.8 to allow lua scripts to be optimized for odler and newer versions, drawTextLines now draws the text vertically condensed needs https://github.com/EdgeTX/libopenui/pull/69 * chore: Bump `libopenui` * fix: `FontHeightCorrection` needs to exist Will be optimised out since not used in bootloader --- radio/src/gui/colorlcd/draw_functions.cpp | 2 +- radio/src/gui/colorlcd/fonts.cpp | 17 +++++++++++++++++ radio/src/thirdparty/libopenui | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/colorlcd/draw_functions.cpp b/radio/src/gui/colorlcd/draw_functions.cpp index 8fdd71ba3ef..fd2ec8566a3 100644 --- a/radio/src/gui/colorlcd/draw_functions.cpp +++ b/radio/src/gui/colorlcd/draw_functions.cpp @@ -580,7 +580,7 @@ void drawTextLines(BitmapBuffer * dc, coord_t left, coord_t top, coord_t width, { coord_t x = left; coord_t y = top; - coord_t line = getFontHeight(flags & 0xFFFF); + coord_t line = getFontHeightCondensed(flags & 0xFFFF); coord_t space = getTextWidth(" ", 1, flags); coord_t word; const char * nxt = str; diff --git a/radio/src/gui/colorlcd/fonts.cpp b/radio/src/gui/colorlcd/fonts.cpp index 06fb919109c..8d455820446 100644 --- a/radio/src/gui/colorlcd/fonts.cpp +++ b/radio/src/gui/colorlcd/fonts.cpp @@ -45,6 +45,17 @@ #endif // BOOT +// used to set the line height to the line heights used in Edgetx < 2.7 and OpenTX +static const int8_t FontHeightCorrection[FONTS_COUNT] { + -2, // STD + -2, // BOLD + -2, // XXS + -2, // XS + -3, // L + -5, // XL + -2, // XXL +}; + const lv_font_t* getFont(LcdFlags flags) { #if defined(BOOT) @@ -62,6 +73,12 @@ uint8_t getFontHeight(LcdFlags flags) return lv_font_get_line_height(font); } +uint8_t getFontHeightCondensed(LcdFlags flags) +{ + auto font = getFont(flags); + return lv_font_get_line_height(font) + FontHeightCorrection[FONT_INDEX(flags)]; +} + int getTextWidth(const char * s, int len, LcdFlags flags) { auto font = getFont(flags); diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index 2ccef5198ae..3dc03495a69 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit 2ccef5198aeb75295f1eb3d0c725bc91872ff7b9 +Subproject commit 3dc03495a699931acb0c39937f489a3bd9e8c693 From 9dd697a9773c3b5bde87946b313ba8d1a4120d90 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:40:40 +1000 Subject: [PATCH 054/122] Companion: custom function Friendly Name Label --- companion/src/firmwares/customfunctiondata.h | 1 + .../edgetx/yaml_customfunctiondata.cpp | 4 ++ companion/src/modeledit/customfunctions.cpp | 40 +++++++++++++++++-- companion/src/modeledit/customfunctions.h | 2 + .../yaml/yaml_datastructs_funcs.cpp | 6 +++ .../storage/yaml/yaml_datastructs_funcs.cpp | 14 +++++++ 6 files changed, 64 insertions(+), 3 deletions(-) diff --git a/companion/src/firmwares/customfunctiondata.h b/companion/src/firmwares/customfunctiondata.h index d2b2265e35a..2ebdb6a754b 100644 --- a/companion/src/firmwares/customfunctiondata.h +++ b/companion/src/firmwares/customfunctiondata.h @@ -105,6 +105,7 @@ class CustomFunctionData { unsigned int enabled; // TODO perhaps not any more the right name unsigned int adjustMode; int repeatParam; + char custName[10+1]; void convert(RadioDataConversionState & cstate); diff --git a/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp b/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp index 50f82a1fbd9..60787710d9a 100644 --- a/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp +++ b/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp @@ -238,6 +238,8 @@ Node convert::encode(const CustomFunctionData& rhs) node["def"] = def; } + node["custName"] = rhs.custName; + return node; } @@ -246,6 +248,8 @@ bool convert::decode(const Node& node, { node["swtch"] >> rhs.swtch; + node["custName"] >> rhs.custName; + int func = 0; node["func"] >> customFnLut >> func; rhs.func = (AssignFunc)func; diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 17b520e65c2..3940e27a644 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -99,7 +99,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, playIcon.addImage("stop.png", QIcon::Normal, QIcon::On); QStringList headerLabels; - headerLabels << "#" << tr("Switch") << tr("Action") << tr("Parameters") << ""; + headerLabels << "#" << tr("Switch") << tr("Action") << tr("Parameters") << "" << "Name"; TableLayout * tableLayout = new TableLayout(this, fswCapability, headerLabels); for (int i = 0; i < fswCapability; i++) { @@ -116,6 +116,16 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); tableLayout->addWidget(i, 0, label); + + + // The Custom Name + name[i] = new QLineEdit(this); + name[i]->setProperty("index", i); + name[i]->setMaxLength(10); + QRegExp rx(CHAR_FOR_NAMES_REGEX); + name[i]->setValidator(new QRegExpValidator(rx, this)); + connect(name[i], SIGNAL(editingFinished()), this, SLOT(nameEdited())); + tableLayout->addWidget(i, 5, name[i]); // The switch fswtchSwtch[i] = new QComboBox(this); @@ -205,6 +215,8 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchEnable[i]->setFixedWidth(200); repeatLayout->addWidget(fswtchEnable[i], i + 1); connect(fswtchEnable[i], SIGNAL(stateChanged(int)), this, SLOT(customFunctionEdited())); + + } disableMouseScrolling(); @@ -330,25 +342,44 @@ void CustomFunctionsPanel::functionEdited() } } +void CustomFunctionsPanel::nameEdited() +{ + QLineEdit *le = qobject_cast(sender()); + int index = le->property("index").toInt(); + CustomFunctionData & cfn = functions[index]; + if (cfn.custName != le->text()) { + strcpy(cfn.custName, le->text().toLatin1()); + + emit modified(); + } +} + void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) { CustomFunctionData & cfn = functions[i]; AssignFunc func = (AssignFunc)fswtchFunc[i]->currentData().toInt(); + + unsigned int widgetsMask = 0; if (modified) { + cfn.swtch = RawSwitch(fswtchSwtch[i]->currentData().toInt()); cfn.func = func; cfn.enabled = fswtchEnable[i]->isChecked(); + } else { - fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(cfn.swtch.toValue())); - fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(cfn.func)); + name[i]->setText(cfn.custName); + fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(cfn.swtch.toValue())); + fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(cfn.func)); } if (!cfn.isEmpty()) { widgetsMask |= CUSTOM_FUNCTION_SHOW_FUNC; + name[i]->setText(cfn.custName); + if (func >= FuncOverrideCH1 && func <= FuncOverrideCH32) { if (model) { int channelsMax = model->getChannelsMax(true); @@ -356,8 +387,11 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) fswtchParam[i]->setSingleStep(1); fswtchParam[i]->setMinimum(-channelsMax); fswtchParam[i]->setMaximum(channelsMax); + name[i]->setText(cfn.custName); + if (modified) { cfn.param = fswtchParam[i]->value(); + strcpy(cfn.custName, name[i]->text().toLatin1()); } fswtchParam[i]->setValue(cfn.param); widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM | CUSTOM_FUNCTION_ENABLE; diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index 87775246d42..78b3bdc2c4f 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -46,6 +46,7 @@ class CustomFunctionsPanel : public GenericPanel private slots: void customFunctionEdited(); + void nameEdited(); void functionEdited(); void onCustomContextMenuRequested(QPoint pos); void refreshCustomFunction(int index, bool modified=false); @@ -92,6 +93,7 @@ class CustomFunctionsPanel : public GenericPanel QSet tracksSet; QSet scriptsSet; int mediaPlayerCurrent; + QLineEdit *name[CPN_MAX_SPECIAL_FUNCTIONS]; QComboBox * fswtchSwtch[CPN_MAX_SPECIAL_FUNCTIONS]; QComboBox * fswtchFunc[CPN_MAX_SPECIAL_FUNCTIONS]; QCheckBox * fswtchParamGV[CPN_MAX_SPECIAL_FUNCTIONS]; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index c61dde7400e..04086b2171a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -1041,6 +1041,12 @@ bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, if (!w_swtchSrc_unquoted(&_ls_node_v2, ls->v2, wf, opaque)) return false; break; + case LS_FAMILY_SAFE: + if (!w_swtchSrc_unquoted(&_ls_node_v1, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + if (!w_swtchSrc_unquoted(&_ls_node_v2, ls->v2, wf, opaque)) return false; + break; + case LS_FAMILY_EDGE: if (!w_swtchSrc_unquoted(&_ls_node_v1, ls->v1, wf, opaque)) return false; if (!wf(opaque,",",1)) return false; diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 81991d36ff1..6bd7ad9046b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -1578,6 +1578,14 @@ static void r_logicSw(void* user, uint8_t* data, uint32_t bitoffs, ls->v2 = r_swtchSrc(nullptr, val, val_len); break; + case LS_FAMILY_SAFE: + 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; @@ -1645,6 +1653,12 @@ static bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, if (!w_swtchSrc_unquoted(&_ls_node_v2, ls->v2, wf, opaque)) return false; break; + case LS_FAMILY_SAFE: + if (!w_swtchSrc_unquoted(&_ls_node_v1, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + if (!w_swtchSrc_unquoted(&_ls_node_v2, ls->v2, wf, opaque)) return false; + break; + case LS_FAMILY_EDGE: if (!w_swtchSrc_unquoted(&_ls_node_v1, ls->v1, wf, opaque)) return false; if (!wf(opaque,",",1)) return false; From c60f703a5c6a4bb569ac4b9048effc6b62dc20d6 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 2 Oct 2022 13:00:58 +1100 Subject: [PATCH 055/122] logic sw & custom fn: friendly name copy & paste --- companion/src/modeledit/customfunctions.cpp | 1 + companion/src/modeledit/logicalswitches.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 3940e27a644..3b387e3573c 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -764,6 +764,7 @@ void CustomFunctionsPanel::swapData(int idx1, int idx2) void CustomFunctionsPanel::resetCBsAndRefresh(int idx) { lock = true; + name[idx]->clear(); fswtchSwtch[idx]->setCurrentIndex(fswtchSwtch[idx]->findData(functions[idx].swtch.toValue())); fswtchFunc[idx]->setCurrentIndex(fswtchFunc[idx]->findData(functions[idx].func)); fswtchGVmode[idx]->setCurrentIndex(functions[idx].adjustMode); diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index e5c84606d79..578827b98a0 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -627,6 +627,7 @@ void LogicalSwitchesPanel::cmClear(bool prompt) model->logicalSw[selectedIndex].clear(); model->updateAllReferences(ModelData::REF_UPD_TYPE_LOGICAL_SWITCH, ModelData::REF_UPD_ACT_CLEAR, selectedIndex); + name[selectedIndex]->clear(); updateLine(selectedIndex); updateItemModels(); emit modified(); @@ -639,6 +640,7 @@ void LogicalSwitchesPanel::cmClearAll() for (int i = 0; i < lsCapability; i++) { model->logicalSw[i].clear(); + name[i]->clear(); model->updateAllReferences(ModelData::REF_UPD_TYPE_LOGICAL_SWITCH, ModelData::REF_UPD_ACT_CLEAR, i); } update(); From b2060521b20031b3058befc71a96e0ef9046b4d1 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 1 Oct 2022 12:22:32 +0200 Subject: [PATCH 056/122] fix: auto-switch timeout raised to 1s (#2433) Fixes #2418 --- radio/src/switches.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 420df20e9ae..176767a8474 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -689,7 +689,7 @@ swsrc_t getMovedSwitch() } } - if ((tmr10ms_t)(get_tmr10ms() - s_move_last_time) > 10) + if ((tmr10ms_t)(get_tmr10ms() - s_move_last_time) > 100) result = 0; s_move_last_time = get_tmr10ms(); From 074ed581ce91df527776a6b4f3ad57c586472848 Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Sat, 1 Oct 2022 19:30:33 +1000 Subject: [PATCH 057/122] fix: "Show Channel Monitor" btn only on touch only radios Resurrecting evil PCBNV14 define as @raphaelcoeffic said he'd quit if he had to keep scrolling past the "show channel monitor" button --- radio/src/gui/colorlcd/menu_model.cpp | 6 +++++- radio/src/gui/colorlcd/menu_model.h | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/menu_model.cpp b/radio/src/gui/colorlcd/menu_model.cpp index e76f42ad90f..a2f255027f4 100644 --- a/radio/src/gui/colorlcd/menu_model.cpp +++ b/radio/src/gui/colorlcd/menu_model.cpp @@ -61,7 +61,9 @@ ModelMenu::ModelMenu(): #endif addTab(new ModelTelemetryPage()); +#if defined(PCBNV14) || defined(PCBPL18) addGoToMonitorsButton(); +#endif } void ModelMenu::onEvent(event_t event) @@ -76,6 +78,7 @@ void ModelMenu::onEvent(event_t event) #endif } +#if defined(PCBNV14) || defined(PCBPL18) void ModelMenu::addGoToMonitorsButton() { OpenTxTheme::instance()->createTextButton( @@ -84,4 +87,5 @@ void ModelMenu::addGoToMonitorsButton() pushEvent(EVT_KEY_FIRST(KEY_MODEL)); return 0; }); -} \ No newline at end of file +} +#endif diff --git a/radio/src/gui/colorlcd/menu_model.h b/radio/src/gui/colorlcd/menu_model.h index 57e85cfe0dc..c0b59eaa9dd 100644 --- a/radio/src/gui/colorlcd/menu_model.h +++ b/radio/src/gui/colorlcd/menu_model.h @@ -35,8 +35,10 @@ class ModelMenu : public TabsGroup std::string getName() const override { return "ModelMenu"; } #endif +#if defined(PCBNV14) || defined(PCBPL18) protected: void addGoToMonitorsButton(void); +#endif }; #endif // _MENU_MODEL_H_ From 0003f2a7c263ab671f6ad7fa2e15128704bb102b Mon Sep 17 00:00:00 2001 From: Malte Langermann <54738901+gagarinlg@users.noreply.github.com> Date: Sat, 1 Oct 2022 13:50:04 +0200 Subject: [PATCH 058/122] feat(color): Bigger menu toolbar icons, outlines around menu (#2435) * chore: add EdgeTX source symbols to 24pt fonts to allow for larger symbols in menu filter toolbars * chore: Bump `libopenui` --- radio/src/fonts/lvgl/lv_font_noto_cn_24.c | 1307 ++++++++++++-------- radio/src/fonts/lvgl/lv_font_noto_tw_24.c | 1337 ++++++++++++--------- radio/src/fonts/lvgl/lv_font_roboto_24.c | 439 +++++-- radio/src/fonts/lvgl/make_fonts.sh | 14 +- radio/src/thirdparty/libopenui | 2 +- 5 files changed, 1953 insertions(+), 1146 deletions(-) diff --git a/radio/src/fonts/lvgl/lv_font_noto_cn_24.c b/radio/src/fonts/lvgl/lv_font_noto_cn_24.c index 6cf7a049a0e..533a241c778 100644 --- a/radio/src/fonts/lvgl/lv_font_noto_cn_24.c +++ b/radio/src/fonts/lvgl/lv_font_noto_cn_24.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 24 px * Bpp: 4 - * Opts: --no-prefilter --bpp 4 --size 24 --font ../Noto/NotoSansCJKsc-Regular.otf -r 0x20-0x7F,0xB0,0x3001,0x4e00,0x4e0a,0x4e0b,0x4e0d,0x4e0e,0x4e2a,0x4e2d,0x4e32,0x4e3a,0x4e3b,0x4e49,0x4e4b,0x4e50,0x4e58,0x4e8c,0x4e8e,0x4eab,0x4eae,0x4ec5,0x4ecb,0x4ece,0x4ee5,0x4eea,0x4ef0,0x4ef6,0x4efb,0x4efd,0x4f20,0x4f4d,0x4f4e,0x4f4f,0x4f53,0x4f5c,0x4f7f,0x4f8b,0x4f9b,0x4fa7,0x4fdd,0x4fe1,0x4fee,0x4fef,0x500d,0x5012,0x503c,0x504f,0x505c,0x507f,0x50a8,0x50cf,0x5141,0x5145,0x5149,0x5165,0x5168,0x516c,0x5173,0x5176,0x5177,0x517c,0x5185,0x518c,0x5199,0x51b2,0x51c6,0x51cf,0x51fa,0x51fb,0x5206,0x5217,0x521b,0x521d,0x5220,0x522b,0x5230,0x5236,0x5237,0x524d,0x529f,0x52a0,0x52a8,0x5305,0x5316,0x533a,0x5347,0x534f,0x5355,0x5361,0x5382,0x538b,0x539f,0x53c2,0x53ca,0x53cc,0x53cd,0x53d1,0x53d6,0x53d8,0x53e0,0x53e3,0x53ea,0x53ef,0x53f7,0x540c,0x540d,0x540e,0x5411,0x5417,0x5426,0x542b,0x542f,0x544a,0x547d,0x548c,0x54cd,0x5668,0x56de,0x56f4,0x56fa,0x56fd,0x56fe,0x5728,0x5730,0x5740,0x5747,0x5757,0x578b,0x57fa,0x586b,0x589e,0x58f0,0x5907,0x590d,0x5916,0x591a,0x5927,0x5929,0x592a,0x5931,0x5939,0x597d,0x59cb,0x5b50,0x5b58,0x5b66,0x5b83,0x5b89,0x5b8c,0x5b9a,0x5bb9,0x5bbd,0x5bf8,0x5bf9,0x5bfc,0x5c04,0x5c06,0x5c0f,0x5c3a,0x5c40,0x5c45,0x5c4f,0x5c55,0x5de5,0x5dee,0x5df2,0x5e03,0x5e26,0x5e27,0x5e38,0x5e45,0x5e55,0x5e73,0x5e74,0x5e8f,0x5e94,0x5ea6,0x5ef6,0x5efa,0x5f00,0x5f0f,0x5f15,0x5f31,0x5f39,0x5f3a,0x5f53,0x5f55,0x5f62,0x5f71,0x5f84,0x5f85,0x5f88,0x5faa,0x5fae,0x5fd7,0x5ffd,0x6001,0x6020,0x6025,0x603b,0x6062,0x606f,0x60c5,0x610f,0x611f,0x6162,0x620f,0x6210,0x6216,0x622a,0x6237,0x6240,0x6247,0x624b,0x6253,0x6267,0x6269,0x626b,0x626c,0x627e,0x62a4,0x62a5,0x62c9,0x62d2,0x62df,0x62e9,0x62fe,0x6301,0x6307,0x6309,0x632f,0x6362,0x636e,0x63a5,0x63a7,0x63cf,0x63d0,0x63d2,0x6447,0x6478,0x64ad,0x64cd,0x64e6,0x652f,0x6536,0x6539,0x653e,0x6545,0x6548,0x6559,0x6570,0x6574,0x6587,0x659c,0x65ad,0x65b0,0x65b9,0x65cb,0x65e0,0x65e5,0x65f6,0x660e,0x6620,0x662f,0x663e,0x666f,0x6682,0x66f2,0x66f4,0x66ff,0x6700,0x6708,0x6709,0x671f,0x672a,0x672c,0x673a,0x6746,0x675f,0x6761,0x6765,0x677f,0x6781,0x679c,0x67c4,0x67e5,0x6807,0x680f,0x6821,0x6837,0x683c,0x68c0,0x6a21,0x6a2a,0x6b27,0x6b62,0x6b63,0x6b64,0x6b65,0x6b7b,0x6b8a,0x6bb5,0x6bd4,0x6c60,0x6ca1,0x6cb9,0x6cbf,0x6cd5,0x6ce2,0x6ce8,0x6d32,0x6d41,0x6d4b,0x6d88,0x6df7,0x6dfb,0x6e05,0x6e10,0x6e29,0x6e38,0x6e90,0x6ed1,0x6eda,0x6ede,0x6ee1,0x6ee4,0x70b9,0x70ed,0x7247,0x7248,0x7259,0x7279,0x72b6,0x7387,0x73af,0x73b0,0x751f,0x7528,0x7535,0x754c,0x7559,0x7565,0x767d,0x7684,0x76d1,0x76d6,0x76d8,0x76ee,0x76f4,0x76f8,0x770b,0x771f,0x77e5,0x7801,0x786c,0x786e,0x793a,0x7981,0x79bb,0x79d2,0x79f0,0x79fb,0x7a0b,0x7a7a,0x7a97,0x7ade,0x7aef,0x7b2c,0x7b49,0x7b7e,0x7b97,0x7c7b,0x7c98,0x7cbe,0x7cfb,0x7d27,0x7ea2,0x7ea7,0x7eac,0x7ebf,0x7ec3,0x7ec6,0x7ec8,0x7ecf,0x7ed3,0x7edd,0x7edf,0x7eed,0x7eff,0x7f16,0x7f29,0x7f6e,0x7f8e,0x8005,0x8017,0x8054,0x80cc,0x80fd,0x8109,0x811a,0x81ea,0x81f3,0x8235,0x8272,0x8282,0x82f1,0x8303,0x84dd,0x8702,0x87ba,0x884c,0x8865,0x8868,0x8870,0x88ab,0x88c5,0x8981,0x8986,0x89c6,0x89d2,0x89e3,0x89e6,0x8a00,0x8b66,0x8ba1,0x8ba4,0x8bae,0x8bb0,0x8bb8,0x8bbe,0x8bbf,0x8bc1,0x8bc6,0x8bd5,0x8be2,0x8be6,0x8bed,0x8bef,0x8bf4,0x8bf7,0x8c03,0x8c31,0x8d25,0x8d34,0x8d77,0x8d85,0x8db3,0x8ddd,0x8def,0x8df3,0x8f6c,0x8f6e,0x8f7d,0x8f83,0x8f91,0x8f93,0x8fb9,0x8fc7,0x8fd0,0x8fdb,0x8fde,0x8fdf,0x8ff0,0x9000,0x9009,0x901a,0x901f,0x903b,0x9053,0x90e8,0x91c7,0x91cd,0x91cf,0x9274,0x9488,0x949f,0x94ae,0x9501,0x9519,0x952e,0x955c,0x957f,0x95e8,0x95ed,0x95ee,0x95f2,0x95f4,0x9634,0x9640,0x9644,0x9650,0x9664,0x968f,0x969c,0x9700,0x9707,0x9759,0x975e,0x9762,0x97f3,0x9875,0x9876,0x9879,0x987a,0x9884,0x9891,0x9898,0x989c,0x98de,0x9a71,0x9a8c,0x9ad8,0x9e23,0x9ed8 --format lvgl -o lv_font_noto_cn_24.c --force-fast-kern-format + * Opts: --no-prefilter --bpp 4 --size 24 --font ../Noto/NotoSansCJKsc-Regular.otf -r 0x20-0x7F,0xB0,0x3001,0x4e00,0x4e0a,0x4e0b,0x4e0d,0x4e0e,0x4e2a,0x4e2d,0x4e32,0x4e3a,0x4e3b,0x4e49,0x4e4b,0x4e50,0x4e58,0x4e8c,0x4e8e,0x4eab,0x4eae,0x4ec5,0x4ecb,0x4ece,0x4ee5,0x4eea,0x4ef0,0x4ef6,0x4efb,0x4efd,0x4f20,0x4f4d,0x4f4e,0x4f4f,0x4f53,0x4f5c,0x4f7f,0x4f8b,0x4f9b,0x4fa7,0x4fdd,0x4fe1,0x4fee,0x4fef,0x500d,0x5012,0x503c,0x504f,0x505c,0x507f,0x50a8,0x50cf,0x5141,0x5145,0x5149,0x5165,0x5168,0x516c,0x5173,0x5176,0x5177,0x517c,0x5185,0x518c,0x5199,0x51b2,0x51c6,0x51cf,0x51fa,0x51fb,0x5206,0x5217,0x521b,0x521d,0x5220,0x522b,0x5230,0x5236,0x5237,0x524d,0x529f,0x52a0,0x52a8,0x5305,0x5316,0x533a,0x5347,0x534f,0x5355,0x5361,0x5382,0x538b,0x539f,0x53c2,0x53ca,0x53cc,0x53cd,0x53d1,0x53d6,0x53d8,0x53e0,0x53e3,0x53ea,0x53ef,0x53f7,0x540c,0x540d,0x540e,0x5411,0x5417,0x5426,0x542b,0x542f,0x544a,0x547d,0x548c,0x54cd,0x5668,0x56de,0x56f4,0x56fa,0x56fd,0x56fe,0x5728,0x5730,0x5740,0x5747,0x5757,0x578b,0x57fa,0x586b,0x589e,0x58f0,0x5907,0x590d,0x5916,0x591a,0x5927,0x5929,0x592a,0x5931,0x5939,0x597d,0x59cb,0x5b50,0x5b58,0x5b66,0x5b83,0x5b89,0x5b8c,0x5b9a,0x5bb9,0x5bbd,0x5bf8,0x5bf9,0x5bfc,0x5c04,0x5c06,0x5c0f,0x5c3a,0x5c40,0x5c45,0x5c4f,0x5c55,0x5de5,0x5dee,0x5df2,0x5e03,0x5e26,0x5e27,0x5e38,0x5e45,0x5e55,0x5e73,0x5e74,0x5e8f,0x5e94,0x5ea6,0x5ef6,0x5efa,0x5f00,0x5f0f,0x5f15,0x5f31,0x5f39,0x5f3a,0x5f53,0x5f55,0x5f62,0x5f71,0x5f84,0x5f85,0x5f88,0x5faa,0x5fae,0x5fd7,0x5ffd,0x6001,0x6020,0x6025,0x603b,0x6062,0x606f,0x60c5,0x610f,0x611f,0x6162,0x620f,0x6210,0x6216,0x622a,0x6237,0x6240,0x6247,0x624b,0x6253,0x6267,0x6269,0x626b,0x626c,0x627e,0x62a4,0x62a5,0x62c9,0x62d2,0x62df,0x62e9,0x62fe,0x6301,0x6307,0x6309,0x632f,0x6362,0x636e,0x63a5,0x63a7,0x63cf,0x63d0,0x63d2,0x6447,0x6478,0x64ad,0x64cd,0x64e6,0x652f,0x6536,0x6539,0x653e,0x6545,0x6548,0x6559,0x6570,0x6574,0x6587,0x659c,0x65ad,0x65b0,0x65b9,0x65cb,0x65e0,0x65e5,0x65f6,0x660e,0x6620,0x662f,0x663e,0x666f,0x6682,0x66f2,0x66f4,0x66ff,0x6700,0x6708,0x6709,0x671f,0x672a,0x672c,0x673a,0x6746,0x675f,0x6761,0x6765,0x677f,0x6781,0x679c,0x67c4,0x67e5,0x6807,0x680f,0x6821,0x6837,0x683c,0x68c0,0x6a21,0x6a2a,0x6b27,0x6b62,0x6b63,0x6b64,0x6b65,0x6b7b,0x6b8a,0x6bb5,0x6bd4,0x6c60,0x6ca1,0x6cb9,0x6cbf,0x6cd5,0x6ce2,0x6ce8,0x6d32,0x6d41,0x6d4b,0x6d88,0x6df7,0x6dfb,0x6e05,0x6e10,0x6e29,0x6e38,0x6e90,0x6ed1,0x6eda,0x6ede,0x6ee1,0x6ee4,0x70b9,0x70ed,0x7247,0x7248,0x7259,0x7279,0x72b6,0x7387,0x73af,0x73b0,0x751f,0x7528,0x7535,0x754c,0x7559,0x7565,0x767d,0x7684,0x76d1,0x76d6,0x76d8,0x76ee,0x76f4,0x76f8,0x770b,0x771f,0x77e5,0x7801,0x786c,0x786e,0x793a,0x7981,0x79bb,0x79d2,0x79f0,0x79fb,0x7a0b,0x7a7a,0x7a97,0x7ade,0x7aef,0x7b2c,0x7b49,0x7b7e,0x7b97,0x7c7b,0x7c98,0x7cbe,0x7cfb,0x7d27,0x7ea2,0x7ea7,0x7eac,0x7ebf,0x7ec3,0x7ec6,0x7ec8,0x7ecf,0x7ed3,0x7edd,0x7edf,0x7eed,0x7eff,0x7f16,0x7f29,0x7f6e,0x7f8e,0x8005,0x8017,0x8054,0x80cc,0x80fd,0x8109,0x811a,0x81ea,0x81f3,0x8235,0x8272,0x8282,0x82f1,0x8303,0x84dd,0x8702,0x87ba,0x884c,0x8865,0x8868,0x8870,0x88ab,0x88c5,0x8981,0x8986,0x89c6,0x89d2,0x89e3,0x89e6,0x8a00,0x8b66,0x8ba1,0x8ba4,0x8bae,0x8bb0,0x8bb8,0x8bbe,0x8bbf,0x8bc1,0x8bc6,0x8bd5,0x8be2,0x8be6,0x8bed,0x8bef,0x8bf4,0x8bf7,0x8c03,0x8c31,0x8d25,0x8d34,0x8d77,0x8d85,0x8db3,0x8ddd,0x8def,0x8df3,0x8f6c,0x8f6e,0x8f7d,0x8f83,0x8f91,0x8f93,0x8fb9,0x8fc7,0x8fd0,0x8fdb,0x8fde,0x8fdf,0x8ff0,0x9000,0x9009,0x901a,0x901f,0x903b,0x9053,0x90e8,0x91c7,0x91cd,0x91cf,0x9274,0x9488,0x949f,0x94ae,0x9501,0x9519,0x952e,0x955c,0x957f,0x95e8,0x95ed,0x95ee,0x95f2,0x95f4,0x9634,0x9640,0x9644,0x9650,0x9664,0x968f,0x969c,0x9700,0x9707,0x9759,0x975e,0x9762,0x97f3,0x9875,0x9876,0x9879,0x987a,0x9884,0x9891,0x9898,0x989c,0x98de,0x9a71,0x9a8c,0x9ad8,0x9e23,0x9ed8 --font EdgeTX/extra.ttf -r 0x88-0x94 --format lvgl -o lv_font_noto_cn_24.c --force-fast-kern-format ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -1132,6 +1132,252 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf7, 0xfb, 0x9f, 0x40, 0x10, 0x80, 0x68, 0xde, 0x80, 0x0, + /* U+0088 "ˆ" */ + 0x0, 0xff, 0x1b, 0x0, 0x7f, 0xf2, 0x37, 0xc4, + 0x3, 0xff, 0x8c, 0xbf, 0xe9, 0x0, 0xff, 0xe3, + 0x6d, 0xbf, 0x88, 0x7, 0xff, 0x11, 0x7c, 0xc3, + 0xa4, 0x3, 0xff, 0x89, 0xb6, 0x0, 0x6f, 0x20, + 0xf, 0xfe, 0x12, 0xf9, 0x80, 0x5d, 0x40, 0x1f, + 0xfc, 0x2d, 0xb0, 0xc, 0xde, 0x40, 0x1f, 0xfc, + 0x5, 0xf3, 0x0, 0xed, 0xa0, 0xf, 0xfe, 0x6, + 0xd8, 0x7, 0x97, 0xcc, 0x3, 0xfc, 0xde, 0x60, + 0x1f, 0x6d, 0x80, 0x7f, 0xb6, 0xc0, 0x3f, 0x2f, + 0x98, 0x7, 0xe6, 0xf3, 0x0, 0xfe, 0xdc, 0x0, + 0xfd, 0xb6, 0x1, 0xfe, 0x5f, 0x40, 0xf, 0x37, + 0x98, 0x7, 0xfd, 0x98, 0x0, 0xf6, 0xd8, 0x7, + 0xff, 0x1, 0x3d, 0x40, 0x33, 0x79, 0x80, 0x7f, + 0xf0, 0x73, 0x40, 0x37, 0x58, 0x7, 0xff, 0x9, + 0x3d, 0x40, 0xd, 0xf2, 0xef, 0xff, 0xc3, 0xfd, + 0x0, 0x6f, 0xff, 0xf7, 0x77, 0xf9, 0x40, + + /* U+0089 "‰" */ + 0x0, 0xff, 0xe0, 0x1d, 0x6d, 0xa8, 0x7, 0xff, + 0x5, 0x3f, 0x22, 0xbe, 0x0, 0x3f, 0xf8, 0x1d, + 0x40, 0x12, 0xf9, 0x0, 0x79, 0x6b, 0x71, 0xbc, + 0xc0, 0x37, 0x38, 0x6, 0x3d, 0xfb, 0x74, 0xbf, + 0x20, 0xd, 0xae, 0x1, 0x2f, 0xd0, 0x80, 0x5b, + 0xf0, 0x1, 0x1f, 0xa0, 0x0, 0xfe, 0x0, 0x30, + 0xfd, 0x7d, 0x2e, 0x7d, 0x0, 0x5b, 0x40, 0x1c, + 0xde, 0xb, 0xbf, 0xf1, 0x0, 0x1b, 0xc4, 0x3, + 0xaa, 0x80, 0x37, 0xea, 0xda, 0x0, 0xba, 0x0, + 0xf7, 0xb1, 0xf6, 0x90, 0x17, 0x98, 0x7a, 0x80, + 0x71, 0xfc, 0xfd, 0x0, 0x6d, 0x60, 0xf4, 0x0, + 0xe8, 0xff, 0x30, 0x7, 0x5c, 0x7, 0xa0, 0x7, + 0x6e, 0x8c, 0x3, 0xd7, 0x1, 0xec, 0x1, 0x86, + 0xc4, 0x3, 0xed, 0x60, 0xba, 0x0, 0xff, 0xe0, + 0x97, 0x98, 0x2f, 0x90, 0x7, 0xff, 0x2, 0x74, + 0x2, 0xdb, 0x0, 0xff, 0x8f, 0xd4, 0x2, 0x2f, + 0x90, 0xf, 0xe3, 0xe9, 0x0, 0xe4, 0xfb, 0x20, + 0xf, 0x3f, 0xd0, 0x7, 0xc5, 0x7f, 0x90, 0xcf, + 0x5d, 0xee, 0x1, 0xfe, 0x38, 0xbd, 0xca, 0x61, + 0x0, 0xe0, + + /* U+008A "Š" */ + 0x0, 0xe1, 0x1f, 0xc0, 0x1f, 0xf4, 0x7f, 0xfc, + 0x60, 0x1f, 0x84, 0x41, 0x7f, 0xfc, 0xe0, 0x6c, + 0x1, 0xc5, 0xda, 0x22, 0xef, 0xfb, 0x0, 0xbb, + 0xd8, 0x3, 0x17, 0x7d, 0x1, 0xff, 0xc4, 0xf, + 0xfc, 0x22, 0x0, 0x3c, 0xad, 0x88, 0x1, 0xbd, + 0xc0, 0x26, 0x8d, 0xd0, 0x3, 0xbf, 0xc2, 0x1, + 0x9c, 0x3, 0xaf, 0xfc, 0x60, 0xb9, 0x40, 0x1f, + 0xf1, 0xeb, 0x9c, 0xf6, 0x88, 0x7, 0xfc, 0x3f, + 0xeb, 0xb7, 0xf8, 0x40, 0x3f, 0xf8, 0x1d, 0xb2, + 0x48, 0xa0, 0x1f, 0xfc, 0x15, 0x30, 0x2a, 0xf7, + 0x0, 0xff, 0xe0, 0x7f, 0xb0, 0xbf, 0xd6, 0x1, + 0xff, 0x15, 0xfc, 0x3, 0xa4, 0xb0, 0x7, 0xf0, + 0xf4, 0x88, 0x5, 0x9f, 0xe2, 0x0, 0xf8, 0x5f, + 0xfd, 0x0, 0x14, 0xfb, 0xec, 0x80, 0x72, 0x75, + 0xae, 0x88, 0x6, 0x26, 0xff, 0x46, 0xbd, 0xfb, + 0xff, 0x94, 0x3, 0xe6, 0xf8, 0x9f, 0x9c, 0xf7, + 0x9b, 0x10, 0xf, 0xc2, 0x13, 0xed, 0x1c, 0xc0, + 0x1f, 0xfc, 0xd0, + + /* U+008B "‹" */ + 0x0, 0xff, 0xe5, 0x9f, 0x48, 0x0, 0x91, 0x6, + 0x1, 0xfe, 0x2e, 0xcf, 0xf6, 0xff, 0xf5, 0x98, + 0x7, 0x8b, 0xb0, 0x17, 0xfc, 0x82, 0x2, 0xb7, + 0xf2, 0x1, 0x87, 0x70, 0x2, 0x3e, 0xb0, 0xe, + 0x4f, 0xb0, 0x8, 0x7b, 0x44, 0x2, 0x2e, 0xb0, + 0xe, 0x2f, 0x80, 0x8, 0xbf, 0xc2, 0x1, 0x17, + 0x58, 0x7, 0x2f, 0x90, 0x5, 0xfe, 0xd2, 0x0, + 0x1f, 0xc8, 0x7, 0xb6, 0x40, 0x9, 0xe5, 0x9c, + 0x44, 0xea, 0x0, 0xf9, 0xf8, 0x0, 0xdc, 0x0, + 0xce, 0xe5, 0x80, 0x7e, 0x4f, 0x0, 0x3e, 0x0, + 0x57, 0x80, 0x1f, 0xc7, 0xe2, 0xd, 0xa0, 0x1f, + 0xfc, 0x24, 0xf0, 0x2, 0x78, 0x80, 0x7f, 0xf0, + 0x5f, 0x80, 0x2f, 0x60, 0xf, 0xfe, 0xe, 0x48, + 0x5, 0x1c, 0x1, 0xff, 0xc0, 0x5f, 0x20, 0xd, + 0xb6, 0x1, 0xfe, 0x2f, 0x80, 0xe, 0x2e, 0xb1, + 0x0, 0xf9, 0x3e, 0x80, 0x3e, 0x2d, 0xf8, 0x31, + 0x2, 0x5b, 0xf8, 0x0, 0xff, 0x36, 0xff, 0xf5, + 0x18, 0x7, 0xff, 0x4, 0x4d, 0x8, 0x3, 0xf0, + + /* U+008C "Œ" */ + 0x0, 0xf3, 0xff, 0xfb, 0xbb, 0x18, 0x7, 0xb6, + 0x95, 0x7e, 0xbe, 0x0, 0xf1, 0xf9, 0x80, 0x7d, + 0xb0, 0x1, 0xe9, 0xc0, 0xf, 0x8f, 0xc8, 0x3, + 0xde, 0xc0, 0x1f, 0x4e, 0x0, 0x79, 0x7c, 0x40, + 0x3e, 0xf6, 0x0, 0xf5, 0xd0, 0x7, 0xcb, 0xe0, + 0x1f, 0x66, 0x0, 0x3c, 0xbf, 0x20, 0x1f, 0x3f, + 0xc0, 0x6, 0x9f, 0x80, 0xf, 0xe, 0x7f, 0xc0, + 0x1, 0xff, 0x20, 0x7, 0x87, 0x74, 0x43, 0xd0, + 0x15, 0xfe, 0x10, 0xf, 0x57, 0x8, 0x2, 0x38, + 0x7d, 0xb6, 0xc0, 0x38, 0x7d, 0x40, 0x2d, 0x86, + 0xe0, 0x4f, 0x20, 0xc, 0xde, 0x1, 0x1f, 0x96, + 0x48, 0x3, 0xd8, 0x3, 0x46, 0x0, 0x53, 0x85, + 0xe6, 0x0, 0xd7, 0x0, 0xcf, 0xa0, 0x17, 0xb1, + 0xd0, 0x5, 0xcc, 0x1, 0x93, 0xc8, 0x6, 0x4, + 0x3, 0xf, 0xa0, 0x7, 0x75, 0x0, 0x7e, 0x9e, + 0x0, 0xf2, 0xfb, 0x80, 0x79, 0xfd, 0x40, 0x3e, + 0x7f, 0xc5, 0x21, 0x4a, 0xf7, 0x0, 0xfe, 0x3b, + 0xff, 0xd8, 0x80, 0x1f, 0xfc, 0x1, 0x33, 0x8, + 0x7, 0xf0, + + /* U+008D "" */ + 0x0, 0xd7, 0xff, 0xa8, 0x3, 0xf6, 0xa0, 0x89, + 0x6c, 0x3, 0xf6, 0x90, 0x1, 0x2c, 0x3, 0xf6, + 0x90, 0x1, 0x2c, 0x3, 0xf6, 0x90, 0x1, 0x2c, + 0x3, 0x5e, 0xeb, 0xbf, 0xfd, 0xdf, 0xc3, 0xc8, + 0x45, 0x19, 0xe2, 0x11, 0x69, 0x70, 0x80, 0x7f, + 0xb4, 0xb8, 0x80, 0x2, 0x3e, 0x0, 0x69, 0x71, + 0x3, 0xff, 0xf8, 0x1, 0xa5, 0xc4, 0x1, 0xfe, + 0xd3, 0xe2, 0x0, 0xff, 0x69, 0xe9, 0x0, 0x4, + 0x7c, 0x0, 0xd3, 0xd2, 0x7, 0xff, 0xf0, 0x3, + 0x4f, 0x48, 0x3, 0xfd, 0xa7, 0xa6, 0x1, 0xfe, + 0xd3, 0xd4, 0x12, 0x35, 0x5c, 0x86, 0x6d, 0x3b, + 0xee, 0xbf, 0xfd, 0x99, 0x8, 0x6, 0xe2, 0x0, + 0xbc, 0x3, 0xf7, 0x10, 0x5, 0xe0, 0x1f, 0xb8, + 0x80, 0x2f, 0x0, 0xfd, 0xc6, 0x22, 0x2f, 0x0, + 0xfd, 0x9d, 0xdb, 0x40, 0x30, + + /* U+008E "Ž" */ + 0x0, 0xff, 0x1b, 0x3b, 0x20, 0x80, 0x7f, 0xc, + 0xff, 0xfd, 0x41, 0x44, 0x1, 0x8f, 0xbf, 0xff, + 0x83, 0xbd, 0xc0, 0x5, 0xff, 0xa1, 0x8, 0xda, + 0x98, 0x3a, 0xff, 0xf, 0x7f, 0xd6, 0x20, 0x1f, + 0xb9, 0x8a, 0xff, 0xeb, 0x0, 0xff, 0x73, 0x0, + 0x23, 0xfc, 0xa0, 0x1f, 0xee, 0x60, 0x8, 0x6f, + 0xe4, 0x3, 0xfb, 0x98, 0x3, 0x97, 0xb8, 0x80, + 0x1f, 0x73, 0x0, 0x79, 0x3f, 0x44, 0x3, 0xdc, + 0xc0, 0x1c, 0xff, 0x60, 0x1f, 0xb9, 0x80, 0x35, + 0x7b, 0x80, 0x7f, 0x73, 0x0, 0x13, 0xfc, 0x60, + 0x1f, 0xee, 0x60, 0x5f, 0xf8, 0x3, 0xfe, 0xe6, + 0x9f, 0xfd, 0x40, 0x1f, 0xee, 0xfe, 0x40, 0xef, + 0xf5, 0x0, 0x7f, 0x76, 0x10, 0x1, 0x3f, 0xee, + 0x73, 0x12, 0x59, 0x60, 0x80, 0xe, 0x4f, 0xff, + 0xf0, 0x7, 0xe1, 0x9f, 0xff, 0xa8, 0x3, 0xfe, + 0x47, 0x87, 0x51, 0x0, 0x0, + + /* U+008F "" */ + 0x18, 0x8a, 0xae, 0xd3, 0x11, 0xfc, 0xb, 0xf7, + 0x6f, 0xfd, 0x77, 0xfb, 0xd1, 0x78, 0x1, 0xff, + 0x38, 0x7, 0xef, 0x45, 0xe0, 0x7, 0xfc, 0xe0, + 0x11, 0x56, 0xf7, 0x3d, 0x17, 0x80, 0x2, 0x44, + 0x0, 0xc, 0xff, 0xf9, 0x17, 0x80, 0xa, 0xee, + 0x22, 0x77, 0xff, 0xc8, 0xbc, 0x0, 0xef, 0xf4, + 0x80, 0xc7, 0xff, 0x91, 0x78, 0x1, 0xdf, 0xe9, + 0x0, 0x86, 0x33, 0x17, 0xe8, 0xbc, 0x0, 0xdf, + 0xf3, 0x80, 0x7e, 0xf4, 0x5e, 0x0, 0xff, 0xe1, + 0x7a, 0x2f, 0x0, 0x7f, 0xf0, 0xbd, 0x17, 0x80, + 0x1b, 0xfe, 0x80, 0xf, 0xde, 0x8b, 0xc0, 0xe, + 0xff, 0x48, 0x7, 0xef, 0x45, 0xe0, 0x7, 0x7f, + 0xa4, 0x3, 0xf7, 0xa2, 0xf0, 0x1, 0x5d, 0xc4, + 0x1, 0xfb, 0xd1, 0x78, 0x0, 0x26, 0x60, 0xf, + 0xef, 0x45, 0xe0, 0x6, 0xff, 0xa4, 0x3, 0xf7, + 0xa2, 0xf0, 0x3, 0x7f, 0xd4, 0x1, 0xfb, 0xd1, + 0x78, 0x1, 0xbf, 0xe9, 0x0, 0xfd, 0xe8, 0xbf, + 0xff, 0xfc, 0x43, 0x4, 0x4f, 0xfe, 0x20, 0x0, + + /* U+0090 "" */ + 0x0, 0xf9, 0x6f, 0x24, 0x80, 0x3f, 0xe2, 0xaf, + 0xff, 0x6b, 0x0, 0x7e, 0x5f, 0xd5, 0x7e, 0x4f, + 0x39, 0xfb, 0x10, 0xe, 0x5f, 0x90, 0x3, 0x72, + 0x78, 0x0, 0xb7, 0x40, 0x18, 0xbe, 0x0, 0x26, + 0xe4, 0xf0, 0x8, 0x7a, 0x80, 0x2b, 0xc0, 0xc, + 0xdc, 0x9e, 0x1, 0x93, 0xcc, 0x7, 0xd0, 0x3, + 0x37, 0x47, 0x80, 0x76, 0x48, 0x2f, 0x80, 0x72, + 0x7f, 0xb4, 0x3, 0x9f, 0x81, 0xf4, 0x3, 0x10, + 0x80, 0x52, 0xc0, 0x12, 0x78, 0x46, 0x0, 0x49, + 0xfa, 0x20, 0xff, 0xeb, 0x10, 0x4f, 0x6, 0xe0, + 0x3, 0x7e, 0xde, 0x7, 0xe9, 0xef, 0x2a, 0xbc, + 0xf, 0xca, 0x3e, 0x8b, 0x2c, 0x1b, 0xf0, 0xa3, + 0xfd, 0xa0, 0xe, 0xff, 0x41, 0xf4, 0x80, 0x45, + 0x9e, 0xcf, 0xf6, 0x0, 0x8f, 0xe5, 0xf7, 0x0, + 0xf3, 0xff, 0xc0, 0x1b, 0xfe, 0x50, 0xf, 0xd7, + 0xea, 0x1, 0xdf, 0xe6, 0x0, 0xf1, 0x5f, 0xa8, + 0x7, 0xd1, 0xfd, 0x2e, 0xd1, 0x7f, 0xa6, 0x1, + 0xfc, 0x2f, 0x7b, 0xdb, 0x4a, 0x1, 0xe0, + + /* U+0091 "‘" */ + 0x0, 0xe3, 0x53, 0x0, 0xff, 0xe1, 0xb7, 0x7f, + 0xdc, 0x80, 0x1f, 0xfc, 0x7, 0xff, 0xf9, 0x40, + 0x3f, 0xc5, 0xff, 0xfb, 0x84, 0x3, 0xfa, 0x3f, + 0xff, 0x94, 0x0, 0x46, 0x20, 0x1a, 0xbf, 0xff, + 0xa0, 0x6f, 0xfe, 0xa1, 0x0, 0x57, 0xff, 0xf3, + 0xe7, 0xff, 0x58, 0x1, 0xbf, 0xff, 0xa3, 0xff, + 0xe3, 0x0, 0x77, 0xff, 0xd6, 0xff, 0xff, 0x30, + 0x0, 0xff, 0xfd, 0xa2, 0x9f, 0xff, 0x20, 0x4, + 0x5b, 0xff, 0xd8, 0xbd, 0xff, 0xdc, 0x1, 0xa3, + 0xfd, 0x4f, 0x5f, 0xff, 0xc6, 0x1, 0x37, 0xe0, + 0x81, 0xf7, 0xff, 0xe9, 0x0, 0xdf, 0xc2, 0x3, + 0xdf, 0xff, 0xe3, 0x0, 0x37, 0xb8, 0x3, 0x3f, + 0xff, 0xeb, 0x0, 0x57, 0x90, 0x2f, 0xff, 0xff, + 0x4, 0x1, 0x9e, 0x0, 0xcf, 0xff, 0xfe, 0x9, + 0x86, 0xf0, 0x9f, 0xff, 0xff, 0x9, 0x43, 0x3f, + 0xff, 0xf8, 0xa8, 0xd, 0x33, 0x94, 0x8b, 0xff, + 0x80, 0x0, + + /* U+0092 "’" */ + 0x0, 0xff, 0xe6, 0x17, 0x28, 0x7, 0xff, 0xc, + 0x73, 0xd8, 0x3, 0xff, 0x89, 0x9e, 0xe0, 0x1f, + 0xfc, 0x4b, 0xf8, 0x0, 0xff, 0xe2, 0x5f, 0xc0, + 0x7, 0x2a, 0xf2, 0x26, 0x33, 0x6f, 0xc8, 0x6, + 0xdf, 0xff, 0xfe, 0xd, 0x0, 0x5b, 0xff, 0xff, + 0xc2, 0xb0, 0x2, 0x2a, 0xf9, 0x9b, 0xf8, 0xc0, + 0xf, 0x55, 0xd3, 0x3f, 0xe4, 0x1, 0xcf, 0xff, + 0xfe, 0x13, 0x80, 0x59, 0xff, 0xff, 0xc1, 0x70, + 0xd, 0x7f, 0x20, 0x18, 0x46, 0x22, 0x84, 0x3, + 0xab, 0xe4, 0x3, 0xff, 0x89, 0x3f, 0x40, 0x1f, + 0xfc, 0x49, 0xfa, 0x0, 0xff, 0xe2, 0x47, 0xd8, + 0x7, 0xff, 0x11, 0xe0, 0x3, 0xe0, + + /* U+0093 "“" */ + 0x0, 0xf8, 0xd0, 0xc4, 0x3, 0xff, 0x87, 0x3f, + 0xf6, 0x41, 0x0, 0x7f, 0xf0, 0x44, 0x96, 0x7b, + 0xec, 0xc0, 0x3f, 0xca, 0xea, 0x40, 0x5, 0xcf, + 0x90, 0xf, 0xe8, 0xff, 0xba, 0x4, 0x17, 0xb4, + 0x80, 0x3f, 0x85, 0x27, 0xfd, 0x0, 0x30, 0x1, + 0xf9, 0x5d, 0x0, 0x27, 0xfd, 0x0, 0xff, 0x47, + 0xfd, 0x24, 0x4, 0x80, 0x1f, 0xfc, 0x2, 0x7e, + 0xf6, 0x0, 0xfe, 0x27, 0xbc, 0xc5, 0x30, 0xb0, + 0x7, 0xe2, 0xbf, 0x92, 0x0, 0x2e, 0xf3, 0x0, + 0x7c, 0x7d, 0xee, 0x1, 0xc3, 0xbf, 0x0, 0x1c, + 0x5d, 0xfa, 0x0, 0x6c, 0xb1, 0x4, 0xff, 0x30, + 0x6, 0xbf, 0xf4, 0x81, 0xff, 0xd8, 0x0, 0xff, + 0x84, 0x2, 0xdf, 0xf4, 0x2, 0xff, 0xdc, 0x0, + 0xff, 0x88, 0x2, 0x5f, 0xf6, 0x0, 0xf7, 0xfa, + 0x40, 0xbf, 0xd4, 0x1, 0xd1, 0xfe, 0x40, 0x17, + 0x50, 0x5, 0xfe, 0x88, 0x7, 0xa3, 0xfc, 0xc0, + 0x10, 0xd7, 0xe0, 0x80, 0x7e, 0x3a, 0xfe, 0xbc, + 0xfc, 0x60, 0xf, 0xfe, 0x9, 0x19, 0x84, 0x3, + 0xf8, + + /* U+0094 "”" */ + 0x4f, 0xff, 0xee, 0x60, 0xc, 0xde, 0xab, 0xfa, + 0x7d, 0x40, 0x26, 0xe0, 0xf, 0xa, 0x4, 0xfa, + 0x80, 0x1b, 0x80, 0x3c, 0xdc, 0x0, 0xaf, 0x50, + 0x6e, 0x0, 0xf3, 0x70, 0x5, 0x7e, 0xad, 0xc0, + 0x1e, 0x6f, 0x55, 0x8b, 0x39, 0xb8, 0x3, 0xcb, + 0xdd, 0x8d, 0xb9, 0xb8, 0x3, 0xff, 0x80, 0xdc, + 0xdc, 0x1, 0xff, 0xc0, 0x6e, 0x6e, 0x0, 0xff, + 0xe0, 0x37, 0x37, 0x0, 0x7f, 0xf0, 0x1b, 0x9b, + 0x80, 0x3f, 0xf8, 0xd, 0xcd, 0xc0, 0x1f, 0xfc, + 0x6, 0xe6, 0xe0, 0xf, 0xfe, 0x3, 0x73, 0x70, + 0x7, 0xff, 0x1, 0xb9, 0xb8, 0x3, 0xff, 0x80, + 0xdc, 0xdc, 0x1, 0xff, 0xc0, 0x6e, 0x6e, 0x0, + 0xff, 0xe0, 0x37, 0x37, 0xa2, 0x7f, 0xf0, 0x27, + 0x93, 0xff, 0xff, 0x85, 0x80, + /* U+00B0 "°" */ 0x0, 0xfc, 0xbb, 0xf8, 0x80, 0x9f, 0x9, 0x3e, 0x57, 0x40, 0x16, 0x4e, 0xb8, 0x5, 0x37, 0x92, @@ -13821,527 +14067,540 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 6866, .adv_w = 103, .box_w = 3, .box_h = 28, .ofs_x = 2, .ofs_y = -7}, {.bitmap_index = 6908, .adv_w = 130, .box_w = 8, .box_h = 25, .ofs_x = 0, .ofs_y = -5}, {.bitmap_index = 6983, .adv_w = 213, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 7009, .adv_w = 142, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 11}, - {.bitmap_index = 7037, .adv_w = 384, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7063, .adv_w = 384, .box_w = 22, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 7075, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7175, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7289, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7427, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 7544, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7678, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 7800, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 7937, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 8097, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 8214, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8385, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 8519, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8690, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8879, .adv_w = 384, .box_w = 22, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8915, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 9023, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 9145, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 9291, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9482, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 9643, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 9815, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 9993, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10196, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10410, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10583, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10746, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10944, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11116, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11298, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11505, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11675, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11864, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12046, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12249, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12472, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12669, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12909, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13099, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13259, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13476, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13690, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13873, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14087, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14259, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14469, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14637, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14835, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15046, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 15265, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 15443, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 15611, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 15782, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 15924, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16067, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16233, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16381, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16532, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16675, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16869, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 17029, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 17242, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 17364, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 17525, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 17703, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 17916, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 18072, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 18215, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 18379, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 18578, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 18785, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 18990, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 19231, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 19429, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 19611, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 19821, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 20037, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 20221, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 20405, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 20604, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 20790, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 20957, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 21140, .adv_w = 384, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 21285, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 21439, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 21644, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 21782, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 21903, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22003, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 22141, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22317, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 22497, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22671, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 22862, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 23028, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23212, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 23419, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 23596, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 23765, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 23864, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 23998, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 24129, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 24246, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 24386, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 24530, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 24689, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 24844, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 25013, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25159, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25316, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 25459, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25589, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25766, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25959, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 26158, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26348, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 26484, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 26639, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 26779, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 26921, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 27087, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 27239, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27443, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 27621, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 27813, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27997, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28169, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28333, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28518, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28700, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28825, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28995, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29150, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29334, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29499, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29636, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29765, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29916, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 30076, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30239, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 30419, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30614, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30726, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 30879, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 31018, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 31156, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 31310, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 31464, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 31624, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31801, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 31982, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 32106, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 32280, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32418, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 32613, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 32812, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 32963, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 33113, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33278, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 33431, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 33603, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33786, .adv_w = 384, .box_w = 22, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 33875, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 34007, .adv_w = 384, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 34136, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 34304, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 34467, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 34672, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 34835, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 35030, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35202, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 35333, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 35469, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 35630, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 35796, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35971, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 36163, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 36349, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 36491, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 36654, .adv_w = 384, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 36794, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 36980, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 37168, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 37348, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 37486, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 37639, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 37837, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38023, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38198, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38381, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38584, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 38789, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 39022, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39171, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39367, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39548, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39718, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39879, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40050, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 40254, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40420, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40606, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40768, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 40965, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 41167, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 41374, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 41571, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 41758, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 41966, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42095, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42287, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42475, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 42602, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 42773, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42973, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 43133, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 43300, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 43509, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 43722, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 43894, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 44101, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 44280, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 44448, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44664, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 44852, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 45044, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45221, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45411, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45607, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45814, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 46023, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 46224, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 46425, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46606, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 46817, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 47011, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 47215, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47414, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 47612, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47827, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 48035, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 48252, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48399, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 48607, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 48787, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 49005, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 49208, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49410, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 49623, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 49841, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 50020, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 50171, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50379, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 50583, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50786, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 50926, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 51138, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 51283, .adv_w = 384, .box_w = 16, .box_h = 21, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 51381, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 51555, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 51727, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 51930, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 52085, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 52230, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52385, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 52554, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 52724, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 52880, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 53054, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 53217, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 53351, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 53494, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 53698, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 53845, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 53999, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 54204, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54368, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 54523, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54701, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 54869, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 55083, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 55301, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 55462, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 55670, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 55812, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56004, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56163, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 56373, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 56551, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 56757, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 56951, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57145, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 57358, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 57567, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 57705, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 57834, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 58033, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 58193, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 58363, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58563, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 58766, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 58937, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59146, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 59332, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 59524, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59703, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 59873, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60071, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60226, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 60437, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 60646, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 60871, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61058, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 61244, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61435, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61599, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 61803, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61974, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 62184, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62385, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 62567, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62777, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 62978, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63185, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 63389, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 63531, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 63752, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 63892, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 64116, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 64255, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64436, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64627, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 64790, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64955, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 65166, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 65303, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 65471, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 65622, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 65790, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 65958, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 66166, .adv_w = 384, .box_w = 18, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 66290, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 66471, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 66665, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 66817, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 67004, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 67126, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 67257, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67431, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67581, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 67724, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 67919, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 68097, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68289, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 68498, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 68623, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 68803, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 68987, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69186, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 69397, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 69610, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69784, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 69918, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 70095, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 70248, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 70460, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 70636, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70792, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70979, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 71147, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 71323, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 71519, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 71715, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 71899, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 72105, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 72261, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72476, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 72653, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 72853, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73051, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73264, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73463, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73636, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73820, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74017, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 74234, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74426, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 74627, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74833, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 75027, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 75172, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 75322, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75481, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75679, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 75878, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 76050, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 76247, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 76466, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 76707, .adv_w = 384, .box_w = 18, .box_h = 23, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 76831, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 76953, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 77163, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 77321, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77467, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77642, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 77820, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 78010, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78219, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 78432, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78591, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78772, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78936, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79098, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79307, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79495, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 79656, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 79844, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 80064, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 80237, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 80454, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 80680, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 80790, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 80958, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 81100, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 81270, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 81462, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 81625, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 81776, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81960, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 82137, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 82307, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 82477, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 82663, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 82856, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 83026, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 83194, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 83370, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 83576, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 83755, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 83966, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 84155, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 84364, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 84562, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 84747, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 84948, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 85102, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 85274, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 85478, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 85714, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 85890, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86081, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 86281, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 86480, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 86676, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 86901, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 87091, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87257, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 87431, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87617, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 87797, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87972, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 88163, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88348, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 88545, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 88752, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 88947, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 89152, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 89335, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 89525, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 89705, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 89844, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 89979, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 90165, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90328, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90523, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 90725, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90950, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 91131, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 91353, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 91563, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 91722, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 91854, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 92021, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 92185, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 92356, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 92523, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 92698, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 92889, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 93099, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 93305, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 93510, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 93734, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 93920, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 94087, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94263, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 94470, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 94636, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 94806, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 94942, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 95097, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 95284, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95474, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 95703, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95903, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96116, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 96328, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 96549, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 96680, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 96876, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 97079, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 97231, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 97418, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2} + {.bitmap_index = 7009, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7136, .adv_w = 384, .box_w = 19, .box_h = 21, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7290, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7429, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7573, .adv_w = 384, .box_w = 18, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 7719, .adv_w = 384, .box_w = 14, .box_h = 23, .ofs_x = 5, .ofs_y = -3}, + {.bitmap_index = 7836, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7961, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8105, .adv_w = 361, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 8248, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8378, .adv_w = 384, .box_w = 18, .box_h = 19, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 8472, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8617, .adv_w = 384, .box_w = 16, .box_h = 20, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 8726, .adv_w = 142, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 8754, .adv_w = 384, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8780, .adv_w = 384, .box_w = 22, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 8792, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8892, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9006, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9144, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 9261, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9395, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9517, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9654, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 9814, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9931, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10102, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10236, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10407, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10596, .adv_w = 384, .box_w = 22, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10632, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10740, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10862, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 11008, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11199, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11360, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11532, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 11710, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11913, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12127, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12300, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12463, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12661, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12833, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13015, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13222, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13392, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13581, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13763, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13966, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14189, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14386, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14626, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14816, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14976, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15193, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15407, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15590, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15804, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15976, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16186, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16354, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16552, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16763, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16982, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17160, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 17328, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 17499, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17641, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17784, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17950, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18098, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18249, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18392, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18586, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 18746, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 18959, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 19081, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 19242, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 19420, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19633, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 19789, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 19932, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 20096, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 20295, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20502, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20707, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20948, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 21146, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 21328, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 21538, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 21754, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 21938, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22122, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 22321, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 22507, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22674, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22857, .adv_w = 384, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 23002, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 23156, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 23361, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 23499, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 23620, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23720, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 23858, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24034, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 24214, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24388, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24579, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 24745, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24929, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 25136, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25313, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25482, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 25581, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 25715, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25846, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 25963, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 26103, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 26247, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 26406, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 26561, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 26730, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 26876, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27033, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 27176, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27306, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27483, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27676, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 27875, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28065, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 28201, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 28356, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 28496, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 28638, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 28804, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28956, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29160, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29338, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 29530, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29714, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29886, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30050, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30235, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30417, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30542, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30712, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30867, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 31051, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 31216, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 31353, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 31482, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 31633, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 31793, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 31956, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 32136, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32331, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32443, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 32596, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32735, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 32873, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 33027, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33181, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33341, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33518, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 33699, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 33823, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33997, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34135, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34330, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34529, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34680, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34830, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34995, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 35148, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 35320, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35503, .adv_w = 384, .box_w = 22, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 35592, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35724, .adv_w = 384, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 35853, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36021, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36184, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 36389, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 36552, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36747, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36919, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 37050, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 37186, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 37347, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 37513, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37688, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 37880, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 38066, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 38208, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38371, .adv_w = 384, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 38511, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 38697, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 38885, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 39065, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 39203, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39356, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39554, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39740, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39915, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40098, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40301, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40506, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40739, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40888, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41084, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41265, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41435, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41596, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 41767, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 41971, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 42137, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42323, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 42485, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 42682, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42884, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 43091, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 43288, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 43475, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 43683, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43812, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44004, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44192, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 44319, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 44490, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44690, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44850, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45017, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45226, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45439, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 45611, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45818, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 45997, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46165, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46381, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46569, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 46761, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46938, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 47128, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 47324, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 47531, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 47740, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 47941, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 48142, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48323, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 48534, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 48728, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 48932, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49131, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49329, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49544, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49752, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49969, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50116, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50324, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50504, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 50722, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50925, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51127, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51340, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 51558, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 51737, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 51888, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52096, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 52300, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52503, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 52643, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 52855, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 53000, .adv_w = 384, .box_w = 16, .box_h = 21, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 53098, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 53272, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 53444, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 53647, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 53802, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 53947, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54102, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 54271, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 54441, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 54597, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 54771, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 54934, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 55068, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55211, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 55415, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55562, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55716, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 55921, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56085, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 56240, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56418, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 56586, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 56800, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 57018, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 57179, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 57387, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 57529, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57721, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57880, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 58090, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 58268, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 58474, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58668, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58862, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 59075, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 59284, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 59422, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 59551, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 59750, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 59910, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 60080, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60280, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 60483, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 60654, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60863, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 61049, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 61241, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61420, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 61590, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61788, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 61943, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 62154, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 62363, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 62588, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62775, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 62961, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 63152, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 63316, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 63520, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 63691, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 63901, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64102, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 64284, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64494, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 64695, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64902, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 65106, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 65248, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 65469, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65609, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65833, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 65972, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66153, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66344, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 66507, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66672, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 66883, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 67020, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 67188, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 67339, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 67507, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 67675, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 67883, .adv_w = 384, .box_w = 18, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 68007, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 68188, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 68382, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 68534, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 68721, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 68843, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 68974, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69148, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69298, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 69441, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 69636, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 69814, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70006, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 70215, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 70340, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 70520, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 70704, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70903, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71114, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 71327, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71501, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71635, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71812, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 71965, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 72177, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 72353, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72509, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72696, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 72864, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 73040, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 73236, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 73432, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 73616, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 73822, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73978, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74193, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74370, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74570, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74768, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74981, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75180, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75353, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75537, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75734, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 75951, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76143, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 76344, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76550, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76744, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76889, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 77039, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77198, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77396, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 77595, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 77767, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 77964, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 78183, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 78424, .adv_w = 384, .box_w = 18, .box_h = 23, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 78548, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 78670, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 78880, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79038, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 79184, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 79359, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 79537, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 79727, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79936, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 80149, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80308, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80489, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80653, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80815, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81024, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81212, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 81373, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 81561, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 81781, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 81954, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 82171, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 82397, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 82507, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 82675, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 82817, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 82987, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 83179, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 83342, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 83493, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83677, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 83854, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 84024, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 84194, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 84380, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 84573, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 84743, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 84911, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 85087, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 85293, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 85472, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 85683, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 85872, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86081, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 86279, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 86464, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 86665, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 86819, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86991, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87195, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 87431, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 87607, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87798, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 87998, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 88197, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 88393, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88618, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 88808, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88974, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 89148, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89334, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 89514, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89689, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 89880, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90065, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 90262, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 90469, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 90664, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 90869, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 91052, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 91242, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91422, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91561, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91696, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91882, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92045, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92240, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 92442, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92667, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 92848, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 93070, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 93280, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 93439, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 93571, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 93738, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 93902, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 94073, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 94240, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 94415, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 94606, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 94816, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 95022, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 95227, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 95451, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 95637, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 95804, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95980, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 96187, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 96353, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 96523, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 96659, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 96814, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 97001, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97191, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 97420, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97620, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97833, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 98045, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98266, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98397, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 98593, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 98796, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98948, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 99135, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2} }; /*--------------------- * CHARACTER MAPPING *--------------------*/ -static const uint16_t unicode_list_1[] = { +static const uint16_t unicode_list_2[] = { 0x0, 0x2f51, 0x4d50, 0x4d5a, 0x4d5b, 0x4d5d, 0x4d5e, 0x4d7a, 0x4d7d, 0x4d82, 0x4d8a, 0x4d8b, 0x4d99, 0x4d9b, 0x4da0, 0x4da8, 0x4ddc, 0x4dde, 0x4dfb, 0x4dfe, 0x4e15, 0x4e1b, 0x4e1e, 0x4e35, @@ -14417,8 +14676,12 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY }, { - .range_start = 176, .range_length = 40489, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 514, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .range_start = 136, .range_length = 13, .glyph_id_start = 96, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 40489, .glyph_id_start = 109, + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 514, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; @@ -14506,7 +14769,8 @@ static const uint8_t kern_left_class_mapping[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 }; /*Map glyph_ids to kern right classes*/ @@ -14588,7 +14852,8 @@ static const uint8_t kern_right_class_mapping[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 }; /*Kern values between classes*/ @@ -14837,7 +15102,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = { .cmaps = cmaps, .kern_dsc = &kern_classes, .kern_scale = 16, - .cmap_num = 2, + .cmap_num = 3, .bpp = 4, .kern_classes = 1, .bitmap_format = 2, diff --git a/radio/src/fonts/lvgl/lv_font_noto_tw_24.c b/radio/src/fonts/lvgl/lv_font_noto_tw_24.c index 02ac00d91b9..0ae22ed7c94 100644 --- a/radio/src/fonts/lvgl/lv_font_noto_tw_24.c +++ b/radio/src/fonts/lvgl/lv_font_noto_tw_24.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 24 px * Bpp: 4 - * Opts: --no-prefilter --bpp 4 --size 24 --font ../Noto/NotoSansCJKsc-Regular.otf -r 0x20-0x7F,0xB0,0x3001,0x4e00,0x4e0a,0x4e0b,0x4e0d,0x4e2d,0x4e32,0x4e3b,0x4e4b,0x4e58,0x4e8c,0x4eab,0x4eae,0x4ecb,0x4ee5,0x4ef0,0x4ef6,0x4efb,0x4efd,0x4f48,0x4f4d,0x4f4e,0x4f4f,0x4f5c,0x4f7f,0x4f86,0x4f8b,0x4f9b,0x4fdd,0x4fe1,0x4fee,0x4fef,0x500b,0x500d,0x5012,0x503c,0x504f,0x505c,0x5074,0x5099,0x50b3,0x50c5,0x50cf,0x5100,0x511f,0x5132,0x5141,0x5145,0x5149,0x5165,0x5167,0x5168,0x516c,0x5176,0x5177,0x517c,0x518a,0x51fa,0x5206,0x5217,0x521d,0x5225,0x522a,0x5230,0x5236,0x5237,0x524d,0x5275,0x529f,0x52a0,0x52d5,0x5305,0x5316,0x5340,0x5347,0x5354,0x5361,0x539f,0x53c3,0x53ca,0x53cd,0x53d6,0x53e3,0x53ea,0x53ef,0x540c,0x540d,0x5411,0x5426,0x542b,0x542f,0x544a,0x548c,0x554f,0x555f,0x55ae,0x55ce,0x5668,0x56de,0x56fa,0x570b,0x570d,0x5716,0x5728,0x5730,0x5740,0x5747,0x5757,0x578b,0x57f7,0x57fa,0x5831,0x584a,0x586b,0x589e,0x58d3,0x5916,0x591a,0x5927,0x5929,0x592a,0x5931,0x593e,0x597d,0x59cb,0x5b50,0x5b58,0x5b78,0x5b83,0x5b89,0x5b8c,0x5b9a,0x5bb9,0x5beb,0x5bec,0x5bf8,0x5c04,0x5c07,0x5c0d,0x5c0e,0x5c0f,0x5c3a,0x5c40,0x5c45,0x5c4f,0x5c55,0x5de5,0x5dee,0x5df2,0x5e36,0x5e38,0x5e40,0x5e45,0x5e55,0x5e73,0x5e74,0x5e8f,0x5ea6,0x5ee0,0x5ef6,0x5efa,0x5f00,0x5f0f,0x5f15,0x5f31,0x5f37,0x5f48,0x5f62,0x5f71,0x5f85,0x5f88,0x5f8c,0x5f91,0x5f9e,0x5fa9,0x5faa,0x5fae,0x5ffd,0x6020,0x6025,0x6062,0x606f,0x60c5,0x610f,0x611f,0x614b,0x6162,0x61c9,0x6210,0x6216,0x622a,0x6232,0x6236,0x6240,0x6247,0x624b,0x6253,0x627e,0x62c9,0x62d2,0x62fe,0x6301,0x6307,0x6309,0x632f,0x6383,0x63a1,0x63a5,0x63a7,0x63cf,0x63d0,0x63d2,0x63da,0x63db,0x6416,0x6447,0x6478,0x64ad,0x64c7,0x64ca,0x64cd,0x64da,0x64e6,0x64f4,0x652f,0x6536,0x6539,0x653e,0x6545,0x6548,0x6557,0x6559,0x6574,0x6578,0x6587,0x659c,0x65b0,0x65b7,0x65b9,0x65bc,0x65cb,0x65e5,0x660e,0x6620,0x662f,0x6642,0x666f,0x66ab,0x66f2,0x66f4,0x66ff,0x6700,0x6708,0x6709,0x671f,0x672a,0x672c,0x6746,0x675f,0x677f,0x679c,0x67c4,0x67e5,0x6821,0x683c,0x6848,0x687f,0x689d,0x6975,0x6a02,0x6a19,0x6a21,0x6a23,0x6a5f,0x6a6b,0x6a94,0x6aa2,0x6b04,0x6b50,0x6b62,0x6b63,0x6b64,0x6b65,0x6b7b,0x6b8a,0x6bb5,0x6bd4,0x6c60,0x6c92,0x6cb9,0x6cbf,0x6cd5,0x6ce2,0x6ce8,0x6d32,0x6d41,0x6d88,0x6df7,0x6dfb,0x6e05,0x6e1b,0x6e2c,0x6e90,0x6e96,0x6eab,0x6ed1,0x6eef,0x6efe,0x6eff,0x6f38,0x6ffe,0x70b9,0x70ba,0x7121,0x71b1,0x7247,0x7248,0x7259,0x7279,0x72c0,0x7387,0x73fe,0x74b0,0x751f,0x7528,0x7535,0x754c,0x7559,0x7565,0x7576,0x758a,0x767c,0x767d,0x7684,0x76e3,0x76e4,0x76ee,0x76f4,0x76f8,0x770b,0x771f,0x77e5,0x786c,0x78ba,0x78bc,0x793a,0x7981,0x79d2,0x79fb,0x7a0b,0x7a31,0x7a7a,0x7a97,0x7aef,0x7af6,0x7b2c,0x7b49,0x7b97,0x7bc0,0x7bc4,0x7c3d,0x7c98,0x7cbe,0x7cfb,0x7d05,0x7d1a,0x7d30,0x7d42,0x7d50,0x7d55,0x7d71,0x7d93,0x7da0,0x7dca,0x7dda,0x7de8,0x7def,0x7df4,0x7e2e,0x7e3d,0x7e8c,0x7f6e,0x7f8e,0x7fa9,0x8005,0x8017,0x806f,0x8072,0x80cc,0x80fd,0x8108,0x8173,0x81ea,0x81f3,0x8207,0x8235,0x8272,0x82f1,0x84cb,0x85cd,0x865f,0x8702,0x87ba,0x884c,0x885d,0x8868,0x8870,0x88ab,0x88dc,0x88dd,0x88fd,0x8907,0x8981,0x8986,0x8996,0x89d2,0x89e3,0x89f8,0x8a00,0x8a08,0x8a18,0x8a2a,0x8a2d,0x8a31,0x8a3b,0x8a62,0x8a66,0x8a73,0x8a8c,0x8a8d,0x8a9e,0x8aa4,0x8aaa,0x8abf,0x8acb,0x8b49,0x8b58,0x8b5c,0x8b66,0x8b70,0x8b77,0x8b8a,0x8cbc,0x8d25,0x8d77,0x8d85,0x8db3,0x8ddd,0x8def,0x8df3,0x8f03,0x8f09,0x8f2a,0x8f2f,0x8f38,0x8f49,0x8f91,0x8ff0,0x9000,0x901a,0x901f,0x9023,0x9032,0x903b,0x904a,0x904b,0x904e,0x9053,0x9072,0x9078,0x908a,0x908f,0x90e8,0x91cd,0x91cf,0x91dd,0x9215,0x9304,0x932f,0x9375,0x9396,0x93e1,0x9418,0x9451,0x94ae,0x952e,0x9577,0x9580,0x9589,0x958b,0x9592,0x9593,0x95dc,0x9640,0x9644,0x9650,0x9664,0x9670,0x969c,0x96a8,0x96d9,0x96e2,0x96fb,0x9700,0x9707,0x975c,0x975e,0x9762,0x97cc,0x97f3,0x97ff,0x9801,0x9802,0x9805,0x9806,0x9810,0x983b,0x984c,0x984f,0x985e,0x986f,0x98db,0x9a45,0x9a57,0x9ad4,0x9ad8,0x9cf4,0x9ed8,0x9ede --format lvgl -o lv_font_noto_tw_24.c --force-fast-kern-format + * Opts: --no-prefilter --bpp 4 --size 24 --font ../Noto/NotoSansCJKsc-Regular.otf -r 0x20-0x7F,0xB0,0x3001,0x4e00,0x4e0a,0x4e0b,0x4e0d,0x4e2d,0x4e32,0x4e3b,0x4e4b,0x4e58,0x4e8c,0x4eab,0x4eae,0x4ecb,0x4ee5,0x4ef0,0x4ef6,0x4efb,0x4efd,0x4f48,0x4f4d,0x4f4e,0x4f4f,0x4f5c,0x4f7f,0x4f86,0x4f8b,0x4f9b,0x4fdd,0x4fe1,0x4fee,0x4fef,0x500b,0x500d,0x5012,0x503c,0x504f,0x505c,0x5074,0x5099,0x50b3,0x50c5,0x50cf,0x5100,0x511f,0x5132,0x5141,0x5145,0x5149,0x5165,0x5167,0x5168,0x516c,0x5176,0x5177,0x517c,0x518a,0x51fa,0x5206,0x5217,0x521d,0x5225,0x522a,0x5230,0x5236,0x5237,0x524d,0x5275,0x529f,0x52a0,0x52d5,0x5305,0x5316,0x5340,0x5347,0x5354,0x5361,0x539f,0x53c3,0x53ca,0x53cd,0x53d6,0x53e3,0x53ea,0x53ef,0x540c,0x540d,0x5411,0x5426,0x542b,0x542f,0x544a,0x548c,0x554f,0x555f,0x55ae,0x55ce,0x5668,0x56de,0x56fa,0x570b,0x570d,0x5716,0x5728,0x5730,0x5740,0x5747,0x5757,0x578b,0x57f7,0x57fa,0x5831,0x584a,0x586b,0x589e,0x58d3,0x5916,0x591a,0x5927,0x5929,0x592a,0x5931,0x593e,0x597d,0x59cb,0x5b50,0x5b58,0x5b78,0x5b83,0x5b89,0x5b8c,0x5b9a,0x5bb9,0x5beb,0x5bec,0x5bf8,0x5c04,0x5c07,0x5c0d,0x5c0e,0x5c0f,0x5c3a,0x5c40,0x5c45,0x5c4f,0x5c55,0x5de5,0x5dee,0x5df2,0x5e36,0x5e38,0x5e40,0x5e45,0x5e55,0x5e73,0x5e74,0x5e8f,0x5ea6,0x5ee0,0x5ef6,0x5efa,0x5f00,0x5f0f,0x5f15,0x5f31,0x5f37,0x5f48,0x5f62,0x5f71,0x5f85,0x5f88,0x5f8c,0x5f91,0x5f9e,0x5fa9,0x5faa,0x5fae,0x5ffd,0x6020,0x6025,0x6062,0x606f,0x60c5,0x610f,0x611f,0x614b,0x6162,0x61c9,0x6210,0x6216,0x622a,0x6232,0x6236,0x6240,0x6247,0x624b,0x6253,0x627e,0x62c9,0x62d2,0x62fe,0x6301,0x6307,0x6309,0x632f,0x6383,0x63a1,0x63a5,0x63a7,0x63cf,0x63d0,0x63d2,0x63da,0x63db,0x6416,0x6447,0x6478,0x64ad,0x64c7,0x64ca,0x64cd,0x64da,0x64e6,0x64f4,0x652f,0x6536,0x6539,0x653e,0x6545,0x6548,0x6557,0x6559,0x6574,0x6578,0x6587,0x659c,0x65b0,0x65b7,0x65b9,0x65bc,0x65cb,0x65e5,0x660e,0x6620,0x662f,0x6642,0x666f,0x66ab,0x66f2,0x66f4,0x66ff,0x6700,0x6708,0x6709,0x671f,0x672a,0x672c,0x6746,0x675f,0x677f,0x679c,0x67c4,0x67e5,0x6821,0x683c,0x6848,0x687f,0x689d,0x6975,0x6a02,0x6a19,0x6a21,0x6a23,0x6a5f,0x6a6b,0x6a94,0x6aa2,0x6b04,0x6b50,0x6b62,0x6b63,0x6b64,0x6b65,0x6b7b,0x6b8a,0x6bb5,0x6bd4,0x6c60,0x6c92,0x6cb9,0x6cbf,0x6cd5,0x6ce2,0x6ce8,0x6d32,0x6d41,0x6d88,0x6df7,0x6dfb,0x6e05,0x6e1b,0x6e2c,0x6e90,0x6e96,0x6eab,0x6ed1,0x6eef,0x6efe,0x6eff,0x6f38,0x6ffe,0x70b9,0x70ba,0x7121,0x71b1,0x7247,0x7248,0x7259,0x7279,0x72c0,0x7387,0x73fe,0x74b0,0x751f,0x7528,0x7535,0x754c,0x7559,0x7565,0x7576,0x758a,0x767c,0x767d,0x7684,0x76e3,0x76e4,0x76ee,0x76f4,0x76f8,0x770b,0x771f,0x77e5,0x786c,0x78ba,0x78bc,0x793a,0x7981,0x79d2,0x79fb,0x7a0b,0x7a31,0x7a7a,0x7a97,0x7aef,0x7af6,0x7b2c,0x7b49,0x7b97,0x7bc0,0x7bc4,0x7c3d,0x7c98,0x7cbe,0x7cfb,0x7d05,0x7d1a,0x7d30,0x7d42,0x7d50,0x7d55,0x7d71,0x7d93,0x7da0,0x7dca,0x7dda,0x7de8,0x7def,0x7df4,0x7e2e,0x7e3d,0x7e8c,0x7f6e,0x7f8e,0x7fa9,0x8005,0x8017,0x806f,0x8072,0x80cc,0x80fd,0x8108,0x8173,0x81ea,0x81f3,0x8207,0x8235,0x8272,0x82f1,0x84cb,0x85cd,0x865f,0x8702,0x87ba,0x884c,0x885d,0x8868,0x8870,0x88ab,0x88dc,0x88dd,0x88fd,0x8907,0x8981,0x8986,0x8996,0x89d2,0x89e3,0x89f8,0x8a00,0x8a08,0x8a18,0x8a2a,0x8a2d,0x8a31,0x8a3b,0x8a62,0x8a66,0x8a73,0x8a8c,0x8a8d,0x8a9e,0x8aa4,0x8aaa,0x8abf,0x8acb,0x8b49,0x8b58,0x8b5c,0x8b66,0x8b70,0x8b77,0x8b8a,0x8cbc,0x8d25,0x8d77,0x8d85,0x8db3,0x8ddd,0x8def,0x8df3,0x8f03,0x8f09,0x8f2a,0x8f2f,0x8f38,0x8f49,0x8f91,0x8ff0,0x9000,0x901a,0x901f,0x9023,0x9032,0x903b,0x904a,0x904b,0x904e,0x9053,0x9072,0x9078,0x908a,0x908f,0x90e8,0x91cd,0x91cf,0x91dd,0x9215,0x9304,0x932f,0x9375,0x9396,0x93e1,0x9418,0x9451,0x94ae,0x952e,0x9577,0x9580,0x9589,0x958b,0x9592,0x9593,0x95dc,0x9640,0x9644,0x9650,0x9664,0x9670,0x969c,0x96a8,0x96d9,0x96e2,0x96fb,0x9700,0x9707,0x975c,0x975e,0x9762,0x97cc,0x97f3,0x97ff,0x9801,0x9802,0x9805,0x9806,0x9810,0x983b,0x984c,0x984f,0x985e,0x986f,0x98db,0x9a45,0x9a57,0x9ad4,0x9ad8,0x9cf4,0x9ed8,0x9ede --font EdgeTX/extra.ttf -r 0x88-0x94 --format lvgl -o lv_font_noto_tw_24.c --force-fast-kern-format ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -1132,6 +1132,252 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf7, 0xfb, 0x9f, 0x40, 0x10, 0x80, 0x68, 0xde, 0x80, 0x0, + /* U+0088 "ˆ" */ + 0x0, 0xff, 0x1b, 0x0, 0x7f, 0xf2, 0x37, 0xc4, + 0x3, 0xff, 0x8c, 0xbf, 0xe9, 0x0, 0xff, 0xe3, + 0x6d, 0xbf, 0x88, 0x7, 0xff, 0x11, 0x7c, 0xc3, + 0xa4, 0x3, 0xff, 0x89, 0xb6, 0x0, 0x6f, 0x20, + 0xf, 0xfe, 0x12, 0xf9, 0x80, 0x5d, 0x40, 0x1f, + 0xfc, 0x2d, 0xb0, 0xc, 0xde, 0x40, 0x1f, 0xfc, + 0x5, 0xf3, 0x0, 0xed, 0xa0, 0xf, 0xfe, 0x6, + 0xd8, 0x7, 0x97, 0xcc, 0x3, 0xfc, 0xde, 0x60, + 0x1f, 0x6d, 0x80, 0x7f, 0xb6, 0xc0, 0x3f, 0x2f, + 0x98, 0x7, 0xe6, 0xf3, 0x0, 0xfe, 0xdc, 0x0, + 0xfd, 0xb6, 0x1, 0xfe, 0x5f, 0x40, 0xf, 0x37, + 0x98, 0x7, 0xfd, 0x98, 0x0, 0xf6, 0xd8, 0x7, + 0xff, 0x1, 0x3d, 0x40, 0x33, 0x79, 0x80, 0x7f, + 0xf0, 0x73, 0x40, 0x37, 0x58, 0x7, 0xff, 0x9, + 0x3d, 0x40, 0xd, 0xf2, 0xef, 0xff, 0xc3, 0xfd, + 0x0, 0x6f, 0xff, 0xf7, 0x77, 0xf9, 0x40, + + /* U+0089 "‰" */ + 0x0, 0xff, 0xe0, 0x1d, 0x6d, 0xa8, 0x7, 0xff, + 0x5, 0x3f, 0x22, 0xbe, 0x0, 0x3f, 0xf8, 0x1d, + 0x40, 0x12, 0xf9, 0x0, 0x79, 0x6b, 0x71, 0xbc, + 0xc0, 0x37, 0x38, 0x6, 0x3d, 0xfb, 0x74, 0xbf, + 0x20, 0xd, 0xae, 0x1, 0x2f, 0xd0, 0x80, 0x5b, + 0xf0, 0x1, 0x1f, 0xa0, 0x0, 0xfe, 0x0, 0x30, + 0xfd, 0x7d, 0x2e, 0x7d, 0x0, 0x5b, 0x40, 0x1c, + 0xde, 0xb, 0xbf, 0xf1, 0x0, 0x1b, 0xc4, 0x3, + 0xaa, 0x80, 0x37, 0xea, 0xda, 0x0, 0xba, 0x0, + 0xf7, 0xb1, 0xf6, 0x90, 0x17, 0x98, 0x7a, 0x80, + 0x71, 0xfc, 0xfd, 0x0, 0x6d, 0x60, 0xf4, 0x0, + 0xe8, 0xff, 0x30, 0x7, 0x5c, 0x7, 0xa0, 0x7, + 0x6e, 0x8c, 0x3, 0xd7, 0x1, 0xec, 0x1, 0x86, + 0xc4, 0x3, 0xed, 0x60, 0xba, 0x0, 0xff, 0xe0, + 0x97, 0x98, 0x2f, 0x90, 0x7, 0xff, 0x2, 0x74, + 0x2, 0xdb, 0x0, 0xff, 0x8f, 0xd4, 0x2, 0x2f, + 0x90, 0xf, 0xe3, 0xe9, 0x0, 0xe4, 0xfb, 0x20, + 0xf, 0x3f, 0xd0, 0x7, 0xc5, 0x7f, 0x90, 0xcf, + 0x5d, 0xee, 0x1, 0xfe, 0x38, 0xbd, 0xca, 0x61, + 0x0, 0xe0, + + /* U+008A "Š" */ + 0x0, 0xe1, 0x1f, 0xc0, 0x1f, 0xf4, 0x7f, 0xfc, + 0x60, 0x1f, 0x84, 0x41, 0x7f, 0xfc, 0xe0, 0x6c, + 0x1, 0xc5, 0xda, 0x22, 0xef, 0xfb, 0x0, 0xbb, + 0xd8, 0x3, 0x17, 0x7d, 0x1, 0xff, 0xc4, 0xf, + 0xfc, 0x22, 0x0, 0x3c, 0xad, 0x88, 0x1, 0xbd, + 0xc0, 0x26, 0x8d, 0xd0, 0x3, 0xbf, 0xc2, 0x1, + 0x9c, 0x3, 0xaf, 0xfc, 0x60, 0xb9, 0x40, 0x1f, + 0xf1, 0xeb, 0x9c, 0xf6, 0x88, 0x7, 0xfc, 0x3f, + 0xeb, 0xb7, 0xf8, 0x40, 0x3f, 0xf8, 0x1d, 0xb2, + 0x48, 0xa0, 0x1f, 0xfc, 0x15, 0x30, 0x2a, 0xf7, + 0x0, 0xff, 0xe0, 0x7f, 0xb0, 0xbf, 0xd6, 0x1, + 0xff, 0x15, 0xfc, 0x3, 0xa4, 0xb0, 0x7, 0xf0, + 0xf4, 0x88, 0x5, 0x9f, 0xe2, 0x0, 0xf8, 0x5f, + 0xfd, 0x0, 0x14, 0xfb, 0xec, 0x80, 0x72, 0x75, + 0xae, 0x88, 0x6, 0x26, 0xff, 0x46, 0xbd, 0xfb, + 0xff, 0x94, 0x3, 0xe6, 0xf8, 0x9f, 0x9c, 0xf7, + 0x9b, 0x10, 0xf, 0xc2, 0x13, 0xed, 0x1c, 0xc0, + 0x1f, 0xfc, 0xd0, + + /* U+008B "‹" */ + 0x0, 0xff, 0xe5, 0x9f, 0x48, 0x0, 0x91, 0x6, + 0x1, 0xfe, 0x2e, 0xcf, 0xf6, 0xff, 0xf5, 0x98, + 0x7, 0x8b, 0xb0, 0x17, 0xfc, 0x82, 0x2, 0xb7, + 0xf2, 0x1, 0x87, 0x70, 0x2, 0x3e, 0xb0, 0xe, + 0x4f, 0xb0, 0x8, 0x7b, 0x44, 0x2, 0x2e, 0xb0, + 0xe, 0x2f, 0x80, 0x8, 0xbf, 0xc2, 0x1, 0x17, + 0x58, 0x7, 0x2f, 0x90, 0x5, 0xfe, 0xd2, 0x0, + 0x1f, 0xc8, 0x7, 0xb6, 0x40, 0x9, 0xe5, 0x9c, + 0x44, 0xea, 0x0, 0xf9, 0xf8, 0x0, 0xdc, 0x0, + 0xce, 0xe5, 0x80, 0x7e, 0x4f, 0x0, 0x3e, 0x0, + 0x57, 0x80, 0x1f, 0xc7, 0xe2, 0xd, 0xa0, 0x1f, + 0xfc, 0x24, 0xf0, 0x2, 0x78, 0x80, 0x7f, 0xf0, + 0x5f, 0x80, 0x2f, 0x60, 0xf, 0xfe, 0xe, 0x48, + 0x5, 0x1c, 0x1, 0xff, 0xc0, 0x5f, 0x20, 0xd, + 0xb6, 0x1, 0xfe, 0x2f, 0x80, 0xe, 0x2e, 0xb1, + 0x0, 0xf9, 0x3e, 0x80, 0x3e, 0x2d, 0xf8, 0x31, + 0x2, 0x5b, 0xf8, 0x0, 0xff, 0x36, 0xff, 0xf5, + 0x18, 0x7, 0xff, 0x4, 0x4d, 0x8, 0x3, 0xf0, + + /* U+008C "Œ" */ + 0x0, 0xf3, 0xff, 0xfb, 0xbb, 0x18, 0x7, 0xb6, + 0x95, 0x7e, 0xbe, 0x0, 0xf1, 0xf9, 0x80, 0x7d, + 0xb0, 0x1, 0xe9, 0xc0, 0xf, 0x8f, 0xc8, 0x3, + 0xde, 0xc0, 0x1f, 0x4e, 0x0, 0x79, 0x7c, 0x40, + 0x3e, 0xf6, 0x0, 0xf5, 0xd0, 0x7, 0xcb, 0xe0, + 0x1f, 0x66, 0x0, 0x3c, 0xbf, 0x20, 0x1f, 0x3f, + 0xc0, 0x6, 0x9f, 0x80, 0xf, 0xe, 0x7f, 0xc0, + 0x1, 0xff, 0x20, 0x7, 0x87, 0x74, 0x43, 0xd0, + 0x15, 0xfe, 0x10, 0xf, 0x57, 0x8, 0x2, 0x38, + 0x7d, 0xb6, 0xc0, 0x38, 0x7d, 0x40, 0x2d, 0x86, + 0xe0, 0x4f, 0x20, 0xc, 0xde, 0x1, 0x1f, 0x96, + 0x48, 0x3, 0xd8, 0x3, 0x46, 0x0, 0x53, 0x85, + 0xe6, 0x0, 0xd7, 0x0, 0xcf, 0xa0, 0x17, 0xb1, + 0xd0, 0x5, 0xcc, 0x1, 0x93, 0xc8, 0x6, 0x4, + 0x3, 0xf, 0xa0, 0x7, 0x75, 0x0, 0x7e, 0x9e, + 0x0, 0xf2, 0xfb, 0x80, 0x79, 0xfd, 0x40, 0x3e, + 0x7f, 0xc5, 0x21, 0x4a, 0xf7, 0x0, 0xfe, 0x3b, + 0xff, 0xd8, 0x80, 0x1f, 0xfc, 0x1, 0x33, 0x8, + 0x7, 0xf0, + + /* U+008D "" */ + 0x0, 0xd7, 0xff, 0xa8, 0x3, 0xf6, 0xa0, 0x89, + 0x6c, 0x3, 0xf6, 0x90, 0x1, 0x2c, 0x3, 0xf6, + 0x90, 0x1, 0x2c, 0x3, 0xf6, 0x90, 0x1, 0x2c, + 0x3, 0x5e, 0xeb, 0xbf, 0xfd, 0xdf, 0xc3, 0xc8, + 0x45, 0x19, 0xe2, 0x11, 0x69, 0x70, 0x80, 0x7f, + 0xb4, 0xb8, 0x80, 0x2, 0x3e, 0x0, 0x69, 0x71, + 0x3, 0xff, 0xf8, 0x1, 0xa5, 0xc4, 0x1, 0xfe, + 0xd3, 0xe2, 0x0, 0xff, 0x69, 0xe9, 0x0, 0x4, + 0x7c, 0x0, 0xd3, 0xd2, 0x7, 0xff, 0xf0, 0x3, + 0x4f, 0x48, 0x3, 0xfd, 0xa7, 0xa6, 0x1, 0xfe, + 0xd3, 0xd4, 0x12, 0x35, 0x5c, 0x86, 0x6d, 0x3b, + 0xee, 0xbf, 0xfd, 0x99, 0x8, 0x6, 0xe2, 0x0, + 0xbc, 0x3, 0xf7, 0x10, 0x5, 0xe0, 0x1f, 0xb8, + 0x80, 0x2f, 0x0, 0xfd, 0xc6, 0x22, 0x2f, 0x0, + 0xfd, 0x9d, 0xdb, 0x40, 0x30, + + /* U+008E "Ž" */ + 0x0, 0xff, 0x1b, 0x3b, 0x20, 0x80, 0x7f, 0xc, + 0xff, 0xfd, 0x41, 0x44, 0x1, 0x8f, 0xbf, 0xff, + 0x83, 0xbd, 0xc0, 0x5, 0xff, 0xa1, 0x8, 0xda, + 0x98, 0x3a, 0xff, 0xf, 0x7f, 0xd6, 0x20, 0x1f, + 0xb9, 0x8a, 0xff, 0xeb, 0x0, 0xff, 0x73, 0x0, + 0x23, 0xfc, 0xa0, 0x1f, 0xee, 0x60, 0x8, 0x6f, + 0xe4, 0x3, 0xfb, 0x98, 0x3, 0x97, 0xb8, 0x80, + 0x1f, 0x73, 0x0, 0x79, 0x3f, 0x44, 0x3, 0xdc, + 0xc0, 0x1c, 0xff, 0x60, 0x1f, 0xb9, 0x80, 0x35, + 0x7b, 0x80, 0x7f, 0x73, 0x0, 0x13, 0xfc, 0x60, + 0x1f, 0xee, 0x60, 0x5f, 0xf8, 0x3, 0xfe, 0xe6, + 0x9f, 0xfd, 0x40, 0x1f, 0xee, 0xfe, 0x40, 0xef, + 0xf5, 0x0, 0x7f, 0x76, 0x10, 0x1, 0x3f, 0xee, + 0x73, 0x12, 0x59, 0x60, 0x80, 0xe, 0x4f, 0xff, + 0xf0, 0x7, 0xe1, 0x9f, 0xff, 0xa8, 0x3, 0xfe, + 0x47, 0x87, 0x51, 0x0, 0x0, + + /* U+008F "" */ + 0x18, 0x8a, 0xae, 0xd3, 0x11, 0xfc, 0xb, 0xf7, + 0x6f, 0xfd, 0x77, 0xfb, 0xd1, 0x78, 0x1, 0xff, + 0x38, 0x7, 0xef, 0x45, 0xe0, 0x7, 0xfc, 0xe0, + 0x11, 0x56, 0xf7, 0x3d, 0x17, 0x80, 0x2, 0x44, + 0x0, 0xc, 0xff, 0xf9, 0x17, 0x80, 0xa, 0xee, + 0x22, 0x77, 0xff, 0xc8, 0xbc, 0x0, 0xef, 0xf4, + 0x80, 0xc7, 0xff, 0x91, 0x78, 0x1, 0xdf, 0xe9, + 0x0, 0x86, 0x33, 0x17, 0xe8, 0xbc, 0x0, 0xdf, + 0xf3, 0x80, 0x7e, 0xf4, 0x5e, 0x0, 0xff, 0xe1, + 0x7a, 0x2f, 0x0, 0x7f, 0xf0, 0xbd, 0x17, 0x80, + 0x1b, 0xfe, 0x80, 0xf, 0xde, 0x8b, 0xc0, 0xe, + 0xff, 0x48, 0x7, 0xef, 0x45, 0xe0, 0x7, 0x7f, + 0xa4, 0x3, 0xf7, 0xa2, 0xf0, 0x1, 0x5d, 0xc4, + 0x1, 0xfb, 0xd1, 0x78, 0x0, 0x26, 0x60, 0xf, + 0xef, 0x45, 0xe0, 0x6, 0xff, 0xa4, 0x3, 0xf7, + 0xa2, 0xf0, 0x3, 0x7f, 0xd4, 0x1, 0xfb, 0xd1, + 0x78, 0x1, 0xbf, 0xe9, 0x0, 0xfd, 0xe8, 0xbf, + 0xff, 0xfc, 0x43, 0x4, 0x4f, 0xfe, 0x20, 0x0, + + /* U+0090 "" */ + 0x0, 0xf9, 0x6f, 0x24, 0x80, 0x3f, 0xe2, 0xaf, + 0xff, 0x6b, 0x0, 0x7e, 0x5f, 0xd5, 0x7e, 0x4f, + 0x39, 0xfb, 0x10, 0xe, 0x5f, 0x90, 0x3, 0x72, + 0x78, 0x0, 0xb7, 0x40, 0x18, 0xbe, 0x0, 0x26, + 0xe4, 0xf0, 0x8, 0x7a, 0x80, 0x2b, 0xc0, 0xc, + 0xdc, 0x9e, 0x1, 0x93, 0xcc, 0x7, 0xd0, 0x3, + 0x37, 0x47, 0x80, 0x76, 0x48, 0x2f, 0x80, 0x72, + 0x7f, 0xb4, 0x3, 0x9f, 0x81, 0xf4, 0x3, 0x10, + 0x80, 0x52, 0xc0, 0x12, 0x78, 0x46, 0x0, 0x49, + 0xfa, 0x20, 0xff, 0xeb, 0x10, 0x4f, 0x6, 0xe0, + 0x3, 0x7e, 0xde, 0x7, 0xe9, 0xef, 0x2a, 0xbc, + 0xf, 0xca, 0x3e, 0x8b, 0x2c, 0x1b, 0xf0, 0xa3, + 0xfd, 0xa0, 0xe, 0xff, 0x41, 0xf4, 0x80, 0x45, + 0x9e, 0xcf, 0xf6, 0x0, 0x8f, 0xe5, 0xf7, 0x0, + 0xf3, 0xff, 0xc0, 0x1b, 0xfe, 0x50, 0xf, 0xd7, + 0xea, 0x1, 0xdf, 0xe6, 0x0, 0xf1, 0x5f, 0xa8, + 0x7, 0xd1, 0xfd, 0x2e, 0xd1, 0x7f, 0xa6, 0x1, + 0xfc, 0x2f, 0x7b, 0xdb, 0x4a, 0x1, 0xe0, + + /* U+0091 "‘" */ + 0x0, 0xe3, 0x53, 0x0, 0xff, 0xe1, 0xb7, 0x7f, + 0xdc, 0x80, 0x1f, 0xfc, 0x7, 0xff, 0xf9, 0x40, + 0x3f, 0xc5, 0xff, 0xfb, 0x84, 0x3, 0xfa, 0x3f, + 0xff, 0x94, 0x0, 0x46, 0x20, 0x1a, 0xbf, 0xff, + 0xa0, 0x6f, 0xfe, 0xa1, 0x0, 0x57, 0xff, 0xf3, + 0xe7, 0xff, 0x58, 0x1, 0xbf, 0xff, 0xa3, 0xff, + 0xe3, 0x0, 0x77, 0xff, 0xd6, 0xff, 0xff, 0x30, + 0x0, 0xff, 0xfd, 0xa2, 0x9f, 0xff, 0x20, 0x4, + 0x5b, 0xff, 0xd8, 0xbd, 0xff, 0xdc, 0x1, 0xa3, + 0xfd, 0x4f, 0x5f, 0xff, 0xc6, 0x1, 0x37, 0xe0, + 0x81, 0xf7, 0xff, 0xe9, 0x0, 0xdf, 0xc2, 0x3, + 0xdf, 0xff, 0xe3, 0x0, 0x37, 0xb8, 0x3, 0x3f, + 0xff, 0xeb, 0x0, 0x57, 0x90, 0x2f, 0xff, 0xff, + 0x4, 0x1, 0x9e, 0x0, 0xcf, 0xff, 0xfe, 0x9, + 0x86, 0xf0, 0x9f, 0xff, 0xff, 0x9, 0x43, 0x3f, + 0xff, 0xf8, 0xa8, 0xd, 0x33, 0x94, 0x8b, 0xff, + 0x80, 0x0, + + /* U+0092 "’" */ + 0x0, 0xff, 0xe6, 0x17, 0x28, 0x7, 0xff, 0xc, + 0x73, 0xd8, 0x3, 0xff, 0x89, 0x9e, 0xe0, 0x1f, + 0xfc, 0x4b, 0xf8, 0x0, 0xff, 0xe2, 0x5f, 0xc0, + 0x7, 0x2a, 0xf2, 0x26, 0x33, 0x6f, 0xc8, 0x6, + 0xdf, 0xff, 0xfe, 0xd, 0x0, 0x5b, 0xff, 0xff, + 0xc2, 0xb0, 0x2, 0x2a, 0xf9, 0x9b, 0xf8, 0xc0, + 0xf, 0x55, 0xd3, 0x3f, 0xe4, 0x1, 0xcf, 0xff, + 0xfe, 0x13, 0x80, 0x59, 0xff, 0xff, 0xc1, 0x70, + 0xd, 0x7f, 0x20, 0x18, 0x46, 0x22, 0x84, 0x3, + 0xab, 0xe4, 0x3, 0xff, 0x89, 0x3f, 0x40, 0x1f, + 0xfc, 0x49, 0xfa, 0x0, 0xff, 0xe2, 0x47, 0xd8, + 0x7, 0xff, 0x11, 0xe0, 0x3, 0xe0, + + /* U+0093 "“" */ + 0x0, 0xf8, 0xd0, 0xc4, 0x3, 0xff, 0x87, 0x3f, + 0xf6, 0x41, 0x0, 0x7f, 0xf0, 0x44, 0x96, 0x7b, + 0xec, 0xc0, 0x3f, 0xca, 0xea, 0x40, 0x5, 0xcf, + 0x90, 0xf, 0xe8, 0xff, 0xba, 0x4, 0x17, 0xb4, + 0x80, 0x3f, 0x85, 0x27, 0xfd, 0x0, 0x30, 0x1, + 0xf9, 0x5d, 0x0, 0x27, 0xfd, 0x0, 0xff, 0x47, + 0xfd, 0x24, 0x4, 0x80, 0x1f, 0xfc, 0x2, 0x7e, + 0xf6, 0x0, 0xfe, 0x27, 0xbc, 0xc5, 0x30, 0xb0, + 0x7, 0xe2, 0xbf, 0x92, 0x0, 0x2e, 0xf3, 0x0, + 0x7c, 0x7d, 0xee, 0x1, 0xc3, 0xbf, 0x0, 0x1c, + 0x5d, 0xfa, 0x0, 0x6c, 0xb1, 0x4, 0xff, 0x30, + 0x6, 0xbf, 0xf4, 0x81, 0xff, 0xd8, 0x0, 0xff, + 0x84, 0x2, 0xdf, 0xf4, 0x2, 0xff, 0xdc, 0x0, + 0xff, 0x88, 0x2, 0x5f, 0xf6, 0x0, 0xf7, 0xfa, + 0x40, 0xbf, 0xd4, 0x1, 0xd1, 0xfe, 0x40, 0x17, + 0x50, 0x5, 0xfe, 0x88, 0x7, 0xa3, 0xfc, 0xc0, + 0x10, 0xd7, 0xe0, 0x80, 0x7e, 0x3a, 0xfe, 0xbc, + 0xfc, 0x60, 0xf, 0xfe, 0x9, 0x19, 0x84, 0x3, + 0xf8, + + /* U+0094 "”" */ + 0x4f, 0xff, 0xee, 0x60, 0xc, 0xde, 0xab, 0xfa, + 0x7d, 0x40, 0x26, 0xe0, 0xf, 0xa, 0x4, 0xfa, + 0x80, 0x1b, 0x80, 0x3c, 0xdc, 0x0, 0xaf, 0x50, + 0x6e, 0x0, 0xf3, 0x70, 0x5, 0x7e, 0xad, 0xc0, + 0x1e, 0x6f, 0x55, 0x8b, 0x39, 0xb8, 0x3, 0xcb, + 0xdd, 0x8d, 0xb9, 0xb8, 0x3, 0xff, 0x80, 0xdc, + 0xdc, 0x1, 0xff, 0xc0, 0x6e, 0x6e, 0x0, 0xff, + 0xe0, 0x37, 0x37, 0x0, 0x7f, 0xf0, 0x1b, 0x9b, + 0x80, 0x3f, 0xf8, 0xd, 0xcd, 0xc0, 0x1f, 0xfc, + 0x6, 0xe6, 0xe0, 0xf, 0xfe, 0x3, 0x73, 0x70, + 0x7, 0xff, 0x1, 0xb9, 0xb8, 0x3, 0xff, 0x80, + 0xdc, 0xdc, 0x1, 0xff, 0xc0, 0x6e, 0x6e, 0x0, + 0xff, 0xe0, 0x37, 0x37, 0xa2, 0x7f, 0xf0, 0x27, + 0x93, 0xff, 0xff, 0x85, 0x80, + /* U+00B0 "°" */ 0x0, 0xfc, 0xbb, 0xf8, 0x80, 0x9f, 0x9, 0x3e, 0x57, 0x40, 0x16, 0x4e, 0xb8, 0x5, 0x37, 0x92, @@ -14663,543 +14909,556 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 6866, .adv_w = 103, .box_w = 3, .box_h = 28, .ofs_x = 2, .ofs_y = -7}, {.bitmap_index = 6908, .adv_w = 130, .box_w = 8, .box_h = 25, .ofs_x = 0, .ofs_y = -5}, {.bitmap_index = 6983, .adv_w = 213, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 7009, .adv_w = 142, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 11}, - {.bitmap_index = 7037, .adv_w = 384, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7063, .adv_w = 384, .box_w = 22, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 7075, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7175, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7289, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7427, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 7549, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 7686, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7803, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7937, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8126, .adv_w = 384, .box_w = 22, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8162, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 8284, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 8430, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 8591, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 8769, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8983, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9156, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9319, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9517, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9722, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9904, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10111, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10281, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10463, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10666, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 10847, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11070, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11267, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11457, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11617, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11834, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12048, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12261, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12444, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12658, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12830, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13040, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13208, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13443, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 13647, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13852, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14047, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14266, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14495, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14701, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14922, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 15100, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 15268, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 15439, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 15581, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 15733, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15876, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16042, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16193, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16336, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16530, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 16740, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 16896, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 17060, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 17259, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 17464, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 17660, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 17875, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 18057, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 18267, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 18483, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 18667, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 18876, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 19060, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 19259, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 19456, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 19623, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 19806, .adv_w = 384, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 19949, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 20103, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 20312, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 20433, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20609, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 20810, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20984, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 21150, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 21357, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 21456, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 21590, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 21721, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 21861, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 22005, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 22160, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 22306, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22463, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 22606, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 22736, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22929, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 23094, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 23303, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 23451, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 23641, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23831, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 23967, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 24107, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 24268, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 24421, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 24588, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 24740, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24944, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 25122, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 25314, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25498, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25670, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 25882, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26046, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 26252, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 26460, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 26645, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 26827, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 27015, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 27199, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 27364, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 27501, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 27630, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 27781, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 27941, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28119, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 28299, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28494, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28606, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 28759, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 28926, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 29064, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 29218, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 29372, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 29532, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 29709, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 29883, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 30051, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 30175, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 30370, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 30582, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 30780, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 30960, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 31111, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 31261, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31426, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 31579, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 31751, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 31934, .adv_w = 384, .box_w = 22, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 32023, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 32155, .adv_w = 384, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 32284, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32467, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 32630, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 32826, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33021, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33193, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33324, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 33460, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 33621, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 33796, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 34020, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 34212, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 34398, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 34540, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 34703, .adv_w = 384, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 34843, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 35029, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 35225, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 35412, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 35610, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 35796, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 35979, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36182, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36391, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36583, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36796, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 36990, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 37195, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 37428, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 37624, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 37794, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 37955, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 38159, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38325, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 38511, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38673, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 38870, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39086, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 39288, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 39504, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 39701, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 39888, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 40096, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 40328, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 40456, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 40648, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 40836, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 40963, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 41134, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 41347, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 41526, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 41694, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 41886, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42063, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42253, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42449, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42656, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 42845, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43056, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 43257, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 43438, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 43649, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 43843, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 44047, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 44248, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 44466, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44662, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 44861, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45059, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 45274, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45462, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 45644, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 45852, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 46074, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 46291, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 46515, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 46662, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 46870, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 47050, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 47268, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 47471, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47673, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 47876, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 48089, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 48268, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 48469, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 48620, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 48828, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 49031, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 49249, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 49389, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 49586, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 49798, .adv_w = 384, .box_w = 16, .box_h = 21, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 49896, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 50068, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 50271, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 50426, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 50608, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 50763, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 50945, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 51115, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 51271, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 51445, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 51608, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 51742, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 51885, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 52089, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 52236, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 52390, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 52554, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 52709, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 52923, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 53084, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 53292, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 53434, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 53644, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 53850, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 54028, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 54210, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 54426, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 54628, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 54830, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55037, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55231, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55442, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 55680, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 55889, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 56097, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 56315, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 56541, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 56751, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 56889, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 57018, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 57217, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 57377, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 57547, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 57747, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 57950, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 58121, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58330, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 58516, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 58708, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 58887, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 59057, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 59255, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 59410, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 59621, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 59830, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 60017, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 60203, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60394, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 60558, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 60775, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 61000, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61201, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 61357, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61554, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 61736, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 61945, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62137, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 62347, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 62561, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 62772, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 62914, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 63097, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 63293, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 63513, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 63653, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 63877, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 64016, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64197, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 64404, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 64567, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 64770, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 64971, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 65108, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 65276, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 65427, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 65595, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 65763, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 65971, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 66132, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 66301, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 66514, .adv_w = 384, .box_w = 18, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 66638, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 66819, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 67002, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67209, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 67331, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 67462, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67636, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 67786, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 67929, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 68124, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68316, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 68522, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 68725, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 68850, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 69030, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69229, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 69442, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69616, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 69834, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 69968, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 70145, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 70357, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 70563, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 70739, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 70895, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 71063, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 71265, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71464, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 71666, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7009, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7136, .adv_w = 384, .box_w = 19, .box_h = 21, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7290, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7429, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7573, .adv_w = 384, .box_w = 18, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 7719, .adv_w = 384, .box_w = 14, .box_h = 23, .ofs_x = 5, .ofs_y = -3}, + {.bitmap_index = 7836, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7961, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8105, .adv_w = 361, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 8248, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8378, .adv_w = 384, .box_w = 18, .box_h = 19, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 8472, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8617, .adv_w = 384, .box_w = 16, .box_h = 20, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 8726, .adv_w = 142, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 8754, .adv_w = 384, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8780, .adv_w = 384, .box_w = 22, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 8792, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8892, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9006, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9144, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9266, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9403, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9520, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9654, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9843, .adv_w = 384, .box_w = 22, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9879, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10001, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 10147, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10308, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 10486, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10700, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10873, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11036, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11234, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11439, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11621, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11828, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11998, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12180, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12383, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12564, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12787, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12984, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13174, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13334, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13551, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13765, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13978, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14161, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14375, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14547, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14757, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14925, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15160, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 15364, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15569, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15764, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15983, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16212, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16418, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16639, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16817, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 16985, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 17156, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17298, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 17450, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17593, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17759, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17910, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18053, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18247, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18457, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 18613, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 18777, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 18976, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19181, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19377, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 19592, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 19774, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 19984, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20200, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 20384, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20593, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20777, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 20976, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 21173, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 21340, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 21523, .adv_w = 384, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 21666, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 21820, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 22029, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22150, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22326, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22527, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22701, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22867, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 23074, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 23173, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 23307, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 23438, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 23578, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 23722, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 23877, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 24023, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24180, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 24323, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 24453, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24646, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 24811, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 25020, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25168, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 25358, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25548, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 25684, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 25824, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 25985, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 26138, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 26305, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 26457, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26661, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26839, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 27031, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27215, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27387, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 27599, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27763, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 27969, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28177, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28362, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28544, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28732, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28916, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29081, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29218, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29347, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29498, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 29658, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29836, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30016, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30211, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30323, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 30476, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30643, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 30781, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30935, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 31089, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 31249, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31426, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 31600, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 31768, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 31892, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 32087, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 32299, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 32497, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32677, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 32828, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 32978, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33143, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33296, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33468, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33651, .adv_w = 384, .box_w = 22, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 33740, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 33872, .adv_w = 384, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 34001, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34184, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 34347, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 34543, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34738, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34910, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 35041, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 35177, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 35338, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35513, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 35737, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 35929, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36115, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 36257, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36420, .adv_w = 384, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 36560, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 36746, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 36942, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 37129, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 37327, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 37513, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37696, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37899, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38108, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38300, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38513, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38707, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 38912, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39145, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39341, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39511, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39672, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 39876, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40042, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40228, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40390, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40587, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40803, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41005, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41221, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41418, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41605, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 41813, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42045, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42173, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42365, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42553, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 42680, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 42851, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 43064, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 43243, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 43411, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 43603, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 43780, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 43970, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44166, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44373, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44562, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44773, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44974, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45155, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45366, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45560, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45764, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45965, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46183, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46379, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46578, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46776, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46991, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 47179, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 47361, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 47569, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 47791, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 48008, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 48232, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48379, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 48587, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 48767, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 48985, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 49188, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49390, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49593, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49806, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 49985, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50186, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50337, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50545, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50748, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50966, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 51106, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51303, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51515, .adv_w = 384, .box_w = 16, .box_h = 21, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 51613, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 51785, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 51988, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 52143, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 52325, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52480, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 52662, .adv_w = 384, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 52832, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 52988, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 53162, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 53325, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 53459, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 53602, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 53806, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 53953, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 54107, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54271, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 54426, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54640, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 54801, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 55009, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55151, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 55361, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 55567, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55745, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 55927, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 56143, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56345, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 56547, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56754, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56948, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57159, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 57397, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 57606, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 57814, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 58032, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 58258, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 58468, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 58606, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 58735, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 58934, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 59094, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 59264, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59464, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 59667, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 59838, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60047, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 60233, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 60425, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60604, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 60774, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60972, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 61127, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 61338, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 61547, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61734, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 61920, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 62111, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 62275, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 62492, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 62717, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62918, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 63074, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63271, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 63453, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63662, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63854, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64064, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 64278, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 64489, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 64631, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 64814, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65010, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 65230, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65370, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65594, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 65733, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65914, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 66121, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 66284, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 66487, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66688, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 66825, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 66993, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 67144, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 67312, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 67480, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 67688, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 67849, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 68018, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 68231, .adv_w = 384, .box_w = 18, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 68355, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 68536, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 68719, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68926, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 69048, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 69179, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69353, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69503, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 69646, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 69841, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70033, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70239, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 70442, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 70567, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 70747, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70946, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 71159, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71333, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71551, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71685, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, {.bitmap_index = 71862, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 72058, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 72242, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 72418, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72642, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 72871, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73082, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73277, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 73491, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 73719, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 73929, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 74141, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 74345, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74560, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 74778, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 74977, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75201, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75414, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75645, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 75845, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 75990, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 76140, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 76326, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76485, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 76683, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 76918, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77094, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 77266, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 77463, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 77702, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 77937, .adv_w = 384, .box_w = 18, .box_h = 23, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 78061, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 78183, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 78371, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 78581, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 78739, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 78914, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 79077, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 79251, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 79466, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 79675, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 79888, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80047, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 80257, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80421, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80583, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 80792, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 81005, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 81195, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 81410, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 81612, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 81773, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 81961, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 82160, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 82333, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 82550, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 82778, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 82888, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 83043, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 83216, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 83397, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 83589, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 83756, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 83915, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 84103, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 84283, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 84457, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 84634, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 84836, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 85005, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 85185, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 85390, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 85590, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 85772, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 85972, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 86190, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 86378, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 86546, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 86753, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 86961, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 87179, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 87369, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 87578, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 87763, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 87964, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 88118, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 88290, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 88494, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 88730, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 88941, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 89143, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 89356, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 89550, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 89777, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 89982, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 90178, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 90369, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 90554, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 90761, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 90956, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 91153, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 91345, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 91550, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 91759, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 91941, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 92150, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 92333, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 92531, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 92736, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 92941, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 93166, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 93356, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 93495, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 93630, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 93811, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94013, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 94226, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94429, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 94662, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 94883, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 95103, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95315, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 95536, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 95738, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 95960, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 96112, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 96246, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 96417, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 96588, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 96770, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 96940, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 97145, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 97336, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 97546, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 97752, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 97957, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 98153, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 98339, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 98557, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 98750, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 98958, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 99118, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 99285, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 99461, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 99660, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 99826, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 99996, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 100203, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 100339, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 100533, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 100673, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 100851, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 101026, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 101245, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 101440, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 101634, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 101842, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102062, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102275, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 102484, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 102697, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 102906, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 103137, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 103339, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 103491, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 103675, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 103891, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2} + {.bitmap_index = 72074, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 72280, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 72456, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72612, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 72780, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 72982, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73181, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73383, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 73579, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 73775, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 73959, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74135, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74359, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74588, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74799, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74994, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75208, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 75436, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 75646, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75858, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76062, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76277, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 76495, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76694, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76918, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77131, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77362, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77562, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 77707, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 77857, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 78043, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78202, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78400, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 78635, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 78811, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 78983, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 79180, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 79419, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 79654, .adv_w = 384, .box_w = 18, .box_h = 23, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 79778, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 79900, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 80088, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 80298, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80456, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 80631, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 80794, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 80968, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 81183, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81392, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 81605, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81764, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 81974, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82138, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82300, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82509, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 82722, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 82912, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83127, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 83329, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 83490, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 83678, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 83877, .adv_w = 384, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 84050, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 84267, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 84495, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 84605, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 84760, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 84933, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 85114, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 85306, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 85473, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 85632, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 85820, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 86000, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 86174, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 86351, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 86553, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 86722, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 86902, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 87107, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 87307, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 87489, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 87689, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 87907, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 88095, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 88263, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 88470, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 88678, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 88896, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 89086, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89295, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 89480, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 89681, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 89835, .adv_w = 384, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90007, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90211, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 90447, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 90658, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 90860, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91073, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91267, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 91494, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 91699, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 91895, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 92086, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92271, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 92478, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 92673, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 92870, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 93062, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 93267, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 93476, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 93658, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 93867, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 94050, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 94248, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 94453, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 94658, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 94883, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 95073, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 95212, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 95347, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 95528, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95730, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 95943, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96146, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 96379, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96600, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 96820, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97032, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97253, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 97455, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 97677, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 97829, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 97963, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 98134, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 98305, .adv_w = 384, .box_w = 20, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 98487, .adv_w = 384, .box_w = 20, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 98657, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 98862, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 99053, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 99263, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 99469, .adv_w = 384, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 99674, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 99870, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 100056, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 100274, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100467, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 100675, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 100835, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 101002, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101178, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 101377, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 101543, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 101713, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 101920, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 102056, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 102250, .adv_w = 384, .box_w = 22, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 102390, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 102568, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102743, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102962, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 103157, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 103351, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 103559, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103779, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103992, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104201, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 104414, .adv_w = 384, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 104623, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 104854, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 105056, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 105208, .adv_w = 384, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 105392, .adv_w = 384, .box_w = 24, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105608, .adv_w = 384, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -2} }; /*--------------------- * CHARACTER MAPPING *--------------------*/ -static const uint16_t unicode_list_1[] = { +static const uint16_t unicode_list_2[] = { 0x0, 0x2f51, 0x4d50, 0x4d5a, 0x4d5b, 0x4d5d, 0x4d7d, 0x4d82, 0x4d8b, 0x4d9b, 0x4da8, 0x4ddc, 0x4dfb, 0x4dfe, 0x4e1b, 0x4e35, 0x4e40, 0x4e46, 0x4e4b, 0x4e4d, 0x4e98, 0x4e9d, 0x4e9e, 0x4e9f, @@ -15277,8 +15536,12 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY }, { - .range_start = 176, .range_length = 40495, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 530, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .range_start = 136, .range_length = 13, .glyph_id_start = 96, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 40495, .glyph_id_start = 109, + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 530, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; @@ -15368,7 +15631,8 @@ static const uint8_t kern_left_class_mapping[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 }; /*Map glyph_ids to kern right classes*/ @@ -15452,7 +15716,8 @@ static const uint8_t kern_right_class_mapping[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 }; /*Kern values between classes*/ @@ -15701,7 +15966,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = { .cmaps = cmaps, .kern_dsc = &kern_classes, .kern_scale = 16, - .cmap_num = 2, + .cmap_num = 3, .bpp = 4, .kern_classes = 1, .bitmap_format = 2, diff --git a/radio/src/fonts/lvgl/lv_font_roboto_24.c b/radio/src/fonts/lvgl/lv_font_roboto_24.c index 1bf1e2c53f6..eecddc71583 100644 --- a/radio/src/fonts/lvgl/lv_font_roboto_24.c +++ b/radio/src/fonts/lvgl/lv_font_roboto_24.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 24 px * Bpp: 4 - * Opts: --no-prefilter --bpp 4 --size 24 --font ../Roboto/Roboto-Regular.ttf -r 0x20-0x7F,0xB0,0xC0-0xFF --format lvgl -o lv_font_roboto_24.c --force-fast-kern-format + * Opts: --no-prefilter --bpp 4 --size 24 --font ../Roboto/Roboto-Regular.ttf -r 0x20-0x7F,0xB0,0xC0-0xFF --font EdgeTX/extra.ttf -r 0x88-0x94 --format lvgl -o lv_font_roboto_24.c --force-fast-kern-format ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -1077,6 +1077,252 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x48, 0xd, 0xfa, 0xab, 0xe4, 0x2, 0x4e, 0xff, 0xd8, 0x9, 0x28, 0x1, 0x8a, 0xbf, 0xd2, 0x20, + /* U+0088 "ˆ" */ + 0x0, 0xff, 0x1b, 0x0, 0x7f, 0xf2, 0x37, 0xc4, + 0x3, 0xff, 0x8c, 0xbf, 0xe9, 0x0, 0xff, 0xe3, + 0x6d, 0xbf, 0x88, 0x7, 0xff, 0x11, 0x7c, 0xc3, + 0xa4, 0x3, 0xff, 0x89, 0xb6, 0x0, 0x6f, 0x20, + 0xf, 0xfe, 0x12, 0xf9, 0x80, 0x5d, 0x40, 0x1f, + 0xfc, 0x2d, 0xb0, 0xc, 0xde, 0x40, 0x1f, 0xfc, + 0x5, 0xf3, 0x0, 0xed, 0xa0, 0xf, 0xfe, 0x6, + 0xd8, 0x7, 0x97, 0xcc, 0x3, 0xfc, 0xde, 0x60, + 0x1f, 0x6d, 0x80, 0x7f, 0xb6, 0xc0, 0x3f, 0x2f, + 0x98, 0x7, 0xe6, 0xf3, 0x0, 0xfe, 0xdc, 0x0, + 0xfd, 0xb6, 0x1, 0xfe, 0x5f, 0x40, 0xf, 0x37, + 0x98, 0x7, 0xfd, 0x98, 0x0, 0xf6, 0xd8, 0x7, + 0xff, 0x1, 0x3d, 0x40, 0x33, 0x79, 0x80, 0x7f, + 0xf0, 0x73, 0x40, 0x37, 0x58, 0x7, 0xff, 0x9, + 0x3d, 0x40, 0xd, 0xf2, 0xef, 0xff, 0xc3, 0xfd, + 0x0, 0x6f, 0xff, 0xf7, 0x77, 0xf9, 0x40, + + /* U+0089 "‰" */ + 0x0, 0xff, 0xe0, 0x1d, 0x6d, 0xa8, 0x7, 0xff, + 0x5, 0x3f, 0x22, 0xbe, 0x0, 0x3f, 0xf8, 0x1d, + 0x40, 0x12, 0xf9, 0x0, 0x79, 0x6b, 0x71, 0xbc, + 0xc0, 0x37, 0x38, 0x6, 0x3d, 0xfb, 0x74, 0xbf, + 0x20, 0xd, 0xae, 0x1, 0x2f, 0xd0, 0x80, 0x5b, + 0xf0, 0x1, 0x1f, 0xa0, 0x0, 0xfe, 0x0, 0x30, + 0xfd, 0x7d, 0x2e, 0x7d, 0x0, 0x5b, 0x40, 0x1c, + 0xde, 0xb, 0xbf, 0xf1, 0x0, 0x1b, 0xc4, 0x3, + 0xaa, 0x80, 0x37, 0xea, 0xda, 0x0, 0xba, 0x0, + 0xf7, 0xb1, 0xf6, 0x90, 0x17, 0x98, 0x7a, 0x80, + 0x71, 0xfc, 0xfd, 0x0, 0x6d, 0x60, 0xf4, 0x0, + 0xe8, 0xff, 0x30, 0x7, 0x5c, 0x7, 0xa0, 0x7, + 0x6e, 0x8c, 0x3, 0xd7, 0x1, 0xec, 0x1, 0x86, + 0xc4, 0x3, 0xed, 0x60, 0xba, 0x0, 0xff, 0xe0, + 0x97, 0x98, 0x2f, 0x90, 0x7, 0xff, 0x2, 0x74, + 0x2, 0xdb, 0x0, 0xff, 0x8f, 0xd4, 0x2, 0x2f, + 0x90, 0xf, 0xe3, 0xe9, 0x0, 0xe4, 0xfb, 0x20, + 0xf, 0x3f, 0xd0, 0x7, 0xc5, 0x7f, 0x90, 0xcf, + 0x5d, 0xee, 0x1, 0xfe, 0x38, 0xbd, 0xca, 0x61, + 0x0, 0xe0, + + /* U+008A "Š" */ + 0x0, 0xe1, 0x1f, 0xc0, 0x1f, 0xf4, 0x7f, 0xfc, + 0x60, 0x1f, 0x84, 0x41, 0x7f, 0xfc, 0xe0, 0x6c, + 0x1, 0xc5, 0xda, 0x22, 0xef, 0xfb, 0x0, 0xbb, + 0xd8, 0x3, 0x17, 0x7d, 0x1, 0xff, 0xc4, 0xf, + 0xfc, 0x22, 0x0, 0x3c, 0xad, 0x88, 0x1, 0xbd, + 0xc0, 0x26, 0x8d, 0xd0, 0x3, 0xbf, 0xc2, 0x1, + 0x9c, 0x3, 0xaf, 0xfc, 0x60, 0xb9, 0x40, 0x1f, + 0xf1, 0xeb, 0x9c, 0xf6, 0x88, 0x7, 0xfc, 0x3f, + 0xeb, 0xb7, 0xf8, 0x40, 0x3f, 0xf8, 0x1d, 0xb2, + 0x48, 0xa0, 0x1f, 0xfc, 0x15, 0x30, 0x2a, 0xf7, + 0x0, 0xff, 0xe0, 0x7f, 0xb0, 0xbf, 0xd6, 0x1, + 0xff, 0x15, 0xfc, 0x3, 0xa4, 0xb0, 0x7, 0xf0, + 0xf4, 0x88, 0x5, 0x9f, 0xe2, 0x0, 0xf8, 0x5f, + 0xfd, 0x0, 0x14, 0xfb, 0xec, 0x80, 0x72, 0x75, + 0xae, 0x88, 0x6, 0x26, 0xff, 0x46, 0xbd, 0xfb, + 0xff, 0x94, 0x3, 0xe6, 0xf8, 0x9f, 0x9c, 0xf7, + 0x9b, 0x10, 0xf, 0xc2, 0x13, 0xed, 0x1c, 0xc0, + 0x1f, 0xfc, 0xd0, + + /* U+008B "‹" */ + 0x0, 0xff, 0xe5, 0x9f, 0x48, 0x0, 0x91, 0x6, + 0x1, 0xfe, 0x2e, 0xcf, 0xf6, 0xff, 0xf5, 0x98, + 0x7, 0x8b, 0xb0, 0x17, 0xfc, 0x82, 0x2, 0xb7, + 0xf2, 0x1, 0x87, 0x70, 0x2, 0x3e, 0xb0, 0xe, + 0x4f, 0xb0, 0x8, 0x7b, 0x44, 0x2, 0x2e, 0xb0, + 0xe, 0x2f, 0x80, 0x8, 0xbf, 0xc2, 0x1, 0x17, + 0x58, 0x7, 0x2f, 0x90, 0x5, 0xfe, 0xd2, 0x0, + 0x1f, 0xc8, 0x7, 0xb6, 0x40, 0x9, 0xe5, 0x9c, + 0x44, 0xea, 0x0, 0xf9, 0xf8, 0x0, 0xdc, 0x0, + 0xce, 0xe5, 0x80, 0x7e, 0x4f, 0x0, 0x3e, 0x0, + 0x57, 0x80, 0x1f, 0xc7, 0xe2, 0xd, 0xa0, 0x1f, + 0xfc, 0x24, 0xf0, 0x2, 0x78, 0x80, 0x7f, 0xf0, + 0x5f, 0x80, 0x2f, 0x60, 0xf, 0xfe, 0xe, 0x48, + 0x5, 0x1c, 0x1, 0xff, 0xc0, 0x5f, 0x20, 0xd, + 0xb6, 0x1, 0xfe, 0x2f, 0x80, 0xe, 0x2e, 0xb1, + 0x0, 0xf9, 0x3e, 0x80, 0x3e, 0x2d, 0xf8, 0x31, + 0x2, 0x5b, 0xf8, 0x0, 0xff, 0x36, 0xff, 0xf5, + 0x18, 0x7, 0xff, 0x4, 0x4d, 0x8, 0x3, 0xf0, + + /* U+008C "Œ" */ + 0x0, 0xf3, 0xff, 0xfb, 0xbb, 0x18, 0x7, 0xb6, + 0x95, 0x7e, 0xbe, 0x0, 0xf1, 0xf9, 0x80, 0x7d, + 0xb0, 0x1, 0xe9, 0xc0, 0xf, 0x8f, 0xc8, 0x3, + 0xde, 0xc0, 0x1f, 0x4e, 0x0, 0x79, 0x7c, 0x40, + 0x3e, 0xf6, 0x0, 0xf5, 0xd0, 0x7, 0xcb, 0xe0, + 0x1f, 0x66, 0x0, 0x3c, 0xbf, 0x20, 0x1f, 0x3f, + 0xc0, 0x6, 0x9f, 0x80, 0xf, 0xe, 0x7f, 0xc0, + 0x1, 0xff, 0x20, 0x7, 0x87, 0x74, 0x43, 0xd0, + 0x15, 0xfe, 0x10, 0xf, 0x57, 0x8, 0x2, 0x38, + 0x7d, 0xb6, 0xc0, 0x38, 0x7d, 0x40, 0x2d, 0x86, + 0xe0, 0x4f, 0x20, 0xc, 0xde, 0x1, 0x1f, 0x96, + 0x48, 0x3, 0xd8, 0x3, 0x46, 0x0, 0x53, 0x85, + 0xe6, 0x0, 0xd7, 0x0, 0xcf, 0xa0, 0x17, 0xb1, + 0xd0, 0x5, 0xcc, 0x1, 0x93, 0xc8, 0x6, 0x4, + 0x3, 0xf, 0xa0, 0x7, 0x75, 0x0, 0x7e, 0x9e, + 0x0, 0xf2, 0xfb, 0x80, 0x79, 0xfd, 0x40, 0x3e, + 0x7f, 0xc5, 0x21, 0x4a, 0xf7, 0x0, 0xfe, 0x3b, + 0xff, 0xd8, 0x80, 0x1f, 0xfc, 0x1, 0x33, 0x8, + 0x7, 0xf0, + + /* U+008D "" */ + 0x0, 0xd7, 0xff, 0xa8, 0x3, 0xf6, 0xa0, 0x89, + 0x6c, 0x3, 0xf6, 0x90, 0x1, 0x2c, 0x3, 0xf6, + 0x90, 0x1, 0x2c, 0x3, 0xf6, 0x90, 0x1, 0x2c, + 0x3, 0x5e, 0xeb, 0xbf, 0xfd, 0xdf, 0xc3, 0xc8, + 0x45, 0x19, 0xe2, 0x11, 0x69, 0x70, 0x80, 0x7f, + 0xb4, 0xb8, 0x80, 0x2, 0x3e, 0x0, 0x69, 0x71, + 0x3, 0xff, 0xf8, 0x1, 0xa5, 0xc4, 0x1, 0xfe, + 0xd3, 0xe2, 0x0, 0xff, 0x69, 0xe9, 0x0, 0x4, + 0x7c, 0x0, 0xd3, 0xd2, 0x7, 0xff, 0xf0, 0x3, + 0x4f, 0x48, 0x3, 0xfd, 0xa7, 0xa6, 0x1, 0xfe, + 0xd3, 0xd4, 0x12, 0x35, 0x5c, 0x86, 0x6d, 0x3b, + 0xee, 0xbf, 0xfd, 0x99, 0x8, 0x6, 0xe2, 0x0, + 0xbc, 0x3, 0xf7, 0x10, 0x5, 0xe0, 0x1f, 0xb8, + 0x80, 0x2f, 0x0, 0xfd, 0xc6, 0x22, 0x2f, 0x0, + 0xfd, 0x9d, 0xdb, 0x40, 0x30, + + /* U+008E "Ž" */ + 0x0, 0xff, 0x1b, 0x3b, 0x20, 0x80, 0x7f, 0xc, + 0xff, 0xfd, 0x41, 0x44, 0x1, 0x8f, 0xbf, 0xff, + 0x83, 0xbd, 0xc0, 0x5, 0xff, 0xa1, 0x8, 0xda, + 0x98, 0x3a, 0xff, 0xf, 0x7f, 0xd6, 0x20, 0x1f, + 0xb9, 0x8a, 0xff, 0xeb, 0x0, 0xff, 0x73, 0x0, + 0x23, 0xfc, 0xa0, 0x1f, 0xee, 0x60, 0x8, 0x6f, + 0xe4, 0x3, 0xfb, 0x98, 0x3, 0x97, 0xb8, 0x80, + 0x1f, 0x73, 0x0, 0x79, 0x3f, 0x44, 0x3, 0xdc, + 0xc0, 0x1c, 0xff, 0x60, 0x1f, 0xb9, 0x80, 0x35, + 0x7b, 0x80, 0x7f, 0x73, 0x0, 0x13, 0xfc, 0x60, + 0x1f, 0xee, 0x60, 0x5f, 0xf8, 0x3, 0xfe, 0xe6, + 0x9f, 0xfd, 0x40, 0x1f, 0xee, 0xfe, 0x40, 0xef, + 0xf5, 0x0, 0x7f, 0x76, 0x10, 0x1, 0x3f, 0xee, + 0x73, 0x12, 0x59, 0x60, 0x80, 0xe, 0x4f, 0xff, + 0xf0, 0x7, 0xe1, 0x9f, 0xff, 0xa8, 0x3, 0xfe, + 0x47, 0x87, 0x51, 0x0, 0x0, + + /* U+008F "" */ + 0x18, 0x8a, 0xae, 0xd3, 0x11, 0xfc, 0xb, 0xf7, + 0x6f, 0xfd, 0x77, 0xfb, 0xd1, 0x78, 0x1, 0xff, + 0x38, 0x7, 0xef, 0x45, 0xe0, 0x7, 0xfc, 0xe0, + 0x11, 0x56, 0xf7, 0x3d, 0x17, 0x80, 0x2, 0x44, + 0x0, 0xc, 0xff, 0xf9, 0x17, 0x80, 0xa, 0xee, + 0x22, 0x77, 0xff, 0xc8, 0xbc, 0x0, 0xef, 0xf4, + 0x80, 0xc7, 0xff, 0x91, 0x78, 0x1, 0xdf, 0xe9, + 0x0, 0x86, 0x33, 0x17, 0xe8, 0xbc, 0x0, 0xdf, + 0xf3, 0x80, 0x7e, 0xf4, 0x5e, 0x0, 0xff, 0xe1, + 0x7a, 0x2f, 0x0, 0x7f, 0xf0, 0xbd, 0x17, 0x80, + 0x1b, 0xfe, 0x80, 0xf, 0xde, 0x8b, 0xc0, 0xe, + 0xff, 0x48, 0x7, 0xef, 0x45, 0xe0, 0x7, 0x7f, + 0xa4, 0x3, 0xf7, 0xa2, 0xf0, 0x1, 0x5d, 0xc4, + 0x1, 0xfb, 0xd1, 0x78, 0x0, 0x26, 0x60, 0xf, + 0xef, 0x45, 0xe0, 0x6, 0xff, 0xa4, 0x3, 0xf7, + 0xa2, 0xf0, 0x3, 0x7f, 0xd4, 0x1, 0xfb, 0xd1, + 0x78, 0x1, 0xbf, 0xe9, 0x0, 0xfd, 0xe8, 0xbf, + 0xff, 0xfc, 0x43, 0x4, 0x4f, 0xfe, 0x20, 0x0, + + /* U+0090 "" */ + 0x0, 0xf9, 0x6f, 0x24, 0x80, 0x3f, 0xe2, 0xaf, + 0xff, 0x6b, 0x0, 0x7e, 0x5f, 0xd5, 0x7e, 0x4f, + 0x39, 0xfb, 0x10, 0xe, 0x5f, 0x90, 0x3, 0x72, + 0x78, 0x0, 0xb7, 0x40, 0x18, 0xbe, 0x0, 0x26, + 0xe4, 0xf0, 0x8, 0x7a, 0x80, 0x2b, 0xc0, 0xc, + 0xdc, 0x9e, 0x1, 0x93, 0xcc, 0x7, 0xd0, 0x3, + 0x37, 0x47, 0x80, 0x76, 0x48, 0x2f, 0x80, 0x72, + 0x7f, 0xb4, 0x3, 0x9f, 0x81, 0xf4, 0x3, 0x10, + 0x80, 0x52, 0xc0, 0x12, 0x78, 0x46, 0x0, 0x49, + 0xfa, 0x20, 0xff, 0xeb, 0x10, 0x4f, 0x6, 0xe0, + 0x3, 0x7e, 0xde, 0x7, 0xe9, 0xef, 0x2a, 0xbc, + 0xf, 0xca, 0x3e, 0x8b, 0x2c, 0x1b, 0xf0, 0xa3, + 0xfd, 0xa0, 0xe, 0xff, 0x41, 0xf4, 0x80, 0x45, + 0x9e, 0xcf, 0xf6, 0x0, 0x8f, 0xe5, 0xf7, 0x0, + 0xf3, 0xff, 0xc0, 0x1b, 0xfe, 0x50, 0xf, 0xd7, + 0xea, 0x1, 0xdf, 0xe6, 0x0, 0xf1, 0x5f, 0xa8, + 0x7, 0xd1, 0xfd, 0x2e, 0xd1, 0x7f, 0xa6, 0x1, + 0xfc, 0x2f, 0x7b, 0xdb, 0x4a, 0x1, 0xe0, + + /* U+0091 "‘" */ + 0x0, 0xe3, 0x53, 0x0, 0xff, 0xe1, 0xb7, 0x7f, + 0xdc, 0x80, 0x1f, 0xfc, 0x7, 0xff, 0xf9, 0x40, + 0x3f, 0xc5, 0xff, 0xfb, 0x84, 0x3, 0xfa, 0x3f, + 0xff, 0x94, 0x0, 0x46, 0x20, 0x1a, 0xbf, 0xff, + 0xa0, 0x6f, 0xfe, 0xa1, 0x0, 0x57, 0xff, 0xf3, + 0xe7, 0xff, 0x58, 0x1, 0xbf, 0xff, 0xa3, 0xff, + 0xe3, 0x0, 0x77, 0xff, 0xd6, 0xff, 0xff, 0x30, + 0x0, 0xff, 0xfd, 0xa2, 0x9f, 0xff, 0x20, 0x4, + 0x5b, 0xff, 0xd8, 0xbd, 0xff, 0xdc, 0x1, 0xa3, + 0xfd, 0x4f, 0x5f, 0xff, 0xc6, 0x1, 0x37, 0xe0, + 0x81, 0xf7, 0xff, 0xe9, 0x0, 0xdf, 0xc2, 0x3, + 0xdf, 0xff, 0xe3, 0x0, 0x37, 0xb8, 0x3, 0x3f, + 0xff, 0xeb, 0x0, 0x57, 0x90, 0x2f, 0xff, 0xff, + 0x4, 0x1, 0x9e, 0x0, 0xcf, 0xff, 0xfe, 0x9, + 0x86, 0xf0, 0x9f, 0xff, 0xff, 0x9, 0x43, 0x3f, + 0xff, 0xf8, 0xa8, 0xd, 0x33, 0x94, 0x8b, 0xff, + 0x80, 0x0, + + /* U+0092 "’" */ + 0x0, 0xff, 0xe6, 0x17, 0x28, 0x7, 0xff, 0xc, + 0x73, 0xd8, 0x3, 0xff, 0x89, 0x9e, 0xe0, 0x1f, + 0xfc, 0x4b, 0xf8, 0x0, 0xff, 0xe2, 0x5f, 0xc0, + 0x7, 0x2a, 0xf2, 0x26, 0x33, 0x6f, 0xc8, 0x6, + 0xdf, 0xff, 0xfe, 0xd, 0x0, 0x5b, 0xff, 0xff, + 0xc2, 0xb0, 0x2, 0x2a, 0xf9, 0x9b, 0xf8, 0xc0, + 0xf, 0x55, 0xd3, 0x3f, 0xe4, 0x1, 0xcf, 0xff, + 0xfe, 0x13, 0x80, 0x59, 0xff, 0xff, 0xc1, 0x70, + 0xd, 0x7f, 0x20, 0x18, 0x46, 0x22, 0x84, 0x3, + 0xab, 0xe4, 0x3, 0xff, 0x89, 0x3f, 0x40, 0x1f, + 0xfc, 0x49, 0xfa, 0x0, 0xff, 0xe2, 0x47, 0xd8, + 0x7, 0xff, 0x11, 0xe0, 0x3, 0xe0, + + /* U+0093 "“" */ + 0x0, 0xf8, 0xd0, 0xc4, 0x3, 0xff, 0x87, 0x3f, + 0xf6, 0x41, 0x0, 0x7f, 0xf0, 0x44, 0x96, 0x7b, + 0xec, 0xc0, 0x3f, 0xca, 0xea, 0x40, 0x5, 0xcf, + 0x90, 0xf, 0xe8, 0xff, 0xba, 0x4, 0x17, 0xb4, + 0x80, 0x3f, 0x85, 0x27, 0xfd, 0x0, 0x30, 0x1, + 0xf9, 0x5d, 0x0, 0x27, 0xfd, 0x0, 0xff, 0x47, + 0xfd, 0x24, 0x4, 0x80, 0x1f, 0xfc, 0x2, 0x7e, + 0xf6, 0x0, 0xfe, 0x27, 0xbc, 0xc5, 0x30, 0xb0, + 0x7, 0xe2, 0xbf, 0x92, 0x0, 0x2e, 0xf3, 0x0, + 0x7c, 0x7d, 0xee, 0x1, 0xc3, 0xbf, 0x0, 0x1c, + 0x5d, 0xfa, 0x0, 0x6c, 0xb1, 0x4, 0xff, 0x30, + 0x6, 0xbf, 0xf4, 0x81, 0xff, 0xd8, 0x0, 0xff, + 0x84, 0x2, 0xdf, 0xf4, 0x2, 0xff, 0xdc, 0x0, + 0xff, 0x88, 0x2, 0x5f, 0xf6, 0x0, 0xf7, 0xfa, + 0x40, 0xbf, 0xd4, 0x1, 0xd1, 0xfe, 0x40, 0x17, + 0x50, 0x5, 0xfe, 0x88, 0x7, 0xa3, 0xfc, 0xc0, + 0x10, 0xd7, 0xe0, 0x80, 0x7e, 0x3a, 0xfe, 0xbc, + 0xfc, 0x60, 0xf, 0xfe, 0x9, 0x19, 0x84, 0x3, + 0xf8, + + /* U+0094 "”" */ + 0x4f, 0xff, 0xee, 0x60, 0xc, 0xde, 0xab, 0xfa, + 0x7d, 0x40, 0x26, 0xe0, 0xf, 0xa, 0x4, 0xfa, + 0x80, 0x1b, 0x80, 0x3c, 0xdc, 0x0, 0xaf, 0x50, + 0x6e, 0x0, 0xf3, 0x70, 0x5, 0x7e, 0xad, 0xc0, + 0x1e, 0x6f, 0x55, 0x8b, 0x39, 0xb8, 0x3, 0xcb, + 0xdd, 0x8d, 0xb9, 0xb8, 0x3, 0xff, 0x80, 0xdc, + 0xdc, 0x1, 0xff, 0xc0, 0x6e, 0x6e, 0x0, 0xff, + 0xe0, 0x37, 0x37, 0x0, 0x7f, 0xf0, 0x1b, 0x9b, + 0x80, 0x3f, 0xf8, 0xd, 0xcd, 0xc0, 0x1f, 0xfc, + 0x6, 0xe6, 0xe0, 0xf, 0xfe, 0x3, 0x73, 0x70, + 0x7, 0xff, 0x1, 0xb9, 0xb8, 0x3, 0xff, 0x80, + 0xdc, 0xdc, 0x1, 0xff, 0xc0, 0x6e, 0x6e, 0x0, + 0xff, 0xe0, 0x37, 0x37, 0xa2, 0x7f, 0xf0, 0x27, + 0x93, 0xff, 0xff, 0x85, 0x80, + /* U+00B0 "°" */ 0x3, 0xcf, 0xc2, 0x1, 0xed, 0x8d, 0xe1, 0x5f, 0x20, 0x1f, 0x56, 0xf1, 0x1, 0xf5, 0x1e, 0xd8, @@ -2073,71 +2319,84 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 6472, .adv_w = 94, .box_w = 2, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, {.bitmap_index = 6493, .adv_w = 130, .box_w = 8, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, {.bitmap_index = 6568, .adv_w = 261, .box_w = 14, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 6600, .adv_w = 143, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 11}, - {.bitmap_index = 6621, .adv_w = 251, .box_w = 16, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6736, .adv_w = 251, .box_w = 16, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6851, .adv_w = 251, .box_w = 16, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6969, .adv_w = 251, .box_w = 16, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7087, .adv_w = 251, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7202, .adv_w = 251, .box_w = 16, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7323, .adv_w = 359, .box_w = 24, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 7445, .adv_w = 250, .box_w = 14, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 7555, .adv_w = 218, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7635, .adv_w = 218, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7714, .adv_w = 218, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7798, .adv_w = 218, .box_w = 12, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7880, .adv_w = 104, .box_w = 6, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 7939, .adv_w = 104, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7995, .adv_w = 104, .box_w = 8, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 8064, .adv_w = 104, .box_w = 9, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 8134, .adv_w = 257, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8237, .adv_w = 274, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8377, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8496, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8613, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8734, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8852, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8970, .adv_w = 205, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 9026, .adv_w = 264, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9150, .adv_w = 249, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9255, .adv_w = 249, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9361, .adv_w = 249, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9471, .adv_w = 249, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9579, .adv_w = 231, .box_w = 15, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9690, .adv_w = 227, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9773, .adv_w = 228, .box_w = 13, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9879, .adv_w = 209, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9960, .adv_w = 209, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10042, .adv_w = 209, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10127, .adv_w = 209, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10214, .adv_w = 209, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10298, .adv_w = 209, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10382, .adv_w = 324, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10493, .adv_w = 201, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 10572, .adv_w = 203, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10649, .adv_w = 203, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10727, .adv_w = 203, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10808, .adv_w = 203, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10888, .adv_w = 95, .box_w = 6, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 10938, .adv_w = 95, .box_w = 6, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10988, .adv_w = 95, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 11046, .adv_w = 95, .box_w = 8, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 11101, .adv_w = 225, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11199, .adv_w = 212, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11285, .adv_w = 219, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11370, .adv_w = 219, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11455, .adv_w = 219, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11543, .adv_w = 219, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11634, .adv_w = 219, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11721, .adv_w = 219, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 11758, .adv_w = 218, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 11850, .adv_w = 212, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11929, .adv_w = 212, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12008, .adv_w = 212, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12090, .adv_w = 212, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12171, .adv_w = 182, .box_w = 12, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 12271, .adv_w = 221, .box_w = 12, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 12378, .adv_w = 182, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = -5} + {.bitmap_index = 6600, .adv_w = 384, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6727, .adv_w = 384, .box_w = 19, .box_h = 21, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6881, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7020, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7164, .adv_w = 384, .box_w = 18, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 7310, .adv_w = 384, .box_w = 14, .box_h = 23, .ofs_x = 5, .ofs_y = -3}, + {.bitmap_index = 7427, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7552, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 7696, .adv_w = 361, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 7839, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7969, .adv_w = 384, .box_w = 18, .box_h = 19, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 8063, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8208, .adv_w = 384, .box_w = 16, .box_h = 20, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 8317, .adv_w = 143, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 8338, .adv_w = 251, .box_w = 16, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8453, .adv_w = 251, .box_w = 16, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8568, .adv_w = 251, .box_w = 16, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8686, .adv_w = 251, .box_w = 16, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8804, .adv_w = 251, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8919, .adv_w = 251, .box_w = 16, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9040, .adv_w = 359, .box_w = 24, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9162, .adv_w = 250, .box_w = 14, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9272, .adv_w = 218, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9352, .adv_w = 218, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9431, .adv_w = 218, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9515, .adv_w = 218, .box_w = 12, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9597, .adv_w = 104, .box_w = 6, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9656, .adv_w = 104, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9712, .adv_w = 104, .box_w = 8, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9781, .adv_w = 104, .box_w = 9, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9851, .adv_w = 257, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9954, .adv_w = 274, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10094, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10213, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10330, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10451, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10569, .adv_w = 264, .box_w = 15, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10687, .adv_w = 205, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 10743, .adv_w = 264, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10867, .adv_w = 249, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10972, .adv_w = 249, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11078, .adv_w = 249, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11188, .adv_w = 249, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11296, .adv_w = 231, .box_w = 15, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11407, .adv_w = 227, .box_w = 13, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11490, .adv_w = 228, .box_w = 13, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11596, .adv_w = 209, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11677, .adv_w = 209, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11759, .adv_w = 209, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11844, .adv_w = 209, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11931, .adv_w = 209, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12015, .adv_w = 209, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12099, .adv_w = 324, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12210, .adv_w = 201, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 12289, .adv_w = 203, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12366, .adv_w = 203, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12444, .adv_w = 203, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12525, .adv_w = 203, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12605, .adv_w = 95, .box_w = 6, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12655, .adv_w = 95, .box_w = 6, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12705, .adv_w = 95, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12763, .adv_w = 95, .box_w = 8, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12818, .adv_w = 225, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12916, .adv_w = 212, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13002, .adv_w = 219, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13087, .adv_w = 219, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13172, .adv_w = 219, .box_w = 12, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13260, .adv_w = 219, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13351, .adv_w = 219, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13438, .adv_w = 219, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 13475, .adv_w = 218, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 13567, .adv_w = 212, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13646, .adv_w = 212, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13725, .adv_w = 212, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13807, .adv_w = 212, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13888, .adv_w = 182, .box_w = 12, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 13988, .adv_w = 221, .box_w = 12, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 14095, .adv_w = 182, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = -5} }; /*--------------------- @@ -2154,11 +2413,15 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY }, { - .range_start = 176, .range_length = 1, .glyph_id_start = 96, + .range_start = 136, .range_length = 13, .glyph_id_start = 96, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 1, .glyph_id_start = 109, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY }, { - .range_start = 192, .range_length = 64, .glyph_id_start = 97, + .range_start = 192, .range_length = 64, .glyph_id_start = 110, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY } }; @@ -2183,15 +2446,16 @@ static const uint8_t kern_left_class_mapping[] = 0, 31, 0, 0, 32, 0, 31, 31, 33, 27, 0, 34, 0, 35, 0, 36, 37, 38, 36, 39, 40, 0, 0, 0, - 0, 6, 6, 6, 6, 6, 6, 0, - 8, 10, 10, 10, 10, 12, 12, 12, - 12, 9, 12, 9, 9, 9, 9, 9, - 0, 0, 13, 13, 13, 13, 23, 0, - 0, 26, 26, 26, 26, 26, 26, 0, - 28, 29, 29, 29, 29, 0, 0, 0, - 0, 0, 31, 33, 33, 33, 33, 33, - 0, 0, 0, 0, 0, 0, 36, 27, - 36 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 6, + 6, 6, 6, 6, 0, 8, 10, 10, + 10, 10, 12, 12, 12, 12, 9, 12, + 9, 9, 9, 9, 9, 0, 0, 13, + 13, 13, 13, 23, 0, 0, 26, 26, + 26, 26, 26, 26, 0, 28, 29, 29, + 29, 29, 0, 0, 0, 0, 0, 31, + 33, 33, 33, 33, 33, 0, 0, 0, + 0, 0, 0, 36, 27, 36 }; /*Map glyph_ids to kern right classes*/ @@ -2209,15 +2473,16 @@ static const uint8_t kern_right_class_mapping[] = 23, 0, 0, 0, 0, 0, 25, 25, 26, 25, 23, 27, 28, 29, 30, 31, 32, 33, 31, 34, 0, 0, 35, 0, - 0, 10, 10, 10, 10, 10, 10, 36, - 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 11, 11, 11, 11, 11, - 0, 11, 15, 15, 15, 15, 19, 0, - 0, 22, 22, 22, 22, 22, 22, 37, - 23, 23, 23, 23, 23, 0, 0, 0, - 0, 0, 25, 26, 26, 26, 26, 26, - 0, 38, 30, 30, 30, 30, 31, 0, - 31 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 10, + 10, 10, 10, 10, 36, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 11, 0, 11, 15, + 15, 15, 15, 19, 0, 0, 22, 22, + 22, 22, 22, 22, 37, 23, 23, 23, + 23, 23, 0, 0, 0, 0, 0, 25, + 26, 26, 26, 26, 26, 0, 38, 30, + 30, 30, 30, 31, 0, 31 }; /*Kern values between classes*/ @@ -2442,7 +2707,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = { .cmaps = cmaps, .kern_dsc = &kern_classes, .kern_scale = 16, - .cmap_num = 3, + .cmap_num = 4, .bpp = 4, .kern_classes = 1, .bitmap_format = 2, diff --git a/radio/src/fonts/lvgl/make_fonts.sh b/radio/src/fonts/lvgl/make_fonts.sh index 8713f8f10ac..9dc02dba232 100755 --- a/radio/src/fonts/lvgl/make_fonts.sh +++ b/radio/src/fonts/lvgl/make_fonts.sh @@ -39,6 +39,18 @@ function make_font() { --format lvgl -o lv_font_${name}_${size}.c --force-fast-kern-format ${arg} } +function make_font_w_extra_sym() { + local name=$1 + local ttf=$2 + local size=$3 + local chars=$4 + local arg=$5 + lv_font_conv --no-prefilter --bpp 4 --size ${size} \ + --font ${TTF_DIR}${ttf} -r ${ASCII},${DEGREE}${chars} \ + --font EdgeTX/extra.ttf -r ${EXTRA_SYM} \ + --format lvgl -o lv_font_${name}_${size}.c --force-fast-kern-format ${arg} +} + function make_font_no_sym() { local name=$1 local ttf=$2 @@ -76,7 +88,7 @@ function make_font_set() { make_font "${name}" "${ttf_normal}" 17 ${chars} --no-compress make_font "${name}_bold" "${ttf_bold}" 16 ${chars} make_font "${name}_bold" "${ttf_bold}" 17 ${chars} - make_font_no_sym "${name}" "${ttf_normal}" 24 ${chars} + make_font_w_extra_sym "${name}" "${ttf_normal}" 24 ${chars} make_font_no_sym "${name}_bold" "${ttf_bold}" 32 ${chars} make_font_no_sym "${name}_bold" "${ttf_bold}" 64 } diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index 3dc03495a69..f88024a00a1 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit 3dc03495a699931acb0c39937f489a3bd9e8c693 +Subproject commit f88024a00a184d720dfc99be2d87d80a533d3580 From bc01eaa609fd16d1211a2e352867d885699cad82 Mon Sep 17 00:00:00 2001 From: Cliff Date: Sat, 1 Oct 2022 20:10:04 -0400 Subject: [PATCH 059/122] fix(color): Prevent occasional false duplicate models (#2429) --- radio/src/gui/colorlcd/model_select.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index 6718c3d8f8b..606b9c52bae 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -382,11 +382,11 @@ void ModelsPageBody::selectModel(ModelCell *model) LEN_MODEL_FILENAME); loadModel(g_eeGeneral.currModelFilename, true); + modelslist.setCurrentModel(model); + storageDirty(EE_GENERAL); storageCheck(true); - modelslist.setCurrentModel(model); - // Exit to main view auto w = Layer::back(); if (w) w->onCancel(); From 723266e3939cd1ddcd97d8de1ca9c3f834cf2a07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20B=C3=A1ny=C3=A1sz?= <36520141+banyaszg@users.noreply.github.com> Date: Sun, 2 Oct 2022 02:59:19 +0200 Subject: [PATCH 060/122] fix(color): Logical switches monitor fix (#2410) * fix(color): Logical switches monitor fix * Direct button style modification. * Using a custom state * Using the default CHECKED style. Adaptation to portrait mode. --- .../gui/colorlcd/view_logical_switches.cpp | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/colorlcd/view_logical_switches.cpp b/radio/src/gui/colorlcd/view_logical_switches.cpp index c011c4fd38f..122fe7fe6ad 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.cpp +++ b/radio/src/gui/colorlcd/view_logical_switches.cpp @@ -25,6 +25,12 @@ #include +#if LCD_W > LCD_H // Landscape + #define BTN_MATRIX_COL 8 +#else // Portrait + #define BTN_MATRIX_COL 4 +#endif + class LogicalSwitchDisplayButton : public TextButton { public: @@ -32,10 +38,6 @@ class LogicalSwitchDisplayButton : public TextButton std::string text, unsigned index) : TextButton(parent, rect, std::move(text), nullptr, OPAQUE), index(index) { - setBgColorHandler([=]() -> LcdFlags { - if (getSwitch(SWSRC_SW1 + index)) return COLOR_THEME_ACTIVE; - return COLOR_THEME_PRIMARY2; - }); } void checkEvents() override @@ -43,9 +45,9 @@ class LogicalSwitchDisplayButton : public TextButton bool newvalue = getSwitch(SWSRC_SW1 + index); if (value != newvalue) { if (newvalue) { - setTextFlags(FONT(BOLD) | COLOR_THEME_SECONDARY1); + lv_obj_add_state(lvobj, LV_STATE_CHECKED); } else { - setTextFlags(FONT(STD) | COLOR_THEME_SECONDARY1); + lv_obj_clear_state(lvobj, LV_STATE_CHECKED); } value = newvalue; invalidate(); @@ -63,7 +65,7 @@ void LogicalSwitchesViewPage::build(FormWindow * window) constexpr coord_t LSW_VIEW_FOOTER_HEIGHT = 20; FormGridLayout grid; grid.spacer(PAGE_PADDING); - grid.setLabelWidth(8); + grid.setLabelWidth(BTN_MATRIX_COL); window->padAll(0); // Footer @@ -79,7 +81,7 @@ void LogicalSwitchesViewPage::build(FormWindow * window) strAppendSigned(&lsString[1], i + 1, 2); auto button = new LogicalSwitchDisplayButton( - window, grid.getFieldSlot(8, i % 8), lsString, i); + window, grid.getFieldSlot(BTN_MATRIX_COL, i % BTN_MATRIX_COL), lsString, i); button->setFocusHandler([=](bool focus) { if (focus) { @@ -88,6 +90,6 @@ void LogicalSwitchesViewPage::build(FormWindow * window) } return 0; }); - if ((i + 1) % 8 == 0) grid.nextLine(); + if ((i + 1) % BTN_MATRIX_COL == 0) grid.nextLine(); } } From 5db27b0b7a400c3ad447a6e7a0e9f5aeb6240d22 Mon Sep 17 00:00:00 2001 From: eshifri <46511024+eshifri@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:11:49 -0700 Subject: [PATCH 061/122] fix(cpn): Crash when "Set Main Screen" GF used and no model exists (#2439) --- companion/src/modeledit/customfunctions.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 17b520e65c2..af6430b6ced 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -510,7 +510,10 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) } else if (func == FuncSetScreen) { fswtchParam[i]->setDecimals(0); fswtchParam[i]->setMinimum(1); - fswtchParam[i]->setMaximum(model->getCustomScreensCount()); + if(model) + fswtchParam[i]->setMaximum(model->getCustomScreensCount()); + else + fswtchParam[i]->setMaximum(1); fswtchParam[i]->setSingleStep(1); cfn.param = fswtchParam[i]->value(); fswtchParam[i]->setValue(cfn.param); From e100500c187d0a48d58291f61b0a20fb7c974a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20B=C3=A1ny=C3=A1sz?= <36520141+banyaszg@users.noreply.github.com> Date: Sun, 2 Oct 2022 08:13:19 +0200 Subject: [PATCH 062/122] fix(color): Remove rem. `Window::setTextFlags()` font change usage (#2440) --- radio/src/gui/colorlcd/message_dialog.cpp | 7 ++++--- radio/src/gui/colorlcd/message_dialog.h | 3 ++- radio/src/gui/colorlcd/model_logical_switches.cpp | 11 +++++++++-- radio/src/gui/colorlcd/special_functions.cpp | 12 +++++++++--- radio/src/gui/colorlcd/view_about.cpp | 4 ++-- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/radio/src/gui/colorlcd/message_dialog.cpp b/radio/src/gui/colorlcd/message_dialog.cpp index 6f971d79670..f0b9bafa0db 100644 --- a/radio/src/gui/colorlcd/message_dialog.cpp +++ b/radio/src/gui/colorlcd/message_dialog.cpp @@ -21,18 +21,19 @@ #include "static.h" MessageDialog::MessageDialog(Window* parent, const char* title, - const char* message, const char* info) : + const char* message, const char* info, + LcdFlags messageFlags, LcdFlags infoFlags) : Dialog(parent, title, {50, 73, LCD_W - 100, LCD_H - 146}) { messageWidget = new StaticText( this, {0, coord_t(height() - PAGE_LINE_HEIGHT) / 2, width(), PAGE_LINE_HEIGHT}, - message, 0, CENTERED); + message, 0, messageFlags); infoWidget = new StaticText(this, {0, 30 + coord_t(height() - PAGE_LINE_HEIGHT) / 2, width(), PAGE_LINE_HEIGHT}, - info, 0, CENTERED); + info, 0, infoFlags); setCloseWhenClickOutside(true); } diff --git a/radio/src/gui/colorlcd/message_dialog.h b/radio/src/gui/colorlcd/message_dialog.h index b9aaee297a2..e52f8a0c094 100644 --- a/radio/src/gui/colorlcd/message_dialog.h +++ b/radio/src/gui/colorlcd/message_dialog.h @@ -28,7 +28,8 @@ class MessageDialog : public Dialog { public: MessageDialog(Window* parent, const char* title, const char* message, - const char* info = ""); + const char* info = "", LcdFlags messageFlags = CENTERED, + LcdFlags infoFlags = CENTERED); void setInfoText(std::string text) { infoWidget->setText(std::move(text)); } diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index 950d94c6f7f..decad63f6ff 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -68,9 +68,13 @@ class LogicalSwitchEditPage: public Page { Page::checkEvents(); if (active != isActive()) { + if(isActive()) { + lv_obj_add_state(headerSwitchName->getLvObj(), LV_STATE_USER_1); + } else { + lv_obj_clear_state(headerSwitchName->getLvObj(), LV_STATE_USER_1); + } + active = isActive(); invalidate(); - headerSwitchName->setTextFlags(isActive() ? FONT(BOLD) | COLOR_THEME_ACTIVE : COLOR_THEME_PRIMARY2); - active = !active; } } @@ -85,6 +89,9 @@ class LogicalSwitchEditPage: public Page {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, getSwitchPositionName(SWSRC_SW1 + index), 0, COLOR_THEME_PRIMARY2); + + lv_obj_set_style_text_color(headerSwitchName->getLvObj(), makeLvColor(COLOR_THEME_ACTIVE), LV_STATE_USER_1); + lv_obj_set_style_text_font(headerSwitchName->getLvObj(), getFont(FONT(BOLD)), LV_STATE_USER_1); } void updateLogicalSwitchOneWindow() diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 2363591ca57..12902548a00 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -60,10 +60,13 @@ class SpecialFunctionEditPage : public Page { Page::checkEvents(); if (active != isActive()) { + if(isActive()) { + lv_obj_add_state(headerSF->getLvObj(), LV_STATE_USER_1); + } else { + lv_obj_clear_state(headerSF->getLvObj(), LV_STATE_USER_1); + } + active = isActive(); invalidate(); - headerSF->setTextFlags(isActive() ? FONT(BOLD) | COLOR_THEME_ACTIVE - : COLOR_THEME_PRIMARY2); - active = !active; } } @@ -80,6 +83,9 @@ class SpecialFunctionEditPage : public Page LCD_W - PAGE_TITLE_LEFT, 20}, (functions == g_model.customFn ? "SF" : "GF") + std::to_string(index+1), 0, COLOR_THEME_PRIMARY2); + + lv_obj_set_style_text_color(headerSF->getLvObj(), makeLvColor(COLOR_THEME_ACTIVE), LV_STATE_USER_1); + lv_obj_set_style_text_font(headerSF->getLvObj(), getFont(FONT(BOLD)), LV_STATE_USER_1); } void updateSpecialFunctionOneWindow() diff --git a/radio/src/gui/colorlcd/view_about.cpp b/radio/src/gui/colorlcd/view_about.cpp index 5d6e9ce7de8..f2e833a3ffd 100644 --- a/radio/src/gui/colorlcd/view_about.cpp +++ b/radio/src/gui/colorlcd/view_about.cpp @@ -37,11 +37,11 @@ const std::string about_str = "EdgeTX" " (" VERSION "-" VERSION_SUFFIX ")"; const std::string copyright_str = "Copyright (C) 2022 EdgeTX"; AboutUs::AboutUs() : - MessageDialog(MainWindow::instance(), STR_ABOUT_US, "") + MessageDialog(MainWindow::instance(), STR_ABOUT_US, "", "", + CENTERED | FONT(BOLD) | COLOR_THEME_SECONDARY1, CENTERED) { content->setRect({(LCD_W - ABOUT_WIDTH) / 2, 20, ABOUT_WIDTH, LCD_H - 40}); - messageWidget->setTextFlags(CENTERED | FONT(BOLD) | COLOR_THEME_SECONDARY1); messageWidget->setTop(content->top() + 40); messageWidget->setHeight(2*PAGE_LINE_HEIGHT); From 8c6e4754916475e42425501c2257af532ba72d82 Mon Sep 17 00:00:00 2001 From: eshifri <46511024+eshifri@users.noreply.github.com> Date: Fri, 30 Sep 2022 03:14:30 -0700 Subject: [PATCH 063/122] fix(color): Unable to paste after Copy/Move of a mixer line (#2423) --- radio/src/gui/colorlcd/model_mixes.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/colorlcd/model_mixes.cpp b/radio/src/gui/colorlcd/model_mixes.cpp index 9a85dfb2560..b0e4e9da243 100644 --- a/radio/src/gui/colorlcd/model_mixes.cpp +++ b/radio/src/gui/colorlcd/model_mixes.cpp @@ -359,7 +359,7 @@ InputMixButton* ModelMixesPage::createLineButton(InputMixGroup *group, uint8_t i _copyMode = COPY_MODE; _copySrc = button; }); - if (s_copyMode != 0) { + if (_copyMode != 0) { menu->addLine(STR_PASTE_BEFORE, [=]() { uint8_t idx = button->getIndex(); pasteMixBefore(idx); @@ -494,13 +494,13 @@ static int _mixChnFromIndex(uint8_t index) void ModelMixesPage::pasteMixBefore(uint8_t dst_idx) { int channel = _mixChnFromIndex(dst_idx); - pasteInput(dst_idx, channel); + pasteMix(dst_idx, channel); } void ModelMixesPage::pasteMixAfter(uint8_t dst_idx) { int channel = _mixChnFromIndex(dst_idx); - pasteInput(dst_idx + 1, channel); + pasteMix(dst_idx + 1, channel); } void ModelMixesPage::build(FormWindow * window) From d0a523519f8ee2d283f45a663d67dfb0fc9c676b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sun, 2 Oct 2022 10:45:34 +0200 Subject: [PATCH 064/122] fix: R9M access subtype (#2211) * Remove sub-type choice for R9M ACCESS modules * pxx2: subtype is only needed for XJT lite and ISRM --- radio/src/gui/colorlcd/module_setup.cpp | 7 +++---- radio/src/pulses/pxx2.cpp | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/colorlcd/module_setup.cpp b/radio/src/gui/colorlcd/module_setup.cpp index ad96a72ac6b..9b9a280997f 100644 --- a/radio/src/gui/colorlcd/module_setup.cpp +++ b/radio/src/gui/colorlcd/module_setup.cpp @@ -273,7 +273,6 @@ void ModuleWindow::updateModule() } }); - if (isModuleBindRangeAvailable(moduleIdx)) { bindButton = new TextButton(box, rect_t{},STR_MODULE_BIND); bindButton->setPressHandler([=]() -> uint8_t { @@ -360,7 +359,7 @@ void ModuleWindow::updateModule() #if defined(PXX2) else if (isModuleRFAccess(moduleIdx)) { -// Register and Range buttons + // Register and Range buttons auto line = newLine(&grid); new StaticText(line, rect_t{}, STR_MODULE, 0, COLOR_THEME_PRIMARY1); @@ -580,7 +579,7 @@ void ModuleSubTypeChoice::update() setSetValueHandler(SET_DEFAULT(md->subType)); setAvailableHandler(nullptr); } - else if (isModuleR9M(moduleIdx)) { + else if (isModuleR9MNonAccess(moduleIdx)) { setMin(MODULE_SUBTYPE_R9M_FCC); setMax(MODULE_SUBTYPE_R9M_LAST); setValues(STR_R9M_REGION); @@ -589,7 +588,7 @@ void ModuleSubTypeChoice::update() setAvailableHandler(nullptr); } #if defined(PXX2) - else if (isModulePXX2(moduleIdx)) { + else if (isModuleISRM(moduleIdx)) { setMin(MODULE_SUBTYPE_ISRM_PXX2_ACCESS); setMax(MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16); setValues(STR_ISRM_RF_PROTOCOLS); diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index bf29ed91cb5..da774f4f2de 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -101,12 +101,12 @@ uint8_t Pxx2Pulses::addFlag0(uint8_t module) void Pxx2Pulses::addFlag1(uint8_t module) { - uint8_t subType; + uint8_t subType = 0; if (isModuleXJT(module)) { static const uint8_t PXX2_XJT_MODULE_SUBTYPES[] = {0x01, 0x03, 0x02}; subType = PXX2_XJT_MODULE_SUBTYPES[min(g_model.moduleData[module].subType, 2)]; } - else { + else if (isModuleISRM(module)) { subType = g_model.moduleData[module].subType; } From ab6e6de881597eab6a04933a63902a3550f18d8d Mon Sep 17 00:00:00 2001 From: richardclli Date: Thu, 6 Oct 2022 14:09:06 +0800 Subject: [PATCH 065/122] fix: TW translation missing line (#2486) --- radio/src/translations/tw.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 7135d22a8b2..30e85375614 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -633,6 +633,7 @@ #define TR_SELECT_MODE "選擇模式" #define TR_CREATE_MODEL "創建模型" #define TR_FAVORITE_LABEL "Favorites" +#define TR_MODELS_MOVED "Unused models moved to" #define TR_NEW_MODEL "New Model" #define TR_INVALID_MODEL "Invalid Model" #define TR_EDIT_LABELS "Edit Labels" From 0dff286dbc66c29f99b95fdce7d26751467bfd37 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Thu, 6 Oct 2022 20:02:19 +1100 Subject: [PATCH 066/122] special funcns: stop data loss in selectin new ch --- companion/src/modeledit/customfunctions.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 3b387e3573c..0a04183bc26 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -333,9 +333,14 @@ void CustomFunctionsPanel::functionEdited() lock = true; int index = sender()->property("index").toInt(); RawSwitch swtch = functions[index].swtch; + int paramTemp =functions[index].param; + functions[index].clear(); functions[index].swtch = swtch; functions[index].func = (AssignFunc)fswtchFunc[index]->currentData().toInt(); + functions[index].param = paramTemp; + strcpy(functions[index].custName, name[index]->text().toLatin1()); + refreshCustomFunction(index); emit modified(); lock = false; From 9d9afebaac464b1754b17bb860a9a89bbccab66a Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 8 Oct 2022 14:15:27 +1100 Subject: [PATCH 067/122] companion: display LS friendly name in Comboxes --- companion/src/firmwares/logicalswitchdata.cpp | 4 ++++ companion/src/firmwares/logicalswitchdata.h | 1 + companion/src/firmwares/rawswitch.cpp | 2 +- companion/src/modeledit/customfunctions.h | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/logicalswitchdata.cpp b/companion/src/firmwares/logicalswitchdata.cpp index 376db3ec0eb..48fd4898f97 100644 --- a/companion/src/firmwares/logicalswitchdata.cpp +++ b/companion/src/firmwares/logicalswitchdata.cpp @@ -117,6 +117,10 @@ QString LogicalSwitchData::nameToString(int index) const { return RadioData::getElementName(tr("L"), index + 1, NULL, true); } +QString LogicalSwitchData::custNameToString() const +{ + return custName; +} void LogicalSwitchData::convert(RadioDataConversionState & cstate) { diff --git a/companion/src/firmwares/logicalswitchdata.h b/companion/src/firmwares/logicalswitchdata.h index 760601006d5..5c683090c75 100644 --- a/companion/src/firmwares/logicalswitchdata.h +++ b/companion/src/firmwares/logicalswitchdata.h @@ -87,6 +87,7 @@ class LogicalSwitchData { unsigned int getRangeFlags() const; QString funcToString() const; QString nameToString(int index) const; + QString custNameToString() const; void convert(RadioDataConversionState & cstate); }; diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp index efeb7adfb6f..5f763cdd506 100644 --- a/companion/src/firmwares/rawswitch.cpp +++ b/companion/src/firmwares/rawswitch.cpp @@ -86,7 +86,7 @@ QString RawSwitch::toString(Board::Type board, const GeneralSettings * const gen case SWITCH_TYPE_VIRTUAL: if (modelData) - return modelData->logicalSw[index].nameToString(index-1); + return modelData->logicalSw[index].nameToString(index-1) + ": " + modelData->logicalSw[index].custNameToString() ; else return LogicalSwitchData().nameToString(index-1); diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index 78b3bdc2c4f..96c2446373d 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -93,7 +93,7 @@ class CustomFunctionsPanel : public GenericPanel QSet tracksSet; QSet scriptsSet; int mediaPlayerCurrent; - QLineEdit *name[CPN_MAX_SPECIAL_FUNCTIONS]; + QLineEdit * name[CPN_MAX_SPECIAL_FUNCTIONS]; QComboBox * fswtchSwtch[CPN_MAX_SPECIAL_FUNCTIONS]; QComboBox * fswtchFunc[CPN_MAX_SPECIAL_FUNCTIONS]; QCheckBox * fswtchParamGV[CPN_MAX_SPECIAL_FUNCTIONS]; From fecb6cf6d2f42d4ff69351a04f34f5eaba288c02 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 8 Oct 2022 14:36:42 +1100 Subject: [PATCH 068/122] Companion: bug: display correct name --- companion/src/firmwares/rawswitch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp index 5f763cdd506..72c8abcf9b5 100644 --- a/companion/src/firmwares/rawswitch.cpp +++ b/companion/src/firmwares/rawswitch.cpp @@ -86,7 +86,7 @@ QString RawSwitch::toString(Board::Type board, const GeneralSettings * const gen case SWITCH_TYPE_VIRTUAL: if (modelData) - return modelData->logicalSw[index].nameToString(index-1) + ": " + modelData->logicalSw[index].custNameToString() ; + return modelData->logicalSw[index].nameToString(index-1) + ": " + modelData->logicalSw[index-1].custNameToString() ; else return LogicalSwitchData().nameToString(index-1); From 2eafa2df895d09d9de2928ec11d05fc3b9d52a8c Mon Sep 17 00:00:00 2001 From: HThuren <99370924+HThuren@users.noreply.github.com> Date: Mon, 3 Oct 2022 05:03:39 +0200 Subject: [PATCH 069/122] feat: More Companion and Radio Danish translation tweaks (#2453) --- companion/src/translations/companion_da.ts | 72 ++++++++++++++++++++-- radio/src/translations/da.h | 46 +++++++------- 2 files changed, 91 insertions(+), 27 deletions(-) diff --git a/companion/src/translations/companion_da.ts b/companion/src/translations/companion_da.ts index 6112d502e4f..55a6c07fb9d 100644 --- a/companion/src/translations/companion_da.ts +++ b/companion/src/translations/companion_da.ts @@ -65,6 +65,66 @@ for unknown reasons. af ukendte årsager. + + Manual + Manuel + + + Startup + Ved programstart + + + Daily + Dagligt + + + Weekly + Ugenligt + + + Monthly + Månedsvis + + + Debug + Fejlsøg + + + Warning + Advarsel + + + Information + + + + Critical + Kritisk + + + Fatal + Fatal + + + None + Ingen + + + Wizard + Guide + + + Editor + + + + Template + Skabelon + + + Prompt + + AppMessages @@ -3411,7 +3471,7 @@ Disse indstillinger gælder for alle modeller. Imperial - Imperial + Imperiel Country Code @@ -4134,7 +4194,7 @@ Tilstand 4: Czech - Tjeckiska + Tjekkisk Slovak @@ -11575,7 +11635,7 @@ Tryk Afbryd for at afslutte kalibrering uden at gemme. - PreferencesDialog + preferencesDialog Preferences Preferencer @@ -11704,6 +11764,10 @@ Tryk Afbryd for at afslutte kalibrering uden at gemme. Information unavailable Information ikke tilgængelig + + Top bar + Top menu + Top Bar Top menu @@ -11741,7 +11805,7 @@ Tryk Afbryd for at afslutte kalibrering uden at gemme. Settings file board (%1) does not match current profile board (%2).\n\nDo you wish to continue? - Rasio indstillinger for (%1) passer ikke sammen med aktuelle profil (%2).\n\nØnsker du at forsætte? + Radio indstillinger for (%1) passer ikke sammen med aktuelle profil (%2).\n\nØnsker du at forsætte? diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index e35fe7e29de..ac40619a104 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -453,13 +453,13 @@ #define TR_SPLASHSCREEN "Start skærm" #define TR_PWR_ON_DELAY "Str til forsinkelse" #define TR_PWR_OFF_DELAY "Str fra forsinkelse" -#define TR_THROTTLE_WARNING TR(INDENT "T-advarsel", INDENT "Gas tilstand") +#define TR_THROTTLE_WARNING TR(INDENT "Gas adv", INDENT "Gas advarsel") #define TR_CUSTOM_THROTTLE_WARNING TR(INDENT INDENT INDENT INDENT "Tilp-Pos", INDENT INDENT INDENT INDENT "Tilpasset position?") #define TR_CUSTOM_THROTTLE_WARNING_VAL TR("Pos. %", "Position %") -#define TR_SWITCHWARNING TR(INDENT "K-advarsel", INDENT "Kontakter position") -#define TR_POTWARNINGSTATE TR(INDENT "Drejk.&Skyd.", INDENT "Drejekontakt & skyder") -#define TR_SLIDERWARNING TR(INDENT "Skyd. pos.", INDENT "Skyder position") -#define TR_POTWARNING TR(INDENT "Drejk. adv.", INDENT "Drejekontakt position") +#define TR_SWITCHWARNING TR(INDENT "Kon. adv", INDENT "Kontakt position") +#define TR_POTWARNINGSTATE TR(INDENT "Drejk.&Skyd.", INDENT "Drejekontakt & skyder position") +#define TR_SLIDERWARNING TR(INDENT "Skyd. pos", INDENT "Skyder position") +#define TR_POTWARNING TR(INDENT "Drejk. adv", INDENT "Drejekontakt position") #define TR_TIMEZONE "Tids zone" #define TR_ADJUST_RTC "Juster RTC" #define TR_GPS "GPS" @@ -501,7 +501,7 @@ #define TR_FREE_STACK "Fri stak" #define TR_INT_GPS_LABEL "Intern GPS" #define TR_HEARTBEAT_LABEL "Hjerte puls" -#define TR_LUA_SCRIPTS_LABEL "Lua program" +#define TR_LUA_SCRIPTS_LABEL "Lua script" #define TR_FREE_MEM_LABEL "Fri mem" #define TR_TIMER_LABEL "Timer" #define TR_THROTTLE_PERCENT_LABEL "Gas %" @@ -579,10 +579,10 @@ #define TR_MULTI_OPTION TR("Tilvalg", "Tilvalg værdi") #define TR_MULTI_AUTOBIND TR(INDENT "Bind Ka.", INDENT "Bind til kanal") #define TR_DISABLE_CH_MAP TR("No Ch. map", "Deaktiver Ch. map") -#define TR_DISABLE_TELEM TR("No Telem", "Deaktiver Telemetri") +#define TR_DISABLE_TELEM TR("No Telem", "Deaktiver telemetri") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Lav strøm", INDENT "Lav strøm tilstand") -#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" +#define TR_MULTI_LNA_DISABLE INDENT "LNA deaktiver" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("TIL", "Aktiveret") #define TR_DISABLE_INTERNAL TR("Deaktiver int.", "Deaktiver intern RF") @@ -611,7 +611,7 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Akt. strøm", "Aktuel strøm") #define TR_AFHDS3_POWER_SOURCE TR("Strøm", "Strøm kilde") -#define TR_SYNCMENU "[Sync]" +#define TR_SYNCMENU "[Synk]" #define TR_LIMIT INDENT "Grænse" #define TR_MINRSSI "Min Rssi" #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Brug FlySky RSSI værdi uden reskalering") @@ -642,7 +642,7 @@ #define TR_ENTER_LABEL "Vælg type" #define TR_LABEL "Type" #define TR_LABELS "Typer" -#define TR_CURRENT_MODEL "Aktuelle" +#define TR_CURRENT_MODEL "Aktuel" #define TR_NEW "Ny" #define TR_NEW_LABEL "Ny type" #define TR_RENAME_LABEL "Omdøb type" @@ -721,11 +721,11 @@ #define TR_LCD "LCD" #define TR_BRIGHTNESS "Skarphed" #define TR_CPU_TEMP "CPU temp." -#define TR_CPU_CURRENT "Current" +#define TR_CPU_CURRENT "CPU strøm" #define TR_CPU_MAH "Forbrug" #define TR_COPROC "CoProc." #define TR_COPROC_TEMP "MB Temp." -#define TR_CAPAWARNING INDENT "Kapasitet lav" +#define TR_CAPAWARNING INDENT "Kapacitet lav" #define TR_TEMPWARNING INDENT "For varm" #define TR_TTL_WARNING "Advarsel: brug 3.3V logisk niveau" #define TR_FUNC "Funk" @@ -777,7 +777,7 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR "Dist adr" #define TR_BLUETOOTH_LOCAL_ADDR "Lokal adr" -#define TR_BLUETOOTH_PIN_CODE "PIN code" +#define TR_BLUETOOTH_PIN_CODE "PIN kode" #define TR_BLUETOOTH_NODEVICES "Ingen enheder fundet" #define TR_BLUETOOTH_SCANNING "Søger..." #define TR_BLUETOOTH_BAUDRATE "BT Baudrate" @@ -824,10 +824,10 @@ #define TR_DEVICE_FILE_WRONG_SIG TR("Enhed file sig.", "Enhed file sig.") #define TR_CURRENT_VERSION TR("Aktuel ver: ", "Aktuel version: ") #define TR_FLASH_INTERNAL_MODULE TR("Brænde int. module", "Brænde intern modul") -#define TR_FLASH_INTERNAL_MULTI TR("Brænde Int. Multi", "Brænde intern Multi") +#define TR_FLASH_INTERNAL_MULTI TR("Brænde int. multi", "Brænde intern multi") #define TR_FLASH_EXTERNAL_MODULE TR("Brænde ext. module", "Brænde ekstern modul") -#define TR_FLASH_EXTERNAL_MULTI TR("Brænde Ext. Multi", "Brænde ekstern Multi") -#define TR_FLASH_EXTERNAL_ELRS TR("Brænde Ext. ELRS", "Brænde ekstern ELRS") +#define TR_FLASH_EXTERNAL_MULTI TR("Brænde ext. multi", "Brænde ekstern multi") +#define TR_FLASH_EXTERNAL_ELRS TR("Brænde ext. ELRS", "Brænde ekstern ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("FW opdatering fejl", "Firmware opdaterings fejl") #define TR_FIRMWARE_UPDATE_SUCCESS "Brændning successful" #define TR_WRITING "Skriver..." @@ -882,15 +882,15 @@ #define TR_RESET_TELEMETRY "Nulstil telemetri" #define TR_STATISTICS "Statistik" #define TR_ABOUT_US "Om" -#define TR_USB_JOYSTICK "USB Joystick (HID)" -#define TR_USB_MASS_STORAGE "USB Storage (SD)" -#define TR_USB_SERIAL "USB Serial (VCP)" +#define TR_USB_JOYSTICK "USB joystick (HID)" +#define TR_USB_MASS_STORAGE "USB lager (SD)" +#define TR_USB_SERIAL "USB seriel (VCP)" #define TR_SETUP_SCREENS "Setup skærm" #define TR_MONITOR_SCREENS "Monitor" #define TR_AND_SWITCH "OG kontakt" #define TR_SF "SF" #define TR_GF "GF" -#define TR_ANADIAGS_CALIB "Kalibreret analoge" +#define TR_ANADIAGS_CALIB "Kalibreret analog" #define TR_ANADIAGS_FILTRAWDEV "Filteret rå analog med deviation" #define TR_ANADIAGS_UNFILTRAW "Ufilteret rå analog" #define TR_ANADIAGS_MINMAX "Min., max. and range" @@ -974,7 +974,7 @@ #define TR_COPY_STICKS_TO_OFS TR("Kopi pind->subtrim", "Kopier pinde til subtrim") #define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Kopi min/max ->alle", "Kopier min/max/center til alle udgange") #define TR_COPY_TRIMS_TO_OFS TR("Kopi trim->subtrim", "Kopier trim til subtrim") -#define TR_INCDEC "Inc/Decrement" +#define TR_INCDEC "Øg/sænk" #define TR_GLOBALVAR "Global var" #define TR_MIXSOURCE "Mix kilde" #define TR_CONSTANT "Konstant" @@ -1019,7 +1019,7 @@ #define TR_LIMITS_HEADERS_CURVE "Kurve" #define TR_LIMITS_HEADERS_PPMCENTER "PPM Center" #define TR_LIMITS_HEADERS_SUBTRIMMODE "Subtrim tilstand" -#define TR_INVERTED "Inverted" +#define TR_INVERTED "Invers" #define TR_LSW_HEADERS_FUNCTION "Funktion" #define TR_LSW_HEADERS_V1 "V1" @@ -1107,7 +1107,7 @@ #define TR_TELEMETRYFULL TR("Alle slots fulde!", "Alle telemetri slots fulde!") #define TR_SERVOS_OK "Servo OK" #define TR_SERVOS_KO "Servo KO" -#define TR_INVERTED_SERIAL INDENT "Invert" +#define TR_INVERTED_SERIAL INDENT "Invers" #define TR_IGNORE_INSTANCE TR(INDENT "Ingen inst.", INDENT "Ignorer instans") #define TR_DISCOVER_SENSORS "Søg efter nye" #define TR_STOP_DISCOVER_SENSORS "Stop" From dd5c5aaa67cb4a4dcf60123c9876305f8234452e Mon Sep 17 00:00:00 2001 From: ulfhedlund <35467815+ulfhedlund@users.noreply.github.com> Date: Mon, 3 Oct 2022 05:04:23 +0200 Subject: [PATCH 070/122] feat: More Swedish Companion and Radio translation tweaks (#2450) * Minor changes for added consistency w. radio * Added translation for #2397 * Additional tweaks * Additional tweaks --- companion/src/translations/companion_sv.ts | 30 +++---- radio/src/translations/se.h | 94 +++++++++++----------- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/companion/src/translations/companion_sv.ts b/companion/src/translations/companion_sv.ts index f0f8d2a3d94..33477e3d747 100644 --- a/companion/src/translations/companion_sv.ts +++ b/companion/src/translations/companion_sv.ts @@ -788,7 +788,7 @@ Mode 4: CalibrationPanel Negative span - Negativa värden + Negativt spann Mid value @@ -796,7 +796,7 @@ Mode 4: Positive span - Positiva värden + Positivt spann @@ -1354,7 +1354,7 @@ Vill du hämta inställningarna från en fil? CurvesPanel Note: to create a curve right click on the curve row label - OBS! För att skapa en kurva, högerklicka på kurvans namn (KUxx) + OBS! För att skapa en kurva, högerklicka på kurvans namn (KU#) CV%1 @@ -1533,11 +1533,11 @@ Vill du hämta inställningarna från en fil? Bind Int. Module - Parkoppla int. modul + Parkoppla (bind) int. modul Bind Ext. Module - Parkoppla ext. modul + Parkoppla (bind) ext. modul Flight @@ -2714,7 +2714,7 @@ Tomt betyder inkludera alla. ?, * och [...] jokertecken accepteras. Use alternative SQT5 font - Använd SQT5-typsnitt + Använd SQT5 typsnitt Pots use in menus navigation @@ -2738,7 +2738,7 @@ Tomt betyder inkludera alla. ?, * och [...] jokertecken accepteras. Use ONLY with first DEV pcb version - + Enable HELI menu and cyclic mix support @@ -2882,7 +2882,7 @@ Tomt betyder inkludera alla. ?, * och [...] jokertecken accepteras. Select if internal ELRS module is installed - + Välj om intern ELRS-modul är installerad Radiomaster T8 @@ -2894,7 +2894,7 @@ Tomt betyder inkludera alla. ?, * och [...] jokertecken accepteras. Support hardware mod: FlySky Paladin EV Gimbals - + Stöd för intern hårdvarumodd: FlySky Paladin EV Gimbals Jumper T18 @@ -3785,7 +3785,7 @@ Dessa inställningar gäller för alla modeller. Wrong data in profile, Switch/pot config not retrieved - Fel data i profilen, brytar-/pot-inställningar lästes inte in + Fel data i profilen, brytar-/pot.inställningar lästes inte in @@ -7745,7 +7745,7 @@ p, li { white-space: pre-wrap; } Bind on channel - Parkoppla via kanal + Parkoppla (bind) via kanal Warning: The internal module protocol <b>%1</b> is incompatible with the hardware internal module <b>%2</b> and has been set to <b>OFF</b>! @@ -7880,7 +7880,7 @@ p, li { white-space: pre-wrap; } Pot Warnings - Pot-varningar + Pot.varningar Other @@ -11587,11 +11587,11 @@ Fel:%1 Max.Expected - Max. förväntade + Max. förväntade No Limit - Ingen gräns + Ingen gräns @@ -11656,7 +11656,7 @@ Fel:%1 Language %1 not listed in %2 - Språk %1 finns inte listad i %2 + Språk '%1' saknas i %2 Choose Language Packs diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index c2ca7d338d2..c7ea5832bbc 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -58,7 +58,7 @@ #define TR_TELEMETRY_PROTOCOLS "FrSky S.Port","FrSky D","FrSky D (sladd)","TBS Crossfire","Spektrum","AFHDS2A IBUS","Multi Telemetry" #define TR_SBUS_INVERSION_VALUES "normal","ej inverterad" #define TR_MULTI_TELEMETRY_MODE "Av","På","Av+Aux","På+Aux" -#define TR_MULTI_CUSTOM "Custom" +#define TR_MULTI_CUSTOM "Anpassad" #define TR_VTRIMINC TR("Expo","Exponentiell"),TR("xFin","Extra fin"),"Fin","Medium","Grov" #define TR_VDISPLAYTRIMS "Nej","Ändring","Ja" #define TR_VBEEPCOUNTDOWN "Tyst","Pip","Röst","Vibrera" @@ -78,7 +78,7 @@ #else #define TR_RETA123 "R","H","G","S","1","2","3" #endif - + #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Addera","Förstärk","Ersätt" #define TR_VMLTPX2 "+=","*=",":=" @@ -355,7 +355,6 @@ #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #endif -#define TR_MENUWHENDONE CENTER "\006" TR_ENTER " AVSLUTAR" #define TR_FREE "kvar" #define TR_YES "Ja" #define TR_NO "Nej" @@ -367,9 +366,9 @@ #define TR_NAME "Namn" #define TR_MODELNAME "Modellnamn" #define TR_PHASENAME "Lägesnamn" -#define TR_MIXNAME TR("Namn","Mixernamn") +#define TR_MIXNAME TR("Mixer","Mixernamn") #define TR_INPUTNAME TR("Input","Inputnamn") -#define TR_EXPONAME TR("Namn","Radnamn") +#define TR_EXPONAME TR("Expo","Exponamn") #define TR_NO_PICTURE "Ingen bild" #define TR_BITMAP "Modellikon" #define TR_TIMER TR("Timer","Timer ") @@ -438,7 +437,7 @@ #define TR_GV TR("G","GV") #endif -#define TR_ACHANNEL "A" +#define TR_ACHANNEL "A\004kanal" #define TR_RANGE INDENT "MinMax" #define TR_CENTER INDENT "Center" #define TR_BAR "Data" @@ -460,7 +459,7 @@ #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Kontrast" #define TR_ALARMS_LABEL "Alarm" -#define TR_BATTERY_RANGE TR("Batt. min-max", "Batteriindikator Min-Max") +#define TR_BATTERY_RANGE TR("Batt. min-max", "Batteriindikator min-max") #define TR_BATTERYCHARGING "Laddar..." #define TR_BATTERYFULL "Batteri fullt" #define TR_BATTERYNONE "None!" @@ -486,8 +485,8 @@ #define TR_BLOFFBRIGHTNESS INDENT "Ljusstyrka av" #define TR_KEYS_BACKLIGHT "Tangentbelysning" #define TR_SPLASHSCREEN "Startbild" -#define TR_PWR_ON_DELAY "Pwr On delay" -#define TR_PWR_OFF_DELAY "Pwr Off delay" +#define TR_PWR_ON_DELAY "Start fördröjn." +#define TR_PWR_OFF_DELAY "Avslut fördröjn." #define TR_BLCOLOR "Färg" #define TR_THROTTLE_WARNING TR(INDENT "Gasvarn.", INDENT "Gasvarning") #define TR_CUSTOM_THROTTLE_WARNING TR(INDENT INDENT INDENT INDENT "Egen pos", INDENT INDENT INDENT INDENT "Egen position?") @@ -499,18 +498,18 @@ #define TR_TIMEZONE "Tidszon" #define TR_ADJUST_RTC "Justera RTC" #define TR_GPS "GPS" -#define TR_RXCHANNELORD TR("Kanalordn. RX","Kanalordning i RX") +#define TR_RXCHANNELORD TR("Kanalordn. Rx","Kanalordning i Rx") #define TR_STICKS "Spakar" #define TR_POTS "Vred" #define TR_SWITCHES "Brytare" //#define TR_SWITCHES_DELAY TR("Brytarfördröj.", "Brytarfördröjning") #define TR_SWITCHES_DELAY TR("Play delay", "Play delay (sw. mid pos)") #define TR_SLAVE "Elev" -#define TR_MODESRC "Läge\006% Källa" +#define TR_MODESRC "Läge\006% källa" #define TR_MULTIPLIER "Styrka" #define TR_CAL "Kal." #define TR_CALIBRATION "Kalibrering" -#define TR_VTRIM "Trim- +" +#define TR_VTRIM "Trimm - +" #define TR_BG "BG:" #define TR_CALIB_DONE "Kalibrering färdig" @@ -529,10 +528,11 @@ // #define TR_SETMIDPOINT TR(CENTER "\004CENTRERA ALLT", CENTER "\004CENTRERA SPAKAR/VRED/REGLAGE") #define TR_MOVESTICKSPOTS CENTER "RÖR SPAKAR/VRED/REGLAGE" // #define TR_MOVESTICKSPOTS CENTER "\006RÖR SPAKAR/VRED/REGLAGE" + #define TR_MENUWHENDONE CENTER "\006" TR_ENTER " AVSLUTAR" #endif -#define TR_RXBATT "RX batt:" -#define TR_TXnRX "TX:\0RX:" +#define TR_RXBATT "Rx batt:" +#define TR_TXnRX "Tx:\0Rx:" #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "DATA SAKNAS" @@ -647,15 +647,15 @@ #define TR_BINDING_CH9_16_TELEM_OFF "Ka9-16 Telem av" #define TR_PROTOCOL_INVALID TR("Prot ogiltigt", "Ogiltigt protokoll") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Modulstatus") -#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Proto Sync Status") -#define TR_MULTI_SERVOFREQ TR("Servofart", "Servouppdaterings-frekvens") +#define TR_MODULE_SYNC TR(INDENT "Synk", INDENT "Proto synk.status") +#define TR_MULTI_SERVOFREQ TR("Servofart", "Servouppdateringsfrekvens") #define TR_MULTI_MAX_THROW TR("Max. utslag", "Aktivera max. utslag") #define TR_MULTI_RFCHAN TR("RF kanal", "Välj RF kanal") #define TR_LIMIT INDENT "Nivå" #define TR_MINRSSI "Min RSSI" -#define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescaling") -#define TR_LATITUDE "Breddgrad" -#define TR_LONGITUDE "Längdgrad" +#define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Använd FlySky RSSI-värde utan skalning") +#define TR_LATITUDE "Latitud" +#define TR_LONGITUDE "Longitud" #define TR_GPS_COORDS_FORMAT TR("GPS-koord.sys", "GPS-koordinatsystem") #define TR_VARIO TR("Vario", "Variometer") #define TR_PITCH_AT_ZERO "Ton vid noll" @@ -673,7 +673,7 @@ #define TR_SELECT_MODE "Välj läge" #define TR_CREATE_MODEL "Skapa modell" #define TR_FAVORITE_LABEL "Favoriter" -#define TR_MODELS_MOVED "Unused models moved to" +#define TR_MODELS_MOVED "Oanvända modeller flyttade till" #define TR_NEW_MODEL "Ny modell" #define TR_INVALID_MODEL "Ogiltig modell" #define TR_EDIT_LABELS "Redigera etiketter" @@ -698,8 +698,8 @@ #define TR_SDCARD "SD-kort" #define TR_NO_FILES_ON_SD "Inga filer på SD!" #define TR_NO_SDCARD "SD-kort saknas" -#define TR_WAITING_FOR_RX "Väntar på RX..." -#define TR_WAITING_FOR_TX "Väntar på TX..." +#define TR_WAITING_FOR_RX "Väntar på Rx..." +#define TR_WAITING_FOR_TX "Väntar på Tx..." #define TR_WAITING_FOR_MODULE TR("Inväntar modul", "Inväntar radiomodulen...") #define TR_NO_TOOLS "Inga verktyg tillgängliga" #define TR_NORMAL "Normal" @@ -713,9 +713,9 @@ #define TR_8CH_WITH_TELEMETRY TR("8KA med telem.", "8 KA med telemetri") #define TR_EXT_ANTENNA "Ext. antenn" #define TR_PIN "Pin" -#define TR_UPDATE_RX_OPTIONS "Uppdatera RX alternativ?" -#define TR_UPDATE_TX_OPTIONS "Uppdatera TX alternativ?" -#define TR_MODULES_RX_VERSION "Moduler / RX version" +#define TR_UPDATE_RX_OPTIONS "Uppdatera Rx alternativ?" +#define TR_UPDATE_TX_OPTIONS "Uppdatera Tx alternativ?" +#define TR_MODULES_RX_VERSION "Moduler / Rx version" #define TR_MENU_MODULES_RX_VERSION "MODULER / RX VERSION" #define TR_MENU_FIRM_OPTIONS "FIRMWAREFUNKTIONER" #define TR_IMU "IMU" @@ -725,7 +725,7 @@ #define TR_RF_PROTOCOL "RF Protokoll" #define TR_MODULE_OPTIONS "Modulalternativ" #define TR_POWER "Power" -#define TR_NO_TX_OPTIONS "Inga TX alternativ" +#define TR_NO_TX_OPTIONS "Inga TX-alternativ" #define TR_RTC_BATT "RTC Batteri" #define TR_POWER_METER_EXT "Power Meter (EXT)" #define TR_POWER_METER_INT "Power Meter (INT)" @@ -748,7 +748,7 @@ #define TR_FAILSAFEWARN "FAILSAFE-" #define TR_TEST_WARNING TR("TEST", "TESTBYGGE") #define TR_TEST_NOTSAFE "Använd endast för test" -#define TR_SDCARDVERSIONWARN "SD Card Check" +#define TR_SDCARDVERSIONWARN "SD-kortkontroll" #define TR_WRONG_SDCARDVERSION TR("Förväntad ver: ","Förväntad version: ") #define TR_WARN_RTC_BATTERY_LOW "RTC-batteriet lågt" #define TR_WARN_MULTI_LOWPOWER "Lågeffektläge" @@ -805,14 +805,14 @@ #define TR_SAMPLE_MODE TR("Sample mod.", "Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" -#define TR_SELECT_TEMPLATE_FOLDER "VÄLJ EN MALLKATALOG:" -#define TR_SELECT_TEMPLATE "VÄLJ EN MODELLMALL:" -#define TR_NO_TEMPLATES "Ingen modellmall finns i denna katalog" -#define TR_SAVE_TEMPLATE "Spara som mall" -#define TR_BLANK_MODEL "Tom modell" -#define TR_BLANK_MODEL_INFO "Skapa en tom modell" -#define TR_FILE_EXISTS "FILEN FINNS REDAN" -#define TR_ASK_OVERWRITE "Vill du skriva över?" +#define TR_SELECT_TEMPLATE_FOLDER "VÄLJ EN MALLKATALOG:" +#define TR_SELECT_TEMPLATE "VÄLJ EN MODELLMALL:" +#define TR_NO_TEMPLATES "Ingen modellmall finns i denna katalog" +#define TR_SAVE_TEMPLATE "Spara som mall" +#define TR_BLANK_MODEL "Tom modell" +#define TR_BLANK_MODEL_INFO "Skapa en tom modell" +#define TR_FILE_EXISTS "FILEN FINNS REDAN" +#define TR_ASK_OVERWRITE "Vill du skriva över?" #define TR_BLUETOOTH "Bluetooth" #define TR_BLUETOOTH_DISC "Upptäck" @@ -852,8 +852,8 @@ #define TR_FLASH_DEVICE TR("Flash device","Flash device") #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" -#define TR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA "Flash RX by ext. OTA" -#define TR_FLASH_RECEIVER_BY_INTERNAL_MODULE_OTA "Flash RX by int. OTA" +#define TR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA "Flash Rx by ext. OTA" +#define TR_FLASH_RECEIVER_BY_INTERNAL_MODULE_OTA "Flash Rx by int. OTA" #define TR_FLASH_FLIGHT_CONTROLLER_BY_EXTERNAL_MODULE_OTA "Flash FC by ext. OTA" #define TR_FLASH_FLIGHT_CONTROLLER_BY_INTERNAL_MODULE_OTA "Flash FC by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") @@ -943,7 +943,7 @@ #define TR_BYTES "byte" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) #define TR_POWERMETER_ATTN_NEEDED "Attenuator behövs" -#define TR_PXX2_SELECT_RX "Välj RX" +#define TR_PXX2_SELECT_RX "Välj Rx" #define TR_PXX2_DEFAULT "" #define TR_BT_SELECT_DEVICE "Välj enhet" #define TR_DISCOVER "Upptäck" @@ -974,7 +974,7 @@ #endif #define TR_MODELIDUNIQUE "ID är unikt" #define TR_MODULE "Modul" -#define TR_RX_NAME "RX namn" +#define TR_RX_NAME "Rx namn" #define TR_TELEMETRY_TYPE "Telemetrityp" #define TR_TELEMETRY_SENSORS "Sensorer" #define TR_VALUE "Värde" @@ -982,10 +982,10 @@ #define TR_ENABLE "Aktivera" #define TR_TOPLCDTIMER "Översta LCD timer" #define TR_UNIT "Enhet" -#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till..." +#define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till..." #define TR_CHANNELRANGE TR(INDENT "Kanalomr.", INDENT "Kanalområde") -#define TR_RXFREQUENCY TR("RX frekv.", "RX frekvens") -#define TR_AFHDS3_RX_FREQ TR("RX frekv", "RX frekvens") +#define TR_RXFREQUENCY TR("Rx frekv.", "Rx frekvens") +#define TR_AFHDS3_RX_FREQ TR("Rx frekv", "Rx frekvens") #define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") @@ -1005,7 +1005,7 @@ #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Kräver FCC" #define TR_MODULE_PROTOCOL_EU_WARN_LINE1 "Kräver EU" #define TR_MODULE_PROTOCOL_WARN_LINE2 "certifierad firmware" -#define TR_LOWALARM INDENT "Låg-alarm" +#define TR_LOWALARM INDENT "Lågalarm" #define TR_CRITICALALARM INDENT "Kritiskt alarm" #define TR_RSSIALARM_WARN TR("RSSI","TELEMETRI RSSI") #define TR_NO_RSSIALARM TR(INDENT "Alarm inaktiverade", INDENT "Telemetrialarm inaktiverade") @@ -1131,8 +1131,8 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA uppdatering..." #define TR_MODULE_RESET "Module reset..." -#define TR_UNKNOWN_RX "Okänd RX" -#define TR_UNSUPPORTED_RX "RX stöds ej" +#define TR_UNKNOWN_RX "Okänd Rx" +#define TR_UNSUPPORTED_RX "Rx stöds ej" #define TR_OTA_UPDATE_ERROR "OTA uppdateringsfel" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Höjd" @@ -1374,9 +1374,9 @@ #define TR_ADD_ALL_TRIMS_TO_SUBTRIMS "Addera alla trimmar till subtrimmar" #if LCD_W > LCD_H - #define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmonitorn" + #define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmonitorn" #else - #define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmon." + #define TR_OPEN_CHANNEL_MONITORS "Öppna kanalmon." #endif #define TR_DUPLICATE "Duplicera" From 8969bf2551d69d58d555b68efd58ebc3ebfd042e Mon Sep 17 00:00:00 2001 From: Cliff Date: Sun, 2 Oct 2022 23:04:47 -0400 Subject: [PATCH 071/122] fix: Correct errors in labels.yml if modelname is full length (#2448) --- radio/src/storage/modelslist.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index c62d04bcc18..f461195595d 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -941,8 +941,10 @@ void ModelMap::updateModelCell(ModelCell *cell) TRACE("Labels: Updating model %s", cell->modelFilename); readModelYaml(cell->modelFilename, (uint8_t *)model, sizeof(ModelData)); - strcpy(cell->modelName, model->header.name); - strcpy(cell->modelBitmap, model->header.bitmap); + strncpy(cell->modelName, model->header.name, LEN_MODEL_NAME); + cell->modelName[LEN_MODEL_NAME] = '\0'; + strncpy(cell->modelBitmap, model->header.bitmap, LEN_BITMAP_NAME); + cell->modelBitmap[LEN_BITMAP_NAME] = '\0'; LabelsVector labels = ModelMap::fromCSV(model->header.labels); for(const auto &lbl : labels ) { modelslabels.addLabelToModel(lbl,cell); @@ -1137,7 +1139,8 @@ bool ModelsList::loadYaml() TRACE_LABELS(" Created a modelcell for %s, not in labels.yml", filehash.name.c_str()); model = new ModelCell(filehash.name.c_str()); - strcpy(model->modelFinfoHash, filehash.hash); + strncpy(model->modelFinfoHash, filehash.hash, FILE_HASH_LENGTH); + model->modelFinfoHash[FILE_HASH_LENGTH] = '\0'; modelslist.push_back(model); filehash.celladded = true; model->_isDirty = true; From 86119f67ac6821a20921ec3b4d2f8f51d296517c Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 3 Oct 2022 05:13:12 +0200 Subject: [PATCH 072/122] fix(color): various menu toolbar fixes (#2445) * fix: various toolbar fixes * chore: Bump `libopenui` Also pulls in #2446 fix --- radio/src/gui/colorlcd/sourcechoice.cpp | 10 +++++----- radio/src/gui/colorlcd/switchchoice.cpp | 10 ++++++---- radio/src/thirdparty/libopenui | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/radio/src/gui/colorlcd/sourcechoice.cpp b/radio/src/gui/colorlcd/sourcechoice.cpp index e82d61b648d..f3ce07f1dda 100644 --- a/radio/src/gui/colorlcd/sourcechoice.cpp +++ b/radio/src/gui/colorlcd/sourcechoice.cpp @@ -66,14 +66,15 @@ SourceChoice::SourceChoice(Window* parent, const rect_t &rect, int16_t vmin, ChoiceEx(parent, rect, vmin, vmax, getValue, setValue) { setBeforeDisplayMenuHandler([=](Menu *menu) { - menu->setToolbar(new SourceChoiceMenuToolbar(this, menu)); + auto tb = new SourceChoiceMenuToolbar(this, menu); + menu->setToolbar(tb); + #if defined(AUTOSOURCE) menu->setWaitHandler([=]() { int16_t val = getMovedSource(vmin); if (val) { - fillMenu(menu); + tb->resetFilter(); menu->select(getIndexFromValue(val)); - // TODO: reset toolbar } #if defined(AUTOSWITCH) else { @@ -81,9 +82,8 @@ SourceChoice::SourceChoice(Window* parent, const rect_t &rect, int16_t vmin, if (swtch && !IS_SWITCH_MULTIPOS(swtch)) { val = switchToMix(swtch); if (val && (val >= vmin) && (val <= vmax)) { - fillMenu(menu); + tb->resetFilter(); menu->select(getIndexFromValue(val)); - // TODO: reset toolbar } } } diff --git a/radio/src/gui/colorlcd/switchchoice.cpp b/radio/src/gui/colorlcd/switchchoice.cpp index bff7526149b..4baba4c0f55 100644 --- a/radio/src/gui/colorlcd/switchchoice.cpp +++ b/radio/src/gui/colorlcd/switchchoice.cpp @@ -58,9 +58,11 @@ SwitchChoice::SwitchChoice(Window* parent, const rect_t& rect, int vmin, ChoiceEx(parent, rect, vmin, vmax, getValue, setValue) { setBeforeDisplayMenuHandler([=](Menu* menu) { - menu->setToolbar(new SwitchChoiceMenuToolbar(this, menu)); + auto tb = new SwitchChoiceMenuToolbar(this, menu); + menu->setToolbar(tb); + #if defined(AUTOSWITCH) - menu->setWaitHandler([menu, this, setValue]() { + menu->setWaitHandler([menu, this, setValue, tb]() { swsrc_t val = 0; swsrc_t swtch = getMovedSwitch(); if (swtch) { @@ -73,9 +75,9 @@ SwitchChoice::SwitchChoice(Window* parent, const rect_t& rect, int vmin, val = swtch; } if (val && (!isValueAvailable || isValueAvailable(val))) { - fillMenu(menu); + // if (filtered) fillMenu(menu); + tb->resetFilter(); menu->select(getIndexFromValue(val)); - // TODO: reset toolbar } } }); diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index f88024a00a1..47441631c87 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit f88024a00a184d720dfc99be2d87d80a533d3580 +Subproject commit 47441631c874af06eda1f4749cb6fa1631fc67ac From 4df7e50c8d710a26a78c9b1797b1f01cd219311e Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 3 Oct 2022 13:14:17 +0200 Subject: [PATCH 073/122] fix(lua): Touch events preventing rotary encoder events being detected (#2458) Fixes #2457 --- radio/src/gui/colorlcd/standalone_lua.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/radio/src/gui/colorlcd/standalone_lua.cpp b/radio/src/gui/colorlcd/standalone_lua.cpp index cd6c3624817..793fcec7794 100644 --- a/radio/src/gui/colorlcd/standalone_lua.cpp +++ b/radio/src/gui/colorlcd/standalone_lua.cpp @@ -56,6 +56,9 @@ StandaloneLuaWindow::StandaloneLuaWindow() : lcdBuffer(BMP_RGB565, LCD_W, LCD_H), popup({50, 73, LCD_W - 100, LCD_H - 146}) { + lv_obj_clear_flag(lvobj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_clear_flag(lvobj, LV_OBJ_FLAG_CLICK_FOCUSABLE); + // setup LUA event handler setupHandler(this); } From 037c4ad16a5d0c62d833ab221eb498fff068c838 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 6 Oct 2022 08:10:48 +0200 Subject: [PATCH 074/122] fix(color): set current model after label update (#2476) * fix(color): set current model after label update Fixes #2460 Here Companion only outputs a more or less empty labels file, so that models are scanned on startup, however not setting the current model properly in this particular case. * fix(color): bitmap name in modelslist should be zero terminated --- radio/src/storage/modelslist.cpp | 2 ++ radio/src/storage/modelslist.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index f461195595d..3694b2ec86e 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -1144,6 +1144,8 @@ bool ModelsList::loadYaml() modelslist.push_back(model); filehash.celladded = true; model->_isDirty = true; + if(filehash.curmodel == true) + modelslist.setCurrentModel(model); } } diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 14ddb30c7a9..89909f57ef5 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -77,7 +77,7 @@ class ModelCell char modelName[LEN_MODEL_NAME + 1] = ""; char modelFinfoHash[FILE_HASH_LENGTH + 1] = ""; #if LEN_BITMAP_NAME > 0 - char modelBitmap[LEN_BITMAP_NAME] = ""; + char modelBitmap[LEN_BITMAP_NAME + 1] = ""; #endif gtime_t lastOpened = 0; bool _isDirty = true; From 085d4aebc63932ee56d1766c03ce1d45758b3778 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 6 Oct 2022 08:39:26 +0200 Subject: [PATCH 075/122] fix(color): Changes to widget options not always being saved (#2475) * fixes issue https://github.com/EdgeTX/edgetx/issues where a change of the source value in widget settings was not written back to the model .yml file. * fixes https://github.com/EdgeTX/edgetx/pull/2475 extended force write to .yml to all widget settings option types * fixes issue https://github.com/EdgeTX/edgetx/issues/2465 where a change of the source value in widget settings was not written back to the model .yml file. * https://github.com/EdgeTX/edgetx/issues/2465 extended force write to .yml to all widget settings option types * removed unnecessary SET_DIRTY() for ModelTextEdit() as it is already handled by ModelTextEdit() changed indent for SET_DIRTY() in lambda for Choice() * removed unnecessary SET_DIRTY() for ModelTextEdit() as it is already handled by ModelTextEdit() changed indent for SET_DIRTY() in lambda for Choice() --- radio/src/gui/colorlcd/widget_settings.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/gui/colorlcd/widget_settings.cpp b/radio/src/gui/colorlcd/widget_settings.cpp index 5465a7730fb..c7054b5bf18 100644 --- a/radio/src/gui/colorlcd/widget_settings.cpp +++ b/radio/src/gui/colorlcd/widget_settings.cpp @@ -69,6 +69,7 @@ WidgetSettings::WidgetSettings(Window* parent, Widget* widget) : }, [=](int32_t newValue) { widget->getOptionValue(optIdx)->signedValue = newValue; + SET_DIRTY(); }); break; @@ -81,6 +82,7 @@ WidgetSettings::WidgetSettings(Window* parent, Widget* widget) : [=](int16_t newValue) { widget->getOptionValue(optIdx)->unsignedValue = (uint32_t)newValue; + SET_DIRTY(); }); break; @@ -128,6 +130,7 @@ WidgetSettings::WidgetSettings(Window* parent, Widget* widget) : [=](int newValue) { // setValue widget->getOptionValue(optIdx)->unsignedValue = (uint32_t)newValue; + SET_DIRTY(); }); tmChoice->setTextHandler([](int value) { @@ -146,6 +149,7 @@ WidgetSettings::WidgetSettings(Window* parent, Widget* widget) : [=](int16_t newValue) { // setValue widget->getOptionValue(optIdx)->unsignedValue = (uint32_t)newValue; + SET_DIRTY(); }); break; From fec87e14eabf48eb0026eaf6b4d9ed04f28fc19d Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 6 Oct 2022 08:41:51 +0200 Subject: [PATCH 076/122] chore: Remove unnecessary BREAKSPACE (#2432) and streamline translation definitions. --- radio/src/translations.h | 6 +++++- radio/src/translations/cn.h | 14 +------------- radio/src/translations/cz.h | 32 +++++++++++--------------------- radio/src/translations/da.h | 22 +++++----------------- radio/src/translations/de.h | 19 ++++--------------- radio/src/translations/en.h | 22 +++++----------------- radio/src/translations/es.h | 12 ------------ radio/src/translations/fr.h | 13 +------------ radio/src/translations/it.h | 26 +++++++------------------- radio/src/translations/nl.h | 22 +++++----------------- radio/src/translations/pl.h | 12 ------------ radio/src/translations/pt.h | 12 ------------ radio/src/translations/se.h | 14 +------------- radio/src/translations/tw.h | 14 +------------- 14 files changed, 46 insertions(+), 194 deletions(-) diff --git a/radio/src/translations.h b/radio/src/translations.h index 964ba40b466..76c8e6ab8e5 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -95,8 +95,12 @@ #if defined(COLORLCD) #define BUTTON(x) x + #define INDENT #else - #define BUTTON(x) "[" x "]" + #define BUTTON(x) "[" x "]" + #define INDENT "\001" + #define LEN_INDENT 1 + #define INDENT_WIDTH (FW/2) #endif #if (LCD_W == 212) diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 5bb014f7a20..1037046c2d1 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -283,18 +283,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)", "=(整体)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") -#if defined(COLORLCD) - #define INDENT - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" - #else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" @@ -328,7 +316,7 @@ #define TR_FREE "空闲" #define TR_YES "是" #define TR_NO "否" -#define TR_DELETEMODEL "删除" BREAKSPACE "模型" +#define TR_DELETEMODEL "删除 模型" #define TR_COPYINGMODEL "复制模型..." #define TR_MOVINGMODEL "移动模型..." #define TR_LOADINGMODEL "载入模型..." diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index b1bfdbc5fd7..fdfae6e77bc 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -301,23 +301,13 @@ #define TR_TIMER_DIR TR("Zbývající", "Zobrazit zbývající"), TR("Uplynulý", "Zobrazit uplynulý") // ZERO TERMINATED STRINGS + #if defined(COLORLCD) - #define INDENT "\007" - #define LEN_INDENT 1 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else -#define INDENT "\001" -#define LEN_INDENT 1 -#define INDENT_WIDTH (FW/2) -#define BREAKSPACE " " -#endif -#if defined(COLORLCD) -#if defined(BOLD) -#define TR_FONT_SIZES "STD" -#else -#define TR_FONT_SIZES "STD","BOLD","XXS","XS","L","XL","XXL" -#endif + #if defined(BOLD) + #define TR_FONT_SIZES "STD" + #else + #define TR_FONT_SIZES "STD","BOLD","XXS","XS","L","XL","XXL" + #endif #endif #if defined(PCBTARANIS) || defined(PCBHORUS) @@ -346,7 +336,7 @@ #define TR_FREE TR("volné:", "volných") #define TR_YES "Ano" #define TR_NO "Ne" -#define TR_DELETEMODEL "SMAZAT" BREAKSPACE "MODEL" +#define TR_DELETEMODEL "SMAZAT MODEL" #define TR_COPYINGMODEL "Kopíruji model..." #define TR_MOVINGMODEL "Přesouvám model..." #define TR_LOADINGMODEL "Aktivuji model..." @@ -751,10 +741,10 @@ #define TR_DELAY "Zdržet" #define TR_SD_CARD "SD" #define TR_SDHC_CARD "SD-HC" -#define TR_NO_SOUNDS_ON_SD "žádný zvuk" BREAKSPACE "na SD" -#define TR_NO_MODELS_ON_SD "žádný model" BREAKSPACE "na SD" -#define TR_NO_BITMAPS_ON_SD "žádné obrázky" BREAKSPACE "na SD" -#define TR_NO_SCRIPTS_ON_SD "žádný skript" BREAKSPACE "na SD" +#define TR_NO_SOUNDS_ON_SD "žádný zvuk na SD" +#define TR_NO_MODELS_ON_SD "žádný model na SD" +#define TR_NO_BITMAPS_ON_SD "žádné obrázky na SD" +#define TR_NO_SCRIPTS_ON_SD "žádný skript na SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntaktická chyba", "Syntaktická chyba skriptu") #define TR_SCRIPT_PANIC "Script zmaten" #define TR_SCRIPT_KILLED "Script ukončen" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index ac40619a104..a326bee4eab 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -283,18 +283,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center kun)","= (symmetrisk)" #define TR_TIMER_DIR TR("Rest", "Vis rest"), TR("Gået tid", "Vis gået tid") -#if defined(COLORLCD) - #define INDENT - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" @@ -328,7 +316,7 @@ #define TR_FREE "fri" #define TR_YES "Ja" #define TR_NO "Nej" -#define TR_DELETEMODEL "SLET" BREAKSPACE "MODEL" +#define TR_DELETEMODEL "SLET MODEL" #define TR_COPYINGMODEL "Kopier model..." #define TR_MOVINGMODEL "Flytter model..." #define TR_LOADINGMODEL "Indlæser model..." @@ -735,10 +723,10 @@ #define TR_DELAY "Forsinkelse" #define TR_SD_CARD "SD CARD" #define TR_SDHC_CARD "SD-HC CARD" -#define TR_NO_SOUNDS_ON_SD "Ingen lyde" BREAKSPACE "på SD" -#define TR_NO_MODELS_ON_SD "Ingen modeller" BREAKSPACE "på SD" -#define TR_NO_BITMAPS_ON_SD "Ingen bitmapper" BREAKSPACE "på SD" -#define TR_NO_SCRIPTS_ON_SD "Ingen scripts" BREAKSPACE "på SD" +#define TR_NO_SOUNDS_ON_SD "Ingen lyde på SD" +#define TR_NO_MODELS_ON_SD "Ingen modeller på SD" +#define TR_NO_BITMAPS_ON_SD "Ingen bitmapper på SD" +#define TR_NO_SCRIPTS_ON_SD "Ingen scripts på SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntax fejl", "Script syntax fejl") #define TR_SCRIPT_PANIC "Script panik" #define TR_SCRIPT_KILLED "Script dræbt" diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 1e54abff8a1..1ee7179403b 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -287,17 +287,6 @@ #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") // ZERO TERMINATED STRINGS -#if defined(COLORLCD) - #define INDENT " " - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif #if defined(COLORLCD) #if defined(BOLD) @@ -734,10 +723,10 @@ #define TR_DELAY "Verzögerung" #define TR_SD_CARD "SD-Karte" #define TR_SDHC_CARD "SDHC-Karte" -#define TR_NO_SOUNDS_ON_SD "Keine Töne" BREAKSPACE "auf SD" -#define TR_NO_MODELS_ON_SD "Kein Modelle" BREAKSPACE "auf SD" -#define TR_NO_BITMAPS_ON_SD "Keine Bitmaps" BREAKSPACE "auf SD" -#define TR_NO_SCRIPTS_ON_SD "Keine Skripte" BREAKSPACE "auf SD" +#define TR_NO_SOUNDS_ON_SD "Keine Töne auf SD" +#define TR_NO_MODELS_ON_SD "Kein Modelle auf SD" +#define TR_NO_BITMAPS_ON_SD "Keine Bitmaps auf SD" +#define TR_NO_SCRIPTS_ON_SD "Keine Skripte auf SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntaxfehler", "Skript Syntaxfehler") #define TR_SCRIPT_PANIC "Skript Panik" #define TR_SCRIPT_KILLED "Skript beendet" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 3fe75f47d40..4ca7ec7144b 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -283,18 +283,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symmetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") -#if defined(COLORLCD) - #define INDENT - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" @@ -328,7 +316,7 @@ #define TR_FREE "free" #define TR_YES "Yes" #define TR_NO "No" -#define TR_DELETEMODEL "DELETE" BREAKSPACE "MODEL" +#define TR_DELETEMODEL "DELETE MODEL" #define TR_COPYINGMODEL "Copying model..." #define TR_MOVINGMODEL "Moving model..." #define TR_LOADINGMODEL "Loading model..." @@ -735,10 +723,10 @@ #define TR_DELAY "Delay" #define TR_SD_CARD "SD CARD" #define TR_SDHC_CARD "SD-HC CARD" -#define TR_NO_SOUNDS_ON_SD "No sounds" BREAKSPACE "on SD" -#define TR_NO_MODELS_ON_SD "No models" BREAKSPACE "on SD" -#define TR_NO_BITMAPS_ON_SD "No bitmaps" BREAKSPACE "on SD" -#define TR_NO_SCRIPTS_ON_SD "No scripts" BREAKSPACE "on SD" +#define TR_NO_SOUNDS_ON_SD "No sounds on SD" +#define TR_NO_MODELS_ON_SD "No models on SD" +#define TR_NO_BITMAPS_ON_SD "No bitmaps on SD" +#define TR_NO_SCRIPTS_ON_SD "No scripts on SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntax error", "Script syntax error") #define TR_SCRIPT_PANIC "Script panic" #define TR_SCRIPT_KILLED "Script killed" diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index 894c928e328..6e3ac2aad48 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -283,18 +283,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") -#if defined(COLORLCD) - #define INDENT - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index aa3f61b6f78..438bd68b335 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -304,17 +304,6 @@ #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") // ZERO TERMINATED STRINGS -#if defined(COLORLCD) - #define INDENT - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif #if defined(COLORLCD) #if defined(BOLD) @@ -350,7 +339,7 @@ #define TR_FREE "disp" #define TR_YES "Yes" #define TR_NO "No" -#define TR_DELETEMODEL "SUPPRIMER" BREAKSPACE "MODELE" +#define TR_DELETEMODEL "SUPPRIMER MODELE" #define TR_COPYINGMODEL "Copie..." #define TR_MOVINGMODEL "Déplacement..." #define TR_LOADINGMODEL "Chargement..." diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index 28b21c5c867..5754d358820 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -288,18 +288,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Riman.", "Mostra Riman."), TR("Trasc.", "Mostra Trascorso") -#if defined(COLORLCD) - #define INDENT "\007" - #define LEN_INDENT 1 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" @@ -335,7 +323,7 @@ #define TR_FREE "Disp." #define TR_YES "Si" #define TR_NO "No" -#define TR_DELETEMODEL "CANCELLA" BREAKSPACE "MODELLO" +#define TR_DELETEMODEL "CANCELLA MODELLO" #define TR_COPYINGMODEL "Copia in corso.." #define TR_MOVINGMODEL "Spostamento..." #define TR_LOADINGMODEL "Caricamento..." @@ -715,7 +703,7 @@ #define TR_WRONG_PCBREV "PCB sbagliato" #define TR_EMERGENCY_MODE "MODALITA' EMERGENZA" #define TR_PCBREV_ERROR "Errore PCB" -#define TR_NO_FAILSAFE "Failsafe" BREAKSPACE "non settato" +#define TR_NO_FAILSAFE "Failsafe non settato" #define TR_KEYSTUCK "Tasto bloccato" #define TR_INVERT_THR "Inverti Mot?" #define TR_VOLUME "Volume Audio" @@ -736,10 +724,10 @@ #define TR_DELAY "Ritardo" #define TR_SD_CARD "SD Card" #define TR_SDHC_CARD "SD-HC Card" -#define TR_NO_SOUNDS_ON_SD "No Suoni" BREAKSPACE "su SD" -#define TR_NO_MODELS_ON_SD "No Model." BREAKSPACE "su SD" -#define TR_NO_BITMAPS_ON_SD "No Immag." BREAKSPACE "su SD" -#define TR_NO_SCRIPTS_ON_SD "No Scripts" BREAKSPACE "su SD" +#define TR_NO_SOUNDS_ON_SD "No Suoni su SD" +#define TR_NO_MODELS_ON_SD "No Model. su SD" +#define TR_NO_BITMAPS_ON_SD "No Immag. su SD" +#define TR_NO_SCRIPTS_ON_SD "No Scripts su SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Errore sintassi", "Script errore sintassi") #define TR_SCRIPT_PANIC "Script panico" #define TR_SCRIPT_KILLED "Script fermato" @@ -828,7 +816,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Prog. MULTI int.", "Programma MULTI interno") #define TR_FLASH_EXTERNAL_MULTI TR("Prog. MULTI est.", "Programma MULTI esterno") #define TR_FIRMWARE_UPDATE_ERROR TR(INDENT "Errore agg. FW",INDENT "Errore aggiornamento firmware") -#define TR_FIRMWARE_UPDATE_SUCCESS "Aggiornamento" BREAKSPACE "riuscito" +#define TR_FIRMWARE_UPDATE_SUCCESS "Aggiornamento riuscito" #define TR_WRITING "Scrittura..." #define TR_CONFIRM_FORMAT "Confermi formattazione?" #define TR_INTERNALRF "Modulo interno" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index e273dc82d88..4b449cc07ce 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -288,18 +288,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") -#if defined(COLORLCD) - #define INDENT - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" @@ -333,7 +321,7 @@ #define TR_FREE "vrij" #define TR_YES "Yes" #define TR_NO "No" -#define TR_DELETEMODEL "WIS" BREAKSPACE "MODEL" +#define TR_DELETEMODEL "WIS MODEL" #define TR_COPYINGMODEL "Kopieer Model" #define TR_MOVINGMODEL "Verplaats Model" #define TR_LOADINGMODEL "Laad Model..." @@ -741,10 +729,10 @@ #define TR_DELAY "Vertrag." #define TR_SD_CARD "SD-Card" #define TR_SDHC_CARD "SD-HC CARD" -#define TR_NO_SOUNDS_ON_SD "Geen Geluiden" BREAKSPACE "op SD" -#define TR_NO_MODELS_ON_SD "Geen Modellen" BREAKSPACE "op SD" -#define TR_NO_BITMAPS_ON_SD "Geen Bitmaps" BREAKSPACE "op SD" -#define TR_NO_SCRIPTS_ON_SD "Geen Scripts" BREAKSPACE "op SD" +#define TR_NO_SOUNDS_ON_SD "Geen Geluiden op SD" +#define TR_NO_MODELS_ON_SD "Geen Modellen op SD" +#define TR_NO_BITMAPS_ON_SD "Geen Bitmaps op SD" +#define TR_NO_SCRIPTS_ON_SD "Geen Scripts op SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntax error", "Script syntax error") #define TR_SCRIPT_PANIC "Script panic" #define TR_SCRIPT_KILLED "Script killed" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index 0655008e82c..455afbb58b3 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -283,18 +283,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") -#if defined(COLORLCD) - #define INDENT "\007" - #define LEN_INDENT 1 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 2d4aa6a36c5..c20c820402f 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -281,18 +281,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") -#if defined(COLORLCD) - #define INDENT - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index c7ea5832bbc..4e01de2c1e4 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -312,18 +312,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA " (endast center)","= (symmetrisk)" #define TR_TIMER_DIR TR("Återst.", "Visa återstående"), TR("Förbrukad", "Visa förbrukad") -#if defined(COLORLCD) - #define INDENT - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" -#else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" @@ -358,7 +346,7 @@ #define TR_FREE "kvar" #define TR_YES "Ja" #define TR_NO "Nej" -#define TR_DELETEMODEL "RADERA" BREAKSPACE "MODELL" +#define TR_DELETEMODEL "RADERA MODELL" #define TR_COPYINGMODEL "Kopierar..." #define TR_MOVINGMODEL "Flyttar..." #define TR_LOADINGMODEL "Laddar..." diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 30e85375614..7f345e73fe6 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -283,18 +283,6 @@ #define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)","=(整體)" #define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed") -#if defined(COLORLCD) -#define INDENT - #define LEN_INDENT 3 - #define INDENT_WIDTH 12 - #define BREAKSPACE "\036" - #else - #define INDENT "\001" - #define LEN_INDENT 1 - #define INDENT_WIDTH (FW/2) - #define BREAKSPACE " " -#endif - #if defined(COLORLCD) #if defined(BOLD) #define TR_FONT_SIZES "STD" @@ -328,7 +316,7 @@ #define TR_FREE "空閒" #define TR_YES "是" #define TR_NO "否" -#define TR_DELETEMODEL "刪除" BREAKSPACE "模型" +#define TR_DELETEMODEL "刪除 模型" #define TR_COPYINGMODEL "複製模型..." #define TR_MOVINGMODEL "移動模型..." #define TR_LOADINGMODEL "載入模型..." From 2c6f78e112edbf8ef06be816ff8d7af883e47651 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 6 Oct 2022 09:19:20 +0200 Subject: [PATCH 077/122] fix(color): some lines containing boxes could be scrolled horizontally (#2471) --- radio/src/gui/colorlcd/channel_range.cpp | 1 + radio/src/gui/colorlcd/module_setup.cpp | 4 ++++ radio/src/gui/colorlcd/timer_setup.cpp | 3 +++ 3 files changed, 8 insertions(+) diff --git a/radio/src/gui/colorlcd/channel_range.cpp b/radio/src/gui/colorlcd/channel_range.cpp index 2590451cffc..2b28241a8d2 100644 --- a/radio/src/gui/colorlcd/channel_range.cpp +++ b/radio/src/gui/colorlcd/channel_range.cpp @@ -28,6 +28,7 @@ ChannelRange::ChannelRange(Window* parent) : FormGroup(parent, rect_t{}) { setFlexLayout(LV_FLEX_FLOW_ROW); + lv_obj_set_width(lvobj, LV_SIZE_CONTENT); } void ChannelRange::build() diff --git a/radio/src/gui/colorlcd/module_setup.cpp b/radio/src/gui/colorlcd/module_setup.cpp index 9b9a280997f..3c6593350d4 100644 --- a/radio/src/gui/colorlcd/module_setup.cpp +++ b/radio/src/gui/colorlcd/module_setup.cpp @@ -123,6 +123,7 @@ FailsafeChoice::FailsafeChoice(Window* parent, uint8_t moduleIdx) : FormGroup(parent, rect_t{}) { setFlexLayout(LV_FLEX_FLOW_ROW); + lv_obj_set_width(lvobj, LV_SIZE_CONTENT); auto md = &g_model.moduleData[moduleIdx]; auto choice = @@ -245,6 +246,7 @@ void ModuleWindow::updateModule() new StaticText(line, rect_t{},""); auto box = new FormGroup(line, rect_t{}); box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8)); + lv_obj_set_width(box->getLvObj(), LV_SIZE_CONTENT); idUnique = new StaticText(box, rect_t{}, "", 0, 0); updateIDStaticText(moduleIdx); } @@ -254,6 +256,7 @@ void ModuleWindow::updateModule() auto box = new FormGroup(line, rect_t{}); box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8)); + lv_obj_set_width(box->getLvObj(), LV_SIZE_CONTENT); // Model index auto modelId = &g_model.header.modelId[moduleIdx]; @@ -726,6 +729,7 @@ ModulePage::ModulePage(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP) auto box = new FormGroup(line, rect_t{}); box->setFlexLayout(LV_FLEX_FLOW_ROW); + lv_obj_set_width(box->getLvObj(), LV_SIZE_CONTENT); ModuleData* md = &g_model.moduleData[moduleIdx]; auto moduleChoice = new Choice(box, rect_t{}, STR_INTERNAL_MODULE_PROTOCOLS, diff --git a/radio/src/gui/colorlcd/timer_setup.cpp b/radio/src/gui/colorlcd/timer_setup.cpp index cc8f387356d..0a285261aad 100644 --- a/radio/src/gui/colorlcd/timer_setup.cpp +++ b/radio/src/gui/colorlcd/timer_setup.cpp @@ -65,6 +65,8 @@ TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS) auto form = new FormGroup(&body, rect_t{}); form->setFlexLayout(); + form->padAll(lv_dpx(8)); + FlexGridLayout grid(line_col_dsc, line_row_dsc, 2); TimerData* p_timer = &g_model.timers[timer]; @@ -116,6 +118,7 @@ TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS) auto box = new FormGroup(line, rect_t{}); box->setFlexLayout(LV_FLEX_FLOW_ROW); + lv_obj_set_width(box->getLvObj(), LV_SIZE_CONTENT); new Choice(box, rect_t{}, STR_VBEEPCOUNTDOWN, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1, GET_SET_DEFAULT(p_timer->countdownBeep)); From 5efadccd9bb3739ee22ff6d3203724c9bd4c74d6 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 6 Oct 2022 12:03:39 +0200 Subject: [PATCH 078/122] fix(multi): set bind status explicitly when aborted manually (#2455) * fix(multi): set bind status explicitly when aborted manually Fixes #2263 * fix: adjust MPM bind status on B&W as well --- radio/src/gui/128x64/model_setup.cpp | 9 ++++++--- radio/src/gui/212x64/model_setup.cpp | 9 ++++++--- radio/src/gui/colorlcd/module_setup.cpp | 5 +++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7d91d33d322..ea2f099de40 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1641,9 +1641,12 @@ void menuModelSetup(event_t event) moduleState[moduleIdx].mode = newFlag; #if defined(MULTIMODULE) - if (isModuleMultimodule(moduleIdx) && - (newFlag == MODULE_MODE_BIND)) { - setMultiBindStatus(moduleIdx, MULTI_BIND_INITIATED); + if (isModuleMultimodule(moduleIdx) && (oldFlag != newFlag)) { + if (newFlag == MODULE_MODE_BIND) { + setMultiBindStatus(moduleIdx, MULTI_BIND_INITIATED); + } else if (getMultiBindStatus(moduleIdx) != MULTI_BIND_NONE) { + setMultiBindStatus(moduleIdx, MULTI_BIND_NONE); + } } #endif if (isModuleDSMP(moduleIdx) && diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index be56ca6f0a7..795caef3bdf 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1435,9 +1435,12 @@ void menuModelSetup(event_t event) } moduleState[moduleIdx].mode = newFlag; #if defined(MULTIMODULE) - if (isModuleMultimodule(moduleIdx) && - (newFlag == MODULE_MODE_BIND)) { - setMultiBindStatus(moduleIdx, MULTI_BIND_INITIATED); + if (isModuleMultimodule(moduleIdx) && (oldFlag != newFlag)) { + if (newFlag == MODULE_MODE_BIND) { + setMultiBindStatus(moduleIdx, MULTI_BIND_INITIATED); + } else if (getMultiBindStatus(moduleIdx) != MULTI_BIND_NONE) { + setMultiBindStatus(moduleIdx, MULTI_BIND_NONE); + } } #endif if (isModuleDSMP(moduleIdx) && diff --git a/radio/src/gui/colorlcd/module_setup.cpp b/radio/src/gui/colorlcd/module_setup.cpp index 3c6593350d4..11d5480ea30 100644 --- a/radio/src/gui/colorlcd/module_setup.cpp +++ b/radio/src/gui/colorlcd/module_setup.cpp @@ -284,6 +284,11 @@ void ModuleWindow::updateModule() } if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; +#if defined(MULTIMODULE) + if (isModuleMultimodule(moduleIdx)) { + setMultiBindStatus(moduleIdx, MULTI_BIND_NONE); + } +#endif #if defined(AFHDS2) if (isModuleFlySky(moduleIdx)) resetPulsesAFHDS2(); #endif From 9d4fe9b6befcbe0dc536bd6cb05c83e72b7058a6 Mon Sep 17 00:00:00 2001 From: Malte Langermann <54738901+gagarinlg@users.noreply.github.com> Date: Thu, 6 Oct 2022 12:15:31 +0200 Subject: [PATCH 079/122] fix(color): Missing highlight of the Min/Max value in output editor (#2480) * fix(gui): add missing highlight of the Min/Max value in output editor acccording to the input * change outputs min/max highlight * output min/max highlight the right way * chore: Bump `libopenui` --- radio/src/gui/colorlcd/output_edit.cpp | 20 ++++++++++++++------ radio/src/gui/colorlcd/output_edit.h | 3 +++ radio/src/thirdparty/libopenui | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/colorlcd/output_edit.cpp b/radio/src/gui/colorlcd/output_edit.cpp index 0d731117f04..1a44e48ebdf 100644 --- a/radio/src/gui/colorlcd/output_edit.cpp +++ b/radio/src/gui/colorlcd/output_edit.cpp @@ -83,13 +83,19 @@ void OutputEditWindow::checkEvents() value = newValue; int chanVal = calcRESXto100(channelOutputs[channel]); - minText->setBackgroundColor(chanVal < chanZero - 1 ? COLOR_THEME_ACTIVE - : 0U); + minText->setBackgroudOpacity(chanVal < chanZero - 1 ? LV_OPA_COVER : LV_OPA_TRANSP); + minText->setFont(chanVal < chanZero - 1 ? FONT(BOLD) : FONT(STD)); minText->invalidate(); - maxText->setBackgroundColor(chanVal > chanZero + 1 ? COLOR_THEME_ACTIVE - : 0U); + lv_obj_set_style_text_font(minEdit->getLvObj(), getFont(chanVal < chanZero - 1 ? FONT(BOLD) : FONT(STD)), 0); + minEdit->invalidate(); + + maxText->setBackgroudOpacity(chanVal > chanZero + 1 ? LV_OPA_COVER : LV_OPA_TRANSP); + maxText->setFont(chanVal > chanZero + 1 ? FONT(BOLD) : FONT(STD)); maxText->invalidate(); + lv_obj_set_style_text_font(maxEdit->getLvObj(), getFont(chanVal > chanZero + 1 ? FONT(BOLD) : FONT(STD)), 0); + maxEdit->invalidate(); } + Window::checkEvents(); } @@ -137,13 +143,15 @@ void OutputEditWindow::buildBody(FormWindow* form) // Min line = form->newLine(&grid); minText = new StaticText(line, rect_t{}, TR_MIN, 0, COLOR_THEME_PRIMARY1); - new GVarNumberEdit(line, rect_t{}, -limit, 0, GET_SET_DEFAULT(output->min), + minEdit = new GVarNumberEdit(line, rect_t{}, -limit, 0, GET_SET_DEFAULT(output->min), PREC1, -LIMIT_STD_MAX); + minText->setBackgroundColor(COLOR_THEME_ACTIVE); // Max maxText = new StaticText(line, rect_t{}, TR_MAX, 0, COLOR_THEME_PRIMARY1); - new GVarNumberEdit(line, rect_t{}, 0, +limit, GET_SET_DEFAULT(output->max), + maxEdit = new GVarNumberEdit(line, rect_t{}, 0, +limit, GET_SET_DEFAULT(output->max), PREC1, +LIMIT_STD_MAX); + maxText->setBackgroundColor(COLOR_THEME_ACTIVE); // Direction line = form->newLine(&grid); diff --git a/radio/src/gui/colorlcd/output_edit.h b/radio/src/gui/colorlcd/output_edit.h index ab10ab08fc4..d95478ee75f 100644 --- a/radio/src/gui/colorlcd/output_edit.h +++ b/radio/src/gui/colorlcd/output_edit.h @@ -23,6 +23,7 @@ #include "page.h" #include "form.h" +#include "gvar_numberedit.h" #include "static.h" class OutputEditStatusBar; @@ -37,7 +38,9 @@ class OutputEditWindow : public Page int value = 0; int chanZero = 0; StaticText *minText; + GVarNumberEdit* minEdit; StaticText *maxText; + GVarNumberEdit* maxEdit; OutputEditStatusBar *statusBar = nullptr; void checkEvents() override; diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index 47441631c87..45c22ed5f35 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit 47441631c874af06eda1f4749cb6fa1631fc67ac +Subproject commit 45c22ed5f35898b94d59b39da2bf930d48d06eed From ea671e9934cfd4a99e3419e49dd70d0a1d718b5e Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Sat, 8 Oct 2022 13:46:33 +1000 Subject: [PATCH 080/122] fix(color): Reduce menu outline to two pixels --- radio/src/thirdparty/libopenui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index 45c22ed5f35..630db9a4ee0 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit 45c22ed5f35898b94d59b39da2bf930d48d06eed +Subproject commit 630db9a4ee00982a92064ee7c6fc288e5c882f4b From f988a82a1163c9436f7afb9c450909e1811362cd Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 8 Oct 2022 16:47:57 +1100 Subject: [PATCH 081/122] companion: dynamily populate list with LS name --- companion/src/modeledit/customfunctions.cpp | 13 +++++++++++++ companion/src/modeledit/customfunctions.h | 1 + 2 files changed, 14 insertions(+) diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 0a04183bc26..f70079b4019 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -136,6 +136,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchSwtch[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); fswtchSwtch[i]->setMaxVisibleItems(10); connect(fswtchSwtch[i], SIGNAL(currentIndexChanged(int)), this, SLOT(customFunctionEdited())); + connect(fswtchSwtch[i], SIGNAL(LogicalSwitchesPanel::editingFinished()), this, SLOT(refreshSwitchComboBoxes())); tableLayout->addWidget(i, 1, fswtchSwtch[i]); // The function @@ -235,6 +236,18 @@ CustomFunctionsPanel::~CustomFunctionsPanel() delete tabModelFactory; delete tabFilterFactory; } +void CustomFunctionsPanel::refreshSwitchComboBoxes() +{ + // The switch + for (int i = 0; i < fswCapability; i++) { + fswtchSwtch[i]->setProperty("index", i); + fswtchSwtch[i]->setModel(tabFilterFactory->getItemModel(rawSwitchId)); + fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(functions[i].swtch.toValue())); + fswtchSwtch[i]->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); + fswtchSwtch[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); + fswtchSwtch[i]->setMaxVisibleItems(10); + } +} void CustomFunctionsPanel::onMediaPlayerStateChanged(QMediaPlayer::State state) { diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index 96c2446373d..9f6f81a3562 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -47,6 +47,7 @@ class CustomFunctionsPanel : public GenericPanel private slots: void customFunctionEdited(); void nameEdited(); + void refreshSwitchComboBoxes(); void functionEdited(); void onCustomContextMenuRequested(QPoint pos); void refreshCustomFunction(int index, bool modified=false); From 21fc7a1f212a9f03e4cf87e24abbd0e142a3977c Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 8 Oct 2022 19:13:51 +1100 Subject: [PATCH 082/122] TODO: put LS friendly name on radio output window. --- companion/src/simulation/radiooutputswidget.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/companion/src/simulation/radiooutputswidget.cpp b/companion/src/simulation/radiooutputswidget.cpp index a71e3098b39..3b3b072cecd 100644 --- a/companion/src/simulation/radiooutputswidget.cpp +++ b/companion/src/simulation/radiooutputswidget.cpp @@ -282,6 +282,11 @@ void RadioOutputsWidget::setupLsDisplay() QWidget * RadioOutputsWidget::createLogicalSwitch(QWidget * parent, int switchNo) { + //TODO: place logicSwitch friendly name on radio output window. + //int modelindex = RadioData().generalSettings.currModelIndex; + //ModelData &model = RadioData().models[modelindex]; + //QString namestring = model.logicalSw[switchNo].custName; + QLabel * swtch = new QLabel(parent); swtch->setAutoFillBackground(true); swtch->setFrameStyle(QFrame::Panel | QFrame::Raised); @@ -297,7 +302,8 @@ QWidget * RadioOutputsWidget::createLogicalSwitch(QWidget * parent, int switchNo #endif font.setBold(false); swtch->setFont(font); - swtch->setText(QString("%1").arg(switchNo+1, 2, 10, QChar('0'))); + swtch->setText(QString("%1").arg(switchNo+1, 2, 10, QChar('0')) ); + //swtch->setText(QString("%1").arg(switchNo+1, 2, 10, QChar('0')) + ": " + namestring); swtch->setAlignment(Qt::AlignCenter); m_logicSwitchMap.insert(switchNo, swtch); return swtch; From b438f184b61e5703341afa7da4102c8a874c506e Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 9 Oct 2022 15:27:34 +1100 Subject: [PATCH 083/122] display friendly LS name on viewlayout --- radio/src/gui/colorlcd/view_logical_switches.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/view_logical_switches.h b/radio/src/gui/colorlcd/view_logical_switches.h index 75208400930..80e53181e26 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.h +++ b/radio/src/gui/colorlcd/view_logical_switches.h @@ -51,7 +51,17 @@ class LogicalSwitchDisplayFooter : public Window LogicalSwitchData* cs = lswAddress(index); LcdFlags textColor = COLOR_THEME_PRIMARY2; - dc->drawTextAtIndex(10, 1, STR_VCSWFUNC, cs->func, textColor); + + + + //LS friendly name + const char* chrs = cs->custName; + if(strlen(chrs) > 0){ + dc->drawText(15, 1, cs->custName, textColor); + }else{ + dc->drawTextAtIndex(5, 1, STR_VCSWFUNC, cs->func, textColor); + } + // CSW params unsigned int cstate = lswFamily(cs->func); From 56a0330216398c15517815940d88508dcd0fdfa9 Mon Sep 17 00:00:00 2001 From: elecpower Date: Mon, 10 Oct 2022 08:38:21 +1100 Subject: [PATCH 084/122] cpn: refresh all model refs to LS when name changed. UI tweaks. --- companion/src/firmwares/customfunctiondata.h | 4 +- companion/src/firmwares/logicalswitchdata.cpp | 8 +-- companion/src/firmwares/logicalswitchdata.h | 14 +++--- companion/src/firmwares/rawsource.cpp | 2 +- companion/src/firmwares/rawswitch.cpp | 4 +- companion/src/modeledit/customfunctions.cpp | 50 +++++++------------ companion/src/modeledit/customfunctions.h | 3 +- companion/src/modeledit/logicalswitches.cpp | 31 ++++++------ companion/src/modeledit/logicalswitches.h | 7 +-- 9 files changed, 49 insertions(+), 74 deletions(-) diff --git a/companion/src/firmwares/customfunctiondata.h b/companion/src/firmwares/customfunctiondata.h index 2ebdb6a754b..58cfe067f67 100644 --- a/companion/src/firmwares/customfunctiondata.h +++ b/companion/src/firmwares/customfunctiondata.h @@ -27,6 +27,8 @@ #include #include +#define CF_CUSTNAME_LEN 10 + class Firmware; class ModelData; class GeneralSettings; @@ -105,7 +107,7 @@ class CustomFunctionData { unsigned int enabled; // TODO perhaps not any more the right name unsigned int adjustMode; int repeatParam; - char custName[10+1]; + char custName[CF_CUSTNAME_LEN + 1]; void convert(RadioDataConversionState & cstate); diff --git a/companion/src/firmwares/logicalswitchdata.cpp b/companion/src/firmwares/logicalswitchdata.cpp index 48fd4898f97..5b01f699610 100644 --- a/companion/src/firmwares/logicalswitchdata.cpp +++ b/companion/src/firmwares/logicalswitchdata.cpp @@ -27,7 +27,7 @@ bool LogicalSwitchData::isEmpty() const { - return (func == 0); + return (func == LS_FN_OFF); } CSFunctionFamily LogicalSwitchData::getFunctionFamily() const @@ -115,11 +115,7 @@ QString LogicalSwitchData::funcToString() const QString LogicalSwitchData::nameToString(int index) const { - return RadioData::getElementName(tr("L"), index + 1, NULL, true); -} -QString LogicalSwitchData::custNameToString() const -{ - return custName; + return RadioData::getElementName(tr("L"), index + 1, custName, true); } void LogicalSwitchData::convert(RadioDataConversionState & cstate) diff --git a/companion/src/firmwares/logicalswitchdata.h b/companion/src/firmwares/logicalswitchdata.h index 5c683090c75..91b61dcfe31 100644 --- a/companion/src/firmwares/logicalswitchdata.h +++ b/companion/src/firmwares/logicalswitchdata.h @@ -18,11 +18,12 @@ * GNU General Public License for more details. */ -#ifndef LOGICALSWITCHDATA_H -#define LOGICALSWITCHDATA_H +#pragma once #include +#define LS_CUSTNAME_LEN 10 + class RadioDataConversionState; enum CSFunction { @@ -49,8 +50,8 @@ enum CSFunction { LS_FN_EDGE, LS_FN_SAFE, // later ... LS_FN_RANGE, - LS_FN_MAX, - + LS_FN_MAX, + }; enum CSFunctionFamily { @@ -79,7 +80,7 @@ class LogicalSwitchData { unsigned int delay; unsigned int duration; int andsw; - char custName[10+1]; + char custName[LS_CUSTNAME_LEN + 1]; void clear() { memset(this, 0, sizeof(LogicalSwitchData)); } bool isEmpty() const; @@ -87,8 +88,5 @@ class LogicalSwitchData { unsigned int getRangeFlags() const; QString funcToString() const; QString nameToString(int index) const; - QString custNameToString() const; void convert(RadioDataConversionState & cstate); }; - -#endif // LOGICALSWITCHDATA_H diff --git a/companion/src/firmwares/rawsource.cpp b/companion/src/firmwares/rawsource.cpp index 86c13ef2de6..7f17b56ac53 100644 --- a/companion/src/firmwares/rawsource.cpp +++ b/companion/src/firmwares/rawsource.cpp @@ -204,7 +204,7 @@ QString RawSource::toString(const ModelData * model, const GeneralSettings * con return result; case SOURCE_TYPE_CUSTOM_SWITCH: - return RawSwitch(SWITCH_TYPE_VIRTUAL, index + 1).toString(); + return RawSwitch(SWITCH_TYPE_VIRTUAL, index + 1).toString(board, generalSettings, model); case SOURCE_TYPE_CYC: return tr("CYC%1").arg(index + 1); diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp index 72c8abcf9b5..54127e25e43 100644 --- a/companion/src/firmwares/rawswitch.cpp +++ b/companion/src/firmwares/rawswitch.cpp @@ -86,9 +86,9 @@ QString RawSwitch::toString(Board::Type board, const GeneralSettings * const gen case SWITCH_TYPE_VIRTUAL: if (modelData) - return modelData->logicalSw[index].nameToString(index-1) + ": " + modelData->logicalSw[index-1].custNameToString() ; + return modelData->logicalSw[index - 1].nameToString(index - 1); else - return LogicalSwitchData().nameToString(index-1); + return LogicalSwitchData().nameToString(index - 1); case SWITCH_TYPE_FUNCTIONSWITCH: if (!Boards::getCapability(board, Board::FunctionSwitches)) diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index a4ee9fcd1f5..8fab8a61539 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -99,7 +99,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, playIcon.addImage("stop.png", QIcon::Normal, QIcon::On); QStringList headerLabels; - headerLabels << "#" << tr("Switch") << tr("Action") << tr("Parameters") << "" << "Name"; + headerLabels << "#" << tr("Name") << tr("Switch") << tr("Action") << tr("Parameters") << ""; TableLayout * tableLayout = new TableLayout(this, fswCapability, headerLabels); for (int i = 0; i < fswCapability; i++) { @@ -116,16 +116,16 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); tableLayout->addWidget(i, 0, label); - // The Custom Name name[i] = new QLineEdit(this); name[i]->setProperty("index", i); - name[i]->setMaxLength(10); + name[i]->setMaxLength(CF_CUSTNAME_LEN); QRegExp rx(CHAR_FOR_NAMES_REGEX); name[i]->setValidator(new QRegExpValidator(rx, this)); - connect(name[i], SIGNAL(editingFinished()), this, SLOT(nameEdited())); - tableLayout->addWidget(i, 5, name[i]); + name[i]->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); + connect(name[i], SIGNAL(editingFinished()), this, SLOT(onNameEdited())); + tableLayout->addWidget(i, 1, name[i]); // The switch fswtchSwtch[i] = new QComboBox(this); @@ -136,8 +136,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchSwtch[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); fswtchSwtch[i]->setMaxVisibleItems(10); connect(fswtchSwtch[i], SIGNAL(currentIndexChanged(int)), this, SLOT(customFunctionEdited())); - connect(fswtchSwtch[i], SIGNAL(LogicalSwitchesPanel::editingFinished()), this, SLOT(refreshSwitchComboBoxes())); - tableLayout->addWidget(i, 1, fswtchSwtch[i]); + tableLayout->addWidget(i, 2, fswtchSwtch[i]); // The function fswtchFunc[i] = new QComboBox(this); @@ -146,11 +145,11 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(functions[i].func)); fswtchFunc[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); connect(fswtchFunc[i], SIGNAL(currentIndexChanged(int)), this, SLOT(functionEdited())); - tableLayout->addWidget(i, 2, fswtchFunc[i]); + tableLayout->addWidget(i, 3, fswtchFunc[i]); // The parameters QHBoxLayout * paramLayout = new QHBoxLayout(); - tableLayout->addLayout(i, 3, paramLayout); + tableLayout->addLayout(i, 4, paramLayout); fswtchGVmode[i] = new QComboBox(this); fswtchGVmode[i]->setProperty("index", i); @@ -201,11 +200,11 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, connect(playBT[i], &QToolButton::clicked, this, &CustomFunctionsPanel::toggleSound); QHBoxLayout * repeatLayout = new QHBoxLayout(); - tableLayout->addLayout(i, 4, repeatLayout); + tableLayout->addLayout(i, 5, repeatLayout); fswtchRepeat[i] = new QComboBox(this); fswtchRepeat[i]->setProperty("index", i); fswtchRepeat[i]->setModel(tabModelFactory->getItemModel(repeatId)); - fswtchRepeat[i]->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); + fswtchRepeat[i]->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding); fswtchRepeat[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); repeatLayout->addWidget(fswtchRepeat[i], i + 1); connect(fswtchRepeat[i], SIGNAL(currentIndexChanged(int)), this, SLOT(customFunctionEdited())); @@ -216,13 +215,11 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchEnable[i]->setFixedWidth(200); repeatLayout->addWidget(fswtchEnable[i], i + 1); connect(fswtchEnable[i], SIGNAL(stateChanged(int)), this, SLOT(customFunctionEdited())); - - } disableMouseScrolling(); tableLayout->resizeColumnsToContents(); - tableLayout->setColumnWidth(3, 300); + tableLayout->setColumnWidth(5, 300); tableLayout->pushRowsUp(fswCapability + 1); update(); @@ -236,18 +233,6 @@ CustomFunctionsPanel::~CustomFunctionsPanel() delete tabModelFactory; delete tabFilterFactory; } -void CustomFunctionsPanel::refreshSwitchComboBoxes() -{ - // The switch - for (int i = 0; i < fswCapability; i++) { - fswtchSwtch[i]->setProperty("index", i); - fswtchSwtch[i]->setModel(tabFilterFactory->getItemModel(rawSwitchId)); - fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(functions[i].swtch.toValue())); - fswtchSwtch[i]->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); - fswtchSwtch[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); - fswtchSwtch[i]->setMaxVisibleItems(10); - } -} void CustomFunctionsPanel::onMediaPlayerStateChanged(QMediaPlayer::State state) { @@ -347,27 +332,26 @@ void CustomFunctionsPanel::functionEdited() int index = sender()->property("index").toInt(); RawSwitch swtch = functions[index].swtch; int paramTemp =functions[index].param; - + functions[index].clear(); functions[index].swtch = swtch; functions[index].func = (AssignFunc)fswtchFunc[index]->currentData().toInt(); functions[index].param = paramTemp; strcpy(functions[index].custName, name[index]->text().toLatin1()); - + refreshCustomFunction(index); emit modified(); lock = false; } } -void CustomFunctionsPanel::nameEdited() +void CustomFunctionsPanel::onNameEdited() { QLineEdit *le = qobject_cast(sender()); int index = le->property("index").toInt(); CustomFunctionData & cfn = functions[index]; if (cfn.custName != le->text()) { strcpy(cfn.custName, le->text().toLatin1()); - emit modified(); } } @@ -376,8 +360,8 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) { CustomFunctionData & cfn = functions[i]; AssignFunc func = (AssignFunc)fswtchFunc[i]->currentData().toInt(); - - + + unsigned int widgetsMask = 0; if (modified) { @@ -388,7 +372,7 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) } else { - name[i]->setText(cfn.custName); + name[i]->setText(cfn.custName); fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(cfn.swtch.toValue())); fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(cfn.func)); } diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index 9f6f81a3562..73607ad7fb9 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -46,8 +46,7 @@ class CustomFunctionsPanel : public GenericPanel private slots: void customFunctionEdited(); - void nameEdited(); - void refreshSwitchComboBoxes(); + void onNameEdited(); void functionEdited(); void onCustomContextMenuRequested(QPoint pos); void refreshCustomFunction(int index, bool modified=false); diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index 578827b98a0..01f7e9751d6 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -43,7 +43,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, lsCapabilityExt = firmware->getCapability(LogicalSwitchesExt); QStringList headerLabels; - headerLabels << "#" << "Name" << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); + headerLabels << "#" << tr("Name") << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); if (lsCapabilityExt) { headerLabels << tr("Duration") << tr("Delay"); } @@ -66,13 +66,13 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, // The Custom Name name[i] = new QLineEdit(this); name[i]->setProperty("index", i); - name[i]->setMaxLength(10); + name[i]->setMaxLength(LS_CUSTNAME_LEN); QRegExp rx(CHAR_FOR_NAMES_REGEX); name[i]->setValidator(new QRegExpValidator(rx, this)); - connect(name[i], SIGNAL(editingFinished()), this, SLOT(nameEdited())); + name[i]->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); + connect(name[i], SIGNAL(editingFinished()), this, SLOT(onNameEdited())); tableLayout->addWidget(i, 1, name[i]); - // The function cbFunction[i] = new QComboBox(this); cbFunction[i]->setProperty("index", i); @@ -166,7 +166,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, disableMouseScrolling(); tableLayout->resizeColumnsToContents(); - tableLayout->pushRowsUp(lsCapability+1); + tableLayout->pushRowsUp(lsCapability + 1); } LogicalSwitchesPanel::~LogicalSwitchesPanel() @@ -174,19 +174,18 @@ LogicalSwitchesPanel::~LogicalSwitchesPanel() delete rawSourceFilteredModel; delete rawSwitchFilteredModel; } -void LogicalSwitchesPanel::nameEdited() + +void LogicalSwitchesPanel::onNameEdited() { - - QLineEdit *le = qobject_cast(sender()); - int index = le->property("index").toInt(); - - if (model->logicalSw[index].custName != le->text()) { - strcpy(model->logicalSw[index].custName, le->text().toLatin1()); + QLineEdit *le = qobject_cast(sender()); + int index = le->property("index").toInt(); - int currentCbInt = cbSource1[index]->currentIndex(); - model->logicalSw[index].val1 = cbSource1[index]->itemData(currentCbInt).toInt(); - emit modified(); - } + if (model->logicalSw[index].custName != le->text()) { + strcpy(model->logicalSw[index].custName, le->text().toLatin1()); + if (model->logicalSw[index].func != LS_FN_OFF) + updateItemModels(); + emit modified(); + } } void LogicalSwitchesPanel::onFunctionChanged() diff --git a/companion/src/modeledit/logicalswitches.h b/companion/src/modeledit/logicalswitches.h index ae3ff87c7f5..57a2bade59d 100644 --- a/companion/src/modeledit/logicalswitches.h +++ b/companion/src/modeledit/logicalswitches.h @@ -18,8 +18,7 @@ * GNU General Public License for more details. */ -#ifndef _LOGICALSWITCHES_H_ -#define _LOGICALSWITCHES_H_ +#pragma once #include "modeledit.h" #include "radiodata.h" @@ -42,7 +41,7 @@ class LogicalSwitchesPanel : public ModelPanel private slots: void onFunctionChanged(); - void nameEdited(); + void onNameEdited(); void onV1Changed(int value); void onV2Changed(int value); void onAndSwitchChanged(int value); @@ -93,5 +92,3 @@ class LogicalSwitchesPanel : public ModelPanel void updateItemModels(); void connectItemModelEvents(const FilteredItemModel * itemModel); }; - -#endif // _LOGICALSWITCHES_H_ From b109d7d77c9c362bfe803fed7cd6f286e570aa3c Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Mon, 10 Oct 2022 20:14:57 +1100 Subject: [PATCH 085/122] Companion: model edit Mixes view shows Mix name in a column for easy reference --- companion/src/modelprinter.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 36d19cafb93..dcf332fa205 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -391,6 +391,18 @@ QString ModelPrinter::printMixerLine(const MixData & mix, bool showMultiplex, in { QString str = " "; + if (firmware->getCapability(HasMixerNames) && mix.name[0]){ + std::string strMixName(mix.name); + str += QString(" [%1]").arg(mix.name).toHtmlEscaped(); + for (int i = 0; i < (6- strMixName.length()); i++) { + str += " "; + } + } + else { + str += "       "; + } + str += "     "; + if (showMultiplex) { switch(mix.mltpx) { case (1): str += "*="; break; From 13581d11dad4c38f1a6410801151c2ad7d86a020 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Thu, 2 Jun 2022 21:34:58 +1000 Subject: [PATCH 086/122] special functions gui --- radio/src/dataconstants.h | 2 + radio/src/datastructs.h | 42 +++++++++---------- radio/src/datastructs_private.h | 1 + radio/src/gui/colorlcd/special_functions.cpp | 9 +++- .../storage/yaml/yaml_datastructs_nv14.cpp | 5 ++- .../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_tpro.cpp | 5 ++- .../storage/yaml/yaml_datastructs_tx12.cpp | 5 ++- .../src/storage/yaml/yaml_datastructs_x10.cpp | 5 ++- .../storage/yaml/yaml_datastructs_x12s.cpp | 5 ++- .../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 ++- .../storage/yaml/yaml_datastructs_zorro.cpp | 5 ++- 20 files changed, 80 insertions(+), 54 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index e740be7d1ec..d540da542d5 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -136,6 +136,8 @@ enum CurveType { #define MAX_CURVE_POINTS 512 #endif +#define LEN_SPEC_FN_NAME 10 + #if defined(PCBFRSKY) || defined(PCBNV14) #define NUM_MODULES 2 #else diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 59f817a47b8..b68f3008d3d 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -52,7 +52,7 @@ static inline void check_struct() CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 11); CHKSIZE(LogicalSwitchData, 9); - CHKSIZE(CustomFunctionData, 11); + CHKSIZE(CustomFunctionData, 21); CHKSIZE(FlightModeData, 28 + 2*NUM_TRIMS); CHKSIZE(TimerData, 12); CHKSIZE(SwashRingData, 8); @@ -66,7 +66,7 @@ static inline void check_struct() CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 13); CHKSIZE(LogicalSwitchData, 9); - CHKSIZE(CustomFunctionData, 11); + CHKSIZE(CustomFunctionData, 21); CHKSIZE(FlightModeData, 40); CHKSIZE(TimerData, 17); CHKSIZE(SwashRingData, 8); @@ -79,7 +79,7 @@ static inline void check_struct() CHKSIZE(MixData, 20); CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 13); - CHKSIZE(CustomFunctionData, 9); + CHKSIZE(CustomFunctionData, 19); CHKSIZE(FlightModeData, 44); CHKSIZE(TimerData, 17); CHKSIZE(SwashRingData, 8); @@ -117,34 +117,34 @@ static inline void check_struct() CHKSIZE(TrainerData, 16); #if defined(PCBXLITES) - CHKSIZE(RadioData, 862); - CHKSIZE(ModelData, 6164); + CHKSIZE(RadioData, 861); + CHKSIZE(ModelData, 6161); #elif defined(PCBXLITE) - CHKSIZE(RadioData, 860); - CHKSIZE(ModelData, 6164); + CHKSIZE(RadioData, 859); + CHKSIZE(ModelData, 6161); #elif defined(RADIO_TPRO) - CHKSIZE(RadioData, 843); - CHKSIZE(ModelData, 6189); + CHKSIZE(RadioData, 1483); + CHKSIZE(ModelData, 6829); #elif defined(PCBX7) - CHKSIZE(RadioData, 866); - CHKSIZE(ModelData, 6164); + CHKSIZE(RadioData, 1506); + CHKSIZE(ModelData, 6804); #elif defined(PCBX9E) - CHKSIZE(RadioData, 956); - CHKSIZE(ModelData, 6616); + CHKSIZE(RadioData, 1596); + CHKSIZE(ModelData, 7256); #elif defined(PCBX9D) || defined(PCBX9DP) - CHKSIZE(RadioData, 898); - CHKSIZE(ModelData, 6608); + CHKSIZE(RadioData, 1538); + CHKSIZE(ModelData, 7248); #elif defined(PCBHORUS) #if defined(PCBX10) - CHKSIZE(RadioData, 924); - CHKSIZE(ModelData, 11128); + CHKSIZE(RadioData, 1564); + CHKSIZE(ModelData, 11768); #else - CHKSIZE(RadioData, 906); - CHKSIZE(ModelData, 11126); + CHKSIZE(RadioData, 1546); + CHKSIZE(ModelData, 11766); #endif #elif defined(PCBNV14) - CHKSIZE(RadioData, 852); - CHKSIZE(ModelData, 10942); + CHKSIZE(RadioData, 1492); + CHKSIZE(ModelData, 11582); #endif #undef CHKSIZE diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index eef70443b05..8bba1f54b15 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.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); + NOBACKUP(char custName[LEN_SPEC_FN_NAME]); CUST_ATTR(def,r_customFn,w_customFn); PACK(union { NOBACKUP(PACK(struct { diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index ac6fc243f8e..8b6cde552fd 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -386,9 +386,15 @@ class SpecialFunctionEditPage : public Page lv_obj_set_style_pad_all(window->getLvObj(), lv_dpx(8), 0); CustomFunctionData *cfn = &functions[index]; + auto line = window->newLine(&grid); + + // custom label + new StaticText(line, rect_t{}, "Custom Label", 0, COLOR_THEME_PRIMARY1); + new ModelTextEdit(line, rect_t{}, cfn->custName, LEN_SPEC_FN_NAME); + // new StaticText(window, grid.getFieldSlot(), "placeHolderName", 0, COLOR_THEME_PRIMARY1); + line = window->newLine(&grid); // Switch - auto line = window->newLine(&grid); new StaticText(line, rect_t{}, STR_SWITCH, 0, COLOR_THEME_PRIMARY1); auto switchChoice = new SwitchChoice(line, rect_t{}, SWSRC_FIRST, SWSRC_LAST, @@ -494,6 +500,7 @@ class SpecialFunctionButton : public Button uint8_t func = CFN_FUNC(cfn); drawSwitch(dc, col1, line1, CFN_SWITCH(cfn), COLOR_THEME_SECONDARY1); + dc->drawText(col3, line1, "CustLabelPlaceHolder", COLOR_THEME_SECONDARY1); if (cfn->isEmpty()) return; dc->drawTextAtIndex(col2, line1, STR_VFSWFUNC, func, COLOR_THEME_SECONDARY1); diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 645b847ab9b..29430d945f1 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -326,6 +326,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 48 ), YAML_PADDING( 8 ), @@ -423,7 +424,7 @@ static const struct YamlNode struct_RadioData[] = { 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_ARRAY("customFn", 152, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -866,7 +867,7 @@ 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", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ARRAY("customFn", 152, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 200c666487d..176733a68bd 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -393,7 +394,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -835,7 +836,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 4a780484587..5e0adce41d4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -393,7 +394,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -835,7 +836,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 4a780484587..5e0adce41d4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -393,7 +394,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -835,7 +836,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index d4aebedff08..30b001b739e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -323,6 +323,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -401,7 +402,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -841,7 +842,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 6557324474f..dea7f79ca7f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -393,7 +394,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -835,7 +836,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index e5a4b18e383..1e828c9c3f5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -357,6 +357,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 48 ), YAML_PADDING( 8 ), @@ -452,7 +453,7 @@ static const struct YamlNode struct_RadioData[] = { 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_ARRAY("customFn", 152, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -897,7 +898,7 @@ 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", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ARRAY("customFn", 152, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index d5b5ec2d4e9..7a4b954b072 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -355,6 +355,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 48 ), YAML_PADDING( 8 ), @@ -450,7 +451,7 @@ static const struct YamlNode struct_RadioData[] = { 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_ARRAY("customFn", 152, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -895,7 +896,7 @@ 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", 72, 64, struct_CustomFunctionData, cfn_is_active), + YAML_ARRAY("customFn", 152, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 4a780484587..5e0adce41d4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -393,7 +394,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -835,7 +836,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 6007846398a..cf8db0ade52 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -322,6 +322,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -400,7 +401,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -848,7 +849,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index a49055c1b48..29e3b979113 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -361,6 +361,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -439,7 +440,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -887,7 +888,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index a606778cfba..0e6b68b9802 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -302,6 +302,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -380,7 +381,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -820,7 +821,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 1cca91d6a85..fa9a5d529f0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -310,6 +310,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -388,7 +389,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -830,7 +831,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index b990cc155ef..04e7f720e05 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -307,6 +307,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -385,7 +386,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -827,7 +828,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 46df93ef3cf..8ecb332210c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -309,6 +309,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -387,7 +388,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -831,7 +832,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index 0ca01633c00..d515d63f095 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -315,6 +315,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -393,7 +394,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -835,7 +836,7 @@ 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", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), From 5c16aefff5a7770a26545d8fa49ec22f72e501d7 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 4 Jun 2022 20:52:24 +1000 Subject: [PATCH 087/122] Update yaml_datastructs_funcs.cpp increase data size (cherry picked from commit 98276f4d3f1aab8ad4f699349ec7659df5f5225a) --- radio/src/storage/yaml/yaml_datastructs_funcs.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index fb3e5b55dfe..9b23b8cc156 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -115,20 +115,20 @@ static inline void check_yaml_funcs() #if defined(PCBHORUS) static_assert(offsetof(FlightModeData, gvars) == 26,""); check_size(); - check_size(); + check_size(); #elif defined(PCBNV14) static_assert(offsetof(FlightModeData, gvars) == 22,""); check_size(); - check_size(); + check_size(); #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) static_assert(offsetof(FlightModeData, gvars) == 18,""); check_size(); - check_size(); + check_size(); check_size(); #else static_assert(offsetof(FlightModeData, gvars) == 22,""); check_size(); - check_size(); + check_size(); check_size(); #endif } From 00030ded93e9372e9bdae17d8a39caeca807d76c Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 4 Jun 2022 21:11:28 +1000 Subject: [PATCH 088/122] Update special_functions.cpp paint special function custom name (cherry picked from commit 59fc7c1938cd9cea8618d7b80af9c70a96cf0921) --- radio/src/gui/colorlcd/special_functions.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 8b6cde552fd..ed446d67fd4 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -500,7 +500,8 @@ class SpecialFunctionButton : public Button uint8_t func = CFN_FUNC(cfn); drawSwitch(dc, col1, line1, CFN_SWITCH(cfn), COLOR_THEME_SECONDARY1); - dc->drawText(col3, line1, "CustLabelPlaceHolder", COLOR_THEME_SECONDARY1); + //paint special function custom name + dc->drawText(col3, line1, cfn->custName, COLOR_THEME_SECONDARY1); if (cfn->isEmpty()) return; dc->drawTextAtIndex(col2, line1, STR_VFSWFUNC, func, COLOR_THEME_SECONDARY1); From 9d588e6b430f7a51963fa307a6ee9fc108709143 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 5 Jun 2022 07:56:55 +1000 Subject: [PATCH 089/122] Update special_functions.cpp removed code comment (cherry picked from commit 391ad2f44d538c594e278e6be4bfc49714a5ff40) --- radio/src/gui/colorlcd/special_functions.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index ed446d67fd4..1eeb81e3294 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -391,7 +391,6 @@ class SpecialFunctionEditPage : public Page // custom label new StaticText(line, rect_t{}, "Custom Label", 0, COLOR_THEME_PRIMARY1); new ModelTextEdit(line, rect_t{}, cfn->custName, LEN_SPEC_FN_NAME); - // new StaticText(window, grid.getFieldSlot(), "placeHolderName", 0, COLOR_THEME_PRIMARY1); line = window->newLine(&grid); // Switch From 843ae4ddbe878ba0c6871eb05bf6bf57da144fc8 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 5 Jun 2022 08:51:21 +1000 Subject: [PATCH 090/122] Update en.h in special functions edit screen, variable data for English translation (cherry picked from commit 82490e34094ea0ed740e58bcffe95ad66d084ca7) --- radio/src/translations/en.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 17ea386c0c8..08639bb7d8f 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -553,6 +553,7 @@ #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" #define TR_MENULOGICALSWITCHES "LOGICAL SWITCHES" #define TR_MENUCUSTOMFUNC "SPECIAL FUNCTIONS" +#define TR_CUST_FUNC_CUST_LABEL "Name" #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" #define TR_MENUTELEMETRY "TELEMETRY" #define TR_MENUTEMPLATES "TEMPLATES" From 114c69d5b9d282d7c4687695461ccc59bbaaac04 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 5 Jun 2022 09:01:28 +1000 Subject: [PATCH 091/122] Update translations.cpp variable for model special function custom name (cherry picked from commit a8c494285d774c0d2268dd96ed615a957e3767c9) --- radio/src/translations.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index a76375d9df2..65c43d0d8e4 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -269,6 +269,7 @@ const char STR_MENUCURVE[] = TR_MENUCURVE; const char STR_MENULOGICALSWITCH[] = TR_MENULOGICALSWITCH; const char STR_MENULOGICALSWITCHES[] = TR_MENULOGICALSWITCHES; const char STR_MENUCUSTOMFUNC[] = TR_MENUCUSTOMFUNC; +const char STR_CUST_FUNC_CUST_LABEL[] = TR_CUST_FUNC_CUST_LABEL; const char STR_SPLASHSCREEN[] = TR_SPLASHSCREEN; const char STR_PWR_ON_DELAY[] = TR_PWR_ON_DELAY; const char STR_PWR_OFF_DELAY[] = TR_PWR_OFF_DELAY; From 39661a00c4d2979181c620289833384859b9006f Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 5 Jun 2022 09:34:03 +1000 Subject: [PATCH 092/122] Update special_functions.cpp fixed string changed to translation (cherry picked from commit 52366eed73004b1dea153dff35bd45a0f993a35e) --- radio/src/gui/colorlcd/special_functions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 1eeb81e3294..9ff9651a29a 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -389,7 +389,7 @@ class SpecialFunctionEditPage : public Page auto line = window->newLine(&grid); // custom label - new StaticText(line, rect_t{}, "Custom Label", 0, COLOR_THEME_PRIMARY1); + new StaticText(line, rect_t{}, STR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); new ModelTextEdit(line, rect_t{}, cfn->custName, LEN_SPEC_FN_NAME); line = window->newLine(&grid); From ba8a0f799a435a63c6ed9771c7f7d8cc6e154a41 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:04:23 +1000 Subject: [PATCH 093/122] Update special_functions.cpp changed variable from string to translation (cherry picked from commit 65df17bf1f03ab53fef98f1309b743234babd517) --- radio/src/gui/colorlcd/special_functions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 9ff9651a29a..7c3c44f43d8 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -389,7 +389,7 @@ class SpecialFunctionEditPage : public Page auto line = window->newLine(&grid); // custom label - new StaticText(line, rect_t{}, STR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); + new StaticText(line, rect_t{}, TR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); new ModelTextEdit(line, rect_t{}, cfn->custName, LEN_SPEC_FN_NAME); line = window->newLine(&grid); From 41782df3ee3ba6e5f877d303427ef621d4ea1a5d Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:19:45 +1000 Subject: [PATCH 094/122] radio\src\translations\en.h moved translations to txt file as requested by @eshifri (cherry picked from commit d10f5d634f10ca8eecf79f1ceef6c9b43554cee4) --- radio/src/translations/cn.h.txt | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h | 1 - radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 13 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 radio/src/translations/cn.h.txt create mode 100644 radio/src/translations/cz.h.txt create mode 100644 radio/src/translations/de.h.txt create mode 100644 radio/src/translations/en.h.txt create mode 100644 radio/src/translations/es.h.txt create mode 100644 radio/src/translations/fi.h.txt create mode 100644 radio/src/translations/fr.h.txt create mode 100644 radio/src/translations/it.txt create mode 100644 radio/src/translations/nl.h.txt create mode 100644 radio/src/translations/pl.h.txt create mode 100644 radio/src/translations/pt.h.txt create mode 100644 radio/src/translations/se.h.txt diff --git a/radio/src/translations/cn.h.txt b/radio/src/translations/cn.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/cn.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/cz.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/de.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 08639bb7d8f..17ea386c0c8 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -553,7 +553,6 @@ #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" #define TR_MENULOGICALSWITCHES "LOGICAL SWITCHES" #define TR_MENUCUSTOMFUNC "SPECIAL FUNCTIONS" -#define TR_CUST_FUNC_CUST_LABEL "Name" #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" #define TR_MENUTELEMETRY "TELEMETRY" #define TR_MENUTEMPLATES "TEMPLATES" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/en.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/es.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/fi.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/fr.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/it.txt b/radio/src/translations/it.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/it.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/nl.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/pl.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/pt.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt new file mode 100644 index 00000000000..b0f54d97ecf --- /dev/null +++ b/radio/src/translations/se.h.txt @@ -0,0 +1 @@ +#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file From b372cd3b77da08911a4ce5be9995d63c5ea874e6 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:26:25 +1000 Subject: [PATCH 095/122] Update en.h re enabled definition inorder to compile simu (cherry picked from commit 2ca101cef51a132fd4d5c662792b2b508e99263d) --- radio/src/translations/en.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 17ea386c0c8..08639bb7d8f 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -553,6 +553,7 @@ #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" #define TR_MENULOGICALSWITCHES "LOGICAL SWITCHES" #define TR_MENUCUSTOMFUNC "SPECIAL FUNCTIONS" +#define TR_CUST_FUNC_CUST_LABEL "Name" #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" #define TR_MENUTELEMETRY "TELEMETRY" #define TR_MENUTEMPLATES "TEMPLATES" From 195c3256faf972591ee4bac85dd6be914c274f69 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:56:55 +1000 Subject: [PATCH 096/122] radio\src\gui\colorlcd\special_functions.cpp changed variable from translation to dynamic string (cherry picked from commit 1d4a0f42b4e642389948a7e5b582545b450c78a9) --- radio/src/gui/colorlcd/special_functions.cpp | 2 +- radio/src/translations.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 7c3c44f43d8..9ff9651a29a 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -389,7 +389,7 @@ class SpecialFunctionEditPage : public Page auto line = window->newLine(&grid); // custom label - new StaticText(line, rect_t{}, TR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); + new StaticText(line, rect_t{}, STR_CUST_FUNC_CUST_LABEL, 0, COLOR_THEME_PRIMARY1); new ModelTextEdit(line, rect_t{}, cfn->custName, LEN_SPEC_FN_NAME); line = window->newLine(&grid); diff --git a/radio/src/translations.h b/radio/src/translations.h index 89d9d2d4331..b9c55549a1b 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -442,6 +442,7 @@ extern const char STR_MENUCURVE[]; extern const char STR_MENULOGICALSWITCH[]; extern const char STR_MENULOGICALSWITCHES[]; extern const char STR_MENUCUSTOMFUNC[]; +extern const char STR_CUST_FUNC_CUST_LABEL[]; extern const char STR_MENUCUSTOMSCRIPTS[]; extern const char STR_MENUTELEMETRY[]; extern const char STR_MENUTEMPLATES[]; From d1ae63de8a35e9bddbc2ce8253b884336bc24212 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 12 Jun 2022 22:47:00 +0000 Subject: [PATCH 097/122] new logic switch family (cherry picked from commit 514a60e2ed38544d11815dec024a4993f2946036) --- radio/src/switches.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/switches.h b/radio/src/switches.h index 9bda7bdaaf7..57c30d5c982 100644 --- a/radio/src/switches.h +++ b/radio/src/switches.h @@ -30,6 +30,7 @@ enum LogicalSwitchFamilies { LS_FAMILY_DIFF, LS_FAMILY_TIMER, LS_FAMILY_STICKY, + LS_FAMILY_SAFE, LS_FAMILY_RANGE, LS_FAMILY_EDGE }; From 767b765b1bc734e1728ceeb4e0fc15c82352afcd Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 12 Jun 2022 22:49:41 +0000 Subject: [PATCH 098/122] new logical switch function in dropdown (cherry picked from commit 5b165c05a559ec46b12777510856b024149b30aa) --- radio/src/myeeprom.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 84e74307cfc..4c44896d7a0 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -217,6 +217,7 @@ enum LogicalSwitchesFunctions { LS_FUNC_ADIFFEGREATER, LS_FUNC_TIMER, LS_FUNC_STICKY, + LS_FUNC_SAFE, LS_FUNC_COUNT SKIP, LS_FUNC_MAX SKIP = LS_FUNC_COUNT-1 }; From 90d27e77eb7ce574623bf0a91b1f64b32edf4641 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 12 Jun 2022 23:09:38 +0000 Subject: [PATCH 099/122] English translations --- radio/src/translations/en.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 08639bb7d8f..45ea79fc60d 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -83,17 +83,19 @@ #if LCD_W >= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stcky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Range" #define TR_CSWSTAY "Edge" #else #define TR_CSWTIMER "Tim" #define TR_CSWSTICKY "Stky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Rnge" #define TR_CSWSTAY "Edge" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a Date: Mon, 13 Jun 2022 02:26:14 +0000 Subject: [PATCH 100/122] new logic switch type Safe graphical display (cherry picked from commit c3f1a32107b63bbacd5ffd2633105684c5780aa3) --- radio/src/gui/colorlcd/model_logical_switches.cpp | 4 ++-- radio/src/storage/conversions/yaml/myeeprom_220.h | 1 + radio/src/storage/yaml/yaml_datastructs_nv14.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_t12.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_t8.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_tlite.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_tpro.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_tx12.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x10.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x12s.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x7.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x9d.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x9e.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x9lite.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_x9lites.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_xlite.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_xlites.cpp | 1 + radio/src/storage/yaml/yaml_datastructs_zorro.cpp | 1 + 18 files changed, 19 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index decad63f6ff..c197094500f 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -102,7 +102,7 @@ class LogicalSwitchEditPage: public Page LogicalSwitchData * cs = lswAddress(index); uint8_t cstate = lswFamily(cs->func); - if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cs->func == LS_FUNC_SAFE) { new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V1, 0, COLOR_THEME_PRIMARY1); auto choice = new SwitchChoice(logicalSwitchOneWindow, grid.getFieldSlot(), SWSRC_FIRST_IN_LOGICAL_SWITCHES, SWSRC_LAST_IN_LOGICAL_SWITCHES, GET_SET_DEFAULT(cs->v1)); choice->setAvailableHandler(isSwitchAvailableInLogicalSwitches); @@ -298,7 +298,7 @@ class LogicalSwitchButton : public Button dc->drawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func, COLOR_THEME_SECONDARY1); // CSW params - if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY) { + if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY || ls->func ==LS_FUNC_SAFE) { drawSwitch(dc, col2, line1, ls->v1, COLOR_THEME_SECONDARY1); drawSwitch(dc, col3, line1, ls->v2, COLOR_THEME_SECONDARY1); } else if (lsFamily == LS_FAMILY_EDGE) { diff --git a/radio/src/storage/conversions/yaml/myeeprom_220.h b/radio/src/storage/conversions/yaml/myeeprom_220.h index 077811b5882..927001e5817 100644 --- a/radio/src/storage/conversions/yaml/myeeprom_220.h +++ b/radio/src/storage/conversions/yaml/myeeprom_220.h @@ -202,6 +202,7 @@ enum LogicalSwitchesFunctions { LS_FUNC_ADIFFEGREATER, LS_FUNC_TIMER, LS_FUNC_STICKY, + LS_FUNC_SAFE, LS_FUNC_COUNT, LS_FUNC_MAX = LS_FUNC_COUNT-1 }; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 29430d945f1..4611d8e6a75 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -181,6 +181,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 176733a68bd..8667bad31e0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 5e0adce41d4..0caeef75581 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 5e0adce41d4..0caeef75581 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index 30b001b739e..01ae10e8f7b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -172,6 +172,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index dea7f79ca7f..d68f0deaf22 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 1e828c9c3f5..73c27927259 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -202,6 +202,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 7a4b954b072..a62d8a29563 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -200,6 +200,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 5e0adce41d4..0caeef75581 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index cf8db0ade52..9a62dade107 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -174,6 +174,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 29e3b979113..1d7a6d284c4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -186,6 +186,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 0e6b68b9802..424fc3f15af 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -166,6 +166,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index fa9a5d529f0..8538ed4954e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -168,6 +168,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 04e7f720e05..b40fe0a63c5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -168,6 +168,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 8ecb332210c..86757505749 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index d515d63f095..da95f15ab0a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { From c7c751245e210c6b6739c22d781ccd7bf50e5033 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 14 Jun 2022 01:04:56 +0000 Subject: [PATCH 101/122] evaluation logic for LogicSwitchFunctionSafe: disassociates the AndSwitch from affecting the new Logic Switch Type (cherry picked from commit 62a3fd10037346ea08df7e4cc77b94ec159f96d5) --- radio/src/switches.cpp | 287 +++++++++++++++++++++++------------------ 1 file changed, 163 insertions(+), 124 deletions(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index fe2ff340b87..d0df1615c39 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -377,136 +377,144 @@ bool getLogicalSwitch(uint8_t idx) LogicalSwitchData * ls = lswAddress(idx); bool result; - swsrc_t s = ls->andsw; - - if (ls->func == LS_FUNC_NONE || (s && !getSwitch(s))) { - if (ls->func != LS_FUNC_STICKY && ls->func != LS_FUNC_EDGE ) { - // AND switch must not affect STICKY and EDGE processing - LS_LAST_VALUE(mixerCurrentFlightMode, idx) = CS_LAST_VALUE_INIT; - } - result = false; + + if(ls->func ==LS_FAMILY_SAFE){ + + result = lswFm[mixerCurrentFlightMode].lsw[idx].state; } - else if ((s=lswFamily(ls->func)) == LS_FAMILY_BOOL) { - bool res1 = getSwitch(ls->v1); - bool res2 = getSwitch(ls->v2); - switch (ls->func) { - case LS_FUNC_AND: - result = (res1 && res2); - break; - case LS_FUNC_OR: - result = (res1 || res2); - break; - // case LS_FUNC_XOR: - default: - result = (res1 ^ res2); - break; - } - } - else if (s == LS_FAMILY_TIMER) { - result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) <= 0); - } - else if (s == LS_FAMILY_STICKY) { - result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); - } - else if (s == LS_FAMILY_EDGE) { - result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); - } - else { - getvalue_t x = getValueForLogicalSwitch(ls->v1); - getvalue_t y; - if (s == LS_FAMILY_COMP) { - y = getValueForLogicalSwitch(ls->v2); - - switch (ls->func) { - case LS_FUNC_EQUAL: - result = (x==y); - break; - case LS_FUNC_GREATER: - result = (x>y); - break; - default: - result = (xandsw; + if (ls->func == LS_FUNC_NONE || (s && !getSwitch(s))) { + if (ls->func != LS_FUNC_STICKY && ls->func != LS_FUNC_EDGE && ls->func != LS_FUNC_SAFE ) { + // AND switch must not affect STICKY and EDGE processing + LS_LAST_VALUE(mixerCurrentFlightMode, idx) = CS_LAST_VALUE_INIT; + } + result = false; } - } - else { - mixsrc_t v1 = ls->v1; - // Telemetry - if (v1 >= MIXSRC_FIRST_TELEM) { - if (!TELEMETRY_STREAMING() || IS_FAI_FORBIDDEN(v1-1)) { - result = false; - goto DurationAndDelayProcessing; + else if ((s=lswFamily(ls->func)) == LS_FAMILY_BOOL) { + bool res1 = getSwitch(ls->v1); + bool res2 = getSwitch(ls->v2); + switch (ls->func) { + case LS_FUNC_AND: + result = (res1 && res2); + break; + case LS_FUNC_OR: + result = (res1 || res2); + break; + // case LS_FUNC_XOR: + default: + result = (res1 ^ res2); + break; } - - y = convertLswTelemValue(ls); - - } - else if (v1 >= MIXSRC_GVAR1) { - y = ls->v2; + else if (s == LS_FAMILY_TIMER) { + result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) <= 0); } - else { - y = calc100toRESX(ls->v2); + // else if (s == LS_FAMILY_STICKY) { + // result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); + // } + else if (s == LS_FAMILY_SAFE) { + result = LS_LAST_VALUE(mixerCurrentFlightMode, idx); } - - switch (ls->func) { - case LS_FUNC_VEQUAL: - result = (x==y); - break; - case LS_FUNC_VALMOSTEQUAL: -#if defined(GVARS) - if (v1 >= MIXSRC_GVAR1 && v1 <= MIXSRC_LAST_GVAR) - result = (x==y); - else -#endif - result = (abs(x-y) < (1024 / STICK_TOLERANCE)); - break; - case LS_FUNC_VPOS: - result = (x>y); - break; - case LS_FUNC_VNEG: - result = (xy); - break; - case LS_FUNC_ANEG: - result = (abs(x)v1); + getvalue_t y; + if (s == LS_FAMILY_COMP) { + y = getValueForLogicalSwitch(ls->v2); + + switch (ls->func) { + case LS_FUNC_EQUAL: + result = (x==y); + break; + case LS_FUNC_GREATER: + result = (x>y); + break; + default: + result = (xfunc == LS_FUNC_DIFFEGREATER) { - if (y >= 0) { - result = (diff >= y); - if (diff < 0) - update = true; - } - else { - result = (diff <= y); - if (diff > 0) - update = true; + } + else { + mixsrc_t v1 = ls->v1; + // Telemetry + if (v1 >= MIXSRC_FIRST_TELEM) { + if (!TELEMETRY_STREAMING() || IS_FAI_FORBIDDEN(v1-1)) { + result = false; + goto DurationAndDelayProcessing; } + + y = convertLswTelemValue(ls); + + + } + else if (v1 >= MIXSRC_GVAR1) { + y = ls->v2; } else { - result = (abs(diff) >= y); + y = calc100toRESX(ls->v2); } - if (result || update) { - LS_LAST_VALUE(mixerCurrentFlightMode, idx) = x; + + switch (ls->func) { + case LS_FUNC_VEQUAL: + result = (x==y); + break; + case LS_FUNC_VALMOSTEQUAL: + #if defined(GVARS) + if (v1 >= MIXSRC_GVAR1 && v1 <= MIXSRC_LAST_GVAR) + result = (x==y); + else + #endif + result = (abs(x-y) < (1024 / STICK_TOLERANCE)); + break; + case LS_FUNC_VPOS: + result = (x>y); + break; + case LS_FUNC_VNEG: + result = (xy); + break; + case LS_FUNC_ANEG: + result = (abs(x)func == LS_FUNC_DIFFEGREATER) { + if (y >= 0) { + result = (diff >= y); + if (diff < 0) + update = true; + } + else { + result = (diff <= y); + if (diff > 0) + update = true; + } + } + else { + result = (abs(diff) >= y); + } + if (result || update) { + LS_LAST_VALUE(mixerCurrentFlightMode, idx) = x; + } + break; + } } - break; } } - } - } -DurationAndDelayProcessing: + DurationAndDelayProcessing: - if (ls->delay || ls->duration) { + if (ls->delay || ls->duration) { LogicalSwitchContext &context = lswFm[mixerCurrentFlightMode].lsw[idx]; if (result) { if (context.timerState == SWITCH_START) { @@ -542,8 +550,9 @@ bool getLogicalSwitch(uint8_t idx) context.timer = 0; } } - + } return result; + } bool getSwitch(swsrc_t swtch, uint8_t flags) @@ -620,7 +629,23 @@ bool getSwitch(swsrc_t swtch, uint8_t flags) return swtch > 0 ? result : !result; } - +void evalLogicalSwitch_FUNC_SAFE(LogicalSwitchData * ls, LogicalSwitchContext & context){ + if(ls->v1 != SWSRC_NONE){ + if(getSwitch(ls->v2)){ + //ON + if(getSwitch(ls->v1)){ + context.state = 1; + } + //OFF + if(!getSwitch(ls->v1)){ + context.state = 0; + } + } + } + else{//no source set therfore switch is off + context.state = 0; + } +} /** @brief Calculates new state of logical switches for mixerCurrentFlightMode */ @@ -628,19 +653,26 @@ void evalLogicalSwitches(bool isCurrentFlightmode) { for (unsigned int idx=0; idxfunc == LS_FUNC_SAFE){ + evalLogicalSwitch_FUNC_SAFE(ls, context); + } + else{ + bool result = getLogicalSwitch(idx); + if (isCurrentFlightmode) { + if (result) { + if (!context.state) PLAY_LOGICAL_SWITCH_ON(idx); + } + else { + if (context.state) PLAY_LOGICAL_SWITCH_OFF(idx); + } } + context.state = result; } - context.state = result; } } + swarnstate_t switches_states = 0; uint8_t fsswitches_states = 0; swsrc_t getMovedSwitch() @@ -902,6 +934,7 @@ void logicalSwitchesTimerTick() for (uint8_t fm=0; fmfunc == LS_FUNC_TIMER) { int16_t * lastValue = &LS_LAST_VALUE(fm, i); if (*lastValue == 0 || *lastValue == CS_LAST_VALUE_INIT) { @@ -916,6 +949,7 @@ void logicalSwitchesTimerTick() *lastValue -= 1; } } + else if (ls->func == LS_FUNC_STICKY) { ls_sticky_struct & lastValue = (ls_sticky_struct &)LS_LAST_VALUE(fm, i); bool before = lastValue.last & 0x01; @@ -942,6 +976,11 @@ void logicalSwitchesTimerTick() } } } + else if (ls->func == LS_FUNC_SAFE) { + LogicalSwitchContext & context = lswFm[mixerCurrentFlightMode].lsw[i]; + evalLogicalSwitch_FUNC_SAFE(ls, context); + } + else if (ls->func == LS_FUNC_EDGE) { ls_stay_struct & lastValue = (ls_stay_struct &)LS_LAST_VALUE(fm, i); // if this ls was reset by the logicalSwitchesReset() the lastValue will be set to CS_LAST_VALUE_INIT(0x8000) From 5a631cdd076b787c8906e5851d4b5a2e531cdc05 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 14 Jun 2022 01:14:20 +0000 Subject: [PATCH 102/122] removed AndSw for Logic Switch mode Safe (cherry picked from commit 0d95f2f9e5780b914188c0736a0736f326a62547) --- radio/src/gui/colorlcd/model_logical_switches.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index c197094500f..1f26ca9b010 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -198,10 +198,12 @@ class LogicalSwitchEditPage: public Page } // AND switch + if(cs->func != LS_FUNC_SAFE){ new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_AND_SWITCH, 0, COLOR_THEME_PRIMARY1); auto choice = new SwitchChoice(logicalSwitchOneWindow, grid.getFieldSlot(), -MAX_LS_ANDSW, MAX_LS_ANDSW, GET_SET_DEFAULT(cs->andsw)); choice->setAvailableHandler(isSwitchAvailableInLogicalSwitches); grid.nextLine(); + } // Duration new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_DURATION, 0, COLOR_THEME_PRIMARY1); From 19cdbfd1c4bff117056090caa2baa1247b2d908e Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Tue, 14 Jun 2022 07:56:37 +0000 Subject: [PATCH 103/122] update gui for new logic switch type (cherry picked from commit 6fd47d7b54c089c4e813cb6b2fa95bbdfd779adb) --- radio/src/dataconstants.h | 1 + radio/src/datastructs.h | 6 +++--- radio/src/datastructs_private.h | 1 + .../gui/colorlcd/model_logical_switches.cpp | 21 +++++++++++++------ .../storage/yaml/yaml_datastructs_nv14.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_t12.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_t8.cpp | 3 ++- .../storage/yaml/yaml_datastructs_tlite.cpp | 3 ++- .../storage/yaml/yaml_datastructs_tpro.cpp | 3 ++- .../storage/yaml/yaml_datastructs_tx12.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_x10.cpp | 3 ++- .../storage/yaml/yaml_datastructs_x12s.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_x7.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 3 ++- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 3 ++- .../storage/yaml/yaml_datastructs_x9lite.cpp | 3 ++- .../storage/yaml/yaml_datastructs_x9lites.cpp | 3 ++- .../storage/yaml/yaml_datastructs_xlite.cpp | 3 ++- .../storage/yaml/yaml_datastructs_xlites.cpp | 3 ++- .../storage/yaml/yaml_datastructs_zorro.cpp | 3 ++- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/en.h | 1 + 23 files changed, 55 insertions(+), 25 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index d540da542d5..812bae23ad3 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -137,6 +137,7 @@ enum CurveType { #endif #define LEN_SPEC_FN_NAME 10 +#define LEN_LOGICSW_NAME 10 #if defined(PCBFRSKY) || defined(PCBNV14) #define NUM_MODULES 2 diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index b68f3008d3d..4d26736dec0 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -51,7 +51,7 @@ static inline void check_struct() CHKSIZE(MixData, 20); CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 11); - CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(LogicalSwitchData, 19); CHKSIZE(CustomFunctionData, 21); CHKSIZE(FlightModeData, 28 + 2*NUM_TRIMS); CHKSIZE(TimerData, 12); @@ -65,7 +65,7 @@ static inline void check_struct() CHKSIZE(MixData, 20); CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 13); - CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(LogicalSwitchData, 19); CHKSIZE(CustomFunctionData, 21); CHKSIZE(FlightModeData, 40); CHKSIZE(TimerData, 17); @@ -109,7 +109,7 @@ static inline void check_struct() #endif /* board specific ifdefs*/ - CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(LogicalSwitchData, 19); CHKSIZE(TelemetrySensor, 14); CHKSIZE(ModuleData, 29); CHKSIZE(GVarData, 7); diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 8bba1f54b15..f7bd52d5a4a 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -138,6 +138,7 @@ PACK(struct LogicalSwitchData { int16_t v2 SKIP; uint8_t delay; uint8_t duration; + NOBACKUP(char custName[LEN_LOGICSW_NAME]); }); /* diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index 1f26ca9b010..2a91ca1a281 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -101,7 +101,10 @@ class LogicalSwitchEditPage: public Page LogicalSwitchData * cs = lswAddress(index); uint8_t cstate = lswFamily(cs->func); - + // custom label + new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_CUST_LOGICALSWITCH_LABEL, 0, COLOR_THEME_PRIMARY1); + new ModelTextEdit(logicalSwitchOneWindow, grid.getFieldSlot(), cs->custName, LEN_LOGICSW_NAME); + grid.nextLine(); if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cs->func == LS_FUNC_SAFE) { new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V1, 0, COLOR_THEME_PRIMARY1); auto choice = new SwitchChoice(logicalSwitchOneWindow, grid.getFieldSlot(), SWSRC_FIRST_IN_LOGICAL_SWITCHES, SWSRC_LAST_IN_LOGICAL_SWITCHES, GET_SET_DEFAULT(cs->v1)); @@ -261,6 +264,7 @@ class LogicalSwitchEditPage: public Page static constexpr coord_t line1 = FIELD_PADDING_TOP; static constexpr coord_t line2 = line1 + PAGE_LINE_HEIGHT; +static constexpr coord_t line3 = line2 + PAGE_LINE_HEIGHT; static constexpr coord_t col1 = 20; static constexpr coord_t col2 = (LCD_W - 100) / 3 + col1; static constexpr coord_t col3 = ((LCD_W - 100) / 3) * 2 + col1; @@ -297,8 +301,8 @@ class LogicalSwitchButton : public Button uint8_t lsFamily = lswFamily(ls->func); // CSW func - dc->drawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func, COLOR_THEME_SECONDARY1); - + //dc->drawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func, COLOR_THEME_SECONDARY1); + dc->drawText(col1, line1, ls->custName, COLOR_THEME_SECONDARY1); // CSW params if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY || ls->func ==LS_FUNC_SAFE) { drawSwitch(dc, col2, line1, ls->v1, COLOR_THEME_SECONDARY1); @@ -330,15 +334,20 @@ class LogicalSwitchButton : public Button if (lsFamily != LS_FAMILY_EDGE && ls->delay > 0) { dc->drawNumber(col3, line2, ls->delay, COLOR_THEME_SECONDARY1 | PREC1 | LEFT); } + // switch custom name + //dc->drawText(col1, line3, "somename", COLOR_THEME_SECONDARY1); } void paint(BitmapBuffer* dc) override { - if (active) + if (active){ dc->drawSolidFilledRect(0, 0, rect.w, rect.h, COLOR_THEME_ACTIVE); - else + dc->drawText(col1, line3, "somename", COLOR_THEME_SECONDARY1); + } + else{ dc->drawSolidFilledRect(0, 0, rect.w, rect.h, COLOR_THEME_PRIMARY2); - + dc->drawText(col1, line3, "somename", COLOR_THEME_SECONDARY1); + } paintLogicalSwitchLine(dc); // The bounding rect diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 4611d8e6a75..881f7726b6f 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -553,6 +553,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -867,7 +868,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 152, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 8667bad31e0..2db147477db 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -519,6 +519,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -836,7 +837,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 0caeef75581..8e90b5d0376 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -519,6 +519,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -836,7 +837,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 0caeef75581..8e90b5d0376 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -519,6 +519,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -836,7 +837,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index 01ae10e8f7b..6c34f816a82 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -525,6 +525,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -842,7 +843,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index d68f0deaf22..94057ab8ba0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -519,6 +519,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -836,7 +837,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 73c27927259..9b2fee7eeb7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -584,6 +584,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -898,7 +899,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 152, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index a62d8a29563..eb5d75dc969 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -582,6 +582,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -896,7 +897,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 152, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 0caeef75581..8e90b5d0376 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -519,6 +519,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -836,7 +837,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 9a62dade107..a33b7ab866e 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -527,6 +527,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -849,7 +850,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 1d7a6d284c4..3e4f84d3cae 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -566,6 +566,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -888,7 +889,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 424fc3f15af..981c95d77f2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -504,6 +504,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -821,7 +822,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 8538ed4954e..07a64f21ad3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -514,6 +514,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -831,7 +832,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index b40fe0a63c5..391eee64a19 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -511,6 +511,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -828,7 +829,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 86757505749..df8f68b5a9d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -515,6 +515,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -832,7 +833,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index da95f15ab0a..4c40fd470b5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -519,6 +519,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -836,7 +837,7 @@ static const struct YamlNode struct_ModelData[] = { 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("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 168, 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), diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 65c43d0d8e4..64249603dbe 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -268,6 +268,7 @@ const char STR_MENUCURVES[] = TR_MENUCURVES; const char STR_MENUCURVE[] = TR_MENUCURVE; const char STR_MENULOGICALSWITCH[] = TR_MENULOGICALSWITCH; const char STR_MENULOGICALSWITCHES[] = TR_MENULOGICALSWITCHES; +const char STR_CUST_LOGICALSWITCH_LABEL[] = TR_CUST_LOGICALSWITCH_LABEL; const char STR_MENUCUSTOMFUNC[] = TR_MENUCUSTOMFUNC; const char STR_CUST_FUNC_CUST_LABEL[] = TR_CUST_FUNC_CUST_LABEL; const char STR_SPLASHSCREEN[] = TR_SPLASHSCREEN; diff --git a/radio/src/translations.h b/radio/src/translations.h index b9c55549a1b..2e2023b78e7 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -441,6 +441,7 @@ extern const char STR_MENUCURVES[]; extern const char STR_MENUCURVE[]; extern const char STR_MENULOGICALSWITCH[]; extern const char STR_MENULOGICALSWITCHES[]; +extern const char STR_CUST_LOGICALSWITCH_LABEL[]; extern const char STR_MENUCUSTOMFUNC[]; extern const char STR_CUST_FUNC_CUST_LABEL[]; extern const char STR_MENUCUSTOMSCRIPTS[]; diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 45ea79fc60d..02112540ded 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -554,6 +554,7 @@ #define TR_MENUCURVE "CURVE" #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" #define TR_MENULOGICALSWITCHES "LOGICAL SWITCHES" +#define TR_CUST_LOGICALSWITCH_LABEL "Name" #define TR_MENUCUSTOMFUNC "SPECIAL FUNCTIONS" #define TR_CUST_FUNC_CUST_LABEL "Name" #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" From 42331d9dfa3e26198e51b5ad633d5ce967612918 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Mon, 20 Jun 2022 14:30:37 +1000 Subject: [PATCH 104/122] translations non English Texts (cherry picked from commit 8ee9c821034b7dd84b981eb1a845025afd384575) --- radio/src/translations/cn.h.txt | 20 +++++++++++++++++++- radio/src/translations/cz.h.txt | 20 +++++++++++++++++++- radio/src/translations/de.h.txt | 20 +++++++++++++++++++- radio/src/translations/en.h.txt | 20 +++++++++++++++++++- radio/src/translations/es.h.txt | 20 +++++++++++++++++++- radio/src/translations/fi.h.txt | 20 +++++++++++++++++++- radio/src/translations/fr.h.txt | 20 +++++++++++++++++++- radio/src/translations/it.txt | 20 +++++++++++++++++++- radio/src/translations/nl.h.txt | 20 +++++++++++++++++++- radio/src/translations/pl.h.txt | 20 +++++++++++++++++++- radio/src/translations/pt.h.txt | 20 +++++++++++++++++++- radio/src/translations/se.h.txt | 22 +++++++++++++++++++++- 12 files changed, 230 insertions(+), 12 deletions(-) diff --git a/radio/src/translations/cn.h.txt b/radio/src/translations/cn.h.txt index b0f54d97ecf..b007d701f3c 100644 --- a/radio/src/translations/cn.h.txt +++ b/radio/src/translations/cn.h.txt @@ -1 +1,19 @@ -#define TR_CUST_FUNC_CUST_LABEL "Name" \ No newline at end of file +#define TR_CUST_FUNC_CUST_LABEL "Name" + +//if LCD_W >= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 + //#define TR_CSWTIMER "Timer" + //#define TR_CSWSTICKY "Stcky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Range" + //#define TR_CSWSTAY "Edge" +//#else + //#define TR_CSWTIMER "Tim" + //#define TR_CSWSTICKY "Stky" +#define TR_CSWSAFE "Safe" + //#define TR_CSWRANGE "Rnge" + //#define TR_CSWSTAY "Edge" +//#endif + +//#define TR_CSWEQUAL "a=x" + +#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a Date: Sat, 1 Oct 2022 05:16:05 +0000 Subject: [PATCH 105/122] print logic switch safe --- companion/src/modelprinter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 9bfa02eb73e..36d19cafb93 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -517,6 +517,9 @@ QString ModelPrinter::printLogicalSwitchLine(int idx) case LS_FAMILY_STICKY: result += tr("Sticky") + QString("(%1, %2)").arg(sw1Name).arg(sw2Name); break; + case LS_FAMILY_SAFE: + result += tr("Safe") + QString("(%1, %2)").arg(sw1Name).arg(sw2Name); + break; case LS_FAMILY_TIMER: result += tr("Timer") + QString("(%1, %2)").arg(ValToTim(ls.val1)).arg(ValToTim(ls.val2)); break; From 52601fd787430e9b4e6bb2838cebb557d063fba1 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:22:15 +1000 Subject: [PATCH 106/122] bug: re enabled logic switch sticky. --- radio/src/switches.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index d0df1615c39..8065762c297 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -410,9 +410,9 @@ bool getLogicalSwitch(uint8_t idx) else if (s == LS_FAMILY_TIMER) { result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) <= 0); } - // else if (s == LS_FAMILY_STICKY) { - // result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); - // } + else if (s == LS_FAMILY_STICKY) { + result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); + } else if (s == LS_FAMILY_SAFE) { result = LS_LAST_VALUE(mixerCurrentFlightMode, idx); } From f380a35473c0d636fd8086b370760ea7885926c6 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:25:50 +1000 Subject: [PATCH 107/122] storage conversions for Logic switch Safe --- radio/src/storage/conversions/conversions_216_218.cpp | 4 ++-- radio/src/storage/conversions/conversions_218_219.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/storage/conversions/conversions_216_218.cpp b/radio/src/storage/conversions/conversions_216_218.cpp index 67590c85d6c..82466b2c235 100644 --- a/radio/src/storage/conversions/conversions_216_218.cpp +++ b/radio/src/storage/conversions/conversions_216_218.cpp @@ -991,7 +991,7 @@ void convertModelData_216_to_217(ModelData &model) sw.v2 = convertSource_216_to_217((uint8_t)sw.v2); } } - else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cstate == LS_FAMILY_SAFE ) { sw.v1 = convertSwitch_216_to_217(sw.v1); sw.v2 = convertSwitch_216_to_217(sw.v2); } @@ -1170,7 +1170,7 @@ void convertModelData_217_to_218(ModelData &model) sw.v2 = convertSource_217_to_218((uint8_t)sw.v2); } } - else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cstate == LS_FAMILY_SAFE) { sw.v1 = convertSwitch_217_to_218(sw.v1); sw.v2 = convertSwitch_217_to_218(sw.v2); } diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index 798d293094c..b68c45a2c65 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -181,7 +181,7 @@ void convertModelData_218_to_219(ModelData &model) sw.v2 = convertSource_218_to_219(sw.v2); } } - else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + else if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cstate == LS_FAMILY_SAFE) { sw.v1 = convertSwitch_218_to_219(sw.v1); sw.v2 = convertSwitch_218_to_219(sw.v2); } From 45b0b7b9dd87f9fa0eb0c3018431bc60c25f2e4e Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 15:29:57 +1000 Subject: [PATCH 108/122] Companion: new Logic Switch & Friendly Name Label --- .../edgetx/yaml_logicalswitchdata.cpp | 18 +++++++- companion/src/firmwares/logicalswitchdata.cpp | 8 ++++ companion/src/firmwares/logicalswitchdata.h | 6 ++- companion/src/firmwares/modeldata.cpp | 6 +++ .../src/firmwares/opentx/opentxeeprom.cpp | 5 ++- companion/src/modeledit/logicalswitches.cpp | 45 +++++++++++++++---- companion/src/modeledit/logicalswitches.h | 2 + .../gui/colorlcd/model_logical_switches.cpp | 2 +- .../src/gui/colorlcd/view_logical_switches.h | 2 +- 9 files changed, 80 insertions(+), 14 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_logicalswitchdata.cpp b/companion/src/firmwares/edgetx/yaml_logicalswitchdata.cpp index 41ecc41093b..0cd2dc26ecd 100644 --- a/companion/src/firmwares/edgetx/yaml_logicalswitchdata.cpp +++ b/companion/src/firmwares/edgetx/yaml_logicalswitchdata.cpp @@ -41,6 +41,7 @@ static const YamlLookupTable funcLut = { {LS_FN_DAPOS, "FUNC_ADIFFEGREATER"}, {LS_FN_TIMER, "FUNC_TIMER"}, {LS_FN_STICKY, "FUNC_STICKY"}, + {LS_FN_SAFE, "FUNC_SAFE"}, }; static int timerValue2lsw(uint32_t t) @@ -79,6 +80,12 @@ Node convert::encode(const LogicalSwitchData& rhs) def += YamlRawSwitchEncode(RawSwitch(rhs.val2)); } break; + case LS_FAMILY_SAFE: { + def += YamlRawSwitchEncode(RawSwitch(rhs.val1)); + def += ","; + def += YamlRawSwitchEncode(RawSwitch(rhs.val2)); + } break; + case LS_FAMILY_EDGE: { def += YamlRawSwitchEncode(RawSwitch(rhs.val1)); def += ","; @@ -116,7 +123,7 @@ Node convert::encode(const LogicalSwitchData& rhs) node["delay"] = rhs.delay; node["duration"] = rhs.duration; node["andsw"] = YamlRawSwitchEncode(RawSwitch(rhs.andsw)); - + node["custName"] = rhs.custName; return node; } @@ -124,6 +131,7 @@ bool convert::decode(const Node& node, LogicalSwitchData& rhs) { node["func"] >> funcLut >> rhs.func; + node["custName"] >> rhs.custName; std::string def_str; node["def"] >> def_str; @@ -139,6 +147,14 @@ bool convert::decode(const Node& node, rhs.val2 = YamlRawSwitchDecode(sw_str).toValue(); } break; +case LS_FAMILY_SAFE: { + std::string sw_str; + getline(def, sw_str, ','); + rhs.val1 = YamlRawSwitchDecode(sw_str).toValue(); + getline(def, sw_str); + rhs.val2 = YamlRawSwitchDecode(sw_str).toValue(); + } break; + case LS_FAMILY_EDGE: { std::string sw_str; getline(def, sw_str, ','); diff --git a/companion/src/firmwares/logicalswitchdata.cpp b/companion/src/firmwares/logicalswitchdata.cpp index 457fc01038f..376db3ec0eb 100644 --- a/companion/src/firmwares/logicalswitchdata.cpp +++ b/companion/src/firmwares/logicalswitchdata.cpp @@ -38,6 +38,8 @@ CSFunctionFamily LogicalSwitchData::getFunctionFamily() const return LS_FAMILY_TIMER; else if (func == LS_FN_STICKY) return LS_FAMILY_STICKY; + else if (func == LS_FN_SAFE) + return LS_FAMILY_SAFE; else if (func < LS_FN_AND || func > LS_FN_ELESS) return LS_FAMILY_VOFS; else if (func < LS_FN_EQUAL) @@ -102,6 +104,8 @@ QString LogicalSwitchData::funcToString() const return tr("Timer"); case LS_FN_STICKY: return tr("Sticky"); + case LS_FN_SAFE: + return tr("Safe"); case LS_FN_EDGE: return tr("Edge"); default: @@ -124,6 +128,10 @@ void LogicalSwitchData::convert(RadioDataConversionState & cstate) val1 = RawSource(val1).convert(cstate.withComponentField("V1")).toValue(); break; case LS_FAMILY_STICKY: + case LS_FAMILY_SAFE: + val1 = RawSwitch(val1).convert(cstate.withComponentField("V1")).toValue(); + val2 = RawSwitch(val2).convert(cstate.withComponentField("V2")).toValue(); + break; case LS_FAMILY_VBOOL: val1 = RawSwitch(val1).convert(cstate.withComponentField("V1")).toValue(); val2 = RawSwitch(val2).convert(cstate.withComponentField("V2")).toValue(); diff --git a/companion/src/firmwares/logicalswitchdata.h b/companion/src/firmwares/logicalswitchdata.h index 1b1c508204d..760601006d5 100644 --- a/companion/src/firmwares/logicalswitchdata.h +++ b/companion/src/firmwares/logicalswitchdata.h @@ -47,8 +47,10 @@ enum CSFunction { LS_FN_TIMER, LS_FN_STICKY, LS_FN_EDGE, + LS_FN_SAFE, // later ... LS_FN_RANGE, - LS_FN_MAX + LS_FN_MAX, + }; enum CSFunctionFamily { @@ -58,6 +60,7 @@ enum CSFunctionFamily { LS_FAMILY_TIMER, LS_FAMILY_STICKY, LS_FAMILY_EDGE, + LS_FAMILY_SAFE, }; class LogicalSwitchData { @@ -76,6 +79,7 @@ class LogicalSwitchData { unsigned int delay; unsigned int duration; int andsw; + char custName[10+1]; void clear() { memset(this, 0, sizeof(LogicalSwitchData)); } bool isEmpty() const; diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index 855cd7f08f6..b46717f078a 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -720,6 +720,12 @@ int ModelData::updateReference() } break; case LS_FAMILY_STICKY: + case LS_FAMILY_SAFE: + if (lsd->val1 != 0) + updateSwitchIntRef(lsd->val1); + if (lsd->val2 != 0) + updateSwitchIntRef(lsd->val2); + break; case LS_FAMILY_VBOOL: oldval1 = lsd->val1; oldval2 = lsd->val2; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index c24b2c9c0c5..f3562bbd53b 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1355,6 +1355,7 @@ class LogicalSwitchesFunctionsTable: public ConversionTable { addConversion(LS_FN_DAPOS, val++); addConversion(LS_FN_TIMER, val++); addConversion(LS_FN_STICKY, val++); + addConversion(LS_FN_SAFE, val++); } }; @@ -1410,7 +1411,7 @@ class LogicalSwitchField: public TransformedField { v2 = csw.val2; v3 = csw.val3; } - else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY) { + else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY || csw.func == LS_FN_SAFE) { switchesConversionTable->exportValue(csw.val1, v1); switchesConversionTable->exportValue(csw.val2, v2); } @@ -1435,7 +1436,7 @@ class LogicalSwitchField: public TransformedField { csw.val2 = v2; csw.val3 = v3; } - else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY) { + else if ((csw.func >= LS_FN_AND && csw.func <= LS_FN_XOR) || csw.func == LS_FN_STICKY || csw.func == LS_FN_SAFE) { switchesConversionTable->importValue(v1, csw.val1); switchesConversionTable->importValue(v2, csw.val2); } diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index 499df9e49ad..e5c84606d79 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -43,7 +43,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, lsCapabilityExt = firmware->getCapability(LogicalSwitchesExt); QStringList headerLabels; - headerLabels << "#" << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); + headerLabels << "#" << "Name" << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); if (lsCapabilityExt) { headerLabels << tr("Duration") << tr("Delay"); } @@ -63,12 +63,22 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); tableLayout->addWidget(i, 0, label); + // The Custom Name + name[i] = new QLineEdit(this); + name[i]->setProperty("index", i); + name[i]->setMaxLength(10); + QRegExp rx(CHAR_FOR_NAMES_REGEX); + name[i]->setValidator(new QRegExpValidator(rx, this)); + connect(name[i], SIGNAL(editingFinished()), this, SLOT(nameEdited())); + tableLayout->addWidget(i, 1, name[i]); + + // The function cbFunction[i] = new QComboBox(this); cbFunction[i]->setProperty("index", i); populateFunctionCB(cbFunction[i]); connect(cbFunction[i], SIGNAL(currentIndexChanged(int)), this, SLOT(onFunctionChanged())); - tableLayout->addWidget(i, 1, cbFunction[i]); + tableLayout->addWidget(i, 2, cbFunction[i]); // V1 QHBoxLayout *v1Layout = new QHBoxLayout(); @@ -86,7 +96,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, connect(dsbValue[i], SIGNAL(editingFinished()), this, SLOT(onOffsetChanged())); v1Layout->addWidget(dsbValue[i]); dsbValue[i]->setVisible(false); - tableLayout->addLayout(i, 2, v1Layout); + tableLayout->addLayout(i, 3, v1Layout); // V2 QHBoxLayout *v2Layout = new QHBoxLayout(); @@ -119,7 +129,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, connect(teOffset[i],SIGNAL(editingFinished()),this,SLOT(onOffsetChanged())); v2Layout->addWidget(teOffset[i]); teOffset[i]->setVisible(false); - tableLayout->addLayout(i, 3, v2Layout); + tableLayout->addLayout(i, 4, v2Layout); // AND cbAndSwitch[i] = new QComboBox(this); @@ -127,7 +137,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, cbAndSwitch[i]->setModel(rawSwitchFilteredModel); cbAndSwitch[i]->setVisible(true); connect(cbAndSwitch[i], SIGNAL(currentIndexChanged(int)), this, SLOT(onAndSwitchChanged(int))); - tableLayout->addWidget(i, 4, cbAndSwitch[i]); + tableLayout->addWidget(i, 5, cbAndSwitch[i]); if (lsCapabilityExt) { // Duration @@ -139,7 +149,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, dsbDuration[i]->setAccelerated(true); dsbDuration[i]->setDecimals(1); connect(dsbDuration[i], SIGNAL(valueChanged(double)), this, SLOT(onDurationChanged(double))); - tableLayout->addWidget(i, 5, dsbDuration[i]); + tableLayout->addWidget(i, 6, dsbDuration[i]); // Delay dsbDelay[i] = new QDoubleSpinBox(this); @@ -150,7 +160,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, dsbDelay[i]->setAccelerated(true); dsbDelay[i]->setDecimals(1); connect(dsbDelay[i], SIGNAL(valueChanged(double)), this, SLOT(onDelayChanged(double))); - tableLayout->addWidget(i, 6, dsbDelay[i]); + tableLayout->addWidget(i, 7, dsbDelay[i]); } } @@ -164,6 +174,20 @@ LogicalSwitchesPanel::~LogicalSwitchesPanel() delete rawSourceFilteredModel; delete rawSwitchFilteredModel; } +void LogicalSwitchesPanel::nameEdited() +{ + + QLineEdit *le = qobject_cast(sender()); + int index = le->property("index").toInt(); + + if (model->logicalSw[index].custName != le->text()) { + strcpy(model->logicalSw[index].custName, le->text().toLatin1()); + + int currentCbInt = cbSource1[index]->currentIndex(); + model->logicalSw[index].val1 = cbSource1[index]->itemData(currentCbInt).toInt(); + emit modified(); + } +} void LogicalSwitchesPanel::onFunctionChanged() { @@ -356,6 +380,8 @@ void LogicalSwitchesPanel::updateLine(int i) if (!model->logicalSw[i].isEmpty()) { mask = LINE_ENABLED | DELAY_ENABLED | DURATION_ENABLED; + name[i]->setText(model->logicalSw[i].custName); + switch (model->logicalSw[i].getFunctionFamily()) { case LS_FAMILY_VOFS: @@ -391,6 +417,8 @@ void LogicalSwitchesPanel::updateLine(int i) } case LS_FAMILY_STICKY: // no break + case LS_FAMILY_SAFE: // no break + case LS_FAMILY_VBOOL: mask |= SOURCE1_VISIBLE | SOURCE2_VISIBLE; cbSource1[i]->setModel(rawSwitchFilteredModel); @@ -468,7 +496,8 @@ void LogicalSwitchesPanel::populateFunctionCB(QComboBox *b) LS_FN_DPOS, LS_FN_DAPOS, LS_FN_TIMER, - LS_FN_STICKY + LS_FN_STICKY, + LS_FN_SAFE, }; b->clear(); diff --git a/companion/src/modeledit/logicalswitches.h b/companion/src/modeledit/logicalswitches.h index f1c2f8397ef..ae3ff87c7f5 100644 --- a/companion/src/modeledit/logicalswitches.h +++ b/companion/src/modeledit/logicalswitches.h @@ -42,6 +42,7 @@ class LogicalSwitchesPanel : public ModelPanel private slots: void onFunctionChanged(); + void nameEdited(); void onV1Changed(int value); void onV2Changed(int value); void onAndSwitchChanged(int value); @@ -64,6 +65,7 @@ class LogicalSwitchesPanel : public ModelPanel void onItemModelUpdateComplete(); private: + QLineEdit *name[CPN_MAX_LOGICAL_SWITCHES]; QComboBox * cbFunction[CPN_MAX_LOGICAL_SWITCHES]; QDoubleSpinBox * dsbValue[CPN_MAX_LOGICAL_SWITCHES]; QDoubleSpinBox * dsbOffset[CPN_MAX_LOGICAL_SWITCHES]; diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index 2a91ca1a281..08d58b72a8d 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -304,7 +304,7 @@ class LogicalSwitchButton : public Button //dc->drawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func, COLOR_THEME_SECONDARY1); dc->drawText(col1, line1, ls->custName, COLOR_THEME_SECONDARY1); // CSW params - if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY || ls->func ==LS_FUNC_SAFE) { + if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY || ls->func == LS_FUNC_SAFE) { drawSwitch(dc, col2, line1, ls->v1, COLOR_THEME_SECONDARY1); drawSwitch(dc, col3, line1, ls->v2, COLOR_THEME_SECONDARY1); } else if (lsFamily == LS_FAMILY_EDGE) { diff --git a/radio/src/gui/colorlcd/view_logical_switches.h b/radio/src/gui/colorlcd/view_logical_switches.h index 74836c8e14b..75208400930 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.h +++ b/radio/src/gui/colorlcd/view_logical_switches.h @@ -55,7 +55,7 @@ class LogicalSwitchDisplayFooter : public Window // CSW params unsigned int cstate = lswFamily(cs->func); - if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cstate == LS_FAMILY_SAFE) { drawSwitch(dc, CSW_2ND_COLUMN, 1, cs->v1, textColor); drawSwitch(dc, CSW_3RD_COLUMN, 1, cs->v2, textColor); } else if (cstate == LS_FAMILY_EDGE) { From 207650e95dd99f707c7d1758933bdab8348de29f Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:40:40 +1000 Subject: [PATCH 109/122] Companion: custom function Friendly Name Label --- companion/src/firmwares/customfunctiondata.h | 1 + .../edgetx/yaml_customfunctiondata.cpp | 4 ++ companion/src/modeledit/customfunctions.cpp | 40 +++++++++++++++++-- companion/src/modeledit/customfunctions.h | 2 + .../yaml/yaml_datastructs_funcs.cpp | 6 +++ .../storage/yaml/yaml_datastructs_funcs.cpp | 14 +++++++ 6 files changed, 64 insertions(+), 3 deletions(-) diff --git a/companion/src/firmwares/customfunctiondata.h b/companion/src/firmwares/customfunctiondata.h index d2b2265e35a..2ebdb6a754b 100644 --- a/companion/src/firmwares/customfunctiondata.h +++ b/companion/src/firmwares/customfunctiondata.h @@ -105,6 +105,7 @@ class CustomFunctionData { unsigned int enabled; // TODO perhaps not any more the right name unsigned int adjustMode; int repeatParam; + char custName[10+1]; void convert(RadioDataConversionState & cstate); diff --git a/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp b/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp index 50f82a1fbd9..60787710d9a 100644 --- a/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp +++ b/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp @@ -238,6 +238,8 @@ Node convert::encode(const CustomFunctionData& rhs) node["def"] = def; } + node["custName"] = rhs.custName; + return node; } @@ -246,6 +248,8 @@ bool convert::decode(const Node& node, { node["swtch"] >> rhs.swtch; + node["custName"] >> rhs.custName; + int func = 0; node["func"] >> customFnLut >> func; rhs.func = (AssignFunc)func; diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index af6430b6ced..c7b341ee401 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -99,7 +99,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, playIcon.addImage("stop.png", QIcon::Normal, QIcon::On); QStringList headerLabels; - headerLabels << "#" << tr("Switch") << tr("Action") << tr("Parameters") << ""; + headerLabels << "#" << tr("Switch") << tr("Action") << tr("Parameters") << "" << "Name"; TableLayout * tableLayout = new TableLayout(this, fswCapability, headerLabels); for (int i = 0; i < fswCapability; i++) { @@ -116,6 +116,16 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); tableLayout->addWidget(i, 0, label); + + + // The Custom Name + name[i] = new QLineEdit(this); + name[i]->setProperty("index", i); + name[i]->setMaxLength(10); + QRegExp rx(CHAR_FOR_NAMES_REGEX); + name[i]->setValidator(new QRegExpValidator(rx, this)); + connect(name[i], SIGNAL(editingFinished()), this, SLOT(nameEdited())); + tableLayout->addWidget(i, 5, name[i]); // The switch fswtchSwtch[i] = new QComboBox(this); @@ -205,6 +215,8 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchEnable[i]->setFixedWidth(200); repeatLayout->addWidget(fswtchEnable[i], i + 1); connect(fswtchEnable[i], SIGNAL(stateChanged(int)), this, SLOT(customFunctionEdited())); + + } disableMouseScrolling(); @@ -330,25 +342,44 @@ void CustomFunctionsPanel::functionEdited() } } +void CustomFunctionsPanel::nameEdited() +{ + QLineEdit *le = qobject_cast(sender()); + int index = le->property("index").toInt(); + CustomFunctionData & cfn = functions[index]; + if (cfn.custName != le->text()) { + strcpy(cfn.custName, le->text().toLatin1()); + + emit modified(); + } +} + void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) { CustomFunctionData & cfn = functions[i]; AssignFunc func = (AssignFunc)fswtchFunc[i]->currentData().toInt(); + + unsigned int widgetsMask = 0; if (modified) { + cfn.swtch = RawSwitch(fswtchSwtch[i]->currentData().toInt()); cfn.func = func; cfn.enabled = fswtchEnable[i]->isChecked(); + } else { - fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(cfn.swtch.toValue())); - fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(cfn.func)); + name[i]->setText(cfn.custName); + fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(cfn.swtch.toValue())); + fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(cfn.func)); } if (!cfn.isEmpty()) { widgetsMask |= CUSTOM_FUNCTION_SHOW_FUNC; + name[i]->setText(cfn.custName); + if (func >= FuncOverrideCH1 && func <= FuncOverrideCH32) { if (model) { int channelsMax = model->getChannelsMax(true); @@ -356,8 +387,11 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) fswtchParam[i]->setSingleStep(1); fswtchParam[i]->setMinimum(-channelsMax); fswtchParam[i]->setMaximum(channelsMax); + name[i]->setText(cfn.custName); + if (modified) { cfn.param = fswtchParam[i]->value(); + strcpy(cfn.custName, name[i]->text().toLatin1()); } fswtchParam[i]->setValue(cfn.param); widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM | CUSTOM_FUNCTION_ENABLE; diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index 87775246d42..78b3bdc2c4f 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -46,6 +46,7 @@ class CustomFunctionsPanel : public GenericPanel private slots: void customFunctionEdited(); + void nameEdited(); void functionEdited(); void onCustomContextMenuRequested(QPoint pos); void refreshCustomFunction(int index, bool modified=false); @@ -92,6 +93,7 @@ class CustomFunctionsPanel : public GenericPanel QSet tracksSet; QSet scriptsSet; int mediaPlayerCurrent; + QLineEdit *name[CPN_MAX_SPECIAL_FUNCTIONS]; QComboBox * fswtchSwtch[CPN_MAX_SPECIAL_FUNCTIONS]; QComboBox * fswtchFunc[CPN_MAX_SPECIAL_FUNCTIONS]; QCheckBox * fswtchParamGV[CPN_MAX_SPECIAL_FUNCTIONS]; diff --git a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp index c61dde7400e..04086b2171a 100644 --- a/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/conversions/yaml/yaml_datastructs_funcs.cpp @@ -1041,6 +1041,12 @@ bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, if (!w_swtchSrc_unquoted(&_ls_node_v2, ls->v2, wf, opaque)) return false; break; + case LS_FAMILY_SAFE: + if (!w_swtchSrc_unquoted(&_ls_node_v1, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + if (!w_swtchSrc_unquoted(&_ls_node_v2, ls->v2, wf, opaque)) return false; + break; + case LS_FAMILY_EDGE: if (!w_swtchSrc_unquoted(&_ls_node_v1, ls->v1, wf, opaque)) return false; if (!wf(opaque,",",1)) return false; diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 9b23b8cc156..10153841258 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -1603,6 +1603,14 @@ static void r_logicSw(void* user, uint8_t* data, uint32_t bitoffs, ls->v2 = r_swtchSrc(nullptr, val, val_len); break; + case LS_FAMILY_SAFE: + 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; @@ -1670,6 +1678,12 @@ static bool w_logicSw(void* user, uint8_t* data, uint32_t bitoffs, if (!w_swtchSrc_unquoted(&_ls_node_v2, ls->v2, wf, opaque)) return false; break; + case LS_FAMILY_SAFE: + if (!w_swtchSrc_unquoted(&_ls_node_v1, ls->v1, wf, opaque)) return false; + if (!wf(opaque,",",1)) return false; + if (!w_swtchSrc_unquoted(&_ls_node_v2, ls->v2, wf, opaque)) return false; + break; + case LS_FAMILY_EDGE: if (!w_swtchSrc_unquoted(&_ls_node_v1, ls->v1, wf, opaque)) return false; if (!wf(opaque,",",1)) return false; From 776ead9fc412139046904f026f783ebaab26c5a3 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 2 Oct 2022 13:00:58 +1100 Subject: [PATCH 110/122] logic sw & custom fn: friendly name copy & paste --- companion/src/modeledit/customfunctions.cpp | 1 + companion/src/modeledit/logicalswitches.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index c7b341ee401..76e3b467b4b 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -767,6 +767,7 @@ void CustomFunctionsPanel::swapData(int idx1, int idx2) void CustomFunctionsPanel::resetCBsAndRefresh(int idx) { lock = true; + name[idx]->clear(); fswtchSwtch[idx]->setCurrentIndex(fswtchSwtch[idx]->findData(functions[idx].swtch.toValue())); fswtchFunc[idx]->setCurrentIndex(fswtchFunc[idx]->findData(functions[idx].func)); fswtchGVmode[idx]->setCurrentIndex(functions[idx].adjustMode); diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index e5c84606d79..578827b98a0 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -627,6 +627,7 @@ void LogicalSwitchesPanel::cmClear(bool prompt) model->logicalSw[selectedIndex].clear(); model->updateAllReferences(ModelData::REF_UPD_TYPE_LOGICAL_SWITCH, ModelData::REF_UPD_ACT_CLEAR, selectedIndex); + name[selectedIndex]->clear(); updateLine(selectedIndex); updateItemModels(); emit modified(); @@ -639,6 +640,7 @@ void LogicalSwitchesPanel::cmClearAll() for (int i = 0; i < lsCapability; i++) { model->logicalSw[i].clear(); + name[i]->clear(); model->updateAllReferences(ModelData::REF_UPD_TYPE_LOGICAL_SWITCH, ModelData::REF_UPD_ACT_CLEAR, i); } update(); From 3e8b1ab23446d4d4e45886a2b2ddd26e8084cdd5 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Thu, 6 Oct 2022 20:02:19 +1100 Subject: [PATCH 111/122] special funcns: stop data loss in selectin new ch --- companion/src/modeledit/customfunctions.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 76e3b467b4b..6170ce752a1 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -333,9 +333,14 @@ void CustomFunctionsPanel::functionEdited() lock = true; int index = sender()->property("index").toInt(); RawSwitch swtch = functions[index].swtch; + int paramTemp =functions[index].param; + functions[index].clear(); functions[index].swtch = swtch; functions[index].func = (AssignFunc)fswtchFunc[index]->currentData().toInt(); + functions[index].param = paramTemp; + strcpy(functions[index].custName, name[index]->text().toLatin1()); + refreshCustomFunction(index); emit modified(); lock = false; From a54b5e482f8d7b166ddeff64a34c1c88ac5823b3 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 8 Oct 2022 14:15:27 +1100 Subject: [PATCH 112/122] companion: display LS friendly name in Comboxes --- companion/src/firmwares/logicalswitchdata.cpp | 4 ++++ companion/src/firmwares/logicalswitchdata.h | 1 + companion/src/firmwares/rawswitch.cpp | 2 +- companion/src/modeledit/customfunctions.h | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/logicalswitchdata.cpp b/companion/src/firmwares/logicalswitchdata.cpp index 376db3ec0eb..48fd4898f97 100644 --- a/companion/src/firmwares/logicalswitchdata.cpp +++ b/companion/src/firmwares/logicalswitchdata.cpp @@ -117,6 +117,10 @@ QString LogicalSwitchData::nameToString(int index) const { return RadioData::getElementName(tr("L"), index + 1, NULL, true); } +QString LogicalSwitchData::custNameToString() const +{ + return custName; +} void LogicalSwitchData::convert(RadioDataConversionState & cstate) { diff --git a/companion/src/firmwares/logicalswitchdata.h b/companion/src/firmwares/logicalswitchdata.h index 760601006d5..5c683090c75 100644 --- a/companion/src/firmwares/logicalswitchdata.h +++ b/companion/src/firmwares/logicalswitchdata.h @@ -87,6 +87,7 @@ class LogicalSwitchData { unsigned int getRangeFlags() const; QString funcToString() const; QString nameToString(int index) const; + QString custNameToString() const; void convert(RadioDataConversionState & cstate); }; diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp index efeb7adfb6f..5f763cdd506 100644 --- a/companion/src/firmwares/rawswitch.cpp +++ b/companion/src/firmwares/rawswitch.cpp @@ -86,7 +86,7 @@ QString RawSwitch::toString(Board::Type board, const GeneralSettings * const gen case SWITCH_TYPE_VIRTUAL: if (modelData) - return modelData->logicalSw[index].nameToString(index-1); + return modelData->logicalSw[index].nameToString(index-1) + ": " + modelData->logicalSw[index].custNameToString() ; else return LogicalSwitchData().nameToString(index-1); diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index 78b3bdc2c4f..96c2446373d 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -93,7 +93,7 @@ class CustomFunctionsPanel : public GenericPanel QSet tracksSet; QSet scriptsSet; int mediaPlayerCurrent; - QLineEdit *name[CPN_MAX_SPECIAL_FUNCTIONS]; + QLineEdit * name[CPN_MAX_SPECIAL_FUNCTIONS]; QComboBox * fswtchSwtch[CPN_MAX_SPECIAL_FUNCTIONS]; QComboBox * fswtchFunc[CPN_MAX_SPECIAL_FUNCTIONS]; QCheckBox * fswtchParamGV[CPN_MAX_SPECIAL_FUNCTIONS]; From 2fe540b70a4e59907b9c6d66dd3cd4d2a5be03d0 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 8 Oct 2022 14:36:42 +1100 Subject: [PATCH 113/122] Companion: bug: display correct name --- companion/src/firmwares/rawswitch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp index 5f763cdd506..72c8abcf9b5 100644 --- a/companion/src/firmwares/rawswitch.cpp +++ b/companion/src/firmwares/rawswitch.cpp @@ -86,7 +86,7 @@ QString RawSwitch::toString(Board::Type board, const GeneralSettings * const gen case SWITCH_TYPE_VIRTUAL: if (modelData) - return modelData->logicalSw[index].nameToString(index-1) + ": " + modelData->logicalSw[index].custNameToString() ; + return modelData->logicalSw[index].nameToString(index-1) + ": " + modelData->logicalSw[index-1].custNameToString() ; else return LogicalSwitchData().nameToString(index-1); From 29b35fdaf2adca67bb733da7e2e84572c797e31e Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 8 Oct 2022 16:47:57 +1100 Subject: [PATCH 114/122] companion: dynamily populate list with LS name --- companion/src/modeledit/customfunctions.cpp | 13 +++++++++++++ companion/src/modeledit/customfunctions.h | 1 + 2 files changed, 14 insertions(+) diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 6170ce752a1..a4ee9fcd1f5 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -136,6 +136,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchSwtch[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); fswtchSwtch[i]->setMaxVisibleItems(10); connect(fswtchSwtch[i], SIGNAL(currentIndexChanged(int)), this, SLOT(customFunctionEdited())); + connect(fswtchSwtch[i], SIGNAL(LogicalSwitchesPanel::editingFinished()), this, SLOT(refreshSwitchComboBoxes())); tableLayout->addWidget(i, 1, fswtchSwtch[i]); // The function @@ -235,6 +236,18 @@ CustomFunctionsPanel::~CustomFunctionsPanel() delete tabModelFactory; delete tabFilterFactory; } +void CustomFunctionsPanel::refreshSwitchComboBoxes() +{ + // The switch + for (int i = 0; i < fswCapability; i++) { + fswtchSwtch[i]->setProperty("index", i); + fswtchSwtch[i]->setModel(tabFilterFactory->getItemModel(rawSwitchId)); + fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(functions[i].swtch.toValue())); + fswtchSwtch[i]->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); + fswtchSwtch[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); + fswtchSwtch[i]->setMaxVisibleItems(10); + } +} void CustomFunctionsPanel::onMediaPlayerStateChanged(QMediaPlayer::State state) { diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index 96c2446373d..9f6f81a3562 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -47,6 +47,7 @@ class CustomFunctionsPanel : public GenericPanel private slots: void customFunctionEdited(); void nameEdited(); + void refreshSwitchComboBoxes(); void functionEdited(); void onCustomContextMenuRequested(QPoint pos); void refreshCustomFunction(int index, bool modified=false); From 65333741218537ce1a0b8fc11cc2f67511d6d905 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sat, 8 Oct 2022 19:13:51 +1100 Subject: [PATCH 115/122] TODO: put LS friendly name on radio output window. --- companion/src/simulation/radiooutputswidget.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/companion/src/simulation/radiooutputswidget.cpp b/companion/src/simulation/radiooutputswidget.cpp index a71e3098b39..3b3b072cecd 100644 --- a/companion/src/simulation/radiooutputswidget.cpp +++ b/companion/src/simulation/radiooutputswidget.cpp @@ -282,6 +282,11 @@ void RadioOutputsWidget::setupLsDisplay() QWidget * RadioOutputsWidget::createLogicalSwitch(QWidget * parent, int switchNo) { + //TODO: place logicSwitch friendly name on radio output window. + //int modelindex = RadioData().generalSettings.currModelIndex; + //ModelData &model = RadioData().models[modelindex]; + //QString namestring = model.logicalSw[switchNo].custName; + QLabel * swtch = new QLabel(parent); swtch->setAutoFillBackground(true); swtch->setFrameStyle(QFrame::Panel | QFrame::Raised); @@ -297,7 +302,8 @@ QWidget * RadioOutputsWidget::createLogicalSwitch(QWidget * parent, int switchNo #endif font.setBold(false); swtch->setFont(font); - swtch->setText(QString("%1").arg(switchNo+1, 2, 10, QChar('0'))); + swtch->setText(QString("%1").arg(switchNo+1, 2, 10, QChar('0')) ); + //swtch->setText(QString("%1").arg(switchNo+1, 2, 10, QChar('0')) + ": " + namestring); swtch->setAlignment(Qt::AlignCenter); m_logicSwitchMap.insert(switchNo, swtch); return swtch; From 785c6b64978ab91b4882d6bd405cd8196329e819 Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Mon, 26 Sep 2022 16:40:38 +1000 Subject: [PATCH 116/122] chore: Set codename --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b626a8a7b5..f2826774136 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ project(EdgeTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "8") set(VERSION_REVISION "0") -set(CODENAME "dev") +set(CODENAME "FlyingDutchman") if(DEFINED ENV{EDGETX_VERSION_TAG}) set(VERSION_TAG "$ENV{EDGETX_VERSION_TAG}") From a58c3a4b8dc948f64f2655c31e5f3731c8df4c93 Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Sun, 9 Oct 2022 15:27:34 +1100 Subject: [PATCH 117/122] display friendly LS name on viewlayout --- radio/src/gui/colorlcd/view_logical_switches.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/colorlcd/view_logical_switches.h b/radio/src/gui/colorlcd/view_logical_switches.h index 75208400930..80e53181e26 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.h +++ b/radio/src/gui/colorlcd/view_logical_switches.h @@ -51,7 +51,17 @@ class LogicalSwitchDisplayFooter : public Window LogicalSwitchData* cs = lswAddress(index); LcdFlags textColor = COLOR_THEME_PRIMARY2; - dc->drawTextAtIndex(10, 1, STR_VCSWFUNC, cs->func, textColor); + + + + //LS friendly name + const char* chrs = cs->custName; + if(strlen(chrs) > 0){ + dc->drawText(15, 1, cs->custName, textColor); + }else{ + dc->drawTextAtIndex(5, 1, STR_VCSWFUNC, cs->func, textColor); + } + // CSW params unsigned int cstate = lswFamily(cs->func); From ce36ca63d051f01f81664f63705c9c541bc422d7 Mon Sep 17 00:00:00 2001 From: elecpower Date: Mon, 10 Oct 2022 08:38:21 +1100 Subject: [PATCH 118/122] cpn: refresh all model refs to LS when name changed. UI tweaks. --- companion/src/firmwares/customfunctiondata.h | 4 +- companion/src/firmwares/logicalswitchdata.cpp | 8 +-- companion/src/firmwares/logicalswitchdata.h | 14 +++--- companion/src/firmwares/rawsource.cpp | 2 +- companion/src/firmwares/rawswitch.cpp | 4 +- companion/src/modeledit/customfunctions.cpp | 50 +++++++------------ companion/src/modeledit/customfunctions.h | 3 +- companion/src/modeledit/logicalswitches.cpp | 31 ++++++------ companion/src/modeledit/logicalswitches.h | 7 +-- 9 files changed, 49 insertions(+), 74 deletions(-) diff --git a/companion/src/firmwares/customfunctiondata.h b/companion/src/firmwares/customfunctiondata.h index 2ebdb6a754b..58cfe067f67 100644 --- a/companion/src/firmwares/customfunctiondata.h +++ b/companion/src/firmwares/customfunctiondata.h @@ -27,6 +27,8 @@ #include #include +#define CF_CUSTNAME_LEN 10 + class Firmware; class ModelData; class GeneralSettings; @@ -105,7 +107,7 @@ class CustomFunctionData { unsigned int enabled; // TODO perhaps not any more the right name unsigned int adjustMode; int repeatParam; - char custName[10+1]; + char custName[CF_CUSTNAME_LEN + 1]; void convert(RadioDataConversionState & cstate); diff --git a/companion/src/firmwares/logicalswitchdata.cpp b/companion/src/firmwares/logicalswitchdata.cpp index 48fd4898f97..5b01f699610 100644 --- a/companion/src/firmwares/logicalswitchdata.cpp +++ b/companion/src/firmwares/logicalswitchdata.cpp @@ -27,7 +27,7 @@ bool LogicalSwitchData::isEmpty() const { - return (func == 0); + return (func == LS_FN_OFF); } CSFunctionFamily LogicalSwitchData::getFunctionFamily() const @@ -115,11 +115,7 @@ QString LogicalSwitchData::funcToString() const QString LogicalSwitchData::nameToString(int index) const { - return RadioData::getElementName(tr("L"), index + 1, NULL, true); -} -QString LogicalSwitchData::custNameToString() const -{ - return custName; + return RadioData::getElementName(tr("L"), index + 1, custName, true); } void LogicalSwitchData::convert(RadioDataConversionState & cstate) diff --git a/companion/src/firmwares/logicalswitchdata.h b/companion/src/firmwares/logicalswitchdata.h index 5c683090c75..91b61dcfe31 100644 --- a/companion/src/firmwares/logicalswitchdata.h +++ b/companion/src/firmwares/logicalswitchdata.h @@ -18,11 +18,12 @@ * GNU General Public License for more details. */ -#ifndef LOGICALSWITCHDATA_H -#define LOGICALSWITCHDATA_H +#pragma once #include +#define LS_CUSTNAME_LEN 10 + class RadioDataConversionState; enum CSFunction { @@ -49,8 +50,8 @@ enum CSFunction { LS_FN_EDGE, LS_FN_SAFE, // later ... LS_FN_RANGE, - LS_FN_MAX, - + LS_FN_MAX, + }; enum CSFunctionFamily { @@ -79,7 +80,7 @@ class LogicalSwitchData { unsigned int delay; unsigned int duration; int andsw; - char custName[10+1]; + char custName[LS_CUSTNAME_LEN + 1]; void clear() { memset(this, 0, sizeof(LogicalSwitchData)); } bool isEmpty() const; @@ -87,8 +88,5 @@ class LogicalSwitchData { unsigned int getRangeFlags() const; QString funcToString() const; QString nameToString(int index) const; - QString custNameToString() const; void convert(RadioDataConversionState & cstate); }; - -#endif // LOGICALSWITCHDATA_H diff --git a/companion/src/firmwares/rawsource.cpp b/companion/src/firmwares/rawsource.cpp index 86c13ef2de6..7f17b56ac53 100644 --- a/companion/src/firmwares/rawsource.cpp +++ b/companion/src/firmwares/rawsource.cpp @@ -204,7 +204,7 @@ QString RawSource::toString(const ModelData * model, const GeneralSettings * con return result; case SOURCE_TYPE_CUSTOM_SWITCH: - return RawSwitch(SWITCH_TYPE_VIRTUAL, index + 1).toString(); + return RawSwitch(SWITCH_TYPE_VIRTUAL, index + 1).toString(board, generalSettings, model); case SOURCE_TYPE_CYC: return tr("CYC%1").arg(index + 1); diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp index 72c8abcf9b5..54127e25e43 100644 --- a/companion/src/firmwares/rawswitch.cpp +++ b/companion/src/firmwares/rawswitch.cpp @@ -86,9 +86,9 @@ QString RawSwitch::toString(Board::Type board, const GeneralSettings * const gen case SWITCH_TYPE_VIRTUAL: if (modelData) - return modelData->logicalSw[index].nameToString(index-1) + ": " + modelData->logicalSw[index-1].custNameToString() ; + return modelData->logicalSw[index - 1].nameToString(index - 1); else - return LogicalSwitchData().nameToString(index-1); + return LogicalSwitchData().nameToString(index - 1); case SWITCH_TYPE_FUNCTIONSWITCH: if (!Boards::getCapability(board, Board::FunctionSwitches)) diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index a4ee9fcd1f5..8fab8a61539 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -99,7 +99,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, playIcon.addImage("stop.png", QIcon::Normal, QIcon::On); QStringList headerLabels; - headerLabels << "#" << tr("Switch") << tr("Action") << tr("Parameters") << "" << "Name"; + headerLabels << "#" << tr("Name") << tr("Switch") << tr("Action") << tr("Parameters") << ""; TableLayout * tableLayout = new TableLayout(this, fswCapability, headerLabels); for (int i = 0; i < fswCapability; i++) { @@ -116,16 +116,16 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); tableLayout->addWidget(i, 0, label); - // The Custom Name name[i] = new QLineEdit(this); name[i]->setProperty("index", i); - name[i]->setMaxLength(10); + name[i]->setMaxLength(CF_CUSTNAME_LEN); QRegExp rx(CHAR_FOR_NAMES_REGEX); name[i]->setValidator(new QRegExpValidator(rx, this)); - connect(name[i], SIGNAL(editingFinished()), this, SLOT(nameEdited())); - tableLayout->addWidget(i, 5, name[i]); + name[i]->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); + connect(name[i], SIGNAL(editingFinished()), this, SLOT(onNameEdited())); + tableLayout->addWidget(i, 1, name[i]); // The switch fswtchSwtch[i] = new QComboBox(this); @@ -136,8 +136,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchSwtch[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); fswtchSwtch[i]->setMaxVisibleItems(10); connect(fswtchSwtch[i], SIGNAL(currentIndexChanged(int)), this, SLOT(customFunctionEdited())); - connect(fswtchSwtch[i], SIGNAL(LogicalSwitchesPanel::editingFinished()), this, SLOT(refreshSwitchComboBoxes())); - tableLayout->addWidget(i, 1, fswtchSwtch[i]); + tableLayout->addWidget(i, 2, fswtchSwtch[i]); // The function fswtchFunc[i] = new QComboBox(this); @@ -146,11 +145,11 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(functions[i].func)); fswtchFunc[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); connect(fswtchFunc[i], SIGNAL(currentIndexChanged(int)), this, SLOT(functionEdited())); - tableLayout->addWidget(i, 2, fswtchFunc[i]); + tableLayout->addWidget(i, 3, fswtchFunc[i]); // The parameters QHBoxLayout * paramLayout = new QHBoxLayout(); - tableLayout->addLayout(i, 3, paramLayout); + tableLayout->addLayout(i, 4, paramLayout); fswtchGVmode[i] = new QComboBox(this); fswtchGVmode[i]->setProperty("index", i); @@ -201,11 +200,11 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, connect(playBT[i], &QToolButton::clicked, this, &CustomFunctionsPanel::toggleSound); QHBoxLayout * repeatLayout = new QHBoxLayout(); - tableLayout->addLayout(i, 4, repeatLayout); + tableLayout->addLayout(i, 5, repeatLayout); fswtchRepeat[i] = new QComboBox(this); fswtchRepeat[i]->setProperty("index", i); fswtchRepeat[i]->setModel(tabModelFactory->getItemModel(repeatId)); - fswtchRepeat[i]->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); + fswtchRepeat[i]->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding); fswtchRepeat[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); repeatLayout->addWidget(fswtchRepeat[i], i + 1); connect(fswtchRepeat[i], SIGNAL(currentIndexChanged(int)), this, SLOT(customFunctionEdited())); @@ -216,13 +215,11 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, fswtchEnable[i]->setFixedWidth(200); repeatLayout->addWidget(fswtchEnable[i], i + 1); connect(fswtchEnable[i], SIGNAL(stateChanged(int)), this, SLOT(customFunctionEdited())); - - } disableMouseScrolling(); tableLayout->resizeColumnsToContents(); - tableLayout->setColumnWidth(3, 300); + tableLayout->setColumnWidth(5, 300); tableLayout->pushRowsUp(fswCapability + 1); update(); @@ -236,18 +233,6 @@ CustomFunctionsPanel::~CustomFunctionsPanel() delete tabModelFactory; delete tabFilterFactory; } -void CustomFunctionsPanel::refreshSwitchComboBoxes() -{ - // The switch - for (int i = 0; i < fswCapability; i++) { - fswtchSwtch[i]->setProperty("index", i); - fswtchSwtch[i]->setModel(tabFilterFactory->getItemModel(rawSwitchId)); - fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(functions[i].swtch.toValue())); - fswtchSwtch[i]->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); - fswtchSwtch[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); - fswtchSwtch[i]->setMaxVisibleItems(10); - } -} void CustomFunctionsPanel::onMediaPlayerStateChanged(QMediaPlayer::State state) { @@ -347,27 +332,26 @@ void CustomFunctionsPanel::functionEdited() int index = sender()->property("index").toInt(); RawSwitch swtch = functions[index].swtch; int paramTemp =functions[index].param; - + functions[index].clear(); functions[index].swtch = swtch; functions[index].func = (AssignFunc)fswtchFunc[index]->currentData().toInt(); functions[index].param = paramTemp; strcpy(functions[index].custName, name[index]->text().toLatin1()); - + refreshCustomFunction(index); emit modified(); lock = false; } } -void CustomFunctionsPanel::nameEdited() +void CustomFunctionsPanel::onNameEdited() { QLineEdit *le = qobject_cast(sender()); int index = le->property("index").toInt(); CustomFunctionData & cfn = functions[index]; if (cfn.custName != le->text()) { strcpy(cfn.custName, le->text().toLatin1()); - emit modified(); } } @@ -376,8 +360,8 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) { CustomFunctionData & cfn = functions[i]; AssignFunc func = (AssignFunc)fswtchFunc[i]->currentData().toInt(); - - + + unsigned int widgetsMask = 0; if (modified) { @@ -388,7 +372,7 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) } else { - name[i]->setText(cfn.custName); + name[i]->setText(cfn.custName); fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(cfn.swtch.toValue())); fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(cfn.func)); } diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index 9f6f81a3562..73607ad7fb9 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -46,8 +46,7 @@ class CustomFunctionsPanel : public GenericPanel private slots: void customFunctionEdited(); - void nameEdited(); - void refreshSwitchComboBoxes(); + void onNameEdited(); void functionEdited(); void onCustomContextMenuRequested(QPoint pos); void refreshCustomFunction(int index, bool modified=false); diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index 578827b98a0..01f7e9751d6 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -43,7 +43,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, lsCapabilityExt = firmware->getCapability(LogicalSwitchesExt); QStringList headerLabels; - headerLabels << "#" << "Name" << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); + headerLabels << "#" << tr("Name") << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); if (lsCapabilityExt) { headerLabels << tr("Duration") << tr("Delay"); } @@ -66,13 +66,13 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, // The Custom Name name[i] = new QLineEdit(this); name[i]->setProperty("index", i); - name[i]->setMaxLength(10); + name[i]->setMaxLength(LS_CUSTNAME_LEN); QRegExp rx(CHAR_FOR_NAMES_REGEX); name[i]->setValidator(new QRegExpValidator(rx, this)); - connect(name[i], SIGNAL(editingFinished()), this, SLOT(nameEdited())); + name[i]->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); + connect(name[i], SIGNAL(editingFinished()), this, SLOT(onNameEdited())); tableLayout->addWidget(i, 1, name[i]); - // The function cbFunction[i] = new QComboBox(this); cbFunction[i]->setProperty("index", i); @@ -166,7 +166,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, disableMouseScrolling(); tableLayout->resizeColumnsToContents(); - tableLayout->pushRowsUp(lsCapability+1); + tableLayout->pushRowsUp(lsCapability + 1); } LogicalSwitchesPanel::~LogicalSwitchesPanel() @@ -174,19 +174,18 @@ LogicalSwitchesPanel::~LogicalSwitchesPanel() delete rawSourceFilteredModel; delete rawSwitchFilteredModel; } -void LogicalSwitchesPanel::nameEdited() + +void LogicalSwitchesPanel::onNameEdited() { - - QLineEdit *le = qobject_cast(sender()); - int index = le->property("index").toInt(); - - if (model->logicalSw[index].custName != le->text()) { - strcpy(model->logicalSw[index].custName, le->text().toLatin1()); + QLineEdit *le = qobject_cast(sender()); + int index = le->property("index").toInt(); - int currentCbInt = cbSource1[index]->currentIndex(); - model->logicalSw[index].val1 = cbSource1[index]->itemData(currentCbInt).toInt(); - emit modified(); - } + if (model->logicalSw[index].custName != le->text()) { + strcpy(model->logicalSw[index].custName, le->text().toLatin1()); + if (model->logicalSw[index].func != LS_FN_OFF) + updateItemModels(); + emit modified(); + } } void LogicalSwitchesPanel::onFunctionChanged() diff --git a/companion/src/modeledit/logicalswitches.h b/companion/src/modeledit/logicalswitches.h index ae3ff87c7f5..57a2bade59d 100644 --- a/companion/src/modeledit/logicalswitches.h +++ b/companion/src/modeledit/logicalswitches.h @@ -18,8 +18,7 @@ * GNU General Public License for more details. */ -#ifndef _LOGICALSWITCHES_H_ -#define _LOGICALSWITCHES_H_ +#pragma once #include "modeledit.h" #include "radiodata.h" @@ -42,7 +41,7 @@ class LogicalSwitchesPanel : public ModelPanel private slots: void onFunctionChanged(); - void nameEdited(); + void onNameEdited(); void onV1Changed(int value); void onV2Changed(int value); void onAndSwitchChanged(int value); @@ -93,5 +92,3 @@ class LogicalSwitchesPanel : public ModelPanel void updateItemModels(); void connectItemModelEvents(const FilteredItemModel * itemModel); }; - -#endif // _LOGICALSWITCHES_H_ From 55d0fa591533660287232f7db7308a5775bdab7c Mon Sep 17 00:00:00 2001 From: shane-droid <61736830+shane-droid@users.noreply.github.com> Date: Mon, 10 Oct 2022 20:14:57 +1100 Subject: [PATCH 119/122] Companion: model edit Mixes view shows Mix name in a column for easy reference --- companion/src/modelprinter.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 36d19cafb93..dcf332fa205 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -391,6 +391,18 @@ QString ModelPrinter::printMixerLine(const MixData & mix, bool showMultiplex, in { QString str = " "; + if (firmware->getCapability(HasMixerNames) && mix.name[0]){ + std::string strMixName(mix.name); + str += QString(" [%1]").arg(mix.name).toHtmlEscaped(); + for (int i = 0; i < (6- strMixName.length()); i++) { + str += " "; + } + } + else { + str += "       "; + } + str += "     "; + if (showMultiplex) { switch(mix.mltpx) { case (1): str += "*="; break; From 68594e606ae5b7d32ecf7102074d1f207dc131ed Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Wed, 7 Dec 2022 16:22:03 +1000 Subject: [PATCH 120/122] fix: Add missing LR3 and TX12MKII, rebase cleanup --- radio/src/datastructs.h | 22 +++++++++---------- .../storage/yaml/yaml_datastructs_lr3pro.cpp | 9 +++++--- .../storage/yaml/yaml_datastructs_tx12mk2.cpp | 9 +++++--- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 4d26736dec0..6af75b5dcb4 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -117,34 +117,34 @@ static inline void check_struct() CHKSIZE(TrainerData, 16); #if defined(PCBXLITES) - CHKSIZE(RadioData, 861); - CHKSIZE(ModelData, 6161); + CHKSIZE(RadioData, 1502); + CHKSIZE(ModelData, 7444); #elif defined(PCBXLITE) - CHKSIZE(RadioData, 859); - CHKSIZE(ModelData, 6161); + CHKSIZE(RadioData, 1500); + CHKSIZE(ModelData, 7444); #elif defined(RADIO_TPRO) CHKSIZE(RadioData, 1483); - CHKSIZE(ModelData, 6829); + CHKSIZE(ModelData, 7469); #elif defined(PCBX7) CHKSIZE(RadioData, 1506); - CHKSIZE(ModelData, 6804); + CHKSIZE(ModelData, 7444); #elif defined(PCBX9E) CHKSIZE(RadioData, 1596); - CHKSIZE(ModelData, 7256); + CHKSIZE(ModelData, 7896); #elif defined(PCBX9D) || defined(PCBX9DP) CHKSIZE(RadioData, 1538); - CHKSIZE(ModelData, 7248); + CHKSIZE(ModelData, 7888); #elif defined(PCBHORUS) #if defined(PCBX10) CHKSIZE(RadioData, 1564); - CHKSIZE(ModelData, 11768); + CHKSIZE(ModelData, 12408); #else CHKSIZE(RadioData, 1546); - CHKSIZE(ModelData, 11766); + CHKSIZE(ModelData, 12406); #endif #elif defined(PCBNV14) CHKSIZE(RadioData, 1492); - CHKSIZE(ModelData, 11582); + CHKSIZE(ModelData, 12222); #endif #undef CHKSIZE diff --git a/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp b/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp index 4a780484587..8e90b5d0376 100644 --- a/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { @@ -315,6 +316,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -393,7 +395,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -517,6 +519,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -834,8 +837,8 @@ static const struct YamlNode struct_ModelData[] = { 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_ARRAY("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp index 0ca01633c00..4c40fd470b5 100755 --- a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp @@ -170,6 +170,7 @@ const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, { LS_FUNC_TIMER, "FUNC_TIMER" }, { LS_FUNC_STICKY, "FUNC_STICKY" }, + { LS_FUNC_SAFE, "FUNC_SAFE" }, { 0, NULL } }; const struct YamlIdStr enum_SwashType[] = { @@ -315,6 +316,7 @@ static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), YAML_ENUM("func", 7, enum_Functions), + YAML_STRING("custName", 10), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), @@ -393,7 +395,7 @@ static const struct YamlNode struct_RadioData[] = { 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", 168, 64, struct_CustomFunctionData, cfn_is_active), YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), @@ -517,6 +519,7 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), + YAML_STRING("custName", 10), YAML_END }; static const struct YamlNode struct_SwashRingData[] = { @@ -834,8 +837,8 @@ static const struct YamlNode struct_ModelData[] = { 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_ARRAY("logicalSw", 152, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 168, 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_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), From e0b2b3e7f44d15d01a6056fc3e605431271cad31 Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Wed, 7 Dec 2022 16:30:28 +1000 Subject: [PATCH 121/122] fix: Updated translation files --- radio/src/translations/cn.h | 2 ++ radio/src/translations/cn.h.txt | 19 ------------------- radio/src/translations/cz.h | 2 ++ radio/src/translations/cz.h.txt | 19 ------------------- radio/src/translations/da.h | 4 +++- radio/src/translations/de.h | 8 +++++--- radio/src/translations/de.h.txt | 19 ------------------- radio/src/translations/en.h.txt | 19 ------------------- radio/src/translations/es.h | 4 +++- radio/src/translations/es.h.txt | 19 ------------------- radio/src/translations/fi.h | 8 +++++--- radio/src/translations/fi.h.txt | 19 ------------------- radio/src/translations/fr.h | 4 +++- radio/src/translations/fr.h.txt | 19 ------------------- radio/src/translations/it.h | 4 +++- radio/src/translations/it.txt | 19 ------------------- radio/src/translations/jp.h | 4 +++- radio/src/translations/nl.h | 4 +++- radio/src/translations/nl.h.txt | 19 ------------------- radio/src/translations/pl.h | 4 +++- radio/src/translations/pl.h.txt | 19 ------------------- radio/src/translations/pt.h | 4 +++- radio/src/translations/pt.h.txt | 19 ------------------- radio/src/translations/se.h | 4 +++- radio/src/translations/se.h.txt | 21 --------------------- radio/src/translations/tw.h | 4 +++- 26 files changed, 44 insertions(+), 246 deletions(-) delete mode 100644 radio/src/translations/cn.h.txt delete mode 100644 radio/src/translations/cz.h.txt delete mode 100644 radio/src/translations/de.h.txt delete mode 100644 radio/src/translations/en.h.txt delete mode 100644 radio/src/translations/es.h.txt delete mode 100644 radio/src/translations/fi.h.txt delete mode 100644 radio/src/translations/fr.h.txt delete mode 100644 radio/src/translations/it.txt delete mode 100644 radio/src/translations/nl.h.txt delete mode 100644 radio/src/translations/pl.h.txt delete mode 100644 radio/src/translations/pt.h.txt delete mode 100644 radio/src/translations/se.h.txt diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index b15a158617e..87ed3a3ba0b 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -83,11 +83,13 @@ #if LCD_W >= 212 #define TR_CSWTIMER "定时" #define TR_CSWSTICKY "粘滞" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "范围" #define TR_CSWSTAY "边沿" #else #define TR_CSWTIMER "定时" #define TR_CSWSTICKY "粘滞" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "范围" #define TR_CSWSTAY "边沿" #endif diff --git a/radio/src/translations/cn.h.txt b/radio/src/translations/cn.h.txt deleted file mode 100644 index b007d701f3c..00000000000 --- a/radio/src/translations/cn.h.txt +++ /dev/null @@ -1,19 +0,0 @@ -#define TR_CUST_FUNC_CUST_LABEL "Name" - -//if LCD_W >= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 #define TR_CSWTIMER "Stopky" #define TR_CSWSTICKY "Sticky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Dosah" #define TR_CSWSTAY "Edge" #else #define TR_CSWTIMER "Tim" #define TR_CSWSTICKY "Stky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Rnge" #define TR_CSWSTAY "Edge" #endif diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt deleted file mode 100644 index b007d701f3c..00000000000 --- a/radio/src/translations/cz.h.txt +++ /dev/null @@ -1,19 +0,0 @@ -#define TR_CUST_FUNC_CUST_LABEL "Name" - -//if LCD_W >= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Sej" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Range" #define TR_CSWSTAY "Edge" #else #define TR_CSWTIMER "Tid" #define TR_CSWSTICKY "Sej" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Afst" #define TR_CSWSTAY "Edge" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a= 212 #define TR_CSWTIMER "Takt" // TIM = Takt = Taktgenerator #define TR_CSWSTICKY "SRFF" // Sticky = RS-Flip-Flop + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Range" // Range = Bereichsabfrage von bis #define TR_CSWSTAY "Puls" // Edge = einstellbarer Impuls #else #define TR_CSWTIMER "Takt" // TIM = Takt = Taktgenerator #define TR_CSWSTICKY "SRFF" // Sticky = RS-Flip-Flop - #define TR_CSWRANGE "Rnge" // Range= Bereichsabfrage von bis - #define TR_CSWSTAY "Puls" // Edge = einstellbarer Impuls + #define TR_CSWSAFE "Safe" + #define TR_CSWRANGE "Rnge" // Range= Bereichsabfrage von bis + #define TR_CSWSTAY "Puls" // Edge = einstellbarer Impuls #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Pega" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Rango" #define TR_CSWSTAY "Borde" #else #define TR_CSWTIMER "Tim" #define TR_CSWSTICKY "Pega" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Rngo" #define TR_CSWSTAY "Bord" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","ax","ax","|a|b","ax","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 #define TR_CSWTIMER "Tempo" #define TR_CSWSTICKY "Bistb" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Plage" #define TR_CSWSTAY "Flanc" #else #define TR_CSWTIMER "Temp" #define TR_CSWSTICKY "Bist" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Zone" #define TR_CSWSTAY "Flnc" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stcky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Campo" #define TR_CSWSTAY "Edge" #else #define TR_CSWTIMER "Tim" #define TR_CSWSTICKY "Glue" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Rnge" #define TR_CSWSTAY "Edge" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stcky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Range" #define TR_CSWSTAY "Edge" #else #define TR_CSWTIMER "Tim" #define TR_CSWSTICKY "Stky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Rnge" #define TR_CSWSTAY "Edge" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stcky" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Range" #define TR_CSWSTAY "Edge" #else #define TR_CSWTIMER "Tim" #define TR_CSWSTICKY "Glue" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Rnge" #define TR_CSWSTAY "Edge" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stały" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Zasię" #define TR_CSWSTAY "Brzeg" #else #define TR_CSWTIMER "Tim" #define TR_CSWSTICKY "Stały" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Zasię" #define TR_CSWSTAY "Brzeg" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","ax","ax","|a|b","ax","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Seg" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Vidd" #define TR_CSWSTAY "Kant" #else #define TR_CSWTIMER "Tim" #define TR_CSWSTICKY "Seg" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "Vidd" #define TR_CSWSTAY "Kant" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a= 212 - //#define TR_CSWTIMER "Timer" - //#define TR_CSWSTICKY "Stcky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Range" - //#define TR_CSWSTAY "Edge" -//#else - //#define TR_CSWTIMER "Tim" - //#define TR_CSWSTICKY "Stky" -#define TR_CSWSAFE "Safe" - //#define TR_CSWRANGE "Rnge" - //#define TR_CSWSTAY "Edge" -//#endif - -//#define TR_CSWEQUAL "a=x" - -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a~x","a>x","ax","|a|b","a= 212 #define TR_CSWTIMER "定時" #define TR_CSWSTICKY "粘滯" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "範圍" #define TR_CSWSTAY "邊沿" #else #define TR_CSWTIMER "定時" #define TR_CSWSTICKY "粘滯" + #define TR_CSWSAFE "Safe" #define TR_CSWRANGE "範圍" #define TR_CSWSTAY "邊沿" #endif #define TR_CSWEQUAL "a=x" -#define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","ax","ax","|a|b","a Date: Wed, 7 Dec 2022 19:43:16 +1000 Subject: [PATCH 122/122] chore: Cleanup --- CMakeLists.txt | 2 +- .../gui/colorlcd/model_logical_switches.cpp | 3 +- .../src/gui/colorlcd/view_logical_switches.h | 10 +- radio/src/switches.cpp | 288 ++++++++---------- 4 files changed, 140 insertions(+), 163 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2826774136..9b626a8a7b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ project(EdgeTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "8") set(VERSION_REVISION "0") -set(CODENAME "FlyingDutchman") +set(CODENAME "dev") if(DEFINED ENV{EDGETX_VERSION_TAG}) set(VERSION_TAG "$ENV{EDGETX_VERSION_TAG}") diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index 08d58b72a8d..d64c446c0f5 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -101,10 +101,11 @@ class LogicalSwitchEditPage: public Page LogicalSwitchData * cs = lswAddress(index); uint8_t cstate = lswFamily(cs->func); - // custom label + new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_CUST_LOGICALSWITCH_LABEL, 0, COLOR_THEME_PRIMARY1); new ModelTextEdit(logicalSwitchOneWindow, grid.getFieldSlot(), cs->custName, LEN_LOGICSW_NAME); grid.nextLine(); + if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cs->func == LS_FUNC_SAFE) { new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V1, 0, COLOR_THEME_PRIMARY1); auto choice = new SwitchChoice(logicalSwitchOneWindow, grid.getFieldSlot(), SWSRC_FIRST_IN_LOGICAL_SWITCHES, SWSRC_LAST_IN_LOGICAL_SWITCHES, GET_SET_DEFAULT(cs->v1)); diff --git a/radio/src/gui/colorlcd/view_logical_switches.h b/radio/src/gui/colorlcd/view_logical_switches.h index 80e53181e26..6f6c7fa31df 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.h +++ b/radio/src/gui/colorlcd/view_logical_switches.h @@ -51,17 +51,15 @@ class LogicalSwitchDisplayFooter : public Window LogicalSwitchData* cs = lswAddress(index); LcdFlags textColor = COLOR_THEME_PRIMARY2; - - - + //LS friendly name const char* chrs = cs->custName; - if(strlen(chrs) > 0){ + if (strlen(chrs) > 0) { dc->drawText(15, 1, cs->custName, textColor); - }else{ + } else { dc->drawTextAtIndex(5, 1, STR_VCSWFUNC, cs->func, textColor); } - + // CSW params unsigned int cstate = lswFamily(cs->func); diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 8065762c297..4b31d544983 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -377,144 +377,127 @@ bool getLogicalSwitch(uint8_t idx) LogicalSwitchData * ls = lswAddress(idx); bool result; - - if(ls->func ==LS_FAMILY_SAFE){ - + if (ls->func == LS_FAMILY_SAFE) { result = lswFm[mixerCurrentFlightMode].lsw[idx].state; - } - else{ - swsrc_t s = ls->andsw; - if (ls->func == LS_FUNC_NONE || (s && !getSwitch(s))) { - if (ls->func != LS_FUNC_STICKY && ls->func != LS_FUNC_EDGE && ls->func != LS_FUNC_SAFE ) { - // AND switch must not affect STICKY and EDGE processing - LS_LAST_VALUE(mixerCurrentFlightMode, idx) = CS_LAST_VALUE_INIT; - } - result = false; + } else { + swsrc_t s = ls->andsw; + if (ls->func == LS_FUNC_NONE || (s && !getSwitch(s))) { + if (ls->func != LS_FUNC_STICKY && ls->func != LS_FUNC_EDGE && + ls->func != LS_FUNC_SAFE) { + // AND switch must not affect STICKY and EDGE processing + LS_LAST_VALUE(mixerCurrentFlightMode, idx) = CS_LAST_VALUE_INIT; } - else if ((s=lswFamily(ls->func)) == LS_FAMILY_BOOL) { - bool res1 = getSwitch(ls->v1); - bool res2 = getSwitch(ls->v2); + result = false; + } else if ((s = lswFamily(ls->func)) == LS_FAMILY_BOOL) { + bool res1 = getSwitch(ls->v1); + bool res2 = getSwitch(ls->v2); + switch (ls->func) { + case LS_FUNC_AND: + result = (res1 && res2); + break; + case LS_FUNC_OR: + result = (res1 || res2); + break; + // case LS_FUNC_XOR: + default: + result = (res1 ^ res2); + break; + } + } else if (s == LS_FAMILY_TIMER) { + result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) <= 0); + } else if (s == LS_FAMILY_STICKY) { + result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1 << 0)); + } else if (s == LS_FAMILY_SAFE) { + result = LS_LAST_VALUE(mixerCurrentFlightMode, idx); + } else if (s == LS_FAMILY_EDGE) { + result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1 << 0)); + } else { + getvalue_t x = getValueForLogicalSwitch(ls->v1); + getvalue_t y; + if (s == LS_FAMILY_COMP) { + y = getValueForLogicalSwitch(ls->v2); + switch (ls->func) { - case LS_FUNC_AND: - result = (res1 && res2); + case LS_FUNC_EQUAL: + result = (x == y); break; - case LS_FUNC_OR: - result = (res1 || res2); + case LS_FUNC_GREATER: + result = (x > y); break; - // case LS_FUNC_XOR: default: - result = (res1 ^ res2); + result = (x < y); break; } - } - else if (s == LS_FAMILY_TIMER) { - result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) <= 0); - } - else if (s == LS_FAMILY_STICKY) { - result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); - } - else if (s == LS_FAMILY_SAFE) { - result = LS_LAST_VALUE(mixerCurrentFlightMode, idx); - } - else if (s == LS_FAMILY_EDGE) { - result = (LS_LAST_VALUE(mixerCurrentFlightMode, idx) & (1<<0)); - } - else { - getvalue_t x = getValueForLogicalSwitch(ls->v1); - getvalue_t y; - if (s == LS_FAMILY_COMP) { - y = getValueForLogicalSwitch(ls->v2); - - switch (ls->func) { - case LS_FUNC_EQUAL: - result = (x==y); - break; - case LS_FUNC_GREATER: - result = (x>y); - break; - default: - result = (xv1; + // Telemetry + if (v1 >= MIXSRC_FIRST_TELEM) { + if (!TELEMETRY_STREAMING() || IS_FAI_FORBIDDEN(v1 - 1)) { + result = false; + goto DurationAndDelayProcessing; } - } - else { - mixsrc_t v1 = ls->v1; - // Telemetry - if (v1 >= MIXSRC_FIRST_TELEM) { - if (!TELEMETRY_STREAMING() || IS_FAI_FORBIDDEN(v1-1)) { - result = false; - goto DurationAndDelayProcessing; - } - - y = convertLswTelemValue(ls); + y = convertLswTelemValue(ls); - } - else if (v1 >= MIXSRC_GVAR1) { - y = ls->v2; - } - else { - y = calc100toRESX(ls->v2); - } + } else if (v1 >= MIXSRC_GVAR1) { + y = ls->v2; + } else { + y = calc100toRESX(ls->v2); + } - switch (ls->func) { - case LS_FUNC_VEQUAL: - result = (x==y); - break; - case LS_FUNC_VALMOSTEQUAL: - #if defined(GVARS) - if (v1 >= MIXSRC_GVAR1 && v1 <= MIXSRC_LAST_GVAR) - result = (x==y); - else - #endif - result = (abs(x-y) < (1024 / STICK_TOLERANCE)); - break; - case LS_FUNC_VPOS: - result = (x>y); - break; - case LS_FUNC_VNEG: - result = (xy); - break; - case LS_FUNC_ANEG: - result = (abs(x)func == LS_FUNC_DIFFEGREATER) { - if (y >= 0) { - result = (diff >= y); - if (diff < 0) - update = true; - } - else { - result = (diff <= y); - if (diff > 0) - update = true; - } - } - else { - result = (abs(diff) >= y); - } - if (result || update) { - LS_LAST_VALUE(mixerCurrentFlightMode, idx) = x; + switch (ls->func) { + case LS_FUNC_VEQUAL: + result = (x == y); + break; + case LS_FUNC_VALMOSTEQUAL: +#if defined(GVARS) + if (v1 >= MIXSRC_GVAR1 && v1 <= MIXSRC_LAST_GVAR) + result = (x == y); + else +#endif + result = (abs(x - y) < (1024 / STICK_TOLERANCE)); + break; + case LS_FUNC_VPOS: + result = (x > y); + break; + case LS_FUNC_VNEG: + result = (x < y); + break; + case LS_FUNC_APOS: + result = (abs(x) > y); + break; + case LS_FUNC_ANEG: + result = (abs(x) < y); + break; + default: { + if (LS_LAST_VALUE(mixerCurrentFlightMode, idx) == CS_LAST_VALUE_INIT) { + LS_LAST_VALUE(mixerCurrentFlightMode, idx) = x; + } + int16_t diff = x - LS_LAST_VALUE(mixerCurrentFlightMode, idx); + bool update = false; + if (ls->func == LS_FUNC_DIFFEGREATER) { + if (y >= 0) { + result = (diff >= y); + if (diff < 0) update = true; + } else { + result = (diff <= y); + if (diff > 0) update = true; } - break; + } else { + result = (abs(diff) >= y); } + if (result || update) { + LS_LAST_VALUE(mixerCurrentFlightMode, idx) = x; + } + break; } } } + } - DurationAndDelayProcessing: + DurationAndDelayProcessing: - if (ls->delay || ls->duration) { + if (ls->delay || ls->duration) { LogicalSwitchContext &context = lswFm[mixerCurrentFlightMode].lsw[idx]; if (result) { if (context.timerState == SWITCH_START) { @@ -525,9 +508,8 @@ bool getLogicalSwitch(uint8_t idx) if (context.timerState == SWITCH_DELAY) { if (context.timer) { - result = false; // return false while delay timer running - } - else { + result = false; // return false while delay timer running + } else { // set duration timer context.timerState = SWITCH_ENABLE; context.timer = ls->duration; @@ -535,24 +517,22 @@ bool getLogicalSwitch(uint8_t idx) } if (context.timerState == SWITCH_ENABLE) { - result = (ls->duration==0 || context.timer>0); // return false after duration timer runs out + result = (ls->duration == 0 || context.timer > 0); // return false after duration timer runs out if (!result && ls->func == LS_FUNC_STICKY) { - ls_sticky_struct & lastValue = (ls_sticky_struct &)context.lastValue; + ls_sticky_struct &lastValue = (ls_sticky_struct &)context.lastValue; lastValue.state = 0; } } - } - else if (context.timerState == SWITCH_ENABLE && ls->duration > 0 && context.timer > 0) { + } else if (context.timerState == SWITCH_ENABLE && ls->duration > 0 && + context.timer > 0) { result = true; - } - else { + } else { context.timerState = SWITCH_START; context.timer = 0; } } } return result; - } bool getSwitch(swsrc_t swtch, uint8_t flags) @@ -629,41 +609,42 @@ bool getSwitch(swsrc_t swtch, uint8_t flags) return swtch > 0 ? result : !result; } -void evalLogicalSwitch_FUNC_SAFE(LogicalSwitchData * ls, LogicalSwitchContext & context){ - if(ls->v1 != SWSRC_NONE){ - if(getSwitch(ls->v2)){ - //ON - if(getSwitch(ls->v1)){ - context.state = 1; + +void evalLogicalSwitch_FUNC_SAFE(LogicalSwitchData *ls, + LogicalSwitchContext &context) +{ + if (ls->v1 != SWSRC_NONE) { + if (getSwitch(ls->v2)) { + // ON + if (getSwitch(ls->v1)) { + context.state = 1; } - //OFF - if(!getSwitch(ls->v1)){ - context.state = 0; + // OFF + if (!getSwitch(ls->v1)) { + context.state = 0; } } - } - else{//no source set therfore switch is off + } else { // no source set therfore switch is off context.state = 0; } } + /** @brief Calculates new state of logical switches for mixerCurrentFlightMode */ void evalLogicalSwitches(bool isCurrentFlightmode) { - for (unsigned int idx=0; idxfunc == LS_FUNC_SAFE){ + for (unsigned int idx = 0; idx < MAX_LOGICAL_SWITCHES; idx++) { + LogicalSwitchContext &context = lswFm[mixerCurrentFlightMode].lsw[idx]; + LogicalSwitchData *ls = lswAddress(idx); + if (ls->func == LS_FUNC_SAFE) { evalLogicalSwitch_FUNC_SAFE(ls, context); - } - else{ + } else { bool result = getLogicalSwitch(idx); if (isCurrentFlightmode) { if (result) { if (!context.state) PLAY_LOGICAL_SWITCH_ON(idx); - } - else { + } else { if (context.state) PLAY_LOGICAL_SWITCH_OFF(idx); } } @@ -672,7 +653,6 @@ void evalLogicalSwitches(bool isCurrentFlightmode) } } - swarnstate_t switches_states = 0; uint8_t fsswitches_states = 0; swsrc_t getMovedSwitch() @@ -934,7 +914,7 @@ void logicalSwitchesTimerTick() for (uint8_t fm=0; fmfunc == LS_FUNC_TIMER) { int16_t * lastValue = &LS_LAST_VALUE(fm, i); if (*lastValue == 0 || *lastValue == CS_LAST_VALUE_INIT) { @@ -949,7 +929,6 @@ void logicalSwitchesTimerTick() *lastValue -= 1; } } - else if (ls->func == LS_FUNC_STICKY) { ls_sticky_struct & lastValue = (ls_sticky_struct &)LS_LAST_VALUE(fm, i); bool before = lastValue.last & 0x01; @@ -975,12 +954,11 @@ void logicalSwitchesTimerTick() } } } - } + } else if (ls->func == LS_FUNC_SAFE) { - LogicalSwitchContext & context = lswFm[mixerCurrentFlightMode].lsw[i]; + LogicalSwitchContext &context = lswFm[mixerCurrentFlightMode].lsw[i]; evalLogicalSwitch_FUNC_SAFE(ls, context); - } - + } else if (ls->func == LS_FUNC_EDGE) { ls_stay_struct & lastValue = (ls_stay_struct &)LS_LAST_VALUE(fm, i); // if this ls was reset by the logicalSwitchesReset() the lastValue will be set to CS_LAST_VALUE_INIT(0x8000)