mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-04-24 03:29:57 -07:00
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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user