using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;


/*
 * ģ
 * 
 */

public class Mostech_MotionDriver : MonoBehaviour
{
	public static Mostech_MotionDriver Instance;
	public Mostech_AndroidSerialPort mostechAndroidSerialPort;
	public Mostech_UIManager uIManager;
	private double[] outQua = new double[32 * 4];
	private int count;

	#region
	[Header("ָ")]
	public Transform leftHand;                     //
	public Transform leftHandThumb1;               //ִĴָ
	public Transform leftHandThumb2;               //ִĴָв
	public Transform leftHandThumb3;               //ִĴָϲ
	public Transform leftHandIndexFinger1;         //ʳָ
	public Transform leftHandIndexFinger2;         //ʳָв
	public Transform leftHandIndexFinger3;         //ʳָϲ
	public Transform leftHandMiddleFinger1;        //ָ
	public Transform leftHandMiddleFinger2;        //ָв
	public Transform leftHandMiddleFinger3;        //ָϲ
	public Transform leftHandRingFinger1;          //ָ
	public Transform leftHandRingFinger2;          //ָв
	public Transform leftHandRingFinger3;          //ָϲ
	public Transform leftHandLittleFinger1;        //СĴָ
	public Transform leftHandLittleFinger2;        //СĴָв
	public Transform leftHandLittleFinger3;        //СĴָϲ

	[Header("ָ")]
	public Transform rightHand;                    //
	public Transform rightHandThumb1;              //ִĴָ
	public Transform rightHandThumb2;              //ִĴָв
	public Transform rightHandThumb3;              //ִĴָϲ
	public Transform rightHandIndexFinger1;        //ʳָ
	public Transform rightHandIndexFinger2;        //ʳָв
	public Transform rightHandIndexFinger3;        //ʳָϲ
	public Transform rightHandMiddleFinger1;       //ָ
	public Transform rightHandMiddleFinger2;       //ָв
	public Transform rightHandMiddleFinger3;       //ָϲ
	public Transform rightHandRingFinger1;         //ָ
	public Transform rightHandRingFinger2;         //ָв
	public Transform rightHandRingFinger3;         //ָϲ
	public Transform rightHandLittleFinger1;       //СĴָ
	public Transform rightHandLittleFinger2;       //СĴָв
	public Transform rightHandLittleFinger3;       //СĴָϲ

	#endregion

	private void Awake()
	{
		Instance = this;
	}

	// Start is called before the first frame update
	void Start()
	{
		
	}

	private void FixedUpdate()
	{
		//ȡݣģ(ˢΪ60fps,FixedUpdateˢʾ>=60fps)
		double[] quaDatas = mostechAndroidSerialPort.GetOutputData();
		if (quaDatas != null)
		{
			ApplyMotion(quaDatas);
		}
	}


	/// <summary>
	/// ģ
	/// </summary>
	/// <param name="quaDatas">=32*4</param>
	public void ApplyMotion(double[]quaDatas)
	{
		outQua = quaDatas;
		if (outQua == null) return;
		SetRotation(leftHand, GetQuaternion(0));
		SetRotation(leftHandThumb1, GetQuaternion(1));
		SetRotation(leftHandThumb2, GetQuaternion(2));
		SetRotation(leftHandThumb3, GetQuaternion(3));
		SetRotation(leftHandIndexFinger1, GetQuaternion(4));
		SetRotation(leftHandIndexFinger2, GetQuaternion(5));
		SetRotation(leftHandIndexFinger3, GetQuaternion(6));
		SetRotation(leftHandMiddleFinger1, GetQuaternion(7));
		SetRotation(leftHandMiddleFinger2, GetQuaternion(8));
		SetRotation(leftHandMiddleFinger3, GetQuaternion(9));
		SetRotation(leftHandRingFinger1, GetQuaternion(10));
		SetRotation(leftHandRingFinger2, GetQuaternion(11));
		SetRotation(leftHandRingFinger3, GetQuaternion(12));
		SetRotation(leftHandLittleFinger1, GetQuaternion(13));
		SetRotation(leftHandLittleFinger2, GetQuaternion(14));
		SetRotation(leftHandLittleFinger3, GetQuaternion(15));


		SetRotation(rightHand, GetQuaternion(16));
		SetRotation(rightHandThumb1, GetQuaternion(17));
		SetRotation(rightHandThumb2, GetQuaternion(18));
		SetRotation(rightHandThumb3, GetQuaternion(19));
		SetRotation(rightHandIndexFinger1, GetQuaternion(20));
		SetRotation(rightHandIndexFinger2, GetQuaternion(21));
		SetRotation(rightHandIndexFinger3, GetQuaternion(22));
		SetRotation(rightHandMiddleFinger1, GetQuaternion(23));
		SetRotation(rightHandMiddleFinger2, GetQuaternion(24));
		SetRotation(rightHandMiddleFinger3, GetQuaternion(25));
		SetRotation(rightHandRingFinger1, GetQuaternion(26));
		SetRotation(rightHandRingFinger2, GetQuaternion(27));
		SetRotation(rightHandRingFinger3, GetQuaternion(28));
		SetRotation(rightHandLittleFinger1, GetQuaternion(29));
		SetRotation(rightHandLittleFinger2, GetQuaternion(30));
		SetRotation(rightHandLittleFinger3, GetQuaternion(31));
	}


	/// <summary>
	/// ù̬
	/// </summary>
	/// <param name="tf"></param>
	/// <param name="localRotation"></param>
	private void SetRotation(Transform tf,Quaternion localRotation)
	{
		if(tf!=null)
		{
			tf.localRotation = localRotation;
		}
	}


	/// <summary>
	/// λ
	/// </summary>
	/// <param name="leftHandPos"></param>
	/// <param name="rightHandPos"></param>
	public void SetHandPosition(Vector3 leftHandPos,Vector3 rightHandPos)
	{
		if(leftHand!=null)
		{
			leftHand.position = leftHandPos;
		}

		if(rightHand!=null)
		{
			rightHand.position = rightHandPos;
		}
	}

	/// <summary>
	/// ȡԪ
	/// </summary>
	/// <param name="index"></param>
	/// <returns></returns>
	private Quaternion GetQuaternion(int index)
	{
		index = 4 * index;
		float w = (float)outQua[index+0];
		float x = (float)outQua[index+1];
		float y = (float)outQua[index+2];
		float z = (float)outQua[index+3];
		return new Quaternion(x, -y, -z, w);
	}





	/// <summary>
	/// 豸
	/// </summary>
	/// <param name="left"></param>
	/// <param name="right"></param>
	public void UpDateDeviceInfo(int left,int right)
	{
		uIManager.UpDateDeviceInfo(left, right);
	}


	#region 豸


	/// <summary>
	/// ȡ״̬
	/// </summary>
	/// <returns></returns>
	public bool GetSerialPortState()
	{
		return mostechAndroidSerialPort.GetSerialPortState();
	}


	/// <summary>
	/// ʼɼ
	/// </summary>
	/// <returns></returns>
	public bool StartDataReceiving()
	{
		return mostechAndroidSerialPort.StartDataReceiving();
	}


	/// <summary>
	/// У׼
	/// </summary>
	/// <returns></returns>
	public bool PoseCalibration()
	{
		return mostechAndroidSerialPort.PostureCalibration(6);
	}


	


	#endregion

}
