forked from Elara6331/itd
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package api
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"strconv"
 | 
						|
)
 | 
						|
 | 
						|
type UpgradeType uint8
 | 
						|
 | 
						|
const (
 | 
						|
	UpgradeTypeArchive UpgradeType = iota
 | 
						|
	UpgradeTypeFiles
 | 
						|
)
 | 
						|
 | 
						|
type FSData struct {
 | 
						|
	Files []string
 | 
						|
	Data  string
 | 
						|
}
 | 
						|
 | 
						|
type FwUpgradeData struct {
 | 
						|
	Type  UpgradeType
 | 
						|
	Files []string
 | 
						|
}
 | 
						|
 | 
						|
type NotifyData struct {
 | 
						|
	Title string
 | 
						|
	Body  string
 | 
						|
}
 | 
						|
 | 
						|
type FSTransferProgress struct {
 | 
						|
	Total uint32
 | 
						|
	Sent  uint32
 | 
						|
}
 | 
						|
 | 
						|
type FileInfo struct {
 | 
						|
	Name  string
 | 
						|
	Size  int64
 | 
						|
	IsDir bool
 | 
						|
}
 | 
						|
 | 
						|
func (fi FileInfo) String() string {
 | 
						|
	var isDirChar rune
 | 
						|
	if fi.IsDir {
 | 
						|
		isDirChar = 'd'
 | 
						|
	} else {
 | 
						|
		isDirChar = '-'
 | 
						|
	}
 | 
						|
 | 
						|
	// Get human-readable value for file size
 | 
						|
	val, unit := bytesHuman(fi.Size)
 | 
						|
	prec := 0
 | 
						|
	// If value is less than 10, set precision to 1
 | 
						|
	if val < 10 {
 | 
						|
		prec = 1
 | 
						|
	}
 | 
						|
	// Convert float to string
 | 
						|
	valStr := strconv.FormatFloat(val, 'f', prec, 64)
 | 
						|
 | 
						|
	// Return string formatted like so:
 | 
						|
	// -  10 kB file
 | 
						|
	// or:
 | 
						|
	// d   0 B  .
 | 
						|
	return fmt.Sprintf(
 | 
						|
		"%c %3s %-2s %s",
 | 
						|
		isDirChar,
 | 
						|
		valStr,
 | 
						|
		unit,
 | 
						|
		fi.Name,
 | 
						|
	)
 | 
						|
}
 | 
						|
 | 
						|
// bytesHuman returns a human-readable string for
 | 
						|
// the amount of bytes inputted.
 | 
						|
func bytesHuman(b int64) (float64, string) {
 | 
						|
	const unit = 1000
 | 
						|
	// Set possible units prefixes (PineTime flash is 4MB)
 | 
						|
	units := [2]rune{'k', 'M'}
 | 
						|
	// If amount of bytes is less than smallest unit
 | 
						|
	if b < unit {
 | 
						|
		// Return unchanged with unit "B"
 | 
						|
		return float64(b), "B"
 | 
						|
	}
 | 
						|
 | 
						|
	div, exp := int64(unit), 0
 | 
						|
	// Get decimal values and unit prefix index
 | 
						|
	for n := b / unit; n >= unit; n /= unit {
 | 
						|
		div *= unit
 | 
						|
		exp++
 | 
						|
	}
 | 
						|
 | 
						|
	// Create string for full unit
 | 
						|
	unitStr := string([]rune{units[exp], 'B'})
 | 
						|
 | 
						|
	// Return decimal with unit string
 | 
						|
	return float64(b) / float64(div), unitStr
 | 
						|
}
 |