80 lines
1.5 KiB
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
|
|
}
|