RGB mod rainbow effect done.

This commit is contained in:
Dmitry422
2025-03-10 20:51:09 +07:00
parent bf50f0cd20
commit 5e6c238389
5 changed files with 169 additions and 93 deletions

View File

@@ -189,7 +189,7 @@ static void notification_display_timer(void* ctx) {
notification_message(app, &sequence_display_backlight_off);
}
// RGB MOD RAINBOW SECTION
// --- RGB MOD RAINBOW SECTION ---
//start furi timer for rgb_mod_rainbow
static void rgb_mod_rainbow_timer_start(NotificationApp* app) {
@@ -202,10 +202,15 @@ static void rgb_mod_rainbow_timer_stop(NotificationApp* app) {
furi_timer_stop(app->rgb_mod_rainbow_timer);
}
// start/stop rgb_mod_rainbow_timer only if rgb_mod_installed
static void rgb_mod_rainbow_timer_control(NotificationApp* app) {
// start/restart/stop rgb_mod_rainbow_timer only if rgb_mod_installed and apply rainbow colors to backlight
static void rgb_mod_rainbow_timer_starter(NotificationApp* app) {
if(app->settings.rgb_mod_installed) {
if(app->settings.rgb_mod_rainbow) {
if(app->settings.rgb_mod_rainbow_mode > 0) {
rgb_mod_rainbow_update(
app->rgb_mod_rainbow_red,
app->rgb_mod_rainbow_green,
app->rgb_mod_rainbow_blue,
app->settings.display_brightness);
rgb_mod_rainbow_timer_start(app);
} else {
if(furi_timer_is_running(app->rgb_mod_rainbow_timer)) {
@@ -220,34 +225,74 @@ static void rgb_mod_rainbow_timer_callback(void* context) {
furi_assert(context);
NotificationApp* app = context;
// При выключении радуги активировать настроенный в меню цвет
// if rgb_mode_rainbow_mode is rainbow do rainbow effect
if(app->settings.rgb_mod_rainbow_mode == 1) {
switch(app->rgb_mod_rainbow_stage) {
// from red to yellow
case 1:
app->rgb_mod_rainbow_green += app->settings.rgb_mod_rainbow_step;
if(app->rgb_mod_rainbow_green >= 255) {
app->rgb_mod_rainbow_green = 255;
app->rgb_mod_rainbow_stage++;
}
break;
// yellow red to green
case 2:
app->rgb_mod_rainbow_red -= app->settings.rgb_mod_rainbow_step;
if(app->rgb_mod_rainbow_red <= 0) {
app->rgb_mod_rainbow_red = 0;
app->rgb_mod_rainbow_stage++;
}
break;
// from green to light blue
case 3:
app->rgb_mod_rainbow_blue += app->settings.rgb_mod_rainbow_step;
if(app->rgb_mod_rainbow_blue >= 255) {
app->rgb_mod_rainbow_blue = 255;
app->rgb_mod_rainbow_stage++;
}
break;
//from light blue to blue
case 4:
app->rgb_mod_rainbow_green -= app->settings.rgb_mod_rainbow_step;
if(app->rgb_mod_rainbow_green <= 0) {
app->rgb_mod_rainbow_green = 0;
app->rgb_mod_rainbow_stage++;
}
break;
//from blue to violet
case 5:
app->rgb_mod_rainbow_red += app->settings.rgb_mod_rainbow_step;
if(app->rgb_mod_rainbow_red >= 255) {
app->rgb_mod_rainbow_red = 255;
app->rgb_mod_rainbow_stage++;
}
break;
//from violet to red
case 6:
app->rgb_mod_rainbow_blue -= app->settings.rgb_mod_rainbow_step;
if(app->rgb_mod_rainbow_blue <= 0) {
app->rgb_mod_rainbow_blue = 0;
app->rgb_mod_rainbow_stage = 1;
}
break;
default:
break;
}
if(app->rgb_mod_rainbow_red >= 255) {
app->rgb_mod_rainbow_red = 1;
app->rgb_mod_rainbow_green += app->settings.rgb_mod_rainbow_step;
rgb_mod_rainbow_update(
app->rgb_mod_rainbow_red,
app->rgb_mod_rainbow_green,
app->rgb_mod_rainbow_blue,
app->settings.display_brightness);
}
if(app->rgb_mod_rainbow_green >= 255) {
app->rgb_mod_rainbow_green = 1;
app->rgb_mod_rainbow_blue += app->settings.rgb_mod_rainbow_step;
}
if(app->rgb_mod_rainbow_blue >= 255) {
app->rgb_mod_rainbow_blue = 1;
}
rgb_backlight_set_custom_color(app->rgb_mod_rainbow_red, 0);
rgb_backlight_set_custom_color(app->rgb_mod_rainbow_green, 1);
rgb_backlight_set_custom_color(app->rgb_mod_rainbow_blue, 2);
FURI_LOG_I("RAINBOW", "RED %u", app->rgb_mod_rainbow_red);
FURI_LOG_I("RAINBOW", "GREEN %u", app->rgb_mod_rainbow_green);
FURI_LOG_I("RAINBOW", "BLUE %u", app->rgb_mod_rainbow_blue);
app->rgb_mod_rainbow_red += app->settings.rgb_mod_rainbow_step;
// if rgb_mode_rainbow_mode is ..... do another effect
// if(app->settings.rgb_mod_rainbow_mode == 2) {
// }
}
// END OF RGB MOD RAINBOW SECTION
// --- END OF RGB MOD RAINBOW SECTION ---
// message processing
static void notification_process_notification_message(
@@ -279,8 +324,10 @@ static void notification_process_notification_message(
&app->display,
notification_message->data.led.value * display_brightness_setting);
reset_mask |= reset_display_mask;
//start rgb_mod_rainbow_timer when display backlight is ON and all corresponding settings is ON too
rgb_mod_rainbow_timer_control(app);
rgb_mod_rainbow_timer_starter(app);
} else {
reset_mask &= ~reset_display_mask;
notification_reset_notification_led_layer(&app->display);
@@ -617,25 +664,23 @@ static NotificationApp* notification_app_alloc(void) {
furi_pubsub_subscribe(app->event_record, input_event_callback, app);
notification_message(app, &sequence_display_backlight_on);
//RGB MOD SECTION
// --- RGB MOD INIT SETTINGS SECTION ---
//rgb mod
app->settings.rgb_mod_installed = false;
//rgb mod rainbow init settings
app->settings.rgb_mod_rainbow = false;
app->settings.rgb_mod_rainbow_speed_ms = 1000;
app->settings.rgb_mod_rainbow_step = 1;
app->rgb_mod_rainbow_red = 1;
app->rgb_mod_rainbow_green = 1;
app->rgb_mod_rainbow_blue = 1;
app->settings.rgb_mod_rainbow_mode = 0;
app->settings.rgb_mod_rainbow_speed_ms = 100;
app->settings.rgb_mod_rainbow_step = 5;
app->rgb_mod_rainbow_red = 255;
app->rgb_mod_rainbow_green = 0;
app->rgb_mod_rainbow_blue = 0;
app->rgb_mod_rainbow_stage = 1;
//define rgb_mod_rainbow_timer and they callback
app->rgb_mod_rainbow_timer =
furi_timer_alloc(rgb_mod_rainbow_timer_callback, FuriTimerTypePeriodic, app);
return app;
// END OF RGB SECTION
// --- END OF RGB MOD INIT SETTINGS SECTION ---
}
static void notification_storage_callback(const void* message, void* context) {
@@ -658,8 +703,8 @@ static void notification_apply_settings(NotificationApp* app) {
}
notification_apply_lcd_contrast(app);
// on system init start rgb_mod_rainbow_timer if they ON in config
rgb_mod_rainbow_timer_control(app);
//start rgb_mod_rainbow_timer on system init if they ON in config
rgb_mod_rainbow_timer_starter(app);
}
static void notification_init_settings(NotificationApp* app) {
@@ -702,10 +747,10 @@ int32_t notification_srv(void* p) {
notification_process_internal_message(app, &message);
break;
case SaveSettingsMessage:
notification_save_settings(app);
rgb_backlight_save_settings();
//call rgb_mod_timer_control (start or stop) when we save settings
rgb_mod_rainbow_timer_control(app);
rgb_mod_rainbow_timer_starter(app);
rgb_backlight_save_settings();
notification_save_settings(app);
break;
case LoadSettingsMessage:
notification_load_settings(app);