diff --git a/go.mod b/go.mod index 5950aad..1a86a66 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,16 @@ module cli-mon go 1.19 require ( - github.com/gizak/termui/v3 v3.1.0 - golang.org/x/sys v0.3.0 + github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf + golang.org/x/sys v0.5.0 ) require ( - github.com/mattn/go-runewidth v0.0.2 // indirect - github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect - github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d // indirect + github.com/gdamore/encoding v1.0.0 // indirect + github.com/gdamore/tcell/v2 v2.6.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/rivo/uniseg v0.4.3 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect ) diff --git a/go.sum b/go.sum index 155a7a8..949c504 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,42 @@ -github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= -github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= -github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d h1:x3S6kxmy49zXVVyhcnrFqxvNVCBPb2KZ9hV2RBdS840= -github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= +github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5y65J2H8Y= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf h1:IchpMMtnfvzg7T3je672bP1nKWz1M4tW3kMZT6CbgoM= +github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/ui/connectors.go b/ui/connectors.go new file mode 100644 index 0000000..53460d1 --- /dev/null +++ b/ui/connectors.go @@ -0,0 +1,140 @@ +package ui + +import ( + "cli-mon/yabl" + "fmt" + "github.com/gdamore/tcell/v2" + "github.com/rivo/tview" +) + +const connectorCount = 6 + +type cTable struct { + tview.Table + voltageBefore [connectorCount + 1]*tview.TableCell + voltageAfter [connectorCount + 1]*tview.TableCell + presentCurrent [connectorCount + 1]*tview.TableCell + connectorInsert [connectorCount + 1]*tview.TableCell + contactorClosed [connectorCount + 1]*tview.TableCell + connectorLocked [connectorCount + 1]*tview.TableCell + cpLevel [connectorCount + 1]*tview.TableCell + isolationState [connectorCount + 1]*tview.TableCell + chargingAllowed [connectorCount + 1]*tview.TableCell + pwmEnabled [connectorCount + 1]*tview.TableCell + cpAccurate [connectorCount + 1]*tview.TableCell + debugModeOn [connectorCount + 1]*tview.TableCell + debugContactorOutOn [connectorCount + 1]*tview.TableCell + boardReady [connectorCount + 1]*tview.TableCell +} + +func (t *cTable) updatePU(id uint, field yabl.FName, value any) { + var view *tview.TableCell + + switch field { + case yabl.FVoltageBefore: + view = t.voltageBefore[id] + case yabl.FVoltageAfter: + view = t.voltageAfter[id] + case yabl.FPresentCurrent: + view = t.presentCurrent[id] + case yabl.FConnectorInsert: + view = t.connectorInsert[id] + case yabl.FContactorOn: + view = t.contactorClosed[id] + case yabl.FConnectorLocked: + view = t.connectorLocked[id] + case yabl.FCpLineLevel: + view = t.cpLevel[id] + case yabl.FIsolationState: + view = t.isolationState[id] + case yabl.FChargingAllowed: + view = t.chargingAllowed[id] + case yabl.FPwmEnabled: + view = t.pwmEnabled[id] + case yabl.FCpLineVoltage: + view = t.cpAccurate[id] + case yabl.FDebugModeOn: + view = t.debugModeOn[id] + case yabl.FDebugContactorOutputOn: + view = t.debugContactorOutOn[id] + } + + if view != nil { + view.SetText(fmt.Sprintf("%v", value)) + } +} + +func (t *cTable) updatePuErrors(obj *yabl.PuErrors) { + id := obj.GetUnitId() + ready := t.boardReady[id] + ready.SetText(fmt.Sprintf("%v", obj.BoardReady)) + + if *obj.BoardReady != yabl.BOARD_READY_OK { + ready.SetBackgroundColor(tcell.ColorDarkRed) + } else { + ready.SetBackgroundColor(tcell.ColorDefault) + } +} + +func newConnectorsGrid() *cTable { + t := &cTable{} + t.Box = tview.NewBox() + t.SetBorderColor(tview.Styles.GraphicsColor) + t.SetSeparator(' ') + t.SetContent(nil) + t.SetTitle("Connectors") + t.SetBorders(true) + t.SetBorder(true) + + t.SetCell(1, 0, tview.NewTableCell("voltageBefore")) + t.SetCell(2, 0, tview.NewTableCell("voltageAfter")) + t.SetCell(3, 0, tview.NewTableCell("presentCurrent")) + t.SetCell(4, 0, tview.NewTableCell("connectorInsert")) + t.SetCell(5, 0, tview.NewTableCell("contactorClosed")) + t.SetCell(6, 0, tview.NewTableCell("connectorLocked")) + t.SetCell(7, 0, tview.NewTableCell("cpLevel")) + t.SetCell(8, 0, tview.NewTableCell("isolationState")) + t.SetCell(9, 0, tview.NewTableCell("chargingAllowed")) + t.SetCell(10, 0, tview.NewTableCell("pwmEnabled")) + t.SetCell(11, 0, tview.NewTableCell("cpAccurate")) + t.SetCell(12, 0, tview.NewTableCell("debugModeOn")) + t.SetCell(13, 0, tview.NewTableCell("debugContactorOutOn")) + t.SetCell(14, 0, tview.NewTableCell("boardReady")) + + for i := 1; i <= 6; i++ { + t.SetCell(0, i, tview.NewTableCell(fmt.Sprintf("Connector %d", i)).SetExpansion(2)) + + t.voltageBefore[i] = tview.NewTableCell("") + t.voltageAfter[i] = tview.NewTableCell("") + t.presentCurrent[i] = tview.NewTableCell("") + t.connectorInsert[i] = tview.NewTableCell("") + t.contactorClosed[i] = tview.NewTableCell("") + t.connectorLocked[i] = tview.NewTableCell("") + t.cpLevel[i] = tview.NewTableCell("") + t.isolationState[i] = tview.NewTableCell("") + t.chargingAllowed[i] = tview.NewTableCell("") + t.pwmEnabled[i] = tview.NewTableCell("") + t.cpAccurate[i] = tview.NewTableCell("") + t.debugModeOn[i] = tview.NewTableCell("") + t.debugContactorOutOn[i] = tview.NewTableCell("") + t.boardReady[i] = tview.NewTableCell("") + + t.SetCell(1, i, t.voltageBefore[i]) + t.SetCell(2, i, t.voltageAfter[i]) + t.SetCell(3, i, t.presentCurrent[i]) + t.SetCell(4, i, t.connectorInsert[i]) + t.SetCell(5, i, t.contactorClosed[i]) + t.SetCell(6, i, t.connectorLocked[i]) + t.SetCell(7, i, t.cpLevel[i]) + t.SetCell(8, i, t.isolationState[i]) + t.SetCell(9, i, t.chargingAllowed[i]) + t.SetCell(10, i, t.pwmEnabled[i]) + t.SetCell(11, i, t.cpAccurate[i]) + t.SetCell(12, i, t.debugModeOn[i]) + t.SetCell(13, i, t.debugContactorOutOn[i]) + t.SetCell(14, i, t.boardReady[i]) + + } + + return t +} diff --git a/ui/ui.go b/ui/ui.go index 4cf7f1e..95968b8 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -2,108 +2,85 @@ package ui import ( "cli-mon/yabl" - ui "github.com/gizak/termui/v3" - "github.com/gizak/termui/v3/widgets" - "log" - "time" + "github.com/gdamore/tcell/v2" + "github.com/rivo/tview" + "os" ) -const headerHeight int = 4 -const contactorsCount = 18 -const connectorsCount = 6 +const ( + connectors_page = "Connectors" +) -var connUI [connectorsCount + 1]*widgets.Paragraph -var contUI [contactorsCount + 1]*widgets.Paragraph -var contactorsErr *widgets.Paragraph +type page struct { + left string + right string + primitive tview.Primitive +} func InitCliApp(events <-chan *yabl.Event) { - if err := ui.Init(); err != nil { - log.Fatalf("failed to initialize termui: %v", err) - } - defer ui.Close() + var app = tview.NewApplication() + pages := tview.NewPages() - var connectorsTab *ui.Grid - //var contactorsErr *widgets.Paragraph - var contactorsStateTab *ui.Grid - var header *widgets.Paragraph + var active page + var layout map[string]page - tabpane := widgets.NewTabPane("Connectors", "Contactors States", "Contactors Errors") - tabpane.SetRect(0, 1, 150, 4) - tabpane.Border = true + connectors := newConnectorsGrid() + page2 := tview.NewBox().SetBorder(true).SetTitle("Bbbbbb") - header = newHeader() - connectorsTab = newConnectorsView() - contactorsStateTab = newContactorsView() - contactorsErr = newContactorsErrView() - - renderTab := func() { - switch tabpane.ActiveTabIndex { - case 0: - termWidth, termHeight := ui.TerminalDimensions() - connectorsTab.SetRect(0, headerHeight, termWidth, termHeight) - ui.Render(connectorsTab) - case 1: - termWidth, termHeight := ui.TerminalDimensions() - contactorsStateTab.SetRect(0, headerHeight, termWidth, termHeight) - ui.Render(contactorsStateTab) - case 2: - ui.Render(contactorsErr) - } + layout = map[string]page{ + connectors_page: { + left: "Page2", + right: "Page2", + primitive: connectors, + }, + "Page2": { + left: connectors_page, + right: connectors_page, + primitive: page2, + }, } - ui.Render(header, tabpane, connectorsTab) + for k, p := range layout { + pages.AddPage(k, p.primitive, true, true) + } - uiEvents := ui.PollEvents() - ticker := time.NewTicker(2 * time.Second).C - for { - select { - case e := <-uiEvents: - switch e.ID { // event string/identifier - case "q", "": // press 'q' or 'C-c' to quit - return - case "": - //payload := e.Payload.(ui.Mouse) - //x, y := payload.X, payload.Y - //p.Text = fmt.Sprintf("X = %d, Y = %d", x, y) - case "": - tabpane.FocusLeft() - ui.Clear() - ui.Render(header, tabpane) - renderTab() - case "": - tabpane.FocusRight() - ui.Clear() - ui.Render(header, tabpane) - renderTab() - } + active = layout["Page1"] + pages.SwitchToPage("Page1") - switch e.Type { - case ui.KeyboardEvent: // handle all key presses - //eventID := e.ID // keypress string - //p.Text = eventID - } - // use Go's built-in tickers for updating and drawing data - case <-ticker: - renderTab() - case message := <-events: - process(message) + app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + switch event.Key() { + case tcell.KeyRight: + pages.SwitchToPage(active.right) + active = layout[active.right] + return nil + case tcell.KeyLeft: + pages.SwitchToPage(active.left) + active = layout[active.left] + return nil + case tcell.KeyCtrlC: + app.Stop() } - } -} + return event + }) -func process(message *yabl.Event) { - if message == nil || message.Object == nil { - return - } + go func() { + if err := app.SetRoot(pages, true).EnableMouse(true).Run(); err != nil { + panic(err) + } + os.Exit(0) + }() - switch msg := message.Object.(type) { - case *yabl.ContactorInternalState: - updateContactorsView(msg) - case *yabl.PuPeriphery: - updateConnectorsView(msg) - case *yabl.PuPresentEnergy: - updateConnectorsView(msg) - case *yabl.ContactorInternalErrors: - updateContactorsStateView(msg) + for event := range events { + switch obj := event.Object.(type) { + case *yabl.PuPresentEnergy: + connectors.updatePU(event.UnitId, event.Field, event.Value) + case *yabl.PuPeriphery: + connectors.updatePU(event.UnitId, event.Field, event.Value) + case *yabl.PuDebug: + connectors.updatePU(event.UnitId, event.Field, event.Value) + case *yabl.PuErrors: + connectors.updatePuErrors(obj) + } + app.Draw() } } diff --git a/ui/view.go b/ui/view.go deleted file mode 100644 index 3606193..0000000 --- a/ui/view.go +++ /dev/null @@ -1,235 +0,0 @@ -package ui - -import ( - "cli-mon/yabl" - "fmt" - ui "github.com/gizak/termui/v3" - "github.com/gizak/termui/v3/widgets" -) - -func newHeader() *widgets.Paragraph { - widget := widgets.NewParagraph() - widget.Text = "Press q to quit, Press or to switch tabs" - widget.SetRect(0, 0, 50, 1) - widget.Border = false - widget.TextStyle.Bg = ui.ColorBlue - return widget -} - -func newConnectorsView() *ui.Grid { - grid := ui.NewGrid() - - termWidth, termHeight := ui.TerminalDimensions() - grid.SetRect(0, headerHeight, termWidth, termHeight) - - var conn [connectorsCount + 1]*widgets.Paragraph //ui.GridItem - - for i := 0; i <= connectorsCount; i++ { - p := widgets.NewParagraph() - p.Text = fmt.Sprintf("No data: #%2.d", i) - p.Title = fmt.Sprintf("Connector: #%2.d", i) - //p.SetRect(0, 0, 50, 30) - p.TextStyle.Bg = ui.ColorBlue - p.TextStyle.Fg = ui.ColorWhite - p.BorderStyle.Fg = ui.ColorYellow - p.Border = true - - connUI[i] = p - conn[i] = p //ui.NewCol(1.0/6, p) - } - - grid.Set( - ui.NewRow( - 1.0/2, - ui.NewCol(1.0/4, conn[1]), - ui.NewCol(1.0/4, conn[2]), - ui.NewCol(1.0/4, conn[3]), - ui.NewCol(1.0/4, conn[4]), - ), - ui.NewRow( - 1.0/2, - ui.NewCol(1.0/4, conn[5]), - ui.NewCol(1.0/4, conn[6]), - ui.NewCol(1.0/4, conn[0]), - ), - ) - - return grid -} - -func newContactorsView() *ui.Grid { - grid := ui.NewGrid() - - termWidth, termHeight := ui.TerminalDimensions() - grid.SetRect(0, headerHeight, termWidth, termHeight) - - var cont [contactorsCount + 1]ui.GridItem - - //var contactors = make([]ui.GridItem, contactorsCount) - for i := 1; i <= contactorsCount; i++ { - p := widgets.NewParagraph() - p.Text = fmt.Sprintf("No data: #%2.d", i) - p.Title = fmt.Sprintf("Contactor: #%2.d", i) - p.Border = false - p.TextStyle.Bg = ui.ColorBlue - p.TextStyle.Fg = ui.ColorWhite - p.BorderStyle.Fg = ui.ColorYellow - p.Border = true - - contUI[i] = p - cont[i] = ui.NewCol(1.0/6, p) - } - - grid.Set( - ui.NewRow( - 1.0/3, - cont[1], - cont[2], - cont[3], - cont[4], - cont[5], - cont[6], - ), - ui.NewRow( - 1.0/3, - cont[7], - cont[8], - cont[9], - cont[10], - cont[11], - cont[12], - ), - ui.NewRow( - 1.0/3, - cont[13], - cont[14], - cont[15], - cont[16], - cont[17], - cont[18], - )) - - //ui.NewRow(1, ui.InterfaceSlice(contactors)...) - grid.Set() - - return grid -} - -func newContactorsErrView() *widgets.Paragraph { - p := widgets.NewParagraph() - p.Text = "No data\n" - p.Title = "Contactors Errors" - p.SetRect(5, 5, 55, 15) - p.BorderStyle.Fg = ui.ColorYellow - - return p -} - -func updateContactorsView(msg *yabl.ContactorInternalState) { - - p := contUI[msg.GetUnitId()] - s := msg - - if s == nil || p == nil { - return - } - - p.Text = fmt.Sprintf( - "BoardReady: %s\nContactorOn: %s\nUnexpectedState: %s\nIsolated: %s\nDebug: %s", - s.ContactorReady, - s.ContactorOn, - s.UnexpectedState, - s.Isolated, - s.DebugEnabled) - - if s.ContactorReady != nil && *s.ContactorReady == yabl.BOARD_READY_OK { - p.TextStyle.Bg = ui.ColorClear - } else { - p.TextStyle.Bg = ui.ColorRed - } - - if s.ContactorOn != nil && *s.ContactorOn == yabl.ON { - p.TitleStyle.Bg = ui.ColorBlue - } else { - p.TitleStyle.Bg = ui.ColorClear - } -} - -var connectorsState [connectorsCount + 1]*yabl.PuPeriphery -var connectorsEnergy [connectorsCount + 1]*yabl.PuPresentEnergy - -func updateConnectorsView(action yabl.Action) { - if action == nil { - return - } - - var unitId = action.GetUnitId() - - switch msg := action.(type) { - case *yabl.PuPeriphery: - connectorsState[unitId] = msg - case *yabl.PuPresentEnergy: - connectorsEnergy[unitId] = msg - } - - p := connUI[unitId] - s := connectorsState[unitId] - e := connectorsEnergy[unitId] - - if s == nil || e == nil { - return - } - - fstring := "ConnectorInsert %s\n" + - "ContactorOn %s\n" + - "ConnectorLocked %s\n" + - "LineLevel %s\n" + - "IsolationState %s\n" + - "ChargingAllowed %s\n" + - "PwmEnabled %s\n" + - "CpLineVoltage %s\n" + - "V2GMode %s\n" + - "VoltageBefore %s\n" + - "VoltageAfter %s\n" + - "PresentCurrent %s" - - p.Text = fmt.Sprintf( - fstring, - s.ConnectorInsert, - s.ContactorOn, - s.ConnectorLocked, - s.CpLineLevel, - s.IsolationState, - s.ChargingAllowed, - s.PwmEnabled, - s.CpLineVoltage, - e.V2GMode, - e.VoltageBefore, - e.VoltageAfter, - e.PresentCurrent) -} - -func updateContactorsStateView(e *yabl.ContactorInternalErrors) { - p := contactorsErr - - if e == nil { - return - } - - p.Text = fmt.Sprintf( - "BoardReady: %s\nOtherError: %s\nGroupChanged: %s\nUnexpectedFormation: %s\nCpuNotReady: %s\nPuNotReady: %s\nDebug: %s", - e.BoardReady, - e.OtherError, - e.ContactorGroupChanged, - e.UnexpectedFormation, - e.CpuNotReady, - e.PuNotReady, - e.Debug, - ) - - if e.BoardReady != nil && *e.BoardReady == yabl.BOARD_READY_OK { - p.TextStyle.Bg = ui.ColorClear - } else { - p.TextStyle.Bg = ui.ColorRed - } -}