diff options
Diffstat (limited to 'status/01-bat.go')
| -rw-r--r-- | status/01-bat.go | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/status/01-bat.go b/status/01-bat.go new file mode 100644 index 0000000..0deb805 --- /dev/null +++ b/status/01-bat.go @@ -0,0 +1,109 @@ +package status // import "hhvn.uk/hbspbar/status" + +import ( + "os" + "io" + "path" + "strings" + + // "hhvn.uk/hbspbar/drw" + "hhvn.uk/hbspbar/config" + "hhvn.uk/hbspbar/common" +) + +func read(file string) (string, error) { + f, err := os.Open(file) + if err != nil { return "", err } + + content, err := io.ReadAll(f) + if err != nil { return "", err } + + str := strings.TrimSuffix(string(content), "\n") + + return str, nil +} + +func init() { + name := "bat" + register(name) + + dir := "/sys/class/power_supply" + + const ( + nothing = iota + charging + discharging + ) + + go func(){ + for { + u := newUpdate(name) + + dirs, _ := os.ReadDir(dir) + if dirs == nil { return } + + totalcap := 0 + usedcap := 0 + + stati := nothing + + for _, d := range dirs { + if !strings.HasPrefix(d.Name(), "BAT") { continue } + + caps, err := read(path.Join(dir, d.Name(), "capacity")) + if err != nil { return } + + capi, err := common.Intify(caps) + if err != nil { return } + + totalcap += 100 + usedcap += capi + + stats, err := read(path.Join(dir, d.Name(), "status")) + if err != nil { return } + + // Doesn't deal with 1 battery charging, and another discharging but w/e + switch stats { + case "Charging": if charging > stati { stati = charging } + case "Discharging": if discharging > stati { stati = discharging} + } + } + + if totalcap == 0 { return } + + avgcap := (usedcap * 100) / totalcap + + var c uint32 + + // Colour of outline = charge indicator + switch stati { + case nothing: c = config.Fg + case charging: c = Green + case discharging: c = Red + } + + var iw int = 20 + var ih int = int(config.H) - 8 + var w int = iw * avgcap / 100 + + // Draw nose + u.drawRect(2, int((config.H - 5) / 2), 2, 5, c, true) + + // Draw border + u.drawRect(4, 3, iw + 2, ih + 2, c, false) + + switch { + case avgcap < 25: c = Red + case avgcap >= 99: c = Green + default: c = config.FgDark + } + + // Fill + u.drawRect(4 + iw - w, 4, w + 1, ih, c, true) + + updates <- u + sleep(1) + } + + }() +} |