@@ -109,10 +109,10 @@ func (s *RemoteControlServer) handleClientConnection(conn net.Conn) {
109
109
continue
110
110
}
111
111
}
112
- if err := s .processRequest (* client .team , req ); err != nil {
112
+ if response , err := s .processRequest (* client .team , req ); err != nil {
113
113
client .reply (client .Reject (err .Error ()))
114
114
} else {
115
- client .reply (client .Ok ())
115
+ client .replyWithPayload (client .Ok (), response )
116
116
}
117
117
}
118
118
}
@@ -136,38 +136,60 @@ func (s *RemoteControlServer) SendRequest(teamName string, request ControllerToR
136
136
func (c * RemoteControlClient ) reply (reply ControllerReply ) {
137
137
response := ControllerToRemoteControl {ControllerReply : & reply }
138
138
139
- teamState := c .gcEngine .CurrentState ().TeamState [c .team .String ()]
140
- response .Keeper = teamState .Goalkeeper
141
- response .SubstituteBot = timeSet (teamState .RequestsBotSubstitutionSince )
142
- response .EmergencyStop = c .gameEventPresent (state .GameEvent_EMERGENCY_STOP )
143
- response .Timeout = timeSet (teamState .RequestsTimeoutSince )
144
- response .ChallengeFlag = c .gameEventPresent (state .GameEvent_CHALLENGE_FLAG )
145
-
146
139
if err := sslconn .SendMessage (c .conn , & response ); err != nil {
147
140
log .Print ("Failed to send reply: " , err )
148
141
}
149
142
}
150
143
144
+ func (c * RemoteControlClient ) replyWithPayload (reply ControllerReply , response * ControllerToRemoteControl ) {
145
+ if response != nil {
146
+ response .ControllerReply = & reply
147
+
148
+ if err := sslconn .SendMessage (c .conn , response ); err != nil {
149
+ log .Print ("Failed to send reply: " , err )
150
+ }
151
+ } else {
152
+ c .reply (reply )
153
+ }
154
+ }
155
+
151
156
func timeSet (t * timestamp.Timestamp ) (set * bool ) {
152
157
set = new (bool )
153
158
* set = t != nil
154
159
return
155
160
}
156
161
157
- func ( c * RemoteControlClient ) gameEventPresent ( eventType state.GameEvent_Type ) (present * bool ) {
162
+ func gameEventPresent ( events [] * state. GameEvent , eventType state.GameEvent_Type , team state. Team ) (present * bool ) {
158
163
present = new (bool )
159
- for _ , event := range c . gcEngine . CurrentState (). GameEvents {
160
- if * event .Type == eventType && event .ByTeam () == * c . team {
164
+ for _ , event := range events {
165
+ if * event .Type == eventType && event .ByTeam () == team {
161
166
* present = true
162
167
}
163
168
}
164
169
return
165
170
}
166
171
167
- func (s * RemoteControlServer ) processRequest (team state.Team , request RemoteControlToController ) error {
172
+ func (s * RemoteControlServer ) processRequest (team state.Team , request RemoteControlToController ) ( * ControllerToRemoteControl , error ) {
168
173
169
- if request .GetPing () {
170
- return nil
174
+ if request .GetRequest () == RemoteControlToController_PING {
175
+ return nil , nil
176
+ }
177
+ if request .GetRequest () == RemoteControlToController_GET_STATE {
178
+ teamState := s .gcEngine .CurrentState ().TeamState [team .String ()]
179
+ emergencyStopDueIn := s .gcEngine .EmergencyStopDueIn (team )
180
+ var emergencyStopIn * float32
181
+ if emergencyStopDueIn != nil {
182
+ emergencyStopIn = new (float32 )
183
+ * emergencyStopIn = float32 (emergencyStopDueIn .Seconds ())
184
+ }
185
+ return & ControllerToRemoteControl {
186
+ Keeper : teamState .Goalkeeper ,
187
+ SubstituteBot : timeSet (teamState .RequestsBotSubstitutionSince ),
188
+ EmergencyStop : timeSet (teamState .RequestsEmergencyStopSince ),
189
+ EmergencyStopIn : emergencyStopIn ,
190
+ Timeout : timeSet (teamState .RequestsTimeoutSince ),
191
+ ChallengeFlag : gameEventPresent (s .gcEngine .CurrentState ().GameEvents , state .GameEvent_CHALLENGE_FLAG , team ),
192
+ }, nil
171
193
}
172
194
173
195
log .Print ("Received request from remote-control: " , proto .MarshalTextString (& request ))
@@ -177,7 +199,7 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
177
199
178
200
if x , ok := request .GetMsg ().(* RemoteControlToController_DesiredKeeper ); ok && * teamState .Goalkeeper != x .DesiredKeeper {
179
201
if err := mayChangeKeeper (s .gcEngine .CurrentGcState (), & teamState ); err != nil {
180
- return errors .Wrap (err , "Remote control requests to change keeper, but: " )
202
+ return nil , errors .Wrap (err , "Remote control requests to change keeper, but: " )
181
203
}
182
204
s .updateTeamConfig (team , & statemachine.UpdateTeamState {
183
205
Goalkeeper : & x .DesiredKeeper ,
@@ -190,7 +212,7 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
190
212
RequestsBotSubstitution : & x .SubstituteBot ,
191
213
})
192
214
}
193
- return nil
215
+ return nil , nil
194
216
}
195
217
196
218
if x , ok := request .GetMsg ().(* RemoteControlToController_Timeout ); ok {
@@ -199,51 +221,54 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
199
221
RequestsTimeout : & x .Timeout ,
200
222
})
201
223
}
202
- return nil
224
+ return nil , nil
203
225
}
204
226
205
- if x , ok := request .GetMsg ().(* RemoteControlToController_ChallengeFlag ); ok {
206
- if x .ChallengeFlag {
207
- if * teamState .ChallengeFlags <= 0 {
208
- return errors .New ("No more challenge flags left" )
209
- } else if * teamState .TimeoutsLeft <= 0 {
210
- return errors .New ("No more timeouts left" )
211
- }
212
- eventType := state .GameEvent_CHALLENGE_FLAG
213
- s .gcEngine .EnqueueGameEvent (& state.GameEvent {
214
- Type : & eventType ,
215
- Event : & state.GameEvent_ChallengeFlag_ {
216
- ChallengeFlag : & state.GameEvent_ChallengeFlag {
217
- ByTeam : & team ,
218
- },
219
- },
220
- })
227
+ if request .GetRequest () == RemoteControlToController_CHALLENGE_FLAG {
228
+ if * teamState .ChallengeFlags <= 0 {
229
+ return nil , errors .New ("No more challenge flags left" )
230
+ } else if * teamState .TimeoutsLeft <= 0 {
231
+ return nil , errors .New ("No more timeouts left" )
221
232
}
222
- return nil
233
+ eventType := state .GameEvent_CHALLENGE_FLAG
234
+ s .gcEngine .EnqueueGameEvent (& state.GameEvent {
235
+ Type : & eventType ,
236
+ Origin : []string {* origin (team )},
237
+ Event : & state.GameEvent_ChallengeFlag_ {
238
+ ChallengeFlag : & state.GameEvent_ChallengeFlag {
239
+ ByTeam : & team ,
240
+ },
241
+ },
242
+ })
243
+ return nil , nil
223
244
}
224
245
225
246
if x , ok := request .GetMsg ().(* RemoteControlToController_EmergencyStop ); ok {
226
- if x . EmergencyStop {
227
- if teamState . RequestsEmergencyStopSince != nil {
228
- return errors . Errorf ( "Emergency stop already requested at %v" , * teamState . RequestsEmergencyStopSince )
229
- }
247
+ if * currentState . GameState . Type != state . GameState_RUNNING {
248
+ return nil , errors . New ( "Game is not running, can not request emergency stop" )
249
+ }
250
+ if * timeSet ( teamState . RequestsEmergencyStopSince ) != x . EmergencyStop {
230
251
s .updateTeamConfig (team , & statemachine.UpdateTeamState {
231
252
RequestsEmergencyStop : & x .EmergencyStop ,
232
253
})
233
254
}
234
- return nil
255
+ return nil , nil
235
256
}
236
257
237
- return nil
258
+ return nil , nil
238
259
}
239
260
240
261
func (s * RemoteControlServer ) updateTeamConfig (team state.Team , update * statemachine.UpdateTeamState ) {
241
- origin := "Remote Control " + team .String ()
242
262
update .ForTeam = & team
243
263
s .gcEngine .Enqueue (& statemachine.Change {
244
- Origin : & origin ,
264
+ Origin : origin ( team ) ,
245
265
Change : & statemachine.Change_UpdateTeamState {
246
266
UpdateTeamState : update ,
247
267
},
248
268
})
249
269
}
270
+
271
+ func origin (team state.Team ) * string {
272
+ origin := "Remote Control " + team .String ()
273
+ return & origin
274
+ }
0 commit comments