Files
cheesy-arena-lite/static/js/alliance_station_display.js

126 lines
4.3 KiB
JavaScript

// 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 {
var body = $("body");
body.attr("data-mode", targetScreen);
if (targetScreen === "timeout") {
body.attr("data-position", "middle");
} else {
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); }
});
});