Output widget colors as such
This commit is contained in:
@@ -46,6 +46,7 @@ union ZoneOptionValue
|
||||
uint32_t boolValue;
|
||||
char stringValue[LEN_ZONE_OPTION_STRING];
|
||||
CUST_ATTR(source, r_zov_source, w_zov_source);
|
||||
CUST_ATTR(color, r_zov_color, w_zov_color);
|
||||
};
|
||||
|
||||
enum ZoneOptionValueEnum {
|
||||
@@ -53,7 +54,8 @@ enum ZoneOptionValueEnum {
|
||||
ZOV_Signed,
|
||||
ZOV_Bool,
|
||||
ZOV_String,
|
||||
ZOV_Source
|
||||
ZOV_Source,
|
||||
ZOV_Color
|
||||
};
|
||||
|
||||
struct ZoneOption
|
||||
@@ -101,6 +103,8 @@ inline ZoneOptionValueEnum zoneValueEnumFromType(ZoneOption::Type type)
|
||||
return ZOV_Source;
|
||||
|
||||
case ZoneOption::Color:
|
||||
return ZOV_Color;
|
||||
|
||||
case ZoneOption::Timer:
|
||||
case ZoneOption::Switch:
|
||||
case ZoneOption::TextSize:
|
||||
|
||||
@@ -78,8 +78,18 @@ void patchWidgetOptions(ZonePersistentData* zones, unsigned n_zones)
|
||||
|
||||
if (widgetName.empty()) continue;
|
||||
|
||||
if (widgetName == "Value" || widgetName == "Gauge") {
|
||||
if (widgetName == "Value") {
|
||||
zone.widgetData.options[0].type = ZOV_Source;
|
||||
zone.widgetData.options[1].type = ZOV_Color;
|
||||
} else if (widgetName == "Gauge") {
|
||||
zone.widgetData.options[0].type = ZOV_Source;
|
||||
zone.widgetData.options[3].type = ZOV_Color;
|
||||
} else if (widgetName == "Outputs") {
|
||||
zone.widgetData.options[2].type = ZOV_Color;
|
||||
zone.widgetData.options[3].type = ZOV_Color;
|
||||
zone.widgetData.options[4].type = ZOV_Color;
|
||||
} else if (widgetName == "Text") {
|
||||
zone.widgetData.options[1].type = ZOV_Color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,7 +168,7 @@ uint8_t select_zov(void* user, uint8_t* data, uint32_t bitoffs)
|
||||
data += bitoffs >> 3UL;
|
||||
data -= sizeof(ZoneOptionValueEnum);
|
||||
ZoneOptionValueEnum* p_zovt = (ZoneOptionValueEnum*)data;
|
||||
if (*p_zovt > ZOV_Source) return 0;
|
||||
if (*p_zovt > ZOV_Color) return 0;
|
||||
return *p_zovt;
|
||||
}
|
||||
|
||||
@@ -181,6 +181,23 @@ bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs,
|
||||
auto p_val = reinterpret_cast<ZoneOptionValue*>(data);
|
||||
return w_mixSrcRaw(nullptr, p_val->unsignedValue, wf, opaque);
|
||||
}
|
||||
|
||||
#include "colors.h"
|
||||
#define r_zov_color nullptr
|
||||
|
||||
bool w_zov_color(void* user, uint8_t* data, uint32_t bitoffs,
|
||||
yaml_writer_func wf, void* opaque)
|
||||
{
|
||||
data += bitoffs >> 3UL;
|
||||
auto p_val = reinterpret_cast<ZoneOptionValue*>(data);
|
||||
|
||||
uint32_t color = (uint32_t)GET_RED(p_val->unsignedValue) << 16 |
|
||||
(uint32_t)GET_GREEN(p_val->unsignedValue) << 8 |
|
||||
(uint32_t)GET_BLUE(p_val->unsignedValue);
|
||||
|
||||
if (!wf(opaque, "0x", 2)) return false;
|
||||
return wf(opaque, yaml_rgb2hex(color), 3 * 2);
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs)
|
||||
|
||||
@@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = {
|
||||
{ ZOV_Bool, "Bool" },
|
||||
{ ZOV_String, "String" },
|
||||
{ ZOV_Source, "Source" },
|
||||
{ ZOV_Color, "Color" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
const struct YamlIdStr enum_TimerModes[] = {
|
||||
@@ -336,6 +337,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = {
|
||||
YAML_UNSIGNED( "boolValue", 32 ),
|
||||
YAML_STRING("stringValue", 8),
|
||||
YAML_CUSTOM("source",r_zov_source,w_zov_source),
|
||||
YAML_CUSTOM("color",r_zov_color,w_zov_color),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_ZoneOptionValueTyped[] = {
|
||||
|
||||
@@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = {
|
||||
{ ZOV_Bool, "Bool" },
|
||||
{ ZOV_String, "String" },
|
||||
{ ZOV_Source, "Source" },
|
||||
{ ZOV_Color, "Color" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
const struct YamlIdStr enum_TimerModes[] = {
|
||||
@@ -357,6 +358,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = {
|
||||
YAML_UNSIGNED( "boolValue", 32 ),
|
||||
YAML_STRING("stringValue", 8),
|
||||
YAML_CUSTOM("source",r_zov_source,w_zov_source),
|
||||
YAML_CUSTOM("color",r_zov_color,w_zov_color),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_ZoneOptionValueTyped[] = {
|
||||
|
||||
@@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = {
|
||||
{ ZOV_Bool, "Bool" },
|
||||
{ ZOV_String, "String" },
|
||||
{ ZOV_Source, "Source" },
|
||||
{ ZOV_Color, "Color" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
const struct YamlIdStr enum_TimerModes[] = {
|
||||
@@ -357,6 +358,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = {
|
||||
YAML_UNSIGNED( "boolValue", 32 ),
|
||||
YAML_STRING("stringValue", 8),
|
||||
YAML_CUSTOM("source",r_zov_source,w_zov_source),
|
||||
YAML_CUSTOM("color",r_zov_color,w_zov_color),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_ZoneOptionValueTyped[] = {
|
||||
|
||||
@@ -37,7 +37,8 @@ enum ZoneOptionValueEnum {
|
||||
ZOV_Bool,
|
||||
ZOV_String,
|
||||
// added for conversion:
|
||||
ZOV_Source
|
||||
ZOV_Source,
|
||||
ZOV_Color
|
||||
};
|
||||
|
||||
struct ZoneOption
|
||||
|
||||
@@ -163,6 +163,29 @@ uint32_t yaml_str2uint(const char* val, uint8_t val_len)
|
||||
return yaml_str2uint_ref(val, val_len);
|
||||
}
|
||||
|
||||
uint32_t yaml_hex2uint(const char* val, uint8_t val_len)
|
||||
{
|
||||
uint32_t i_val = 0;
|
||||
|
||||
while(val_len > 0) {
|
||||
if (*val >= '0' && *val <= '9') {
|
||||
i_val <<= 4;
|
||||
i_val |= (*val - '0') & 0xF;
|
||||
} else if (*val >= 'A' && *val <= 'F') {
|
||||
i_val <<= 4;
|
||||
i_val |= (*val - 'A' + 10) & 0xF;
|
||||
} else if (*val >= 'a' && *val <= 'f') {
|
||||
i_val <<= 4;
|
||||
i_val |= (*val - 'a' + 10) & 0xF;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
val++; val_len--;
|
||||
}
|
||||
|
||||
return i_val;
|
||||
}
|
||||
|
||||
static char int2str_buffer[MAX_STR] = {0};
|
||||
static const char _int2str_lookup[] = { '0', '1', '2', '3', '4', '5', '6' , '7', '8', '9' };
|
||||
|
||||
@@ -188,6 +211,31 @@ char* yaml_signed2str(int32_t i)
|
||||
return yaml_unsigned2str((uint32_t)i);
|
||||
}
|
||||
|
||||
static const char _int2hex_lookup[] = {'0', '1', '2', '3',
|
||||
'4', '5', '6', '7',
|
||||
'8', '9', 'A', 'B',
|
||||
'C', 'D', 'E', 'F'};
|
||||
|
||||
char* yaml_unsigned2hex(uint32_t i)
|
||||
{
|
||||
char* c = int2str_buffer;
|
||||
for (int n = sizeof(uint32_t) * 2; n > 0; n--) {
|
||||
*(c++) = _int2hex_lookup[(i >> ((n - 1) * 4)) & 0xF];
|
||||
}
|
||||
*c = '\0';
|
||||
return int2str_buffer;
|
||||
}
|
||||
|
||||
char* yaml_rgb2hex(uint32_t i)
|
||||
{
|
||||
char* c = int2str_buffer;
|
||||
for (int n = 3 * 2; n > 0; n--) {
|
||||
*(c++) = _int2hex_lookup[(i >> ((n - 1) * 4)) & 0xF];
|
||||
}
|
||||
*c = '\0';
|
||||
return int2str_buffer;
|
||||
}
|
||||
|
||||
int32_t yaml_to_signed(uint32_t i, uint32_t bits)
|
||||
{
|
||||
if (i & (1 << (bits-1))) {
|
||||
|
||||
@@ -36,9 +36,14 @@ uint32_t yaml_str2uint_ref(const char* val, uint8_t val_len);
|
||||
int32_t yaml_str2int(const char* val, uint8_t val_len);
|
||||
uint32_t yaml_str2uint(const char* val, uint8_t val_len);
|
||||
|
||||
uint32_t yaml_hex2uint(const char* val, uint8_t val_len);
|
||||
|
||||
char* yaml_unsigned2str(uint32_t i);
|
||||
char* yaml_signed2str(int32_t i);
|
||||
|
||||
char* yaml_unsigned2hex(uint32_t i);
|
||||
char* yaml_rgb2hex(uint32_t i);
|
||||
|
||||
int32_t yaml_to_signed(uint32_t i, uint32_t bits);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -73,6 +73,9 @@ namespace yaml_conv_220 {
|
||||
|
||||
bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs,
|
||||
yaml_writer_func wf, void* opaque);
|
||||
|
||||
bool w_zov_color(void* user, uint8_t* data, uint32_t bitoffs,
|
||||
yaml_writer_func wf, void* opaque);
|
||||
};
|
||||
|
||||
//
|
||||
@@ -284,6 +287,30 @@ bool w_zov_source(void* user, uint8_t* data, uint32_t bitoffs,
|
||||
{
|
||||
return yaml_conv_220::w_zov_source(user, data, bitoffs, wf, opaque);
|
||||
}
|
||||
|
||||
void r_zov_color(void* user, uint8_t* data, uint32_t bitoffs,
|
||||
const char* val, uint8_t val_len)
|
||||
{
|
||||
if (val_len < sizeof("0xFFFFFF")-1
|
||||
|| val[0] != '0'
|
||||
|| val[1] != 'x')
|
||||
return;
|
||||
|
||||
val += 2; val_len -= 2;
|
||||
|
||||
data += bitoffs >> 3UL;
|
||||
auto p_val = reinterpret_cast<ZoneOptionValue*>(data);
|
||||
|
||||
auto rgb24 = yaml_hex2uint(val, val_len);
|
||||
p_val->unsignedValue =
|
||||
RGB((rgb24 & 0xFF0000) >> 16, (rgb24 & 0xFF00) >> 8, rgb24 & 0xFF);
|
||||
}
|
||||
|
||||
bool w_zov_color(void* user, uint8_t* data, uint32_t bitoffs,
|
||||
yaml_writer_func wf, void* opaque)
|
||||
{
|
||||
return yaml_conv_220::w_zov_color(user, data, bitoffs, wf, opaque);
|
||||
}
|
||||
#endif
|
||||
|
||||
static uint8_t select_mod_type(void* user, uint8_t* data, uint32_t bitoffs)
|
||||
|
||||
@@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = {
|
||||
{ ZOV_Bool, "Bool" },
|
||||
{ ZOV_String, "String" },
|
||||
{ ZOV_Source, "Source" },
|
||||
{ ZOV_Color, "Color" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
const struct YamlIdStr enum_TimerModes[] = {
|
||||
@@ -336,6 +337,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = {
|
||||
YAML_UNSIGNED( "boolValue", 32 ),
|
||||
YAML_STRING("stringValue", 8),
|
||||
YAML_CUSTOM("source",r_zov_source,w_zov_source),
|
||||
YAML_CUSTOM("color",r_zov_color,w_zov_color),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_ZoneOptionValueTyped[] = {
|
||||
|
||||
@@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = {
|
||||
{ ZOV_Bool, "Bool" },
|
||||
{ ZOV_String, "String" },
|
||||
{ ZOV_Source, "Source" },
|
||||
{ ZOV_Color, "Color" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
const struct YamlIdStr enum_TimerModes[] = {
|
||||
@@ -357,6 +358,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = {
|
||||
YAML_UNSIGNED( "boolValue", 32 ),
|
||||
YAML_STRING("stringValue", 8),
|
||||
YAML_CUSTOM("source",r_zov_source,w_zov_source),
|
||||
YAML_CUSTOM("color",r_zov_color,w_zov_color),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_ZoneOptionValueTyped[] = {
|
||||
|
||||
@@ -85,6 +85,7 @@ const struct YamlIdStr enum_ZoneOptionValueEnum[] = {
|
||||
{ ZOV_Bool, "Bool" },
|
||||
{ ZOV_String, "String" },
|
||||
{ ZOV_Source, "Source" },
|
||||
{ ZOV_Color, "Color" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
const struct YamlIdStr enum_TimerModes[] = {
|
||||
@@ -357,6 +358,7 @@ static const struct YamlNode union_ZoneOptionValue_elmts[] = {
|
||||
YAML_UNSIGNED( "boolValue", 32 ),
|
||||
YAML_STRING("stringValue", 8),
|
||||
YAML_CUSTOM("source",r_zov_source,w_zov_source),
|
||||
YAML_CUSTOM("color",r_zov_color,w_zov_color),
|
||||
YAML_END
|
||||
};
|
||||
static const struct YamlNode struct_ZoneOptionValueTyped[] = {
|
||||
|
||||
@@ -420,6 +420,10 @@ TEST(Conversions, ConversionTX16SFrom25)
|
||||
const auto& top_option = top_widget.widgetData.options[0];
|
||||
EXPECT_EQ(ZOV_Source, top_option.type);
|
||||
EXPECT_EQ(MIXSRC_TX_VOLTAGE, top_option.value.unsignedValue);
|
||||
|
||||
const auto& color_option = top_widget.widgetData.options[1];
|
||||
EXPECT_EQ(ZOV_Color, color_option.type);
|
||||
EXPECT_EQ(0xFFFF, color_option.value.unsignedValue);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user