diff --git a/battery.go b/battery.go index 47edece..27e9942 100644 --- a/battery.go +++ b/battery.go @@ -1,6 +1,8 @@ package dryvers -import "os" +import ( + "github.com/distatus/battery" +) type Battery struct{} @@ -15,15 +17,36 @@ func (b *Battery) IsLow() (bool, error) { return v < 0.1, nil } -func pickChargeOrEnergy() (string, string) { - _, err := os.Stat("/sys/class/power_supply/BAT0/charge_now") +// NewBattery creates a new instance of the batter driver. +func NewBattery() *Battery { + return &Battery{} +} + +func (b *Battery) PluggedIn() (bool, error) { + batteries, err := battery.GetAll() if err != nil { - return "/sys/class/power_supply/BAT0/energy_now", "/sys/class/power_supply/BAT0/energy_full" + return true, err // assume power if no battery info + } + for _, battery := range batteries { + // if any battery is discharging, we are not plugged in + if (battery.State.String() == "Discharging") { + return false, nil + } } - return "/sys/class/power_supply/BAT0/charge_now", "/sys/class/power_supply/BAT0/charge_full" + return true, nil } -// NewBattery creates a new instance of the batter driver. -func NewBattery() *Battery { - return &Battery{} +// Get returns the current battery level (between 0 and 1) or +// an error if there was a problem. +func (b *Battery) Get() (float64, error) { + batteries, err := battery.GetAll() + var ctotal, ftotal float64 + if err != nil { + return 0, nil + } + for _, battery := range batteries { + ctotal += battery.Current + ftotal += battery.Full + } + return ctotal / ftotal, nil } diff --git a/battery_bsd.go b/battery_bsd.go deleted file mode 100644 index 1bc9e97..0000000 --- a/battery_bsd.go +++ /dev/null @@ -1,31 +0,0 @@ -//go:build openbsd || freebsd || netbsd -// +build openbsd freebsd netbsd - -package dryvers - -import "syscall" - -func (b *battery) PluggedIn() (bool, error) { - val, err := syscall.Sysctl("hw.acpi.acline") - if err != nil { - return true, err - } - - return val[0] == 1, nil -} - -// Get returns the current battery level (between 0 and 1) or -// an error if there was a problem. -func (b *battery) Get() (float64, error) { - val, err := syscall.Sysctl("hw.acpi.battery.life") - if err != nil { - return 0, err - } - - percent := int(val[0]) - if percent == 0 { // avoid 0/100 below - return 0, nil - } - - return float64(percent) / 100, nil -} diff --git a/battery_other.go b/battery_other.go deleted file mode 100644 index 2c43a26..0000000 --- a/battery_other.go +++ /dev/null @@ -1,41 +0,0 @@ -//go:build !openbsd && !freebsd && !netbsd -// +build !openbsd,!freebsd,!netbsd - -package dryvers - -import ( - "os" - "strconv" - "strings" -) - -func (b *Battery) PluggedIn() (bool, error) { - status, err := os.ReadFile("/sys/class/power_supply/BAT0/status") - if err != nil { - return true, err // assume power if no battery info - } - - return strings.ToLower(strings.TrimSpace(string(status))) != "discharging", nil -} - -// Get returns the current battery level (between 0 and 1) or -// an error if there was a problem. -func (b *Battery) Get() (float64, error) { - nowFile, fullFile := pickChargeOrEnergy() - fullStr, err1 := os.ReadFile(fullFile) - if os.IsNotExist(err1) { - return 0, err1 // return quietly if the file was not present (desktop?) - } - nowStr, err2 := os.ReadFile(nowFile) - if err1 != nil || err2 != nil { - return 0, err1 - } - - now, err1 := strconv.Atoi(strings.TrimSpace(string(nowStr))) - full, err2 := strconv.Atoi(strings.TrimSpace(string(fullStr))) - if err1 != nil || err2 != nil { - return 0, err1 - } - - return float64(now) / float64(full), nil -} diff --git a/go.mod b/go.mod index 602d961..d100073 100644 --- a/go.mod +++ b/go.mod @@ -2,13 +2,18 @@ module github.com/FyshOS/dryvers go 1.19 -require github.com/stretchr/testify v1.11.1 +require ( + github.com/distatus/battery v0.11.0 + github.com/stretchr/testify v1.11.1 +) require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/kr/text v0.2.0 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/sys v0.9.0 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + howett.net/plist v1.0.0 // indirect ) diff --git a/go.sum b/go.sum index 7bf8d34..b6b2c07 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,9 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/distatus/battery v0.11.0 h1:KJk89gz90Iq/wJtbjjM9yUzBXV+ASV/EG2WOOL7N8lc= +github.com/distatus/battery v0.11.0/go.mod h1:KmVkE8A8hpIX4T78QRdMktYpEp35QfOL8A8dwZBxq2k= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -11,8 +14,13 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= +howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=