Skip to content

Commit 886bf70

Browse files
committed
Add set attitude command
1 parent baf3a48 commit 886bf70

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

server/commands.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package server
22

33
import (
44
"context"
5+
"time"
6+
57
"github.com/aler9/gomavlib/pkg/dialects/ardupilotmega"
68
pb "github.com/koustech/mastermind/gen/go/proto/mastermind/v1"
79
"github.com/koustech/mastermind/utils"
@@ -85,3 +87,43 @@ func (s *mastermindServiceServer) GotoWaypoint(_ context.Context, request *pb.Go
8587
return &pb.GotoWaypointResponse{CommandSucceeded: true}, nil
8688

8789
}
90+
91+
const SET_ATTITUDE_TIMEOUT_SECONDS = 6
92+
93+
// SetAttitude tells the plane to obtain a specific attitude
94+
func (s *mastermindServiceServer) SetAttitude(stream pb.MastermindService_SetAttitudeServer) error {
95+
// track time for case of timeout
96+
startTime := time.Now()
97+
utils.Logger.Info("SetAttitude() called")
98+
99+
// set mode to FBWB ONE TIME ONLY
100+
// TODO: implement
101+
// for every received message, send command and update target object (to be sent in detailed telem)
102+
103+
for {
104+
currentTime := time.Now()
105+
if currentTime.Sub(startTime).Seconds() > 6 {
106+
break
107+
}
108+
109+
attitudeRequest, err := stream.Recv()
110+
111+
if err != nil {
112+
break
113+
}
114+
115+
s.targetMu.Lock()
116+
s.target = attitudeRequest.Target
117+
s.targetMu.Unlock()
118+
}
119+
120+
// close stream once EOF is received and set target to nil
121+
utils.Logger.Info("SetAttitude() finished")
122+
123+
s.targetMu.Lock()
124+
s.target = nil
125+
s.targetMu.Unlock()
126+
127+
return stream.SendAndClose(&pb.SetAttitudeResponse{})
128+
129+
}

server/server.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ type mastermindServiceServer struct {
4949
node *gomavlib.Node // node connected to the plane
5050
sysId uint8 // MAVLink system ID of the plane
5151
compId uint8 // MAVLink component ID of the autopilot
52-
target pb.Target // Target being followed by tracking service
52+
target *pb.Target // Target being followed by tracking service
53+
targetMu sync.Mutex // protects target
5354
}
5455

5556
func NewMastermindServiceServer(node *gomavlib.Node, sysId uint8, compId uint8) *mastermindServiceServer {

server/telemetry.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ func (s *mastermindServiceServer) GetDetailedTelemetry(_ *pb.GetDetailedTelemetr
140140
s.telemUpdateHandlers[sessionId] = s.stateBus.Subscribe(EventNewTelemetry, func(e evbus.Event) {
141141
se := e.(*NewTelemetryEvent)
142142
response := se.response
143+
s.targetMu.Lock()
144+
se.response.Target = s.target
145+
s.targetMu.Unlock()
146+
143147
if err := stream.Send(response); err != nil {
144148
s.stateBus.Unsubscribe(s.telemUpdateHandlers[sessionId])
145149
delete(s.telemUpdateHandlers, sessionId)

0 commit comments

Comments
 (0)