Exemplo n.º 1
0
        /// <summary>
        /// Sets current orientation as new center.
        /// </summary>
        public bool RecenterView()
        {
            var request = HeadTrackingRequest.CreateRecenterPacket();
            var reply   = SendMessage(request);

            return(reply.ReplyCode == (byte)HeadTrackingResponse.Response.AcceptedYourData);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Sets rotational offset that will be applied to each mobile pose. Use radians.
        /// </summary>
        public bool SetAsyncOffset(float yaw, float pitch, float roll)
        {
            var request = HeadTrackingRequest.CreateAsyncOffsetPacket(yaw, pitch, roll);
            var reply   = SendMessage(request);

            return(reply.ReplyCode == (byte)HeadTrackingResponse.Response.AcceptedYourData);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Clear async offset that was set with <see cref="SetAsyncOffset"/>
        /// </summary>
        /// <returns></returns>
        public bool ResetAsyncOffset()
        {
            var request = HeadTrackingRequest.CreateEmptyPacketByType(HeadTrackingRequest.Task.ResetAsyncOffset);
            var reply   = SendMessage(request);

            return(reply.ReplyCode == (byte)HeadTrackingResponse.Response.AcceptedYourData);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Sets position and rotation and returns true if the value was accepted.
        /// </summary>
        public bool SetRotationAndPosition(float yaw, float pitch, float roll, float x, float y, float z)
        {
            var request = HeadTrackingRequest.CreateRotationPositionVectorPacket(yaw, pitch, roll, x, y, z);
            var reply   = SendMessage(request);

            return(reply.ReplyCode == (int)HeadTrackingResponse.Response.AcceptedYourData);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Sets position only and returns true if the value was accepted.
        /// </summary>
        public bool SetPosition(float x, float y, float z)
        {
            var request = HeadTrackingRequest.CreatePositionPacket(x, y, z);
            var reply   = SendMessage(request);

            return(reply.ReplyCode == (int)HeadTrackingResponse.Response.AcceptedYourData);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Request latest phone pose matrix. You can use it for <see cref="SetAsyncOffset"/>.
        /// This method will block until fresh data is received from mobile phone.
        /// </summary>
        /// <returns>
        /// 4x4 transformation matrix flattened as column-major array.
        /// </returns>
        public float[] GetCurrentPhonePose()
        {
            var request = HeadTrackingRequest.CreateEmptyPacketByType(HeadTrackingRequest.Task.RequestReadOnlyPhonePose);
            var reply   = SendMessage(request);

            var replyData = new float[16];

            Array.Copy(reply.Data, 0, replyData, 0, 16);
            return(replyData);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Toggles HMD tracking state between "actively tracked" and "out of tracking range".
        /// </summary>
        public bool ChangeTrackingState(bool isCurrentlyBeingTracked)
        {
            var request =
                HeadTrackingRequest.CreateStateChangePacket(isCurrentlyBeingTracked
                    ? TrackedDeviceStatus.Active
                    : TrackedDeviceStatus.TempUnavailable);

            var reply = SendMessage(request);

            return(reply.ReplyCode == (byte)HeadTrackingResponse.Response.AcceptedYourData);
        }
Exemplo n.º 8
0
        private void SyncOffsetLoop()
        {
            HeadTrackingRequest reqModifiable = new HeadTrackingRequest()
            {
                Version    = 2,
                Data       = new byte[64],
                DataLength = 0,
                TaskType   = (byte)HeadTrackingRequest.Task.RequestSyncOffset
            };

            try
            {
                var reqFrame = SerializationHelpers.StructureToByteArray(reqModifiable);

                while (isProvidingOffset)
                {
                    // Get current data
                    var response = SendRawFrame <HeadTrackingResponse>(reqFrame);

                    if (response.ReplyCode == (int)HeadTrackingResponse.Response.PhoneDataTimeout)
                    {
                        throw new TimeoutException("Phone is not sending new data.");
                    }

                    var currentPhonePose = new float[16];
                    Array.Copy(response.Data, currentPhonePose, 16);

                    // Notify through callback so listeners can modify the array
                    NewSyncDataAvailable?.Invoke(currentPhonePose);

                    // Send updated data
                    SendMessage(HeadTrackingRequest.CreateFullPoseMatrixPacket(currentPhonePose));
                }
            }
            catch (Exception x)
            {
                // Signal it callers if anyone is listening
                SyncModeDisconnected?.Invoke(this, x);
                Disconnect();
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// Disconnected from head tracking API and frees the API for other clients.
        /// </summary>
        public void Disconnect()
        {
            isProvidingOffset = false;

            var disconnectRequest = new HeadTrackingRequest()
            {
                Version  = 2,
                TaskType = (byte)HeadTrackingRequest.Task.Disconnect,
            };

            try
            {
                SendMessage(disconnectRequest);
            }
            catch (TimeoutException x)
            {
                // Connection probably dropped another way, ignoring
            }
            catch (FiniteStateMachineException x)
            {
                // Connection state invalid, close anyway
            }
            CloseSocket();
        }