Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement blue light filters #1065

Merged
merged 7 commits into from
Feb 21, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion sysmodules/rosalina/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ dir_include := include
dir_build := build
dir_out := ../../$(dir_build)

LIBS := -lctru
LIBS := -lctru -lm
LIBDIRS := $(CTRULIB)
LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)

Expand Down
4 changes: 4 additions & 0 deletions sysmodules/rosalina/include/draw.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
#define GPU_FB_TOP_LEFT_ADDR_2 REG32(0x1040046C)
#define GPU_FB_TOP_FMT REG32(0x10400470)
#define GPU_FB_TOP_SEL REG32(0x10400478)
#define GPU_FB_TOP_COL_LUT_INDEX REG32(0x10400480)
#define GPU_FB_TOP_COL_LUT_ELEM REG32(0x10400484)
#define GPU_FB_TOP_STRIDE REG32(0x10400490)
#define GPU_FB_TOP_RIGHT_ADDR_1 REG32(0x10400494)
#define GPU_FB_TOP_RIGHT_ADDR_2 REG32(0x10400498)
Expand All @@ -42,6 +44,8 @@
#define GPU_FB_BOTTOM_ADDR_2 REG32(0x1040056C)
#define GPU_FB_BOTTOM_FMT REG32(0x10400570)
#define GPU_FB_BOTTOM_SEL REG32(0x10400578)
#define GPU_FB_BOTTOM_COL_LUT_INDEX REG32(0x10400580)
#define GPU_FB_BOTTOM_COL_LUT_ELEM REG32(0x10400584)
#define GPU_FB_BOTTOM_STRIDE REG32(0x10400590)

#define GPU_PSC0_CNT REG32(0x1040001C)
Expand Down
41 changes: 41 additions & 0 deletions sysmodules/rosalina/include/menus/screen_filters.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* This file is part of Luma3DS
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
* * Requiring preservation of specified reasonable legal notices or
* author attributions in that material or in the Appropriate Legal
* Notices displayed by works containing it.
* * Prohibiting misrepresentation of the origin of that material,
* or requiring that modified versions of such material be marked in
* reasonable ways as different from the original version.
*/

#pragma once

#include "menu.h"

extern Menu screenFiltersMenu;

int screenFiltersCurrentTemperature;

void screenFiltersSetDisabled(void);
void screenFiltersReduceBlueLevel1(void);
void screenFiltersReduceBlueLevel2(void);
void screenFiltersReduceBlueLevel3(void);
void screenFiltersReduceBlueLevel4(void);
void screenFiltersReduceBlueLevel5(void);
void screenFiltersSetTemperature(int temperature);
32 changes: 32 additions & 0 deletions sysmodules/rosalina/include/redshift/colorramp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/* colorramp.h -- color temperature calculation header
This file is part of Redshift.
Redshift is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Redshift is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Redshift. If not, see <http://www.gnu.org/licenses/>.
Copyright (c) 2010-2014 Jon Lund Steffensen <jonlst@gmail.com>
*/

#ifndef REDSHIFT_COLORRAMP_H
#define REDSHIFT_COLORRAMP_H

#include <stdint.h>

#include "redshift.h"

void colorramp_fill(uint16_t *gamma_r, uint16_t *gamma_g, uint16_t *gamma_b,
int size, const color_setting_t *setting);
void colorramp_fill_float(float *gamma_r, float *gamma_g, float *gamma_b,
int size, const color_setting_t *setting);

#endif /* ! REDSHIFT_COLORRAMP_H */
153 changes: 153 additions & 0 deletions sysmodules/rosalina/include/redshift/redshift.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
/* redshift.h -- Main program header
This file is part of Redshift.
Redshift is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Redshift is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Redshift. If not, see <http://www.gnu.org/licenses/>.
Copyright (c) 2013-2017 Jon Lund Steffensen <jonlst@gmail.com>
*/

#ifndef REDSHIFT_REDSHIFT_H
#define REDSHIFT_REDSHIFT_H

#include <stdio.h>
#include <stdlib.h>

