10 Commits

6 changed files with 47 additions and 17 deletions

View File

@@ -7,14 +7,20 @@ all:
go build $(GOFLAGS) go build $(GOFLAGS)
go build ./cmd/itctl $(GOFLAGS) go build ./cmd/itctl $(GOFLAGS)
clean:
rm -f itctl
rm -f itd
install: install:
install -Dm755 ./itd $(BIN_PREFIX)/itd install -Dm755 ./itd $(BIN_PREFIX)/itd
install -Dm755 ./itctl $(BIN_PREFIX)/itctl install -Dm755 ./itctl $(BIN_PREFIX)/itctl
install -Dm644 ./itd.service $(SERVICE_PREFIX)/itd.service install -Dm644 ./itd.service $(SERVICE_PREFIX)/itd.service
install -Dm644 ./itd.toml $(CFG_PREFIX)/itd.toml install -Dm644 ./itd.toml $(CFG_PREFIX)/itd.toml
clean: uninstall:
rm -f itctl rm $(BIN_PREFIX)/itd
rm -f itd rm $(BIN_PREFIX)/itctl
rm $(SERVICE_PREFIX)/itd.service
rm $(CFG_PREFIX)/itd.toml
.PHONY: all install clean .PHONY: all clean install uninstall

View File

@@ -3,6 +3,10 @@
`itd` is a daemon that uses my infinitime [library](https://go.arsenm.dev/infinitime) to interact with the [PineTime](https://www.pine64.org/pinetime/) running [InfiniTime](https://infinitime.io). `itd` is a daemon that uses my infinitime [library](https://go.arsenm.dev/infinitime) to interact with the [PineTime](https://www.pine64.org/pinetime/) running [InfiniTime](https://infinitime.io).
[![Build status](https://ci.appveyor.com/api/projects/status/xgj5sobw76ndqaod?svg=true)](https://ci.appveyor.com/project/moussaelianarsen/itd)
[![Binary downloads](https://img.shields.io/badge/download-binary-orange)](https://minio.arsenm.dev/minio/itd/)
[![AUR package](https://img.shields.io/aur/version/itd-git?label=itd-git&logo=archlinux)](https://aur.archlinux.org/packages/itd-git/)
--- ---
### Features ### Features
@@ -56,6 +60,24 @@ Flags:
Use "itctl [command] --help" for more information about a command. Use "itctl [command] --help" for more information about a command.
``` ```
#### Interactive mode
Running `itctl` by itself will open interactive mode. It's essentially a shell where you can enter commands. For example:
```
$ itctl
itctl> fw ver
1.3.0
itctl> get batt
81%
itctl> get heart
92 BPM
itctl> set time 2021-08-22T00:06:18-07:00
itctl> set time now
itctl> exit
```
--- ---
### Installation ### Installation

View File

@@ -60,5 +60,6 @@ var rootCmd = &cobra.Command{
// Execute adds all child commands to the root command and sets flags appropriately. // Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd. // This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() { func Execute() {
rootCmd.CompletionOptions.DisableDefaultCmd = true
cobra.CheckErr(rootCmd.Execute()) cobra.CheckErr(rootCmd.Execute())
} }

2
go.mod
View File

@@ -19,7 +19,7 @@ require (
github.com/spf13/cast v1.4.1 // indirect github.com/spf13/cast v1.4.1 // indirect
github.com/spf13/cobra v1.2.1 github.com/spf13/cobra v1.2.1
github.com/spf13/viper v1.8.1 github.com/spf13/viper v1.8.1
go.arsenm.dev/infinitime v0.0.0-20210821070429-ea488067fb9b go.arsenm.dev/infinitime v0.0.0-20210822201216-955384489609
golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect
golang.org/x/text v0.3.7 // indirect golang.org/x/text v0.3.7 // indirect
) )

4
go.sum
View File

@@ -287,8 +287,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.arsenm.dev/infinitime v0.0.0-20210821070429-ea488067fb9b h1:Wwj7F0gqYHUx+9H8fCCIy5JZTlCusJRpPuzeSFM0EoU= go.arsenm.dev/infinitime v0.0.0-20210822201216-955384489609 h1:QH7hsVjulEs1OP8lcQ7EfVy2UO/rtwRsxUo3ylde83E=
go.arsenm.dev/infinitime v0.0.0-20210821070429-ea488067fb9b/go.mod h1:gaepaueUz4J5FfxuV19B4w5pi+V3mD0LTef50ryxr/Q= go.arsenm.dev/infinitime v0.0.0-20210822201216-955384489609/go.mod h1:gaepaueUz4J5FfxuV19B4w5pi+V3mD0LTef50ryxr/Q=
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=

View File

@@ -51,7 +51,7 @@ const (
) )
func startSocket(dev *infinitime.Device) error { func startSocket(dev *infinitime.Device) error {
// Make socket directory if non existant // Make socket directory if non-existent
err := os.MkdirAll(filepath.Dir(SockPath), 0755) err := os.MkdirAll(filepath.Dir(SockPath), 0755)
if err != nil { if err != nil {
return err return err
@@ -149,14 +149,14 @@ func handleConnection(conn net.Conn, dev *infinitime.Device) {
case ReqTypeNotify: case ReqTypeNotify:
// If no data, return error // If no data, return error
if req.Data == nil { if req.Data == nil {
connErr(conn, nil, "Data required for notify types.Request") connErr(conn, nil, "Data required for notify request")
break break
} }
var reqData types.ReqDataNotify var reqData types.ReqDataNotify
// Decode data map to notify types.Request data // Decode data map to notify request data
err = mapstructure.Decode(req.Data, &reqData) err = mapstructure.Decode(req.Data, &reqData)
if err != nil { if err != nil {
connErr(conn, err, "Error decoding types.Request data") connErr(conn, err, "Error decoding request data")
break break
} }
// Send notification to watch // Send notification to watch
@@ -170,13 +170,13 @@ func handleConnection(conn net.Conn, dev *infinitime.Device) {
case ReqTypeSetTime: case ReqTypeSetTime:
// If no data, return error // If no data, return error
if req.Data == nil { if req.Data == nil {
connErr(conn, nil, "Data required for settime types.Request") connErr(conn, nil, "Data required for settime request")
break break
} }
// Get string from data or return error // Get string from data or return error
reqTimeStr, ok := req.Data.(string) reqTimeStr, ok := req.Data.(string)
if !ok { if !ok {
connErr(conn, nil, "Data for settime types.Request must be RFC3339 formatted time string") connErr(conn, nil, "Data for settime request must be RFC3339 formatted time string")
break break
} }
@@ -184,7 +184,7 @@ func handleConnection(conn net.Conn, dev *infinitime.Device) {
if reqTimeStr == "now" { if reqTimeStr == "now" {
reqTime = time.Now() reqTime = time.Now()
} else { } else {
// Parse time as RFC3339/ISO9601 // Parse time as RFC3339/ISO8601
reqTime, err = time.Parse(time.RFC3339, reqTimeStr) reqTime, err = time.Parse(time.RFC3339, reqTimeStr)
if err != nil { if err != nil {
connErr(conn, err, "Invalid time format. Time string must be formatted as ISO8601 or the word `now`") connErr(conn, err, "Invalid time format. Time string must be formatted as ISO8601 or the word `now`")
@@ -202,14 +202,14 @@ func handleConnection(conn net.Conn, dev *infinitime.Device) {
case ReqTypeFwUpgrade: case ReqTypeFwUpgrade:
// If no data, return error // If no data, return error
if req.Data == nil { if req.Data == nil {
connErr(conn, nil, "Data required for firmware upgrade types.Request") connErr(conn, nil, "Data required for firmware upgrade request")
break break
} }
var reqData types.ReqDataFwUpgrade var reqData types.ReqDataFwUpgrade
// Decode data map to firmware upgrade types.Request data // Decode data map to firmware upgrade request data
err = mapstructure.Decode(req.Data, &reqData) err = mapstructure.Decode(req.Data, &reqData)
if err != nil { if err != nil {
connErr(conn, err, "Error decoding types.Request data") connErr(conn, err, "Error decoding request data")
break break
} }
switch reqData.Type { switch reqData.Type {
@@ -272,6 +272,7 @@ func handleConnection(conn net.Conn, dev *infinitime.Device) {
err = dev.DFU.Start() err = dev.DFU.Start()
if err != nil { if err != nil {
connErr(conn, err, "Error performing upgrade") connErr(conn, err, "Error performing upgrade")
firmwareUpdating = false
break break
} }
firmwareUpdating = false firmwareUpdating = false