87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func (a *App) cachedDevices(host string) ([]Device, error) {
|
|
host = strings.TrimSpace(host)
|
|
if host == "" {
|
|
host = a.settings.DefaultFlashHost
|
|
}
|
|
a.mu.RLock()
|
|
snapshot, ok := a.deviceStore[host]
|
|
a.mu.RUnlock()
|
|
if !ok {
|
|
return nil, nil
|
|
}
|
|
if strings.TrimSpace(snapshot.Err) != "" {
|
|
return cloneDevices(snapshot.Devices), errors.New(snapshot.Err)
|
|
}
|
|
return cloneDevices(snapshot.Devices), nil
|
|
}
|
|
|
|
func (a *App) recordDevices(host string, devices []Device, err error) {
|
|
host = strings.TrimSpace(host)
|
|
if host == "" {
|
|
host = a.settings.DefaultFlashHost
|
|
}
|
|
snapshot := deviceSnapshot{
|
|
Devices: cloneDevices(devices),
|
|
CheckedAt: time.Now().UTC(),
|
|
}
|
|
if err != nil {
|
|
snapshot.Err = err.Error()
|
|
}
|
|
a.mu.Lock()
|
|
if existing, ok := a.deviceStore[host]; ok && len(snapshot.Devices) == 0 {
|
|
snapshot.Devices = cloneDevices(existing.Devices)
|
|
}
|
|
a.deviceStore[host] = snapshot
|
|
a.mu.Unlock()
|
|
}
|
|
|
|
func deviceScore(device Device) int {
|
|
score := 0
|
|
model := strings.ToLower(strings.TrimSpace(device.Model))
|
|
switch {
|
|
case strings.Contains(model, "microsd"), strings.Contains(model, "micro sd"):
|
|
score += 60
|
|
case strings.Contains(model, "sdxc"), strings.Contains(model, "sdhc"), strings.Contains(model, "sd "):
|
|
score += 50
|
|
case strings.Contains(model, "card"), strings.Contains(model, "reader"):
|
|
score += 40
|
|
}
|
|
if device.Removable {
|
|
score += 20
|
|
}
|
|
if device.Hotplug {
|
|
score += 10
|
|
}
|
|
if device.Transport == "usb" {
|
|
score += 5
|
|
}
|
|
if strings.HasPrefix(device.Name, "mmcblk") {
|
|
score += 25
|
|
}
|
|
return score
|
|
}
|
|
|
|
func moveToFront(values []string, preferred string) []string {
|
|
if preferred == "" || len(values) < 2 {
|
|
return values
|
|
}
|
|
out := append([]string{}, values...)
|
|
for idx, value := range out {
|
|
if value != preferred {
|
|
continue
|
|
}
|
|
copy(out[1:idx+1], out[:idx])
|
|
out[0] = preferred
|
|
return out
|
|
}
|
|
return out
|
|
}
|