/* The color temperature when no adjustment is applied. */
#define NEUTRAL_TEMP 6500


/* Location */
typedef struct {
float lat;
float lon;
} location_t;

/* Periods of day. */
typedef enum {
PERIOD_NONE = 0,
PERIOD_DAYTIME,
PERIOD_NIGHT,
PERIOD_TRANSITION
} period_t;

/* Color setting */
typedef struct {
int temperature;
float gamma[3];
float brightness;
} color_setting_t;

/* Program modes. */
typedef enum {
PROGRAM_MODE_CONTINUAL,
PROGRAM_MODE_ONE_SHOT,
PROGRAM_MODE_PRINT,
PROGRAM_MODE_RESET,
PROGRAM_MODE_MANUAL
} program_mode_t;

/* Time range.
Fields are offsets from midnight in seconds. */
typedef struct {
int start;
int end;
} time_range_t;

/* Transition scheme.
The solar elevations at which the transition begins/ends,
and the association color settings. */
typedef struct {
double high;
double low;
int use_time; /* When enabled, ignore elevation and use time ranges. */
time_range_t dawn;
time_range_t dusk;
color_setting_t day;
color_setting_t night;
} transition_scheme_t;


/* Gamma adjustment method */
typedef struct gamma_state gamma_state_t;

typedef int gamma_method_init_func(gamma_state_t **state);
typedef int gamma_method_start_func(gamma_state_t *state);
typedef void gamma_method_free_func(gamma_state_t *state);
typedef void gamma_method_print_help_func(FILE *f);
typedef int gamma_method_set_option_func(gamma_state_t *state, const char *key,
const char *value);
typedef void gamma_method_restore_func(gamma_state_t *state);
typedef int gamma_method_set_temperature_func(
gamma_state_t *state, const color_setting_t *setting, int preserve);

typedef struct {
char *name;

/* If true, this method will be tried if none is explicitly chosen. */
int autostart;

/* Initialize state. Options can be set between init and start. */
gamma_method_init_func *init;
/* Allocate storage and make connections that depend on options. */
gamma_method_start_func *start;
/* Free all allocated storage and close connections. */
gamma_method_free_func *free;

/* Print help on options for this adjustment method. */
gamma_method_print_help_func *print_help;
/* Set an option key, value-pair */
gamma_method_set_option_func *set_option;

/* Restore the adjustment to the state before start was called. */
gamma_method_restore_func *restore;
/* Set a specific color temperature. */
gamma_method_set_temperature_func *set_temperature;
} gamma_method_t;


/* Location provider */
typedef struct location_state location_state_t;

typedef int location_provider_init_func(location_state_t **state);
typedef int location_provider_start_func(location_state_t *state);
typedef void location_provider_free_func(location_state_t *state);
typedef void location_provider_print_help_func(FILE *f);
typedef int location_provider_set_option_func(
location_state_t *state, const char *key, const char *value);
typedef int location_provider_get_fd_func(location_state_t *state);
typedef int location_provider_handle_func(
location_state_t *state, location_t *location, int *available);

typedef struct {
char *name;

/* Initialize state. Options can be set between init and start. */
location_provider_init_func *init;
/* Allocate storage and make connections that depend on options. */
location_provider_start_func *start;
/* Free all allocated storage and close connections. */
location_provider_free_func *free;

/* Print help on options for this location provider. */
location_provider_print_help_func *print_help;
/* Set an option key, value-pair. */
location_provider_set_option_func *set_option;

/* Listen and handle location updates. */
location_provider_get_fd_func *get_fd;
location_provider_handle_func *handle;
} location_provider_t;


#endif /* ! REDSHIFT_REDSHIFT_H */
30 changes: 30 additions & 0 deletions sysmodules/rosalina/include/shell_open.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* This file is part of Luma3DS
* Copyright (C) 2016-2017 Aurora Wright, TuxSH, panicbit
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
* * Requiring preservation of specified reasonable legal notices or
* author attributions in that material or in the Appropriate Legal
* Notices displayed by works containing it.
* * Prohibiting misrepresentation of the origin of that material,
* or requiring that modified versions of such material be marked in
* reasonable ways as different from the original version.
*/

