ultimatepp/bazaar/SysInfo/Battery.cpp
koldo 36dcb65a30 SysInfo: Solved CLANG warnings in Linux
git-svn-id: svn://ultimatepp.org/upp/trunk@14587 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2020-06-13 13:16:52 +00:00

176 lines
No EOL
4.8 KiB
C++

#include "SysInfo_in.h"
namespace Upp {
#ifdef PLATFORM_POSIX
bool GetBatteryStatus(bool &discharging, int &percentage, int &remainingMin)
{
/* This is only if acpi package is present
StringParse data = Sys("acpi -V");
data.GoAfter("AC Adapter", ":");
String sacStatus = data.GetText();
discharging = sacStatus != "on-line";
data.GoInit();
data.GoAfter("Battery", ":");
data.GoAfter(",");
percentage = data.GetInt("%");
data.GoAfter(",");
String remaining;
if (discharging) {
remaining = data.GetText(" ");
int hour, min;
double secs;
StringToHMS(remaining, hour, min, secs); // It is really days:hour:min in this case
remainingMin = int(secs) + min*60 + hour*24*60;
} else
remainingMin = Null;
*/
percentage = 100;
Vector<String> files = SearchFile("/proc/acpi/battery", "state");
if (files.GetCount() == 0)
return false;
StringParse state = LoadFile_Safe(files[0]);
if (state == "")
return false;
bool present;
if(!state.GoAfter_Init("present", ":"))
return false;
present = state.GetText() == "yes";
if (!present)
return false; // No battery inserted
state.GoAfter_Init("charging state", ":"); discharging = state.GetText() == "discharging";
int presentRate, remainingCapacity;
state.GoAfter_Init("present rate", ":"); presentRate = state.GetInt();
state.GoAfter_Init("remaining capacity", ":"); remainingCapacity = state.GetInt();
if (presentRate == 0 || !discharging)
remainingMin = Null;
else
remainingMin = (int)((60.*remainingCapacity)/presentRate);
//int designCapacity,lastFullCapacity;
//String vendor, type, model, serial;
//if (!GetBatteryInfo(present/*, designCapacity, lastFullCapacity, vendor, type, model, serial*/))
//percentage = (int)((100.*remainingCapacity)/lastFullCapacity);
return true;
}
bool GetBatteryInfo(bool &present/*, int &designCapacity, int &lastFullCapacity, String &vendor, String &type, String &model, String &serial*/)
{
Vector<String> files = SearchFile("/proc/acpi/battery", "info");
if (files.GetCount() == 0)
return false;
StringParse info = LoadFile_Safe(files[0]);
if (info == "")
return false;
info.GoAfter_Init("present", ":"); present = info.GetText() == "yes";
/*
info.GoAfter_Init("design capacity", ":"); designCapacity = info.GetInt();
info.GoAfter_Init("last full capacity", ":");lastFullCapacity = info.GetInt();
info.GoAfter_Init("OEM info", ":"); vendor = info.GetText();
info.GoAfter_Init("battery type", ":"); type = info.GetText();
info.GoAfter_Init("model number", ":"); model = info.GetText();
info.GoAfter_Init("serial number", ":"); serial = info.GetText();
*/
return true;
}
bool OpenCDTray(String drive)
{
String dummy;
return Sys("eject", dummy) > 0;
}
bool CloseCDTray(String drive)
{
String dummy;
return Sys("eject -t", dummy) > 0;
}
#endif
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
bool GetBatteryStatus(bool &discharging, int &percentage, int &remainingMin)
{
SYSTEM_POWER_STATUS power;
if(::GetSystemPowerStatus(&power) != 1)
return false;
if (power.ACLineStatus == 1)
discharging = false;
else
discharging = true;
if (power.BatteryLifePercent <= 100)
percentage = power.BatteryLifePercent;
else
percentage = Null;
if (discharging && (int(power.BatteryLifeTime) != -1))
remainingMin = int(power.BatteryLifeTime/60);
else
remainingMin = Null;
return true;
}
bool GetBatteryInfo(bool &present/*, int &designCapacity, int &lastFullCapacity, String &vendor, String &type, String &model, String &serial*/)
{
SYSTEM_POWER_STATUS power;
if(::GetSystemPowerStatus(&power) == 0)
return false;
if (power.BatteryFlag == 128)
return false; // No battery
//designCapacity = (int)(power.BatteryFullLifeTime/60.);
present = true;
//power.ACLineStatus == 0;
//lastFullCapacity = 0;
//vendor = type = model = serial = "UNKNOWN";
return true;
}
bool DriveOpenClose(String drive, bool open)
{
int operation;
if (open)
operation = IOCTL_STORAGE_EJECT_MEDIA;
else
operation = IOCTL_STORAGE_LOAD_MEDIA;
if (drive.IsEmpty())
return false;
else if (drive.GetCount() == 1)
drive += ":";
else {
drive = drive.Left(2);
if (drive[1] != ':')
return false;
}
HANDLE hDrive;
hDrive = CreateFile("\\\\.\\" + drive, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hDrive == INVALID_HANDLE_VALUE)
return false;
bool ret = false;
DWORD dummyBytesReturned;
if (DeviceIoControl(hDrive, operation, 0, 0, 0, 0, &dummyBytesReturned, 0))
ret = true;
CloseHandle(hDrive);
return ret;
}
bool OpenCDTray(String drive)
{
return DriveOpenClose(drive, true);
}
bool CloseCDTray(String drive)
{
return DriveOpenClose(drive, false);
}
#endif
}