aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main.go108
-rw-r--r--ui.go115
2 files changed, 115 insertions, 108 deletions
diff --git a/main.go b/main.go
index 7327ebd..fd3dde7 100644
--- a/main.go
+++ b/main.go
@@ -2,15 +2,11 @@ package main
import (
"fmt"
- "image"
- "image/color"
"os"
"sync"
"github.com/faiface/mainthread"
"volute/gui"
- "volute/gui/layout"
- "volute/gui/widget"
"volute/gui/win"
)
@@ -78,87 +74,6 @@ func run() {
eventLoop(env, &focus)
}
-func spawnWidgets(
- displacementChan chan uint,
- rpmChan, veChan, imapChan, actChan [POINTS]chan uint,
- flowChan [POINTS]chan float64,
- focus *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 eventLoop(env gui.Env, focus *Focus) {
for event := range env.Events() {
switch event := event.(type) {
@@ -189,29 +104,6 @@ func makeChans[T any](chanss ...[]chan T) {
}
}
-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
-}
-
func calculateFlow(
flow chan<- float64,
displacementChan, rpmChan, veChan, actChan, imapChan <-chan uint,
diff --git a/ui.go b/ui.go
new file mode 100644
index 0000000..132ae89
--- /dev/null
+++ b/ui.go
@@ -0,0 +1,115 @@
+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 *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
+}