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}