1package config
2
3import (
4 "odoki/comms"
5 "odoki/constants"
6 "odoki/ui/components"
7 "slices"
8
9 "fyne.io/fyne/v2"
10 "fyne.io/fyne/v2/canvas"
11 "fyne.io/fyne/v2/container"
12 "fyne.io/fyne/v2/layout"
13 "fyne.io/fyne/v2/theme"
14 "fyne.io/fyne/v2/widget"
15 "tinygo.org/x/bluetooth"
16)
17
18type data struct {
19 discoveredAdresses []bluetooth.Address
20}
21
22var appdata data
23
24func handleDeviceDiscovered(selectWidget *widget.Select, adapter *bluetooth.Adapter, device bluetooth.ScanResult) {
25 //println("found device:", device.Address.String(), device.RSSI, device.LocalName())
26 stylizedName := "(" + device.LocalName() + ")[" + device.Address.String() + "]"
27 if !slices.Contains(appdata.discoveredAdresses, device.Address) {
28 selectWidget.Options = append(selectWidget.Options, stylizedName)
29 appdata.discoveredAdresses = append(appdata.discoveredAdresses, device.Address)
30 }
31}
32
33func Widget() fyne.CanvasObject {
34 connectionStatus := canvas.NewText("Connection status: Disconnected", theme.ForegroundColor())
35 devicesSelection := widget.NewSelect([]string{}, func(string) {})
36 scanButton := widget.NewButton("Scan", func() {
37 appdata.discoveredAdresses = []bluetooth.Address{}
38 go comms.Scan(devicesSelection, handleDeviceDiscovered)
39 })
40 scanContainer := container.New(layout.NewFormLayout(), scanButton, devicesSelection)
41 return container.NewPadded(container.NewVBox(
42 components.TabTitle("Config"),
43 connectionStatus,
44 scanContainer,
45 widget.NewButton("Connect", func() {
46 if len(appdata.discoveredAdresses) != 0 {
47 comms.Connect(appdata.discoveredAdresses[devicesSelection.SelectedIndex()])
48 if comms.Connected {
49 connectionStatus.Text = "Connection status: Connected"
50 connectionStatus.Color = constants.SuccessColor
51 } else {
52 connectionStatus.Text = "Connection status: Connection error"
53 connectionStatus.Color = constants.ErrorColor
54 }
55 } else {
56 connectionStatus.Text = "Connection status: No devices found yet!"
57 connectionStatus.Color = constants.ErrorColor
58 }
59 connectionStatus.Refresh()
60 }),
61 ))
62}