xmtop/widgets/cpu.go
2018-04-12 20:28:42 -07:00

76 lines
1.7 KiB
Go

package widgets
import (
"fmt"
"strconv"
"time"
"github.com/cjbassi/gotop/utils"
ui "github.com/cjbassi/termui"
psCPU "github.com/shirou/gopsutil/cpu"
)
type CPU struct {
*ui.LineGraph
Count int // number of cores
interval time.Duration
}
func NewCPU(interval time.Duration, zoom int) *CPU {
count, _ := psCPU.Counts(false)
self := &CPU{
LineGraph: ui.NewLineGraph(),
Count: count,
interval: interval,
}
self.Label = "CPU Usage"
self.Zoom = zoom
if self.Count <= 8 {
for i := 0; i < self.Count; i++ {
key := "CPU" + strconv.Itoa(i)
self.Data[key] = []float64{0}
}
} else {
self.Data["Average"] = []float64{0}
}
// update asynchronously because of 1 second blocking period
go self.update()
ticker := time.NewTicker(self.interval)
go func() {
for range ticker.C {
self.update()
}
}()
return self
}
// calculates the CPU usage over a 1 second interval and blocks for the duration
func (self *CPU) update() {
// show average cpu usage if more than 8 cores
if self.Count <= 8 {
percents, _ := psCPU.Percent(self.interval, true)
if len(percents) != self.Count {
count, _ := psCPU.Counts(false)
utils.Error("CPU percentages",
fmt.Sprint(
"self.Count: ", self.Count, "\n",
"gopsutil.Counts(): ", count, "\n",
"len(percents): ", len(percents), "\n",
"percents: ", percents, "\n",
"self.interval: ", self.interval,
))
}
for i := 0; i < self.Count; i++ {
key := "CPU" + strconv.Itoa(i)
percent := percents[i]
self.Data[key] = append(self.Data[key], percent)
}
} else {
percent, _ := psCPU.Percent(self.interval, false)
self.Data["Average"] = append(self.Data["Average"], percent[0])
}
}