mirror of
https://github.com/Team254/cheesy-arena-lite.git
synced 2026-03-09 21:56:50 -04:00
121 lines
4.2 KiB
JavaScript
121 lines
4.2 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 {
|
|
$("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); }
|
|
});
|
|
});
|