From f8e65a03d27d6249c80a4c887ebdc8d35304d739 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Tue, 3 Mar 2026 22:02:42 +0000 Subject: [PATCH] we got the data reading going again --- .../{deviceController.go => device.go} | 30 ++++++-- .../{layoutController.go => layout.go} | 5 -- ...troller_moveTool.go => layout_moveTool.go} | 0 tui/internal/controllers/streaming.go | 63 +++++++++++++++-- tui/internal/views/stream.go | 69 +++++-------------- 5 files changed, 97 insertions(+), 70 deletions(-) rename tui/internal/controllers/{deviceController.go => device.go} (79%) rename tui/internal/controllers/{layoutController.go => layout.go} (98%) rename tui/internal/controllers/{layoutController_moveTool.go => layout_moveTool.go} (100%) diff --git a/tui/internal/controllers/deviceController.go b/tui/internal/controllers/device.go similarity index 79% rename from tui/internal/controllers/deviceController.go rename to tui/internal/controllers/device.go index 7033426..eec221d 100644 --- a/tui/internal/controllers/deviceController.go +++ b/tui/internal/controllers/device.go @@ -13,7 +13,7 @@ type DeviceController struct { *Controller DeviceAPIView *views.DeviceAPIView LayoutCtrl *LayoutController - StreamStrl *StreamingCtrl + StreamCtrl *StreamingCtrl DevService *serv.CDashService } @@ -22,7 +22,7 @@ func NewDeviceController(base *Controller, devService *serv.CDashService) *Devic Controller: base, LayoutCtrl: NewLayoutController(base, devService), DevService: devService, - StreamStrl: NewStreamingCtrl(), + StreamCtrl: NewStreamingCtrl(base, devService), } // mc.Bus.On(ui.StartStreamingReqEv{}, func(e any) { @@ -38,8 +38,7 @@ func NewDeviceController(base *Controller, devService *serv.CDashService) *Devic func (mc *DeviceController) PrintToOutputWindow(msg string) { mc.App.QueueUpdateDraw(func() { - fmt.Fprintf(mc.DeviceAPIView.OutputWindow.TextArea, - "%s", msg) + fmt.Fprintf(mc.DeviceAPIView.OutputWindow.TextArea, "%s", msg) }) } @@ -67,8 +66,8 @@ func (mc *DeviceController) setDeviceAPIViewEvents() { } func (mc *DeviceController) AddDeviceAPIListItems() { - mc.DeviceAPIView.DevAPIList.AddItem("layout", "build a layout for CDashDisplay", - func() { + mc.DeviceAPIView.DevAPIList. + AddItem("layout", "build a layout for CDashDisplay", func() { // Get the api pages views.AddAndShowPage( mc.DeviceAPIView.DevAPIToolView.Pages, @@ -77,6 +76,14 @@ func (mc *DeviceController) AddDeviceAPIListItems() { ) mc.App.SetFocus(mc.LayoutCtrl.LayoutToolView.LayoutTree.Tree) }) + mc.DeviceAPIView.DevAPIList. + AddItem("stream", "stream data to the display", func() { + views.AddAndShowPage(mc.DeviceAPIView.DevAPIToolView.Pages, + "streaming-tool", + mc.StreamCtrl.StreamView.TextView, + ) + mc.App.SetFocus(mc.StreamCtrl.StreamView.TextView) + }) } func (mc *DeviceController) injectViewCallbacks() { @@ -85,9 +92,12 @@ func (mc *DeviceController) injectViewCallbacks() { func (mc *DeviceController) injectControllerCallbacks() { // Tell the layout controller what to do on exit - mc.LayoutCtrl.OnExit = func() { + giveFocusToAPIList := func() { mc.App.SetFocus(mc.DeviceAPIView.DevAPIList.List) } + + mc.LayoutCtrl.OnExit = giveFocusToAPIList + mc.StreamCtrl.OnExit = giveFocusToAPIList } func (mc *DeviceController) injectChannels() { @@ -102,6 +112,12 @@ func (mc *DeviceController) injectChannels() { mc.PrintToOutputWindow(msg) } }() + + go func() { + for msg := range mc.StreamCtrl.Messages { + mc.PrintToOutputWindow(msg) + } + }() } func (mc *DeviceController) mainUI() error { diff --git a/tui/internal/controllers/layoutController.go b/tui/internal/controllers/layout.go similarity index 98% rename from tui/internal/controllers/layoutController.go rename to tui/internal/controllers/layout.go index 008ee0a..a024916 100644 --- a/tui/internal/controllers/layoutController.go +++ b/tui/internal/controllers/layout.go @@ -194,8 +194,6 @@ func (lc *LayoutController) createWindow() { // altogether given we won't be able to manipulate it any further lc.Messages <- "failed to append window to views " + err.Error() } - - lc.App.SetFocus(lc.LayoutToolView.LayoutTree.Tree) } func (lc *LayoutController) updateFormView(win *models.UIWindow) error { @@ -289,9 +287,6 @@ func (lc *LayoutController) updateWindowAction(win *models.UIWindow) { lc.Messages <- "failed to update window due to " + err.Error() + "\n" return } - - // I guess it was a success, we must update the view - lc.LayoutToolView.UpdateFormView(win) } func (lc *LayoutController) displayLoadedLayouts() { diff --git a/tui/internal/controllers/layoutController_moveTool.go b/tui/internal/controllers/layout_moveTool.go similarity index 100% rename from tui/internal/controllers/layoutController_moveTool.go rename to tui/internal/controllers/layout_moveTool.go diff --git a/tui/internal/controllers/streaming.go b/tui/internal/controllers/streaming.go index 4d9c00f..98c18da 100644 --- a/tui/internal/controllers/streaming.go +++ b/tui/internal/controllers/streaming.go @@ -2,6 +2,8 @@ package controllers import ( esdi "esdi/oldEsdi" + "esdi/tui/internal/services" + "esdi/tui/internal/views" "fmt" "log" "os" @@ -10,6 +12,7 @@ import ( "time" "github.com/ESilva15/goirsdk" + "github.com/gdamore/tcell/v2" ) // Car data lengths @@ -21,6 +24,8 @@ const ( ) type StreamingCtrl struct { + *Controller + Service *services.CDashService LastMessageTime time.Time Data *esdi.SimulationData DataView *esdi.DataPacket @@ -28,19 +33,57 @@ type StreamingCtrl struct { LastTime time.Time Mut sync.Mutex Irsdk *goirsdk.IBT + StreamView *views.StreamView + Messages chan string + Internal chan string + Run bool + OnExit func() + isRunning bool } -func NewStreamingCtrl() *StreamingCtrl { - return &StreamingCtrl{ +func NewStreamingCtrl(base *Controller, ser *services.CDashService) *StreamingCtrl { + ctrl := &StreamingCtrl{ + Controller: base, + Service: ser, Data: &esdi.SimulationData{}, DataView: &esdi.DataPacket{}, InitialTime: time.Now(), LastTime: time.Now(), + Messages: make(chan string, 10), + Internal: make(chan string, 10), + Run: false, + StreamView: views.NewStreamView(), + isRunning: false, } + + ctrl.registerHooks() + + return ctrl } -// func (sc *StreamingCtrl) Stop(bus *events.Bus) { -// } +func (sc *StreamingCtrl) registerHooks() { + sc.StreamView.TextView.SetInputCapture(func(ev *tcell.EventKey) *tcell.EventKey { + switch ev.Key() { + case tcell.KeyEsc: + sc.OnExit() + } + + switch ev.Rune() { + case 's': + // Start + sc.Start() + case 'p': + // Pause + sc.Stop() + } + + return ev + }) +} + +func (sc *StreamingCtrl) Stop() { + sc.Run = false +} func (sc *StreamingCtrl) Start() { // Open the telemetry file @@ -58,6 +101,8 @@ func (sc *StreamingCtrl) Start() { go sc.ReadData() + sc.Run = true + // global irsdk is now here go func() { ticker := time.NewTicker(time.Second / 60) @@ -65,15 +110,21 @@ func (sc *StreamingCtrl) Start() { counter := 0 for t := range ticker.C { + if !sc.Run { + break + } // whatever currentTime := time.Now() delta := currentTime.Sub(startTime) - _ = sc.Stringified() + fmt.Sprintf("%v - %7d\n%5f - %5f", + str := sc.Stringified() + fmt.Sprintf("%v - %7d\n%5f - %5f", t.UTC(), counter, delta.Seconds(), delta.Seconds()/float64(counter)) - // bus.Emit(ui.StreamDataEv{Str: str}) + sc.App.QueueUpdateDraw(func() { + sc.StreamView.Update(str) + }) + counter++ } }() diff --git a/tui/internal/views/stream.go b/tui/internal/views/stream.go index 04ab348..b202f91 100644 --- a/tui/internal/views/stream.go +++ b/tui/internal/views/stream.go @@ -1,5 +1,7 @@ package views +import "github.com/rivo/tview" + // Car data lengths const ( SpeedLen = 5 @@ -12,56 +14,19 @@ const ( streamingBoxID = "streaming-box" ) -func streamingWindow() { - // bus.Emit(ui.LogEv{Log: "creating streaming window"}) - // - // // Get the ActionPages parent - // box := tview.NewTextView() - // box.SetBorder(true).SetTitle("STREAMING") - // box.SetInputCapture(func(ev *tcell.EventKey) *tcell.EventKey { - // switch ev.Key() { - // case tcell.KeyEsc: - // // well, I really need to design the UI (as if lmao) better - // os.Exit(0) - // } - // - // return ev - // }) - // - // var err error - // var boxNode *dom.UINode - // - // // delete the currently existing streaming-box - // actionPages := doc.GetElemByID(LayoutToolActionPagesID).(*tview.Pages) - // actionPages.RemovePage(streamingBoxID) - // - // // Get the currently exisiting streaming box in the dom so we can delete it - // boxNode = doc.GetNodeByID(streamingBoxID) - // if boxNode != nil { - // doc.DeleteElem(boxNode) - // } - // - // // Register this streaming box as an UINode - // boxNode, err = doc.NewUINode( - // streamingBoxID, - // doc.GetElemByID(LayoutToolActionPagesID), - // box, - // ) - // if err != nil { - // return - // } - // - // // Add it to the action pages and view it - // // AddAndShowPage(actionPages, boxNode, true) - // - // bus.Emit(ui.StartStreamingReqEv{}) - // - // bus.On(ui.StreamDataEv{}, func(e any) { - // bus.Emit(ui.RedrawEv{ - // Fn: func() { - // sd := e.(ui.StreamDataEv) - // box.SetText(sd.Str) - // }, - // }) - // }) +type StreamView struct { + TextView *tview.TextView +} + +func NewStreamView() *StreamView { + tv := tview.NewTextView() + tv.SetTitle("Streaming Tool").SetBorder(true) + + return &StreamView{ + TextView: tv, + } +} + +func (sv *StreamView) Update(str string) { + sv.TextView.SetText(str) }