111 lines
2.5 KiB
Go
111 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"image/color"
|
|
"strconv"
|
|
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/canvas"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/theme"
|
|
"fyne.io/fyne/v2/widget"
|
|
"go.arsenm.dev/itd/api"
|
|
)
|
|
|
|
func motionTab(parent fyne.Window, client *api.Client) *fyne.Container {
|
|
// Create label for heart rate
|
|
xCoordLbl := newText("0", 24)
|
|
// Creae container to store heart rate section
|
|
xCoordSect := container.NewVBox(
|
|
newText("X Coordinate", 12),
|
|
xCoordLbl,
|
|
canvas.NewLine(theme.ShadowColor()),
|
|
)
|
|
|
|
// Create label for heart rate
|
|
yCoordLbl := newText("0", 24)
|
|
// Creae container to store heart rate section
|
|
yCoordSect := container.NewVBox(
|
|
newText("Y Coordinate", 12),
|
|
yCoordLbl,
|
|
canvas.NewLine(theme.ShadowColor()),
|
|
)
|
|
// Create label for heart rate
|
|
zCoordLbl := newText("0", 24)
|
|
// Creae container to store heart rate section
|
|
zCoordSect := container.NewVBox(
|
|
newText("Z Coordinate", 12),
|
|
zCoordLbl,
|
|
canvas.NewLine(theme.ShadowColor()),
|
|
)
|
|
|
|
// Create variable to keep track of whether motion started
|
|
started := false
|
|
|
|
// Create button to stop motion
|
|
stopBtn := widget.NewButton("Stop", nil)
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
onClose = append(onClose, cancel)
|
|
|
|
// Create button to start motion
|
|
startBtn := widget.NewButton("Start", func() {
|
|
// if motion is started
|
|
if started {
|
|
// Do nothing
|
|
return
|
|
}
|
|
// Set motion started
|
|
started = true
|
|
// Watch motion values
|
|
motionCh, err := client.WatchMotion(ctx)
|
|
if err != nil {
|
|
guiErr(err, "Error getting heart rate channel", true, parent)
|
|
}
|
|
// Create done channel
|
|
done := make(chan struct{}, 1)
|
|
go func() {
|
|
for {
|
|
select {
|
|
case <-done:
|
|
return
|
|
case motion := <-motionCh:
|
|
// Set labels to new values
|
|
xCoordLbl.Text = strconv.Itoa(int(motion.X))
|
|
yCoordLbl.Text = strconv.Itoa(int(motion.Y))
|
|
zCoordLbl.Text = strconv.Itoa(int(motion.Z))
|
|
// Refresh labels to display new values
|
|
xCoordLbl.Refresh()
|
|
yCoordLbl.Refresh()
|
|
zCoordLbl.Refresh()
|
|
}
|
|
}
|
|
}()
|
|
// Create stop function
|
|
stopBtn.OnTapped = func() {
|
|
done <- struct{}{}
|
|
started = false
|
|
cancel()
|
|
}
|
|
|
|
})
|
|
// Run stop button function on close if possible
|
|
onClose = append(onClose, func() {
|
|
if stopBtn.OnTapped != nil {
|
|
stopBtn.OnTapped()
|
|
}
|
|
})
|
|
|
|
// Return new container containing all elements
|
|
return container.NewVBox(
|
|
// Add rectangle for a bit of padding
|
|
canvas.NewRectangle(color.Transparent),
|
|
startBtn,
|
|
stopBtn,
|
|
xCoordSect,
|
|
yCoordSect,
|
|
zCoordSect,
|
|
)
|
|
}
|