Compare commits
	
		
			2 Commits
		
	
	
		
			be5bdc625b
			...
			9d58ea0ae7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9d58ea0ae7 | |||
| 76875db7ea | 
@@ -48,7 +48,7 @@ func (c *Client) BatteryLevel() (uint8, error) {
 | 
				
			|||||||
func (c *Client) WatchBatteryLevel() (<-chan uint8, func(), error) {
 | 
					func (c *Client) WatchBatteryLevel() (<-chan uint8, func(), error) {
 | 
				
			||||||
	c.battLevelCh = make(chan types.Response, 2)
 | 
						c.battLevelCh = make(chan types.Response, 2)
 | 
				
			||||||
	err := c.requestNoRes(types.Request{
 | 
						err := c.requestNoRes(types.Request{
 | 
				
			||||||
		Type: types.ReqTypeBattLevel,
 | 
							Type: types.ReqTypeWatchBattLevel,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, nil, err
 | 
							return nil, nil, err
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +1,17 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bufio"
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"image/color"
 | 
						"image/color"
 | 
				
			||||||
	"net"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"fyne.io/fyne/v2"
 | 
						"fyne.io/fyne/v2"
 | 
				
			||||||
	"fyne.io/fyne/v2/canvas"
 | 
						"fyne.io/fyne/v2/canvas"
 | 
				
			||||||
	"fyne.io/fyne/v2/container"
 | 
						"fyne.io/fyne/v2/container"
 | 
				
			||||||
	"fyne.io/fyne/v2/theme"
 | 
						"fyne.io/fyne/v2/theme"
 | 
				
			||||||
	"go.arsenm.dev/itd/internal/types"
 | 
						"go.arsenm.dev/itd/api"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func infoTab(parent fyne.Window) *fyne.Container {
 | 
					func infoTab(parent fyne.Window, client *api.Client) *fyne.Container {
 | 
				
			||||||
	infoLayout := container.NewVBox(
 | 
						infoLayout := container.NewVBox(
 | 
				
			||||||
		// Add rectangle for a bit of padding
 | 
							// Add rectangle for a bit of padding
 | 
				
			||||||
		canvas.NewRectangle(color.Transparent),
 | 
							canvas.NewRectangle(color.Transparent),
 | 
				
			||||||
@@ -25,20 +20,50 @@ func infoTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
	// Create label for heart rate
 | 
						// Create label for heart rate
 | 
				
			||||||
	heartRateLbl := newText("0 BPM", 24)
 | 
						heartRateLbl := newText("0 BPM", 24)
 | 
				
			||||||
	// Creae container to store heart rate section
 | 
						// Creae container to store heart rate section
 | 
				
			||||||
	heartRate := container.NewVBox(
 | 
						heartRateSect := container.NewVBox(
 | 
				
			||||||
		newText("Heart Rate", 12),
 | 
							newText("Heart Rate", 12),
 | 
				
			||||||
		heartRateLbl,
 | 
							heartRateLbl,
 | 
				
			||||||
		canvas.NewLine(theme.ShadowColor()),
 | 
							canvas.NewLine(theme.ShadowColor()),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	infoLayout.Add(heartRate)
 | 
						infoLayout.Add(heartRateSect)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Watch for heart rate updates
 | 
						heartRateCh, cancel, err := client.WatchHeartRate()
 | 
				
			||||||
	go watch(types.ReqTypeWatchHeartRate, func(data interface{}) {
 | 
						if err != nil {
 | 
				
			||||||
		// Change text of heart rate label
 | 
							guiErr(err, "Error getting heart rate channel", true, parent)
 | 
				
			||||||
		heartRateLbl.Text = fmt.Sprintf("%d BPM", int(data.(float64)))
 | 
						}
 | 
				
			||||||
		// Refresh label
 | 
						onClose = append(onClose, cancel)
 | 
				
			||||||
		heartRateLbl.Refresh()
 | 
						go func() {
 | 
				
			||||||
	}, parent)
 | 
							for heartRate := range heartRateCh {
 | 
				
			||||||
 | 
								// Change text of heart rate label
 | 
				
			||||||
 | 
								heartRateLbl.Text = fmt.Sprintf("%d BPM", heartRate)
 | 
				
			||||||
 | 
								// Refresh label
 | 
				
			||||||
 | 
								heartRateLbl.Refresh()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create label for heart rate
 | 
				
			||||||
 | 
						stepCountLbl := newText("0 Steps", 24)
 | 
				
			||||||
 | 
						// Creae container to store heart rate section
 | 
				
			||||||
 | 
						stepCountSect := container.NewVBox(
 | 
				
			||||||
 | 
							newText("Step Count", 12),
 | 
				
			||||||
 | 
							stepCountLbl,
 | 
				
			||||||
 | 
							canvas.NewLine(theme.ShadowColor()),
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						infoLayout.Add(stepCountSect)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						stepCountCh, cancel, err := client.WatchStepCount()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							guiErr(err, "Error getting step count channel", true, parent)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						onClose = append(onClose, cancel)
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							for stepCount := range stepCountCh {
 | 
				
			||||||
 | 
								// Change text of heart rate label
 | 
				
			||||||
 | 
								stepCountLbl.Text = fmt.Sprintf("%d Steps", stepCount)
 | 
				
			||||||
 | 
								// Refresh label
 | 
				
			||||||
 | 
								stepCountLbl.Refresh()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create label for battery level
 | 
						// Create label for battery level
 | 
				
			||||||
	battLevelLbl := newText("0%", 24)
 | 
						battLevelLbl := newText("0%", 24)
 | 
				
			||||||
@@ -50,32 +75,40 @@ func infoTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
	)
 | 
						)
 | 
				
			||||||
	infoLayout.Add(battLevel)
 | 
						infoLayout.Add(battLevel)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Watch for changes in battery level
 | 
						battLevelCh, cancel, err := client.WatchBatteryLevel()
 | 
				
			||||||
	go watch(types.ReqTypeWatchBattLevel, func(data interface{}) {
 | 
						if err != nil {
 | 
				
			||||||
		battLevelLbl.Text = fmt.Sprintf("%d%%", int(data.(float64)))
 | 
							guiErr(err, "Error getting battery level channel", true, parent)
 | 
				
			||||||
		battLevelLbl.Refresh()
 | 
						}
 | 
				
			||||||
	}, parent)
 | 
						onClose = append(onClose, cancel)
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							for battLevel := range battLevelCh {
 | 
				
			||||||
 | 
								// Change text of battery level label
 | 
				
			||||||
 | 
								battLevelLbl.Text = fmt.Sprintf("%d%%", battLevel)
 | 
				
			||||||
 | 
								// Refresh label
 | 
				
			||||||
 | 
								battLevelLbl.Refresh()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fwVerString, err := get(types.ReqTypeFwVersion)
 | 
						fwVerString, err := client.Version()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		guiErr(err, "Error getting firmware string", true, parent)
 | 
							guiErr(err, "Error getting firmware string", true, parent)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fwVer := container.NewVBox(
 | 
						fwVer := container.NewVBox(
 | 
				
			||||||
		newText("Firmware Version", 12),
 | 
							newText("Firmware Version", 12),
 | 
				
			||||||
		newText(fwVerString.(string), 24),
 | 
							newText(fwVerString, 24),
 | 
				
			||||||
		canvas.NewLine(theme.ShadowColor()),
 | 
							canvas.NewLine(theme.ShadowColor()),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	infoLayout.Add(fwVer)
 | 
						infoLayout.Add(fwVer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	btAddrString, err := get(types.ReqTypeBtAddress)
 | 
						btAddrString, err := client.Address()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	btAddr := container.NewVBox(
 | 
						btAddr := container.NewVBox(
 | 
				
			||||||
		newText("Bluetooth Address", 12),
 | 
							newText("Bluetooth Address", 12),
 | 
				
			||||||
		newText(btAddrString.(string), 24),
 | 
							newText(btAddrString, 24),
 | 
				
			||||||
		canvas.NewLine(theme.ShadowColor()),
 | 
							canvas.NewLine(theme.ShadowColor()),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	infoLayout.Add(btAddr)
 | 
						infoLayout.Add(btAddr)
 | 
				
			||||||
@@ -83,65 +116,6 @@ func infoTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
	return infoLayout
 | 
						return infoLayout
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func watch(req int, onRecv func(data interface{}), parent fyne.Window) error {
 | 
					 | 
				
			||||||
	conn, err := net.Dial("unix", SockPath)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer conn.Close()
 | 
					 | 
				
			||||||
	err = json.NewEncoder(conn).Encode(types.Request{
 | 
					 | 
				
			||||||
		Type: req,
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	scanner := bufio.NewScanner(conn)
 | 
					 | 
				
			||||||
	for scanner.Scan() {
 | 
					 | 
				
			||||||
		res, err := getResp(scanner.Bytes())
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			guiErr(err, "Error getting response from connection", false, parent)
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		onRecv(res.Value)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func get(req int) (interface{}, error) {
 | 
					 | 
				
			||||||
	conn, err := net.Dial("unix", SockPath)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer conn.Close()
 | 
					 | 
				
			||||||
	err = json.NewEncoder(conn).Encode(types.Request{
 | 
					 | 
				
			||||||
		Type: req,
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	line, _, err := bufio.NewReader(conn).ReadLine()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	res, err := getResp(line)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return res.Value, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func getResp(line []byte) (*types.Response, error) {
 | 
					 | 
				
			||||||
	var res types.Response
 | 
					 | 
				
			||||||
	err := json.Unmarshal(line, &res)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if res.Error {
 | 
					 | 
				
			||||||
		return nil, errors.New(res.Message)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return &res, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func newText(t string, size float32) *canvas.Text {
 | 
					func newText(t string, size float32) *canvas.Text {
 | 
				
			||||||
	text := canvas.NewText(t, theme.ForegroundColor())
 | 
						text := canvas.NewText(t, theme.ForegroundColor())
 | 
				
			||||||
	text.TextSize = size
 | 
						text.TextSize = size
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,31 +1,38 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"fyne.io/fyne/v2/app"
 | 
						"fyne.io/fyne/v2/app"
 | 
				
			||||||
	"fyne.io/fyne/v2/container"
 | 
						"fyne.io/fyne/v2/container"
 | 
				
			||||||
 | 
						"go.arsenm.dev/itd/api"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SockPath = "/tmp/itd/socket"
 | 
					var onClose []func()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	// Create new app
 | 
						// Create new app
 | 
				
			||||||
	a := app.New()
 | 
						a := app.New()
 | 
				
			||||||
	// Create new window with title "itgui"
 | 
						// Create new window with title "itgui"
 | 
				
			||||||
	window := a.NewWindow("itgui")
 | 
						window := a.NewWindow("itgui")
 | 
				
			||||||
 | 
						window.SetOnClosed(func() {
 | 
				
			||||||
 | 
							for _, closeFn := range onClose {
 | 
				
			||||||
 | 
								closeFn()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, err := net.Dial("unix", SockPath)
 | 
						client, err := api.New(api.DefaultAddr)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		guiErr(err, "Error dialing itd socket", true, window)
 | 
							guiErr(err, "Error connecting to itd", true, window)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						onClose = append(onClose, func() {
 | 
				
			||||||
 | 
							client.Close()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create new app tabs container
 | 
						// Create new app tabs container
 | 
				
			||||||
	tabs := container.NewAppTabs(
 | 
						tabs := container.NewAppTabs(
 | 
				
			||||||
		container.NewTabItem("Info", infoTab(window)),
 | 
							container.NewTabItem("Info", infoTab(window, client)),
 | 
				
			||||||
		container.NewTabItem("Notify", notifyTab(window)),
 | 
							container.NewTabItem("Notify", notifyTab(window, client)),
 | 
				
			||||||
		container.NewTabItem("Set Time", timeTab(window)),
 | 
							container.NewTabItem("Set Time", timeTab(window, client)),
 | 
				
			||||||
		container.NewTabItem("Upgrade", upgradeTab(window)),
 | 
							container.NewTabItem("Upgrade", upgradeTab(window, client)),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Set tabs as window content
 | 
						// Set tabs as window content
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,17 +1,14 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"net"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"fyne.io/fyne/v2"
 | 
						"fyne.io/fyne/v2"
 | 
				
			||||||
	"fyne.io/fyne/v2/container"
 | 
						"fyne.io/fyne/v2/container"
 | 
				
			||||||
	"fyne.io/fyne/v2/layout"
 | 
						"fyne.io/fyne/v2/layout"
 | 
				
			||||||
	"fyne.io/fyne/v2/widget"
 | 
						"fyne.io/fyne/v2/widget"
 | 
				
			||||||
	"go.arsenm.dev/itd/internal/types"
 | 
						"go.arsenm.dev/itd/api"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func notifyTab(parent fyne.Window) *fyne.Container {
 | 
					func notifyTab(parent fyne.Window, client *api.Client) *fyne.Container {
 | 
				
			||||||
	// Create new entry for notification title
 | 
						// Create new entry for notification title
 | 
				
			||||||
	titleEntry := widget.NewEntry()
 | 
						titleEntry := widget.NewEntry()
 | 
				
			||||||
	titleEntry.SetPlaceHolder("Title")
 | 
						titleEntry.SetPlaceHolder("Title")
 | 
				
			||||||
@@ -22,20 +19,11 @@ func notifyTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Create new button to send notification
 | 
						// Create new button to send notification
 | 
				
			||||||
	sendBtn := widget.NewButton("Send", func() {
 | 
						sendBtn := widget.NewButton("Send", func() {
 | 
				
			||||||
		// Dial itd UNIX socket
 | 
							err := client.Notify(titleEntry.Text, bodyEntry.Text)
 | 
				
			||||||
		conn, err := net.Dial("unix", SockPath)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			guiErr(err, "Error dialing socket", false, parent)
 | 
								guiErr(err, "Error sending notification", false, parent)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Encode notify request on connection
 | 
					 | 
				
			||||||
		json.NewEncoder(conn).Encode(types.Request{
 | 
					 | 
				
			||||||
			Type: types.ReqTypeNotify,
 | 
					 | 
				
			||||||
			Data: types.ReqDataNotify{
 | 
					 | 
				
			||||||
				Title: titleEntry.Text,
 | 
					 | 
				
			||||||
				Body:  bodyEntry.Text,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Return new container containing all elements
 | 
						// Return new container containing all elements
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,18 +1,16 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"net"
 | 
					 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"fyne.io/fyne/v2"
 | 
						"fyne.io/fyne/v2"
 | 
				
			||||||
	"fyne.io/fyne/v2/container"
 | 
						"fyne.io/fyne/v2/container"
 | 
				
			||||||
	"fyne.io/fyne/v2/layout"
 | 
						"fyne.io/fyne/v2/layout"
 | 
				
			||||||
	"fyne.io/fyne/v2/widget"
 | 
						"fyne.io/fyne/v2/widget"
 | 
				
			||||||
	"go.arsenm.dev/itd/internal/types"
 | 
						"go.arsenm.dev/itd/api"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func timeTab(parent fyne.Window) *fyne.Container {
 | 
					func timeTab(parent fyne.Window, client *api.Client) *fyne.Container {
 | 
				
			||||||
	// Create new entry for time string
 | 
						// Create new entry for time string
 | 
				
			||||||
	timeEntry := widget.NewEntry()
 | 
						timeEntry := widget.NewEntry()
 | 
				
			||||||
	// Set text to current time formatter properly
 | 
						// Set text to current time formatter properly
 | 
				
			||||||
@@ -21,7 +19,7 @@ func timeTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
	// Create button to set current time
 | 
						// Create button to set current time
 | 
				
			||||||
	currentBtn := widget.NewButton("Set Current", func() {
 | 
						currentBtn := widget.NewButton("Set Current", func() {
 | 
				
			||||||
		timeEntry.SetText(time.Now().Format(time.RFC1123))
 | 
							timeEntry.SetText(time.Now().Format(time.RFC1123))
 | 
				
			||||||
		setTime(true)
 | 
							setTime(client, true)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create button to set time inside entry
 | 
						// Create button to set time inside entry
 | 
				
			||||||
@@ -33,7 +31,7 @@ func timeTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Set time to parsed time
 | 
							// Set time to parsed time
 | 
				
			||||||
		setTime(false, parsedTime)
 | 
							setTime(client, false, parsedTime)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Return new container with all elements centered
 | 
						// Return new container with all elements centered
 | 
				
			||||||
@@ -48,30 +46,13 @@ func timeTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// setTime sets the first element in the variadic parameter
 | 
					// setTime sets the first element in the variadic parameter
 | 
				
			||||||
// if current is false, otherwise, it sets the current time.
 | 
					// if current is false, otherwise, it sets the current time.
 | 
				
			||||||
func setTime(current bool, t ...time.Time) error {
 | 
					func setTime(client *api.Client, current bool, t ...time.Time) error {
 | 
				
			||||||
	// Dial UNIX socket
 | 
						var err error
 | 
				
			||||||
	conn, err := net.Dial("unix", SockPath)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer conn.Close()
 | 
					 | 
				
			||||||
	var data string
 | 
					 | 
				
			||||||
	// If current is true, use the string "now"
 | 
					 | 
				
			||||||
	// otherwise, use the formatted time from the
 | 
					 | 
				
			||||||
	// first element in the variadic parameter.
 | 
					 | 
				
			||||||
	// "now" is more accurate than formatting
 | 
					 | 
				
			||||||
	// current time as only seconds are preserved
 | 
					 | 
				
			||||||
	// in that case.
 | 
					 | 
				
			||||||
	if current {
 | 
						if current {
 | 
				
			||||||
		data = "now"
 | 
							err = client.SetTimeNow()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		data = t[0].Format(time.RFC3339)
 | 
							err = client.SetTime(t[0])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Encode SetTime request with above data
 | 
					 | 
				
			||||||
	err = json.NewEncoder(conn).Encode(types.Request{
 | 
					 | 
				
			||||||
		Type: types.ReqTypeSetTime,
 | 
					 | 
				
			||||||
		Data: data,
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,7 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bufio"
 | 
					 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net"
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"fyne.io/fyne/v2"
 | 
						"fyne.io/fyne/v2"
 | 
				
			||||||
@@ -13,11 +10,11 @@ import (
 | 
				
			|||||||
	"fyne.io/fyne/v2/layout"
 | 
						"fyne.io/fyne/v2/layout"
 | 
				
			||||||
	"fyne.io/fyne/v2/storage"
 | 
						"fyne.io/fyne/v2/storage"
 | 
				
			||||||
	"fyne.io/fyne/v2/widget"
 | 
						"fyne.io/fyne/v2/widget"
 | 
				
			||||||
	"github.com/mitchellh/mapstructure"
 | 
						"go.arsenm.dev/itd/api"
 | 
				
			||||||
	"go.arsenm.dev/itd/internal/types"
 | 
						"go.arsenm.dev/itd/internal/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func upgradeTab(parent fyne.Window) *fyne.Container {
 | 
					func upgradeTab(parent fyne.Window, client *api.Client) *fyne.Container {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		archivePath  string
 | 
							archivePath  string
 | 
				
			||||||
		firmwarePath string
 | 
							firmwarePath string
 | 
				
			||||||
@@ -117,7 +114,7 @@ func upgradeTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
		// Resize modal to 300x100
 | 
							// Resize modal to 300x100
 | 
				
			||||||
		progressDlg.Resize(fyne.NewSize(300, 100))
 | 
							progressDlg.Resize(fyne.NewSize(300, 100))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var fwUpgType int
 | 
							var fwUpgType api.UpgradeType
 | 
				
			||||||
		var files []string
 | 
							var files []string
 | 
				
			||||||
		// Get appropriate upgrade type and file paths
 | 
							// Get appropriate upgrade type and file paths
 | 
				
			||||||
		switch upgradeTypeSelect.Selected {
 | 
							switch upgradeTypeSelect.Selected {
 | 
				
			||||||
@@ -129,48 +126,18 @@ func upgradeTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
			files = append(files, initPktPath, firmwarePath)
 | 
								files = append(files, initPktPath, firmwarePath)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Dial itd UNIX socket
 | 
							progress, err := client.FirmwareUpgrade(fwUpgType, files...)
 | 
				
			||||||
		conn, err := net.Dial("unix", SockPath)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			guiErr(err, "Error dialing socket", false, parent)
 | 
								guiErr(err, "Error initiating DFU", false, parent)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		defer conn.Close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Encode firmware upgrade request to connection
 | 
					 | 
				
			||||||
		json.NewEncoder(conn).Encode(types.Request{
 | 
					 | 
				
			||||||
			Type: types.ReqTypeFwUpgrade,
 | 
					 | 
				
			||||||
			Data: types.ReqDataFwUpgrade{
 | 
					 | 
				
			||||||
				Type:  fwUpgType,
 | 
					 | 
				
			||||||
				Files: files,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Show progress dialog
 | 
							// Show progress dialog
 | 
				
			||||||
		progressDlg.Show()
 | 
							progressDlg.Show()
 | 
				
			||||||
		// Hide progress dialog after completion
 | 
							// Hide progress dialog after completion
 | 
				
			||||||
		defer progressDlg.Hide()
 | 
							defer progressDlg.Hide()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		scanner := bufio.NewScanner(conn)
 | 
							for event := range progress {
 | 
				
			||||||
		for scanner.Scan() {
 | 
					 | 
				
			||||||
			var res types.Response
 | 
					 | 
				
			||||||
			// Decode scanned line into response struct
 | 
					 | 
				
			||||||
			err = json.Unmarshal(scanner.Bytes(), &res)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				guiErr(err, "Error decoding response", false, parent)
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if res.Error {
 | 
					 | 
				
			||||||
				guiErr(err, "Error returned in response", false, parent)
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var event types.DFUProgress
 | 
					 | 
				
			||||||
			// Decode response data into progress struct
 | 
					 | 
				
			||||||
			err = mapstructure.Decode(res.Value, &event)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				guiErr(err, "Error decoding response value", false, parent)
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			// Set label text to received / total B
 | 
								// Set label text to received / total B
 | 
				
			||||||
			progressLbl.SetText(fmt.Sprintf("%d / %d B", event.Received, event.Total))
 | 
								progressLbl.SetText(fmt.Sprintf("%d / %d B", event.Received, event.Total))
 | 
				
			||||||
			// Set progress bar values
 | 
								// Set progress bar values
 | 
				
			||||||
@@ -179,7 +146,7 @@ func upgradeTab(parent fyne.Window) *fyne.Container {
 | 
				
			|||||||
			// Refresh progress bar
 | 
								// Refresh progress bar
 | 
				
			||||||
			progressBar.Refresh()
 | 
								progressBar.Refresh()
 | 
				
			||||||
			// If transfer finished, break
 | 
								// If transfer finished, break
 | 
				
			||||||
			if event.Received == event.Total {
 | 
								if event.Sent == event.Total {
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user