forked from Elara6331/itd
Switch to lrpc and use context to handle signals
This commit is contained in:
105
api/api.go
105
api/api.go
@@ -1,117 +1,30 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/smallnest/rpcxlite/client"
|
||||
"github.com/smallnest/rpcxlite/protocol"
|
||||
"github.com/vmihailenco/msgpack/v5"
|
||||
"go.arsenm.dev/infinitime"
|
||||
"go.arsenm.dev/lrpc/client"
|
||||
"go.arsenm.dev/lrpc/codec"
|
||||
)
|
||||
|
||||
const DefaultAddr = "/tmp/itd/socket"
|
||||
|
||||
type Client struct {
|
||||
itdClient client.XClient
|
||||
itdCh chan *protocol.Message
|
||||
fsClient client.XClient
|
||||
fsCh chan *protocol.Message
|
||||
srvVals map[string]chan interface{}
|
||||
client *client.Client
|
||||
}
|
||||
|
||||
func New(sockPath string) (*Client, error) {
|
||||
d, err := client.NewPeer2PeerDiscovery("unix@"+sockPath, "")
|
||||
conn, err := net.Dial("unix", sockPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
out := &Client{}
|
||||
|
||||
out.itdCh = make(chan *protocol.Message, 5)
|
||||
out.itdClient = client.NewBidirectionalXClient(
|
||||
"ITD",
|
||||
client.Failtry,
|
||||
client.RandomSelect,
|
||||
d,
|
||||
client.DefaultOption,
|
||||
out.itdCh,
|
||||
)
|
||||
|
||||
out.fsCh = make(chan *protocol.Message, 5)
|
||||
out.fsClient = client.NewBidirectionalXClient(
|
||||
"FS",
|
||||
client.Failtry,
|
||||
client.RandomSelect,
|
||||
d,
|
||||
client.DefaultOption,
|
||||
out.fsCh,
|
||||
)
|
||||
|
||||
out.srvVals = map[string]chan interface{}{}
|
||||
|
||||
go out.handleMessages(out.itdCh)
|
||||
go out.handleMessages(out.fsCh)
|
||||
|
||||
out := &Client{
|
||||
client: client.New(conn, codec.JSON),
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *Client) handleMessages(msgCh chan *protocol.Message) {
|
||||
for msg := range msgCh {
|
||||
_, ok := c.srvVals[msg.ServicePath]
|
||||
if !ok {
|
||||
c.srvVals[msg.ServicePath] = make(chan interface{}, 5)
|
||||
}
|
||||
|
||||
//fmt.Printf("%+v\n", msg)
|
||||
|
||||
ch := c.srvVals[msg.ServicePath]
|
||||
|
||||
switch msg.ServiceMethod {
|
||||
case "FSProgress":
|
||||
var progress FSTransferProgress
|
||||
msgpack.Unmarshal(msg.Payload, &progress)
|
||||
ch <- progress
|
||||
case "DFUProgress":
|
||||
var progress infinitime.DFUProgress
|
||||
msgpack.Unmarshal(msg.Payload, &progress)
|
||||
ch <- progress
|
||||
case "MotionSample":
|
||||
var motionVals infinitime.MotionValues
|
||||
msgpack.Unmarshal(msg.Payload, &motionVals)
|
||||
ch <- motionVals
|
||||
case "Done":
|
||||
close(c.srvVals[msg.ServicePath])
|
||||
delete(c.srvVals, msg.ServicePath)
|
||||
default:
|
||||
var value interface{}
|
||||
msgpack.Unmarshal(msg.Payload, &value)
|
||||
ch <- value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) done(id string) error {
|
||||
return c.itdClient.Call(
|
||||
context.Background(),
|
||||
"Done",
|
||||
id,
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
||||
func (c *Client) Close() error {
|
||||
err := c.itdClient.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = c.fsClient.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
close(c.itdCh)
|
||||
close(c.fsCh)
|
||||
|
||||
return nil
|
||||
return c.client.Close()
|
||||
}
|
||||
|
||||
@@ -1,40 +1,23 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"go.arsenm.dev/infinitime"
|
||||
)
|
||||
|
||||
func (c *Client) FirmwareUpgrade(upgType UpgradeType, files ...string) (chan infinitime.DFUProgress, error) {
|
||||
var id string
|
||||
err := c.itdClient.Call(
|
||||
context.Background(),
|
||||
progressCh := make(chan infinitime.DFUProgress, 5)
|
||||
err := c.client.Call(
|
||||
"ITD",
|
||||
"FirmwareUpgrade",
|
||||
FwUpgradeData{
|
||||
Type: upgType,
|
||||
Files: files,
|
||||
},
|
||||
&id,
|
||||
&progressCh,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
progressCh := make(chan infinitime.DFUProgress, 5)
|
||||
go func() {
|
||||
srvValCh, ok := c.srvVals[id]
|
||||
for !ok {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
srvValCh, ok = c.srvVals[id]
|
||||
}
|
||||
|
||||
for val := range srvValCh {
|
||||
progressCh <- val.(infinitime.DFUProgress)
|
||||
}
|
||||
close(progressCh)
|
||||
}()
|
||||
|
||||
return progressCh, nil
|
||||
}
|
||||
|
||||
67
api/fs.go
67
api/fs.go
@@ -1,13 +1,8 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (c *Client) Remove(paths ...string) error {
|
||||
return c.fsClient.Call(
|
||||
context.Background(),
|
||||
return c.client.Call(
|
||||
"FS",
|
||||
"Remove",
|
||||
paths,
|
||||
nil,
|
||||
@@ -15,17 +10,17 @@ func (c *Client) Remove(paths ...string) error {
|
||||
}
|
||||
|
||||
func (c *Client) Rename(old, new string) error {
|
||||
return c.fsClient.Call(
|
||||
context.Background(),
|
||||
"Remove",
|
||||
return c.client.Call(
|
||||
"FS",
|
||||
"Rename",
|
||||
[2]string{old, new},
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
||||
func (c *Client) Mkdir(paths ...string) error {
|
||||
return c.fsClient.Call(
|
||||
context.Background(),
|
||||
return c.client.Call(
|
||||
"FS",
|
||||
"Mkdir",
|
||||
paths,
|
||||
nil,
|
||||
@@ -33,8 +28,8 @@ func (c *Client) Mkdir(paths ...string) error {
|
||||
}
|
||||
|
||||
func (c *Client) ReadDir(dir string) (out []FileInfo, err error) {
|
||||
err = c.fsClient.Call(
|
||||
context.Background(),
|
||||
err = c.client.Call(
|
||||
"FS",
|
||||
"ReadDir",
|
||||
dir,
|
||||
&out,
|
||||
@@ -43,59 +38,31 @@ func (c *Client) ReadDir(dir string) (out []FileInfo, err error) {
|
||||
}
|
||||
|
||||
func (c *Client) Upload(dst, src string) (chan FSTransferProgress, error) {
|
||||
var id string
|
||||
err := c.fsClient.Call(
|
||||
context.Background(),
|
||||
progressCh := make(chan FSTransferProgress, 5)
|
||||
err := c.client.Call(
|
||||
"FS",
|
||||
"Upload",
|
||||
[2]string{dst, src},
|
||||
&id,
|
||||
progressCh,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
progressCh := make(chan FSTransferProgress, 5)
|
||||
go func() {
|
||||
srvValCh, ok := c.srvVals[id]
|
||||
for !ok {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
srvValCh, ok = c.srvVals[id]
|
||||
}
|
||||
|
||||
for val := range srvValCh {
|
||||
progressCh <- val.(FSTransferProgress)
|
||||
}
|
||||
close(progressCh)
|
||||
}()
|
||||
|
||||
return progressCh, nil
|
||||
}
|
||||
|
||||
func (c *Client) Download(dst, src string) (chan FSTransferProgress, error) {
|
||||
var id string
|
||||
err := c.fsClient.Call(
|
||||
context.Background(),
|
||||
progressCh := make(chan FSTransferProgress, 5)
|
||||
err := c.client.Call(
|
||||
"FS",
|
||||
"Download",
|
||||
[2]string{dst, src},
|
||||
&id,
|
||||
progressCh,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
progressCh := make(chan FSTransferProgress, 5)
|
||||
go func() {
|
||||
srvValCh, ok := c.srvVals[id]
|
||||
for !ok {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
srvValCh, ok = c.srvVals[id]
|
||||
}
|
||||
|
||||
for val := range srvValCh {
|
||||
progressCh <- val.(FSTransferProgress)
|
||||
}
|
||||
close(progressCh)
|
||||
}()
|
||||
|
||||
return progressCh, nil
|
||||
}
|
||||
|
||||
26
api/get.go
26
api/get.go
@@ -1,14 +1,12 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"go.arsenm.dev/infinitime"
|
||||
)
|
||||
|
||||
func (c *Client) HeartRate() (out uint8, err error) {
|
||||
err = c.itdClient.Call(
|
||||
context.Background(),
|
||||
err = c.client.Call(
|
||||
"ITD",
|
||||
"HeartRate",
|
||||
nil,
|
||||
&out,
|
||||
@@ -17,8 +15,8 @@ func (c *Client) HeartRate() (out uint8, err error) {
|
||||
}
|
||||
|
||||
func (c *Client) BatteryLevel() (out uint8, err error) {
|
||||
err = c.itdClient.Call(
|
||||
context.Background(),
|
||||
err = c.client.Call(
|
||||
"ITD",
|
||||
"BatteryLevel",
|
||||
nil,
|
||||
&out,
|
||||
@@ -27,8 +25,8 @@ func (c *Client) BatteryLevel() (out uint8, err error) {
|
||||
}
|
||||
|
||||
func (c *Client) Motion() (out infinitime.MotionValues, err error) {
|
||||
err = c.itdClient.Call(
|
||||
context.Background(),
|
||||
err = c.client.Call(
|
||||
"ITD",
|
||||
"Motion",
|
||||
nil,
|
||||
&out,
|
||||
@@ -37,8 +35,8 @@ func (c *Client) Motion() (out infinitime.MotionValues, err error) {
|
||||
}
|
||||
|
||||
func (c *Client) StepCount() (out uint32, err error) {
|
||||
err = c.itdClient.Call(
|
||||
context.Background(),
|
||||
err = c.client.Call(
|
||||
"ITD",
|
||||
"StepCount",
|
||||
nil,
|
||||
&out,
|
||||
@@ -47,8 +45,8 @@ func (c *Client) StepCount() (out uint32, err error) {
|
||||
}
|
||||
|
||||
func (c *Client) Version() (out string, err error) {
|
||||
err = c.itdClient.Call(
|
||||
context.Background(),
|
||||
err = c.client.Call(
|
||||
"ITD",
|
||||
"Version",
|
||||
nil,
|
||||
&out,
|
||||
@@ -57,8 +55,8 @@ func (c *Client) Version() (out string, err error) {
|
||||
}
|
||||
|
||||
func (c *Client) Address() (out string, err error) {
|
||||
err = c.itdClient.Call(
|
||||
context.Background(),
|
||||
err = c.client.Call(
|
||||
"ITD",
|
||||
"Address",
|
||||
nil,
|
||||
&out,
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
func (c *Client) Notify(title, body string) error {
|
||||
return c.itdClient.Call(
|
||||
context.Background(),
|
||||
return c.client.Call(
|
||||
"ITD",
|
||||
"Notify",
|
||||
NotifyData{
|
||||
Title: title,
|
||||
Body: body,
|
||||
Body: body,
|
||||
},
|
||||
nil,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (c *Client) SetTime(t time.Time) error {
|
||||
return c.itdClient.Call(
|
||||
context.Background(),
|
||||
return c.client.Call(
|
||||
"ITD",
|
||||
"SetTime",
|
||||
t,
|
||||
nil,
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package api
|
||||
|
||||
import "context"
|
||||
|
||||
func (c *Client) WeatherUpdate() error {
|
||||
return c.itdClient.Call(
|
||||
context.Background(),
|
||||
return c.client.Call(
|
||||
"ITD",
|
||||
"WeatherUpdate",
|
||||
nil,
|
||||
nil,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
103
api/watch.go
103
api/watch.go
@@ -1,143 +1,80 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"go.arsenm.dev/infinitime"
|
||||
)
|
||||
|
||||
func (c *Client) WatchHeartRate() (<-chan uint8, func(), error) {
|
||||
var id string
|
||||
err := c.itdClient.Call(
|
||||
context.Background(),
|
||||
outCh := make(chan uint8, 2)
|
||||
err := c.client.Call(
|
||||
"ITD",
|
||||
"WatchHeartRate",
|
||||
nil,
|
||||
&id,
|
||||
outCh,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
outCh := make(chan uint8, 2)
|
||||
go func() {
|
||||
srvValCh, ok := c.srvVals[id]
|
||||
for !ok {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
srvValCh, ok = c.srvVals[id]
|
||||
}
|
||||
|
||||
for val := range srvValCh {
|
||||
outCh <- val.(uint8)
|
||||
}
|
||||
}()
|
||||
|
||||
doneFn := func() {
|
||||
c.done(id)
|
||||
close(c.srvVals[id])
|
||||
delete(c.srvVals, id)
|
||||
close(outCh)
|
||||
}
|
||||
|
||||
return outCh, doneFn, nil
|
||||
}
|
||||
|
||||
func (c *Client) WatchBatteryLevel() (<-chan uint8, func(), error) {
|
||||
var id string
|
||||
err := c.itdClient.Call(
|
||||
context.Background(),
|
||||
outCh := make(chan uint8, 2)
|
||||
err := c.client.Call(
|
||||
"ITD",
|
||||
"WatchBatteryLevel",
|
||||
nil,
|
||||
&id,
|
||||
outCh,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
outCh := make(chan uint8, 2)
|
||||
go func() {
|
||||
srvValCh, ok := c.srvVals[id]
|
||||
for !ok {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
srvValCh, ok = c.srvVals[id]
|
||||
}
|
||||
|
||||
for val := range srvValCh {
|
||||
outCh <- val.(uint8)
|
||||
}
|
||||
}()
|
||||
|
||||
doneFn := func() {
|
||||
c.done(id)
|
||||
close(c.srvVals[id])
|
||||
delete(c.srvVals, id)
|
||||
close(outCh)
|
||||
}
|
||||
|
||||
return outCh, doneFn, nil
|
||||
}
|
||||
|
||||
func (c *Client) WatchStepCount() (<-chan uint32, func(), error) {
|
||||
var id string
|
||||
err := c.itdClient.Call(
|
||||
context.Background(),
|
||||
outCh := make(chan uint32, 2)
|
||||
err := c.client.Call(
|
||||
"ITD",
|
||||
"WatchStepCount",
|
||||
nil,
|
||||
&id,
|
||||
outCh,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
outCh := make(chan uint32, 2)
|
||||
go func() {
|
||||
srvValCh, ok := c.srvVals[id]
|
||||
for !ok {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
srvValCh, ok = c.srvVals[id]
|
||||
}
|
||||
|
||||
for val := range srvValCh {
|
||||
outCh <- val.(uint32)
|
||||
}
|
||||
}()
|
||||
|
||||
doneFn := func() {
|
||||
c.done(id)
|
||||
close(c.srvVals[id])
|
||||
delete(c.srvVals, id)
|
||||
close(outCh)
|
||||
}
|
||||
|
||||
return outCh, doneFn, nil
|
||||
}
|
||||
|
||||
func (c *Client) WatchMotion() (<-chan infinitime.MotionValues, func(), error) {
|
||||
var id string
|
||||
err := c.itdClient.Call(
|
||||
context.Background(),
|
||||
outCh := make(chan infinitime.MotionValues, 2)
|
||||
err := c.client.Call(
|
||||
"ITD",
|
||||
"WatchMotion",
|
||||
nil,
|
||||
&id,
|
||||
outCh,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
outCh := make(chan infinitime.MotionValues, 2)
|
||||
go func() {
|
||||
srvValCh, ok := c.srvVals[id]
|
||||
for !ok {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
srvValCh, ok = c.srvVals[id]
|
||||
}
|
||||
|
||||
for val := range srvValCh {
|
||||
outCh <- val.(infinitime.MotionValues)
|
||||
}
|
||||
}()
|
||||
|
||||
doneFn := func() {
|
||||
c.done(id)
|
||||
close(c.srvVals[id])
|
||||
delete(c.srvVals, id)
|
||||
close(outCh)
|
||||
}
|
||||
|
||||
return outCh, doneFn, nil
|
||||
|
||||
Reference in New Issue
Block a user