Skip to content

Commit 163d077

Browse files
committed
[refactoring] Remove timer from controller, timings only in engine
1 parent d19d825 commit 163d077

File tree

3 files changed

+39
-33
lines changed

3 files changed

+39
-33
lines changed

internal/app/controller/controller.go

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ type GameController struct {
2121
AutoRefServer *rcon.AutoRefServer
2222
TeamServer *rcon.TeamServer
2323
Engine Engine
24-
timer timer.Timer
2524
historyPreserver HistoryPreserver
2625
numUiProtocolsLastPublish int
2726
outstandingTeamChoice *TeamChoice
@@ -51,7 +50,6 @@ func NewGameController() (c *GameController) {
5150
c.TeamServer.ProcessTeamRequest = c.ProcessTeamRequests
5251

5352
c.Engine = NewEngine(c.Config.Game, time.Now().Unix())
54-
c.timer = timer.NewTimer()
5553

5654
c.setupTimeProvider()
5755

@@ -79,7 +77,6 @@ func (c *GameController) Run() {
7977
c.TeamServer.AllowedTeamNames = []string{c.Engine.State.TeamState[TeamYellow].Name,
8078
c.Engine.State.TeamState[TeamBlue].Name}
8179

82-
c.timer.Start()
8380
go c.mainLoop()
8481
go c.publishToNetwork()
8582
go c.AutoRefServer.Listen(c.Config.Server.AutoRef.Address)
@@ -91,17 +88,11 @@ func (c *GameController) Run() {
9188
// setupTimeProvider changes the time provider to the vision receiver, if configured
9289
func (c *GameController) setupTimeProvider() {
9390
if c.Config.TimeFromVision {
94-
c.timer.TimeProvider = func() time.Time {
91+
c.Engine.TimeProvider = func() time.Time {
9592
return time.Unix(0, 0)
9693
}
97-
c.Engine.TimeProvider = c.timer.TimeProvider
9894
c.VisionReceiver.DetectionCallback = func(frame *sslproto.SSL_DetectionFrame) {
99-
sec := int64(*frame.TCapture)
100-
nsec := int64((*frame.TCapture - float64(sec)) * 1e9)
101-
c.timer.TimeProvider = func() time.Time {
102-
return time.Unix(sec, nsec)
103-
}
104-
c.Engine.TimeProvider = c.timer.TimeProvider
95+
c.Engine.TimeProvider = timer.NewFixedTimeProviderFromSeconds(*frame.TCapture)
10596
}
10697
}
10798
}
@@ -110,10 +101,9 @@ func (c *GameController) setupTimeProvider() {
110101
func (c *GameController) mainLoop() {
111102
defer c.historyPreserver.Close()
112103
for {
113-
c.timer.WaitTillNextFull(time.Millisecond * 10)
104+
time.Sleep(time.Millisecond * 10)
114105

115-
newFullSecond := c.Engine.UpdateTimes(c.timer.Delta())
116-
eventTriggered := c.Engine.TriggerTimedEvents(c.timer.Delta())
106+
newFullSecond, eventTriggered := c.Engine.Update()
117107
if eventTriggered || newFullSecond {
118108
c.publish()
119109
}
@@ -159,7 +149,7 @@ func (c *GameController) updateOnlineStates() {
159149
// publishToNetwork publishes the current state to the network (multicast) every 25ms
160150
func (c *GameController) publishToNetwork() {
161151
for {
162-
c.timer.SleepConsumer(25 * time.Millisecond)
152+
time.Sleep(25 * time.Millisecond)
163153
c.Publisher.Publish(c.Engine.State)
164154
}
165155
}

internal/app/controller/engine.go

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package controller
33
import (
44
"github.com/RoboCup-SSL/ssl-game-controller/internal/app/config"
55
"github.com/RoboCup-SSL/ssl-game-controller/pkg/refproto"
6+
"github.com/RoboCup-SSL/ssl-game-controller/pkg/timer"
67
"github.com/pkg/errors"
78
"log"
89
"math/rand"
@@ -29,15 +30,16 @@ func NewEngineState() (e EngineState) {
2930
}
3031

3132
type Engine struct {
32-
State *State
33-
UiProtocol []UiProtocolEntry
34-
EngineState EngineState
35-
StageTimes map[Stage]time.Duration
36-
config config.Game
37-
TimeProvider func() time.Time
38-
History History
39-
Geometry config.Geometry
40-
Rand *rand.Rand
33+
State *State
34+
UiProtocol []UiProtocolEntry
35+
EngineState EngineState
36+
StageTimes map[Stage]time.Duration
37+
config config.Game
38+
TimeProvider timer.TimeProvider
39+
LastTimeUpdate time.Time
40+
History History
41+
Geometry config.Geometry
42+
Rand *rand.Rand
4143
}
4244

4345
func NewEngine(config config.Game, seed int64) (e Engine) {
@@ -46,6 +48,7 @@ func NewEngine(config config.Game, seed int64) (e Engine) {
4648
e.loadStages()
4749
e.ResetGame()
4850
e.TimeProvider = func() time.Time { return time.Now() }
51+
e.LastTimeUpdate = e.TimeProvider()
4952
e.Rand = rand.New(rand.NewSource(seed))
5053
return
5154
}
@@ -78,8 +81,20 @@ func (e *Engine) ResetGame() {
7881
}
7982
}
8083

81-
// TriggerTimedEvents checks for elapsed stage time, timeouts and cards
82-
func (e *Engine) TriggerTimedEvents(delta time.Duration) (eventTriggered bool) {
84+
// Update updates times and triggers events if needed
85+
func (e *Engine) Update() (newFullSecond bool, eventTriggered bool) {
86+
currentTime := e.TimeProvider()
87+
delta := currentTime.Sub(e.LastTimeUpdate)
88+
e.LastTimeUpdate = currentTime
89+
90+
newFullSecond = e.updateTimes(currentTime, delta)
91+
eventTriggered = e.triggerTimedEvents(delta)
92+
93+
return
94+
}
95+
96+
// triggerTimedEvents checks for elapsed stage time, timeouts and cards
97+
func (e *Engine) triggerTimedEvents(delta time.Duration) (eventTriggered bool) {
8398
eventTriggered = false
8499
if e.countStageTime() {
85100
if e.State.StageTimeLeft+delta > 0 && e.State.StageTimeLeft <= 0 {
@@ -103,8 +118,9 @@ func (e *Engine) TriggerTimedEvents(delta time.Duration) (eventTriggered bool) {
103118
return
104119
}
105120

106-
// UpdateTimes updates the times of the state
107-
func (e *Engine) UpdateTimes(delta time.Duration) (newFullSecond bool) {
121+
// updateTimes updates the times of the state
122+
func (e *Engine) updateTimes(currentTime time.Time, delta time.Duration) (newFullSecond bool) {
123+
108124
if e.countStageTime() {
109125
newFullSecond = newFullSecond || isNewFullSecond(e.State.StageTimeElapsed, delta)
110126

@@ -121,18 +137,18 @@ func (e *Engine) UpdateTimes(delta time.Duration) (newFullSecond bool) {
121137
e.State.TeamState[e.State.CommandFor].TimeoutTimeLeft -= delta
122138
}
123139

124-
curTime := e.TimeProvider()
125140
if e.State.MatchTimeStart.After(time.Unix(0, 0)) {
126-
newMatchDuration := curTime.Sub(e.State.MatchTimeStart)
141+
newMatchDuration := currentTime.Sub(e.State.MatchTimeStart)
127142
newFullSecond = newFullSecond || isNewFullSecond(e.State.MatchDuration, newMatchDuration-e.State.MatchDuration)
128143
e.State.MatchDuration = newMatchDuration
129144
}
130145

131146
if e.State.CurrentActionDeadline.After(time.Unix(0, 0)) {
132-
newCurrentActionTimeRemaining := e.State.CurrentActionDeadline.Sub(curTime)
147+
newCurrentActionTimeRemaining := e.State.CurrentActionDeadline.Sub(currentTime)
133148
newFullSecond = newFullSecond || isNewFullSecond(e.State.CurrentActionTimeRemaining, newCurrentActionTimeRemaining-e.State.CurrentActionTimeRemaining)
134149
e.State.CurrentActionTimeRemaining = newCurrentActionTimeRemaining
135150
}
151+
136152
return
137153
}
138154

internal/app/controller/engine_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ func processTransitionFile(t *testing.T, fileName string) {
105105
e.TimeProvider = func() time.Time {
106106
return initialTime.Add(elapsedTime)
107107
}
108+
e.LastTimeUpdate = e.TimeProvider()
108109

109110
// apply the initial state to the engine
110111
if err := stateTransitions.InitialState.valid(); err != nil {
@@ -127,8 +128,7 @@ func processTransitionFile(t *testing.T, fileName string) {
127128

128129
if s.Tick != nil {
129130
elapsedTime += *s.Tick
130-
e.UpdateTimes(*s.Tick)
131-
e.TriggerTimedEvents(*s.Tick)
131+
e.Update()
132132
}
133133

134134
if s.ExpectedStateDiff != nil {

0 commit comments

Comments
 (0)