package status // import "hhvn.uk/hbspbar/status" import ( "os" "path" "errors" "strings" "image/color" // "hhvn.uk/hbspbar/drw" "hhvn.uk/hbspbar/config" "hhvn.uk/hbspbar/common" ) func bat(name string) error { dir := "/sys/class/power_supply" const ( nothing = iota charging discharging ) u := newUpdate(name) dirs, err := os.ReadDir(dir) if dirs == nil { return err } totalcap := 0 usedcap := 0 stati := nothing for _, d := range dirs { if !strings.HasPrefix(d.Name(), "BAT") { continue } caps, err := common.FileAsLines(path.Join(dir, d.Name(), "capacity")) if err != nil { return err } capi, err := common.Intify(caps[0]) if err != nil { return err } totalcap += 100 usedcap += capi stats, err := common.FileAsLines(path.Join(dir, d.Name(), "status")) if err != nil { return err } // Doesn't deal with 1 battery charging, and another discharging but w/e switch stats[0] { case "Charging": if charging > stati { stati = charging } case "Discharging": if discharging > stati { stati = discharging} } } if totalcap == 0 { return errors.New("no batteries") } avgcap := (usedcap * 100) / totalcap var c color.Color // Colour of outline = charge indicator switch stati { case nothing: c = config.Fg case charging: c = config.Green case discharging: c = config.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 = config.Red case avgcap >= 99: c = config.Green default: c = config.FgDark } // Fill u.drawRect(4 + iw - w, 4, w + 1, ih, c, true) updates <- u sleep(1) return nil } func init() { register("bat", bat) }