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) } }() }