@@ -109,10 +109,10 @@ func (s *RemoteControlServer) handleClientConnection(conn net.Conn) {
109109 continue
110110 }
111111 }
112- if err := s .processRequest (* client .team , req ); err != nil {
112+ if response , err := s .processRequest (* client .team , req ); err != nil {
113113 client .reply (client .Reject (err .Error ()))
114114 } else {
115- client .reply (client .Ok ())
115+ client .replyWithPayload (client .Ok (), response )
116116 }
117117 }
118118}
@@ -136,38 +136,60 @@ func (s *RemoteControlServer) SendRequest(teamName string, request ControllerToR
136136func (c * RemoteControlClient ) reply (reply ControllerReply ) {
137137 response := ControllerToRemoteControl {ControllerReply : & reply }
138138
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-
146139 if err := sslconn .SendMessage (c .conn , & response ); err != nil {
147140 log .Print ("Failed to send reply: " , err )
148141 }
149142}
150143
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+
151156func timeSet (t * timestamp.Timestamp ) (set * bool ) {
152157 set = new (bool )
153158 * set = t != nil
154159 return
155160}
156161
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 ) {
158163 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 {
161166 * present = true
162167 }
163168 }
164169 return
165170}
166171
167- func (s * RemoteControlServer ) processRequest (team state.Team , request RemoteControlToController ) error {
172+ func (s * RemoteControlServer ) processRequest (team state.Team , request RemoteControlToController ) ( * ControllerToRemoteControl , error ) {
168173
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
171193 }
172194
173195 log .Print ("Received request from remote-control: " , proto .MarshalTextString (& request ))
@@ -177,7 +199,7 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
177199
178200 if x , ok := request .GetMsg ().(* RemoteControlToController_DesiredKeeper ); ok && * teamState .Goalkeeper != x .DesiredKeeper {
179201 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: " )
181203 }
182204 s .updateTeamConfig (team , & statemachine.UpdateTeamState {
183205 Goalkeeper : & x .DesiredKeeper ,
@@ -190,7 +212,7 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
190212 RequestsBotSubstitution : & x .SubstituteBot ,
191213 })
192214 }
193- return nil
215+ return nil , nil
194216 }
195217
196218 if x , ok := request .GetMsg ().(* RemoteControlToController_Timeout ); ok {
@@ -199,51 +221,54 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
199221 RequestsTimeout : & x .Timeout ,
200222 })
201223 }
202- return nil
224+ return nil , nil
203225 }
204226
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" )
221232 }
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
223244 }
224245
225246 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 {
230251 s .updateTeamConfig (team , & statemachine.UpdateTeamState {
231252 RequestsEmergencyStop : & x .EmergencyStop ,
232253 })
233254 }
234- return nil
255+ return nil , nil
235256 }
236257
237- return nil
258+ return nil , nil
238259}
239260
240261func (s * RemoteControlServer ) updateTeamConfig (team state.Team , update * statemachine.UpdateTeamState ) {
241- origin := "Remote Control " + team .String ()
242262 update .ForTeam = & team
243263 s .gcEngine .Enqueue (& statemachine.Change {
244- Origin : & origin ,
264+ Origin : origin ( team ) ,
245265 Change : & statemachine.Change_UpdateTeamState {
246266 UpdateTeamState : update ,
247267 },
248268 })
249269}
270+
271+ func origin (team state.Team ) * string {
272+ origin := "Remote Control " + team .String ()
273+ return & origin
274+ }
0 commit comments