66 "github.com/RoboCup-SSL/ssl-game-controller/internal/app/statemachine"
77 "github.com/RoboCup-SSL/ssl-go-tools/pkg/sslconn"
88 "github.com/golang/protobuf/proto"
9+ "github.com/golang/protobuf/ptypes/timestamp"
910 "github.com/odeke-em/go-uuid"
1011 "github.com/pkg/errors"
1112 "io"
@@ -137,16 +138,32 @@ func (c *RemoteControlClient) reply(reply ControllerReply) {
137138
138139 teamState := c .gcEngine .CurrentState ().TeamState [c .team .String ()]
139140 response .Keeper = teamState .Goalkeeper
140- response .SubstituteBot = teamState .RequestsBotSubstitution
141- response .EmergencyStop = teamState . RequestsEmergencyStop
142- response .Timeout = teamState .RequestsTimeout
143- response .ChallengeFlag = teamState . RequestsChallenge
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 )
144145
145146 if err := sslconn .SendMessage (c .conn , & response ); err != nil {
146147 log .Print ("Failed to send reply: " , err )
147148 }
148149}
149150
151+ func timeSet (t * timestamp.Timestamp ) (set * bool ) {
152+ set = new (bool )
153+ * set = t != nil
154+ return
155+ }
156+
157+ func (c * RemoteControlClient ) gameEventPresent (eventType state.GameEvent_Type ) (present * bool ) {
158+ present = new (bool )
159+ for _ , event := range c .gcEngine .CurrentState ().GameEvents {
160+ if * event .Type == eventType && event .ByTeam () == * c .team {
161+ * present = true
162+ }
163+ }
164+ return
165+ }
166+
150167func (s * RemoteControlServer ) processRequest (team state.Team , request RemoteControlToController ) error {
151168
152169 if request .GetPing () {
@@ -168,7 +185,7 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
168185 }
169186
170187 if x , ok := request .GetMsg ().(* RemoteControlToController_SubstituteBot ); ok {
171- if * teamState .RequestsBotSubstitution != x .SubstituteBot {
188+ if * timeSet ( teamState .RequestsBotSubstitutionSince ) != x .SubstituteBot {
172189 s .updateTeamConfig (team , & statemachine.UpdateTeamState {
173190 RequestsBotSubstitution : & x .SubstituteBot ,
174191 })
@@ -177,7 +194,7 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
177194 }
178195
179196 if x , ok := request .GetMsg ().(* RemoteControlToController_Timeout ); ok {
180- if * teamState .RequestsTimeout != x .Timeout {
197+ if * timeSet ( teamState .RequestsTimeoutSince ) != x .Timeout {
181198 s .updateTeamConfig (team , & statemachine.UpdateTeamState {
182199 RequestsTimeout : & x .Timeout ,
183200 })
@@ -186,17 +203,30 @@ func (s *RemoteControlServer) processRequest(team state.Team, request RemoteCont
186203 }
187204
188205 if x , ok := request .GetMsg ().(* RemoteControlToController_ChallengeFlag ); ok {
189- if * teamState .RequestsChallenge != x .ChallengeFlag {
190- s .updateTeamConfig (team , & statemachine.UpdateTeamState {
191- RequestsChallenge : & x .ChallengeFlag ,
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+ },
192220 })
193221 }
194222 return nil
195223 }
196224
197225 if x , ok := request .GetMsg ().(* RemoteControlToController_EmergencyStop ); ok {
198- // note: emergency stop can not be disabled again
199226 if x .EmergencyStop {
227+ if teamState .RequestsEmergencyStopSince != nil {
228+ return errors .Errorf ("Emergency stop already requested at %v" , * teamState .RequestsEmergencyStopSince )
229+ }
200230 s .updateTeamConfig (team , & statemachine.UpdateTeamState {
201231 RequestsEmergencyStop : & x .EmergencyStop ,
202232 })
0 commit comments