/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2011. All Rights Reserved.							  */
/* Open Source Software - may be modified and shared by FRC teams. The code   */
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
/*----------------------------------------------------------------------------*/
#pragma once

/**
 * Represents Skeleton data from a Kinect device connected to the 
 * Driver Station. See Getting Started with Microsoft Kinect for 
 * FRC and the Kinect for Windows SDK API reference for more information
 */
class Skeleton
{
	friend class Kinect;
public:
	enum JointTypes
	{
		HipCenter = 0,
		Spine = 1,
		ShoulderCenter = 2,
		Head = 3,
		ShoulderLeft = 4,
		ElbowLeft = 5,
		WristLeft = 6,
		HandLeft = 7,
		ShoulderRight = 8,
		ElbowRight = 9,
		WristRight = 10,
		HandRight = 11,
		HipLeft = 12,
		KneeLeft = 13,
		AnkleLeft = 14,
		FootLeft = 15,
		HipRight = 16,
		KneeRight = 17,
		AnkleRight = 18,
		FootRight = 19,
		JointCount = 20
	};

	enum JointTrackingState
	{
		kNotTracked,
		kInferred,
		kTracked
	};

	struct Joint
	{
		float x;
		float y;
		float z;
		JointTrackingState trackingState;
	};

	Joint GetHandRight() { return m_joints[HandRight]; }
	Joint GetHandLeft() { return m_joints[HandLeft]; }
	Joint GetWristRight() { return m_joints[WristRight]; }
	Joint GetWristLeft() { return m_joints[WristLeft]; }
	Joint GetElbowLeft() { return m_joints[ElbowLeft]; }
	Joint GetElbowRight() { return m_joints[ElbowRight]; }
	Joint GetShoulderLeft() { return m_joints[ShoulderLeft]; }
	Joint GetShoulderRight() { return m_joints[ShoulderRight]; }
	Joint GetShoulderCenter() { return m_joints[ShoulderCenter]; }
	Joint GetHead() { return m_joints[Head]; }
	Joint GetSpine() { return m_joints[Spine]; }
	Joint GetHipCenter() { return m_joints[HipCenter]; }
	Joint GetHipRight() { return m_joints[HipRight]; }
	Joint GetHipLeft() { return m_joints[HipLeft]; }
	Joint GetKneeLeft() { return m_joints[KneeLeft]; }
	Joint GetKneeRight() { return m_joints[KneeRight]; }
	Joint GetAnkleLeft() { return m_joints[AnkleLeft]; }
	Joint GetAnkleRight() { return m_joints[AnkleRight]; }
	Joint GetFootLeft() { return m_joints[FootLeft]; }
	Joint GetFootRight() { return m_joints[FootRight]; }
	Joint GetJointValue(JointTypes index) { return m_joints[index]; }

private:
	Joint m_joints[20];
};
