fix: protocol v1

This commit is contained in:
2024-08-02 12:57:07 +02:00
parent 8f89ed7e77
commit b976bde363
23 changed files with 392 additions and 85 deletions

View File

@ -3,5 +3,9 @@ package v1
import "forge.cadoles.com/cadoles/go-emlid/reach/client/protocol"
func init() {
protocol.Register(&Protocol{})
protocol.Register(Identifier, func(opts *protocol.ProtocolOptions) (protocol.Protocol, error) {
return &Protocol{
logger: opts.Logger,
}, nil
})
}

View File

@ -4,9 +4,11 @@ import (
"context"
"sync"
"forge.cadoles.com/cadoles/go-emlid/reach/client/logger"
"forge.cadoles.com/cadoles/go-emlid/reach/client/protocol"
"forge.cadoles.com/cadoles/go-emlid/reach/client/protocol/v1/model"
"forge.cadoles.com/cadoles/go-emlid/reach/client/socketio"
"github.com/davecgh/go-spew/spew"
"github.com/mitchellh/mapstructure"
"github.com/pkg/errors"
)
@ -27,10 +29,15 @@ type configurationApplied struct {
}
func (o *Operations) ApplyConfiguration(ctx context.Context, config *model.Configuration) (string, *model.Configuration, error) {
o.logger.Debug("applying configuration", logger.Attr("configuration", spew.Sdump(config)))
res := &configurationApplied{}
if err := o.ReqResp(ctx, eventApplyConfiguration, config, eventConfigurationApplied, res); err != nil {
return configurationApplyFailed, nil, err
}
o.logger.Debug("apply configuration response", logger.Attr("response", res))
return res.Result, res.Configuration, nil
}

View File

@ -6,6 +6,7 @@ import (
"strings"
"sync"
"forge.cadoles.com/cadoles/go-emlid/reach/client/logger"
"forge.cadoles.com/cadoles/go-emlid/reach/client/protocol"
"forge.cadoles.com/cadoles/go-emlid/reach/client/protocol/v1/model"
"forge.cadoles.com/cadoles/go-emlid/reach/client/socketio"
@ -16,6 +17,7 @@ type Operations struct {
addr string
client *socketio.Client
mutex sync.RWMutex
logger logger.Logger
}
// Close implements protocol.Operations.
@ -54,6 +56,8 @@ func (o *Operations) Connect(ctx context.Context) error {
client := socketio.NewClient(endpoint)
o.logger.Debug("connecting", logger.Attr("endpoint", endpoint))
if err := client.Connect(); err != nil {
return errors.WithStack(err)
}
@ -67,6 +71,8 @@ func (o *Operations) Connect(ctx context.Context) error {
return errors.WithStack(err)
}
o.logger.Debug("connected")
o.client = client
return nil
@ -206,29 +212,58 @@ const (
// SetBase implements protocol.Operations.
func (o *Operations) SetBase(ctx context.Context, funcs ...protocol.SetBaseOptionFunc) error {
rawConfig, err := o.Configuration(ctx)
if err != nil {
return errors.WithStack(err)
}
config := rawConfig.(*model.Configuration)
baseMode := config.BaseMode
var baseCoordinates *model.BaseCoordinates
if baseMode != nil && baseMode.BaseCoordinates != nil {
baseCoordinates = baseMode.BaseCoordinates
}
opts := protocol.NewSetBaseOptions(funcs...)
var lat string
if opts.Latitude != nil {
lat = strconv.FormatFloat(*opts.Latitude, 'f', -1, 64)
} else if baseCoordinates != nil && baseCoordinates.Coordinates != nil && len(baseCoordinates.Coordinates) > 1 {
lat = *baseCoordinates.Coordinates[0]
} else {
lat = "0"
}
var lon string
if opts.Longitude != nil {
lon = strconv.FormatFloat(*opts.Longitude, 'f', -1, 64)
} else if baseCoordinates != nil && baseCoordinates.Coordinates != nil && len(baseCoordinates.Coordinates) > 1 {
lon = *baseCoordinates.Coordinates[1]
} else {
lon = "0"
}
var alt string
if opts.Height != nil {
alt = strconv.FormatFloat(*opts.Height, 'f', -1, 64)
} else if baseCoordinates != nil && baseCoordinates.Coordinates != nil && len(baseCoordinates.Coordinates) > 1 {
alt = *baseCoordinates.Coordinates[2]
} else {
alt = "0"
}
var antennaHeight string
if opts.AntennaOffset != nil {
antennaHeight = strconv.FormatFloat(*opts.AntennaOffset, 'f', -1, 64)
} else if baseCoordinates != nil && baseCoordinates.AntennaOffset != nil && baseCoordinates.AntennaOffset.Up != nil {
antennaHeight = *baseCoordinates.AntennaOffset.Up
} else {
antennaHeight = "0"
}
config := &model.Configuration{
newConfig := &model.Configuration{
BaseMode: &model.BaseMode{
BaseCoordinates: &model.BaseCoordinates{
Accumulation: model.String("1"),
@ -248,7 +283,7 @@ func (o *Operations) SetBase(ctx context.Context, funcs ...protocol.SetBaseOptio
},
}
result, _, err := o.ApplyConfiguration(ctx, config)
result, _, err := o.ApplyConfiguration(ctx, newConfig)
if err != nil {
return errors.New("configuration update failed")
}

View File

@ -10,7 +10,9 @@ import (
)
func TestProtocolV1Operations(t *testing.T) {
proto := &Protocol{}
proto := &Protocol{
logger: testsuite.NewLogger(t),
}
factory := func(addr string) (protocol.Operations, error) {
ctx := context.Background()

View File

@ -2,17 +2,53 @@ package v1
import (
"context"
"log/slog"
"forge.cadoles.com/cadoles/go-emlid/reach/client/logger"
"forge.cadoles.com/cadoles/go-emlid/reach/client/protocol"
"github.com/Masterminds/semver/v3"
"github.com/pkg/errors"
)
const Identifier protocol.Identifier = "v1"
const compatibleVersionConstraint = "^2.24"
type Protocol struct {
logger logger.Logger
}
// Available implements protocol.Protocol.
func (p *Protocol) Available(ctx context.Context, addr string) (bool, error) {
ops := p.Operations(addr).(*Operations)
if err := ops.Connect(ctx); err != nil {
return false, nil
}
defer ops.Close(ctx)
rawVersion, _, err := ops.Version(ctx)
if err != nil {
return false, nil
}
versionConstraint, err := semver.NewConstraint(compatibleVersionConstraint)
if err != nil {
return false, errors.WithStack(err)
}
version, err := semver.NewVersion(rawVersion)
if err != nil {
return false, errors.WithStack(err)
}
p.logger.Debug("checking version", slog.Any("version", rawVersion), slog.Any("constraint", compatibleVersionConstraint))
if !versionConstraint.Check(version) {
return false, nil
}
return true, nil
}
@ -23,7 +59,7 @@ func (p *Protocol) Identifier() protocol.Identifier {
// Operations implements protocol.Protocol.
func (p *Protocol) Operations(addr string) protocol.Operations {
return &Operations{addr: addr}
return &Operations{addr: addr, logger: p.logger}
}
var _ protocol.Protocol = &Protocol{}