diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc
index 65757d6e0f2..9c7399586de 100644
--- a/companion/src/companion.qrc
+++ b/companion/src/companion.qrc
@@ -1288,5 +1288,6 @@
images/layouts/mask_layout2x3.png
images/layouts/mask_layout2x4.png
images/layouts/mask_layout4+2.png
+ images/layouts/mask_layout4+2b.png
diff --git a/companion/src/firmwares/customisation_data.h b/companion/src/firmwares/customisation_data.h
index 9fe6f58a8b8..7496bcca1ad 100644
--- a/companion/src/firmwares/customisation_data.h
+++ b/companion/src/firmwares/customisation_data.h
@@ -40,7 +40,7 @@ constexpr int WIDGET_NAME_LEN {10};
constexpr int MAX_WIDGET_OPTIONS {5};
constexpr int MAX_TOPBAR_ZONES {4};
constexpr int MAX_TOPBAR_OPTIONS {1};
-constexpr int LAYOUT_ID_LEN {10};
+constexpr int LAYOUT_ID_LEN {12};
// Common 'ZoneOptionValue's among all layouts
enum {
diff --git a/companion/src/images/layouts/mask_layout4+2b.png b/companion/src/images/layouts/mask_layout4+2b.png
new file mode 100644
index 00000000000..b79eb0095a3
Binary files /dev/null and b/companion/src/images/layouts/mask_layout4+2b.png differ
diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h
index f94a917baf5..66a4a56db7f 100644
--- a/radio/src/datastructs.h
+++ b/radio/src/datastructs.h
@@ -85,7 +85,7 @@ static inline void check_struct()
CHKSIZE(SwashRingData, 8);
CHKSIZE(ModelHeader, 131);
CHKSIZE(CurveHeader, 4);
- CHKSIZE(CustomScreenData, 850);
+ CHKSIZE(CustomScreenData, 852);
CHKTYPE(TopBarPersistentData, 300);
#elif defined(PCBNV14)
// TODO
@@ -140,14 +140,14 @@ static inline void check_struct()
#elif defined(PCBHORUS)
#if defined(PCBX10)
CHKSIZE(RadioData, 950);
- CHKSIZE(ModelData, 15431);
+ CHKSIZE(ModelData, 15451);
#else
CHKSIZE(RadioData, 932);
- CHKSIZE(ModelData, 15429);
+ CHKSIZE(ModelData, 15449);
#endif
#elif defined(PCBNV14)
CHKSIZE(RadioData, 878);
- CHKSIZE(ModelData, 15245);
+ CHKSIZE(ModelData, 15265);
#endif
#undef CHKSIZE
diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h
index d1a71726ef0..5eccbee3cf1 100644
--- a/radio/src/datastructs_private.h
+++ b/radio/src/datastructs_private.h
@@ -577,7 +577,7 @@ typedef uint32_t swarnstate_t;
#elif defined(COLORLCD)
#include "gui/colorlcd/layout.h"
#include "gui/colorlcd/topbar.h"
-#define LAYOUT_ID_LEN 10
+#define LAYOUT_ID_LEN 12
PACK(struct CustomScreenData {
char LayoutId[LAYOUT_ID_LEN];
LayoutPersistentData layoutData;
diff --git a/radio/src/gui/colorlcd/layouts/layout4+2b.cpp b/radio/src/gui/colorlcd/layouts/layout4+2b.cpp
new file mode 100644
index 00000000000..9019754935b
--- /dev/null
+++ b/radio/src/gui/colorlcd/layouts/layout4+2b.cpp
@@ -0,0 +1,36 @@
+/*
+ * 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 "layout.h"
+#include "layout_factory_impl.h"
+
+static uint8_t zmap[] = {
+ LAYOUT_MAP_0, LAYOUT_MAP_0, LAYOUT_MAP_HALF, LAYOUT_MAP_1QTR,
+ LAYOUT_MAP_0, LAYOUT_MAP_1QTR, LAYOUT_MAP_HALF, LAYOUT_MAP_1QTR,
+ LAYOUT_MAP_0, LAYOUT_MAP_HALF, LAYOUT_MAP_HALF, LAYOUT_MAP_1QTR,
+ LAYOUT_MAP_0, LAYOUT_MAP_3QTR, LAYOUT_MAP_HALF, LAYOUT_MAP_1QTR,
+ LAYOUT_MAP_HALF, LAYOUT_MAP_0, LAYOUT_MAP_HALF, LAYOUT_MAP_3QTR,
+ LAYOUT_MAP_HALF, LAYOUT_MAP_3QTR, LAYOUT_MAP_HALF, LAYOUT_MAP_1QTR,
+};
+
+BaseLayoutFactory layout4P2B("Layout4P2B", "4 + 2B",
+ defaultZoneOptions,
+ 6, zmap);
diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp
index 495bd7ecf4f..197597dbf5b 100644
--- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp
+++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp
@@ -847,7 +847,7 @@ static const struct YamlNode struct_LayoutPersistentData[] = {
};
static const struct YamlNode struct_CustomScreenData[] = {
YAML_IDX,
- YAML_STRING("LayoutId", 10),
+ YAML_STRING("LayoutId", 12),
YAML_STRUCT("layoutData", 6720, struct_LayoutPersistentData, NULL),
YAML_END
};
@@ -914,7 +914,7 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "potsWarnEnabled", 16 ),
YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL),
YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL),
- YAML_ARRAY("screenData", 6800, 10, struct_CustomScreenData, NULL),
+ YAML_ARRAY("screenData", 6816, 10, struct_CustomScreenData, NULL),
YAML_STRUCT("topbarData", 1248, struct_TopBarPersistentData, NULL),
YAML_UNSIGNED( "view", 8 ),
YAML_STRING("modelRegistrationID", 8),
diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp
index e7e88710f70..6b25a83afc1 100644
--- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp
+++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp
@@ -878,7 +878,7 @@ static const struct YamlNode struct_LayoutPersistentData[] = {
};
static const struct YamlNode struct_CustomScreenData[] = {
YAML_IDX,
- YAML_STRING("LayoutId", 10),
+ YAML_STRING("LayoutId", 12),
YAML_STRUCT("layoutData", 6720, struct_LayoutPersistentData, NULL),
YAML_END
};
@@ -945,7 +945,7 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "potsWarnEnabled", 16 ),
YAML_ARRAY("potsWarnPosition", 8, 11, struct_signed_8, NULL),
YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL),
- YAML_ARRAY("screenData", 6800, 10, struct_CustomScreenData, NULL),
+ YAML_ARRAY("screenData", 6816, 10, struct_CustomScreenData, NULL),
YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL),
YAML_UNSIGNED( "view", 8 ),
YAML_STRING("modelRegistrationID", 8),
diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp
index 10cd695bf14..b83531ff10b 100644
--- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp
+++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp
@@ -876,7 +876,7 @@ static const struct YamlNode struct_LayoutPersistentData[] = {
};
static const struct YamlNode struct_CustomScreenData[] = {
YAML_IDX,
- YAML_STRING("LayoutId", 10),
+ YAML_STRING("LayoutId", 12),
YAML_STRUCT("layoutData", 6720, struct_LayoutPersistentData, NULL),
YAML_END
};
@@ -943,7 +943,7 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "potsWarnEnabled", 16 ),
YAML_ARRAY("potsWarnPosition", 8, 9, struct_signed_8, NULL),
YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL),
- YAML_ARRAY("screenData", 6800, 10, struct_CustomScreenData, NULL),
+ YAML_ARRAY("screenData", 6816, 10, struct_CustomScreenData, NULL),
YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL),
YAML_UNSIGNED( "view", 8 ),
YAML_STRING("modelRegistrationID", 8),