// Copyright 2014 Team 254. All Rights Reserved. // Author: pat@patfairbank.com (Patrick Fairbank) // // Client-side logic for the announcer display. var websocket; var teamTemplate = Handlebars.compile($("#teamTemplate").html()); var matchResultTemplate = Handlebars.compile($("#matchResultTemplate").html()); Handlebars.registerHelper("eachMapEntry", function(context, options) { var ret = ""; $.each(context, function(key, value) { var entry = {"key": key, "value": value}; ret = ret + options.fn(entry); }); return ret; }); // Handles a websocket message to hide the score dialog once the next match is being introduced. var handleAudienceDisplayMode = function(targetScreen) { // Hide the final results so that they aren't blocking the current teams when the announcer needs them most. if (targetScreen === "intro" || targetScreen === "match") { $("#matchResult").modal("hide"); } }; // Handles a websocket message to update the teams for the current match. var handleMatchLoad = function(data) { $("#matchName").text(data.MatchType + " Match " + data.Match.DisplayName); const teams = $("#teams"); teams.empty(); if (data.Match.Type === "elimination") { teams.append(createAllianceElement("red", data.Match.ElimRedAlliance)); } teams.append(createTeamElement("red", data.Teams["R1"], false)); teams.append(createTeamElement("red", data.Teams["R2"], false)); teams.append(createTeamElement("red", data.Teams["R3"], false)); for (team of data.RedOffFieldTeams) { teams.append(createTeamElement("red", team, true)); } if (data.Match.Type === "elimination") { teams.append(createAllianceElement("blue", data.Match.ElimBlueAlliance)); } teams.append(createTeamElement("blue", data.Teams["B1"], false)); teams.append(createTeamElement("blue", data.Teams["B2"], false)); teams.append(createTeamElement("blue", data.Teams["B3"], false)); for (team of data.BlueOffFieldTeams) { teams.append(createTeamElement("blue", team, true)); } }; // Handles a websocket message to update the match time countdown. var handleMatchTime = function(data) { translateMatchTime(data, function(matchState, matchStateText, countdownSec) { $("#matchState").text(matchStateText); $("#matchTime").text(getCountdown(data.MatchState, data.MatchTimeSec)); }); }; // Handles a websocket message to update the match score. var handleRealtimeScore = function(data) { $("#redScore").text(data.Red.ScoreSummary.Score - data.Red.ScoreSummary.EndgamePoints); $("#blueScore").text(data.Blue.ScoreSummary.Score - data.Blue.ScoreSummary.EndgamePoints); }; // Handles a websocket message to populate the final score data. var handleScorePosted = function(data) { var redRankings = {}; redRankings[data.Match.Red1] = getRankingText(data.Match.Red1, data.Rankings); redRankings[data.Match.Red2] = getRankingText(data.Match.Red2, data.Rankings); redRankings[data.Match.Red3] = getRankingText(data.Match.Red3, data.Rankings); var blueRankings = {}; blueRankings[data.Match.Blue1] = getRankingText(data.Match.Blue1, data.Rankings); blueRankings[data.Match.Blue2] = getRankingText(data.Match.Blue2, data.Rankings); blueRankings[data.Match.Blue3] = getRankingText(data.Match.Blue3, data.Rankings); $("#scoreMatchName").text(data.MatchType + " Match " + data.Match.DisplayName); $("#redScoreDetails").html(matchResultTemplate({score: data.RedScoreSummary, rankings: redRankings})); $("#blueScoreDetails").html(matchResultTemplate({score: data.BlueScoreSummary, rankings: blueRankings})); $("#matchResult").modal("show"); }; // Creates the block containing the playoff alliance number. var createAllianceElement = function(alliance, allianceNumber) { return $(`