void Start()
 {
     track = GetComponent <SplineMesh.Spline>();
     LoadTrack(RaceParameters.readRaceParameters().track);
     UpdateFinishLine();
     UpdateTriggers();
     track.NodeListChanged += NodeListChanged;
 }
Exemplo n.º 2
0
 // Use this for initialization
 void Start()
 {
     if (Application.platform != RuntimePlatform.WebGLPlayer)
     {
         var logFile = RaceParameters.readRaceParameters().memoryLogFile;
         Debug.Log("Starting memory profiler output to " + logFile);
         stream = new BinaryWriter(File.Open(logFile, FileMode.Create));
     }
 }
Exemplo n.º 3
0
        public async Task <ActionResult> Post([FromBody] RaceParameters race)
        {
            if (race == null ||
                string.IsNullOrWhiteSpace(race.Start) ||
                string.IsNullOrEmpty(race.End))
            {
                return(BadRequest(new { error = "You must provide a race start and race end" }));
            }

            return(Json(await _raceAlgo.FindPath(race.Start, race.End)));
        }
 // Use this for initialization
 void Start()
 {
     if (Application.platform != RuntimePlatform.WebGLPlayer)
     {
         var logFile = RaceParameters.readRaceParameters().botCommandLogFile;
         if (logFile != "")
         {
             Debug.Log("Logging bot commands to " + logFile);
             stream = new BinaryWriter(File.Open(logFile, FileMode.Create));
         }
     }
 }
    void Spectate(Action <byte[]> sendBytes, Action close, CarInfo[] initialCars)
    {
        Action <GameEvent> send = (GameEvent e) => {
            string jsonString = JsonUtility.ToJson(e);
            byte[] bytes      = System.Text.Encoding.UTF8.GetBytes(jsonString + "\n");
            //Debug.Log("Writing event " + e.type + " JSON " + jsonString + " as " + bytes.Length + " bytes");
            sendBytes(bytes);
        };

        var senderThread = new Thread(() =>
        {
            var eventQueue   = new ConcurrentQueue <GameEvent>();
            var subscription = EventBus.Receive <GameEvent>().Subscribe(e => {
                eventQueue.Enqueue(e);
            });
            GameEvent gameEvent = null;
            eventQueue.Enqueue(RaceParameters.readRaceParameters());
            foreach (var car in initialCars)
            {
                eventQueue.Enqueue(new CarAdded(car));
            }
            try
            {
                while (listener != null)
                {
                    if (eventQueue.TryDequeue(out gameEvent))
                    {
                        //Debug.Log("Sending event " + gameEvent.type);
                        send(gameEvent);
                    }
                    else
                    {
                        Thread.Sleep(10);
                    }
                }
            }
            catch (Exception e)
            {
                Debug.Log("Spectator send failed:" + e.ToString() + " Closing socket");
                close();
                subscription.Dispose();
                return;
            }
        });

        senderThread.Name         = "SpectatorSocket Sender";
        senderThread.IsBackground = true;
        senderThread.Start();
    }
    private void OnEnable()
    {
        switch (ModeController.Mode)
        {
        case SimulatorMode.Playback:
        case SimulatorMode.RemoteControl:
            break;

        default:
            Debug.Log("Initializing spectator socket");
            StartListening();
            RaceParameters raceParams = RaceParameters.readRaceParameters();
            if (raceParams.raceLogFile != null)
            {
                Debug.Log("Writing race log to " + raceParams.raceLogFile);
                var stream = new BinaryWriter(File.Open(raceParams.raceLogFile, FileMode.Create));

                Spectate(b => { stream.Write(b); }, () => stream.Close(), new CarInfo[] { });
            }
            EventBus.Subscribe <CarAdded>(this, e => {
                CarInfo car = ((CarAdded)e).car;
                carInfos.Add(car.name, car);
            });
            EventBus.Subscribe <CarRemoved>(this, e => {
                CarInfo car = ((CarRemoved)e).car;
                carInfos.Remove(car.name);
            });

            EventBus.Subscribe <RaceFinished>(this, e => {
                Observables.Delay(TimeSpan.FromSeconds(1)).Subscribe(_ => {
                    Debug.Log("Race finished, stopping updates");
                    raceEnded = true;
                    EventBus.Publish(new GameStatus(new CarStatus[0]));
                    var stream = new BinaryWriter(File.Open(raceParams.raceResultFile, FileMode.Create));

                    stream.Write(System.Text.Encoding.UTF8.GetBytes(JsonUtility.ToJson(e, true)));
                    stream.Close();
                });

                Observables.Delay(TimeSpan.FromSeconds(3)).Subscribe(_ => {
                    Debug.Log("Quitting application");
                    Application.Quit();
                });
            });
            break;
        }
    }
    void UpdateTriggers()
    {
        int numSegments = RaceParameters.readRaceParameters().numSegments;

        Array.Resize(ref lineTriggers, numSegments);
        var raceController = FindObjectOfType <RaceController>();

        UpdateTrigger(ref finishLineTrigger, 0, raceController.FinishLineTrigger);
        for (int i = 0; i < numSegments; ++i)
        {
            int segment = i;
            UpdateTrigger(
                ref lineTriggers[i],
                (i + 1) / (float)(numSegments + 1),
                car => raceController.TrackSegmentTrigger(car, segment));
        }
    }
 private void Start()
 {
     raceParameters = RaceParameters.readRaceParameters();
     Observables.Delay(TimeSpan.FromMilliseconds(0)).Subscribe(_ => {
         if (ModeController.Mode == SimulatorMode.Playback)
         {
             setState(new Playback(this));
         }
         else if (ModeController.Mode == SimulatorMode.Race)
         {
             setState(new RaceLobby(this));
         }
         else
         {
             setState(new FreePractice(this));
         }
     });
 }
    private void OnEnable()
    {
        if (ModeController.Mode != SimulatorMode.Playback)
        {
            Debug.Log("Initializing spectator socket");
            StartListening();
            RaceParameters raceParams = RaceParameters.readRaceParameters();
            if (raceParams.raceLogFile != null)
            {
                Debug.Log("Writing race log to " + raceParams.raceLogFile);
                var stream = new BinaryWriter(File.Open(raceParams.raceLogFile, FileMode.Create));

                Spectate(b => stream.Write(b), () => stream.Close());
            }
        }
        else
        {
            Debug.Log("Skipping spectator socket");
        }
    }
Exemplo n.º 10
0
    void SendFromWeb(string msgJson)
    {
        var e = GameEvent.FromJson(msgJson);

        if (e is CarLogin l)
        {
            cars.Add(l.name, new WebCarSocket(l, this));
            // Just send something for now
            SendToWeb(RaceParameters.readRaceParameters());
        }
        else if (e is WebCarCommand c)
        {
            var name   = c.carName;
            var socket = cars[name];
            socket.EnqueueCommand(c.command);
        }
        else
        {
            Debug.Log("Unhandled message from web: " + msgJson);
        }
    }
Exemplo n.º 11
0
    static float maxWait = 1; // 1 sec

    private void OnEnable()
    {
        Debug.Log("Playback init");
        if (ModeController.Mode == SimulatorMode.Playback)
        {
#if UNITY_EDITOR
            GetRaceLog(RaceParameters.readRaceParameters().raceLogFile);
#else
            //StartCoroutine(FetchRaceLogOverHTTP("http://localhost:8000/race.log"));
#endif
        }

        /*
         * // To simulate web player user clicking on races
         * Observables.Delay(TimeSpan.FromSeconds(1)).Subscribe(_ => {
         *  PlayUrl("https://robotini-race-results.s3.eu-west-1.amazonaws.com/race_results/2021-camp1/CI-1616499914/race.log?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIASOYCV2RQYKFUIQ47%2F20210324%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20210324T074833Z&X-Amz-Expires=604800&X-Amz-Signature=efbe162ee43f1345e57bdfa4895a1e0c1b0a705beb84d609b14503dacc3bbfc9&X-Amz-SignedHeaders=host");
         * });
         * Observables.Delay(TimeSpan.FromSeconds(15)).Subscribe(_ => {
         *  PlayUrl("https://robotini-race-results.s3.eu-west-1.amazonaws.com/race_results/2021-camp1/1616492743/race.log?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIASOYCV2RQYKFUIQ47%2F20210324%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20210324T074833Z&X-Amz-Expires=604800&X-Amz-Signature=8ffb55eecddfbb510c019a46f8aac1a8ae20286d1e10917f1c11ca28f23a8401&X-Amz-SignedHeaders=host");
         * });
         */
    }
    protected void init(CarLogin c, RaceController raceController)
    {
        if (c.name == null || c.name == "")
        {
            throw new JoinException("CarInfo.name missing");
        }
        if (c.teamId == null || c.teamId == "")
        {
            throw new JoinException("CarInfo.teamId missing");
        }

        var raceParameters = RaceParameters.readRaceParameters();
        var cars           = raceParameters.cars;
        var found          = cars?.FirstOrDefault(d => d.teamId == c.teamId);

        if (found != null)
        {
            carInfo = found;
        }
        else if (raceParameters.mode == "race")
        {
            throw new JoinException("Team not found by teamId: " + c.teamId);
        }
        else
        {
            carInfo = new CarInfo(c.teamId, c.name, c.color);
        }

        this.imageWidth  = (c.imageWidth < 8 || c.imageWidth > 128) ? 128 : (uint)c.imageWidth;
        this.imageHeight = imageWidth * IMAGE_HEIGHT / IMAGE_WIDTH;
        Debug.Log("Using car name " + carInfo.name + " and image size " + imageWidth + "x" + imageHeight);

        raceController.CarConnected(new CarConnected(carInfo, this));

        FrameRequested = true;
    }
    private void Start()
    {
        switch (ModeController.Mode)
        {
        case SimulatorMode.Development:
        case SimulatorMode.Race:
            QualitySettings.vSyncCount  = 0;     // VSync must be disabled
            Application.targetFrameRate = 60;
            Time.captureFramerate       = 60;
            Time.fixedDeltaTime         = 0.002f;
            break;

        default:
            QualitySettings.vSyncCount  = 1;
            Application.targetFrameRate = 60;
            Time.captureFramerate       = 0;
            Time.fixedDeltaTime         = 0.02f;
            break;
        }
        raceParameters = RaceParameters.readRaceParameters();
        Observables.Delay(TimeSpan.FromMilliseconds(0)).Subscribe(_ => {
            if (ModeController.Mode == SimulatorMode.Playback || ModeController.Mode == SimulatorMode.RemoteControl)
            {
                setState(new Playback(this));
            }
            else if (ModeController.Mode == SimulatorMode.Race)
            {
                setState(new RaceLobby(this));
            }
            else
            {
                setState(new FreePractice(this));
            }
            EventBus.Publish(new CameraFollow(null));
        }).AddTo(this);
    }
Exemplo n.º 14
0
 public RaceLobbyInit(RaceParameters raceParameters)
 {
     this.raceParameters = raceParameters;
 }
Exemplo n.º 15
0
    public CarSocket(Socket socket, RaceController raceController)
    {
        this.socket = socket;

        var receiverThread = new Thread(() =>
        {
            var stream = new NetworkStream(socket);
            var reader = new StreamReader(stream);
            try
            {
                Debug.Log("Reading car info...");
                var line     = reader.ReadLine();
                this.carInfo = JsonUtility.FromJson <CarInfo>(line);
                Debug.Log("Received info " + line);
                // TODO: respond with error msgs
                if (carInfo.name == null || carInfo.name == "")
                {
                    throw new Exception("CarInfo.name missing");
                }
                if (carInfo.teamId == null || carInfo.teamId == "")
                {
                    throw new Exception("CarInfo.teamId missing");
                }

                var raceParameters = RaceParameters.readRaceParameters();
                var cars           = raceParameters.cars;
                var found          = cars?.FirstOrDefault(c => c.teamId == carInfo.teamId);
                if (found != null)
                {
                    carInfo.name    = found.name;
                    carInfo.color   = found.color;
                    carInfo.texture = found.texture;
                }
                else if (raceParameters.mode == "race")
                {
                    throw new Exception("Team not found: " + carInfo.teamId);
                }
                Debug.Log("Using car name " + carInfo.name);
                EventBus.Publish(new CarConnected(carInfo, this));

                FrameRequested = true;

                while (this.socket != null)
                {
                    line        = reader.ReadLine();
                    var command = JsonUtility.FromJson <JsonControlCommand>(line);
                    recvQueue.Enqueue(command);
                    FrameRequested = true;
                }
            }
            catch (Exception e)
            {
                Debug.Log("Car socket read failed:" + e.ToString());
                disconnected();
            }
        });

        receiverThread.Name         = "CarSocket Receiver";
        receiverThread.IsBackground = true;
        receiverThread.Start();

        var senderThread = new Thread(() =>
        {
            while (this.socket != null)
            {
                uint[] data;

                if (sendQueue.TryDequeue(out data))
                {
                    try
                    {
                        socket.Send(encodeFrame(data));
                    }
                    catch (Exception e)
                    {
                        Debug.Log("Socket send failed:" + e.ToString());
                        disconnected();
                    }
                }
                else
                {
                    Thread.Sleep(10);
                }
            }
        });

        senderThread.Name         = "CarSocket Sender";
        senderThread.IsBackground = true;
        senderThread.Start();
    }