Remove code repetition in `UI.UpdateNetstats`

This commit is contained in:
Pedro Pombeiro 2018-01-29 16:30:21 +01:00
parent 397f6a4cb3
commit b10243a3c4
No known key found for this signature in database
GPG Key ID: A65DEB11E4BBC647
3 changed files with 43 additions and 42 deletions

View File

@ -5,10 +5,10 @@ package main
// of size N, for any amount of writes, only the last N values
// are retained.
type CircularBuffer struct {
data []float64
size int64
writeCursor int64
written int64
data []float64
size int64
writeCursor int64
writeOpCount int64
}
// NewCircularBuffer creates a new buffer of a given size
@ -28,7 +28,7 @@ func NewCircularBuffer(size int64) *CircularBuffer {
func (b *CircularBuffer) Add(value float64) error {
b.data[b.writeCursor] = value
b.writeCursor = ((b.writeCursor + 1) % b.size)
b.written++
b.writeOpCount++
return nil
}
@ -37,19 +37,19 @@ func (b *CircularBuffer) Size() int64 {
return b.size
}
// TotalWritten provides the total number of values written
func (b *CircularBuffer) TotalWritten() int64 {
return b.written
// TotalWriteOpCount provides the total number of values written
func (b *CircularBuffer) TotalWriteOpCount() int64 {
return b.writeOpCount
}
// Data returns ordered data from buffer, from old to new.
func (b *CircularBuffer) Data() []float64 {
switch {
case b.written >= b.size && b.writeCursor == 0:
case b.writeOpCount >= b.size && b.writeCursor == 0:
out := make([]float64, b.size)
copy(out, b.data)
return out
case b.written > b.size:
case b.writeOpCount > b.size:
out := make([]float64, b.size)
copy(out, b.data[b.writeCursor:])
copy(out[b.size-b.writeCursor:], b.data[:b.writeCursor])
@ -64,5 +64,5 @@ func (b *CircularBuffer) Data() []float64 {
// Reset resets the buffer so it has no content.
func (b *CircularBuffer) Reset() {
b.writeCursor = 0
b.written = 0
b.writeOpCount = 0
}

View File

@ -1,5 +1,6 @@
package main
// Local is a dummy implementation of the Source interface.
type Local struct {
}

62
ui.go
View File

@ -10,11 +10,12 @@ import (
const headerHeight = 3
const (
cpuSparklineIndex = 0
usedMemSparklineIndex = 1
rxSparklineIndex = 0
txSparklineIndex = 1
cpuSparklineIndex = iota
usedMemSparklineIndex
)
const (
rxSparklineIndex = iota
txSparklineIndex
)
// UI represents UI layout.
@ -103,40 +104,39 @@ func (ui *UI) UpdateMemoryStats(data []float64) {
}
// UpdateNetstats updates Netstats widget with new values from data.
func (ui *UI) UpdateNetstats(dataRx, dataTx []float64) {
intData := make([]int, len(dataRx))
func (ui *UI) UpdateNetstats(rxData, txData []float64) {
ui.updateNetstats(rxSparklineIndex, rxData)
ui.updateNetstats(txSparklineIndex, txData)
}
for i := 0; i < len(dataRx)-1; i++ {
intData[i] = int(dataRx[i+1] - dataRx[i])
func (ui *UI) updateNetstats(sparklineIndex int, data []float64) {
intData := make([]int, len(data))
for i := 0; i < len(data)-1; i++ {
intData[i] = int(data[i+1] - data[i])
}
last := len(dataRx) - 1
last := len(data) - 1
if last > 1 {
currentTotal := dataRx[last]
currentRx := dataRx[last] - dataRx[last-1]
if currentRx > ui.maxRx {
ui.maxRx = currentRx
var direction string
var max *float64
switch sparklineIndex {
case rxSparklineIndex:
max = &ui.maxRx
direction = "Rx"
case txSparklineIndex:
max = &ui.maxTx
direction = "Tx"
}
line := &ui.SparklinesRight.Lines[rxSparklineIndex]
line.Data = intData
line.Title = fmt.Sprintf("Network Rx: %v/s, Max: %v/s (total: %v)", memSize(currentRx), memSize(ui.maxRx), memSize(currentTotal))
}
intData = make([]int, len(dataTx))
for i := 0; i < len(dataTx)-1; i++ {
intData[i] = int(dataTx[i+1] - dataTx[i])
}
last = len(dataTx) - 1
if last > 1 {
currentTotal := dataTx[last]
currentTx := dataTx[last] - dataTx[last-1]
if currentTx > ui.maxTx {
ui.maxTx = currentTx
total := data[last]
current := total - data[last-1]
if current > *max {
*max = current
}
line := &ui.SparklinesRight.Lines[txSparklineIndex]
line := &ui.SparklinesRight.Lines[sparklineIndex]
line.Data = intData
line.Title = fmt.Sprintf("Network Tx: %v/s, Max: %v/s (total: %v)", memSize(currentTx), memSize(ui.maxTx), memSize(currentTotal))
line.Title = fmt.Sprintf("Network %s: %v/s, Max: %v/s (total: %v)", direction, memSize(current), memSize(*max), memSize(total))
}
}