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,