forked from Elara6331/itd
		
	
		
			
				
	
	
		
			164 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
 | 
						|
	"fyne.io/fyne/v2"
 | 
						|
	"fyne.io/fyne/v2/container"
 | 
						|
	"fyne.io/fyne/v2/dialog"
 | 
						|
	"fyne.io/fyne/v2/layout"
 | 
						|
	"fyne.io/fyne/v2/storage"
 | 
						|
	"fyne.io/fyne/v2/widget"
 | 
						|
	"go.arsenm.dev/itd/api"
 | 
						|
)
 | 
						|
 | 
						|
func firmwareTab(ctx context.Context, client *api.Client, w fyne.Window) fyne.CanvasObject {
 | 
						|
	// Create select to chose between archive and files upgrade
 | 
						|
	typeSelect := widget.NewSelect([]string{"Archive", "Files"}, nil)
 | 
						|
	typeSelect.PlaceHolder = "Upgrade Type"
 | 
						|
 | 
						|
	// Create map to store files
 | 
						|
	files := map[string]string{}
 | 
						|
 | 
						|
	// Create and disable start button
 | 
						|
	startBtn := widget.NewButton("Start", nil)
 | 
						|
	startBtn.Disable()
 | 
						|
 | 
						|
	// Create new file open dialog for archive
 | 
						|
	archiveDlg := dialog.NewFileOpen(func(uc fyne.URIReadCloser, err error) {
 | 
						|
		if err != nil || uc == nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
		defer uc.Close()
 | 
						|
		// Set archive path in map
 | 
						|
		files[".zip"] = uc.URI().Path()
 | 
						|
		// Enable start button
 | 
						|
		startBtn.Enable()
 | 
						|
	}, w)
 | 
						|
	// Only allow .zip files
 | 
						|
	archiveDlg.SetFilter(storage.NewExtensionFileFilter([]string{".zip"}))
 | 
						|
	// Create button to show dialog
 | 
						|
	archiveBtn := widget.NewButton("Select Archive (.zip)", archiveDlg.Show)
 | 
						|
 | 
						|
	// Create new file open dialog for firmware image
 | 
						|
	imageDlg := dialog.NewFileOpen(func(uc fyne.URIReadCloser, err error) {
 | 
						|
		if err != nil || uc == nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
		defer uc.Close()
 | 
						|
 | 
						|
		// Set firmware image path in map
 | 
						|
		files[".bin"] = uc.URI().Path()
 | 
						|
 | 
						|
		// If the init packet was already selected
 | 
						|
		_, datOk := files[".dat"]
 | 
						|
		if datOk {
 | 
						|
			// Enable start button
 | 
						|
			startBtn.Enable()
 | 
						|
		}
 | 
						|
	}, w)
 | 
						|
	// Only allow .bin files
 | 
						|
	imageDlg.SetFilter(storage.NewExtensionFileFilter([]string{".bin"}))
 | 
						|
	// Create button to show dialog
 | 
						|
	imageBtn := widget.NewButton("Select Firmware (.bin)", imageDlg.Show)
 | 
						|
 | 
						|
	// Create new file open dialog for init packet
 | 
						|
	initDlg := dialog.NewFileOpen(func(uc fyne.URIReadCloser, err error) {
 | 
						|
		if err != nil || uc == nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
		defer uc.Close()
 | 
						|
 | 
						|
		// Set init packet path in map
 | 
						|
		files[".dat"] = uc.URI().Path()
 | 
						|
 | 
						|
		// If the firmware image was already selected
 | 
						|
		_, binOk := files[".bin"]
 | 
						|
		if binOk {
 | 
						|
			// Enable start button
 | 
						|
			startBtn.Enable()
 | 
						|
		}
 | 
						|
	}, w)
 | 
						|
	// Only allow .dat files
 | 
						|
	initDlg.SetFilter(storage.NewExtensionFileFilter([]string{".dat"}))
 | 
						|
	// Create button to show dialog
 | 
						|
	initBtn := widget.NewButton("Select Init Packet (.dat)", initDlg.Show)
 | 
						|
 | 
						|
	var upgType api.UpgradeType = 255
 | 
						|
	// When upgrade type changes
 | 
						|
	typeSelect.OnChanged = func(s string) {
 | 
						|
		// Delete all files from map
 | 
						|
		delete(files, ".bin")
 | 
						|
		delete(files, ".dat")
 | 
						|
		delete(files, ".zip")
 | 
						|
		// Hide all dialog buttons
 | 
						|
		imageBtn.Hide()
 | 
						|
		initBtn.Hide()
 | 
						|
		archiveBtn.Hide()
 | 
						|
		// Disable start button
 | 
						|
		startBtn.Disable()
 | 
						|
 | 
						|
		switch s {
 | 
						|
		case "Files":
 | 
						|
			// Set file upgrade type
 | 
						|
			upgType = api.UpgradeTypeFiles
 | 
						|
			// Show firmware image and init packet buttons
 | 
						|
			imageBtn.Show()
 | 
						|
			initBtn.Show()
 | 
						|
		case "Archive":
 | 
						|
			// Set archive upgrade type
 | 
						|
			upgType = api.UpgradeTypeArchive
 | 
						|
			// Show archive button
 | 
						|
			archiveBtn.Show()
 | 
						|
		}
 | 
						|
	}
 | 
						|
	// Select archive by default
 | 
						|
	typeSelect.SetSelectedIndex(0)
 | 
						|
 | 
						|
	// When start button pressed
 | 
						|
	startBtn.OnTapped = func() {
 | 
						|
		var args []string
 | 
						|
		// Append the appropriate files for upgrade type
 | 
						|
		switch upgType {
 | 
						|
		case api.UpgradeTypeArchive:
 | 
						|
			args = append(args, files[".zip"])
 | 
						|
		case api.UpgradeTypeFiles:
 | 
						|
			args = append(args, files[".dat"], files[".bin"])
 | 
						|
		}
 | 
						|
 | 
						|
		// If args are nil (invalid upgrade type)
 | 
						|
		if args == nil {
 | 
						|
			return
 | 
						|
		}
 | 
						|
 | 
						|
		// Create new progress dialog
 | 
						|
		progress := newProgress(w)
 | 
						|
		// Start firmware upgrade
 | 
						|
		progressCh, err := client.FirmwareUpgrade(ctx, upgType, args...)
 | 
						|
		if err != nil {
 | 
						|
			guiErr(err, "Error performing firmware upgrade", false, w)
 | 
						|
			return
 | 
						|
		}
 | 
						|
		// Show progress dialog
 | 
						|
		progress.Show()
 | 
						|
		// For every progress event
 | 
						|
		for progressEvt := range progressCh {
 | 
						|
			// Set progress bar values
 | 
						|
			progress.SetTotal(float64(progressEvt.Total))
 | 
						|
			progress.SetValue(float64(progressEvt.Sent))
 | 
						|
		}
 | 
						|
		// Hide progress dialog
 | 
						|
		progress.Hide()
 | 
						|
	}
 | 
						|
 | 
						|
	return container.NewVBox(
 | 
						|
		layout.NewSpacer(),
 | 
						|
		typeSelect,
 | 
						|
		archiveBtn,
 | 
						|
		imageBtn,
 | 
						|
		initBtn,
 | 
						|
		startBtn,
 | 
						|
		layout.NewSpacer(),
 | 
						|
	)
 | 
						|
}
 |