@@ -19,7 +19,8 @@ type RemoteControlServer struct {
19
19
}
20
20
21
21
type RemoteControlClient struct {
22
- team * state.Team
22
+ gcEngine * engine.Engine
23
+ team * state.Team
23
24
* Client
24
25
}
25
26
@@ -67,11 +68,14 @@ func (c *RemoteControlClient) receiveRegistration(server *RemoteControlServer) e
67
68
func (s * RemoteControlServer ) handleClientConnection (conn net.Conn ) {
68
69
defer func () {
69
70
if err := conn .Close (); err != nil {
70
- log .Printf ("Could not close team client connection: %v" , err )
71
+ log .Printf ("Could not close remote control client connection: %v" , err )
71
72
}
72
73
}()
73
74
74
- client := RemoteControlClient {Client : & Client {conn : conn , token : uuid .New ()}}
75
+ client := RemoteControlClient {
76
+ Client : & Client {conn : conn , token : uuid .New ()},
77
+ gcEngine : s .gcEngine ,
78
+ }
75
79
client .reply (client .Ok ())
76
80
77
81
err := client .receiveRegistration (s )
@@ -125,11 +129,19 @@ func (s *RemoteControlServer) SendRequest(teamName string, request ControllerToR
125
129
if client , ok := s .clients [teamName ]; ok {
126
130
return sslconn .SendMessage (client .conn , & request )
127
131
}
128
- return errors .Errorf ("Team Client '%v' not connected" , teamName )
132
+ return errors .Errorf ("Remote control client '%v' not connected" , teamName )
129
133
}
130
134
131
135
func (c * RemoteControlClient ) reply (reply ControllerReply ) {
132
136
response := ControllerToRemoteControl {ControllerReply : & reply }
137
+
138
+ teamState := c .gcEngine .CurrentState ().TeamState [c .team .String ()]
139
+ response .Keeper = teamState .Goalkeeper
140
+ response .SubstituteBot = teamState .RequestsBotSubstitution
141
+ response .EmergencyStop = teamState .RequestsEmergencyStop
142
+ response .Timeout = teamState .RequestsTimeout
143
+ response .ChallengeFlag = teamState .RequestsChallenge
144
+
133
145
if err := sslconn .SendMessage (c .conn , & response ); err != nil {
134
146
log .Print ("Failed to send reply: " , err )
135
147
}
@@ -141,45 +153,67 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
141
153
return nil
142
154
}
143
155
144
- log .Print ("Received request from team : " , proto .MarshalTextString (& request ))
156
+ log .Print ("Received request from remote-control : " , proto .MarshalTextString (& request ))
145
157
146
158
currentState := s .gcEngine .CurrentState ()
147
159
teamState := * currentState .TeamInfo (team )
148
- origin := team .String ()
160
+
161
+ if x , ok := request .GetMsg ().(* RemoteControlToController_DesiredKeeper ); ok && * teamState .Goalkeeper != x .DesiredKeeper {
162
+ if err := mayChangeKeeper (s .gcEngine .CurrentGcState (), & teamState ); err != nil {
163
+ return errors .Wrap (err , "Remote control requests to change keeper, but: " )
164
+ }
165
+ s .updateTeamConfig (team , & statemachine.UpdateTeamState {
166
+ Goalkeeper : & x .DesiredKeeper ,
167
+ })
168
+ }
149
169
150
170
if x , ok := request .GetMsg ().(* RemoteControlToController_SubstituteBot ); ok {
151
- if * teamState .BotSubstitutionIntent != x .SubstituteBot {
152
- log .Printf ("Remote control %v requests to change bot substituation intent to %v" , team .String (), x .SubstituteBot )
153
- s .gcEngine .Enqueue (& statemachine.Change {
154
- Origin : & origin ,
155
- Change : & statemachine.Change_UpdateTeamState {
156
- UpdateTeamState : & statemachine.UpdateTeamState {
157
- ForTeam : & team ,
158
- BotSubstitutionIntent : & x .SubstituteBot ,
159
- }},
171
+ if * teamState .RequestsBotSubstitution != x .SubstituteBot {
172
+ s .updateTeamConfig (team , & statemachine.UpdateTeamState {
173
+ RequestsBotSubstitution : & x .SubstituteBot ,
160
174
})
161
175
}
162
176
return nil
163
177
}
164
178
165
- if x , ok := request .GetMsg ().(* RemoteControlToController_DesiredKeeper ); ok && * teamState .Goalkeeper != x .DesiredKeeper {
166
- if currentState .Command .IsRunning () || currentState .Command .IsPrepare () {
167
- return errors .New ("Can not change keeper while game is running." )
179
+ if x , ok := request .GetMsg ().(* RemoteControlToController_Timeout ); ok {
180
+ if * teamState .RequestsTimeout != x .Timeout {
181
+ s .updateTeamConfig (team , & statemachine.UpdateTeamState {
182
+ RequestsTimeout : & x .Timeout ,
183
+ })
184
+ }
185
+ return nil
186
+ }
187
+
188
+ if x , ok := request .GetMsg ().(* RemoteControlToController_ChallengeFlag ); ok {
189
+ if * teamState .RequestsChallenge != x .ChallengeFlag {
190
+ s .updateTeamConfig (team , & statemachine.UpdateTeamState {
191
+ RequestsChallenge : & x .ChallengeFlag ,
192
+ })
168
193
}
194
+ return nil
195
+ }
169
196
170
- if err := mayChangeKeeper (s .gcEngine .CurrentGcState (), & teamState ); err != nil {
171
- return errors .Wrap (err , "Remote control requests to change keeper, but: " )
197
+ if x , ok := request .GetMsg ().(* RemoteControlToController_EmergencyStop ); ok {
198
+ // note: emergency stop can not be disabled again
199
+ if x .EmergencyStop {
200
+ s .updateTeamConfig (team , & statemachine.UpdateTeamState {
201
+ RequestsEmergencyStop : & x .EmergencyStop ,
202
+ })
172
203
}
173
- log .Printf ("Remote control %v requests to change keeper to %v" , team , x .DesiredKeeper )
174
- s .gcEngine .Enqueue (& statemachine.Change {
175
- Origin : & origin ,
176
- Change : & statemachine.Change_UpdateTeamState {
177
- UpdateTeamState : & statemachine.UpdateTeamState {
178
- ForTeam : & team ,
179
- Goalkeeper : & x .DesiredKeeper ,
180
- }},
181
- })
204
+ return nil
182
205
}
183
206
184
207
return nil
185
208
}
209
+
210
+ func (s * RemoteControlServer ) updateTeamConfig (team state.Team , update * statemachine.UpdateTeamState ) {
211
+ origin := "Remote Control " + team .String ()
212
+ update .ForTeam = & team
213
+ s .gcEngine .Enqueue (& statemachine.Change {
214
+ Origin : & origin ,
215
+ Change : & statemachine.Change_UpdateTeamState {
216
+ UpdateTeamState : update ,
217
+ },
218
+ })
219
+ }
0 commit comments