void Update()
    {
        // Sends virtual keyboards strokes to the TextMeshes for the IP address and the port.
        AbsorbInput();

        if (Input.GetKeyDown(KeyCode.Tab))
        {
            if (connectionWindow.ConnectionTarget == ConnectionTarget.Controller)
            {
                connectionWindow.ConnectionTarget = ConnectionTarget.Kinect;
            }
            else
            {
                connectionWindow.ConnectionTarget = ConnectionTarget.Controller;
            }
        }

        if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter))
        {
            if (connectionWindow.ConnectionTarget == ConnectionTarget.Controller)
            {
                TryConnectToController();
            }
            else
            {
                StartCoroutine(TryConnectToKinect());
            }
        }

        // Gives the information of the camera position and floor level.
        if (Input.GetKeyDown(KeyCode.Space))
        {
            sharedSpaceAnchor.UpdateTransform(cameraTransform.position, cameraTransform.rotation);
        }

        if (Input.GetKeyDown(KeyCode.D))
        {
            sharedSpaceAnchor.DebugVisibility = !sharedSpaceAnchor.DebugVisibility;
        }

        if (controllerClient != null)
        {
            var receiverStates = new List <ReceiverState>();
            if (kinectReceiver != null)
            {
                var receiverState = new ReceiverState(kinectReceiver.SenderEndPoint.Address.ToString(),
                                                      kinectReceiver.SenderEndPoint.Port,
                                                      kinectReceiver.ReceiverSessionId);
                receiverStates.Add(receiverState);
            }
            try
            {
                controllerClient.SendViewerState(receiverStates);
            }
            catch (TcpSocketException e)
            {
                print($"TcpSocketException while connecting: {e}");
                controllerClient = null;
            }
        }

        if (kinectReceiver != null)
        {
            var senderPacketSet = SenderPacketReceiver.Receive(udpSocket);
            if (!kinectReceiver.UpdateFrame(udpSocket, senderPacketSet))
            {
                kinectReceiver          = null;
                ConnectWindowVisibility = true;
            }
        }
    }
