Skip to content

Commit 504a9d0

Browse files
committed
Feature: Select active tracker source and visualize it in UI
1 parent cd8ee22 commit 504a9d0

File tree

11 files changed

+137
-123
lines changed

11 files changed

+137
-123
lines changed

config/engine.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
"PLACEMENT_SUCCEEDED": "BEHAVIOR_ACCEPT",
3131
"POSSIBLE_GOAL": "BEHAVIOR_ACCEPT",
3232
"TOO_MANY_ROBOTS": "BEHAVIOR_ACCEPT",
33-
"UNKNOWN_GAME_EVENT_TYPE": "BEHAVIOR_ACCEPT",
3433
"UNSPORTING_BEHAVIOR_MAJOR": "BEHAVIOR_ACCEPT",
3534
"UNSPORTING_BEHAVIOR_MINOR": "BEHAVIOR_ACCEPT"
3635
},

internal/app/engine/consume_tracker.go

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,40 +22,33 @@ func (e *Engine) ProcessTrackerFrame(wrapperFrame *tracker.TrackerWrapperPacket)
2222
Robots: convertRobots(wrapperFrame.TrackedFrame.Robots),
2323
}
2424
e.trackerLastUpdate[*wrapperFrame.Uuid] = now
25-
2625
e.gcState.TrackerState[*wrapperFrame.Uuid] = &state
2726

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-
}
27+
if e.config.ActiveTrackerSource == nil {
28+
e.config.ActiveTrackerSource = state.Uuid
29+
log.Printf("Switched tracker source to %v (%v)", *state.Uuid, *state.SourceName)
3230
}
3331

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 {
32+
if *e.config.ActiveTrackerSource == *wrapperFrame.Uuid {
4033
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)
4734
}
4835
}
4936

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-
}
37+
func (e *Engine) processTrackerSources() {
38+
now := e.timeProvider()
39+
40+
if e.config.ActiveTrackerSource != nil && now.Sub(e.trackerLastUpdate[*e.config.ActiveTrackerSource]) > time.Second {
41+
log.Printf("Tracker source %v timed out", *e.config.ActiveTrackerSource)
42+
e.config.ActiveTrackerSource = nil
43+
e.gcState.TrackerStateGc = &GcStateTracker{}
44+
}
45+
46+
// remove old states
47+
for sourceId, state := range e.gcState.TrackerState {
48+
if now.Sub(e.trackerLastUpdate[*state.Uuid]) > time.Second {
49+
delete(e.gcState.TrackerState, sourceId)
5650
}
5751
}
58-
return nil
5952
}
6053

