Still in progress

This commit is contained in:
Dmitry422
2025-03-12 18:15:38 +07:00
parent 4045628ac6
commit 7a19c9e549
14 changed files with 361 additions and 543 deletions

View File

@@ -25,11 +25,11 @@
#include "rgb_backlight.h"
#define STATIC_COLOR_COUNT (sizeof(colors) / sizeof(RGBBacklightStaticColor))
#define PREDEFINED_COLOR_COUNT (sizeof(colors) / sizeof(RGBBacklightPredefinedColor))
#define TAG "RGB_BACKLIGHT_SRV"
static const RGBBacklightStaticColor colors[] = {
static const RGBBacklightPredefinedColor colors[] = {
{"Orange", 255, 60, 0},
{"Yellow", 255, 144, 0},
{"Spring", 167, 255, 0},
@@ -46,16 +46,89 @@ static const RGBBacklightStaticColor colors[] = {
{"Custom", 0, 0, 0},
};
void rgb_backlight_set_custom_color(uint8_t red, uint8_t green, uint8_t blue, float brightness) {
uint8_t rgb_backlight_get_color_count(void) {
return PREDEFINED_COLOR_COUNT;
}
const char* rgb_backlight_get_color_text(uint8_t index) {
return colors[index].name;
}
void rgb_backlight_set_static_color(uint8_t index, float brightness) {
// use RECORD for acces to rgb service instance and use current_* colors and static colors
RGBBacklightApp* app = furi_record_open(RECORD_RGB_BACKLIGHT);
for(uint8_t i = 0; i < SK6805_get_led_count(); i++) {
uint8_t r = red * (brightness);
uint8_t g = green * (brightness);
uint8_t b = blue * (brightness);
app->current_red = colors[index].red;
app->current_green = colors[index].green;
app->current_blue = colors[index].blue;
uint8_t r = app->current_red * brightness;
uint8_t g = app->current_green * brightness;
uint8_t b = app->current_blue * brightness;
SK6805_set_led_color(i, r, g, b);
}
furi_record_close(RECORD_RGB_BACKLIGHT);
SK6805_update();
}
// void rgb_backlight_set_custom_color(uint8_t red, uint8_t green, uint8_t blue, float brightness) {
// for(uint8_t i = 0; i < SK6805_get_led_count(); i++) {
// uint8_t r = red * (brightness);
// uint8_t g = green * (brightness);
// uint8_t b = blue * (brightness);
// SK6805_set_led_color(i, r, g, b);
// }
// SK6805_update();
// }
// apply new brightness to current display color set
void rgb_backlight_update (float brightness) {
// use RECORD for acces to rgb service instance and use current_* colors
RGBBacklightApp* app = furi_record_open(RECORD_RGB_BACKLIGHT);
for(uint8_t i = 0; i < SK6805_get_led_count(); i++) {
uint8_t r = app->current_red * brightness;
uint8_t g = app->current_green * brightness;
uint8_t b = app->current_blue * brightness;
SK6805_set_led_color(i, r, g, b);
}
furi_record_close(RECORD_RGB_BACKLIGHT);
SK6805_update();
}
//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
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
void rainbow_timer_starter(RGBBacklightApp* app) {
if(app->settings->rgb_mod_installed) {
if(app->settings->rainbow_mode > 0) {
// rgb_backlight_set_custom_color(
// app->rainbow_red,
// app->rainbow_green,
// app->rainbow_blue,
// app->settings->brightness);
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;
@@ -63,51 +136,51 @@ static void rainbow_timer_callback(void* context) {
// if rgb_mode_rainbow_mode is rainbow do rainbow effect
if(app->settings->rainbow_mode == 1) {
switch(app->rainbow_stage) {
// from red to yellow
// from red to yellow (255,0,0) - (255,255,0)
case 1:
app->rainbow_green += app->settings->rainbow_step;
if(app->rainbow_green >= 255) {
app->rainbow_green = 255;
app->current_green += app->settings->rainbow_step;
if(app->current_green >= 255) {
app->current_green = 255;
app->rainbow_stage++;
}
break;
// yellow red to green
// yellow to green (255,255,0) - (0,255,0)
case 2:
app->rainbow_red -= app->settings->rainbow_step;
if(app->rainbow_red <= 0) {
app->rainbow_red = 0;
app->current_red -= app->settings->rainbow_step;
if(app->current_red <= 0) {
app->current_red = 0;
app->rainbow_stage++;
}
break;
// from green to light blue
// from green to light blue (0,255,0) - (0,255,255)
case 3:
app->rainbow_blue += app->settings->rainbow_step;
if(app->rainbow_blue >= 255) {
app->rainbow_blue = 255;
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
//from light blue to blue (0,255,255) - (0,0,255)
case 4:
app->rainbow_green -= app->settings->rainbow_step;
if(app->rainbow_green <= 0) {
app->rainbow_green = 0;
app->current_green -= app->settings->rainbow_step;
if(app->current_green <= 0) {
app->current_green = 0;
app->rainbow_stage++;
}
break;
//from blue to violet
//from blue to violet (0,0,255) - (255,0,255)
case 5:
app->rainbow_red += app->settings->rainbow_step;
if(app->rainbow_red >= 255) {
app->rainbow_red = 255;
app->current_red += app->settings->rainbow_step;
if(app->current_red >= 255) {
app->current_red = 255;
app->rainbow_stage++;
}
break;
//from violet to red
//from violet to red (255,0,255) - (255,0,0)
case 6:
app->rainbow_blue -= app->settings->rainbow_step;
if(app->rainbow_blue <= 0) {
app->rainbow_blue = 0;
app->current_blue -= app->settings->rainbow_step;
if(app->current_blue <= 0) {
app->current_blue = 0;
app->rainbow_stage = 1;
}
break;
@@ -115,25 +188,23 @@ static void rainbow_timer_callback(void* context) {
break;
}
rgb_backlight_set_custom_color(
app->rainbow_red,
app->rainbow_green,
app->rainbow_blue,
app->settings->brightness);
// rgb_backlight_set_custom_color(
// app->current_red,
// app->current_green,
// app->current_blue,
// app->settings->brightness);
}
rgb_backlight_update (app->settings->brightness);
// if rgb_mode_rainbow_mode is ..... do another effect
// if(app->settings.rainbow_mode == 2) {
// }
}
void rgb_backlight_settings_apply(RGBBacklightSettings* settings) {
UNUSED (settings);
//запуск таймера если все включено
// применить сохраненые настройки цвета к дисплею статику или кастом если индекс=13
}
int32_t rgb_backlight_srv (void* p) {
UNUSED(p);
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));
@@ -143,11 +214,28 @@ int32_t rgb_backlight_srv (void* p){
app->rainbow_timer =
furi_timer_alloc(rainbow_timer_callback, FuriTimerTypePeriodic, app);
// load or init new settings and apply it
// settings load or create default
rgb_backlight_settings_load (app->settings);
rgb_backlight_settings_apply (app->settings);
UNUSED(p);
// Init app variables
app->current_red = 255;
app->current_green = 60;
app->current_green = 0;
app->rainbow_stage = 1;
// а нужно ли это все при старте сервиса, если мы получим сигнал на подсветку от Нотификейшена. Может вынести в ИНИТ и при старте нотиф дернуть его 1 раз
// if rgb_mod_installed start rainbow or set static color from settings (default index = 0)
if(app->settings->rgb_mod_installed) {
if(app->settings->rainbow_mode > 0 ) {
rainbow_timer_starter(app);
} else {
rgb_backlight_set_static_color(app->settings->static_color_index, app->settings->brightness);
}
// if not rgb_mod_installed set default static orange color (index=0)
} else {
rgb_backlight_set_static_color(0, app->settings->brightness);
}
while(1) {
FURI_LOG_I(TAG, "working");
furi_delay_ms(2000);