1package resourceusage
2
3import (
4	"fmt"
5	"math"
6	"time"
7
8	"code.cloudfoundry.org/bytefmt"
9	"github.com/rivo/tview"
10	"github.com/shirou/gopsutil/cpu"
11	"github.com/shirou/gopsutil/mem"
12	"github.com/wtfutil/wtf/view"
13)
14
15var started = false
16var ok = true
17
18// Widget define wtf widget to register widget later
19type Widget struct {
20	view.BarGraph
21
22	app      *tview.Application
23	settings *Settings
24}
25
26// NewWidget Make new instance of widget
27func NewWidget(app *tview.Application, settings *Settings) *Widget {
28	widget := Widget{
29		BarGraph: view.NewBarGraph(app, settings.common.Name, settings.common, false),
30
31		app:      app,
32		settings: settings,
33	}
34
35	widget.View.SetWrap(false)
36	widget.View.SetWordWrap(false)
37
38	return &widget
39}
40
41/* -------------------- Exported Functions -------------------- */
42
43// MakeGraph - Load the dead drop stats
44func MakeGraph(widget *Widget) {
45	cpuStats, err := cpu.Percent(time.Duration(0), true)
46	if err != nil {
47		return
48	}
49
50	var stats = make([]view.Bar, len(cpuStats)+2)
51
52	for i, stat := range cpuStats {
53		// Stats sometimes jump outside the 0-100 range, possibly due to timing
54		stat = math.Min(100, stat)
55		stat = math.Max(0, stat)
56
57		bar := view.Bar{
58			Label:      fmt.Sprint(i),
59			Percent:    int(stat),
60			ValueLabel: fmt.Sprintf("%d%%", int(stat)),
61		}
62
63		stats[i] = bar
64	}
65
66	memInfo, err := mem.VirtualMemory()
67	if err != nil {
68		return
69	}
70
71	memIndex := len(cpuStats)
72
73	usedMemLabel := bytefmt.ByteSize(memInfo.Used)
74	totalMemLabel := bytefmt.ByteSize(memInfo.Total)
75
76	if usedMemLabel[len(usedMemLabel)-1] == totalMemLabel[len(totalMemLabel)-1] {
77		usedMemLabel = usedMemLabel[:len(usedMemLabel)-1]
78	}
79
80	stats[memIndex] = view.Bar{
81		Label:      "Mem",
82		Percent:    int(memInfo.UsedPercent),
83		ValueLabel: fmt.Sprintf("%s/%s", usedMemLabel, totalMemLabel),
84	}
85
86	swapIndex := len(cpuStats) + 1
87	swapUsed := memInfo.SwapTotal - memInfo.SwapFree
88	var swapPercent float64
89	if memInfo.SwapTotal > 0 {
90		swapPercent = float64(swapUsed) / float64(memInfo.SwapTotal)
91	}
92
93	usedSwapLabel := bytefmt.ByteSize(swapUsed)
94	totalSwapLabel := bytefmt.ByteSize(memInfo.SwapTotal)
95
96	if usedSwapLabel[len(usedSwapLabel)-1] == totalMemLabel[len(totalSwapLabel)-1] {
97		usedSwapLabel = usedSwapLabel[:len(usedSwapLabel)-1]
98	}
99
100	stats[swapIndex] = view.Bar{
101		Label:      "Swp",
102		Percent:    int(swapPercent * 100),
103		ValueLabel: fmt.Sprintf("%s/%s", usedSwapLabel, totalSwapLabel),
104	}
105
106	widget.BarGraph.BuildBars(stats[:])
107
108}
109
110// Refresh & update after interval time
111func (widget *Widget) Refresh() {
112
113	if widget.Disabled() {
114		return
115	}
116
117	widget.View.Clear()
118
119	widget.app.QueueUpdateDraw(func() {
120		display(widget)
121	})
122}
123
124/* -------------------- Unexported Functions -------------------- */
125
126func display(widget *Widget) {
127	MakeGraph(widget)
128}
129