001    /*----------------------------------------------------------------------------*/
002    /* Copyright (c) FIRST 2008-2012. All Rights Reserved.                        */
003    /* Open Source Software - may be modified and shared by FRC teams. The code   */
004    /* must be accompanied by the FIRST BSD license file in the root directory of */
005    /* the project.                                                               */
006    /*----------------------------------------------------------------------------*/
007    
008    package edu.wpi.first.wpilibj;
009    
010    /**
011     * A Skeleton object to be used with Kinect data from the
012     * FRC Kinect server on the DriverStation
013     * @author koconnor
014     */
015    public class Skeleton {
016    
017        /**
018         * The TrackState of the skeleton
019         */
020       public static class tTrackState{
021    
022           /** The integer value representing this enumeration. */
023            public final int value;
024    
025            protected static final int kNotTracked_val = 0;
026            protected static final int kPositionOnly_val = 1;
027            protected static final int kTracked_val = 2;
028    
029            /** TrackState: Not Tracked */
030            public static final tTrackState kNotTracked = new tTrackState(kNotTracked_val);
031            /** TrackState: Position Only */
032            public static final tTrackState kPositionOnly = new tTrackState(kPositionOnly_val);
033            /** TrackState: Tracked */
034            public static final tTrackState kTracked = new tTrackState(kTracked_val);
035    
036            private tTrackState(int value){
037                this.value = value;
038            }
039        }
040    
041       /**
042        * The Joint TrackingState
043        */
044       public static class tJointTrackingState{
045            /** The integer value representing this enumeration. */
046            public final int value;
047    
048            protected static final int kNotTracked_val = 0;
049            protected static final int kInferred_val = 1;
050            protected static final int kTracked_val = 2;
051    
052            /** Joint TrackingState: Not Tracked */
053            public static final tJointTrackingState kNotTracked = new tJointTrackingState(kNotTracked_val);
054            /** Joint TrackingState: Inferred */
055            public static final tJointTrackingState kInferred = new tJointTrackingState(kInferred_val);
056            /** Joint TrackingState: Tracked */
057            public static final tJointTrackingState kTracked = new tJointTrackingState(kTracked_val);
058    
059            private tJointTrackingState(int value){
060                this.value = value;
061            }
062       }
063    
064       /**
065        * An individual Joint from Kinect data
066        */
067       public class Joint {
068           protected float x, y, z;
069           protected byte trackingState;
070    
071           Joint(){ x = y = z = 0;}
072    
073           public float getX() {return x;}
074           public float getY() {return y;}
075           public float getZ() {return z;}
076           public tJointTrackingState getTrackingState() { 
077               switch(trackingState){
078               case 1:
079                   return tJointTrackingState.kInferred;
080               case 2:
081                   return tJointTrackingState.kTracked;
082               default:
083                   return tJointTrackingState.kNotTracked;
084               }
085           }
086       }
087    
088       /**
089        * Helper class used to index the joints in a (@link Skeleton)
090        */
091       public static class tJointTypes{
092                public final int value;
093    
094                protected static final int kHipCenter_val = 0;
095                protected static final int kSpine_val = 1;
096                protected static final int kShoulderCenter_val = 2;
097                protected static final int kHead_val = 3;
098                protected static final int kShoulderLeft_val = 4;
099                protected static final int kElbowLeft_val = 5;
100                protected static final int kWristLeft_val = 6;
101                protected static final int kHandLeft_val = 7;
102                protected static final int kShoulderRight_val = 8;
103                protected static final int kElbowRight_val = 9;
104                protected static final int kWristRight_val = 10;
105                protected static final int kHandRight_val = 11;
106                protected static final int kHipLeft_val = 12;
107                protected static final int kKneeLeft_val = 13;
108                protected static final int kAnkleLeft_val = 14;
109                protected static final int kFootLeft_val = 15;
110                protected static final int kHipRight_val = 16;
111                protected static final int kKneeRight_val = 17;
112                protected static final int kAnkleRight_val = 18;
113                protected static final int kFootRight_val = 19;
114                protected static final int kCount_val = 20;
115    
116                public static final tJointTypes kHipCenter = new tJointTypes(kHipCenter_val);
117                public static final tJointTypes kSpine = new tJointTypes(kSpine_val);
118                public static final tJointTypes kShoulderCenter = new tJointTypes(kShoulderCenter_val);
119                public static final tJointTypes kHead = new tJointTypes(kHead_val);
120                public static final tJointTypes kShoulderLeft = new tJointTypes(kShoulderLeft_val);
121                public static final tJointTypes kElbowLeft = new tJointTypes(kElbowLeft_val);
122                public static final tJointTypes kWristLeft = new tJointTypes(kWristLeft_val);
123                public static final tJointTypes kHandLeft = new tJointTypes(kHandLeft_val);
124                public static final tJointTypes kShoulderRight = new tJointTypes(kShoulderRight_val);
125                public static final tJointTypes kElbowRight = new tJointTypes(kElbowRight_val);
126                public static final tJointTypes kWristRight = new tJointTypes(kWristRight_val);
127                public static final tJointTypes kHandRight = new tJointTypes(kHandRight_val);
128                public static final tJointTypes kHipLeft = new tJointTypes(kHipLeft_val);
129                public static final tJointTypes kKneeLeft = new tJointTypes(kKneeLeft_val);
130                public static final tJointTypes kAnkleLeft = new tJointTypes(kAnkleLeft_val);
131                public static final tJointTypes kFootLeft = new tJointTypes(kFootLeft_val);
132                public static final tJointTypes kHipRight = new tJointTypes(kHipRight_val);
133                public static final tJointTypes kKneeRight = new tJointTypes(kKneeRight_val);
134                public static final tJointTypes kAnkleRight = new tJointTypes(kAnkleRight_val);
135                public static final tJointTypes kFootRight = new tJointTypes(kFootRight_val);
136                public static final tJointTypes kCount = new tJointTypes(kCount_val);
137    
138                private tJointTypes(int value){
139                    this.value = value;
140                }
141       }
142    
143            public Joint GetHandRight() { return skeleton[tJointTypes.kHandRight.value]; }
144            public Joint GetHandLeft() {  return skeleton[tJointTypes.kHandLeft.value]; }
145            public Joint GetWristRight() {  return skeleton[tJointTypes.kWristRight.value]; }
146            public Joint GetWristLeft() {  return skeleton[tJointTypes.kWristLeft.value]; }
147            public Joint GetElbowLeft() {  return skeleton[tJointTypes.kElbowLeft.value]; }
148            public Joint GetElbowRight() {  return skeleton[tJointTypes.kElbowRight.value]; }
149            public Joint GetShoulderLeft() {  return skeleton[tJointTypes.kShoulderLeft.value]; }
150            public Joint GetShoulderRight() {  return skeleton[tJointTypes.kShoulderRight.value]; }
151            public Joint GetShoulderCenter() {  return skeleton[tJointTypes.kShoulderCenter.value]; }
152            public Joint GetHead() {  return skeleton[tJointTypes.kHead.value]; }
153            public Joint GetSpine() {  return skeleton[tJointTypes.kSpine.value]; }
154            public Joint GetHipCenter() {  return skeleton[tJointTypes.kHipCenter.value]; }
155            public Joint GetHipRight() {  return skeleton[tJointTypes.kHipRight.value]; }
156            public Joint GetHipLeft() {  return skeleton[tJointTypes.kHipLeft.value]; }
157            public Joint GetKneeLeft() {  return skeleton[tJointTypes.kKneeLeft.value]; }
158            public Joint GetKneeRight() {  return skeleton[tJointTypes.kKneeRight.value]; }
159            public Joint GetAnkleLeft() {  return skeleton[tJointTypes.kAnkleLeft.value]; }
160            public Joint GetAnkleRight() {  return skeleton[tJointTypes.kAnkleRight.value]; }
161            public Joint GetFootLeft() {  return skeleton[tJointTypes.kFootLeft.value]; }
162            public Joint GetFootRight() {  return skeleton[tJointTypes.kFootRight.value]; }
163            public Joint GetJoint(tJointTypes index) { return skeleton[index.value]; }
164    
165            public tTrackState GetTrackState(){ return trackState;}
166    
167       Skeleton(){
168       for(int i=0; i<20; i++){
169           skeleton[i] = new Joint();
170           }
171       }
172    
173       protected Joint[] skeleton = new Joint[20];
174       protected tTrackState trackState;
175    }