'use strict'; /** * The Race Administrator App is designed to make managing a race easier. *

* There are session commands that get issued as soon as you click them. * These commands are Advance Session, All Chat On, All Chat Off, Caution. *

* There are driver commands where you have to click the command to issue first, * (it will turn green), and then click each driver to apply the command to. * The driver command will stay active until you change it, except for the Remove command. *

* The last 5 commands sent will be shown at the bottom left of the screen. * * * * NOTE: All parameters are specified in the URL. * @ngdoc apps * @name RaceAdministrator * @param {boolean} showFPS When any value is seen in the URL for this attribute, the Frames Per Second(FPS) will be shown. Defaults to not show. * @author Jeffrey Gilliam * @since 1.0 * @copyright Copyright (C) 2015 - 2024 Jeffrey Gilliam * @license Apache License 2.0 */ require(SIMRacingAppsRequireConfig, ['angular' ,'SIMRacingApps' ,'css!default' ,'widgets/CarSelector64/CarSelector64' ], function( angular, SIMRacingApps) { angular.element(document).ready(function() { //create any angular filters, values, constants, directives here on the SIMRacingApps.module //your application controller is added as a controller on the SIMRacingApps module SIMRacingApps.module.controller("SIMRacingApps-Controller", ['$scope','sraDispatcher','$timeout', function($scope, sraDispatcher, $timeout) { sraDispatcher.loadTranslations("/SIMRacingApps/apps/RaceAdministrator","text",function(path) { $scope.translations = sraDispatcher.getTranslation(path,"auto"); }); $scope.clickDelay = 2000; $scope.activeDriverButton = ""; $scope.currentCarCommand = ""; $scope.sentCommands = [0,1,2,3,4]; $scope.sentCommandsText = [' ',' ',' ',' ',' ']; $scope.restartMethod = ""; $scope.sendCommand = function(command) { sraDispatcher.sendCommand(command); $scope.sentCommandsText[0] = $scope.sentCommandsText[1]; $scope.sentCommandsText[1] = $scope.sentCommandsText[2]; $scope.sentCommandsText[2] = $scope.sentCommandsText[3]; $scope.sentCommandsText[3] = $scope.sentCommandsText[4]; $scope.sentCommandsText[4] = command; console.log(command); }; $scope.cautionClicked = function($clickedScope) { console.log("Caution clicked"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Session/setCautionFlag"); //delay a little, then clear the clicked state. $timeout(function () { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.addcautionlapClicked = function($clickedScope) { console.log("Add Caution Lap clicked"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Session/setCautionLapsAdjust/1"); //delay a little, then clear the clicked state. $timeout(function () { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.subtractcautionlapClicked = function($clickedScope) { console.log("Subtract Caution Lap clicked"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Session/setCautionLapsAdjust/-1"); //delay a little, then clear the clicked state. $timeout(function () { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.onetogreenClicked = function($clickedScope) { console.log("One To Green clicked"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Session/setCautionLaps/1"); //delay a little, then clear the clicked state. $timeout(function () { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.restartClicked = function($clickedScope) { console.log("Restart clicked"); $clickedScope.setClickedState('clicked'); //do the opposite if ($scope.restartMethod == 'DOUBLEFILE') $scope.sendCommand("Session/setRestart/SINGLEFILE"); else if ($scope.restartMethod == 'SINGLEFILE') $scope.sendCommand("Session/setRestart/DOUBLEFILE"); //delay a little, then clear the clicked state. $timeout(function () { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.chatOnClicked = function($clickedScope) { console.log("Chat On Clicked"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Session/setChatFlag/Y"); //delay a little, then clear the clicked state. $timeout(function () { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.chatOffClicked = function($clickedScope) { console.log("Chat Off Clicked"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Session/setChatFlag/N"); //delay a little, then clear the clicked state. $timeout(function () { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.advanceClicked = function($clickedScope) { console.log("Advance Clicked"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Session/setAdvanceFlag"); //delay a little, then clear the clicked state. $timeout(function () { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.openPitRoadClicked = function($clickedScope) { console.log("Open Pit Road Clicked"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Session/setPitOpen"); //delay a little, then clear the clicked state. $timeout(function() { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.closePitRoadClicked = function($clickedScope) { console.log("Close Pit Road Clicked"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Session/setPitClose"); //delay a little, then clear the clicked state. $timeout(function() { $clickedScope.setClickedState('none'); }, $scope.clickDelay); }; $scope.DRIVERADMINON_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERADMINON"; $scope.currentCarCommand = "setAdminFlag/Y"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERADMINOFF_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERADMINOFF"; $scope.currentCarCommand = "setAdminFlag/N"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERCHATON_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERCHATON"; $scope.currentCarCommand = "setChatFlag/Y"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERCHATOFF_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERCHATOFF"; $scope.currentCarCommand = "setChatFlag/N"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERREMOVE_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERREMOVE"; $scope.currentCarCommand = "setRemoveFlag"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERWAVEAROUND_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERWAVEAROUND"; $scope.currentCarCommand = "setWaveAroundFlag"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERBLACKDRIVETHROUGH_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERBLACKDRIVETHROUGH"; $scope.currentCarCommand = "setBlackFlag/-1"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERBLACK0_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERBLACK0"; $scope.currentCarCommand = "setBlackFlag/0"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERBLACK15_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERBLACK15"; $scope.currentCarCommand = "setBlackFlag/15"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERBLACKLAP_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERBLACKLAP"; $scope.currentCarCommand = "setBlackFlag/1/lap"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERDQ_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERDQ"; $scope.currentCarCommand = "setDisqualifyFlag"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVEREOL_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVEREOL"; $scope.currentCarCommand = "setEndOfLineFlag"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.DRIVERCLEARALLPENALTIES_Clicked = function($clickedScope) { $scope.activeDriverButton = "DRIVERCLEARALLPENALTIES"; $scope.currentCarCommand = "setClearPenaltiesFlag"; console.log($scope.activeDriverButton+"_Clicked"); }; $scope.carClicked = function($clickedScope,car) { if ($scope.currentCarCommand && car) { console.log("RaceAdministrator.carClicked("+car+")"); $clickedScope.setClickedState('clicked'); $scope.sendCommand("Car/"+car+"/"+$scope.currentCarCommand); //This command is not reversable, so after it has been issued, remove it from the active button state. if ($scope.activeDriverButton == "DRIVERREMOVE") { $scope.activeDriverButton = ""; $scope.currentCarCommand = ""; } //delay a little, then clear the clicked state. $timeout(function () { $clickedScope.setClickedState('none'); }, $scope.clickDelay); } }; //TODO: Move this code to the server and add these to the settings var isEnabled = false; //is this functionality enabled? Set to true or false var car = 'P10'; //Car to watch for throwing the caution var delay = 0; //amount to delay (milliseconds) before throwing the caution var laps = [45,90]; //laps throw caution on. Add as many as you want var interval = 100; //polling frequency in milliseconds var car_pitclose = 'P1'; //Car to watch for closing the pits var delay_pitclose = 0; //amount to delay (milliseconds) before closing the pits var laps_pitclose = [43,88]; //laps to close the pits based on when car_pitclose crosses the start/finish line if (isEnabled) { sraDispatcher.subscribe($scope,{ sraArgsData: "Car/"+car+"/Lap/COMPLETED;Session/Type;Session/IsCautionFlag;Session/IsGreenFlag;Car/"+car_pitclose+"/Lap/COMPLETED;Session/IsPitRoadOpen;Session/Restart" },interval); $scope.$watch('data.Car.'+car+'.Lap.COMPLETED.Value', function() { if ($scope.data.Session.Type.Value == 'RACE' && !$scope.data.Session.IsCautionFlag.Value && !$scope.data.Session.IsGreenFlag.Value //if were under yellow and just going back green, do not throw another one ) { for (var i=0; i < laps.length; i++) { if ($scope.data.Car[car].Lap.COMPLETED.Value == laps[i]) { $timeout(function () { $scope.sendCommand("Session/setCautionFlag"); }, delay); } } } }); $scope.$watch('data.Car.'+car_pitclose+'.Lap.COMPLETED.Value', function() { if ($scope.data.Session.Type.Value == 'RACE' && $scope.data.Session.IsPitRoadOpen.Value ) { for (var i=0; i < laps_pitclose.length; i++) { if ($scope.data.Car[car_pitclose].Lap.COMPLETED.Value == laps[i]) { $timeout(function () { $scope.sendCommand("Session/setPitClose"); }, delay); } } } }); } else { sraDispatcher.subscribe($scope,{ sraArgsData: "Session/Restart" },interval); } $scope.$watch('data.Session.Restart.Value', function() { $scope.restartMethod = $scope.data.Session.Restart.Value; }); }]); //now start the process by passing in the element where the SIMRacingsApps class is defined. //all elements below that will be owned by SIMRacingApps. This should allow you to put other //content outside of this element that is not SIMRacingApps specific. All bundled apps will pass in the body. SIMRacingApps.start(angular.element(document.body),800,480,16); //once angular is booted, your controller will get called. //it is not recommended to have multiple controllers in SIMRacingApps because of how the $scope is transversed from child to parent. //You can have as many directives and other angular objects as you wish. }); });