|
|
|
@ -61,7 +61,7 @@ func (t *TUI) CreateDisplay() {
|
|
|
|
|
t.SelectedReactor = rc
|
|
|
|
|
t.SelectedDevice = dc
|
|
|
|
|
t.Flex.AddItem(t.ReactorList,0,1,true).
|
|
|
|
|
AddItem(t.DevicePages,0,2,false)
|
|
|
|
|
AddItem(t.DeviceList,0,2,false)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (t *TUI) Monitor() {
|
|
|
|
@ -79,14 +79,16 @@ func (t *TUI) Monitor() {
|
|
|
|
|
case reactor := <-t.SelectedReactor:
|
|
|
|
|
// reactor has been selected in tui, grabbing devs
|
|
|
|
|
t.App.QueueUpdateDraw(func() {
|
|
|
|
|
t.Display.DeviceList.Clear()
|
|
|
|
|
t.UpdateDevices(reactor)
|
|
|
|
|
})
|
|
|
|
|
logging.Debug(logging.DClient, "%v getting reactor devices", t.Id)
|
|
|
|
|
case <-t.SelectedDevice:
|
|
|
|
|
case dev := <-t.SelectedDevice:
|
|
|
|
|
logging.Debug(logging.DClient, "%v editing device %v", t.Id, dev)
|
|
|
|
|
// TODO
|
|
|
|
|
case <-timer:
|
|
|
|
|
// time to ping for status
|
|
|
|
|
logging.Debug(logging.DClient, "%v getting reactor status", t.Id)
|
|
|
|
|
logging.Debug(logging.DClient, "%v pinging for updates", t.Id)
|
|
|
|
|
t.App.QueueUpdateDraw(func() {
|
|
|
|
|
t.UpdateDevices()
|
|
|
|
|
})
|
|
|
|
@ -98,13 +100,14 @@ func (t *TUI) UpdateDevices(r ...uint32) {
|
|
|
|
|
// get devices for the reactor and update the tui
|
|
|
|
|
var id uint32
|
|
|
|
|
// see if there is a page being displayed
|
|
|
|
|
/*
|
|
|
|
|
if name, _ := t.Display.DevicePages.GetFrontPage(); name != "" {
|
|
|
|
|
if tmp, err := strconv.ParseUint(name, 10, 32); err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
} else {
|
|
|
|
|
id = uint32(tmp)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
// overwrite if called as a func
|
|
|
|
|
if len(r) > 0 {
|
|
|
|
|
id = r[0]
|
|
|
|
@ -113,22 +116,22 @@ func (t *TUI) UpdateDevices(r ...uint32) {
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if id != 0 {
|
|
|
|
|
// reactor specificed split devs
|
|
|
|
|
reactors := make(map[uint32]*Device)
|
|
|
|
|
devices := make(map[uint32]*Device)
|
|
|
|
|
for id, dev := range devs {
|
|
|
|
|
if dev.Type == "Reactor" {
|
|
|
|
|
reactors[id] = dev
|
|
|
|
|
} else {
|
|
|
|
|
devices[id] = dev
|
|
|
|
|
}
|
|
|
|
|
//if id != 0 {
|
|
|
|
|
// split based on type to simplify update
|
|
|
|
|
reactors := make(map[uint32]*Device)
|
|
|
|
|
devices := make(map[uint32]*Device)
|
|
|
|
|
for id, dev := range devs {
|
|
|
|
|
if dev.Type == "Reactor" {
|
|
|
|
|
reactors[id] = dev
|
|
|
|
|
} else {
|
|
|
|
|
devices[id] = dev
|
|
|
|
|
}
|
|
|
|
|
t.DisplayDevices(devices, id)
|
|
|
|
|
t.DisplayReactors(reactors)
|
|
|
|
|
} else {
|
|
|
|
|
t.DisplayReactors(devs)
|
|
|
|
|
}
|
|
|
|
|
t.DisplayDevices(devices)
|
|
|
|
|
t.DisplayReactors(reactors)
|
|
|
|
|
// } else {
|
|
|
|
|
// t.DisplayReactors(devs)
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// display struct and logic
|
|
|
|
@ -136,8 +139,7 @@ type Display struct {
|
|
|
|
|
App *tview.Application
|
|
|
|
|
Flex *tview.Flex
|
|
|
|
|
ReactorList *tview.List
|
|
|
|
|
DevicePages *tview.Pages
|
|
|
|
|
DeviceList map[string]*tview.List
|
|
|
|
|
DeviceList *tview.List
|
|
|
|
|
SelectedReactor chan<- uint32
|
|
|
|
|
SelectedDevice chan<- uint32
|
|
|
|
|
sync.Mutex
|
|
|
|
@ -147,17 +149,16 @@ func NewDisplay(rc,dc chan uint32) *Display {
|
|
|
|
|
d := &Display{}
|
|
|
|
|
d.App = tview.NewApplication()
|
|
|
|
|
d.Flex = tview.NewFlex()
|
|
|
|
|
lists := make(map[string]*tview.List)
|
|
|
|
|
d.DeviceList = lists
|
|
|
|
|
d.ReactorList = tview.NewList()//.ShowSecondaryText(false)
|
|
|
|
|
d.DeviceList = tview.NewList()
|
|
|
|
|
d.ReactorList = tview.NewList()
|
|
|
|
|
d.ReactorList.AddItem("Quit","Press (q) to quit",113,func() {
|
|
|
|
|
d.App.Stop()
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
})
|
|
|
|
|
d.DevicePages = tview.NewPages()
|
|
|
|
|
d.ReactorList.SetTitle("Reactors").SetBorder(true)
|
|
|
|
|
d.ReactorList.SetSelectedFunc(d.SelectReactor)
|
|
|
|
|
d.DevicePages.SetTitle("Devices").SetBorder(true)
|
|
|
|
|
d.DeviceList.SetTitle("Devices").SetBorder(true)
|
|
|
|
|
d.DeviceList.SetSelectedFunc(d.SelectDevice)
|
|
|
|
|
d.SelectedReactor = rc
|
|
|
|
|
d.SelectedDevice = dc
|
|
|
|
|
return d
|
|
|
|
@ -171,21 +172,36 @@ func (d *Display) Start() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (d *Display) DisplayReactors(r map[uint32]*Device) {
|
|
|
|
|
// function to display reactor list to table
|
|
|
|
|
//d.Lock()
|
|
|
|
|
//defer d.Unlock()
|
|
|
|
|
// locking may break the hell out of this gonna trust tview
|
|
|
|
|
// this func takes in a list of devices to update and loops over them
|
|
|
|
|
// works by padding list for entries not seen yet
|
|
|
|
|
for _, reactor := range r {
|
|
|
|
|
txt := fmt.Sprintf("%v %v", reactor.Id, reactor.Status)
|
|
|
|
|
if d.ReactorList.GetItemCount() > int(reactor.Index) + 1 {
|
|
|
|
|
d.ReactorList.RemoveItem(int(reactor.Index))
|
|
|
|
|
indx := int(reactor.Index)
|
|
|
|
|
for indx + 1 >= d.ReactorList.GetItemCount() {
|
|
|
|
|
// this prevent overwriting quit entry
|
|
|
|
|
d.ReactorList.InsertItem(-2,txt,reactor.Data,rune(48+d.ReactorList.GetItemCount()),nil)
|
|
|
|
|
}
|
|
|
|
|
if indx + 1 < d.ReactorList.GetItemCount() {
|
|
|
|
|
d.ReactorList.SetItemText(indx,txt,reactor.Data)
|
|
|
|
|
}
|
|
|
|
|
d.ReactorList.InsertItem(int(reactor.Index),txt,reactor.Data,rune(49+reactor.Index),nil)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (d *Display) DisplayDevices(devs map[uint32]*Device, rid uint32) {
|
|
|
|
|
//d.Lock()
|
|
|
|
|
func (d *Display) DisplayDevices(devs map[uint32]*Device) {
|
|
|
|
|
// going to just clear every time as we reload new dev lists anyway
|
|
|
|
|
// going to clear on every reactor selection to simplify
|
|
|
|
|
// can probably just load from SM to save system resources on spam reloading
|
|
|
|
|
for _, dev := range devs {
|
|
|
|
|
txt := fmt.Sprintf("0x%x %v %v",dev.Id,dev.Status,dev.Type)
|
|
|
|
|
indx := int(dev.Index)
|
|
|
|
|
for indx >= d.DeviceList.GetItemCount() {
|
|
|
|
|
d.DeviceList.AddItem(txt,dev.Data,rune(49+d.DeviceList.GetItemCount()), nil)
|
|
|
|
|
}
|
|
|
|
|
if indx < d.DeviceList.GetItemCount() {
|
|
|
|
|
d.DeviceList.SetItemText(indx,txt,dev.Data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
reactorPage := strconv.FormatUint(uint64(rid), 10)
|
|
|
|
|
var reactorList *tview.List
|
|
|
|
|
var ok bool
|
|
|
|
@ -203,6 +219,7 @@ func (d *Display) DisplayDevices(devs map[uint32]*Device, rid uint32) {
|
|
|
|
|
reactorList.InsertItem(int(dev.Index),txt,dev.Data,0,nil)
|
|
|
|
|
}
|
|
|
|
|
d.DevicePages.SwitchToPage(reactorPage)
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -219,10 +236,15 @@ func (d *Display) SelectReactor(index int, main, data string, r rune) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (d *Display) SelectDevice(index int, main, id string, r rune) {
|
|
|
|
|
func (d *Display) SelectDevice(index int, main, data string, r rune) {
|
|
|
|
|
// called when device is selected in sub menu
|
|
|
|
|
if id, err := strconv.ParseUint(id, 10, 32); err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
maintxt := strings.Split(main," ")
|
|
|
|
|
id := maintxt[0]
|
|
|
|
|
id = strings.Trim(id,"0x \n")
|
|
|
|
|
logging.Debug(logging.DClient,"Selected dev %v", id)
|
|
|
|
|
if id, err := strconv.ParseUint(id, 16, 32); err != nil {
|
|
|
|
|
logging.Debug(logging.DError, "Error parsing: %v", err)
|
|
|
|
|
os.Exit(1)
|
|
|
|
|
} else {
|
|
|
|
|
d.SelectedDevice <-uint32(id)
|
|
|
|
|
}
|
|
|
|
|