6154
func convertRobots(robots []*tracker.TrackedRobot) (rs []*Robot) {
@@ -78,12 +71,3 @@ func convertBalls(balls []*tracker.TrackedBall) *Ball {
7871
}
7972
return &ball
8073
}
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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ func NewEngine(gameConfig config.Game, engineConfig config.Engine) (e *Engine) {
5454
}
5555
e.gcState.AutoRefState = map[string]*GcStateAutoRef{}
5656
e.gcState.TrackerState = map[string]*GcStateTracker{}
57+
e.gcState.TrackerStateGc = &GcStateTracker{}
5758
e.trackerLastUpdate = map[string]time.Time{}
5859
e.noProgressDetector = NoProgressDetector{gcEngine: e}
5960
e.ballPlacementCoordinator = BallPlacementCoordinator{gcEngine: e}
@@ -356,6 +357,9 @@ func (e *Engine) UpdateConfig(delta *Config) {
356357
e.config.AutoRefConfigs[autoRef].GameEventBehavior[k] = v
357358
}
358359
}
360+
if delta.ActiveTrackerSource != nil {
361+
e.config.ActiveTrackerSource = delta.ActiveTrackerSource
362+
}
359363
log.Printf("Engine config updated to %v", e.config.StringJson())
360364
if err := e.config.WriteTo(e.engineConfig.ConfigFilename); err != nil {
361365
log.Printf("Could not write engine config: %v", err)

internal/app/engine/process_tick.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func (e *Engine) processTick() {
6363
e.processBotNumber()
6464
e.processPenalty()
6565
e.processProposals()
66+
e.processTrackerSources()
6667

6768
stateCopy := e.currentState.Clone()
6869
hookOut := HookOut{State: stateCopy}

internal/app/engine/ssl_gc_engine_config.pb.go

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

internal/app/state/gameevent.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ func AllGameEvents() (a []GameEvent_Type) {
4949
for t := range GameEvent_Type_name {
5050
eventType := GameEvent_Type(t)
5151
switch eventType {
52-
case GameEvent_PREPARED,
52+
case GameEvent_UNKNOWN_GAME_EVENT_TYPE,
53+
GameEvent_PREPARED,
5354
GameEvent_INDIRECT_GOAL,
5455
GameEvent_CHIPPED_GOAL,
5556
GameEvent_KICK_TIMEOUT,

proto/ssl_gc_engine_config.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ option go_package = "github.com/RoboCup-SSL/ssl-game-controller/internal/app/eng
55
message Config {
66
map<string, Behavior> game_event_behavior = 1;
77
map<string, AutoRefConfig> auto_ref_configs = 2;
8-
repeated string tracker_source_priority = 3;
8+
optional string active_tracker_source = 3;
99

1010
enum Behavior {
1111
BEHAVIOR_UNKNOWN = 0;

src/components/GameController.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
<ControlFlowBar id="match-controls"/>
1212
<SwitchWindowBar/>
13+
<ActiveTrackerSource/>
1314
</div>
1415
<div v-else>
1516
<p>No state received yet. Is the backend running?</p>
@@ -22,10 +23,12 @@
2223
import GameStateBar from './GameStateBar.vue'
2324
import ControlFlowBar from "./control/ControlFlowBar";
2425
import SwitchWindowBar from "./control/SwitchWindowBar";
26+
import ActiveTrackerSource from "./control/ActiveTrackerSource";
2527
2628
export default {
2729
name: 'GameController',
2830
components: {
31+
ActiveTrackerSource,
2932
SwitchWindowBar,
3033
MatchSettingsBar,
3134
GameStateBar,
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<template>
2+
<div class="bottom-right">
3+
<span v-if="trackerState">
4+
Tracker source: {{trackerState.sourceName}}
5+
</span>
6+
<span v-else class="no-tracker-source">
7+
No tracker source connected
8+
</span>
9+
</div>
10+
</template>
11+
12+
<script>
13+
export default {
14+
name: "ActiveTrackerSource",
15+
computed: {
16+
trackerState() {
17+
if(this.activeTrackerSource) {
18+
return this.$store.state.gcState.trackerState[this.activeTrackerSource];
19+
}
20+
return null;
21+
},
22+
activeTrackerSource() {
23+
return this.$store.state.config.activeTrackerSource;
24+
}
25+
},
26+
}
27+
</script>
28+
29+
<style scoped>
30+
31+
.bottom-right {
32+
position: fixed;
33+
bottom: 0.2em;
34+
right: 0.5em;
35+
text-align: right;
36+
display: flex;
37+
justify-content: right;
38+
}
39+
40+
.no-tracker-source {
41+
color: red;
42+
}
43+
44+
</style>

src/components/settings/TrackerConfig.vue

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,11 @@
77
<li v-for="(state, sourceId) in trackerState"
88
:key="sourceId">
99
{{sourceId}} ({{state.sourceName}})
10-
</li>
11-
</ul>
12-
<p>
13-
Tracker source priority:
14-
</p>
15-
<ul>
16-
<li v-for="sourceName in trackerSourcePriority"
17-
:key="sourceName">
18-
{{sourceName}}
10+
<b-button variant="primary"
11+
@click="setActiveTrackerSource(sourceId)"
12+
:disabled="sourceId === activeTrackerSource">
13+
Set active
14+
</b-button>
1915
</li>
2016
</ul>
2117
</div>
@@ -30,16 +26,14 @@
3026
trackerState() {
3127
return this.$store.state.gcState.trackerState;
3228
},
33-
trackerSourcePriority() {
34-
return this.$store.state.config.trackerSourcePriority
35-
},
29+
activeTrackerSource() {
30+
return this.$store.state.config.activeTrackerSource;
31+
}
3632
},
3733
methods: {
38-
changeBehavior(eventType, value) {
34+
setActiveTrackerSource(sourceId) {
3935
submitConfigUpdate({
40-
gameEventBehavior: {
41-
[eventType]: value
42-
}
36+
activeTrackerSource: sourceId
4337
});
4438
},
4539
}

0 commit comments

Comments
 (0)