--- libLumina/LuminaOS-FreeBSD.cpp.orig 2021-12-26 02:33:45 UTC +++ libLumina/LuminaOS-FreeBSD.cpp @@ -9,6 +9,7 @@ #include <unistd.h> #include <sys/types.h> #include <sys/sysctl.h> +#include <dev/acpica/acpiio.h> #include <QDebug> //can't read xbrightness settings - assume invalid until set @@ -289,31 +290,53 @@ void LOS::systemSuspend(){ } //Battery Availability +// apm command is not available on powerpc or arm bool LOS::hasBattery(){ static int hasbat = -1; + int life; + size_t len = sizeof(life); if(hasbat < 0 ){ - int val = batteryCharge(); - if(val >= 0 && val <= 100){ hasbat = 1; } - else{ hasbat = 0; } + if ( sysctlbyname("hw.acpi.battery.life", &life, &len, NULL, 0) == 0 ) + hasbat = 1; + else + hasbat = 0; } return (hasbat==1); } //Battery Charge Level +// apm command is not available on powerpc or arm int LOS::batteryCharge(){ //Returns: percent charge (0-100), anything outside that range is counted as an error - int charge = LUtils::getCmdOutput("apm -l").join("").toInt(); - if(charge > 100){ charge = -1; } //invalid charge - return charge; + int life; // sysctl name + size_t len = sizeof(life); + if ( (sysctlbyname("hw.acpi.battery.life", &life, &len, NULL, 0) != 0) || + (life > 100) ) + life = -1; //invalid charge + return life; } //Battery Charging State +// apm command is not available on powerpc or arm bool LOS::batteryIsCharging(){ - return (LUtils::getCmdOutput("apm -a").join("").simplified() == "1"); + int state; + size_t len = sizeof(state); + if ( (sysctlbyname("hw.acpi.battery.state", &state, &len, NULL, 0) == 0) && + (state == ACPI_BATT_STAT_CHARGING) ) + return true; + else + return false; } //Battery Time Remaining +// apm command is not available on powerpc or arm int LOS::batterySecondsLeft(){ //Returns: estimated number of seconds remaining - return LUtils::getCmdOutput("apm -t").join("").toInt(); + int min; + size_t len = sizeof(min); + if ( LOS::batteryIsCharging() || + (sysctlbyname("hw.acpi.battery.time", &min, &len, NULL, 0) != 0) ) + return -1; + else + return min * 60; } //File Checksums