1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
package main
import (
"image"
"image/color"
"sync"
"volute/gui"
"volute/gui/layout"
"volute/gui/widget"
)
func spawnWidgets(
displacementChan chan uint,
rpmChan, veChan, imapChan, actChan [POINTS]chan uint,
flowChan [POINTS]chan float64,
focus *widget.Focus,
mux *gui.Mux,
wg *sync.WaitGroup,
) {
bounds := layout.Grid{
Rows: []int{2, 7, 7, 7, 7, 7},
Background: color.Gray{255},
Gap: 1,
Split: split,
SplitRows: splitRows,
Margin: 0,
Border: 0,
BorderColor: color.Gray{16},
Flip: false,
}.Lay(image.Rect(0, 0, WIDTH, HEIGHT))
wg.Add(1)
go widget.Label("displacement (cc)", bounds[0], mux.MakeEnv(), wg)
wg.Add(1)
go widget.Input(
displacementChan,
bounds[1],
focus.Widgets[0][0],
mux.MakeEnv(),
wg,
)
wg.Add(1)
go widget.Label("speed (rpm)", bounds[2], mux.MakeEnv(), wg)
wg.Add(1)
go widget.Label("VE (%)", bounds[3+POINTS], mux.MakeEnv(), wg)
wg.Add(1)
go widget.Label("IMAP (mbar)", bounds[4+2*POINTS], mux.MakeEnv(), wg)
wg.Add(1)
go widget.Label("ACT (°C)", bounds[5+3*POINTS], mux.MakeEnv(), wg)
wg.Add(1)
go widget.Label("mass flow (kg/min)", bounds[6+4*POINTS], mux.MakeEnv(), wg)
for i := 0; i < POINTS; i++ {
wg.Add(1)
go widget.Input( // speed
rpmChan[i],
bounds[3+i],
focus.Widgets[1][i],
mux.MakeEnv(),
wg,
)
wg.Add(1)
go widget.Input( // VE
veChan[i],
bounds[4+POINTS+i],
focus.Widgets[2][i],
mux.MakeEnv(),
wg,
)
wg.Add(1)
go widget.Input( // IMAP
imapChan[i],
bounds[5+2*POINTS+i],
focus.Widgets[3][i],
mux.MakeEnv(),
wg,
)
wg.Add(1)
go widget.Input( // ACT
actChan[i],
bounds[6+3*POINTS+i],
focus.Widgets[4][i],
mux.MakeEnv(),
wg,
)
wg.Add(1)
go widget.Output( // mass flow
flowChan[i],
bounds[7+4*POINTS+i],
mux.MakeEnv(),
wg,
)
}
}
func split(elements int, space int) []int {
bounds := make([]int, elements)
widths := []int{
widget.TextSize(WIDEST_LABEL).X,
widget.TextSize("123456").X,
}
for i := 0; i < elements && space > 0; i++ {
bounds[i] = min(widths[min(i, len(widths)-1)], space)
space -= bounds[i]
}
return bounds
}
func splitRows(elements int, space int) []int {
bounds := make([]int, elements)
height := widget.TextSize("1").Y
for i := 0; i < elements && space > 0; i++ {
bounds[i] = min(height, space)
space -= bounds[i]
}
return bounds
}
|