Example #2
0
    private void UpdateReceivers()
    {
        try
        {
            var senderPacketCollection = SenderPacketReceiver.Receive(udpSocket, remoteSenders);
            foreach (var confirmPacketInfo in senderPacketCollection.ConfirmPacketInfoList)
            {
                if (remoteSenders.Exists(x => x.SenderSessionId == confirmPacketInfo.SenderSessionId))
                {
                    continue;
                }

                // There should be a receiver trying to connect that the confirmation matches.
                var kinectReceiver = kinectReceivers.FirstOrDefault(x => x.ReceiverSessionId == confirmPacketInfo.ConfirmPacketData.receiverSessionId);
                if (kinectReceiver == null)
                {
                    continue;
                }

                // Also, the receiver should not have been prepared with a ConfirmSenderPacket yet.
                if (kinectReceiver.State != PrepareState.Unprepared)
                {
                    continue;
                }

                var kinectOrigin = sharedSpaceAnchor.AddKinectOrigin();

                // viewerScene may not exist if connection through sender did not happen through a controller.
                if (viewerScene != null)
                {
                    var kinectSenderElement = viewerScene.kinectSenderElements.FirstOrDefault(x => x.address == kinectReceiver.SenderEndPoint.Address.ToString() &&
                                                                                              x.port == kinectReceiver.SenderEndPoint.Port);

                    if (kinectSenderElement != null)
                    {
                        kinectOrigin.transform.localPosition = kinectSenderElement.position;
                        kinectOrigin.transform.localRotation = kinectSenderElement.rotation;
                    }
                }

                kinectReceiver.Prepare(kinectOrigin);
                kinectReceiver.KinectOrigin.Speaker.Setup();

                print($"Sender {confirmPacketInfo.SenderSessionId} connected.");

                remoteSenders.Add(new RemoteSender(confirmPacketInfo.SenderEndPoint,
                                                   confirmPacketInfo.SenderSessionId,
                                                   confirmPacketInfo.ConfirmPacketData.receiverSessionId));
            }

            // Using a copy of remoteSenders through ToList() as this allows removal of elements from remoteSenders.
            foreach (var remoteSender in remoteSenders.ToList())
            {
                SenderPacketSet senderPacketSet;
                if (!senderPacketCollection.SenderPacketSets.TryGetValue(remoteSender.SenderSessionId, out senderPacketSet))
                {
                    continue;
                }

                var kinectReceiver = kinectReceivers.FirstOrDefault(x => x.ReceiverSessionId == remoteSender.ReceiverSessionId);
                if (kinectReceiver == null)
                {
                    continue;
                }

                if (kinectReceiver.State == PrepareState.Unprepared)
                {
                    continue;
                }

                if (!kinectReceiver.UpdateFrame(this, udpSocket, senderPacketSet))
                {
                    remoteSenders.Remove(remoteSender);
                    kinectReceivers.Remove(kinectReceiver);
                    sharedSpaceAnchor.RemoveKinectOrigin(kinectReceiver.KinectOrigin);
                    connectionWindow.Visibility = true;
                }
            }
        }
        catch (UdpSocketException e)
        {
            print($"UdpSocketException: {e}");
            var remoteSender = remoteSenders.FirstOrDefault(x => x.SenderEndPoint == e.EndPoint);
            if (remoteSender != null)
            {
                remoteSenders.Remove(remoteSender);
                var kinectReceiver = kinectReceivers.FirstOrDefault(x => x.ReceiverSessionId == remoteSender.ReceiverSessionId);
                if (kinectReceiver != null)
                {
                    kinectReceivers.Remove(kinectReceiver);
                    sharedSpaceAnchor.RemoveKinectOrigin(kinectReceiver.KinectOrigin);
                }
                else
                {
                    print("Failed to find the KinectReceiver to remove...");
                }
                connectionWindow.Visibility = true;
            }
        }
    }
    // To copy the c++ receiver, for easier development,
    // there should be only one chance to send a ping.
    private IEnumerator TryConnectToKinect()
    {
        if (!ConnectWindowVisibility)
        {
            textToaster.Toast("Cannot try connecting to more than one remote machine.");
            yield break;
        }

        ConnectWindowVisibility = false;

        // The default IP address is 127.0.0.1.
        string ipAddressText = connectionWindow.IpAddressInputText;

        if (ipAddressText.Length == 0)
        {
            ipAddressText = "127.0.0.1";
        }

        string logString = $"Try connecting to {ipAddressText}...";

        textToaster.Toast(logString);
        statusText.text = logString;

        var random            = new System.Random();
        int receiverSessionId = random.Next();

        var ipAddress = IPAddress.Parse(ipAddressText);
        var endPoint  = new IPEndPoint(ipAddress, SENDER_PORT);

        InitSenderPacketData initPacketData;
        int connectCount = 0;

        while (true)
        {
            udpSocket.Send(PacketHelper.createConnectReceiverPacketBytes(receiverSessionId, true, true, true), endPoint);
            ++connectCount;
            print("Sent connect packet");

            yield return(new WaitForSeconds(0.3f));

            try
            {
                var senderPacketSet = SenderPacketReceiver.Receive(udpSocket);
                if (senderPacketSet.InitPacketDataList.Count > 0)
                {
                    initPacketData = senderPacketSet.InitPacketDataList[0];
                    break;
                }
            }
            catch (UdpSocketException e)
            {
                print($"UdpSocketException while connecting: {e}");
            }

            if (connectCount == 10)
            {
                textToaster.Toast("Tried connected 10 times but failed to receive an init packet...\n");
                ConnectWindowVisibility = true;
                yield break;
            }
        }

        textToaster.Toast("Start creating screen");

        if (sharedSpaceAnchor.KinectOrigin == null)
        {
            sharedSpaceAnchor.AddKinectOrigin();
        }

        yield return(StartCoroutine(sharedSpaceAnchor.KinectOrigin.Screen.SetupMesh(initPacketData)));

        sharedSpaceAnchor.KinectOrigin.Speaker.Setup();
        kinectReceiver = new KinectReceiver(receiverSessionId, endPoint, sharedSpaceAnchor.KinectOrigin, initPacketData);
    }