diff --git a/applications/services/rgb_backlight/rgb_backlight.c b/applications/services/rgb_backlight/rgb_backlight.c index 03f8f9af0..053654ec2 100644 --- a/applications/services/rgb_backlight/rgb_backlight.c +++ b/applications/services/rgb_backlight/rgb_backlight.c @@ -23,11 +23,26 @@ #include #include #include "rgb_backlight.h" +#include #define COLOR_COUNT (sizeof(colors) / sizeof(RGBBacklightColor)) #define TAG "RGB_BACKLIGHT_SRV" +typedef struct { + char* name; + uint8_t red; + uint8_t green; + uint8_t blue; +} RGBBacklightColor; + +// use one type RGBBacklightColor for current_leds_settings and for static colors definition +static RGBBacklightColor current_led[] = { + {"LED0", 0, 0, 0}, + {"LED1", 0, 0, 0}, + {"LED2", 0, 0, 0}, +}; + static const RGBBacklightColor colors[] = { {"Orange", 255, 60, 0}, {"Yellow", 255, 144, 0}, @@ -42,7 +57,7 @@ static const RGBBacklightColor colors[] = { {"Pink", 255, 0, 127}, {"Red", 255, 0, 0}, {"White", 254, 210, 200}, - {"Custom", 0, 0, 0}, + {"OFF", 0, 0, 0}, }; uint8_t rgb_backlight_get_color_count(void) { @@ -54,39 +69,77 @@ const char* rgb_backlight_get_color_text(uint8_t index) { } // use RECORD for acces to rgb service instance and update current colors by static -void rgb_backlight_set_static_color(uint8_t index) { - RGBBacklightApp* app = furi_record_open(RECORD_RGB_BACKLIGHT); +void rgb_backlight_set_led_static_color(uint8_t led, uint8_t index) { + if(led < SK6805_get_led_count()) { + uint8_t r = colors[index].red; + uint8_t g = colors[index].green; + uint8_t b = colors[index].blue; - //if user select "custom" value then set current colors by custom values - if(index == 13) { - app->current_red = app->settings->custom_red; - app->current_green = app->settings->custom_green; - app->current_blue = app->settings->custom_blue; - } else { - app->current_red = colors[index].red; - app->current_green = colors[index].green; - app->current_blue = colors[index].blue; + current_led[led].red = r; + current_led[led].green = g; + current_led[led].blue = b; + + SK6805_set_led_color(led, r, g, b); } - furi_record_close(RECORD_RGB_BACKLIGHT); } -// use RECORD for acces to rgb service instance and update current colors by custom -void rgb_backlight_set_custom_color(uint8_t red, uint8_t green, uint8_t blue) { - RGBBacklightApp* app = furi_record_open(RECORD_RGB_BACKLIGHT); - app->current_red = red; - app->current_green = green; - app->current_blue = blue; - furi_record_close(RECORD_RGB_BACKLIGHT); +// HSV to RGB based on +// https://www.radiokot.ru/forum/viewtopic.php?p=3000181&ysclid=m88wvoz34w244644702 +// https://radiolaba.ru/microcotrollers/tsvetnaya-lampa.html#comment-1790 +// https://alexgyver.ru/lessons/arduino-rgb/?ysclid=m88voflppa24464916 +// led number (0-2), hue (0..255), sat (0..255), val (0...1) +void rgb_backlight_set_led_custom_hsv_color(uint8_t led, uint16_t hue, uint8_t sat, float V) { + // init value + float r = 1.0f; + float g = 1.0f; + float b = 1.0f; + + // from (0..255) to (0..1) + float H = hue / 255.0f; + float S = sat / 255.0f; + + uint8_t i = trunc(H * 6); + float f = H * 6 - i; + float p = V * (1 - S); + float q = V * (1 - f * S); + float t = V * (1 - (1 - f) * S); + + switch(i) { + case 0: + r = V, g = t, b = p; + break; + case 1: + r = q, g = V, b = p; + break; + case 2: + r = p, g = V, b = t; + break; + case 3: + r = p, g = q, b = V; + break; + case 4: + r = t, g = p, b = V; + break; + case 5: + r = V, g = p, b = q; + break; + } + + // from (0..1) to (0..255) + current_led[led].red = r * 255; + current_led[led].green = g * 255; + current_led[led].blue = b * 255; } -// use RECORD for acces to rgb service instance, use current_* colors and update backlight +// use RECORD for acces to rgb service instance, set current_* colors to led and update backlight void rgb_backlight_update(float brightness) { RGBBacklightApp* app = furi_record_open(RECORD_RGB_BACKLIGHT); - if(app->settings->rgb_mod_installed) { + + if(app->settings->rgb_backlight_installed) { for(uint8_t i = 0; i < SK6805_get_led_count(); i++) { - uint8_t r = app->current_red * (brightness / 1.0f); - uint8_t g = app->current_green * (brightness / 1.0f); - uint8_t b = app->current_blue * (brightness / 1.0f); + uint8_t r = current_led[i].red * (brightness * 1.0f); + uint8_t g = current_led[i].green * (brightness * 1.0f); + uint8_t b = current_led[i].blue * (brightness * 1.0f); SK6805_set_led_color(i, r, g, b); } SK6805_update(); @@ -94,90 +147,73 @@ void rgb_backlight_update(float brightness) { furi_record_close(RECORD_RGB_BACKLIGHT); } -//start furi timer for rainbow +// start furi timer for rainbow void rainbow_timer_start(RGBBacklightApp* app) { furi_timer_start(app->rainbow_timer, furi_ms_to_ticks(app->settings->rainbow_speed_ms)); } -//stop furi timer for rainbow +// stop furi timer for rainbow void rainbow_timer_stop(RGBBacklightApp* app) { furi_timer_stop(app->rainbow_timer); } -// if rgb_mod_installed then apply rainbow colors to backlight and start/restart/stop rainbow_timer +// if rgb_backlight_installed then apply rainbow colors to backlight and start/restart/stop rainbow_timer void rainbow_timer_starter(RGBBacklightApp* app) { - if((app->settings->rainbow_mode > 0) && (app->settings->rgb_mod_installed)) { + if((app->settings->rainbow_mode > 0) && (app->settings->rgb_backlight_installed)) { rainbow_timer_start(app); - } else { - if(furi_timer_is_running(app->rainbow_timer)) { - rainbow_timer_stop(app); - } } } + static void rainbow_timer_callback(void* context) { furi_assert(context); RGBBacklightApp* app = context; - // if rainbow_mode is rainbow do rainbow effect - if(app->settings->rainbow_mode == 1) { - switch(app->rainbow_stage) { - // from red to yellow (255,0,0) - (255,255,0) + if(app->settings->rgb_backlight_installed) { + app->rainbow_hue += app->settings->rainbow_step; + if(app->rainbow_hue > 254) { + app->rainbow_hue = 0; + } + + uint8_t wide = app->settings->rainbow_wide; + + switch(app->settings->rainbow_mode) { + //rainbow mode case 1: - app->current_green += app->settings->rainbow_step; - if(app->current_green >= 255) { - app->current_green = 255; - app->rainbow_stage++; + for(uint8_t i = 0; i < SK6805_get_led_count(); i++) { + rgb_backlight_set_led_custom_hsv_color( + i, + app->rainbow_hue, + app->settings->rainbow_saturation, + app->settings->brightness); } break; - // yellow to green (255,255,0) - (0,255,0) + + //wave mode case 2: - app->current_red -= app->settings->rainbow_step; - if(app->current_red <= 0) { - app->current_red = 0; - app->rainbow_stage++; + uint16_t j = app->rainbow_hue + wide; + uint16_t k = app->rainbow_hue + wide * 2; + + if(app->rainbow_hue > (254 - wide)) { + j = j - 255; } - break; - // from green to light blue (0,255,0) - (0,255,255) - case 3: - app->current_blue += app->settings->rainbow_step; - if(app->current_blue >= 255) { - app->current_blue = 255; - app->rainbow_stage++; - } - break; - //from light blue to blue (0,255,255) - (0,0,255) - case 4: - app->current_green -= app->settings->rainbow_step; - if(app->current_green <= 0) { - app->current_green = 0; - app->rainbow_stage++; - } - break; - //from blue to violet (0,0,255) - (255,0,255) - case 5: - app->current_red += app->settings->rainbow_step; - if(app->current_red >= 255) { - app->current_red = 255; - app->rainbow_stage++; - } - break; - //from violet to red (255,0,255) - (255,0,0) - case 6: - app->current_blue -= app->settings->rainbow_step; - if(app->current_blue <= 0) { - app->current_blue = 0; - app->rainbow_stage = 1; + if(app->rainbow_hue > (254 - wide * 2)) { + k = k - 255; } + + rgb_backlight_set_led_custom_hsv_color( + 0, app->rainbow_hue, app->settings->rainbow_saturation, app->settings->brightness); + rgb_backlight_set_led_custom_hsv_color( + 1, j, app->settings->rainbow_saturation, app->settings->brightness); + rgb_backlight_set_led_custom_hsv_color( + 2, k, app->settings->rainbow_saturation, app->settings->brightness); break; + default: break; } + rgb_backlight_update(app->settings->brightness); } - - // if rainbow_mode is ..... do another effect - // if(app->settings.rainbow_mode == ...) { - // } } int32_t rgb_backlight_srv(void* p) { @@ -187,47 +223,41 @@ int32_t rgb_backlight_srv(void* p) { // allocate memory and create RECORD for access to app structure from outside RGBBacklightApp* app = malloc(sizeof(RGBBacklightApp)); - //define rainbow_timer and they callback + // define rainbow_timer and they callback app->rainbow_timer = furi_timer_alloc(rainbow_timer_callback, FuriTimerTypePeriodic, app); // settings load or create default app->settings = malloc(sizeof(RGBBacklightSettings)); rgb_backlight_settings_load(app->settings); - // Init app variables - app->rainbow_stage = 1; + app->rainbow_hue = 1; furi_record_create(RECORD_RGB_BACKLIGHT, app); - // if rgb mod installed - start rainbow or set static color from settings (default index = 0) - if(app->settings->rgb_mod_installed) { + // if rgb_backlight_installed then start rainbow or set leds colors from saved settings (default index = 0) + if(app->settings->rgb_backlight_installed) { if(app->settings->rainbow_mode > 0) { - rainbow_timer_starter(app); + rainbow_timer_start(app); } else { - rgb_backlight_set_static_color(app->settings->static_color_index); + rgb_backlight_set_led_static_color(2, app->settings->led_2_color_index); + rgb_backlight_set_led_static_color(1, app->settings->led_1_color_index); + rgb_backlight_set_led_static_color(0, app->settings->led_0_color_index); rgb_backlight_update(app->settings->brightness); } - // if rgb mod not installed - set default static orange color (index=0) + // if rgb_backlight not installed then set default static orange color(index=0) to all leds (0-2) and force light on } else { - //rgb_backlight_set_static_color(0); - //rgb_backlight_update(app->settings->brightness); - rgb_backlight_set_static_color(0); - for(uint8_t i = 0; i < SK6805_get_led_count(); i++) { - uint8_t r = app->current_red * (1.0f / 1.0f); - uint8_t g = app->current_green * (1.0f / 1.0f); - uint8_t b = app->current_blue * (1.0f / 1.0f); - SK6805_set_led_color(i, r, g, b); - } + rgb_backlight_set_led_static_color(2, 0); + rgb_backlight_set_led_static_color(1, 0); + rgb_backlight_set_led_static_color(0, 0); SK6805_update(); } while(1) { - // place for message queue and other future options furi_delay_ms(5000); - if(app->settings->rgb_mod_installed) { - FURI_LOG_D(TAG, "Mod is enabled - serivce is running"); + if(app->settings->rgb_backlight_installed) { + FURI_LOG_D(TAG, "RGB backlight enabled - serivce is running"); } else { - FURI_LOG_D(TAG, "Mod is DISABLED - serivce is running"); + FURI_LOG_D(TAG, "RGB backlight DISABLED - serivce is running"); } } return 0; diff --git a/applications/services/rgb_backlight/rgb_backlight.h b/applications/services/rgb_backlight/rgb_backlight.h index fd683bf16..d6f8b5fce 100644 --- a/applications/services/rgb_backlight/rgb_backlight.h +++ b/applications/services/rgb_backlight/rgb_backlight.h @@ -26,34 +26,71 @@ extern "C" { #endif -typedef struct { - char* name; - uint8_t red; - uint8_t green; - uint8_t blue; -} RGBBacklightColor; - typedef struct { FuriTimer* rainbow_timer; - - int16_t current_red; - int16_t current_green; - int16_t current_blue; - uint8_t rainbow_stage; - + uint16_t rainbow_hue; + uint8_t rainbow_red; + uint8_t rainbow_green; + uint8_t rainbow_blue; RGBBacklightSettings* settings; - } RGBBacklightApp; #define RECORD_RGB_BACKLIGHT "rgb_backlight" +/** Update leds colors from current_led[i].color and selected bright + * + * @param brightness - Brightness 0..1 + * @return + */ void rgb_backlight_update(float brightness); -void rgb_backlight_set_custom_color(uint8_t red, uint8_t green, uint8_t blue); -void rgb_backlight_set_static_color(uint8_t index); + +/** Set current_led[i].color for one led by static color index + * + * @param led - Led number (0..2) + * @param index - Static color index number + * @return + */ +void rgb_backlight_set_led_static_color(uint8_t led, uint8_t index); + +/** Stop rainbow timer + * + * @param app - Instance of RGBBacklightApp from FURI RECORD + * @return + */ void rainbow_timer_stop(RGBBacklightApp* app); + +/** Start rainbow timer + * + * @param app - Instance of RGBBacklightApp from FURI RECORD + * @return + */ + +/** Start rainbow timer + * + * @param app - Instance of RGBBacklightApp from FURI RECORD + * @return + */ void rainbow_timer_start(RGBBacklightApp* app); + +/** Start rainbow timer only if all conditions meet (rgb_backlight_installed && rainbow ON) + * + * @param app - Instance of RGBBacklightApp from FURI RECORD + * @return + */ void rainbow_timer_starter(RGBBacklightApp* app); + +/** Get name of static color by index + * + * @param index - Static colors index number + * @return - color name + */ const char* rgb_backlight_get_color_text(uint8_t index); + +/** Get static colors count + * + * @param + * @return - colors count + */ uint8_t rgb_backlight_get_color_count(void); #ifdef __cplusplus diff --git a/applications/services/rgb_backlight/rgb_backlight_settings.c b/applications/services/rgb_backlight/rgb_backlight_settings.c index 7e69eb0dc..f612507e4 100644 --- a/applications/services/rgb_backlight/rgb_backlight_settings.c +++ b/applications/services/rgb_backlight/rgb_backlight_settings.c @@ -10,21 +10,26 @@ #define RGB_BACKLIGHT_SETTINGS_MAGIC (0x30) #define RGB_BACKLIGHT_SETTINGS_VER_PREV (0) // Previous version number -#define RGB_BACKLIGHT_SETTINGS_VER (1) // New version number +#define RGB_BACKLIGHT_SETTINGS_VER (1) // Current version number //pervious settings must be copyed from previous rgb_backlight_settings.h file typedef struct { + //Common settings uint8_t version; - bool rgb_mod_installed; + uint8_t rgb_backlight_installed; + float brightness; - uint8_t static_color_index; - uint8_t custom_r; - uint8_t custom_g; - uint8_t custom_b; + // static gradient mode settings + uint8_t led_2_color_index; + uint8_t led_1_color_index; + uint8_t led_0_color_index; + // rainbow mode setings uint32_t rainbow_mode; uint32_t rainbow_speed_ms; uint16_t rainbow_step; + uint8_t rainbow_saturation; + uint8_t rainbow_wide; } RGBBacklightSettingsPrevious; void rgb_backlight_settings_load(RGBBacklightSettings* settings) { @@ -79,6 +84,8 @@ void rgb_backlight_settings_load(RGBBacklightSettings* settings) { settings->brightness = 1.0f; settings->rainbow_speed_ms = 100; settings->rainbow_step = 1; + settings->rainbow_saturation = 255; + settings->rainbow_wide = 50; rgb_backlight_settings_save(settings); } } diff --git a/applications/services/rgb_backlight/rgb_backlight_settings.h b/applications/services/rgb_backlight/rgb_backlight_settings.h index 48b0c43b9..3f3af005f 100644 --- a/applications/services/rgb_backlight/rgb_backlight_settings.h +++ b/applications/services/rgb_backlight/rgb_backlight_settings.h @@ -4,18 +4,22 @@ #include typedef struct { + //Common settings uint8_t version; - bool rgb_mod_installed; - - uint8_t static_color_index; - uint8_t custom_red; - uint8_t custom_green; - uint8_t custom_blue; + uint8_t rgb_backlight_installed; float brightness; + // static gradient mode settings + uint8_t led_2_color_index; + uint8_t led_1_color_index; + uint8_t led_0_color_index; + + // rainbow mode setings uint32_t rainbow_mode; uint32_t rainbow_speed_ms; uint16_t rainbow_step; + uint8_t rainbow_saturation; + uint8_t rainbow_wide; } RGBBacklightSettings; diff --git a/applications/settings/notification_settings/notification_settings_app.c b/applications/settings/notification_settings/notification_settings_app.c index ff90e96e7..dd2206dc2 100644 --- a/applications/settings/notification_settings/notification_settings_app.c +++ b/applications/settings/notification_settings/notification_settings_app.c @@ -16,8 +16,6 @@ typedef struct { VariableItemList* variable_item_list_rgb; } NotificationAppSettings; -static VariableItem* temp_item; - static const NotificationSequence sequence_note_c = { &message_note_c5, &message_delay_100, @@ -110,43 +108,72 @@ const char* const vibro_text[VIBRO_COUNT] = { const bool vibro_value[VIBRO_COUNT] = {false, true}; // --- RGB BACKLIGHT --- -#define RGB_MOD_INSTALLED_COUNT 2 -const char* const rgb_mod_installed_text[RGB_MOD_INSTALLED_COUNT] = { + +#define RGB_BACKLIGHT_INSTALLED_COUNT 2 +const char* const rgb_backlight_installed_text[RGB_BACKLIGHT_INSTALLED_COUNT] = { "OFF", "ON", }; -const bool rgb_mod_installed_value[RGB_MOD_INSTALLED_COUNT] = {false, true}; +const bool rgb_backlight_installed_value[RGB_BACKLIGHT_INSTALLED_COUNT] = {false, true}; -#define RGB_MOD_RAINBOW_MODE_COUNT 2 -const char* const rgb_mod_rainbow_mode_text[RGB_MOD_RAINBOW_MODE_COUNT] = { +#define RGB_BACKLIGHT_RAINBOW_MODE_COUNT 3 +const char* const rgb_backlight_rainbow_mode_text[RGB_BACKLIGHT_RAINBOW_MODE_COUNT] = { "OFF", "Rainbow", + "Wave", }; -const uint32_t rgb_mod_rainbow_mode_value[RGB_MOD_RAINBOW_MODE_COUNT] = {0, 1}; +const uint32_t rgb_backlight_rainbow_mode_value[RGB_BACKLIGHT_RAINBOW_MODE_COUNT] = {0, 1, 2}; -#define RGB_MOD_RAINBOW_SPEED_COUNT 20 -const char* const rgb_mod_rainbow_speed_text[RGB_MOD_RAINBOW_SPEED_COUNT] = { - "0.1s", "0.2s", "0.3s", "0.4s", "0.5s", "0.6s", "0.7", "0.8", "0.9", "1s", - "1.1s", "1.2s", "1.3s", "1.4s", "1.5s", "1.6s", "1.7s", "1.8s", "1.9s", "2s"}; -const uint32_t rgb_mod_rainbow_speed_value[RGB_MOD_RAINBOW_SPEED_COUNT] = { - 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, - 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000}; +#define RGB_BACKLIGHT_RAINBOW_SPEED_COUNT 10 +const char* const rgb_backlight_rainbow_speed_text[RGB_BACKLIGHT_RAINBOW_SPEED_COUNT] = { + "0.1s", + "0.2s", + "0.3s", + "0.4s", + "0.5s", + "0.6s", + "0.7", + "0.8", + "0.9", + "1s", +}; -#define RGB_MOD_RAINBOW_STEP_COUNT 10 -const char* const rgb_mod_rainbow_step_text[RGB_MOD_RAINBOW_SPEED_COUNT] = { +const uint32_t rgb_backlight_rainbow_speed_value[RGB_BACKLIGHT_RAINBOW_SPEED_COUNT] = { + 100, + 200, + 300, + 400, + 500, + 600, + 700, + 800, + 900, + 1000, +}; + +#define RGB_BACKLIGHT_RAINBOW_STEP_COUNT 3 +const char* const rgb_backlight_rainbow_step_text[RGB_BACKLIGHT_RAINBOW_STEP_COUNT] = { "1", "2", "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", }; -const uint32_t rgb_mod_rainbow_step_value[RGB_MOD_RAINBOW_STEP_COUNT] = - {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; +const uint32_t rgb_backlight_rainbow_step_value[RGB_BACKLIGHT_RAINBOW_STEP_COUNT] = { + 1, + 2, + 3, +}; + +#define RGB_BACKLIGHT_RAINBOW_WIDE_COUNT 3 +const char* const rgb_backlight_rainbow_wide_text[RGB_BACKLIGHT_RAINBOW_WIDE_COUNT] = { + "1", + "2", + "3", +}; +const uint32_t rgb_backlight_rainbow_wide_value[RGB_BACKLIGHT_RAINBOW_WIDE_COUNT] = { + 30, + 40, + 50, +}; typedef enum { MainViewId, @@ -172,7 +199,7 @@ static void backlight_changed(VariableItem* item) { app->notification->settings.display_brightness = backlight_value[index]; //--- RGB BACKLIGHT --- - //set selected brightness to current rgb backlight service settings and save settings + // set selected brightness to current rgb backlight service settings and save settings app->notification->rgb_srv->settings->brightness = backlight_value[index]; rgb_backlight_settings_save(app->notification->rgb_srv->settings); //--- RGB BACKLIGHT END --- @@ -228,161 +255,174 @@ static void vibro_changed(VariableItem* item) { //--- RGB BACKLIGHT --- -static void rgb_mod_installed_changed(VariableItem* item) { +static void rgb_backlight_installed_changed(VariableItem* item) { NotificationAppSettings* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, rgb_mod_installed_text[index]); - app->notification->rgb_srv->settings->rgb_mod_installed = rgb_mod_installed_value[index]; + variable_item_set_current_value_text(item, rgb_backlight_installed_text[index]); + app->notification->rgb_srv->settings->rgb_backlight_installed = + rgb_backlight_installed_value[index]; rgb_backlight_settings_save(app->notification->rgb_srv->settings); - // Lock/Unlock rgb settings depent from rgb_mod_installed switch + + // In case of user playing with rgb_backlight_installed swith: + // if user swith_off rgb_backlight_installed (but may be he have mod installed) + // then force set default orange color - defence from stupid. + if(index == 0) { + rgb_backlight_set_led_static_color(2, 0); + rgb_backlight_set_led_static_color(1, 0); + rgb_backlight_set_led_static_color(0, 0); + SK6805_update(); + // start rainbow (if its Enabled) or set saved static colors if user swith_on rgb_backlight_installed switch + } else { + if(app->notification->rgb_srv->settings->rainbow_mode > 0) { + rainbow_timer_starter(app->notification->rgb_srv); + } else { + rgb_backlight_set_led_static_color( + 2, app->notification->rgb_srv->settings->led_2_color_index); + rgb_backlight_set_led_static_color( + 1, app->notification->rgb_srv->settings->led_1_color_index); + rgb_backlight_set_led_static_color( + 0, app->notification->rgb_srv->settings->led_0_color_index); + rgb_backlight_update(app->notification->settings.display_brightness); + } + } + + // Lock/Unlock all rgb settings depent from rgb_backlight_installed switch int slide = 0; if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { slide = 1; } - for(int i = slide; i < (slide + 7); i++) { + for(int i = slide; i < (slide + 8); i++) { VariableItem* t_item = variable_item_list_get(app->variable_item_list_rgb, i); if(index == 0) { - variable_item_set_locked(t_item, true, "RGB MOD\nOFF!"); + variable_item_set_locked(t_item, true, "RGB\nOFF!"); } else { - variable_item_set_locked(t_item, false, "RGB MOD\nOFF!"); + variable_item_set_locked(t_item, false, "RGB\nOFF!"); } } } -static void rgb_mod_rainbow_changed(VariableItem* item) { - NotificationAppSettings* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, rgb_mod_rainbow_mode_text[index]); - app->notification->rgb_srv->settings->rainbow_mode = rgb_mod_rainbow_mode_value[index]; - - rainbow_timer_starter(app->notification->rgb_srv); - rgb_backlight_settings_save(app->notification->rgb_srv->settings); - - // Lock/Unlock color settings if rainbow mode Enabled/Disabled (0-3 index if debug off and 1-4 index if debug on) - int slide = 0; - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - slide = 1; - } - for(int i = slide; i < (slide + 4); i++) { - VariableItem* t_item = variable_item_list_get(app->variable_item_list_rgb, i); - if(index > 0) { - variable_item_set_locked(t_item, true, "Rainbow mode\nenabled!"); - } else { - variable_item_set_locked(t_item, false, "Rainbow mode\nenabled!"); - } - } - - // restore saved rgb backlight settings if we switch_off rainbow mode - if(app->notification->rgb_srv->settings->rainbow_mode == 0) { - rgb_backlight_set_static_color(app->notification->rgb_srv->settings->static_color_index); - rgb_backlight_update(app->notification->rgb_srv->settings->brightness); - } -} - -static void rgb_mod_rainbow_speed_changed(VariableItem* item) { - NotificationAppSettings* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, rgb_mod_rainbow_speed_text[index]); - app->notification->rgb_srv->settings->rainbow_speed_ms = rgb_mod_rainbow_speed_value[index]; - - //save settings and restart timer with new speed value - rgb_backlight_settings_save(app->notification->rgb_srv->settings); - rainbow_timer_starter(app->notification->rgb_srv); -} - -static void rgb_mod_rainbow_step_changed(VariableItem* item) { - NotificationAppSettings* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, rgb_mod_rainbow_step_text[index]); - app->notification->rgb_srv->settings->rainbow_step = rgb_mod_rainbow_step_value[index]; - - rgb_backlight_settings_save(app->notification->rgb_srv->settings); -} - -// Set rgb_backlight colors static and custom - -static void color_changed(VariableItem* item) { +static void led_2_color_changed(VariableItem* item) { NotificationAppSettings* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, rgb_backlight_get_color_text(index)); - app->notification->rgb_srv->settings->static_color_index = index; + app->notification->rgb_srv->settings->led_2_color_index = index; - rgb_backlight_set_static_color(index); - rgb_backlight_update(app->notification->rgb_srv->settings->brightness); + // dont update screen color if rainbow timer working + if(!furi_timer_is_running(app->notification->rgb_srv->rainbow_timer)) { + rgb_backlight_set_led_static_color(2, index); + rgb_backlight_update(app->notification->rgb_srv->settings->brightness); + } rgb_backlight_settings_save(app->notification->rgb_srv->settings); } -static void color_set_custom_red(VariableItem* item) { +static void led_1_color_changed(VariableItem* item) { NotificationAppSettings* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); - //Set custom red to settings and current color - app->notification->rgb_srv->settings->custom_red = index; - app->notification->rgb_srv->current_red = index; - app->notification->rgb_srv->settings->static_color_index = 13; + variable_item_set_current_value_text(item, rgb_backlight_get_color_text(index)); + app->notification->rgb_srv->settings->led_1_color_index = index; - char valtext[4] = {}; - snprintf(valtext, sizeof(valtext), "%d", index); - variable_item_set_current_value_text(item, valtext); + // dont update screen color if rainbow timer working + if(!furi_timer_is_running(app->notification->rgb_srv->rainbow_timer)) { + rgb_backlight_set_led_static_color(1, index); + rgb_backlight_update(app->notification->rgb_srv->settings->brightness); + } - // Set to custom color explicitly - variable_item_set_current_value_index(temp_item, 13); - variable_item_set_current_value_text(temp_item, rgb_backlight_get_color_text(13)); - - rgb_backlight_update(app->notification->rgb_srv->settings->brightness); rgb_backlight_settings_save(app->notification->rgb_srv->settings); } -static void color_set_custom_green(VariableItem* item) { + +static void led_0_color_changed(VariableItem* item) { NotificationAppSettings* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); - //Set custom green to settings and current color - app->notification->rgb_srv->settings->custom_green = index; - app->notification->rgb_srv->current_green = index; - app->notification->rgb_srv->settings->static_color_index = 13; + variable_item_set_current_value_text(item, rgb_backlight_get_color_text(index)); + app->notification->rgb_srv->settings->led_0_color_index = index; - char valtext[4] = {}; - snprintf(valtext, sizeof(valtext), "%d", index); - variable_item_set_current_value_text(item, valtext); + // dont update screen color if rainbow timer working + if(!furi_timer_is_running(app->notification->rgb_srv->rainbow_timer)) { + rgb_backlight_set_led_static_color(0, index); + rgb_backlight_update(app->notification->rgb_srv->settings->brightness); + } - // Set to custom color explicitly - variable_item_set_current_value_index(temp_item, 13); - variable_item_set_current_value_text(temp_item, rgb_backlight_get_color_text(13)); - - rgb_backlight_update(app->notification->rgb_srv->settings->brightness); rgb_backlight_settings_save(app->notification->rgb_srv->settings); } -static void color_set_custom_blue(VariableItem* item) { + +static void rgb_backlight_rainbow_changed(VariableItem* item) { NotificationAppSettings* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); - //Set custom blue to settings and current color - app->notification->rgb_srv->settings->custom_blue = index; - app->notification->rgb_srv->current_blue = index; - app->notification->rgb_srv->settings->static_color_index = 13; + variable_item_set_current_value_text(item, rgb_backlight_rainbow_mode_text[index]); + app->notification->rgb_srv->settings->rainbow_mode = rgb_backlight_rainbow_mode_value[index]; - char valtext[4] = {}; - snprintf(valtext, sizeof(valtext), "%d", index); - variable_item_set_current_value_text(item, valtext); + rainbow_timer_starter(app->notification->rgb_srv); + rgb_backlight_settings_save(app->notification->rgb_srv->settings); - // Set to custom color explicitly - variable_item_set_current_value_index(temp_item, 13); - variable_item_set_current_value_text(temp_item, rgb_backlight_get_color_text(13)); + // restore saved rgb backlight settings if we switch_off rainbow mode + if(app->notification->rgb_srv->settings->rainbow_mode == 0) { + rgb_backlight_set_led_static_color( + 2, app->notification->rgb_srv->settings->led_2_color_index); + rgb_backlight_set_led_static_color( + 1, app->notification->rgb_srv->settings->led_1_color_index); + rgb_backlight_set_led_static_color( + 0, app->notification->rgb_srv->settings->led_0_color_index); + rgb_backlight_update(app->notification->rgb_srv->settings->brightness); + } +} + +static void rgb_backlight_rainbow_speed_changed(VariableItem* item) { + NotificationAppSettings* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + + variable_item_set_current_value_text(item, rgb_backlight_rainbow_speed_text[index]); + app->notification->rgb_srv->settings->rainbow_speed_ms = + rgb_backlight_rainbow_speed_value[index]; + + // save settings and restart timer with new speed value + rgb_backlight_settings_save(app->notification->rgb_srv->settings); + rainbow_timer_starter(app->notification->rgb_srv); +} + +static void rgb_backlight_rainbow_step_changed(VariableItem* item) { + NotificationAppSettings* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + + variable_item_set_current_value_text(item, rgb_backlight_rainbow_step_text[index]); + app->notification->rgb_srv->settings->rainbow_step = rgb_backlight_rainbow_step_value[index]; - rgb_backlight_update(app->notification->rgb_srv->settings->brightness); rgb_backlight_settings_save(app->notification->rgb_srv->settings); } -// open rgb_settings_view if user press OK on first (index=0) menu string and (debug mode or rgb_mod_install is true) +static void rgb_backlight_rainbow_saturation_changed(VariableItem* item) { + NotificationAppSettings* app = variable_item_get_context(item); + + // saturation must be 1..255, so we do (0..254)+1 + uint8_t index = variable_item_get_current_value_index(item) + 1; + char valtext[4] = {}; + snprintf(valtext, sizeof(valtext), "%d", index); + variable_item_set_current_value_text(item, valtext); + app->notification->rgb_srv->settings->rainbow_saturation = index; + rgb_backlight_settings_save(app->notification->rgb_srv->settings); +} + +static void rgb_backlight_rainbow_wide_changed(VariableItem* item) { + NotificationAppSettings* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + + variable_item_set_current_value_text(item, rgb_backlight_rainbow_wide_text[index]); + app->notification->rgb_srv->settings->rainbow_wide = rgb_backlight_rainbow_wide_value[index]; + + // save settings and restart timer with new speed value + rgb_backlight_settings_save(app->notification->rgb_srv->settings); + rainbow_timer_starter(app->notification->rgb_srv); +} + +// open rgb_settings_view if user press OK on first (index=0) menu string and (debug mode or rgb_backlight_installed is true) void variable_item_list_enter_callback(void* context, uint32_t index) { UNUSED(context); NotificationAppSettings* app = context; - if(((app->notification->rgb_srv->settings->rgb_mod_installed) || + if(((app->notification->rgb_srv->settings->rgb_backlight_installed) || (furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug))) && (index == 0)) { view_dispatcher_switch_to_view(app->view_dispatcher, RGBViewId); @@ -420,10 +460,10 @@ static NotificationAppSettings* alloc_settings(void) { variable_item_list_set_enter_callback( app->variable_item_list, variable_item_list_enter_callback, app); - //Show RGB settings only when debug_mode or rgb_mod_installed is active - if((app->notification->rgb_srv->settings->rgb_mod_installed) || + // Show RGB settings only when debug_mode or rgb_backlight_installed is active + if((app->notification->rgb_srv->settings->rgb_backlight_installed) || (furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug))) { - item = variable_item_list_add(app->variable_item_list, "RGB mod settings", 0, NULL, app); + item = variable_item_list_add(app->variable_item_list, "RGB settings", 0, NULL, app); } //--- RGB BACKLIGHT END --- @@ -484,125 +524,159 @@ static NotificationAppSettings* alloc_settings(void) { } //--- RGB BACKLIGHT --- + app->variable_item_list_rgb = variable_item_list_alloc(); View* view_rgb = variable_item_list_get_view(app->variable_item_list_rgb); - // set callback for OK pressed in rgb_settings_menu + // set callback for exit from rgb_settings_menu view_set_previous_callback(view_rgb, notification_app_rgb_settings_exit); - // Show RGB_MOD_Installed_Swith only in Debug mode + // Show rgb_backlight_installed swith only in Debug mode if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { item = variable_item_list_add( app->variable_item_list_rgb, - "RGB MOD Installed", - RGB_MOD_INSTALLED_COUNT, - rgb_mod_installed_changed, + "RGB backlight installed", + RGB_BACKLIGHT_INSTALLED_COUNT, + rgb_backlight_installed_changed, app); value_index = value_index_bool( - app->notification->rgb_srv->settings->rgb_mod_installed, - rgb_mod_installed_value, - RGB_MOD_INSTALLED_COUNT); + app->notification->rgb_srv->settings->rgb_backlight_installed, + rgb_backlight_installed_value, + RGB_BACKLIGHT_INSTALLED_COUNT); variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, rgb_mod_installed_text[value_index]); + variable_item_set_current_value_text(item, rgb_backlight_installed_text[value_index]); } - // Static Colors settings + // We (humans) are numbering LEDs from left to right as 1..3, but hardware have another order from right to left 2..0 + // led_1 color item = variable_item_list_add( app->variable_item_list_rgb, - "LCD Color", + "LED 1 Color", rgb_backlight_get_color_count(), - color_changed, + led_2_color_changed, app); - value_index = app->notification->rgb_srv->settings->static_color_index; + value_index = app->notification->rgb_srv->settings->led_2_color_index; variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, rgb_backlight_get_color_text(value_index)); variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rainbow_mode > 0), "Rainbow mode\nenabled!"); - variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rgb_mod_installed == 0), "RGB MOD \nOFF!"); + item, + (app->notification->rgb_srv->settings->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); - temp_item = item; - - // Custom Color - REFACTOR THIS + // led_2 color item = variable_item_list_add( - app->variable_item_list_rgb, "Custom Red", 255, color_set_custom_red, app); - value_index = app->notification->rgb_srv->settings->custom_red; + app->variable_item_list_rgb, + "LED 2 Color", + rgb_backlight_get_color_count(), + led_1_color_changed, + app); + value_index = app->notification->rgb_srv->settings->led_1_color_index; + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, rgb_backlight_get_color_text(value_index)); + variable_item_set_locked( + item, + (app->notification->rgb_srv->settings->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); + + // led 3 color + item = variable_item_list_add( + app->variable_item_list_rgb, + "LED 3 Color", + rgb_backlight_get_color_count(), + led_0_color_changed, + app); + value_index = app->notification->rgb_srv->settings->led_0_color_index; + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, rgb_backlight_get_color_text(value_index)); + variable_item_set_locked( + item, + (app->notification->rgb_srv->settings->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); + + // Rainbow mode + item = variable_item_list_add( + app->variable_item_list_rgb, + "Rainbow mode", + RGB_BACKLIGHT_RAINBOW_MODE_COUNT, + rgb_backlight_rainbow_changed, + app); + value_index = value_index_uint32( + app->notification->rgb_srv->settings->rainbow_mode, + rgb_backlight_rainbow_mode_value, + RGB_BACKLIGHT_RAINBOW_MODE_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, rgb_backlight_rainbow_mode_text[value_index]); + variable_item_set_locked( + item, + (app->notification->rgb_srv->settings->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); + + item = variable_item_list_add( + app->variable_item_list_rgb, + "Rainbow speed", + RGB_BACKLIGHT_RAINBOW_SPEED_COUNT, + rgb_backlight_rainbow_speed_changed, + app); + value_index = value_index_uint32( + app->notification->rgb_srv->settings->rainbow_speed_ms, + rgb_backlight_rainbow_speed_value, + RGB_BACKLIGHT_RAINBOW_SPEED_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, rgb_backlight_rainbow_speed_text[value_index]); + variable_item_set_locked( + item, + (app->notification->rgb_srv->settings->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); + + item = variable_item_list_add( + app->variable_item_list_rgb, + "Rainbow step", + RGB_BACKLIGHT_RAINBOW_STEP_COUNT, + rgb_backlight_rainbow_step_changed, + app); + value_index = value_index_uint32( + app->notification->rgb_srv->settings->rainbow_step, + rgb_backlight_rainbow_step_value, + RGB_BACKLIGHT_RAINBOW_STEP_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, rgb_backlight_rainbow_step_text[value_index]); + variable_item_set_locked( + item, + (app->notification->rgb_srv->settings->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); + + item = variable_item_list_add( + app->variable_item_list_rgb, + "Saturation", + 255, + rgb_backlight_rainbow_saturation_changed, + app); + value_index = app->notification->rgb_srv->settings->rainbow_saturation; variable_item_set_current_value_index(item, value_index); char valtext[4] = {}; snprintf(valtext, sizeof(valtext), "%d", value_index); variable_item_set_current_value_text(item, valtext); variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rainbow_mode > 0), "Rainbow mode\nenabled!"); - variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rgb_mod_installed == 0), "RGB MOD \nOFF!"); - - item = variable_item_list_add( - app->variable_item_list_rgb, "Custom Green", 255, color_set_custom_green, app); - value_index = app->notification->rgb_srv->settings->custom_green; - variable_item_set_current_value_index(item, value_index); - snprintf(valtext, sizeof(valtext), "%d", value_index); - variable_item_set_current_value_text(item, valtext); - variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rainbow_mode > 0), "Rainbow mode\nenabled!"); - variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rgb_mod_installed == 0), "RGB MOD \nOFF!"); - - item = variable_item_list_add( - app->variable_item_list_rgb, "Custom Blue", 255, color_set_custom_blue, app); - value_index = app->notification->rgb_srv->settings->custom_blue; - variable_item_set_current_value_index(item, value_index); - snprintf(valtext, sizeof(valtext), "%d", value_index); - variable_item_set_current_value_text(item, valtext); - variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rainbow_mode > 0), "Rainbow mode\nenabled!"); - variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rgb_mod_installed == 0), "RGB MOD \nOFF!"); - - // Rainbow (based on Willy-JL idea) settings - item = variable_item_list_add( - app->variable_item_list_rgb, - "Rainbow mode", - RGB_MOD_RAINBOW_MODE_COUNT, - rgb_mod_rainbow_changed, - app); - value_index = value_index_uint32( - app->notification->rgb_srv->settings->rainbow_mode, - rgb_mod_rainbow_mode_value, - RGB_MOD_RAINBOW_MODE_COUNT); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, rgb_mod_rainbow_mode_text[value_index]); - variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rgb_mod_installed == 0), "RGB MOD \nOFF!"); + item, + (app->notification->rgb_srv->settings->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); item = variable_item_list_add( app->variable_item_list_rgb, - "Rainbow speed", - RGB_MOD_RAINBOW_SPEED_COUNT, - rgb_mod_rainbow_speed_changed, + "Wave wide", + RGB_BACKLIGHT_RAINBOW_WIDE_COUNT, + rgb_backlight_rainbow_wide_changed, app); value_index = value_index_uint32( - app->notification->rgb_srv->settings->rainbow_speed_ms, - rgb_mod_rainbow_speed_value, - RGB_MOD_RAINBOW_SPEED_COUNT); + app->notification->rgb_srv->settings->rainbow_wide, + rgb_backlight_rainbow_wide_value, + RGB_BACKLIGHT_RAINBOW_WIDE_COUNT); variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, rgb_mod_rainbow_speed_text[value_index]); + variable_item_set_current_value_text(item, rgb_backlight_rainbow_wide_text[value_index]); variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rgb_mod_installed == 0), "RGB MOD \nOFF!"); - - item = variable_item_list_add( - app->variable_item_list_rgb, - "Rainbow step", - RGB_MOD_RAINBOW_STEP_COUNT, - rgb_mod_rainbow_step_changed, - app); - value_index = value_index_uint32( - app->notification->rgb_srv->settings->rainbow_step, - rgb_mod_rainbow_step_value, - RGB_MOD_RAINBOW_SPEED_COUNT); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, rgb_mod_rainbow_step_text[value_index]); - variable_item_set_locked( - item, (app->notification->rgb_srv->settings->rgb_mod_installed == 0), "RGB MOD \nOFF!"); + item, + (app->notification->rgb_srv->settings->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); //--- RGB BACKLIGHT END --- @@ -632,8 +706,8 @@ int32_t notification_settings_app(void* p) { view_dispatcher_run(app->view_dispatcher); notification_message_save_settings(app->notification); - // Automaticaly switch_off debug_mode when user exit from settings with enabled rgb_mod_installed - // if(app->notification->settings.rgb_mod_installed) { + // Automaticaly switch_off debug_mode when user exit from settings with enabled rgb_backlight_installed + // if(app->notification->settings.rgb_backlight_installed) { // furi_hal_rtc_reset_flag(FuriHalRtcFlagDebug); // } diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index ce3992704..c94a009ee 100755 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,83.1,, +Version,+,83.2,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -3148,8 +3148,7 @@ Function,-,renameat,int,"int, const char*, int, const char*" Function,-,rewind,void,FILE* Function,+,rgb_backlight_get_color_count,uint8_t, Function,+,rgb_backlight_get_color_text,const char*,uint8_t -Function,+,rgb_backlight_set_custom_color,void,"uint8_t, uint8_t, uint8_t" -Function,+,rgb_backlight_set_static_color,void,uint8_t +Function,+,rgb_backlight_set_led_static_color,void,"uint8_t, uint8_t" Function,+,rgb_backlight_settings_load,void,RGBBacklightSettings* Function,+,rgb_backlight_settings_save,void,const RGBBacklightSettings* Function,+,rgb_backlight_update,void,float