Skip to content

Commit cd8ee22

Browse files
committed
Feature: Only consume one tracker source at a time
1 parent bf7ec9b commit cd8ee22

File tree

9 files changed

+263
-77
lines changed

9 files changed

+263
-77
lines changed

internal/app/engine/consume_tracker.go

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

33
import (
44
"github.com/RoboCup-SSL/ssl-game-controller/internal/app/tracker"
5+
"log"
6+
"time"
57
)
68

79
func (e *Engine) ProcessTrackerFrame(wrapperFrame *tracker.TrackerWrapperPacket) {
@@ -12,16 +14,48 @@ func (e *Engine) ProcessTrackerFrame(wrapperFrame *tracker.TrackerWrapperPacket)
1214
return
1315
}
1416

17+
now := e.timeProvider()
1518
state := GcStateTracker{
1619
SourceName: wrapperFrame.SourceName,
20+
Uuid: wrapperFrame.Uuid,
1721
Ball: convertBalls(wrapperFrame.TrackedFrame.Balls),
1822
Robots: convertRobots(wrapperFrame.TrackedFrame.Robots),
1923
}
24+
e.trackerLastUpdate[*wrapperFrame.Uuid] = now
2025

2126
e.gcState.TrackerState[*wrapperFrame.Uuid] = &state
2227

23-
// for now, all tracker sources update the GC state
24-
e.gcState.TrackerStateGc = &state
28+
for sourceId, state := range e.gcState.TrackerState {
29+
if now.Sub(e.trackerLastUpdate[*state.Uuid]) > time.Second {
30+
delete(e.gcState.TrackerState, sourceId)
31+
}
32+
}
33+
34+
e.updateTrackerSourcePriority(*wrapperFrame.SourceName)
35+
36+
if e.gcState.TrackerStateGc == nil {
37+
e.gcState.TrackerStateGc = &state
38+
log.Printf("Initial tracker source is %v (%v)", *e.gcState.TrackerStateGc.Uuid, *e.gcState.TrackerStateGc.SourceName)
39+
} else if *e.gcState.TrackerStateGc.Uuid == *wrapperFrame.Uuid {
40+
e.gcState.TrackerStateGc = &state
41+
} else if now.Sub(e.trackerLastUpdate[*e.gcState.TrackerStateGc.Uuid]) > time.Second {
42+
e.gcState.TrackerStateGc = e.findNewTrackerSourceState()
43+
if e.gcState.TrackerStateGc == nil {
44+
e.gcState.TrackerStateGc = &state
45+
}
46+
log.Printf("Switched tracker source to %v (%v)", *e.gcState.TrackerStateGc.Uuid, *e.gcState.TrackerStateGc.SourceName)
47+
}
48+
}
49+
50+
func (e *Engine) findNewTrackerSourceState() *GcStateTracker {
51+
for _, sourceName := range e.config.TrackerSourcePriority {
52+
for _, state := range e.gcState.TrackerState {
53+
if *state.SourceName == sourceName {
54+
return state
55+
}
56+
}
57+
}
58+
return nil
2559
}
2660

2761
func convertRobots(robots []*tracker.TrackedRobot) (rs []*Robot) {
@@ -44,3 +78,12 @@ func convertBalls(balls []*tracker.TrackedBall) *Ball {
4478
}
4579
return &ball
4680
}
81+
82+
func (e *Engine) updateTrackerSourcePriority(s string) {
83+
for _, sourceName := range e.config.TrackerSourcePriority {
84+
if sourceName == s {
85+
return
86+
}
87+
}
88+
e.config.TrackerSourcePriority = append(e.config.TrackerSourcePriority, s)
89+
}

internal/app/engine/engine.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type Engine struct {
2929
timeProvider timer.TimeProvider
3030
lastTimeUpdate time.Time
3131
gcState *GcState
32+
trackerLastUpdate map[string]time.Time
3233
mutex sync.Mutex
3334
noProgressDetector NoProgressDetector
3435
ballPlacementCoordinator BallPlacementCoordinator
@@ -53,7 +54,7 @@ func NewEngine(gameConfig config.Game, engineConfig config.Engine) (e *Engine) {
5354
}
5455
e.gcState.AutoRefState = map[string]*GcStateAutoRef{}
5556
e.gcState.TrackerState = map[string]*GcStateTracker{}
56-
e.gcState.TrackerStateGc = new(GcStateTracker)
57+
e.trackerLastUpdate = map[string]time.Time{}
5758
e.noProgressDetector = NoProgressDetector{gcEngine: e}
5859
e.ballPlacementCoordinator = BallPlacementCoordinator{gcEngine: e}
5960
e.tickChanProvider = func() <-chan time.Time {

internal/app/engine/ssl_gc_engine.pb.go

Lines changed: 44 additions & 34 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/app/engine/ssl_gc_engine_config.pb.go

Lines changed: 43 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proto/ssl_gc_engine.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ message GcStateTracker {
3030
// Name of the source
3131
optional string source_name = 1;
3232

33+
// UUID of the source
34+
optional string uuid = 4;
35+
3336
// Current ball
3437
optional Ball ball = 2;
3538

proto/ssl_gc_engine_config.proto

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ syntax = "proto2";
33
option go_package = "github.com/RoboCup-SSL/ssl-game-controller/internal/app/engine";
44

55
message Config {
6-
map<string, Behavior> game_event_behavior = 3;
7-
map<string, AutoRefConfig> auto_ref_configs = 4;
6+
map<string, Behavior> game_event_behavior = 1;
7+
map<string, AutoRefConfig> auto_ref_configs = 2;
8+
repeated string tracker_source_priority = 3;
89

910
enum Behavior {
1011
BEHAVIOR_UNKNOWN = 0;

src/components/settings/AutonomousSettings.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,21 @@
1313
<b-tab v-for="autoRef in autoRefs" :title="autoRef" :key="autoRef">
1414
<AutoRefConfig :auto-ref-name="autoRef"/>
1515
</b-tab>
16+
<b-tab title="Tracker sources">
17+
<TrackerConfig/>
18+
</b-tab>
1619
</b-tabs>
1720
</div>
1821
</template>
1922

2023
<script>
2124
import EventBehavior from "./EventBehavior";
2225
import AutoRefConfig from "./AutoRefConfig";
26+
import TrackerConfig from "./TrackerConfig";
2327
2428
export default {
2529
name: "AutonomousSettings",
26-
components: {AutoRefConfig, EventBehavior},
30+
components: {TrackerConfig, AutoRefConfig, EventBehavior},
2731
computed: {
2832
gcState() {
2933
return this.$store.state.gcState

0 commit comments

Comments
 (0)