From 94dc8f75f91a7da0676e0191016070c30a2b4521 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Sat, 10 Nov 2018 01:31:57 -0800 Subject: [PATCH] Add bpcGetSleepButtonState --- nx/include/switch/services/bpc.h | 8 +++- nx/source/services/bpc.c | 75 ++++++++++++++++++++++++-------- 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/nx/include/switch/services/bpc.h b/nx/include/switch/services/bpc.h index 96e6d870..52100985 100644 --- a/nx/include/switch/services/bpc.h +++ b/nx/include/switch/services/bpc.h @@ -1,14 +1,20 @@ /** * @file bpc.h * @brief Board power control (bpc) service IPC wrapper. - * @author XorTroll + * @author XorTroll, SciresM * @copyright libnx Authors */ #pragma once #include "../types.h" +typedef enum { + BpcSleepButtonState_Held = 0, + BpcSleepButtonState_Released = 1, +} BpcSleepButtonState; + Result bpcInitialize(void); void bpcExit(void); Result bpcShutdownSystem(void); Result bpcRebootSystem(void); +Result bpcGetSleepButtonState(BpcSleepButtonState *out); diff --git a/nx/source/services/bpc.c b/nx/source/services/bpc.c index 4be0c93c..22c8d8e5 100644 --- a/nx/source/services/bpc.c +++ b/nx/source/services/bpc.c @@ -33,31 +33,31 @@ Result bpcShutdownSystem(void) { IpcCommand c; ipcInitialize(&c); - + struct { u64 magic; u64 cmd_id; } *raw; - - raw = ipcPrepareHeader(&c, sizeof(*raw)); - + + raw = serviceIpcPrepareHeader(&g_bpcSrv, &c, sizeof(*raw)); raw->magic = SFCI_MAGIC; raw->cmd_id = 0; - + Result rc = serviceIpcDispatch(&g_bpcSrv); - + if(R_SUCCEEDED(rc)) { IpcParsedCommand r; - ipcParse(&r); - struct { u64 magic; u64 result; - } *resp = r.Raw; + } *resp; + + serviceIpcParse(&g_bpcSrv, &r, sizeof(*resp)); + resp = r.Raw; rc = resp->result; } - + return rc; } @@ -65,29 +65,66 @@ Result bpcRebootSystem(void) { IpcCommand c; ipcInitialize(&c); - + struct { u64 magic; u64 cmd_id; } *raw; - - raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw = serviceIpcPrepareHeader(&g_bpcSrv, &c, sizeof(*raw)); raw->magic = SFCI_MAGIC; raw->cmd_id = 1; - + Result rc = serviceIpcDispatch(&g_bpcSrv); - + if(R_SUCCEEDED(rc)) { IpcParsedCommand r; - ipcParse(&r); - struct { u64 magic; u64 result; - } *resp = r.Raw; + } *resp; + + serviceIpcParse(&g_bpcSrv, &r, sizeof(*resp)); + resp = r.Raw; rc = resp->result; } - + return rc; } + +Result bpcGetSleepButtonState(BpcSleepButtonState *out) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = serviceIpcPrepareHeader(&g_bpcSrv, &c, sizeof(*raw)); + raw->magic = SFCI_MAGIC; + raw->cmd_id = 6; + + Result rc = serviceIpcDispatch(&g_bpcSrv); + + if(R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + u8 state; + } *resp; + + serviceIpcParse(&g_bpcSrv, &r, sizeof(*resp)); + resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + *out = (BpcSleepButtonState)resp->state; + } + } + + return rc; +} \ No newline at end of file