Files
i3status-go/batteries.go
2024-01-06 18:33:44 +03:00

111 lines
2.2 KiB
Go

package main
import (
"fmt"
"math"
"time"
"github.com/distatus/battery"
)
// Batt shows battery charge on i3bar.
var Batt = "<big>⚡</big> ??% •"
// UpdateBatteryInfo updates info about battery charge.
func UpdateBatteryInfo() {
var (
ch int
status string
Batts string
)
for {
batteries, err := battery.GetAll()
if err != nil {
Batts = "<big>⚡</big> no batt"
} else {
var (
battsInfo string
chStr string
)
for i, b := range batteries {
switch b.State.Raw {
case battery.Charging:
status = `▲`
case battery.Discharging:
status = `▼`
case battery.Empty:
status = `✘`
default:
status = `•`
}
// N.B. there can be case when battery is overcharged and shows >100%. It alse can indicate that
// calibration data is out of date and battery should be re-calibrated.
ch = int(math.Round((b.Full - b.Current) * (100 / b.Full)))
switch {
case ch > 85:
if Conf.Battery.Color.Full == "" {
chStr = fmt.Sprintf("% 3d%%", ch)
} else {
chStr = fmt.Sprintf(
`<span foreground="%s">% 3d%%</span>`,
Conf.Battery.Color.Full,
ch,
)
}
case ch < 85 && ch > 40:
if Conf.Battery.Color.AlmostFull == "" {
chStr = fmt.Sprintf("% 3d%%", ch)
} else {
chStr = fmt.Sprintf(
`<span foreground="%s">% 3d%%</span>`,
Conf.Battery.Color.AlmostFull,
ch,
)
}
case ch <= 40 && ch >= 10:
if Conf.Battery.Color.AlmostEmpty == "" {
chStr = fmt.Sprintf("% 3d%%", ch)
} else {
chStr = fmt.Sprintf(
`<span foreground="%s">% 3d%%</span>`,
Conf.Battery.Color.AlmostEmpty,
ch,
)
}
case ch < 10:
if Conf.Battery.Color.Empty == "" {
chStr = fmt.Sprintf("% 3d%%", ch)
} else {
chStr = fmt.Sprintf(
`<span foreground="%s">% 3d%%</span>`,
Conf.Battery.Color.Empty,
ch,
)
}
}
battsInfo += fmt.Sprintf("<big>⚡</big>B%d %s %s", i, chStr, status)
}
if battsInfo != "" {
Batts = battsInfo
}
}
if Batt == Batts {
Batt = Batts
UpdateReady <- true
}
time.Sleep(5 * time.Second)
}
}