// Copyright 2014 Team 254. All Rights Reserved. // Author: pat@patfairbank.com (Patrick Fairbank) // // Client-side methods for the alliance station display. var station = ""; var blinkInterval; var currentScreen = "blank"; var websocket; // Handles a websocket message to change which screen is displayed. var handleAllianceStationDisplayMode = function(targetScreen) { currentScreen = targetScreen; if (station === "") { // Don't do anything if this screen hasn't been assigned a position yet. } else { $("body").attr("data-mode", targetScreen); switch (station[1]) { case "1": $("body").attr("data-position", "right"); break; case "2": $("body").attr("data-position", "middle"); break; case "3": $("body").attr("data-position", "left"); break; } } }; // Handles a websocket message to update the team to display. var handleMatchLoad = function(data) { if (station !== "") { var team = data.Teams[station]; if (team) { $("#teamNumber").text(team.Id); $("#teamNameText").attr("data-alliance-bg", station[0]).text(team.Nickname); var ranking = data.Rankings[team.Id]; if (ranking && data.MatchType === "Qualification") { var rankingText = ranking.Rank; $("#teamRank").attr("data-alliance-bg", station[0]).text(rankingText); } else { $("#teamRank").attr("data-alliance-bg", station[0]).text(""); } } else { $("#teamNumber").text(""); $("#teamNameText").attr("data-alliance-bg", station[0]).text(""); $("#teamRank").attr("data-alliance-bg", station[0]).text(""); } } }; // Handles a websocket message to update the team connection status. var handleArenaStatus = function(data) { stationStatus = data.AllianceStations[station]; var blink = false; if (stationStatus && stationStatus.Bypass) { $("#match").attr("data-status", "bypass"); } else if (stationStatus) { if (!stationStatus.DsConn || !stationStatus.DsConn.DsLinked) { $("#match").attr("data-status", station[0]); } else if (!stationStatus.DsConn.RobotLinked) { blink = true; if (!blinkInterval) { blinkInterval = setInterval(function() { var status = $("#match").attr("data-status"); $("#match").attr("data-status", (status === "") ? station[0] : ""); }, 250); } } else { $("#match").attr("data-status", ""); } } if (!blink && blinkInterval) { clearInterval(blinkInterval); blinkInterval = null; } }; // Handles a websocket message to update the match time countdown. var handleMatchTime = function(data) { translateMatchTime(data, function(matchState, matchStateText, countdownSec) { if (station[0] === "N") { // Pin the state for a non-alliance display to an in-match state, so as to always show time or score. matchState = "TELEOP_PERIOD"; } var countdownString = String(countdownSec % 60); if (countdownString.length === 1) { countdownString = "0" + countdownString; } countdownString = Math.floor(countdownSec / 60) + ":" + countdownString; $("#timeRemaining").text(countdownString); $("#match").attr("data-state", matchState); }); }; // 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); }; $(function() { // Read the configuration for this display from the URL query string. var urlParams = new URLSearchParams(window.location.search); station = urlParams.get("station"); // Set up the websocket back to the server. websocket = new CheesyWebsocket("/displays/alliance_station/websocket", { allianceStationDisplayMode: function(event) { handleAllianceStationDisplayMode(event.data); }, arenaStatus: function(event) { handleArenaStatus(event.data); }, matchLoad: function(event) { handleMatchLoad(event.data); }, matchTime: function(event) { handleMatchTime(event.data); }, matchTiming: function(event) { handleMatchTiming(event.data); }, realtimeScore: function(event) { handleRealtimeScore(event.data); } }); });