"mmdet3d/models/backbones/pointnet2_sa_ssg.py" did not exist on "1634436229c3967c5c2be5981fcb2b57c2e9f856"
process.go 4.23 KB
Newer Older
1
2
3
4
package tui

import (
	"fmt"
5
	"get-container/cmd/hytop/backend"
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	"maps"
	"strings"

	tea "github.com/charmbracelet/bubbletea"
	"github.com/charmbracelet/lipgloss"
)

type ModelProcessInfo struct {
	Title            string
	DoubleMiddleLine string
	MiddleLine       string
	BottomLine       string
	NoProceseLine    string // 没有进程时显示的行
	Cache            map[int][]backend.DCUProcessInfo
	width            int
	style            lipgloss.Style
22
	modMsg           *ModelMsg
23
24
25
26
}

const (
	Processes             = " Processes:"
27
	ModelProcessInfoTitle = " DCU     PID     USER  DCU-MEM SDMA  %CPU  %MEM      TIME Docker               Command"
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
	ModelProcessInfoNoPro = "  No running processes found"
)

func NewModelProcessInfo(width int) *ModelProcessInfo {
	result := ModelProcessInfo{width: width, Cache: make(map[int][]backend.DCUProcessInfo), style: lipgloss.NewStyle()}
	return &result
}

func (m *ModelProcessInfo) Init() tea.Cmd {
	sb := strings.Builder{}
	sb.WriteString(myBorder.Left)
	sb.WriteString(Processes)

	uah := fmt.Sprintf("%s@%s ", m.style.Foreground(lipgloss.Color("#edff2cff")).SetString(backend.User).String(),
		m.style.Foreground(lipgloss.Color("#a3ff2bff")).SetString(backend.HostName).String())
	space := strings.Repeat(" ", m.width-lipgloss.Width(Processes)-lipgloss.Width(uah)-2)

	sb.WriteString(space)
	sb.WriteString(uah)
	sb.WriteString(myBorder.Right)
	sb.WriteByte('\n')
	sb.WriteString(myBorder.Left)
	sb.WriteString(ModelProcessInfoTitle)
	sb.WriteString(strings.Repeat(" ", m.width-2-lipgloss.Width(ModelProcessInfoTitle)))
	sb.WriteString(myBorder.Right)
	sb.WriteByte('\n')
	m.Title = sb.String()
	m.DoubleMiddleLine = "╞" + strings.Repeat("═", m.width-2) + "╡\n"
	m.MiddleLine = myBorder.MiddleLeft + strings.Repeat("─", m.width-2) + myBorder.MiddleRight + "\n"
	m.BottomLine = myBorder.BottomLeft + strings.Repeat("═", m.width-2) + myBorder.BottomRight
	m.NoProceseLine = myBorder.Left + ModelProcessInfoNoPro + strings.Repeat(" ", m.width-2-lipgloss.Width(ModelProcessInfoNoPro)) + myBorder.Right + "\n"
	return nil
}

func (m *ModelProcessInfo) View() string {
	haveProcess := false
	lines := make([]string, 0)
	sb := strings.Builder{}
	for index := range 64 {
		processes, have := m.Cache[index]
		if !have {
			continue
		}
		for _, process := range processes {
			haveProcess = true
			sb.WriteString(myBorder.Left)
			sb.WriteString(FormatStr(fmt.Sprintf("%d", process.DCU), 4, lipgloss.Right))
			sb.WriteByte(' ')
76
			sb.WriteString(FormatStr(fmt.Sprintf("%d", process.Info.Pid), 7, lipgloss.Right))
77
			sb.WriteByte(' ')
78
			sb.WriteString(FormatStr(process.Info.User, 8, lipgloss.Right))
79
80
81
82
83
84
85
86
87
88
			sb.WriteByte(' ')
			sb.WriteString(FormatStr(process.DCUMem, 8, lipgloss.Right))
			sb.WriteByte(' ')
			sb.WriteString(FormatStr(fmt.Sprintf("%d", process.SDMA), 4, lipgloss.Right))
			sb.WriteByte(' ')
			sb.WriteString(FormatStr(fmt.Sprintf("%.1f", process.Info.CPU), 5, lipgloss.Right))
			sb.WriteByte(' ')
			sb.WriteString(FormatStr(fmt.Sprintf("%.1f", process.Info.Mem), 5, lipgloss.Right))
			sb.WriteByte(' ')
			sb.WriteString(FormatStr(process.Info.Time, 9, lipgloss.Right))
89
90
91
92
93
94
95
			sb.WriteByte(' ')
			if process.Info.ContInfo != nil {
				sb.WriteString(FormatStr(process.Info.ContInfo.Name, 20, lipgloss.Left))
			} else {
				sb.WriteString(FormatStr("  -  ", 20, lipgloss.Right))
			}
			sb.WriteByte(' ')
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
			w := m.width - lipgloss.Width(sb.String()) - 2
			tw := lipgloss.Width(process.Info.Cmd)
			if w >= tw {
				sb.WriteString(process.Info.Cmd)
				sb.WriteString(strings.Repeat(" ", w-tw))
			} else {
				sb.WriteString(FormatStr(process.Info.Cmd, w-2, lipgloss.Left))
				sb.WriteString("..")
			}
			sb.WriteByte(' ')
			sb.WriteString(myBorder.Right)
			sb.WriteByte('\n')
			lines = append(lines, sb.String())
			sb.Reset()
		}
		lines = append(lines, m.MiddleLine)
	}
113

114
115
	sb.WriteString(m.Title)
	sb.WriteString(m.DoubleMiddleLine)
116
117
118
119
120
121
	if !haveProcess {
		sb.WriteString(m.NoProceseLine)
	} else {
		for _, v := range lines[:len(lines)-1] {
			sb.WriteString(v)
		}
122
123
124
125
126
127
128
129
130
131
	}
	sb.WriteString(m.BottomLine)
	return sb.String()
}

func (m *ModelProcessInfo) Update(inputMsg tea.Msg) (tea.Model, tea.Cmd) {
	switch msg := inputMsg.(type) {
	case *ModelMsg:
		clear(m.Cache)
		maps.Copy(m.Cache, msg.DCUPidInfo)
132
133
		m.modMsg = msg
		return m, nil
134
135
136
	}
	return m, nil
}