From eda2ad3c43912ad67080073994f4c6a33c5988cd Mon Sep 17 00:00:00 2001 From: exelix Date: Sun, 3 Mar 2019 15:45:08 +0100 Subject: [PATCH] Add wrappers for brightness-related functions --- nx/include/switch/services/lbl.h | 10 +++ nx/source/services/lbl.c | 144 +++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+) diff --git a/nx/include/switch/services/lbl.h b/nx/include/switch/services/lbl.h index 04062b2b..dcdf882f 100644 --- a/nx/include/switch/services/lbl.h +++ b/nx/include/switch/services/lbl.h @@ -12,3 +12,13 @@ void lblExit(void); Result lblSwitchBacklightOn(u64 fade_time); Result lblSwitchBacklightOff(u64 fade_time); + +/** + * @note The brightness goes from 0 to 1.0 + */ +Result lblSetCurrentBrightnessSetting(float brightness); +Result lblGetCurrentBrightnessSetting(float *out_value); + +Result lblEnableAutoBrightnessControl(void); +Result lblDisableAutoBrightnessControl(void); +Result lblIsAutoBrightnessControlEnabled(bool *out_value); diff --git a/nx/source/services/lbl.c b/nx/source/services/lbl.c index e4b59806..f0ac5a6f 100644 --- a/nx/source/services/lbl.c +++ b/nx/source/services/lbl.c @@ -70,3 +70,147 @@ Result lblSwitchBacklightOn(u64 fade_time) { Result lblSwitchBacklightOff(u64 fade_time) { return _lblSwitchBacklight(7, fade_time); } + +Result lblSetCurrentBrightnessSetting(float brightness) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + float value; + } *raw; + + raw = serviceIpcPrepareHeader(&g_lblSrv, &c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 2; + raw->value = brightness; + + Result rc = serviceIpcDispatch(&g_lblSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + } *resp; + + serviceIpcParse(&g_lblSrv, &r, sizeof(*resp)); + resp = r.Raw; + + rc = resp->result; + } + + return rc; +} + +Result lblGetCurrentBrightnessSetting(float *out_value) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = serviceIpcPrepareHeader(&g_lblSrv, &c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 3; + + Result rc = serviceIpcDispatch(&g_lblSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + float brightness; + } *resp; + + serviceIpcParse(&g_lblSrv, &r, sizeof(*resp)); + resp = r.Raw; + + rc = resp->result; + if (R_SUCCEEDED(rc)) + *out_value = resp->brightness; + } + + return rc; +} + +static Result _lblSetAutoBrightnessControl(u32 cmd_id) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = serviceIpcPrepareHeader(&g_lblSrv, &c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = cmd_id; + + Result rc = serviceIpcDispatch(&g_lblSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + } *resp; + + serviceIpcParse(&g_lblSrv, &r, sizeof(*resp)); + resp = r.Raw; + + rc = resp->result; + } + + return rc; +} + +Result lblEnableAutoBrightnessControl(void) { + return _lblSetAutoBrightnessControl(12); +} + +Result lblDisableAutoBrightnessControl(void) { + return _lblSetAutoBrightnessControl(13); +} + +Result lblIsAutoBrightnessControlEnabled(bool *out_value){ + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = serviceIpcPrepareHeader(&g_lblSrv, &c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 14; + + Result rc = serviceIpcDispatch(&g_lblSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + u8 isEnabled; + } *resp; + + serviceIpcParse(&g_lblSrv, &r, sizeof(*resp)); + resp = r.Raw; + + rc = resp->result; + if (R_SUCCEEDED(rc)) + *out_value = resp->isEnabled != 0; + } + + return rc; +}