Skip to content

Commit

Permalink
FEAT: Add blue light filter to tweaks (#1134)
Browse files Browse the repository at this point in the history
## Overview
| Menu | Options |
|---------|---------|
| <img
src="https://github.com/OnionUI/Onion/assets/47260768/7e7862c9-7a49-4194-987e-df73427c046d"
width="100%"> | <img
src="https://github.com/OnionUI/Onion/assets/47260768/8571065d-9900-490e-8941-6c7c12eb38c2"
width="100%"> |

## Features

- Blue light function to change the colortemp of the screen
- Fades in/out 
- Time scheduling
- Selection of strengths/presets

## Adds 

Menu item to Tweaks -> Appearance -> Blue light filter
cmdline control over BLF through tweaks but should be used with the
`blue_light.sh` script rather than direct control.

blue_light.sh accepts the following:
```Usage: $0 {enable|disable|check}```

script guards against running too often with:
```/tmp/blue_light_script.lock```

script will quickly complete depending on the action, will not enable
BLF if it's already enabled, etc

## Considerations

- Added to 15 second loop area of keymon, there will be +/- 15 seconds
after making a change to the time profiles before it actually changes.
- Changes will be live immediately after the time is changed (even if
you're still in tweaks)
- 

## Options

Colour will gradually change, has 5 preset options:

- Subtle
- Moderate
- Balanced
- Strong
- Intense

---------

Co-authored-by: XK9274 <XK9274@users.noreply.github.com>
Co-authored-by: Schmurtz <schmurtz@gmail.com>
  • Loading branch information
3 people committed Dec 11, 2023
1 parent 14b4be9 commit ada969e
Show file tree
Hide file tree
Showing 12 changed files with 530 additions and 15 deletions.
2 changes: 1 addition & 1 deletion src/bootScreen/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ INCLUDE_SHMVAR=1
include ../common/config.mk

TARGET = bootScreen
LDFLAGS := $(LDFLAGS) -lSDL -lSDL_image -lSDL_ttf -lSDL_mixer
LDFLAGS := $(LDFLAGS) -lSDL -lSDL_image -lSDL_ttf -lSDL_mixer

include ../common/commands.mk
include ../common/recipes.mk
20 changes: 20 additions & 0 deletions src/common/system/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ typedef struct settings_s {
int ingame_double_press;
bool disable_standby;
bool enable_logging;
int blue_light_state;
int blue_light_level;
int blue_light_rgb;
char blue_light_time[16];
char blue_light_time_off[16];

char mainui_button_x[JSON_STRING_LEN];
char mainui_button_y[JSON_STRING_LEN];
Expand Down Expand Up @@ -96,6 +101,11 @@ static settings_s __default_settings = (settings_s){
.ingame_double_press = 3,
.disable_standby = false,
.enable_logging = false,
.blue_light_state = false,
.blue_light_level = 0,
.blue_light_rgb = 8421504,
.blue_light_time = "20:00",
.blue_light_time_off = "08:00",
.mainui_button_x = "",
.mainui_button_y = ""};

Expand Down Expand Up @@ -174,6 +184,7 @@ void settings_load(void)
settings.mute = config_flag_get(".muteVolume");
settings.disable_standby = config_flag_get(".disableStandby");
settings.enable_logging = config_flag_get(".logging");
settings.blue_light_state = config_flag_get(".blf");

if (config_flag_get(".noLowBatteryAutoSave")) // flag is deprecated, but keep compatibility
settings.low_battery_autosave_at = 0;
Expand All @@ -190,6 +201,10 @@ void settings_load(void)
config_get("startup/addHours", CONFIG_INT, &settings.time_skip);
config_get("vibration", CONFIG_INT, &settings.vibration);
config_get("startup/tab", CONFIG_INT, &settings.startup_tab);
config_get("display/blueLightLevel", CONFIG_INT, &settings.blue_light_level);
config_get("display/blueLightTime", CONFIG_STR, &settings.blue_light_time);
config_get("display/blueLightTimeOff", CONFIG_STR, &settings.blue_light_time_off);
config_get("display/blueLightRGB", CONFIG_INT, &settings.blue_light_rgb);

if (config_flag_get(".menuInverted")) { // flag is deprecated, but keep compatibility
settings.ingame_single_press = 2;
Expand Down Expand Up @@ -304,12 +319,17 @@ void settings_save(void)
config_flag_set(".muteVolume", settings.mute);
config_flag_set(".disableStandby", settings.disable_standby);
config_flag_set(".logging", settings.enable_logging);
config_flag_set(".blf", settings.blue_light_state);
config_setNumber("battery/warnAt", settings.low_battery_warn_at);
config_setNumber("battery/exitAt", settings.low_battery_autosave_at);
config_setNumber("startup/app", settings.startup_application);
config_setNumber("startup/addHours", settings.time_skip);
config_setNumber("vibration", settings.vibration);
config_setNumber("startup/tab", settings.startup_tab);
config_setNumber("display/blueLightLevel", settings.blue_light_level);
config_setNumber("display/blueLightRGB", settings.blue_light_rgb);
config_setString("display/blueLightTime", settings.blue_light_time);
config_setString("display/blueLightTimeOff", settings.blue_light_time_off);

// remove deprecated flags
remove(CONFIG_PATH ".noLowBatteryAutoSave");
Expand Down
6 changes: 5 additions & 1 deletion src/keymon/keymon.c
Original file line number Diff line number Diff line change
Expand Up @@ -706,7 +706,6 @@ int main(void)
}

// Comes here every CHECK_SEC(def:15) seconds interval

if (delete_flag) {
if (exists("/tmp/state_changed")) {
system_state_update();
Expand Down Expand Up @@ -735,6 +734,11 @@ int main(void)
}
}

// Check bluelight filter
if (DEVICE_ID == MIYOO354) {
system("/mnt/SDCARD/.tmp_update/script/blue_light.sh check");
}

// Quit RetroArch / auto-save when battery too low
if (settings.low_battery_autosave_at && battery_getPercentage() <= settings.low_battery_autosave_at && check_autosave()) {
temp_flag_set(".lowBat", true);
Expand Down
68 changes: 68 additions & 0 deletions src/tweaks/actions.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,74 @@ void action_meterWidth(void *pt)
osd_showBrightnessBar(settings.brightness);
}

int blueLightToggled = 0;

void action_blueLight()
{
if (access("/tmp/runningBLF", F_OK) != -1) {
return;
}

if (blueLightToggled) {
system("/mnt/SDCARD/.tmp_update/script/blue_light.sh disable &");
blueLightToggled = 0;
}
else {
system("/mnt/SDCARD/.tmp_update/script/blue_light.sh enable &");
blueLightToggled = 1;
}
}

void action_blueLightLevel(void *pt)
{
int value;
ListItem *item = (ListItem *)pt;

value = item->value;
settings.blue_light_level = value;
config_setNumber("display/blueLightLevel", value);

system("/mnt/SDCARD/.tmp_update/script/blue_light.sh set_intensity &");
remove("/tmp/blueLightOn");
}

void action_blueLightState(void *pt)
{
if (access("/tmp/runningBLF", F_OK) != -1) {
return;
}

ListItem *item = (ListItem *)pt;
settings.blue_light_state = item->value == 1;
config_flag_set(".blf", settings.blue_light_state);

if (item->value == 0) { // blf being disabled
system("/mnt/SDCARD/.tmp_update/script/blue_light.sh disable &");
remove("/tmp/blueLightOn");
}
else {
system("/mnt/SDCARD/.tmp_update/script/blue_light.sh check &"); // check if we're within the time values and start now
}
reset_menus = true;
all_changed = true;
}

void action_blueLightTimeOn(void *pt)
{
char time_str[10];
formatter_Time(pt, time_str);
strcpy(settings.blue_light_time, time_str);
config_setString("display/blueLightTime", time_str);
}

void action_blueLightTimeOff(void *pt)
{
char time_str[10];
formatter_Time(pt, time_str);
strcpy(settings.blue_light_time_off, time_str);
config_setString("display/blueLightTimeOff", time_str);
}

void action_setStartupAutoResume(void *pt)
{
settings.startup_auto_resume = ((ListItem *)pt)->value == 1;
Expand Down
2 changes: 2 additions & 0 deletions src/tweaks/appstate.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ static List _menu_main;
static List _menu_system;
static List _menu_date_time;
static List _menu_system_display;
static List _menu_user_blue_light;
static List _menu_system_startup;
static List _menu_button_action;
static List _menu_button_action_mainui_menu;
Expand Down Expand Up @@ -88,6 +89,7 @@ void menu_free_all(void)
list_free(&_menu_tools);
list_free(&_menu_tools_m3uGenerator);
list_free(&_menu_diagnostics);
list_free(&_menu_user_blue_light);

menu_icons_free_all();
menu_network_free_all();
Expand Down
23 changes: 23 additions & 0 deletions src/tweaks/formatters.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
"-", "Off", "On" \
}

#define BLUELIGHT_LABELS \
{ \
"None", "Subtle", "Moderate", "Balanced", "Strong", "Intense" \
}

void formatter_timezone(void *pt, char *out_label)
{
ListItem *item = (ListItem *)pt;
Expand All @@ -39,6 +44,24 @@ void formatter_timezone(void *pt, char *out_label)
}
}

void formatter_Time(void *pt, char *out_label)
{
ListItem *item = (ListItem *)pt;
int value = item->value;
int hours = value / 4;
int minutes = (value % 4) * 15;
sprintf(out_label, "%02d:%02d", hours, minutes);
}

int formatter_timeStringToID(const char *time_str)
{
int hours, minutes;
sscanf(time_str, "%02d:%02d", &hours, &minutes);
int intervalsFromHours = hours * 4;
int intervalsFromMinutes = minutes / 15;
return intervalsFromHours + intervalsFromMinutes;
}

void formatter_appShortcut(void *pt, char *out_label)
{
ListItem *item = (ListItem *)pt;
Expand Down
74 changes: 73 additions & 1 deletion src/tweaks/menus.h
Original file line number Diff line number Diff line change
Expand Up @@ -471,10 +471,78 @@ void menu_themeOverrides(void *_)
header_changed = true;
}

void menu_blueLight(void *_)
{
if (!_menu_user_blue_light._created) {
network_loadState();
_menu_user_blue_light = list_createWithTitle(6, LIST_SMALL, "Blue light filter schedule");
if (DEVICE_ID == MIYOO354) {
list_addItem(&_menu_user_blue_light,
(ListItem){
.label = "[DATESTRING]",
.disabled = 1,
.action = NULL});
}
list_addItemWithInfoNote(&_menu_user_blue_light,
(ListItem){
.label = "Toggle now",
.item_type = ACTION,
.action = action_blueLight},
"Test the selected strength \n");
if (DEVICE_ID == MIYOO354) {
list_addItemWithInfoNote(&_menu_user_blue_light,
(ListItem){
.label = "Enable schedule",
.disabled = !network_state.ntp,
.item_type = TOGGLE,
.value = (int)settings.blue_light_state,
.action = action_blueLightState},
"Turn bluelight filter on or off\n");
}
list_addItemWithInfoNote(&_menu_user_blue_light,
(ListItem){
.label = "Strength",
.item_type = MULTIVALUE,
.value_max = 5,
.value_labels = BLUELIGHT_LABELS,
.action = action_blueLightLevel,
.value = value_blueLightLevel()},
"Change the strength of the \n"
"Blue light filter");
if (DEVICE_ID == MIYOO354) {
list_addItemWithInfoNote(&_menu_user_blue_light,
(ListItem){
.label = "Time (On)",
.disabled = !network_state.ntp,
.item_type = MULTIVALUE,
.value_max = 95,
.value_formatter = formatter_Time,
.action = action_blueLightTimeOn,
.value = value_blueLightTimeOn()},
"Time schedule for the bluelight filter");
list_addItemWithInfoNote(&_menu_user_blue_light,
(ListItem){
.label = "Time (Off)",
.disabled = !network_state.ntp,
.item_type = MULTIVALUE,
.value_max = 95,
.value_formatter = formatter_Time,
.action = action_blueLightTimeOff,
.value = value_blueLightTimeOff()},
"Time schedule for the bluelight filter");
}
}
if (DEVICE_ID == MIYOO354) {
_writeDateString(_menu_user_blue_light.items[0].label);
}
menu_stack[++menu_level] = &_menu_user_blue_light;
header_changed = true;
}

void menu_userInterface(void *_)
{
if (!_menu_user_interface._created) {
_menu_user_interface = list_createWithTitle(5, LIST_SMALL, "Appearance");
_menu_user_interface = list_createWithTitle(6, LIST_SMALL, "Appearance");
list_addItemWithInfoNote(&_menu_user_interface,
(ListItem){
.label = "Show recents",
Expand Down Expand Up @@ -503,6 +571,10 @@ void menu_userInterface(void *_)
"Set the width of the 'OSD bar' shown\n"
"in the left side of the display when\n"
"adjusting brightness, or volume (MMP).");
list_addItem(&_menu_user_interface,
(ListItem){
.label = "Blue light filter...",
.action = menu_blueLight});
list_addItem(&_menu_user_interface,
(ListItem){
.label = "Theme overrides...",
Expand Down
15 changes: 12 additions & 3 deletions src/tweaks/tweaks.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,18 @@ int main(int argc, char *argv[])
battery_changed = true;

if (acc_ticks >= time_step) {
if (isMenu(&_menu_date_time)) {
if (_writeDateString(_menu_date_time.items[0].label)) {
list_changed = true;
if (isMenu(&_menu_date_time) || isMenu(&_menu_user_blue_light)) {
if (isMenu(&_menu_date_time)) {
if (_writeDateString(_menu_date_time.items[0].label)) {
list_changed = true;
}
}
if (DEVICE_ID == MIYOO354) {
if (isMenu(&_menu_user_blue_light)) {
if (_writeDateString(_menu_user_blue_light.items[0].label)) {
list_changed = true;
}
}
}
}
if (isMenu(&_menu_network) || isMenu(&_menu_wifi)) {
Expand Down
45 changes: 45 additions & 0 deletions src/tweaks/values.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,51 @@ int value_appShortcut(int button)
return 0;
}

int value_blueLightRGB(void)
{
int blueLightRGB = 0;
if (!config_get("display/blueLightRGB", CONFIG_INT, &blueLightRGB)) {
blueLightRGB = settings.blue_light_rgb;
config_setNumber("display/blueLightRGB", blueLightRGB);
}
return blueLightRGB;
}

int value_blueLightLevel(void)
{
int blueLightLevel = 0;
if (!config_get("display/blueLightLevel", CONFIG_INT, &blueLightLevel)) {
blueLightLevel = settings.blue_light_level;
config_setNumber("display/blueLightLevel", blueLightLevel);
}
value_blueLightRGB(); // also init a default rgb size
return blueLightLevel;
}

int value_blueLightTimeOn(void)
{
char blueLightTime[12] = {0};
int blueLightID = 0;
if (!config_get("display/blueLightTime", CONFIG_STR, blueLightTime)) {
strcpy(blueLightTime, settings.blue_light_time);
config_setString("display/blueLightTime", blueLightTime);
}
blueLightID = formatter_timeStringToID(blueLightTime);
return blueLightID;
}

int value_blueLightTimeOff(void)
{
char blueLightTimeOff[12] = {0};
int blueLightID = 0;
if (!config_get("display/blueLightTimeOff", CONFIG_STR, blueLightTimeOff)) {
strcpy(blueLightTimeOff, settings.blue_light_time_off);
config_setString("display/blueLightTimeOff", blueLightTimeOff);
}
blueLightID = formatter_timeStringToID(blueLightTimeOff);
return blueLightID;
}

int value_meterWidth(void)
{
int meterWidth = 4;
Expand Down
Binary file added static/build/.tmp_update/bin/disp_init
Binary file not shown.

0 comments on commit ada969e

Please sign in to comment.