Now you can download a copy of these docs so you can use them offline! Download now
Kinect.cpp
00001 /*----------------------------------------------------------------------------*/ 00002 /* Copyright (c) FIRST 2011. All Rights Reserved. */ 00003 /* Open Source Software - may be modified and shared by FRC teams. The code */ 00004 /* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */ 00005 /*----------------------------------------------------------------------------*/ 00006 00007 #include "Kinect.h" 00008 00009 #include "DriverStation.h" 00010 #include "NetworkCommunication/FRCComm.h" 00011 #include "Skeleton.h" 00012 #include "Synchronized.h" 00013 #include "WPIErrors.h" 00014 00015 #define kHeaderBundleID kFRC_NetworkCommunication_DynamicType_Kinect_Header 00016 #define kSkeletonExtraBundleID kFRC_NetworkCommunication_DynamicType_Kinect_Extra1 00017 #define kSkeletonBundleID kFRC_NetworkCommunication_DynamicType_Kinect_Vertices1 00018 00019 Kinect *Kinect::_instance = NULL; 00020 00021 Kinect::Kinect() : 00022 m_recentPacketNumber(0), 00023 m_numberOfPlayers(0) 00024 { 00025 AddToSingletonList(); 00026 m_dataLock = semMCreate(SEM_Q_PRIORITY | SEM_INVERSION_SAFE | SEM_DELETE_SAFE); 00027 } 00028 00029 Kinect::~Kinect() 00030 { 00031 semTake(m_dataLock, WAIT_FOREVER); 00032 semDelete(m_dataLock); 00033 } 00034 00039 Kinect *Kinect::GetInstance() 00040 { 00041 if (_instance == NULL) 00042 _instance = new Kinect(); 00043 return _instance; 00044 } 00045 00050 int Kinect::GetNumberOfPlayers() 00051 { 00052 UpdateData(); 00053 return m_numberOfPlayers; 00054 } 00055 00060 Kinect::Point4 Kinect::GetFloorClipPlane() 00061 { 00062 UpdateData(); 00063 return m_floorClipPlane; 00064 } 00065 00070 Kinect::Point4 Kinect::GetGravityNormal() 00071 { 00072 UpdateData(); 00073 return m_gravityNormal; 00074 } 00075 00083 Skeleton Kinect::GetSkeleton(int skeletonIndex) 00084 { 00085 if (skeletonIndex <= 0 || skeletonIndex > kNumSkeletons) 00086 { 00087 wpi_setWPIErrorWithContext(ParameterOutOfRange, "Skeleton index must be 1"); 00088 return Skeleton(); 00089 } 00090 UpdateData(); 00091 return m_skeletons[skeletonIndex-1]; 00092 } 00093 00099 Kinect::Point4 Kinect::GetPosition(int skeletonIndex) 00100 { 00101 if (skeletonIndex <= 0 || skeletonIndex > kNumSkeletons) 00102 { 00103 wpi_setWPIErrorWithContext(ParameterOutOfRange, "Skeleton index must be 1"); 00104 return Point4(); 00105 } 00106 UpdateData(); 00107 return m_position[skeletonIndex-1]; 00108 } 00109 00116 UINT32 Kinect::GetQuality(int skeletonIndex) 00117 { 00118 if (skeletonIndex <= 0 || skeletonIndex > kNumSkeletons) 00119 { 00120 wpi_setWPIErrorWithContext(ParameterOutOfRange, "Skeleton index must be 1"); 00121 return kClippedRight | kClippedLeft | kClippedTop | kClippedBottom; 00122 } 00123 UpdateData(); 00124 return m_quality[skeletonIndex-1]; 00125 } 00126 00133 Kinect::SkeletonTrackingState Kinect::GetTrackingState(int skeletonIndex) 00134 { 00135 if (skeletonIndex <= 0 || skeletonIndex > kNumSkeletons) 00136 { 00137 wpi_setWPIErrorWithContext(ParameterOutOfRange, "Skeleton index must be 1"); 00138 return kNotTracked; 00139 } 00140 UpdateData(); 00141 return m_trackingState[skeletonIndex-1]; 00142 } 00143 00148 void Kinect::UpdateData() 00149 { 00150 Synchronized sync(m_dataLock); 00151 UINT32 packetNumber = DriverStation::GetInstance()->GetPacketNumber(); 00152 if (m_recentPacketNumber != packetNumber) 00153 { 00154 m_recentPacketNumber = packetNumber; 00155 int retVal = getDynamicControlData(kHeaderBundleID, m_rawHeader, sizeof(m_rawHeader), 5); 00156 if(retVal == 0) 00157 { 00158 m_numberOfPlayers = (int)m_rawHeader[13]; 00159 memcpy(&m_floorClipPlane.x, &m_rawHeader[18], 4); 00160 memcpy(&m_floorClipPlane.y, &m_rawHeader[22], 4); 00161 memcpy(&m_floorClipPlane.z, &m_rawHeader[26], 4); 00162 memcpy(&m_floorClipPlane.w, &m_rawHeader[30], 4); 00163 memcpy(&m_gravityNormal.x, &m_rawHeader[34], 4); 00164 memcpy(&m_gravityNormal.y, &m_rawHeader[38], 4); 00165 memcpy(&m_gravityNormal.z, &m_rawHeader[42], 4); 00166 } 00167 00168 retVal = getDynamicControlData(kSkeletonExtraBundleID, m_rawSkeletonExtra, sizeof(m_rawSkeletonExtra), 5); 00169 if(retVal == 0) 00170 { 00171 memcpy(&m_position[0].x, &m_rawSkeletonExtra[22], 4); 00172 memcpy(&m_position[0].y, &m_rawSkeletonExtra[26], 4); 00173 memcpy(&m_position[0].z, &m_rawSkeletonExtra[30], 4); 00174 memcpy(&m_quality[0], &m_rawSkeletonExtra[34], 4); 00175 memcpy(&m_trackingState[0], &m_rawSkeletonExtra[38], 4); 00176 } 00177 00178 retVal = getDynamicControlData(kSkeletonBundleID, m_rawSkeleton, sizeof(m_rawSkeleton), 5); 00179 if(retVal == 0) 00180 { 00181 for(int i=0; i < Skeleton::JointCount; i++) 00182 { 00183 memcpy(&m_skeletons[0].m_joints[i].x, &m_rawSkeleton[i*12+2], 4); 00184 memcpy(&m_skeletons[0].m_joints[i].y, &m_rawSkeleton[i*12+6], 4); 00185 memcpy(&m_skeletons[0].m_joints[i].z, &m_rawSkeleton[i*12+10], 4); 00186 m_skeletons[0].m_joints[i].trackingState = (Skeleton::JointTrackingState)m_rawSkeletonExtra[i+2]; 00187 } 00188 } 00189 00190 // TODO: Read skeleton #2 00191 } 00192 }
Generated on Thu Jan 12 2012 22:35:20 for WPILibC++ by
1.7.1