VGM/RPC: Rework custom colors, smoother config, better rainbow support (#53)

* first poc works

* rainbow mode now works over rpc

still not done refrash rate from flipper change and is slow so the rainbow mode doesnt look good

* transmit VgmMode

* use all the 32bit

* some config stuff

* sync apps

* Change protobuf repo

* Some lib naming changes and cleanup

* Format protobuf

* Update from RGB backlight if enabled

* Remove old expansion toggling

* Update settings UI

* Fix searching previous value

* VGM Tool: Add new RGB firmware

* Update changelog

* These are unused

---------

Co-authored-by: Willy-JL <49810075+Willy-JL@users.noreply.github.com>
This commit is contained in:
HaxSam
2024-06-02 07:41:47 +00:00
committed by GitHub
parent f17b19ed7d
commit 2319475dd0
17 changed files with 200 additions and 232 deletions

View File

@@ -61,7 +61,7 @@ typedef struct {
bool subghz_extend;
bool subghz_bypass;
RgbColor lcd_color;
Rgb565Color vgm_color;
RgbColor vgm_color;
char device_name[FURI_HAL_VERSION_ARRAY_NAME_LENGTH];
int32_t dolphin_level;
int32_t dolphin_angry;

View File

@@ -46,25 +46,25 @@ static const struct {
RgbColor color;
} lcd_colors[] = {
// clang-format off
{"Off", {0, 0, 0}},
{"Orange", {255, 69, 0}},
{"Red", {255, 0, 0}},
{"Maroon", {128, 0, 0}},
{"Yellow", {255, 255, 0}},
{"Olive", {128, 128, 0}},
{"Lime", {0, 255, 0}},
{"Green", {0, 128, 0}},
{"Aqua", {0, 255, 127}},
{"Cyan", {0, 210, 210}},
{"Azure", {0, 127, 255}},
{"Teal", {0, 128, 128}},
{"Blue", {0, 0, 255}},
{"Navy", {0, 0, 128}},
{"Purple", {128, 0, 128}},
{"Fuchsia", {255, 0, 255}},
{"Pink", {173, 31, 173}},
{"Brown", {165, 42, 42}},
{"White", {255, 192, 203}},
{"Off", {{0, 0, 0}}},
{"Orange", {{255, 69, 0}}},
{"Red", {{255, 0, 0}}},
{"Maroon", {{128, 0, 0}}},
{"Yellow", {{255, 255, 0}}},
{"Olive", {{128, 128, 0}}},
{"Lime", {{0, 255, 0}}},
{"Green", {{0, 128, 0}}},
{"Aqua", {{0, 255, 127}}},
{"Cyan", {{0, 210, 210}}},
{"Azure", {{0, 127, 255}}},
{"Teal", {{0, 128, 128}}},
{"Blue", {{0, 0, 255}}},
{"Navy", {{0, 0, 128}}},
{"Purple", {{128, 0, 128}}},
{"Fuchsia", {{255, 0, 255}}},
{"Pink", {{173, 31, 173}}},
{"Brown", {{165, 42, 42}}},
{"White", {{255, 192, 203}}},
// clang-format on
};
static const size_t lcd_sz = COUNT_OF(lcd_colors);
@@ -74,10 +74,6 @@ static void momentum_app_scene_misc_screen_lcd_color_changed(VariableItem* item,
variable_item_set_current_value_text(item, lcd_colors[index].name);
rgb_backlight_set_color(led, &lcd_colors[index].color);
app->save_backlight = true;
if(momentum_settings.vgm_color_mode == VgmColorModeRgbBacklight) {
expansion_disable(app->expansion);
expansion_enable(app->expansion);
}
}
static void momentum_app_scene_misc_screen_lcd_color_0_changed(VariableItem* item) {
momentum_app_scene_misc_screen_lcd_color_changed(item, 0);

View File

@@ -43,10 +43,6 @@ bool momentum_app_scene_misc_screen_color_on_event(void* context, SceneManagerEv
scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneMiscScreenColor),
&app->lcd_color);
app->save_backlight = true;
if(momentum_settings.vgm_color_mode == VgmColorModeRgbBacklight) {
expansion_disable(app->expansion);
expansion_enable(app->expansion);
}
scene_manager_previous_scene(app->scene_manager);
break;
default:

View File

@@ -1,7 +1,6 @@
#include "../momentum_app.h"
enum VarItemListIndex {
VarItemListIndexColors,
VarItemListIndexForeground,
VarItemListIndexBackground,
};
@@ -11,78 +10,74 @@ void momentum_app_scene_misc_vgm_var_item_list_callback(void* context, uint32_t
view_dispatcher_send_custom_event(app->view_dispatcher, index);
}
const char* const colors_names[VgmColorModeCount] = {
"Default",
"Custom",
"Rainbow",
"RGB Backlight",
};
static void momentum_app_scene_misc_vgm_colors_changed(VariableItem* item) {
MomentumApp* app = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
variable_item_set_current_value_text(item, colors_names[index]);
momentum_settings.vgm_color_mode = index;
app->save_settings = true;
variable_item_set_locked(
variable_item_list_get(app->var_item_list, VarItemListIndexForeground),
index != VgmColorModeCustom,
NULL);
variable_item_set_locked(
variable_item_list_get(app->var_item_list, VarItemListIndexBackground),
index != VgmColorModeCustom,
NULL);
expansion_disable(app->expansion);
expansion_enable(app->expansion);
}
static const struct {
char* name;
Rgb565Color color;
RgbColor color;
} vgm_colors[] = {
// clang-format off
{"Orange", {0xFC00}},
{"Black", {0x0000}},
{"Red", {0xF800}},
{"Maroon", {0x8000}},
{"Yellow", {0xFFE0}},
{"Olive", {0x8400}},
{"Lime", {0x07E0}},
{"Green", {0x0400}},
{"Aqua", {0x07EF}},
{"Cyan", {0x069A}},
{"Azure", {0x03FF}},
{"Teal", {0x0410}},
{"Blue", {0x001F}},
{"Navy", {0x0010}},
{"Purple", {0x8010}},
{"Fuchsia", {0xF81F}},
{"Pink", {0xA8F5}},
{"Brown", {0xA145}},
{"White", {0xFFFF}},
{"Default", {{0, 0, 0}}},
{"Rainbow", {{0, 0, 0}}},
{"RgbMod", {{0, 0, 0}}},
{"Black", {{0, 0, 0}}},
{"Orange", {{255, 130, 0}}},
{"Red", {{255, 0, 0}}},
{"Maroon", {{128, 0, 0}}},
{"Yellow", {{255, 255, 0}}},
{"Olive", {{128, 128, 0}}},
{"Lime", {{0, 255, 0}}},
{"Green", {{0, 128, 0}}},
{"Aqua", {{0, 255, 127}}},
{"Cyan", {{0, 210, 210}}},
{"Azure", {{0, 127, 255}}},
{"Teal", {{0, 128, 128}}},
{"Blue", {{0, 0, 255}}},
{"Navy", {{0, 0, 128}}},
{"Purple", {{128, 0, 128}}},
{"Fuchsia", {{255, 0, 255}}},
{"Pink", {{173, 31, 173}}},
{"Brown", {{165, 42, 42}}},
{"White", {{255, 192, 203}}},
// clang-format on
};
static const size_t vgm_colors_count = COUNT_OF(vgm_colors);
static void momentum_app_scene_misc_vgm_foreground_changed(VariableItem* item) {
MomentumApp* app = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
variable_item_set_current_value_text(item, vgm_colors[index].name);
momentum_settings.vgm_color_fg = vgm_colors[index].color;
app->save_settings = true;
if(momentum_settings.vgm_color_mode == VgmColorModeCustom) {
expansion_disable(app->expansion);
expansion_enable(app->expansion);
momentum_settings.rpc_color_fg.rgb = vgm_colors[index].color;
if(strcmp("Default", vgm_colors[index].name) == 0) {
momentum_settings.rpc_color_fg.mode = ScreenColorModeDefault;
} else if(strcmp("Rainbow", vgm_colors[index].name) == 0) {
momentum_settings.rpc_color_fg.mode = ScreenColorModeRainbow;
} else if(strcmp("RgbMod", vgm_colors[index].name) == 0) {
momentum_settings.rpc_color_fg.mode = ScreenColorModeRgbBacklight;
} else {
momentum_settings.rpc_color_fg.mode = ScreenColorModeCustom;
}
app->save_settings = true;
}
static void momentum_app_scene_misc_vgm_background_changed(VariableItem* item) {
MomentumApp* app = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
variable_item_set_current_value_text(item, vgm_colors[index].name);
momentum_settings.vgm_color_bg = vgm_colors[index].color;
app->save_settings = true;
if(momentum_settings.vgm_color_mode == VgmColorModeCustom) {
expansion_disable(app->expansion);
expansion_enable(app->expansion);
momentum_settings.rpc_color_bg.rgb = vgm_colors[index].color;
if(strcmp("Default", vgm_colors[index].name) == 0) {
momentum_settings.rpc_color_bg.mode = ScreenColorModeDefault;
} else if(strcmp("Rainbow", vgm_colors[index].name) == 0) {
momentum_settings.rpc_color_bg.mode = ScreenColorModeRainbow;
} else if(strcmp("RgbMod", vgm_colors[index].name) == 0) {
momentum_settings.rpc_color_bg.mode = ScreenColorModeRgbBacklight;
} else {
momentum_settings.rpc_color_bg.mode = ScreenColorModeCustom;
}
app->save_settings = true;
}
void momentum_app_scene_misc_vgm_on_enter(void* context) {
@@ -91,40 +86,38 @@ void momentum_app_scene_misc_vgm_on_enter(void* context) {
VariableItem* item;
uint8_t value_index;
item = variable_item_list_add(
var_item_list,
"VGM Colors",
VgmColorModeCount,
momentum_app_scene_misc_vgm_colors_changed,
app);
value_index = momentum_settings.vgm_color_mode;
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, colors_names[value_index]);
item = variable_item_list_add(
var_item_list,
"Foreground",
vgm_colors_count,
momentum_app_scene_misc_vgm_foreground_changed,
app);
Rgb565Color color = momentum_settings.vgm_color_fg;
bool found = false;
for(size_t i = 0; i < vgm_colors_count; i++) {
if(rgb565cmp(&color, &vgm_colors[i].color) != 0) continue;
value_index = i;
found = true;
break;
ScreenFrameColor color = momentum_settings.rpc_color_fg;
bool found = true;
if(color.mode == ScreenColorModeRainbow) {
value_index = 1;
} else if(color.mode == ScreenColorModeRgbBacklight) {
value_index = 2;
} else if(color.mode == ScreenColorModeCustom) {
found = false;
for(size_t i = 3; i < vgm_colors_count; i++) {
if(rgbcmp(&color.rgb, &vgm_colors[i].color) != 0) continue;
value_index = i;
found = true;
break;
}
} else {
value_index = 0;
}
variable_item_set_current_value_index(item, found ? value_index : vgm_colors_count);
variable_item_set_current_value_index(item, found ? value_index : 0);
if(found) {
variable_item_set_current_value_text(item, vgm_colors[value_index].name);
} else {
char str[5];
snprintf(str, sizeof(str), "%04X", color.value);
char str[7];
snprintf(str, sizeof(str), "%02X%02X%02X", color.rgb.r, color.rgb.g, color.rgb.b);
variable_item_set_current_value_text(item, str);
}
variable_item_set_locked(
item, momentum_settings.vgm_color_mode != VgmColorModeCustom, "Need Custom\nColors!");
item = variable_item_list_add(
var_item_list,
@@ -132,24 +125,32 @@ void momentum_app_scene_misc_vgm_on_enter(void* context) {
vgm_colors_count,
momentum_app_scene_misc_vgm_background_changed,
app);
color = momentum_settings.vgm_color_bg;
found = false;
for(size_t i = 0; i < vgm_colors_count; i++) {
if(rgb565cmp(&color, &vgm_colors[i].color) != 0) continue;
value_index = i;
found = true;
break;
color = momentum_settings.rpc_color_bg;
found = true;
if(color.mode == ScreenColorModeRainbow) {
value_index = 1;
} else if(color.mode == ScreenColorModeRgbBacklight) {
value_index = 2;
} else if(color.mode == ScreenColorModeCustom) {
found = false;
for(size_t i = 3; i < vgm_colors_count; i++) {
if(rgbcmp(&color.rgb, &vgm_colors[i].color) != 0) continue;
value_index = i;
found = true;
break;
}
} else {
value_index = 0;
}
variable_item_set_current_value_index(item, found ? value_index : vgm_colors_count);
variable_item_set_current_value_index(item, found ? value_index : 0);
if(found) {
variable_item_set_current_value_text(item, vgm_colors[value_index].name);
} else {
char str[5];
snprintf(str, sizeof(str), "%04X", color.value);
char str[7];
snprintf(str, sizeof(str), "%02X%02X%02X", color.rgb.r, color.rgb.g, color.rgb.b);
variable_item_set_current_value_text(item, str);
}
variable_item_set_locked(
item, momentum_settings.vgm_color_mode != VgmColorModeCustom, "Need Custom\nColors!");
variable_item_list_set_enter_callback(
var_item_list, momentum_app_scene_misc_vgm_var_item_list_callback, app);
@@ -167,6 +168,7 @@ bool momentum_app_scene_misc_vgm_on_event(void* context, SceneManagerEvent event
if(event.type == SceneManagerEventTypeCustom) {
scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneMiscVgm, event.event);
consumed = true;
switch(event.event) {
case VarItemListIndexForeground:
case VarItemListIndexBackground:

View File

@@ -14,14 +14,13 @@ void momentum_app_scene_misc_vgm_color_on_enter(void* context) {
MomentumApp* app = context;
ByteInput* byte_input = app->byte_input;
byte_input_set_header_text(byte_input, "Set VGM Color (RGB565)");
byte_input_set_header_text(byte_input, "Set VGM Color (#RRGGBB)");
if(scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneMiscVgmColor)) {
app->vgm_color = momentum_settings.vgm_color_bg;
app->vgm_color = momentum_settings.rpc_color_bg.rgb;
} else {
app->vgm_color = momentum_settings.vgm_color_fg;
app->vgm_color = momentum_settings.rpc_color_fg.rgb;
}
app->vgm_color.value = __REVSH(app->vgm_color.value);
byte_input_set_result_callback(
byte_input,
@@ -42,17 +41,12 @@ bool momentum_app_scene_misc_vgm_color_on_event(void* context, SceneManagerEvent
consumed = true;
switch(event.event) {
case ByteInputResultOk:
app->vgm_color.value = __REVSH(app->vgm_color.value);
if(scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneMiscVgmColor)) {
momentum_settings.vgm_color_bg = app->vgm_color;
momentum_settings.rpc_color_bg.rgb = app->vgm_color;
} else {
momentum_settings.vgm_color_fg = app->vgm_color;
momentum_settings.rpc_color_fg.rgb = app->vgm_color;
}
app->save_settings = true;
if(momentum_settings.vgm_color_mode == VgmColorModeCustom) {
expansion_disable(app->expansion);
expansion_enable(app->expansion);
}
scene_manager_previous_scene(app->scene_manager);
break;
default: