feat(AveragePosition): method to emit average_base_coordinates message

This commit is contained in:
cmsassot 2025-06-11 12:00:30 +02:00
parent 81741d20c1
commit abebc7d8c6
6 changed files with 85 additions and 2 deletions

View File

@ -41,6 +41,7 @@ func OnMessage[T any](ctx context.Context, client *Client, mType string) (chan T
type Broadcast struct { type Broadcast struct {
Name string `mapstructure:"name" json:"name"` Name string `mapstructure:"name" json:"name"`
Payload any `mapstructure:"payload" json:"payload"` Payload any `mapstructure:"payload" json:"payload"`
State string `mapstructure:"state" json:"state"`
} }
// OnBroadcast listens for ReachView "broadcast" messages // OnBroadcast listens for ReachView "broadcast" messages

View File

@ -152,4 +152,18 @@ func (c *Client) Reboot(ctx context.Context) error {
return nil return nil
} }
// AveragePosition implements protocol.Operations.
func (c *Client) AveragePosition(ctx context.Context) (*protocol.TaskMessage, error) {
_, ops, err := c.getProtocol(ctx)
if err != nil {
return nil, errors.WithStack(err)
}
taskMsg, err := ops.AveragePosition(ctx)
if err != nil {
return nil, errors.WithStack(err)
}
return taskMsg, err
}
var _ protocol.Operations = &Client{} var _ protocol.Operations = &Client{}

View File

@ -1,6 +1,8 @@
package protocol package protocol
import "context" import (
"context"
)
type BaseInfo struct { type BaseInfo struct {
Mode string Mode string
@ -8,6 +10,12 @@ type BaseInfo struct {
Latitude float64 Latitude float64
Longitude float64 Longitude float64
Height float64 Height float64
Accumulation int
}
type TaskMessage struct {
Name string `json:"name"`
State string `json:"state"`
Payload map[string]interface{} `json:"payload"`
} }
type Operations interface { type Operations interface {
@ -41,4 +49,7 @@ type Operations interface {
// Reboot restarts the module // Reboot restarts the module
Reboot(ctx context.Context) error Reboot(ctx context.Context) error
// AveragePosition gathers data and computes the average position
AveragePosition(ctx context.Context) (*TaskMessage, error)
} }

View File

@ -240,6 +240,30 @@ var testCases = []operationTestCase{
}, },
}, },
{
Name: "AveragePosition",
Run: func(t *testing.T, ops protocol.Operations) {
ctx := context.Background()
if err := ops.Connect(ctx); err != nil {
t.Errorf("%+v", errors.WithStack(err))
return
}
defer func() {
if err := ops.Close(ctx); err != nil {
t.Errorf("%+v", errors.WithStack(err))
}
}()
taskmessage, err := ops.AveragePosition(ctx)
if err != nil {
t.Errorf("%+v", errors.WithStack(err))
return
}
t.Logf("Task Message : %s", taskmessage)
},
},
} }
func TestOperations(t *testing.T, opsFactory OperationsFactoryFunc) { func TestOperations(t *testing.T, opsFactory OperationsFactoryFunc) {

View File

@ -2,4 +2,5 @@ package model
type Action struct { type Action struct {
Name string `json:"name"` Name string `json:"name"`
Paylaod map[string]any `json:"payload"`
} }

View File

@ -2,6 +2,7 @@ package v2
import ( import (
"context" "context"
"encoding/json"
"net/http" "net/http"
"sync" "sync"
@ -264,4 +265,35 @@ func (o *Operations) On(ctx context.Context, event string) (chan any, error) {
return out, nil return out, nil
} }
func (o *Operations) AveragePosition(ctx context.Context) (*protocol.TaskMessage, error) {
var err error
go func() {
<-ctx.Done()
err = ctx.Err()
}()
if err = o.client.Emit("task", &model.Action{Name: "average_base_coordinates"}); err != nil {
return nil, err
}
ch, err := o.On(ctx, "task_status")
for message := range ch {
// Convertir vers notre struct
jsonData, err := json.Marshal(message)
if err != nil {
continue
}
var taskMsg protocol.TaskMessage
if err := json.Unmarshal(jsonData, &taskMsg); err != nil {
continue
}
if taskMsg.State == "completed" {
return &taskMsg, nil
}
}
return nil, err
}
var _ protocol.Operations = &Operations{} var _ protocol.Operations = &Operations{}