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; } } }
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); }