Small CLI monitoring tool to decode proprietary [...] protocol and display info in human readable representation
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ycli-mon/ui/ui.go

139 lines
2.5 KiB

package ui
import (
"cli-mon/yabl"
"fmt"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
"reflect"
)
const (
connectors_page = "Connectors"
)
type page struct {
left string
right string
primitive tview.Primitive
}
type UI interface {
Consume(event *yabl.Event)
Start()
Stop()
}
type gui struct {
app *tview.Application
pages *tview.Pages
connPage *cTable
page2 tview.Primitive
}
type log struct {
}
func (g *gui) Consume(event *yabl.Event) {
switch obj := event.Object.(type) {
case *yabl.PuPresentEnergy:
g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value)
case *yabl.PuPeriphery:
g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value)
case *yabl.PuDebug:
g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value)
case *yabl.PuErrors:
g.connPage.updatePuErrors(obj)
}
g.app.Draw()
}
func NewUI() UI {
g := &gui{}
g.app = tview.NewApplication()
g.pages = tview.NewPages()
var active page
var layout map[string]page
g.connPage = newConnectorsGrid()
g.page2 = tview.NewBox().SetBorder(true).SetTitle("Bbbbbb")
layout = map[string]page{
connectors_page: {
left: "Page2",
right: "Page2",
primitive: g.connPage,
},
"Page2": {
left: connectors_page,
right: connectors_page,
primitive: g.page2,
},
}
for k, p := range layout {
g.pages.AddPage(k, p.primitive, true, true)
}
active = layout[connectors_page]
g.pages.SwitchToPage(connectors_page)
g.app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() {
case tcell.KeyRight:
g.pages.SwitchToPage(active.right)
active = layout[active.right]
return nil
case tcell.KeyLeft:
g.pages.SwitchToPage(active.left)
active = layout[active.left]
return nil
case tcell.KeyCtrlC:
g.app.Stop()
}
return event
})
return g
}
func (g *gui) Start() {
go func() {
if err := g.app.SetRoot(g.pages, true).EnableMouse(true).Run(); err != nil {
panic(err)
}
}()
}
func (g *gui) Stop() {
g.app.Stop()
}
func NewLog() UI {
return &log{}
}
func (l log) Consume(event *yabl.Event) {
fmt.Printf(
"%v %v.%v [%d] %v\n",
event.Updated.Format("Jan _2 15:04:05.000"),
event.ActionName,
event.Field,
event.GetUnitId(),
event.Value)
}
func (l log) Start() {
}
func (l log) Stop() {
}
func getField(v yabl.Action, field yabl.FName) interface{} {
r := reflect.ValueOf(v)
f := reflect.Indirect(r).FieldByName(string(field))
return f.Interface()
}