diff --git a/arena.go b/arena.go index 39d0b6b..6162238 100644 --- a/arena.go +++ b/arena.go @@ -54,6 +54,7 @@ type RealtimeScore struct { AutoCommitted bool TeleopCommitted bool FoulsCommitted bool + FieldReset bool undoAutoScores []Score undoCycles []Cycle } @@ -545,7 +546,7 @@ func (arena *Arena) handleLighting(alliance string, score *RealtimeScore) { } arena.lights.SetAssistGoal(alliance, score.CurrentCycle.Assists) case POST_MATCH: - if mainArena.redRealtimeScore.FoulsCommitted && mainArena.blueRealtimeScore.FoulsCommitted { + if mainArena.redRealtimeScore.FieldReset && mainArena.blueRealtimeScore.FieldReset { arena.lights.SetFieldReset() } else { arena.lights.ClearGoal(alliance) diff --git a/displays.go b/displays.go index 73ef62b..9ee6635 100644 --- a/displays.go +++ b/displays.go @@ -897,6 +897,14 @@ func RefereeDisplayWebsocketHandler(w http.ResponseWriter, r *http.Request) { } cards[strconv.Itoa(args.TeamId)] = args.Card continue + case "signalReset": + if mainArena.MatchState != POST_MATCH { + // Don't allow clearing the field until the match is over. + continue + } + mainArena.redRealtimeScore.FieldReset = true + mainArena.blueRealtimeScore.FieldReset = true + continue // Don't reload. case "commitMatch": if mainArena.MatchState != POST_MATCH { // Don't allow committing the fouls until the match is over. @@ -904,6 +912,8 @@ func RefereeDisplayWebsocketHandler(w http.ResponseWriter, r *http.Request) { } mainArena.redRealtimeScore.FoulsCommitted = true mainArena.blueRealtimeScore.FoulsCommitted = true + mainArena.redRealtimeScore.FieldReset = true + mainArena.blueRealtimeScore.FieldReset = true mainArena.scoringStatusNotifier.Notify(nil) default: websocket.WriteError(fmt.Sprintf("Invalid message type '%s'.", messageType)) diff --git a/displays_test.go b/displays_test.go index 9556f2e..384ad2c 100644 --- a/displays_test.go +++ b/displays_test.go @@ -432,10 +432,20 @@ func TestRefereeDisplayWebsocket(t *testing.T) { assert.Equal(t, "red", mainArena.blueRealtimeScore.Cards["1680"]) } - // Test match committing. + // Test field reset and match committing. mainArena.MatchState = POST_MATCH - ws.Write("commitMatch", foulData) + ws.Write("signalReset", nil) + time.Sleep(time.Millisecond * 10) + assert.True(t, mainArena.redRealtimeScore.FieldReset) + assert.True(t, mainArena.blueRealtimeScore.FieldReset) + assert.False(t, mainArena.redRealtimeScore.FoulsCommitted) + assert.False(t, mainArena.blueRealtimeScore.FoulsCommitted) + mainArena.redRealtimeScore.FieldReset = false + mainArena.blueRealtimeScore.FieldReset = false + ws.Write("commitMatch", nil) readWebsocketType(t, ws, "reload") + assert.True(t, mainArena.redRealtimeScore.FieldReset) + assert.True(t, mainArena.blueRealtimeScore.FieldReset) assert.True(t, mainArena.redRealtimeScore.FoulsCommitted) assert.True(t, mainArena.blueRealtimeScore.FoulsCommitted) diff --git a/static/js/referee_display.js b/static/js/referee_display.js index 19d332b..537f2d7 100644 --- a/static/js/referee_display.js +++ b/static/js/referee_display.js @@ -77,6 +77,11 @@ var cycleCard = function(cardButton) { $(cardButton).attr("data-card", newCard); }; +// Signals to the teams that they may enter the field. +var signalReset = function() { + websocket.send("signalReset"); +}; + // Signals the scorekeeper that foul entry is complete for this match. var commitMatch = function() { websocket.send("commitMatch"); diff --git a/templates/referee_display.html b/templates/referee_display.html index 9731f2e..eb95be3 100644 --- a/templates/referee_display.html +++ b/templates/referee_display.html @@ -60,11 +60,13 @@ {{end}}