#include <MyThread.h>

MyThread *shellOpenCreateThread(void);
void shellOpenThreadMain(void);
2 changes: 2 additions & 0 deletions sysmodules/rosalina/rosalina.rsf
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ AccessControlInfo:
KernelSetState: 124

InterruptNumbers:
- 0x60 # Shell opened

ServiceAccessControl:
- fs:USER # Not strictly needed as rosalina has access to everything, it's rather to avoid a makerom warning
FileSystemAccess:
Expand Down
8 changes: 6 additions & 2 deletions sysmodules/rosalina/source/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
#include "MyThread.h"
#include "menus/process_patches.h"
#include "menus/miscellaneous.h"
#include "menus/screen_filters.h"
#include "shell_open.h"

// this is called before main
bool isN3DS;
Expand Down Expand Up @@ -99,14 +101,15 @@ int main(void)
Result res = 0;
Handle notificationHandle;

MyThread *menuThread = menuCreateThread(), *errDispThread = errDispCreateThread(), *hbldrThread = hbldrCreateThread();

if(R_FAILED(srvEnableNotification(&notificationHandle)))
svcBreak(USERBREAK_ASSERT);

if(R_FAILED(svcCreateEvent(&terminationRequestEvent, RESET_STICKY)))
svcBreak(USERBREAK_ASSERT);

MyThread *menuThread = menuCreateThread(), *errDispThread = errDispCreateThread(), *hbldrThread = hbldrCreateThread();
MyThread *shellOpenThread = shellOpenCreateThread();

do
{
res = svcWaitSynchronization(notificationHandle, -1LL);
Expand All @@ -131,6 +134,7 @@ int main(void)
MyThread_Join(menuThread, -1LL);
MyThread_Join(errDispThread, -1LL);
MyThread_Join(hbldrThread, -1LL);
MyThread_Join(shellOpenThread, -1LL);

svcCloseHandle(notificationHandle);
return 0;
Expand Down
4 changes: 2 additions & 2 deletions sysmodules/rosalina/source/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,12 @@ u32 waitCombo(void)
}

static MyThread menuThread;
static u8 ALIGN(8) menuThreadStack[THREAD_STACK_SIZE];
static u8 ALIGN(8) menuThreadStack[0x3000];
static u8 batteryLevel = 255;

MyThread *menuCreateThread(void)
{
if(R_FAILED(MyThread_Create(&menuThread, menuThreadMain, menuThreadStack, THREAD_STACK_SIZE, 52, CORE_SYSTEM)))
if(R_FAILED(MyThread_Create(&menuThread, menuThreadMain, menuThreadStack, 0x3000, 52, CORE_SYSTEM)))
svcBreak(USERBREAK_PANIC);
return &menuThread;
}
Expand Down
4 changes: 3 additions & 1 deletion sysmodules/rosalina/source/menus.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,21 @@
#include "menus/debugger.h"
#include "menus/miscellaneous.h"
#include "menus/sysconfig.h"
#include "menus/screen_filters.h"
#include "ifile.h"
#include "memory.h"
#include "fmt.h"

Menu rosalinaMenu = {
"Rosalina menu",
.nbItems = 9,
.nbItems = 10,
{
{ "Process list", METHOD, .method = &RosalinaMenu_ProcessList },
{ "Take screenshot (slow!)", METHOD, .method = &RosalinaMenu_TakeScreenshot },
{ "New 3DS menu...", MENU, .menu = &N3DSMenu },
{ "Debugger options...", MENU, .menu = &debuggerMenu },
{ "System configuration...", MENU, .menu = &sysconfigMenu },
{ "Screen filters...", MENU, .menu = &screenFiltersMenu },
{ "Miscellaneous options...", MENU, .menu = &miscellaneousMenu },
{ "Power off", METHOD, .method = &RosalinaMenu_PowerOff },
{ "Reboot", METHOD, .method = &RosalinaMenu_Reboot },
Expand Down
Loading