Adds a battery gauge.
This commit is contained in:
parent
6c9e51470e
commit
8ee5950308
|
@ -13,7 +13,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
> - **Fixed**: for any bug fixes.
|
> - **Fixed**: for any bug fixes.
|
||||||
> - **Security**: in case of vulnerabilities.
|
> - **Security**: in case of vulnerabilities.
|
||||||
|
|
||||||
## [3.3.0] -
|
## [3.x.x] -
|
||||||
|
|
||||||
|
- Adds a battery gauge as `power`
|
||||||
|
|
||||||
|
## [3.3.0] - 2020-02-17
|
||||||
|
|
||||||
- Added: Logs are now rotated. Settings are currently hard-coded at 4 files of 5MB
|
- Added: Logs are now rotated. Settings are currently hard-coded at 4 files of 5MB
|
||||||
each, so logs shouldn't take up more than 20MB. I'm going to see how many
|
each, so logs shouldn't take up more than 20MB. I'm going to see how many
|
||||||
|
|
|
@ -94,7 +94,7 @@ and these are separated by spaces.
|
||||||
1. Each line is a row
|
1. Each line is a row
|
||||||
2. Empty lines are skipped
|
2. Empty lines are skipped
|
||||||
3. Spaces are compressed (so you can do limited visual formatting)
|
3. Spaces are compressed (so you can do limited visual formatting)
|
||||||
4. Legal widget names are: cpu, disk, mem, temp, batt, net, procs
|
4. Legal widget names are: cpu, disk, mem, temp, batt, net, procs, power
|
||||||
5. Widget names are not case sensitive
|
5. Widget names are not case sensitive
|
||||||
4. The simplest row is a single widget, by name, e.g.
|
4. The simplest row is a single widget, by name, e.g.
|
||||||
```
|
```
|
||||||
|
|
|
@ -170,6 +170,10 @@ func makeWidget(c gotop.Config, widRule widgetRule) interface{} {
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
w = b
|
w = b
|
||||||
|
case "power":
|
||||||
|
b := widgets.NewBatteryGauge()
|
||||||
|
b.BarColor = ui.Color(c.Colorscheme.ProcCursor)
|
||||||
|
w = b
|
||||||
default:
|
default:
|
||||||
log.Printf("Invalid widget name %s. Must be one of %v", widRule.Widget, widgetNames)
|
log.Printf("Invalid widget name %s. Must be one of %v", widRule.Widget, widgetNames)
|
||||||
return ui.NewBlock()
|
return ui.NewBlock()
|
||||||
|
|
22
termui/gauge.go
Normal file
22
termui/gauge.go
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package termui
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "github.com/gizak/termui/v3"
|
||||||
|
gizak "github.com/gizak/termui/v3/widgets"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LineGraph implements a line graph of data points.
|
||||||
|
type Gauge struct {
|
||||||
|
*gizak.Gauge
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGauge() *Gauge {
|
||||||
|
return &Gauge{
|
||||||
|
Gauge: gizak.NewGauge(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *Gauge) Draw(buf *Buffer) {
|
||||||
|
self.Gauge.Draw(buf)
|
||||||
|
self.Gauge.SetRect(self.Min.X, self.Min.Y, self.Inner.Dx(), self.Inner.Dy())
|
||||||
|
}
|
77
widgets/batterygauge.go
Normal file
77
widgets/batterygauge.go
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
package widgets
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
//"math"
|
||||||
|
//"strconv"
|
||||||
|
"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 metrics: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mx := 0.0
|
||||||
|
cu := 0.0
|
||||||
|
for _, bat := range bats {
|
||||||
|
mx += bat.Full
|
||||||
|
cu += bat.Current
|
||||||
|
}
|
||||||
|
self.Percent = int((cu / mx) * 100.0)
|
||||||
|
self.Label = fmt.Sprintf("%d%%", self.Percent)
|
||||||
|
if self.metric != nil {
|
||||||
|
self.metric.Set(cu / mx)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user