forked from Elara6331/itd
		
	Add BLE FS to API package
This commit is contained in:
		
							
								
								
									
										95
									
								
								api/fs.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								api/fs.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | |||||||
|  | package api | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/mitchellh/mapstructure" | ||||||
|  | 	"go.arsenm.dev/itd/internal/types" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func (c *Client) Rename(old, new string) error { | ||||||
|  | 	_, err := c.request(types.Request{ | ||||||
|  | 		Type: types.ReqTypeFS, | ||||||
|  | 		Data: types.ReqDataFS{ | ||||||
|  | 			Type:  types.FSTypeMove, | ||||||
|  | 			Files: []string{old, new}, | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *Client) Remove(path string) error { | ||||||
|  | 	_, err := c.request(types.Request{ | ||||||
|  | 		Type: types.ReqTypeFS, | ||||||
|  | 		Data: types.ReqDataFS{ | ||||||
|  | 			Type:  types.FSTypeDelete, | ||||||
|  | 			Files: []string{path}, | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *Client) Mkdir(path string) error { | ||||||
|  | 	_, err := c.request(types.Request{ | ||||||
|  | 		Type: types.ReqTypeFS, | ||||||
|  | 		Data: types.ReqDataFS{ | ||||||
|  | 			Type:  types.FSTypeMkdir, | ||||||
|  | 			Files: []string{path}, | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *Client) ReadDir(path string) ([]types.FileInfo, error) { | ||||||
|  | 	res, err := c.request(types.Request{ | ||||||
|  | 		Type: types.ReqTypeFS, | ||||||
|  | 		Data: types.ReqDataFS{ | ||||||
|  | 			Type:  types.FSTypeList, | ||||||
|  | 			Files: []string{path}, | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	var out []types.FileInfo | ||||||
|  | 	err = mapstructure.Decode(res.Value, &out) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return out, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *Client) ReadFile(path string) (string, error) { | ||||||
|  | 	res, err := c.request(types.Request{ | ||||||
|  | 		Type: types.ReqTypeFS, | ||||||
|  | 		Data: types.ReqDataFS{ | ||||||
|  | 			Type:  types.FSTypeRead, | ||||||
|  | 			Files: []string{path}, | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	return res.Value.(string), nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *Client) WriteFile(path, data string) error { | ||||||
|  | 	_, err := c.request(types.Request{ | ||||||
|  | 		Type: types.ReqTypeFS, | ||||||
|  | 		Data: types.ReqDataFS{ | ||||||
|  | 			Type:  types.FSTypeRead, | ||||||
|  | 			Files: []string{path}, | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
| @@ -1,5 +1,10 @@ | |||||||
| package types | package types | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"strconv" | ||||||
|  | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| 	ReqTypeHeartRate = iota | 	ReqTypeHeartRate = iota | ||||||
| 	ReqTypeBattLevel | 	ReqTypeBattLevel | ||||||
| @@ -33,9 +38,9 @@ const ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| type ReqDataFS struct { | type ReqDataFS struct { | ||||||
| 	Type  int `json:"type"` | 	Type  int      `json:"type"` | ||||||
| 	Files []string `json:"files"` | 	Files []string `json:"files"` | ||||||
| 	Data  string `json:"data,omitempty"` | 	Data  string   `json:"data,omitempty"` | ||||||
| } | } | ||||||
|  |  | ||||||
| type ReqDataFwUpgrade struct { | type ReqDataFwUpgrade struct { | ||||||
| @@ -74,8 +79,64 @@ type MotionValues struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| type FileInfo struct { | type FileInfo struct { | ||||||
| 	Name string `json:"name"` | 	Name  string `json:"name"` | ||||||
| 	Size int64 `json:"size"` | 	Size  int64  `json:"size"` | ||||||
| 	IsDir bool `json:"isDir"` | 	IsDir bool   `json:"isDir"` | ||||||
| 	 | } | ||||||
| } |  | ||||||
|  | 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 | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user