Files
Nomi/battery.go

80 lines
1.5 KiB
Go

package main
import (
"fmt"
"os"
"strconv"
"strings"
"time"
"github.com/mattn/go-gtk/glib"
)
func initBattery(a *App) {
base := "/sys/class/power_supply"
entries, err := os.ReadDir(base)
if err != nil {
fmt.Println("battery init:", err)
return
}
var folder string
for _, e := range entries {
if strings.Contains(strings.ToLower(e.Name()), "bat") {
folder = e.Name()
break
}
}
if folder == "" {
fmt.Println("no battery folder found")
return
}
rootPath := base + "/" + folder
info, err := readBattery(rootPath)
if err != nil {
fmt.Println("read battery:", err)
return
}
a.battery = info
a.updateBatteryLabel(info)
go func() {
last := info
for {
cur, err := readBattery(rootPath)
if err == nil &&
(cur.Percent != last.Percent || cur.Charging != last.Charging) {
last = cur
a.battery = cur
glib.IdleAdd(func() {
a.updateBatteryLabel(cur)
})
}
time.Sleep(30 * time.Second)
}
}()
}
func readBattery(rootPath string) (BatteryInfo, error) {
val, err := os.ReadFile(rootPath + "/capacity")
if err != nil {
return BatteryInfo{}, err
}
status, err := os.ReadFile(rootPath + "/status")
if err != nil {
return BatteryInfo{}, err
}
p, err := strconv.Atoi(strings.TrimSpace(string(val)))
if err != nil {
return BatteryInfo{}, err
}
s := strings.ToLower(strings.TrimSpace(string(status)))
charging := !strings.Contains(s, "dis")
return BatteryInfo{Percent: p, Charging: charging, Path: rootPath}, nil
}