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