mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-23 05:24:46 -07:00
Start moving RGB backlight back to Notification service
This commit is contained in:
@@ -9,9 +9,9 @@
|
||||
#include "notification.h"
|
||||
#include "notification_messages.h"
|
||||
#include "notification_app.h"
|
||||
#include "applications/services/rgb_backlight/rgb_backlight.h"
|
||||
|
||||
#define TAG "NotificationSrv"
|
||||
#define COLOR_COUNT (sizeof(colors) / sizeof(RGBBacklightColor))
|
||||
|
||||
static const uint8_t minimal_delay = 100;
|
||||
static const uint8_t led_off_values[NOTIFICATION_LED_COUNT] = {0x00, 0x00, 0x00};
|
||||
@@ -33,6 +33,204 @@ static uint8_t notification_settings_get_display_brightness(NotificationApp* app
|
||||
static uint8_t notification_settings_get_rgb_led_brightness(NotificationApp* app, uint8_t value);
|
||||
static uint32_t notification_settings_display_off_delay_ticks(NotificationApp* app);
|
||||
|
||||
|
||||
// --- RGB BACKLIGHT ---
|
||||
|
||||
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},
|
||||
{"Spring", 167, 255, 0},
|
||||
{"Lime", 0, 255, 0},
|
||||
{"Aqua", 0, 255, 127},
|
||||
{"Cyan", 0, 210, 210},
|
||||
{"Azure", 0, 127, 255},
|
||||
{"Blue", 0, 0, 255},
|
||||
{"Purple", 127, 0, 255},
|
||||
{"Magenta", 210, 0, 210},
|
||||
{"Pink", 255, 0, 127},
|
||||
{"Red", 255, 0, 0},
|
||||
{"White", 254, 210, 200},
|
||||
{"OFF", 0, 0, 0},
|
||||
};
|
||||
|
||||
uint8_t rgb_backlight_get_color_count(void) {
|
||||
return COLOR_COUNT;
|
||||
}
|
||||
|
||||
const char* rgb_backlight_get_color_text(uint8_t index) {
|
||||
return colors[index].name;
|
||||
}
|
||||
|
||||
// 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) {
|
||||
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].blue = b;
|
||||
|
||||
SK6805_set_led_color(led, r, g, b);
|
||||
}
|
||||
}
|
||||
|
||||
// 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, 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.rgb_backlight_installed) {
|
||||
for(uint8_t i = 0; i < SK6805_get_led_count(); i++) {
|
||||
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();
|
||||
// }
|
||||
// furi_record_close(RECORD_RGB_BACKLIGHT);
|
||||
}
|
||||
|
||||
// start furi timer for rainbow
|
||||
void rainbow_timer_start(NotificationApp* app) {
|
||||
if(furi_timer_is_running(app->rainbow_timer)) {
|
||||
furi_timer_stop(app->rainbow_timer);
|
||||
}
|
||||
furi_timer_start(app->rainbow_timer, furi_ms_to_ticks(app->settings.rgb.rainbow_speed_ms));
|
||||
}
|
||||
|
||||
// stop furi timer for rainbow
|
||||
void rainbow_timer_stop(NotificationApp* app) {
|
||||
if(furi_timer_is_running(app->rainbow_timer)) {
|
||||
furi_timer_stop(app->rainbow_timer);
|
||||
}
|
||||
}
|
||||
|
||||
// if rgb_backlight_installed then apply rainbow colors to backlight and start/restart/stop rainbow_timer
|
||||
void rainbow_timer_starter(NotificationApp* app) {
|
||||
if((app->settings.rgb.rainbow_mode > 0) && (app->settings.rgb.rgb_backlight_installed)) {
|
||||
rainbow_timer_start(app);
|
||||
}
|
||||
}
|
||||
|
||||
static void rainbow_timer_callback(void* context) {
|
||||
furi_assert(context);
|
||||
NotificationApp* app = context;
|
||||
|
||||
if(app->settings.rgb.rgb_backlight_installed) {
|
||||
app->rainbow_hue += app->settings.rgb.rainbow_step;
|
||||
if(app->rainbow_hue > 254) {
|
||||
app->rainbow_hue = 0;
|
||||
}
|
||||
|
||||
uint8_t wide = app->settings.rgb.rainbow_wide;
|
||||
|
||||
switch(app->settings.rgb.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.rgb.rainbow_saturation,
|
||||
app->settings.display_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.rgb.rainbow_saturation, app->settings.display_brightness);
|
||||
rgb_backlight_set_led_custom_hsv_color(
|
||||
1, j, app->settings.rgb.rainbow_saturation, app->settings.display_brightness);
|
||||
rgb_backlight_set_led_custom_hsv_color(
|
||||
2, k, app->settings.rgb.rainbow_saturation, app->settings.display_brightness);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
rgb_backlight_update(app->settings.led_brightness * app->current_night_shift);
|
||||
}
|
||||
}
|
||||
|
||||
// --- RGB BACKLIGHT ENF---
|
||||
|
||||
|
||||
// --- NIGHT SHIFT ---
|
||||
|
||||
void night_shift_timer_start(NotificationApp* app) {
|
||||
@@ -64,10 +262,8 @@ void night_shift_timer_callback(void* context) {
|
||||
// set values to stock and rgb backlights
|
||||
if((time > app->settings.night_shift_end) && (time < app->settings.night_shift_start)) {
|
||||
app->current_night_shift = 1.0f;
|
||||
app->rgb_srv->current_night_shift = 1.0f;
|
||||
} else {
|
||||
app->current_night_shift = app->settings.night_shift;
|
||||
app->rgb_srv->current_night_shift = app->settings.night_shift;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,7 +463,7 @@ static void notification_process_notification_message(
|
||||
reset_mask |= reset_display_mask;
|
||||
|
||||
//start rgb_mod_rainbow_timer when display backlight is ON and all corresponding settings is ON too
|
||||
rainbow_timer_starter(app->rgb_srv);
|
||||
rainbow_timer_starter(app);
|
||||
// --- NIGHT SHIFT END ---
|
||||
} else {
|
||||
reset_mask &= ~reset_display_mask;
|
||||
@@ -276,8 +472,8 @@ static void notification_process_notification_message(
|
||||
furi_timer_stop(app->display_timer);
|
||||
}
|
||||
//stop rgb_mod_rainbow_timer when display backlight is OFF
|
||||
if(furi_timer_is_running(app->rgb_srv->rainbow_timer)) {
|
||||
rainbow_timer_stop(app->rgb_srv);
|
||||
if(furi_timer_is_running(app->rainbow_timer)) {
|
||||
rainbow_timer_stop(app);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -610,8 +806,7 @@ static NotificationApp* notification_app_alloc(void) {
|
||||
notification_message(app, &sequence_display_backlight_on);
|
||||
|
||||
// --- NIGHT SHIFT ---
|
||||
app->rgb_srv = furi_record_open(RECORD_RGB_BACKLIGHT);
|
||||
app->rgb_srv->current_night_shift = 1.0f;
|
||||
app->current_night_shift = 1.0f;
|
||||
app->current_night_shift = 1.0f;
|
||||
app->settings.night_shift = 1.0f;
|
||||
app->settings.night_shift_start = 1020;
|
||||
@@ -620,6 +815,7 @@ static NotificationApp* notification_app_alloc(void) {
|
||||
furi_timer_alloc(night_shift_timer_callback, FuriTimerTypePeriodic, app);
|
||||
// --- NIGHT SHIFT END ---
|
||||
|
||||
// use RECORD for setup init values to canvas lcd_inverted
|
||||
Gui* tmp_gui = furi_record_open(RECORD_GUI);
|
||||
Canvas* tmp_canvas = gui_direct_draw_acquire(tmp_gui);
|
||||
canvas_set_inverted_lcd(tmp_canvas, false);
|
||||
@@ -682,6 +878,35 @@ int32_t notification_srv(void* p) {
|
||||
UNUSED(p);
|
||||
NotificationApp* app = notification_app_alloc();
|
||||
|
||||
// --- RGB BACKLIGHT SECTION ---
|
||||
|
||||
// define rainbow_timer and they callback
|
||||
app->rainbow_timer = furi_timer_alloc(rainbow_timer_callback, FuriTimerTypePeriodic, app);
|
||||
|
||||
// init values
|
||||
app->rainbow_hue = 1;
|
||||
app->current_night_shift = 1.0f;
|
||||
|
||||
// if rgb_backlight_installed then start rainbow or set leds colors from saved settings (default index = 0)
|
||||
if(app->settings.rgb.rgb_backlight_installed) {
|
||||
if(app->settings.rgb.rainbow_mode > 0) {
|
||||
rainbow_timer_start(app);
|
||||
} else {
|
||||
rgb_backlight_set_led_static_color(2, app->settings.rgb.led_2_color_index);
|
||||
rgb_backlight_set_led_static_color(1, app->settings.rgb.led_1_color_index);
|
||||
rgb_backlight_set_led_static_color(0, app->settings.rgb.led_0_color_index);
|
||||
rgb_backlight_update(app->settings.display_brightness * app->current_night_shift);
|
||||
}
|
||||
// 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);
|
||||
SK6805_update();
|
||||
}
|
||||
|
||||
// --- RGB BACKLIGHT SECTION END ---
|
||||
|
||||
notification_init_settings(app);
|
||||
|
||||
notification_vibro_off();
|
||||
|
||||
Reference in New Issue
Block a user