summaryrefslogtreecommitdiffstats
path: root/widgets/batterygauge.go
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/batterygauge.go')
-rw-r--r--widgets/batterygauge.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/widgets/batterygauge.go b/widgets/batterygauge.go
new file mode 100644
index 0000000..59accfb
--- /dev/null
+++ b/widgets/batterygauge.go
@@ -0,0 +1,86 @@
+package widgets
+
+import (
+ "fmt"
+ "log"
+
+ "time"
+
+ "github.com/distatus/battery"
+ "github.com/prometheus/client_golang/prometheus"
+
+ . "github.com/xxxserxxx/gotop/termui"
+)
+
+type BatteryGauge struct {
+ *Gauge
+ metric prometheus.Gauge
+}
+
+func NewBatteryGauge() *BatteryGauge {
+ self := &BatteryGauge{Gauge: NewGauge()}
+ self.Title = " Power Level "
+
+ self.update()
+
+ go func() {
+ for range time.NewTicker(time.Second).C {
+ self.Lock()
+ self.update()
+ self.Unlock()
+ }
+ }()
+
+ return self
+}
+
+func (b *BatteryGauge) EnableMetric() {
+ bats, err := battery.GetAll()
+ if err != nil {
+ log.Printf("error setting up metrics: %v", err)
+ return
+ }
+ mx := 0.0
+ cu := 0.0
+ for _, bat := range bats {
+ mx += bat.Full
+ cu += bat.Current
+ gauge := prometheus.NewGauge(prometheus.GaugeOpts{
+ Namespace: "gotop",
+ Subsystem: "battery",
+ Name: "total",
+ })
+ gauge.Set(cu / mx)
+ b.metric = gauge
+ prometheus.MustRegister(gauge)
+ }
+}
+
+func (self *BatteryGauge) update() {
+ bats, err := battery.GetAll()
+ if err != nil {
+ log.Printf("error setting up batteries: %v", err)
+ return
+ }
+ mx := 0.0
+ cu := 0.0
+ charging := "%d%% ⚡%s"
+ rate := 0.0
+ for _, bat := range bats {
+ mx += bat.Full
+ cu += bat.Current
+ if rate < bat.ChargeRate {
+ rate = bat.ChargeRate
+ }
+ if bat.State == battery.Charging {
+ charging = "%d%% 🔌%s"
+ }
+ }
+ tn := (mx - cu) / rate
+ d, _ := time.ParseDuration(fmt.Sprintf("%fh", tn))
+ self.Percent = int((cu / mx) * 100.0)
+ self.Label = fmt.Sprintf(charging, self.Percent, d.Truncate(time.Minute))
+ if self.metric != nil {
+ self.metric.Set(cu / mx)
+ }
+}