From 695cccf66ec7140a4e08a0584d4422002738b9c2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 26 Sep 2020 22:37:59 -0700 Subject: [PATCH] psm: Add more battery functions --- nx/include/switch/services/psm.h | 3 +++ nx/source/services/psm.c | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/nx/include/switch/services/psm.h b/nx/include/switch/services/psm.h index d5607514..fb1c3d7f 100644 --- a/nx/include/switch/services/psm.h +++ b/nx/include/switch/services/psm.h @@ -40,6 +40,9 @@ Service* psmGetServiceSession(void); Result psmGetBatteryChargePercentage(u32 *out); Result psmGetChargerType(ChargerType *out); Result psmGetBatteryVoltageState(PsmBatteryVoltageState *out); +Result psmGetRawBatteryChargePercentage(double *out); +Result psmIsEnoughPowerSupplied(bool *out); +Result psmGetBatteryAgePercentage(double *out); /** * @brief Wrapper func which opens a PsmSession and handles event setup. diff --git a/nx/source/services/psm.c b/nx/source/services/psm.c index ca593634..2ba01eff 100644 --- a/nx/source/services/psm.c +++ b/nx/source/services/psm.c @@ -50,10 +50,23 @@ static Result _psmCmdInBoolNoOut(Service* srv, bool inval, u32 cmd_id) { return _psmCmdInU8NoOut(srv, inval!=0, cmd_id); } +static Result _psmCmdNoInOutBool(Service* srv, bool *out, u32 cmd_id) { + u8 outval = 0; + Result rc = serviceDispatchOut(srv, cmd_id, outval); + if (R_SUCCEEDED(rc)) { + if (out) *out = outval & 1; + } + return rc; +} + static Result _psmCmdNoInOutU32(Service* srv, u32 *out, u32 cmd_id) { return serviceDispatchOut(srv, cmd_id, *out); } +static Result _psmCmdNoInOutDouble(Service* srv, double *out, u32 cmd_id) { + return serviceDispatchOut(srv, cmd_id, *out); +} + Result psmGetBatteryChargePercentage(u32 *out) { return _psmCmdNoInOutU32(&g_psmSrv, out, 0); } @@ -69,6 +82,18 @@ Result psmGetBatteryVoltageState(PsmBatteryVoltageState *out) { return rc; } +Result psmGetRawBatteryChargePercentage(double *out) { + return _psmCmdNoInOutDouble(&g_psmSrv, out, 13); +} + +Result psmIsEnoughPowerSupplied(bool *out) { + return _psmCmdNoInOutBool(&g_psmSrv, out, 14); +} + +Result psmGetBatteryAgePercentage(double *out) { + return _psmCmdNoInOutDouble(&g_psmSrv, out, 15); +} + static Result _psmOpenSession(Service* srv_out) { return serviceDispatch(&g_psmSrv, 7, .out_num_objects = 1,