rosalina: add extra battery info

- Battery percentage now has a resolution of 0.1%
- Battery temperature and battery voltage are now displayed
This commit is contained in:
TuxSH 2021-01-07 01:18:07 +00:00
parent 168647e0f8
commit f54c709f64

View File

@ -37,6 +37,7 @@
#include "minisoc.h" #include "minisoc.h"
bool isHidInitialized = false; bool isHidInitialized = false;
u32 mcuFwVersion = 0;
// libctru redefinition: // libctru redefinition:
@ -142,7 +143,59 @@ u32 waitCombo(void)
static MyThread menuThread; static MyThread menuThread;
static u8 ALIGN(8) menuThreadStack[0x1000]; static u8 ALIGN(8) menuThreadStack[0x1000];
static u8 batteryLevel = 255;
static float batteryPercentage;
static float batteryVoltage;
static u8 batteryTemperature;
static Result menuUpdateMcuInfo(void)
{
Result res = 0;
u8 data[4];
if (!isServiceUsable("mcu::HWC"))
return -1;
res = mcuHwcInit();
if (R_FAILED(res))
return res;
// Read mcu regs directly
for (u32 i = 0; i < 4; i++)
{
res = MCUHWC_ReadRegister(0xA + i, &data[i], 1);
if (R_FAILED(res))
break;
}
if (R_SUCCEEDED(res))
{
batteryTemperature = data[0];
// The battery percentage isn't very precise... its precision ranges from 0.09% to 0.14% approx
// Round to 0.1%
batteryPercentage = data[1] + data[2] / 256.0f;
batteryPercentage = (u32)((batteryPercentage + 0.05f) * 10.0f) / 10.0f;
// Round battery voltage to 0.01V
batteryVoltage = (5u * data[3]) / 256.0f;
batteryVoltage = (u32)((batteryVoltage + 0.005f) * 100.0f) / 100.0f;
}
// Read mcu fw version if not already done
if (mcuFwVersion == 0)
{
u8 minor = 0, major = 0;
MCUHWC_GetFwVerHigh(&major);
MCUHWC_GetFwVerLow(&minor);
// If it has failed, mcuFwVersion will be set to 0 again
mcuFwVersion = SYSTEM_VERSION(major - 0x10, minor, 0);
}
mcuHwcExit();
return res;
}
static inline u32 menuAdvanceCursor(u32 pos, u32 numItems, s32 displ) static inline u32 menuAdvanceCursor(u32 pos, u32 numItems, s32 displ)
{ {
@ -246,16 +299,8 @@ static void menuDraw(Menu *menu, u32 selected)
s64 out; s64 out;
u32 version, commitHash; u32 version, commitHash;
bool isRelease; bool isRelease;
bool isMcuHwcRegistered;
if(R_SUCCEEDED(srvIsServiceRegistered(&isMcuHwcRegistered, "mcu::HWC")) && isMcuHwcRegistered && R_SUCCEEDED(mcuHwcInit())) Result mcuInfoRes = menuUpdateMcuInfo();
{
if(R_FAILED(MCUHWC_GetBatteryLevel(&batteryLevel)))
batteryLevel = 255;
mcuHwcExit();
}
else
batteryLevel = 255;
svcGetSystemInfo(&out, 0x10000, 0); svcGetSystemInfo(&out, 0x10000, 0);
version = (u32)out; version = (u32)out;
@ -285,6 +330,10 @@ static void menuDraw(Menu *menu, u32 selected)
dispY += SPACING_Y; dispY += SPACING_Y;
} }
// Clear lines that are prone to change
Draw_DrawFormattedString(SCREEN_BOT_WIDTH - 10 - SPACING_X * 15, 10, COLOR_WHITE, "%15s", "");
Draw_DrawFormattedString(SCREEN_BOT_WIDTH - 10 - SPACING_X * 19, SCREEN_BOT_HEIGHT - 20, COLOR_WHITE, "%19s", "");
if(miniSocEnabled) if(miniSocEnabled)
{ {
char ipBuffer[17]; char ipBuffer[17];
@ -294,12 +343,21 @@ static void menuDraw(Menu *menu, u32 selected)
Draw_DrawString(SCREEN_BOT_WIDTH - 10 - SPACING_X * n, 10, COLOR_WHITE, ipBuffer); Draw_DrawString(SCREEN_BOT_WIDTH - 10 - SPACING_X * n, 10, COLOR_WHITE, ipBuffer);
} }
Draw_DrawFormattedString(SCREEN_BOT_WIDTH - 10 - 4 * SPACING_X, SCREEN_BOT_HEIGHT - 20, COLOR_WHITE, " "); if(R_SUCCEEDED(mcuInfoRes))
{
u32 voltageInt = (u32)batteryVoltage;
u32 voltageFrac = (u32)(batteryVoltage * 100.0f) % 100u;
u32 percentageInt = (u32)batteryPercentage;
u32 percentageFrac = (u32)(batteryPercentage * 10.0f) % 10u;
if(batteryLevel != 255) char buf[32];
Draw_DrawFormattedString(SCREEN_BOT_WIDTH - 10 - 4 * SPACING_X, SCREEN_BOT_HEIGHT - 20, COLOR_WHITE, "%02hhu%%", batteryLevel); int n = sprintf(
else buf, "%hhu\xF8""C %lu.%02luV %lu.%lu%%", batteryTemperature, // CP437
Draw_DrawString(SCREEN_BOT_WIDTH - 10 - 4 * SPACING_X, SCREEN_BOT_HEIGHT - 20, COLOR_WHITE, " "); voltageInt, voltageFrac,
percentageInt, percentageFrac
);
Draw_DrawString(SCREEN_BOT_WIDTH - 10 - SPACING_X * n, SCREEN_BOT_HEIGHT - 20, COLOR_WHITE, buf);
}
if(isRelease) if(isRelease)
Draw_DrawFormattedString(10, SCREEN_BOT_HEIGHT - 20, COLOR_TITLE, "Luma3DS %s", versionString); Draw_DrawFormattedString(10, SCREEN_BOT_HEIGHT - 20, COLOR_TITLE, "Luma3DS %s", versionString);