From 0ed6f771d5de8ac48af08cff502eedb64d69def8 Mon Sep 17 00:00:00 2001 From: Patrick Fairbank Date: Sat, 4 Apr 2020 15:52:49 -0700 Subject: [PATCH] Move ControlPanel to within RealtimeScore to reduce complexity. --- field/arena.go | 9 ++------- field/arena_notifiers.go | 11 ++--------- field/realtime_score.go | 1 + static/js/scoring_panel.js | 16 ++-------------- web/scoring_panel.go | 11 +++-------- web/scoring_panel_test.go | 10 ++-------- 6 files changed, 12 insertions(+), 46 deletions(-) diff --git a/field/arena.go b/field/arena.go index 9aca253..c1db41d 100644 --- a/field/arena.go +++ b/field/arena.go @@ -77,8 +77,6 @@ type Arena struct { MuteMatchSounds bool matchAborted bool soundsPlayed map[*game.MatchSound]struct{} - RedControlPanel *game.ControlPanel - BlueControlPanel *game.ControlPanel } type AllianceStation struct { @@ -216,13 +214,10 @@ func (arena *Arena) LoadMatch(match *model.Match) error { arena.FieldVolunteers = false arena.FieldReset = false arena.ScoringPanelRegistry.resetScoreCommitted() - arena.RedControlPanel = new(game.ControlPanel) - arena.BlueControlPanel = new(game.ControlPanel) // Notify any listeners about the new match. arena.MatchLoadNotifier.Notify() arena.RealtimeScoreNotifier.Notify() - arena.ControlPanelColorNotifier.Notify() arena.AllianceStationDisplayMode = "match" arena.AllianceStationDisplayModeNotifier.Notify() @@ -772,8 +767,8 @@ func (arena *Arena) handlePlcInput() { blueScore.StageAtCapacity(game.Stage3, arena.MatchState >= TeleopPeriod) && blueScore.Stage3TargetColor == game.ColorUnknown { // Determine the position control target colors and send packets to inform the driver stations. - redScore.Stage3TargetColor = arena.RedControlPanel.GetStage3TargetColor() - blueScore.Stage3TargetColor = arena.BlueControlPanel.GetStage3TargetColor() + redScore.Stage3TargetColor = arena.RedRealtimeScore.ControlPanel.GetStage3TargetColor() + blueScore.Stage3TargetColor = arena.BlueRealtimeScore.ControlPanel.GetStage3TargetColor() arena.sendGameDataPacket(redScore.Stage3TargetColor, "R1", "R2", "R3") arena.sendGameDataPacket(blueScore.Stage3TargetColor, "B1", "B2", "B3") } diff --git a/field/arena_notifiers.go b/field/arena_notifiers.go index 950954f..f98158f 100644 --- a/field/arena_notifiers.go +++ b/field/arena_notifiers.go @@ -30,7 +30,6 @@ type ArenaNotifiers struct { ReloadDisplaysNotifier *websocket.Notifier ScorePostedNotifier *websocket.Notifier ScoringStatusNotifier *websocket.Notifier - ControlPanelColorNotifier *websocket.Notifier } type MatchTimeMessage struct { @@ -41,6 +40,7 @@ type MatchTimeMessage struct { type audienceAllianceScoreFields struct { Score *game.Score ScoreSummary *game.ScoreSummary + ControlPanel *game.ControlPanel } // Instantiates notifiers and configures their message producing methods. @@ -63,7 +63,6 @@ func (arena *Arena) configureNotifiers() { arena.ReloadDisplaysNotifier = websocket.NewNotifier("reload", nil) arena.ScorePostedNotifier = websocket.NewNotifier("scorePosted", arena.generateScorePostedMessage) arena.ScoringStatusNotifier = websocket.NewNotifier("scoringStatus", arena.generateScoringStatusMessage) - arena.ControlPanelColorNotifier = websocket.NewNotifier("controlPanelColor", arena.generateControlPanelColorMessage) } func (arena *Arena) generateAllianceSelectionMessage() interface{} { @@ -236,19 +235,13 @@ func (arena *Arena) generateScoringStatusMessage() interface{} { arena.ScoringPanelRegistry.GetNumPanels("blue"), arena.ScoringPanelRegistry.GetNumScoreCommitted("blue")} } -func (arena *Arena) generateControlPanelColorMessage() interface{} { - return &struct { - RedControlPanelColor game.ControlPanelColor - BlueControlPanelColor game.ControlPanelColor - }{arena.RedControlPanel.CurrentColor, arena.BlueControlPanel.CurrentColor} -} - // Constructs the data object for one alliance sent to the audience display for the realtime scoring overlay. func getAudienceAllianceScoreFields(allianceScore *RealtimeScore, allianceScoreSummary *game.ScoreSummary) *audienceAllianceScoreFields { fields := new(audienceAllianceScoreFields) fields.Score = &allianceScore.CurrentScore fields.ScoreSummary = allianceScoreSummary + fields.ControlPanel = &allianceScore.ControlPanel return fields } diff --git a/field/realtime_score.go b/field/realtime_score.go index 5e23321..9cf7df1 100644 --- a/field/realtime_score.go +++ b/field/realtime_score.go @@ -11,6 +11,7 @@ type RealtimeScore struct { CurrentScore game.Score Cards map[string]string FoulsCommitted bool + ControlPanel game.ControlPanel } func NewRealtimeScore() *RealtimeScore { diff --git a/static/js/scoring_panel.js b/static/js/scoring_panel.js index 17e8c8e..752156b 100644 --- a/static/js/scoring_panel.js +++ b/static/js/scoring_panel.js @@ -85,22 +85,11 @@ var handleRealtimeScore = function(data) { } $("#rungIsLevel>.value").text(score.RungIsLevel ? "Yes" : "No"); $("#rungIsLevel").attr("data-value", score.RungIsLevel); + $("#controlPanelColor>.value").text(getControlPanelColorText(realtimeScore.ControlPanel.CurrentColor)); + $("#controlPanelColor").attr("data-value", realtimeScore.ControlPanel.CurrentColor); $("#controlPanelColor").attr("data-control-panel-status", score.ControlPanelStatus) }; -// Handles a websocket message to update the Control Panel color. -var handleControlPanelColor = function(data) { - var color; - if (alliance === "red") { - color = data.RedControlPanelColor; - } else { - color = data.BlueControlPanelColor; - } - - $("#controlPanelColor>.value").text(getControlPanelColorText(color)); - $("#controlPanelColor").attr("data-value", color); -}; - // Handles a keyboard event and sends the appropriate websocket message. var handleKeyPress = function(event) { websocket.send(String.fromCharCode(event.keyCode)); @@ -164,7 +153,6 @@ $(function() { matchLoad: function(event) { handleMatchLoad(event.data); }, matchTime: function(event) { handleMatchTime(event.data); }, realtimeScore: function(event) { handleRealtimeScore(event.data); }, - controlPanelColor: function(event) { handleControlPanelColor(event.data); } }); $(document).keypress(handleKeyPress); diff --git a/web/scoring_panel.go b/web/scoring_panel.go index e97e4b9..e4207c4 100644 --- a/web/scoring_panel.go +++ b/web/scoring_panel.go @@ -82,7 +82,7 @@ func (web *Web) scoringPanelWebsocketHandler(w http.ResponseWriter, r *http.Requ // Subscribe the websocket to the notifiers whose messages will be passed on to the client, in a separate goroutine. go ws.HandleNotifiers(web.arena.MatchLoadNotifier, web.arena.MatchTimeNotifier, web.arena.RealtimeScoreNotifier, - web.arena.ControlPanelColorNotifier, web.arena.ReloadDisplaysNotifier) + web.arena.ReloadDisplaysNotifier) // Loop, waiting for commands and responding to them, until the client closes the connection. for { @@ -192,17 +192,12 @@ func (web *Web) scoringPanelWebsocketHandler(w http.ResponseWriter, r *http.Requ scoreChanged = true case "K": if score.ControlPanelStatus == game.ControlPanelRotation { - var controlPanel *game.ControlPanel - if alliance == "red" { - controlPanel = web.arena.RedControlPanel - } else { - controlPanel = web.arena.BlueControlPanel - } + controlPanel := &(*realtimeScore).ControlPanel controlPanel.CurrentColor++ if controlPanel.CurrentColor == 5 { controlPanel.CurrentColor = 1 } - web.arena.ControlPanelColorNotifier.Notify() + scoreChanged = true } case "P": if score.ControlPanelStatus == game.ControlPanelPosition { diff --git a/web/scoring_panel_test.go b/web/scoring_panel_test.go index 490773b..eeb41f3 100644 --- a/web/scoring_panel_test.go +++ b/web/scoring_panel_test.go @@ -50,11 +50,9 @@ func TestScoringPanelWebsocket(t *testing.T) { readWebsocketType(t, redWs, "matchLoad") readWebsocketType(t, redWs, "matchTime") readWebsocketType(t, redWs, "realtimeScore") - readWebsocketType(t, redWs, "controlPanelColor") readWebsocketType(t, blueWs, "matchLoad") readWebsocketType(t, blueWs, "matchTime") readWebsocketType(t, blueWs, "realtimeScore") - readWebsocketType(t, blueWs, "controlPanelColor") // Send some autonomous period scoring commands. web.arena.MatchState = field.AutoPeriod @@ -109,13 +107,9 @@ func TestScoringPanelWebsocket(t *testing.T) { web.arena.ResetMatch() web.arena.LoadTestMatch() readWebsocketType(t, redWs, "matchLoad") - messages := readWebsocketMultiple(t, redWs, 2) - assert.Contains(t, messages, "realtimeScore") - assert.Contains(t, messages, "controlPanelColor") + readWebsocketType(t, redWs, "realtimeScore") readWebsocketType(t, blueWs, "matchLoad") - messages = readWebsocketMultiple(t, blueWs, 2) - assert.Contains(t, messages, "realtimeScore") - assert.Contains(t, messages, "controlPanelColor") + readWebsocketType(t, blueWs, "realtimeScore") assert.Equal(t, field.NewRealtimeScore(), web.arena.RedRealtimeScore) assert.Equal(t, field.NewRealtimeScore(), web.arena.BlueRealtimeScore) assert.Equal(t, 0, web.arena.ScoringPanelRegistry.GetNumScoreCommitted("red"))