diff --git a/applications/services/rgb_backlight/rgb_backlight.c b/applications/services/rgb_backlight/rgb_backlight.c index 6f9940ad0..8d05e68de 100644 --- a/applications/services/rgb_backlight/rgb_backlight.c +++ b/applications/services/rgb_backlight/rgb_backlight.c @@ -37,10 +37,10 @@ typedef struct { } RGBBacklightColor; //use one type RGBBacklightColor for current_leds_settings and for static colors definition -static RGBBacklightColor current_led [] = { - {"LED0",255,60,0}, - {"LED1",255,60,0}, - {"LED2",255,60,0}, +static RGBBacklightColor current_led[] = { + {"LED0", 255, 60, 0}, + {"LED1", 255, 60, 0}, + {"LED2", 255, 60, 0}, }; static const RGBBacklightColor colors[] = { @@ -70,45 +70,83 @@ 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_led_static_color(uint8_t led, uint8_t index) { - // RGBBacklightApp* app = furi_record_open(RECORD_RGB_BACKLIGHT); - // float brightness = app->settings->brightness; - if(led < SK6805_get_led_count()) { uint8_t r = colors[index].red; uint8_t g = colors[index].green; uint8_t b = colors[index].blue; - - current_led[led].red = r; - current_led[led].green =g; + + 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 value -void rgb_backlight_set_led_custom_color(uint8_t led, uint8_t red, uint8_t green, uint8_t blue) { - // RGBBacklightApp* app = furi_record_open(RECORD_RGB_BACKLIGHT); - // float brightness = app->settings->brightness; +// --- NOT USED IN CURRENT RELEASE, FOR FUTURE USAGE--- +// Update current colors by custom rgb value +// void rgb_backlight_set_led_custom_color(uint8_t led, uint8_t red, uint8_t green, uint8_t blue) { +// if(led < SK6805_get_led_count()) { +// current_led[led].red = red; +// current_led[led].green = green; +// current_led[led].blue = blue; +// SK6805_set_led_color(led, red, green, blue); +// } +// } +// --- NOT USED IN CURRENT RELEASE, FOR FUTURE USAGE--- - if(led < SK6805_get_led_count()) { +// 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; - current_led[led].red = red; - current_led[led].green = green; - current_led[led].blue = blue; + //from (0..255) to (0..1) + float H = hue / 255.0f; + float S = sat / 255.0f; - SK6805_set_led_color(led, red, green, blue); + 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; } - // furi_record_close(RECORD_RGB_BACKLIGHT); + //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_backlight_installed) { for(uint8_t i = 0; i < SK6805_get_led_count(); i++) { uint8_t r = current_led[i].red * (brightness * 1.0f); @@ -142,83 +180,56 @@ void rainbow_timer_starter(RGBBacklightApp* app) { } } -// 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 -void hsv_to_rgb(uint8_t red, uint8_t green, uint8_t blue, uint16_t hue ,uint8_t sat ,uint8_t val) { - float r = 1.0f; - float g = 1.0f; - float b = 1.0f; - - float H = hue / 255.0f; - float S = sat / 255.0f; - float V = val / 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; - } - red = r * 255; - green = g * 255; - blue = b * 255; -} - - static void rainbow_timer_callback(void* context) { furi_assert(context); RGBBacklightApp* app = context; - uint8_t r = 0; - uint8_t g = 0; - uint8_t b = 0; if(app->settings->rgb_backlight_installed) { - switch(app->settings->rainbow_mode) { - case 1: - for(uint8_t i = 0; i < SK6805_get_led_count(); i++) { - hsv_to_rgb(r,g,b,app->rainbow_hue, app->settings->rainbow_saturation,app->settings->brightness*255); - FURI_LOG_D( - TAG, "rgb %d,%d,%d", r, g, b); - //rgb_backlight_set_led_custom_color (i,*r,*g,*b); - //SK6805_update(); - } - - break; - case 2: - break; - default: - break; + app->rainbow_hue += app->settings->rainbow_step; + if(app->rainbow_hue > 254) { + app->rainbow_hue = 0; } - app->rainbow_hue++; + + uint8_t wide = app->settings->rainbow_wide; + + switch(app->settings->rainbow_mode) { + //rainbow mode + case 1: + 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; + + //wave mode + case 2: + uint16_t j = app->rainbow_hue + wide; + uint16_t k = app->rainbow_hue + wide * 2; + + if(app->rainbow_hue > (254 - wide)) { + j = j - 255; + } + 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) { @@ -227,7 +238,7 @@ int32_t rgb_backlight_srv(void* p) { // Define object app (full app with settings and running variables), // allocate memory and create RECORD for access to app structure from outside RGBBacklightApp* app = malloc(sizeof(RGBBacklightApp)); - + //define rainbow_timer and they callback app->rainbow_timer = furi_timer_alloc(rainbow_timer_callback, FuriTimerTypePeriodic, app); @@ -242,24 +253,24 @@ int32_t rgb_backlight_srv(void* p) { //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_starter(app); } else { - 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); + 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_backlight not installed then set default static orange color(index=0) to all leds (0-2) and force light on + // 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_led_static_color (2,0); - rgb_backlight_set_led_static_color (1,0); - rgb_backlight_set_led_static_color (0,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(); } while(1) { // place for message queue and other future options - furi_delay_ms (5000); + furi_delay_ms(5000); if(app->settings->rgb_backlight_installed) { FURI_LOG_D(TAG, "RGB backlight enabled - serivce is running"); } else { diff --git a/applications/services/rgb_backlight/rgb_backlight.h b/applications/services/rgb_backlight/rgb_backlight.h index e8b78f461..10aa9341f 100644 --- a/applications/services/rgb_backlight/rgb_backlight.h +++ b/applications/services/rgb_backlight/rgb_backlight.h @@ -28,7 +28,7 @@ extern "C" { typedef struct { FuriTimer* rainbow_timer; - uint8_t rainbow_hue; + uint16_t rainbow_hue; uint8_t rainbow_red; uint8_t rainbow_green; uint8_t rainbow_blue; @@ -40,6 +40,7 @@ typedef struct { #define RECORD_RGB_BACKLIGHT "rgb_backlight" void rgb_backlight_update(float brightness); +//not used now, for future use // void rgb_backlight_set_custom_color(uint8_t red, uint8_t green, uint8_t blue); void rgb_backlight_set_led_static_color(uint8_t led, uint8_t index); void rainbow_timer_stop(RGBBacklightApp* app); diff --git a/applications/services/rgb_backlight/rgb_backlight_settings.c b/applications/services/rgb_backlight/rgb_backlight_settings.c index 0b0388cae..f612507e4 100644 --- a/applications/services/rgb_backlight/rgb_backlight_settings.c +++ b/applications/services/rgb_backlight/rgb_backlight_settings.c @@ -29,6 +29,7 @@ typedef struct { 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) { @@ -84,6 +85,7 @@ void rgb_backlight_settings_load(RGBBacklightSettings* settings) { 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 7c6e08c95..3f3af005f 100644 --- a/applications/services/rgb_backlight/rgb_backlight_settings.h +++ b/applications/services/rgb_backlight/rgb_backlight_settings.h @@ -8,17 +8,18 @@ typedef struct { uint8_t version; 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_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 7e8536ee7..98efc54b7 100644 --- a/applications/settings/notification_settings/notification_settings_app.c +++ b/applications/settings/notification_settings/notification_settings_app.c @@ -134,21 +134,29 @@ const uint32_t rgb_backlight_rainbow_speed_value[RGB_BACKLIGHT_RAINBOW_SPEED_COU 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000}; -#define RGB_BACKLIGHT_RAINBOW_STEP_COUNT 10 +#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_backlight_rainbow_step_value[RGB_BACKLIGHT_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, @@ -234,26 +242,29 @@ 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_backlight_installed_text[index]); - app->notification->rgb_srv->settings->rgb_backlight_installed = rgb_backlight_installed_value[index]; + app->notification->rgb_srv->settings->rgb_backlight_installed = + rgb_backlight_installed_value[index]; rgb_backlight_settings_save(app->notification->rgb_srv->settings); - + // In case of user playing with rgb_backlight_installed swith: - // if user swith_off rgb_backlight_installed then force set default orange color - 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); + // if user swith_off rgb_backlight_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(); - // if user swith_on rgb_backlight_installed then start rainbow if its ON or set saved static colors + // 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); + 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); + 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); } } @@ -262,7 +273,7 @@ static void rgb_backlight_installed_changed(VariableItem* item) { 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\nOFF!"); @@ -279,13 +290,12 @@ static void led_2_color_changed(VariableItem* item) { variable_item_set_current_value_text(item, rgb_backlight_get_color_text(index)); app->notification->rgb_srv->settings->led_2_color_index = index; - rgb_backlight_set_led_static_color(2,index); - rgb_backlight_update(app->notification->rgb_srv->settings->brightness); - - // dont update display color if rainbow working - if (!furi_timer_is_running(app->notification->rgb_srv->rainbow_timer)) { - rgb_backlight_settings_save(app->notification->rgb_srv->settings); + //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 led_1_color_changed(VariableItem* item) { @@ -295,13 +305,13 @@ static void led_1_color_changed(VariableItem* item) { variable_item_set_current_value_text(item, rgb_backlight_get_color_text(index)); app->notification->rgb_srv->settings->led_1_color_index = index; - rgb_backlight_set_led_static_color(1,index); - rgb_backlight_settings_save(app->notification->rgb_srv->settings); - - // dont update display color if rainbow working - if (!furi_timer_is_running(app->notification->rgb_srv->rainbow_timer)) { - rgb_backlight_settings_save(app->notification->rgb_srv->settings); + //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); } + + rgb_backlight_settings_save(app->notification->rgb_srv->settings); } static void led_0_color_changed(VariableItem* item) { @@ -311,13 +321,13 @@ static void led_0_color_changed(VariableItem* item) { variable_item_set_current_value_text(item, rgb_backlight_get_color_text(index)); app->notification->rgb_srv->settings->led_0_color_index = index; - rgb_backlight_set_led_static_color(0,index); - rgb_backlight_settings_save(app->notification->rgb_srv->settings); - - // dont update display color if rainbow working - if (!furi_timer_is_running(app->notification->rgb_srv->rainbow_timer)) { - rgb_backlight_settings_save(app->notification->rgb_srv->settings); + //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); } + + rgb_backlight_settings_save(app->notification->rgb_srv->settings); } static void rgb_backlight_rainbow_changed(VariableItem* item) { @@ -332,9 +342,12 @@ static void rgb_backlight_rainbow_changed(VariableItem* item) { // 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_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); } } @@ -362,294 +375,324 @@ static void rgb_backlight_rainbow_step_changed(VariableItem* item) { rgb_backlight_settings_save(app->notification->rgb_srv->settings); } -static void rgb_backlight_rainbow_saturation_changed (VariableItem* item) { +static void rgb_backlight_rainbow_saturation_changed(VariableItem* item) { NotificationAppSettings* app = variable_item_get_context(item); - //saturation must be 1..255, so (0..254)+1 - uint8_t index = variable_item_get_current_value_index(item)+1; + //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); } - // 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_backlight_installed) || - (furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug))) && - (index == 0)) { - view_dispatcher_switch_to_view(app->view_dispatcher, RGBViewId); - } +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_backlight_installed) || + (furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug))) && + (index == 0)) { + view_dispatcher_switch_to_view(app->view_dispatcher, RGBViewId); } +} - // switch to main view on exit from rgb_settings_view - static uint32_t notification_app_rgb_settings_exit(void* context) { - UNUSED(context); - return MainViewId; +// switch to main view on exit from rgb_settings_view +static uint32_t notification_app_rgb_settings_exit(void* context) { + UNUSED(context); + return MainViewId; +} +//--- RGB BACKLIGHT END --- + +static uint32_t notification_app_settings_exit(void* context) { + UNUSED(context); + return VIEW_NONE; +} + +static NotificationAppSettings* alloc_settings(void) { + NotificationAppSettings* app = malloc(sizeof(NotificationAppSettings)); + app->notification = furi_record_open(RECORD_NOTIFICATION); + app->gui = furi_record_open(RECORD_GUI); + + app->variable_item_list = variable_item_list_alloc(); + View* view = variable_item_list_get_view(app->variable_item_list); + + VariableItem* item; + uint8_t value_index; + + //set callback for exit from main view + view_set_previous_callback(view, notification_app_settings_exit); + + //--- RGB BACKLIGHT --- + // set callback for OK pressed in notification settings menu + 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_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 settings", 0, NULL, app); } //--- RGB BACKLIGHT END --- - static uint32_t notification_app_settings_exit(void* context) { - UNUSED(context); - return VIEW_NONE; - } + item = variable_item_list_add( + app->variable_item_list, "LCD Contrast", CONTRAST_COUNT, contrast_changed, app); + value_index = + value_index_int32(app->notification->settings.contrast, contrast_value, CONTRAST_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, contrast_text[value_index]); - static NotificationAppSettings* alloc_settings(void) { - NotificationAppSettings* app = malloc(sizeof(NotificationAppSettings)); - app->notification = furi_record_open(RECORD_NOTIFICATION); - app->gui = furi_record_open(RECORD_GUI); + item = variable_item_list_add( + app->variable_item_list, "LCD Backlight", BACKLIGHT_COUNT, backlight_changed, app); + value_index = value_index_float( + app->notification->settings.display_brightness, backlight_value, BACKLIGHT_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, backlight_text[value_index]); - app->variable_item_list = variable_item_list_alloc(); - View* view = variable_item_list_get_view(app->variable_item_list); + item = variable_item_list_add( + app->variable_item_list, "Backlight Time", DELAY_COUNT, screen_changed, app); + value_index = value_index_uint32( + app->notification->settings.display_off_delay_ms, delay_value, DELAY_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, delay_text[value_index]); - VariableItem* item; - uint8_t value_index; + item = variable_item_list_add( + app->variable_item_list, "LED Brightness", BACKLIGHT_COUNT, led_changed, app); + value_index = value_index_float( + app->notification->settings.led_brightness, backlight_value, BACKLIGHT_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, backlight_text[value_index]); - //set callback for exit from main view - view_set_previous_callback(view, notification_app_settings_exit); - - //--- RGB BACKLIGHT --- - // set callback for OK pressed in notification settings menu - 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_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 settings", 0, NULL, app); - } - //--- RGB BACKLIGHT END --- - - item = variable_item_list_add( - app->variable_item_list, "LCD Contrast", CONTRAST_COUNT, contrast_changed, app); - value_index = value_index_int32( - app->notification->settings.contrast, contrast_value, CONTRAST_COUNT); + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagStealthMode)) { + item = variable_item_list_add(app->variable_item_list, "Volume", 1, NULL, app); + value_index = 0; variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, contrast_text[value_index]); - + variable_item_set_current_value_text(item, "Stealth"); + } else { item = variable_item_list_add( - app->variable_item_list, "LCD Backlight", BACKLIGHT_COUNT, backlight_changed, app); + app->variable_item_list, "Volume", VOLUME_COUNT, volume_changed, app); value_index = value_index_float( - app->notification->settings.display_brightness, backlight_value, BACKLIGHT_COUNT); + app->notification->settings.speaker_volume, volume_value, VOLUME_COUNT); variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, backlight_text[value_index]); - - item = variable_item_list_add( - app->variable_item_list, "Backlight Time", DELAY_COUNT, screen_changed, app); - value_index = value_index_uint32( - app->notification->settings.display_off_delay_ms, delay_value, DELAY_COUNT); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, delay_text[value_index]); - - item = variable_item_list_add( - app->variable_item_list, "LED Brightness", BACKLIGHT_COUNT, led_changed, app); - value_index = value_index_float( - app->notification->settings.led_brightness, backlight_value, BACKLIGHT_COUNT); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, backlight_text[value_index]); - - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagStealthMode)) { - item = variable_item_list_add(app->variable_item_list, "Volume", 1, NULL, app); - value_index = 0; - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, "Stealth"); - } else { - item = variable_item_list_add( - app->variable_item_list, "Volume", VOLUME_COUNT, volume_changed, app); - value_index = value_index_float( - app->notification->settings.speaker_volume, volume_value, VOLUME_COUNT); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, volume_text[value_index]); - } - - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagStealthMode)) { - item = variable_item_list_add(app->variable_item_list, "Vibro", 1, NULL, app); - value_index = 0; - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, "Stealth"); - } else { - item = variable_item_list_add( - app->variable_item_list, "Vibro", VIBRO_COUNT, vibro_changed, app); - value_index = - value_index_bool(app->notification->settings.vibro_on, vibro_value, VIBRO_COUNT); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, vibro_text[value_index]); - } - - //--- 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 exit from rgb_settings_menu - view_set_previous_callback(view_rgb, notification_app_rgb_settings_exit); - - // // 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 backlight installed", - RGB_BACKLIGHT_INSTALLED_COUNT, - rgb_backlight_installed_changed, - app); - value_index = value_index_bool( - 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_backlight_installed_text[value_index]); - } - - // led_1 color - item = variable_item_list_add( - app->variable_item_list_rgb, - "LED 1 Color", - rgb_backlight_get_color_count(), - led_2_color_changed, - app); - 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->rgb_backlight_installed == 0), - "RGB MOD \nOFF!"); - - // led_2 color - item = variable_item_list_add( - 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_SPEED_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->rgb_backlight_installed == 0), - "RGB MOD \nOFF!"); - - //--- RGB BACKLIGHT END --- - - app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_attach_to_gui( - app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - view_dispatcher_add_view(app->view_dispatcher, MainViewId, view); - view_dispatcher_add_view(app->view_dispatcher, RGBViewId, view_rgb); - view_dispatcher_switch_to_view(app->view_dispatcher, MainViewId); - return app; + variable_item_set_current_value_text(item, volume_text[value_index]); } - static void free_settings(NotificationAppSettings * app) { - view_dispatcher_remove_view(app->view_dispatcher, MainViewId); - view_dispatcher_remove_view(app->view_dispatcher, RGBViewId); - variable_item_list_free(app->variable_item_list); - variable_item_list_free(app->variable_item_list_rgb); - view_dispatcher_free(app->view_dispatcher); - - furi_record_close(RECORD_GUI); - furi_record_close(RECORD_NOTIFICATION); - free(app); + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagStealthMode)) { + item = variable_item_list_add(app->variable_item_list, "Vibro", 1, NULL, app); + value_index = 0; + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, "Stealth"); + } else { + item = variable_item_list_add( + app->variable_item_list, "Vibro", VIBRO_COUNT, vibro_changed, app); + value_index = + value_index_bool(app->notification->settings.vibro_on, vibro_value, VIBRO_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, vibro_text[value_index]); } - int32_t notification_settings_app(void* p) { - UNUSED(p); - NotificationAppSettings* app = alloc_settings(); - view_dispatcher_run(app->view_dispatcher); - notification_message_save_settings(app->notification); + //--- RGB BACKLIGHT --- - // 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); - // } + app->variable_item_list_rgb = variable_item_list_alloc(); + View* view_rgb = variable_item_list_get_view(app->variable_item_list_rgb); - free_settings(app); - return 0; + // set callback for exit from rgb_settings_menu + view_set_previous_callback(view_rgb, notification_app_rgb_settings_exit); + + // // 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 backlight installed", + RGB_BACKLIGHT_INSTALLED_COUNT, + rgb_backlight_installed_changed, + app); + value_index = value_index_bool( + 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_backlight_installed_text[value_index]); } + + // 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, + "LED 1 Color", + rgb_backlight_get_color_count(), + led_2_color_changed, + app); + 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->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); + + // led_2 color + item = variable_item_list_add( + 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->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); + + item = variable_item_list_add( + app->variable_item_list_rgb, + "Wave wide", + RGB_BACKLIGHT_RAINBOW_WIDE_COUNT, + rgb_backlight_rainbow_wide_changed, + app); + value_index = value_index_uint32( + 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_backlight_rainbow_wide_text[value_index]); + variable_item_set_locked( + item, + (app->notification->rgb_srv->settings->rgb_backlight_installed == 0), + "RGB MOD \nOFF!"); + + //--- RGB BACKLIGHT END --- + + app->view_dispatcher = view_dispatcher_alloc(); + view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); + view_dispatcher_add_view(app->view_dispatcher, MainViewId, view); + view_dispatcher_add_view(app->view_dispatcher, RGBViewId, view_rgb); + view_dispatcher_switch_to_view(app->view_dispatcher, MainViewId); + return app; +} + +static void free_settings(NotificationAppSettings* app) { + view_dispatcher_remove_view(app->view_dispatcher, MainViewId); + view_dispatcher_remove_view(app->view_dispatcher, RGBViewId); + variable_item_list_free(app->variable_item_list); + variable_item_list_free(app->variable_item_list_rgb); + view_dispatcher_free(app->view_dispatcher); + + furi_record_close(RECORD_GUI); + furi_record_close(RECORD_NOTIFICATION); + free(app); +} + +int32_t notification_settings_app(void* p) { + UNUSED(p); + NotificationAppSettings* app = alloc_settings(); + 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_backlight_installed + // if(app->notification->settings.rgb_backlight_installed) { + // furi_hal_rtc_reset_flag(FuriHalRtcFlagDebug); + // } + + free_settings(app); + return 0; +}